summaryrefslogtreecommitdiffstats
path: root/hl
diff options
context:
space:
mode:
Diffstat (limited to 'hl')
-rwxr-xr-xhl/COPYING2
-rwxr-xr-xhl/Makefile.in180
-rwxr-xr-xhl/c++/COPYING2
-rw-r--r--hl/c++/Makefile.in180
-rw-r--r--hl/c++/examples/Makefile.in92
-rw-r--r--hl/c++/src/Makefile.am6
-rw-r--r--hl/c++/src/Makefile.in222
-rw-r--r--hl/c++/test/Makefile.am2
-rw-r--r--hl/c++/test/Makefile.in142
-rw-r--r--hl/c++/test/ptableTest.cpp10
-rw-r--r--hl/examples/Makefile.am4
-rw-r--r--hl/examples/Makefile.in94
-rw-r--r--hl/examples/ex_table_01.c2
-rw-r--r--hl/examples/ex_table_02.c2
-rw-r--r--hl/examples/ex_table_03.c2
-rw-r--r--hl/examples/ex_table_04.c2
-rw-r--r--hl/examples/ex_table_05.c2
-rw-r--r--hl/examples/ex_table_06.c2
-rw-r--r--hl/examples/ex_table_07.c2
-rw-r--r--hl/examples/ex_table_08.c2
-rw-r--r--hl/examples/ex_table_09.c2
-rw-r--r--hl/examples/ex_table_10.c2
-rw-r--r--hl/examples/ex_table_11.c2
-rw-r--r--hl/examples/ex_table_12.c2
-rwxr-xr-xhl/fortran/COPYING2
-rw-r--r--hl/fortran/Makefile.in180
-rw-r--r--hl/fortran/examples/Makefile.in92
-rw-r--r--hl/fortran/src/H5IMcc.c10
-rwxr-xr-xhl/fortran/src/H5IMfc.c1249
-rwxr-xr-xhl/fortran/src/H5IMff.f9072
-rwxr-xr-xhl/fortran/src/H5LTf90proto.h1020
-rwxr-xr-xhl/fortran/src/H5LTfc.c2291
-rwxr-xr-xhl/fortran/src/H5LTff.f90320
-rwxr-xr-xhl/fortran/src/H5TBfc.c1680
-rwxr-xr-xhl/fortran/src/H5TBff.f90144
-rw-r--r--hl/fortran/src/Makefile.am12
-rw-r--r--hl/fortran/src/Makefile.in224
-rw-r--r--hl/fortran/test/Makefile.am6
-rw-r--r--hl/fortran/test/Makefile.in159
-rw-r--r--hl/fortran/test/tstlite.f90136
-rwxr-xr-xhl/src/COPYING2
-rw-r--r--hl/src/H5DS.c3980
-rw-r--r--hl/src/H5IM.c1932
-rw-r--r--hl/src/H5LT.c3362
-rw-r--r--hl/src/H5LTanalyze.c20
-rw-r--r--hl/src/H5LTparse.c32
-rw-r--r--hl/src/H5LTparse.y27
-rw-r--r--hl/src/H5LTpublic.h4
-rw-r--r--hl/src/H5PT.c23
-rw-r--r--hl/src/H5TB.c6557
-rw-r--r--hl/src/H5TBprivate.h1
-rw-r--r--hl/src/H5TBpublic.h20
-rw-r--r--hl/src/Makefile.am6
-rw-r--r--hl/src/Makefile.in221
-rwxr-xr-xhl/test/COPYING2
-rw-r--r--hl/test/Makefile.am15
-rw-r--r--hl/test/Makefile.in204
-rw-r--r--hl/test/gen_test_ds.c595
-rw-r--r--hl/test/test_ds.c7040
-rw-r--r--hl/test/test_ds_be.h5bin0 -> 11024 bytes
-rw-r--r--hl/test/test_ds_le.h5bin0 -> 14304 bytes
-rw-r--r--hl/test/test_image.c741
-rw-r--r--hl/test/test_lite.c1500
-rw-r--r--hl/test/test_packet.c6
-rw-r--r--hl/test/test_table.c2964
-rwxr-xr-xhl/tools/COPYING2
-rw-r--r--hl/tools/Makefile.in180
-rw-r--r--hl/tools/gif2h5/Makefile.am4
-rw-r--r--hl/tools/gif2h5/Makefile.in206
-rw-r--r--hl/tools/gif2h5/gif2hdf.c4
-rw-r--r--hl/tools/gif2h5/h52gifgentst.c16
-rw-r--r--hl/tools/gif2h5/hdf2gif.c66
-rw-r--r--hl/tools/gif2h5/writehdf.c6
-rw-r--r--hl/tools/h52jpeg/Makefile.am46
-rw-r--r--hl/tools/h52jpeg/Makefile.in882
-rw-r--r--hl/tools/h52jpeg/h52jpeg.c753
-rw-r--r--hl/tools/h52jpeg/h52jpeg.sh96
-rw-r--r--hl/tools/h52jpeg/h52jpegtst.c268
-rw-r--r--hl/tools/h52jpeg/h52jpegtst.h286
-rw-r--r--hl/tools/h52jpeg/image24pixel.txt101475
-rw-r--r--hl/tools/h52jpeg/image8.txt120006
-rw-r--r--hl/tools/h52jpeg/testfiles/h52jpegtst.h5bin469661 -> 0 bytes
82 files changed, 21424 insertions, 240683 deletions
diff --git a/hl/COPYING b/hl/COPYING
index ef0cbaf..6903daf 100755
--- a/hl/COPYING
+++ b/hl/COPYING
@@ -1,5 +1,5 @@
- Copyright by The HDF Group (THG) and
+ Copyright by The HDF Group and
The Board of Trustees of the University of Illinois.
All rights reserved.
diff --git a/hl/Makefile.in b/hl/Makefile.in
index b802093..addfd5a 100755
--- a/hl/Makefile.in
+++ b/hl/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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.
@@ -36,8 +37,9 @@
# HDF5 High-Level Makefile(.in)
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@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
@@ -64,6 +66,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/src/H5config.h
CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
SOURCES =
DIST_SOURCES =
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -75,12 +78,52 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
ps-recursive uninstall-recursive
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
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
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 = /home1/packages/automake/automake-1.9.6/bin/aclocal-1.9 -I /afs/ncsa/projects/hdf/packages/libtool_1.5.14/Linux_2.4/share/aclocal
ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
AMTAR = @AMTAR@
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+AM_CFLAGS = @AM_CFLAGS@ @H5_CFLAGS@
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@
AM_MAKEFLAGS = @AM_MAKEFLAGS@
AR = @AR@
@@ -94,21 +137,18 @@ BYTESEX = @BYTESEX@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_VERSION = @CC_VERSION@
-
-# H5_CFLAGS holds flags that should be used as CFLAGS when building hdf5,
-# but which shouldn't be exported to h5cc for building other programs.
-CFLAGS = @CFLAGS@ @H5_CFLAGS@
+CFLAGS = @CFLAGS@
CLEARFILEBUF = @CLEARFILEBUF@
CODESTACK = @CODESTACK@
CONFIG_DATE = @CONFIG_DATE@
CONFIG_MODE = @CONFIG_MODE@
CONFIG_USER = @CONFIG_USER@
CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@ @H5_CPPFLAGS@
+CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@ @H5_CXXFLAGS@
+CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEBUG_PKG = @DEBUG_PKG@
DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
@@ -131,7 +171,7 @@ F9XMODEXT = @F9XMODEXT@
F9XMODFLAG = @F9XMODFLAG@
F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
FC = @FC@
-FCFLAGS = @FCFLAGS@ @H5_FCFLAGS@
+FCFLAGS = @FCFLAGS@
FCFLAGS_f90 = @FCFLAGS_f90@
FCLIBS = @FCLIBS@
FGREP = @FGREP@
@@ -169,6 +209,8 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LINUX_LFS = @LINUX_LFS@
+LIPO = @LIPO@
+LL_PATH = @LL_PATH@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_STATIC_EXEC = @LT_STATIC_EXEC@
@@ -179,13 +221,17 @@ MPE = @MPE@
MPI_GET_SIZE = @MPI_GET_SIZE@
NM = @NM@
NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
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@
PARALLEL = @PARALLEL@
PATH_SEPARATOR = @PATH_SEPARATOR@
@@ -201,12 +247,7 @@ SEARCH = @SEARCH@
SED = @SED@
SETX = @SETX@
SET_MAKE = @SET_MAKE@
-
-# Hardcode SHELL to be /bin/sh. Most machines have this shell, and
-# on at least one machine configure fails to detect its existence (janus).
-# Also, when HDF5 is configured on one machine but run on another,
-# configure's automatic SHELL detection may not work on the build machine.
-SHELL = /bin/sh
+SHELL = @SHELL@
SIZE_T = @SIZE_T@
STATIC_EXEC = @STATIC_EXEC@
STATIC_SHARED = @STATIC_SHARED@
@@ -226,6 +267,7 @@ USE_FILTER_SHUFFLE = @USE_FILTER_SHUFFLE@
USE_FILTER_SZIP = @USE_FILTER_SZIP@
USINGMEMCHECKER = @USINGMEMCHECKER@
VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -248,6 +290,8 @@ build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
+
+# Install directories that automake doesn't know about
docdir = $(exec_prefix)/doc
dvidir = @dvidir@
enable_shared = @enable_shared@
@@ -259,9 +303,7 @@ host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
-
-# Install directories that automake doesn't know about
-includedir = $(exec_prefix)/include
+includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
@@ -281,6 +323,7 @@ sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -352,14 +395,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
- && exit 0; \
+ ( 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) --foreign hl/Makefile'; \
- cd $(top_srcdir) && \
- $(AUTOMAKE) --foreign hl/Makefile
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign hl/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -377,6 +420,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
mostlyclean-libtool:
-rm -f *.lo
@@ -408,7 +452,7 @@ $(RECURSIVE_TARGETS):
else \
local_target="$$target"; \
fi; \
- (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| eval $$failcom; \
done; \
if test "$$dot_seen" = "no"; then \
@@ -442,16 +486,16 @@ $(RECURSIVE_CLEAN_TARGETS):
else \
local_target="$$target"; \
fi; \
- (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ ($(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" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
done
ctags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -459,14 +503,14 @@ ID: $(HEADERS) $(SOURCES) $(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; nonemtpy = 1; } \
+ $(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)
- tags=; \
+ set x; \
here=`pwd`; \
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
include_option=--etags-include; \
@@ -478,7 +522,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
list='$(SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test ! -f $$subdir/TAGS || \
- tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
fi; \
done; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -487,29 +531,34 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique; \
+ 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)
- tags=; \
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)$$tags$$unique" \
+ test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$tags $$unique
+ $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -530,29 +579,44 @@ distdir: $(DISTFILES)
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 -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
- list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test -d "$(distdir)/$$subdir" \
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|| exit 1; \
- distdir=`$(am__cd) $(distdir) && pwd`; \
- top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
- (cd $$subdir && \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ 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="$$top_distdir" \
- distdir="$$distdir/$$subdir" \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
am__remove_distdir=: \
am__skip_length_check=: \
+ am__skip_mode_fix=: \
distdir) \
|| exit 1; \
fi; \
@@ -583,6 +647,7 @@ 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"
@@ -601,6 +666,8 @@ dvi-am:
html: html-recursive
+html-am:
+
info: info-recursive
info-am:
@@ -609,18 +676,28 @@ 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: installcheck-local
maintainer-clean: maintainer-clean-recursive
@@ -642,8 +719,8 @@ ps-am:
uninstall-am:
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
- install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \
+ ctags-recursive install-am install-strip tags-recursive
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
all all-am all-local check check-TESTS check-am clean \
@@ -884,6 +961,7 @@ check-vfd: $(LIB) $(PROGS) $(TESTS)
HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1; \
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:
diff --git a/hl/c++/COPYING b/hl/c++/COPYING
index ef0cbaf..6903daf 100755
--- a/hl/c++/COPYING
+++ b/hl/c++/COPYING
@@ -1,5 +1,5 @@
- Copyright by The HDF Group (THG) and
+ Copyright by The HDF Group and
The Board of Trustees of the University of Illinois.
All rights reserved.
diff --git a/hl/c++/Makefile.in b/hl/c++/Makefile.in
index 27ba91d..87a582c 100644
--- a/hl/c++/Makefile.in
+++ b/hl/c++/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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.
@@ -32,8 +33,9 @@
#
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@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
@@ -60,6 +62,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/src/H5config.h
CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
SOURCES =
DIST_SOURCES =
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -71,12 +74,52 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
ps-recursive uninstall-recursive
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
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
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 = /home1/packages/automake/automake-1.9.6/bin/aclocal-1.9 -I /afs/ncsa/projects/hdf/packages/libtool_1.5.14/Linux_2.4/share/aclocal
ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
AMTAR = @AMTAR@
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+AM_CFLAGS = @AM_CFLAGS@ @H5_CFLAGS@
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@
AM_MAKEFLAGS = @AM_MAKEFLAGS@
AR = @AR@
@@ -90,21 +133,18 @@ BYTESEX = @BYTESEX@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_VERSION = @CC_VERSION@
-
-# H5_CFLAGS holds flags that should be used as CFLAGS when building hdf5,
-# but which shouldn't be exported to h5cc for building other programs.
-CFLAGS = @CFLAGS@ @H5_CFLAGS@
+CFLAGS = @CFLAGS@
CLEARFILEBUF = @CLEARFILEBUF@
CODESTACK = @CODESTACK@
CONFIG_DATE = @CONFIG_DATE@
CONFIG_MODE = @CONFIG_MODE@
CONFIG_USER = @CONFIG_USER@
CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@ @H5_CPPFLAGS@
+CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@ @H5_CXXFLAGS@
+CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEBUG_PKG = @DEBUG_PKG@
DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
@@ -127,7 +167,7 @@ F9XMODEXT = @F9XMODEXT@
F9XMODFLAG = @F9XMODFLAG@
F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
FC = @FC@
-FCFLAGS = @FCFLAGS@ @H5_FCFLAGS@
+FCFLAGS = @FCFLAGS@
FCFLAGS_f90 = @FCFLAGS_f90@
FCLIBS = @FCLIBS@
FGREP = @FGREP@
@@ -165,6 +205,8 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LINUX_LFS = @LINUX_LFS@
+LIPO = @LIPO@
+LL_PATH = @LL_PATH@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_STATIC_EXEC = @LT_STATIC_EXEC@
@@ -175,13 +217,17 @@ MPE = @MPE@
MPI_GET_SIZE = @MPI_GET_SIZE@
NM = @NM@
NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
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@
PARALLEL = @PARALLEL@
PATH_SEPARATOR = @PATH_SEPARATOR@
@@ -197,12 +243,7 @@ SEARCH = @SEARCH@
SED = @SED@
SETX = @SETX@
SET_MAKE = @SET_MAKE@
-
-# Hardcode SHELL to be /bin/sh. Most machines have this shell, and
-# on at least one machine configure fails to detect its existence (janus).
-# Also, when HDF5 is configured on one machine but run on another,
-# configure's automatic SHELL detection may not work on the build machine.
-SHELL = /bin/sh
+SHELL = @SHELL@
SIZE_T = @SIZE_T@
STATIC_EXEC = @STATIC_EXEC@
STATIC_SHARED = @STATIC_SHARED@
@@ -222,6 +263,7 @@ USE_FILTER_SHUFFLE = @USE_FILTER_SHUFFLE@
USE_FILTER_SZIP = @USE_FILTER_SZIP@
USINGMEMCHECKER = @USINGMEMCHECKER@
VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -244,6 +286,8 @@ build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
+
+# Install directories that automake doesn't know about
docdir = $(exec_prefix)/doc
dvidir = @dvidir@
enable_shared = @enable_shared@
@@ -255,9 +299,7 @@ host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
-
-# Install directories that automake doesn't know about
-includedir = $(exec_prefix)/include
+includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
@@ -277,6 +319,7 @@ sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -346,14 +389,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
- && exit 0; \
+ ( 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) --foreign hl/c++/Makefile'; \
- cd $(top_srcdir) && \
- $(AUTOMAKE) --foreign hl/c++/Makefile
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/c++/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign hl/c++/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -371,6 +414,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
mostlyclean-libtool:
-rm -f *.lo
@@ -402,7 +446,7 @@ $(RECURSIVE_TARGETS):
else \
local_target="$$target"; \
fi; \
- (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| eval $$failcom; \
done; \
if test "$$dot_seen" = "no"; then \
@@ -436,16 +480,16 @@ $(RECURSIVE_CLEAN_TARGETS):
else \
local_target="$$target"; \
fi; \
- (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ ($(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" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
done
ctags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -453,14 +497,14 @@ ID: $(HEADERS) $(SOURCES) $(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; nonemtpy = 1; } \
+ $(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)
- tags=; \
+ set x; \
here=`pwd`; \
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
include_option=--etags-include; \
@@ -472,7 +516,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
list='$(SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test ! -f $$subdir/TAGS || \
- tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
fi; \
done; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -481,29 +525,34 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique; \
+ 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)
- tags=; \
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)$$tags$$unique" \
+ test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$tags $$unique
+ $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -524,29 +573,44 @@ distdir: $(DISTFILES)
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 -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
- list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test -d "$(distdir)/$$subdir" \
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|| exit 1; \
- distdir=`$(am__cd) $(distdir) && pwd`; \
- top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
- (cd $$subdir && \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ 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="$$top_distdir" \
- distdir="$$distdir/$$subdir" \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
am__remove_distdir=: \
am__skip_length_check=: \
+ am__skip_mode_fix=: \
distdir) \
|| exit 1; \
fi; \
@@ -577,6 +641,7 @@ 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"
@@ -595,6 +660,8 @@ dvi-am:
html: html-recursive
+html-am:
+
info: info-recursive
info-am:
@@ -603,18 +670,28 @@ 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: installcheck-local
maintainer-clean: maintainer-clean-recursive
@@ -636,8 +713,8 @@ ps-am:
uninstall-am:
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
- install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \
+ ctags-recursive install-am install-strip tags-recursive
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
all all-am all-local check check-TESTS check-am clean \
@@ -876,6 +953,7 @@ check-vfd: $(LIB) $(PROGS) $(TESTS)
HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1; \
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:
diff --git a/hl/c++/examples/Makefile.in b/hl/c++/examples/Makefile.in
index 6a10074..4b11346 100644
--- a/hl/c++/examples/Makefile.in
+++ b/hl/c++/examples/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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.
@@ -36,8 +37,9 @@
# This creates some extra work for us.
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@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
@@ -65,12 +67,25 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/src/H5config.h
CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
SOURCES =
DIST_SOURCES =
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = /home1/packages/automake/automake-1.9.6/bin/aclocal-1.9 -I /afs/ncsa/projects/hdf/packages/libtool_1.5.14/Linux_2.4/share/aclocal
ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
AMTAR = @AMTAR@
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+AM_CFLAGS = @AM_CFLAGS@ @H5_CFLAGS@
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@
AM_MAKEFLAGS = @AM_MAKEFLAGS@
AR = @AR@
@@ -84,21 +99,18 @@ BYTESEX = @BYTESEX@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_VERSION = @CC_VERSION@
-
-# H5_CFLAGS holds flags that should be used as CFLAGS when building hdf5,
-# but which shouldn't be exported to h5cc for building other programs.
-CFLAGS = @CFLAGS@ @H5_CFLAGS@
+CFLAGS = @CFLAGS@
CLEARFILEBUF = @CLEARFILEBUF@
CODESTACK = @CODESTACK@
CONFIG_DATE = @CONFIG_DATE@
CONFIG_MODE = @CONFIG_MODE@
CONFIG_USER = @CONFIG_USER@
CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@ @H5_CPPFLAGS@
+CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@ @H5_CXXFLAGS@
+CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEBUG_PKG = @DEBUG_PKG@
DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
@@ -121,7 +133,7 @@ F9XMODEXT = @F9XMODEXT@
F9XMODFLAG = @F9XMODFLAG@
F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
FC = @FC@
-FCFLAGS = @FCFLAGS@ @H5_FCFLAGS@
+FCFLAGS = @FCFLAGS@
FCFLAGS_f90 = @FCFLAGS_f90@
FCLIBS = @FCLIBS@
FGREP = @FGREP@
@@ -159,6 +171,8 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LINUX_LFS = @LINUX_LFS@
+LIPO = @LIPO@
+LL_PATH = @LL_PATH@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_STATIC_EXEC = @LT_STATIC_EXEC@
@@ -169,13 +183,17 @@ MPE = @MPE@
MPI_GET_SIZE = @MPI_GET_SIZE@
NM = @NM@
NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
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@
PARALLEL = @PARALLEL@
PATH_SEPARATOR = @PATH_SEPARATOR@
@@ -191,12 +209,7 @@ SEARCH = @SEARCH@
SED = @SED@
SETX = @SETX@
SET_MAKE = @SET_MAKE@
-
-# Hardcode SHELL to be /bin/sh. Most machines have this shell, and
-# on at least one machine configure fails to detect its existence (janus).
-# Also, when HDF5 is configured on one machine but run on another,
-# configure's automatic SHELL detection may not work on the build machine.
-SHELL = /bin/sh
+SHELL = @SHELL@
SIZE_T = @SIZE_T@
STATIC_EXEC = @STATIC_EXEC@
STATIC_SHARED = @STATIC_SHARED@
@@ -216,6 +229,7 @@ USE_FILTER_SHUFFLE = @USE_FILTER_SHUFFLE@
USE_FILTER_SZIP = @USE_FILTER_SZIP@
USINGMEMCHECKER = @USINGMEMCHECKER@
VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -238,6 +252,8 @@ build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
+
+# Install directories that automake doesn't know about
docdir = $(exec_prefix)/doc
dvidir = @dvidir@
enable_shared = @enable_shared@
@@ -249,9 +265,7 @@ host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
-
-# Install directories that automake doesn't know about
-includedir = $(exec_prefix)/include
+includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
@@ -271,6 +285,7 @@ sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -360,14 +375,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
- && exit 0; \
+ ( 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) --foreign hl/c++/examples/Makefile'; \
- cd $(top_srcdir) && \
- $(AUTOMAKE) --foreign hl/c++/examples/Makefile
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/c++/examples/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign hl/c++/examples/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -385,6 +400,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
mostlyclean-libtool:
-rm -f *.lo
@@ -414,13 +430,17 @@ distdir: $(DISTFILES)
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 -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
@@ -451,6 +471,7 @@ 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"
@@ -469,6 +490,8 @@ dvi-am:
html: html-am
+html-am:
+
info: info-am
info-am:
@@ -477,18 +500,28 @@ 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: installcheck-local
maintainer-clean: maintainer-clean-am
@@ -510,7 +543,7 @@ ps-am:
uninstall-am: uninstall-local
-.MAKE: install-am install-strip
+.MAKE: check-am install-am install-strip
.PHONY: all all-am all-local check check-TESTS check-am clean \
clean-generic clean-libtool distclean distclean-generic \
@@ -776,6 +809,7 @@ check-vfd: $(LIB) $(PROGS) $(TESTS)
HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1; \
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:
diff --git a/hl/c++/src/Makefile.am b/hl/c++/src/Makefile.am
index 8d2e869..15986d6 100644
--- a/hl/c++/src/Makefile.am
+++ b/hl/c++/src/Makefile.am
@@ -19,6 +19,7 @@
#
include $(top_srcdir)/config/commence.am
+include $(top_srcdir)/config/lt_vers.am
# Include src directory
INCLUDES=-I$(top_srcdir)/src -I$(top_srcdir)/hl/src
@@ -26,10 +27,13 @@ INCLUDES=-I$(top_srcdir)/src -I$(top_srcdir)/hl/src
# This is our main target
lib_LTLIBRARIES=libhdf5_hl_cpp.la
+# Add libtool numbers to the HDF5 HL C++ library (from config/lt_vers.am)
+libhdf5_hl_cpp_la_LDFLAGS= -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
+
# Shared C++ libraries aren't universally supported.
if CXX_SHARED_CONDITIONAL
else
- AM_LDFLAGS=-static
+ AM_LDFLAGS+=-static
endif
# Source files for the library
diff --git a/hl/c++/src/Makefile.in b/hl/c++/src/Makefile.in
index 24da651..a05315f 100644
--- a/hl/c++/src/Makefile.in
+++ b/hl/c++/src/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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.
@@ -34,8 +35,9 @@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@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
@@ -52,7 +54,11 @@ build_triplet = @build@
host_triplet = @host@
DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in $(top_srcdir)/config/commence.am \
- $(top_srcdir)/config/conclude.am
+ $(top_srcdir)/config/conclude.am \
+ $(top_srcdir)/config/lt_vers.am
+
+# Shared C++ libraries aren't universally supported.
+@CXX_SHARED_CONDITIONAL_FALSE@am__append_1 = -static
TESTS =
subdir = hl/c++/src
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -62,21 +68,40 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/src/H5config.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 = `echo $$p | sed -e 's|^.*/||'`;
+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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
-libLTLIBRARIES_INSTALL = $(INSTALL)
LTLIBRARIES = $(lib_LTLIBRARIES)
libhdf5_hl_cpp_la_LIBADD =
am_libhdf5_hl_cpp_la_OBJECTS = H5PacketTable.lo
libhdf5_hl_cpp_la_OBJECTS = $(am_libhdf5_hl_cpp_la_OBJECTS)
+libhdf5_hl_cpp_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(libhdf5_hl_cpp_la_LDFLAGS) $(LDFLAGS) -o $@
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
am__depfiles_maybe = depfiles
+am__mv = mv -f
CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
@@ -88,14 +113,25 @@ CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
$(LDFLAGS) -o $@
SOURCES = $(libhdf5_hl_cpp_la_SOURCES)
DIST_SOURCES = $(libhdf5_hl_cpp_la_SOURCES)
-includeHEADERS_INSTALL = $(INSTALL_HEADER)
HEADERS = $(include_HEADERS)
ETAGS = etags
CTAGS = ctags
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = /home1/packages/automake/automake-1.9.6/bin/aclocal-1.9 -I /afs/ncsa/projects/hdf/packages/libtool_1.5.14/Linux_2.4/share/aclocal
ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
AMTAR = @AMTAR@
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+AM_CFLAGS = @AM_CFLAGS@ @H5_CFLAGS@
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ $(am__append_1)
AM_MAKEFLAGS = @AM_MAKEFLAGS@
AR = @AR@
@@ -109,21 +145,18 @@ BYTESEX = @BYTESEX@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_VERSION = @CC_VERSION@
-
-# H5_CFLAGS holds flags that should be used as CFLAGS when building hdf5,
-# but which shouldn't be exported to h5cc for building other programs.
-CFLAGS = @CFLAGS@ @H5_CFLAGS@
+CFLAGS = @CFLAGS@
CLEARFILEBUF = @CLEARFILEBUF@
CODESTACK = @CODESTACK@
CONFIG_DATE = @CONFIG_DATE@
CONFIG_MODE = @CONFIG_MODE@
CONFIG_USER = @CONFIG_USER@
CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@ @H5_CPPFLAGS@
+CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@ @H5_CXXFLAGS@
+CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEBUG_PKG = @DEBUG_PKG@
DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
@@ -146,7 +179,7 @@ F9XMODEXT = @F9XMODEXT@
F9XMODFLAG = @F9XMODFLAG@
F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
FC = @FC@
-FCFLAGS = @FCFLAGS@ @H5_FCFLAGS@
+FCFLAGS = @FCFLAGS@
FCFLAGS_f90 = @FCFLAGS_f90@
FCLIBS = @FCLIBS@
FGREP = @FGREP@
@@ -184,6 +217,8 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LINUX_LFS = @LINUX_LFS@
+LIPO = @LIPO@
+LL_PATH = @LL_PATH@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_STATIC_EXEC = @LT_STATIC_EXEC@
@@ -194,13 +229,17 @@ MPE = @MPE@
MPI_GET_SIZE = @MPI_GET_SIZE@
NM = @NM@
NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
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@
PARALLEL = @PARALLEL@
PATH_SEPARATOR = @PATH_SEPARATOR@
@@ -216,12 +255,7 @@ SEARCH = @SEARCH@
SED = @SED@
SETX = @SETX@
SET_MAKE = @SET_MAKE@
-
-# Hardcode SHELL to be /bin/sh. Most machines have this shell, and
-# on at least one machine configure fails to detect its existence (janus).
-# Also, when HDF5 is configured on one machine but run on another,
-# configure's automatic SHELL detection may not work on the build machine.
-SHELL = /bin/sh
+SHELL = @SHELL@
SIZE_T = @SIZE_T@
STATIC_EXEC = @STATIC_EXEC@
STATIC_SHARED = @STATIC_SHARED@
@@ -241,6 +275,7 @@ USE_FILTER_SHUFFLE = @USE_FILTER_SHUFFLE@
USE_FILTER_SZIP = @USE_FILTER_SZIP@
USINGMEMCHECKER = @USINGMEMCHECKER@
VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -263,6 +298,8 @@ build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
+
+# Install directories that automake doesn't know about
docdir = $(exec_prefix)/doc
dvidir = @dvidir@
enable_shared = @enable_shared@
@@ -274,9 +311,7 @@ host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
-
-# Install directories that automake doesn't know about
-includedir = $(exec_prefix)/include
+includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
@@ -296,6 +331,7 @@ sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -341,14 +377,20 @@ TRACE = perl $(top_srcdir)/bin/trace
# *.clog are from the MPE option.
CHECK_CLEANFILES = *.chkexe *.chklog *.clog
+# Add libtool shared library version numbers to the HDF5 library
+# See libtool versioning documentation online.
+LT_VERS_INTERFACE = 6
+LT_VERS_REVISION = 45
+LT_VERS_AGE = 0
+
# Include src directory
INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/hl/src
# This is our main target
lib_LTLIBRARIES = libhdf5_hl_cpp.la
-# Shared C++ libraries aren't universally supported.
-@CXX_SHARED_CONDITIONAL_FALSE@AM_LDFLAGS = -static
+# Add libtool numbers to the HDF5 HL C++ library (from config/lt_vers.am)
+libhdf5_hl_cpp_la_LDFLAGS = -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
# Source files for the library
# At the moment, only the H5PT Packet Table has a C++ API.
@@ -376,18 +418,18 @@ all: all-am
.SUFFIXES:
.SUFFIXES: .cpp .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
- && exit 0; \
+ ( 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) --foreign hl/c++/src/Makefile'; \
- cd $(top_srcdir) && \
- $(AUTOMAKE) --foreign hl/c++/src/Makefile
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/c++/src/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign hl/c++/src/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -405,23 +447,28 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
@$(NORMAL_INSTALL)
test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ list2=; for p in $$list; do \
if test -f $$p; then \
- f=$(am__strip_dir) \
- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+ list2="$$list2 $$p"; \
else :; fi; \
- done
+ done; \
+ test -z "$$list2" || { \
+ 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)'; for p in $$list; do \
- p=$(am__strip_dir) \
- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+ @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:
@@ -433,7 +480,7 @@ clean-libLTLIBRARIES:
rm -f "$${dir}/so_locations"; \
done
libhdf5_hl_cpp.la: $(libhdf5_hl_cpp_la_OBJECTS) $(libhdf5_hl_cpp_la_DEPENDENCIES)
- $(CXXLINK) -rpath $(libdir) $(libhdf5_hl_cpp_la_OBJECTS) $(libhdf5_hl_cpp_la_LIBADD) $(LIBS)
+ $(libhdf5_hl_cpp_la_LINK) -rpath $(libdir) $(libhdf5_hl_cpp_la_OBJECTS) $(libhdf5_hl_cpp_la_LIBADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -445,21 +492,21 @@ distclean-compile:
.cpp.o:
@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
.cpp.obj:
@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.cpp.lo:
@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
@@ -472,34 +519,37 @@ clean-libtool:
install-includeHEADERS: $(include_HEADERS)
@$(NORMAL_INSTALL)
test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
- @list='$(include_HEADERS)'; for p in $$list; do \
+ @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+ for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- f=$(am__strip_dir) \
- echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \
- $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \
+ 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)'; for p in $$list; do \
- f=$(am__strip_dir) \
- echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \
- rm -f "$(DESTDIR)$(includedir)/$$f"; \
- done
+ @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(includedir)" && rm -f $$files
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; nonemtpy = 1; } \
+ $(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)
- tags=; \
+ set x; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
@@ -507,29 +557,34 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique; \
+ 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)
- tags=; \
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)$$tags$$unique" \
+ test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$tags $$unique
+ $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -550,13 +605,17 @@ distdir: $(DISTFILES)
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 -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
@@ -588,6 +647,7 @@ 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"
@@ -609,6 +669,8 @@ dvi-am:
html: html-am
+html-am:
+
info: info-am
info-am:
@@ -617,18 +679,28 @@ install-data-am: install-includeHEADERS
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
@@ -651,7 +723,7 @@ ps-am:
uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
-.MAKE: install-am install-strip
+.MAKE: check-am install-am install-strip
.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \
clean clean-generic clean-libLTLIBRARIES clean-libtool ctags \
@@ -681,6 +753,19 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
help:
@$(top_srcdir)/bin/makehelp
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5. The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html. COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page. It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have
+# access to either file, you may request a copy from help@hdfgroup.org.
+
# lib/progs/tests targets recurse into subdirectories. build-* targets
# build files in this directory.
build-lib: $(LIB)
@@ -875,6 +960,7 @@ check-vfd: $(LIB) $(PROGS) $(TESTS)
HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1; \
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:
diff --git a/hl/c++/test/Makefile.am b/hl/c++/test/Makefile.am
index beebc33..6dcea1c 100644
--- a/hl/c++/test/Makefile.am
+++ b/hl/c++/test/Makefile.am
@@ -26,7 +26,7 @@ INCLUDES=-I$(top_srcdir)/src -I$(top_srcdir)/c++/src -I$(top_srcdir)/hl/src -I$(
# Shared C++ libraries aren't universally supported.
if CXX_SHARED_CONDITIONAL
else
- AM_LDFLAGS=-static
+ AM_LDFLAGS+=-static
endif
# These are our main targets. They should be listed in the order to be
diff --git a/hl/c++/test/Makefile.in b/hl/c++/test/Makefile.in
index bc228cd..6bb1a99 100644
--- a/hl/c++/test/Makefile.in
+++ b/hl/c++/test/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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.
@@ -32,8 +33,9 @@
#
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@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
@@ -51,6 +53,9 @@ host_triplet = @host@
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(top_srcdir)/config/commence.am \
$(top_srcdir)/config/conclude.am
+
+# Shared C++ libraries aren't universally supported.
+@CXX_SHARED_CONDITIONAL_FALSE@am__append_1 = -static
check_PROGRAMS = $(am__EXEEXT_1)
TESTS = $(check_PROGRAMS)
subdir = hl/c++/test
@@ -61,6 +66,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/src/H5config.h
CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
am__EXEEXT_1 = ptableTest$(EXEEXT)
am_ptableTest_OBJECTS = ptableTest.$(OBJEXT)
ptableTest_OBJECTS = $(am_ptableTest_OBJECTS)
@@ -70,6 +76,7 @@ ptableTest_DEPENDENCIES = $(LIBH5CPP_HL) $(LIBH5_HL) $(LIBH5CPP) \
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
am__depfiles_maybe = depfiles
+am__mv = mv -f
CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
@@ -83,10 +90,22 @@ SOURCES = $(ptableTest_SOURCES)
DIST_SOURCES = $(ptableTest_SOURCES)
ETAGS = etags
CTAGS = ctags
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = /home1/packages/automake/automake-1.9.6/bin/aclocal-1.9 -I /afs/ncsa/projects/hdf/packages/libtool_1.5.14/Linux_2.4/share/aclocal
ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
AMTAR = @AMTAR@
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+AM_CFLAGS = @AM_CFLAGS@ @H5_CFLAGS@
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ $(am__append_1)
AM_MAKEFLAGS = @AM_MAKEFLAGS@
AR = @AR@
@@ -100,21 +119,18 @@ BYTESEX = @BYTESEX@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_VERSION = @CC_VERSION@
-
-# H5_CFLAGS holds flags that should be used as CFLAGS when building hdf5,
-# but which shouldn't be exported to h5cc for building other programs.
-CFLAGS = @CFLAGS@ @H5_CFLAGS@
+CFLAGS = @CFLAGS@
CLEARFILEBUF = @CLEARFILEBUF@
CODESTACK = @CODESTACK@
CONFIG_DATE = @CONFIG_DATE@
CONFIG_MODE = @CONFIG_MODE@
CONFIG_USER = @CONFIG_USER@
CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@ @H5_CPPFLAGS@
+CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@ @H5_CXXFLAGS@
+CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEBUG_PKG = @DEBUG_PKG@
DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
@@ -137,7 +153,7 @@ F9XMODEXT = @F9XMODEXT@
F9XMODFLAG = @F9XMODFLAG@
F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
FC = @FC@
-FCFLAGS = @FCFLAGS@ @H5_FCFLAGS@
+FCFLAGS = @FCFLAGS@
FCFLAGS_f90 = @FCFLAGS_f90@
FCLIBS = @FCLIBS@
FGREP = @FGREP@
@@ -175,6 +191,8 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LINUX_LFS = @LINUX_LFS@
+LIPO = @LIPO@
+LL_PATH = @LL_PATH@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_STATIC_EXEC = @LT_STATIC_EXEC@
@@ -185,13 +203,17 @@ MPE = @MPE@
MPI_GET_SIZE = @MPI_GET_SIZE@
NM = @NM@
NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
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@
PARALLEL = @PARALLEL@
PATH_SEPARATOR = @PATH_SEPARATOR@
@@ -207,12 +229,7 @@ SEARCH = @SEARCH@
SED = @SED@
SETX = @SETX@
SET_MAKE = @SET_MAKE@
-
-# Hardcode SHELL to be /bin/sh. Most machines have this shell, and
-# on at least one machine configure fails to detect its existence (janus).
-# Also, when HDF5 is configured on one machine but run on another,
-# configure's automatic SHELL detection may not work on the build machine.
-SHELL = /bin/sh
+SHELL = @SHELL@
SIZE_T = @SIZE_T@
STATIC_EXEC = @STATIC_EXEC@
STATIC_SHARED = @STATIC_SHARED@
@@ -232,6 +249,7 @@ USE_FILTER_SHUFFLE = @USE_FILTER_SHUFFLE@
USE_FILTER_SZIP = @USE_FILTER_SZIP@
USINGMEMCHECKER = @USINGMEMCHECKER@
VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -254,6 +272,8 @@ build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
+
+# Install directories that automake doesn't know about
docdir = $(exec_prefix)/doc
dvidir = @dvidir@
enable_shared = @enable_shared@
@@ -265,9 +285,7 @@ host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
-
-# Install directories that automake doesn't know about
-includedir = $(exec_prefix)/include
+includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
@@ -287,6 +305,7 @@ sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -335,9 +354,6 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog
# Include directories
INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/c++/src -I$(top_srcdir)/hl/src -I$(top_srcdir)/hl/c++/src -I$(top_srcdir)/test -I$(top_builddir)/hl/test -I$(top_srcdir)/hl/test
-# Shared C++ libraries aren't universally supported.
-@CXX_SHARED_CONDITIONAL_FALSE@AM_LDFLAGS = -static
-
# These are our main targets. They should be listed in the order to be
# executed, generally most specific tests to least specific tests.
TEST_PROG = ptableTest
@@ -372,14 +388,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
- && exit 0; \
+ ( 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) --foreign hl/c++/test/Makefile'; \
- cd $(top_srcdir) && \
- $(AUTOMAKE) --foreign hl/c++/test/Makefile
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/c++/test/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign hl/c++/test/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -397,13 +413,16 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
clean-checkPROGRAMS:
- @list='$(check_PROGRAMS)'; for p in $$list; do \
- f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f $$p $$f"; \
- rm -f $$p $$f ; \
- done
+ @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
ptableTest$(EXEEXT): $(ptableTest_OBJECTS) $(ptableTest_DEPENDENCIES)
@rm -f ptableTest$(EXEEXT)
$(CXXLINK) $(ptableTest_OBJECTS) $(ptableTest_LDADD) $(LIBS)
@@ -418,21 +437,21 @@ distclean-compile:
.cpp.o:
@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
.cpp.obj:
@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.cpp.lo:
@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
@@ -448,14 +467,14 @@ ID: $(HEADERS) $(SOURCES) $(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; nonemtpy = 1; } \
+ $(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)
- tags=; \
+ set x; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
@@ -463,29 +482,34 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique; \
+ 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)
- tags=; \
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)$$tags$$unique" \
+ test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$tags $$unique
+ $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -506,13 +530,17 @@ distdir: $(DISTFILES)
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 -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
@@ -542,6 +570,7 @@ 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"
@@ -563,6 +592,8 @@ dvi-am:
html: html-am
+html-am:
+
info: info-am
info-am:
@@ -571,18 +602,28 @@ 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
@@ -605,7 +646,7 @@ ps-am:
uninstall-am:
-.MAKE: install-am install-strip
+.MAKE: check-am install-am install-strip
.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \
clean clean-checkPROGRAMS clean-generic clean-libtool ctags \
@@ -827,6 +868,7 @@ check-vfd: $(LIB) $(PROGS) $(TESTS)
HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1; \
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:
diff --git a/hl/c++/test/ptableTest.cpp b/hl/c++/test/ptableTest.cpp
index 77edce4..9c48f77 100644
--- a/hl/c++/test/ptableTest.cpp
+++ b/hl/c++/test/ptableTest.cpp
@@ -78,7 +78,7 @@ int BasicTest()
{
herr_t err;
int myRecord;
- int count;
+ hsize_t count;
int error;
TESTING("basic funtionality")
@@ -133,7 +133,7 @@ out:
int TestCompoundDatatype()
{
hid_t dtypeID;
- int count;
+ hsize_t count;
int error;
TESTING("compound datatypes")
@@ -253,13 +253,13 @@ out:
int TestCompress()
{
-
+
unsigned int flags = 0;
unsigned int config = 0;
size_t cd_nelemts = 0;
TESTING("compression")
-#ifdef H5_HAVE_FILTER_DEFLATE
+#ifdef H5_HAVE_FILTER_DEFLATE
try {
/* Create packet table with compression. */
FL_PacketTable wrapper(fileID, "/compressTest", H5T_NATIVE_CHAR, 100, 8);
@@ -439,7 +439,7 @@ int SystemTest()
TESTING("multiple datatypes")
hid_t dtypeID1, dtypeID2;
- unsigned int count;
+ hsize_t count;
int error;
/* Creating two inter-related datatypes. Create two datasets and put
diff --git a/hl/examples/Makefile.am b/hl/examples/Makefile.am
index 3492368..9d601ee 100644
--- a/hl/examples/Makefile.am
+++ b/hl/examples/Makefile.am
@@ -81,5 +81,9 @@ ex_table10: $(srcdir)/ex_table10.c
ex_table11: $(srcdir)/ex_table11.c
ex_table12: $(srcdir)/ex_table12.c
+if BUILD_SZIP_CONDITIONAL
+export LD_LIBRARY_PATH=$(LL_PATH)
+endif
+
include $(top_srcdir)/config/examples.am
include $(top_srcdir)/config/conclude.am
diff --git a/hl/examples/Makefile.in b/hl/examples/Makefile.in
index 6fc7bbd..0380eaf 100644
--- a/hl/examples/Makefile.in
+++ b/hl/examples/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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.
@@ -36,8 +37,9 @@
# This creates some extra work for us.
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@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
@@ -65,12 +67,25 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/src/H5config.h
CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
SOURCES =
DIST_SOURCES =
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = /home1/packages/automake/automake-1.9.6/bin/aclocal-1.9 -I /afs/ncsa/projects/hdf/packages/libtool_1.5.14/Linux_2.4/share/aclocal
ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
AMTAR = @AMTAR@
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+AM_CFLAGS = @AM_CFLAGS@ @H5_CFLAGS@
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@
AM_MAKEFLAGS = @AM_MAKEFLAGS@
AR = @AR@
@@ -84,21 +99,18 @@ BYTESEX = @BYTESEX@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_VERSION = @CC_VERSION@
-
-# H5_CFLAGS holds flags that should be used as CFLAGS when building hdf5,
-# but which shouldn't be exported to h5cc for building other programs.
-CFLAGS = @CFLAGS@ @H5_CFLAGS@
+CFLAGS = @CFLAGS@
CLEARFILEBUF = @CLEARFILEBUF@
CODESTACK = @CODESTACK@
CONFIG_DATE = @CONFIG_DATE@
CONFIG_MODE = @CONFIG_MODE@
CONFIG_USER = @CONFIG_USER@
CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@ @H5_CPPFLAGS@
+CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@ @H5_CXXFLAGS@
+CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEBUG_PKG = @DEBUG_PKG@
DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
@@ -121,7 +133,7 @@ F9XMODEXT = @F9XMODEXT@
F9XMODFLAG = @F9XMODFLAG@
F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
FC = @FC@
-FCFLAGS = @FCFLAGS@ @H5_FCFLAGS@
+FCFLAGS = @FCFLAGS@
FCFLAGS_f90 = @FCFLAGS_f90@
FCLIBS = @FCLIBS@
FGREP = @FGREP@
@@ -159,6 +171,8 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LINUX_LFS = @LINUX_LFS@
+LIPO = @LIPO@
+LL_PATH = @LL_PATH@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_STATIC_EXEC = @LT_STATIC_EXEC@
@@ -169,13 +183,17 @@ MPE = @MPE@
MPI_GET_SIZE = @MPI_GET_SIZE@
NM = @NM@
NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
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@
PARALLEL = @PARALLEL@
PATH_SEPARATOR = @PATH_SEPARATOR@
@@ -191,12 +209,7 @@ SEARCH = @SEARCH@
SED = @SED@
SETX = @SETX@
SET_MAKE = @SET_MAKE@
-
-# Hardcode SHELL to be /bin/sh. Most machines have this shell, and
-# on at least one machine configure fails to detect its existence (janus).
-# Also, when HDF5 is configured on one machine but run on another,
-# configure's automatic SHELL detection may not work on the build machine.
-SHELL = /bin/sh
+SHELL = @SHELL@
SIZE_T = @SIZE_T@
STATIC_EXEC = @STATIC_EXEC@
STATIC_SHARED = @STATIC_SHARED@
@@ -216,6 +229,7 @@ USE_FILTER_SHUFFLE = @USE_FILTER_SHUFFLE@
USE_FILTER_SZIP = @USE_FILTER_SZIP@
USINGMEMCHECKER = @USINGMEMCHECKER@
VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -238,6 +252,8 @@ build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
+
+# Install directories that automake doesn't know about
docdir = $(exec_prefix)/doc
dvidir = @dvidir@
enable_shared = @enable_shared@
@@ -249,9 +265,7 @@ host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
-
-# Install directories that automake doesn't know about
-includedir = $(exec_prefix)/include
+includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
@@ -271,6 +285,7 @@ sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -367,14 +382,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
- && exit 0; \
+ ( 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) --foreign hl/examples/Makefile'; \
- cd $(top_srcdir) && \
- $(AUTOMAKE) --foreign hl/examples/Makefile
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/examples/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign hl/examples/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -392,6 +407,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
mostlyclean-libtool:
-rm -f *.lo
@@ -421,13 +437,17 @@ distdir: $(DISTFILES)
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 -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
@@ -458,6 +478,7 @@ 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"
@@ -476,6 +497,8 @@ dvi-am:
html: html-am
+html-am:
+
info: info-am
info-am:
@@ -484,18 +507,28 @@ 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: installcheck-local
maintainer-clean: maintainer-clean-am
@@ -517,7 +550,7 @@ ps-am:
uninstall-am: uninstall-local
-.MAKE: install-am install-strip
+.MAKE: check-am install-am install-strip
.PHONY: all all-am all-local check check-TESTS check-am clean \
clean-generic clean-libtool distclean distclean-generic \
@@ -579,6 +612,8 @@ ex_table10: $(srcdir)/ex_table10.c
ex_table11: $(srcdir)/ex_table11.c
ex_table12: $(srcdir)/ex_table12.c
+@BUILD_SZIP_CONDITIONAL_TRUE@export LD_LIBRARY_PATH=$(LL_PATH)
+
# How to create EXAMPLEDIR if it doesn't already exist
$(EXAMPLEDIR):
-$(top_srcdir)/bin/mkdirs $@
@@ -807,6 +842,7 @@ check-vfd: $(LIB) $(PROGS) $(TESTS)
HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1; \
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:
diff --git a/hl/examples/ex_table_01.c b/hl/examples/ex_table_01.c
index 1ffcb22..de304d9 100644
--- a/hl/examples/ex_table_01.c
+++ b/hl/examples/ex_table_01.c
@@ -129,7 +129,7 @@ int main( void )
/* close type */
H5Tclose( string_type );
-
+
/* close the file */
H5Fclose( file_id );
diff --git a/hl/examples/ex_table_02.c b/hl/examples/ex_table_02.c
index 1ef661c..98e33d3 100644
--- a/hl/examples/ex_table_02.c
+++ b/hl/examples/ex_table_02.c
@@ -123,7 +123,7 @@ int main( void )
/* close type */
H5Tclose( string_type );
-
+
/* close the file */
H5Fclose( file_id );
diff --git a/hl/examples/ex_table_03.c b/hl/examples/ex_table_03.c
index af3894e..7315fd3 100644
--- a/hl/examples/ex_table_03.c
+++ b/hl/examples/ex_table_03.c
@@ -129,7 +129,7 @@ int main( void )
/* close type */
H5Tclose( string_type );
-
+
/* close the file */
H5Fclose( file_id );
diff --git a/hl/examples/ex_table_04.c b/hl/examples/ex_table_04.c
index 10d888f..0a01116 100644
--- a/hl/examples/ex_table_04.c
+++ b/hl/examples/ex_table_04.c
@@ -155,7 +155,7 @@ int main( void )
/* close type */
H5Tclose( string_type );
-
+
/* close the file */
H5Fclose( file_id );
diff --git a/hl/examples/ex_table_05.c b/hl/examples/ex_table_05.c
index ee671e0..f0c96eb 100644
--- a/hl/examples/ex_table_05.c
+++ b/hl/examples/ex_table_05.c
@@ -166,7 +166,7 @@ int main( void )
/* close type */
H5Tclose( string_type );
-
+
/* close the file */
H5Fclose( file_id );
diff --git a/hl/examples/ex_table_06.c b/hl/examples/ex_table_06.c
index e2e1038..261b23c 100644
--- a/hl/examples/ex_table_06.c
+++ b/hl/examples/ex_table_06.c
@@ -87,7 +87,7 @@ int main( void )
/* close type */
H5Tclose( string_type );
-
+
/* close the file */
H5Fclose( file_id );
diff --git a/hl/examples/ex_table_07.c b/hl/examples/ex_table_07.c
index 1be9f13..3479aa8 100644
--- a/hl/examples/ex_table_07.c
+++ b/hl/examples/ex_table_07.c
@@ -105,7 +105,7 @@ int main( void )
/* close type */
H5Tclose( string_type );
-
+
/* close the file */
H5Fclose( file_id );
diff --git a/hl/examples/ex_table_08.c b/hl/examples/ex_table_08.c
index 6ec0ac1..4078bea 100644
--- a/hl/examples/ex_table_08.c
+++ b/hl/examples/ex_table_08.c
@@ -136,7 +136,7 @@ int main( void )
/* close type */
H5Tclose( string_type );
-
+
/* close the file */
H5Fclose( file_id );
diff --git a/hl/examples/ex_table_09.c b/hl/examples/ex_table_09.c
index 82dca3f..7ba0aa1 100644
--- a/hl/examples/ex_table_09.c
+++ b/hl/examples/ex_table_09.c
@@ -137,7 +137,7 @@ int main( void )
/* close type */
H5Tclose( string_type );
-
+
/* close the file */
H5Fclose( file_id );
diff --git a/hl/examples/ex_table_10.c b/hl/examples/ex_table_10.c
index fb11a98..20543c2 100644
--- a/hl/examples/ex_table_10.c
+++ b/hl/examples/ex_table_10.c
@@ -129,7 +129,7 @@ int main( void )
/* close type */
H5Tclose( string_type );
-
+
/* close the file */
H5Fclose( file_id );
diff --git a/hl/examples/ex_table_11.c b/hl/examples/ex_table_11.c
index 7679ac6..872fa4e 100644
--- a/hl/examples/ex_table_11.c
+++ b/hl/examples/ex_table_11.c
@@ -109,7 +109,7 @@ int main( void )
/* close type */
H5Tclose( string_type );
-
+
/* close the file */
H5Fclose( file_id );
diff --git a/hl/examples/ex_table_12.c b/hl/examples/ex_table_12.c
index b4a5a3a..b6cc2b4 100644
--- a/hl/examples/ex_table_12.c
+++ b/hl/examples/ex_table_12.c
@@ -102,7 +102,7 @@ int main( void )
/* close type */
H5Tclose( string_type );
-
+
/* close the file */
H5Fclose( file_id );
diff --git a/hl/fortran/COPYING b/hl/fortran/COPYING
index ef0cbaf..6903daf 100755
--- a/hl/fortran/COPYING
+++ b/hl/fortran/COPYING
@@ -1,5 +1,5 @@
- Copyright by The HDF Group (THG) and
+ Copyright by The HDF Group and
The Board of Trustees of the University of Illinois.
All rights reserved.
diff --git a/hl/fortran/Makefile.in b/hl/fortran/Makefile.in
index f65f88a..79e0ce5 100644
--- a/hl/fortran/Makefile.in
+++ b/hl/fortran/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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.
@@ -36,8 +37,9 @@
# HDF5 High-Level Makefile(.in)
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@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
@@ -64,6 +66,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/src/H5config.h
CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
SOURCES =
DIST_SOURCES =
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -75,12 +78,52 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
ps-recursive uninstall-recursive
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
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
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 = /home1/packages/automake/automake-1.9.6/bin/aclocal-1.9 -I /afs/ncsa/projects/hdf/packages/libtool_1.5.14/Linux_2.4/share/aclocal
ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
AMTAR = @AMTAR@
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+AM_CFLAGS = @AM_CFLAGS@ @H5_CFLAGS@
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@
AM_MAKEFLAGS = @AM_MAKEFLAGS@
AR = @AR@
@@ -94,21 +137,18 @@ BYTESEX = @BYTESEX@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_VERSION = @CC_VERSION@
-
-# H5_CFLAGS holds flags that should be used as CFLAGS when building hdf5,
-# but which shouldn't be exported to h5cc for building other programs.
-CFLAGS = @CFLAGS@ @H5_CFLAGS@
+CFLAGS = @CFLAGS@
CLEARFILEBUF = @CLEARFILEBUF@
CODESTACK = @CODESTACK@
CONFIG_DATE = @CONFIG_DATE@
CONFIG_MODE = @CONFIG_MODE@
CONFIG_USER = @CONFIG_USER@
CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@ @H5_CPPFLAGS@
+CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@ @H5_CXXFLAGS@
+CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEBUG_PKG = @DEBUG_PKG@
DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
@@ -131,7 +171,7 @@ F9XMODEXT = @F9XMODEXT@
F9XMODFLAG = @F9XMODFLAG@
F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
FC = @FC@
-FCFLAGS = @FCFLAGS@ @H5_FCFLAGS@
+FCFLAGS = @FCFLAGS@
FCFLAGS_f90 = @FCFLAGS_f90@
FCLIBS = @FCLIBS@
FGREP = @FGREP@
@@ -169,6 +209,8 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LINUX_LFS = @LINUX_LFS@
+LIPO = @LIPO@
+LL_PATH = @LL_PATH@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_STATIC_EXEC = @LT_STATIC_EXEC@
@@ -179,13 +221,17 @@ MPE = @MPE@
MPI_GET_SIZE = @MPI_GET_SIZE@
NM = @NM@
NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
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@
PARALLEL = @PARALLEL@
PATH_SEPARATOR = @PATH_SEPARATOR@
@@ -201,12 +247,7 @@ SEARCH = @SEARCH@
SED = @SED@
SETX = @SETX@
SET_MAKE = @SET_MAKE@
-
-# Hardcode SHELL to be /bin/sh. Most machines have this shell, and
-# on at least one machine configure fails to detect its existence (janus).
-# Also, when HDF5 is configured on one machine but run on another,
-# configure's automatic SHELL detection may not work on the build machine.
-SHELL = /bin/sh
+SHELL = @SHELL@
SIZE_T = @SIZE_T@
STATIC_EXEC = @STATIC_EXEC@
STATIC_SHARED = @STATIC_SHARED@
@@ -226,6 +267,7 @@ USE_FILTER_SHUFFLE = @USE_FILTER_SHUFFLE@
USE_FILTER_SZIP = @USE_FILTER_SZIP@
USINGMEMCHECKER = @USINGMEMCHECKER@
VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -248,6 +290,8 @@ build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
+
+# Install directories that automake doesn't know about
docdir = $(exec_prefix)/doc
dvidir = @dvidir@
enable_shared = @enable_shared@
@@ -259,9 +303,7 @@ host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
-
-# Install directories that automake doesn't know about
-includedir = $(exec_prefix)/include
+includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
@@ -281,6 +323,7 @@ sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -350,14 +393,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
- && exit 0; \
+ ( 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) --foreign hl/fortran/Makefile'; \
- cd $(top_srcdir) && \
- $(AUTOMAKE) --foreign hl/fortran/Makefile
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/fortran/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign hl/fortran/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -375,6 +418,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
mostlyclean-libtool:
-rm -f *.lo
@@ -406,7 +450,7 @@ $(RECURSIVE_TARGETS):
else \
local_target="$$target"; \
fi; \
- (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| eval $$failcom; \
done; \
if test "$$dot_seen" = "no"; then \
@@ -440,16 +484,16 @@ $(RECURSIVE_CLEAN_TARGETS):
else \
local_target="$$target"; \
fi; \
- (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ ($(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" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
done
ctags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -457,14 +501,14 @@ ID: $(HEADERS) $(SOURCES) $(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; nonemtpy = 1; } \
+ $(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)
- tags=; \
+ set x; \
here=`pwd`; \
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
include_option=--etags-include; \
@@ -476,7 +520,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
list='$(SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test ! -f $$subdir/TAGS || \
- tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
fi; \
done; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -485,29 +529,34 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique; \
+ 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)
- tags=; \
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)$$tags$$unique" \
+ test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$tags $$unique
+ $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -528,29 +577,44 @@ distdir: $(DISTFILES)
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 -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
- list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test -d "$(distdir)/$$subdir" \
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|| exit 1; \
- distdir=`$(am__cd) $(distdir) && pwd`; \
- top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
- (cd $$subdir && \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ 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="$$top_distdir" \
- distdir="$$distdir/$$subdir" \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
am__remove_distdir=: \
am__skip_length_check=: \
+ am__skip_mode_fix=: \
distdir) \
|| exit 1; \
fi; \
@@ -581,6 +645,7 @@ 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"
@@ -599,6 +664,8 @@ dvi-am:
html: html-recursive
+html-am:
+
info: info-recursive
info-am:
@@ -607,18 +674,28 @@ 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: installcheck-local
maintainer-clean: maintainer-clean-recursive
@@ -640,8 +717,8 @@ ps-am:
uninstall-am:
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
- install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \
+ ctags-recursive install-am install-strip tags-recursive
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
all all-am all-local check check-TESTS check-am clean \
@@ -880,6 +957,7 @@ check-vfd: $(LIB) $(PROGS) $(TESTS)
HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1; \
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:
diff --git a/hl/fortran/examples/Makefile.in b/hl/fortran/examples/Makefile.in
index b8dd811..698ffbf 100644
--- a/hl/fortran/examples/Makefile.in
+++ b/hl/fortran/examples/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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.
@@ -36,8 +37,9 @@
# This creates some extra work for us.
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@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
@@ -65,12 +67,25 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/src/H5config.h
CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
SOURCES =
DIST_SOURCES =
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = /home1/packages/automake/automake-1.9.6/bin/aclocal-1.9 -I /afs/ncsa/projects/hdf/packages/libtool_1.5.14/Linux_2.4/share/aclocal
ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
AMTAR = @AMTAR@
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+AM_CFLAGS = @AM_CFLAGS@ @H5_CFLAGS@
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@
AM_MAKEFLAGS = @AM_MAKEFLAGS@
AR = @AR@
@@ -84,21 +99,18 @@ BYTESEX = @BYTESEX@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_VERSION = @CC_VERSION@
-
-# H5_CFLAGS holds flags that should be used as CFLAGS when building hdf5,
-# but which shouldn't be exported to h5cc for building other programs.
-CFLAGS = @CFLAGS@ @H5_CFLAGS@
+CFLAGS = @CFLAGS@
CLEARFILEBUF = @CLEARFILEBUF@
CODESTACK = @CODESTACK@
CONFIG_DATE = @CONFIG_DATE@
CONFIG_MODE = @CONFIG_MODE@
CONFIG_USER = @CONFIG_USER@
CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@ @H5_CPPFLAGS@
+CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@ @H5_CXXFLAGS@
+CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEBUG_PKG = @DEBUG_PKG@
DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
@@ -121,7 +133,7 @@ F9XMODEXT = @F9XMODEXT@
F9XMODFLAG = @F9XMODFLAG@
F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
FC = @FC@
-FCFLAGS = @FCFLAGS@ @H5_FCFLAGS@
+FCFLAGS = @FCFLAGS@
FCFLAGS_f90 = @FCFLAGS_f90@
FCLIBS = @FCLIBS@
FGREP = @FGREP@
@@ -159,6 +171,8 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LINUX_LFS = @LINUX_LFS@
+LIPO = @LIPO@
+LL_PATH = @LL_PATH@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_STATIC_EXEC = @LT_STATIC_EXEC@
@@ -169,13 +183,17 @@ MPE = @MPE@
MPI_GET_SIZE = @MPI_GET_SIZE@
NM = @NM@
NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
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@
PARALLEL = @PARALLEL@
PATH_SEPARATOR = @PATH_SEPARATOR@
@@ -191,12 +209,7 @@ SEARCH = @SEARCH@
SED = @SED@
SETX = @SETX@
SET_MAKE = @SET_MAKE@
-
-# Hardcode SHELL to be /bin/sh. Most machines have this shell, and
-# on at least one machine configure fails to detect its existence (janus).
-# Also, when HDF5 is configured on one machine but run on another,
-# configure's automatic SHELL detection may not work on the build machine.
-SHELL = /bin/sh
+SHELL = @SHELL@
SIZE_T = @SIZE_T@
STATIC_EXEC = @STATIC_EXEC@
STATIC_SHARED = @STATIC_SHARED@
@@ -216,6 +229,7 @@ USE_FILTER_SHUFFLE = @USE_FILTER_SHUFFLE@
USE_FILTER_SZIP = @USE_FILTER_SZIP@
USINGMEMCHECKER = @USINGMEMCHECKER@
VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -238,6 +252,8 @@ build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
+
+# Install directories that automake doesn't know about
docdir = $(exec_prefix)/doc
dvidir = @dvidir@
enable_shared = @enable_shared@
@@ -249,9 +265,7 @@ host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
-
-# Install directories that automake doesn't know about
-includedir = $(exec_prefix)/include
+includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
@@ -271,6 +285,7 @@ sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -367,14 +382,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
- && exit 0; \
+ ( 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) --foreign hl/fortran/examples/Makefile'; \
- cd $(top_srcdir) && \
- $(AUTOMAKE) --foreign hl/fortran/examples/Makefile
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/fortran/examples/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign hl/fortran/examples/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -392,6 +407,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
mostlyclean-libtool:
-rm -f *.lo
@@ -421,13 +437,17 @@ distdir: $(DISTFILES)
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 -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
@@ -458,6 +478,7 @@ 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"
@@ -476,6 +497,8 @@ dvi-am:
html: html-am
+html-am:
+
info: info-am
info-am:
@@ -484,18 +507,28 @@ 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: installcheck-local
maintainer-clean: maintainer-clean-am
@@ -517,7 +550,7 @@ ps-am:
uninstall-am: uninstall-local
-.MAKE: install-am install-strip
+.MAKE: check-am install-am install-strip
.PHONY: all all-am all-local check check-TESTS check-am clean \
clean-generic clean-libtool distclean distclean-generic \
@@ -785,6 +818,7 @@ check-vfd: $(LIB) $(PROGS) $(TESTS)
# an inelegant way of solving the problem.
# All programs share the same build rule and a dependency on the main hdf5
# and fortran libraries above.
+
# 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:
diff --git a/hl/fortran/src/H5IMcc.c b/hl/fortran/src/H5IMcc.c
index 492e8b8..8f0e29e 100644
--- a/hl/fortran/src/H5IMcc.c
+++ b/hl/fortran/src/H5IMcc.c
@@ -87,7 +87,7 @@ herr_t H5IMmake_image_8bitf(hid_t loc_id,
} else if(sizeof(int_f) == sizeof(long)) {
if(H5Dwrite(did, H5T_NATIVE_LONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
return -1;
- } else if(sizeof(int_f) == sizeof(long_long)) {
+ } else if(sizeof(int_f) == sizeof(long long)) {
if(H5Dwrite(did, H5T_NATIVE_LLONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
return -1;
} else
@@ -200,7 +200,7 @@ herr_t H5IMmake_image_24bitf(hid_t loc_id,
} else if(sizeof(int_f) == sizeof(long)) {
if(H5Dwrite(did, H5T_NATIVE_LONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
return -1;
- } else if(sizeof(int_f) == sizeof(long_long)) {
+ } else if(sizeof(int_f) == sizeof(long long)) {
if(H5Dwrite(did, H5T_NATIVE_LLONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
return -1;
} else
@@ -276,7 +276,7 @@ herr_t H5IMread_imagef(hid_t loc_id,
tid = H5T_NATIVE_INT;
else if(sizeof(int_f) == sizeof(long))
tid = H5T_NATIVE_LONG;
- else if(sizeof(int_f) == sizeof(long_long))
+ else if(sizeof(int_f) == sizeof(long long))
tid = H5T_NATIVE_LLONG;
else
goto out;
@@ -360,7 +360,7 @@ herr_t H5IMmake_palettef(hid_t loc_id,
} else if(sizeof(int_f) == sizeof(long)) {
if(H5Dwrite(did, H5T_NATIVE_LONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, pal_data) < 0)
return -1;
- } else if(sizeof(int_f) == sizeof(long_long)) {
+ } else if(sizeof(int_f) == sizeof(long long)) {
if(H5Dwrite(did, H5T_NATIVE_LLONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, pal_data) < 0)
return -1;
} else
@@ -424,7 +424,7 @@ herr_t H5IMget_palettef(hid_t loc_id,
return H5IM_get_palette(loc_id,image_name,pal_number,H5T_NATIVE_INT,pal_data);
else if(sizeof(int_f) == sizeof(long))
return H5IM_get_palette(loc_id,image_name,pal_number,H5T_NATIVE_LONG,pal_data);
- else if(sizeof(int_f) == sizeof(long_long))
+ else if(sizeof(int_f) == sizeof(long long))
return H5IM_get_palette(loc_id,image_name,pal_number,H5T_NATIVE_LLONG,pal_data);
else
return -1;
diff --git a/hl/fortran/src/H5IMfc.c b/hl/fortran/src/H5IMfc.c
index 367de86..bbf98cf 100755
--- a/hl/fortran/src/H5IMfc.c
+++ b/hl/fortran/src/H5IMfc.c
@@ -1,17 +1,17 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
- * terms governing use, modification, and redistribution, is contained in *
- * the files COPYING and Copyright.html. COPYING can be found at the root *
- * of the source code distribution tree; Copyright.html can be found at the *
- * root level of an installed copy of the electronic HDF5 document set and *
- * is linked from the top-level documents page. It can also be found at *
- * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+* Copyright by The HDF Group. *
+* Copyright by the Board of Trustees of the University of Illinois. *
+* All rights reserved. *
+* *
+* This file is part of HDF5. The full HDF5 copyright notice, including *
+* terms governing use, modification, and redistribution, is contained in *
+* the files COPYING and Copyright.html. COPYING can be found at the root *
+* of the source code distribution tree; Copyright.html can be found at the *
+* root level of an installed copy of the electronic HDF5 document set and *
+* is linked from the top-level documents page. It can also be found at *
+* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
+* access to either file, you may request a copy from help@hdfgroup.org. *
+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* This files contains C stubs for H5D Fortran APIs */
@@ -20,74 +20,86 @@
/*-------------------------------------------------------------------------
- * Function: h5immake_image_8bit_c
- *
- * Purpose: Call H5IMmake_image_8bit
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 05, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5immake_image_8bit_c
+*
+* Purpose: Call H5IMmake_image_8bit
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 05, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5immake_image_8bit_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hsize_t_f *width,
- hsize_t_f *height,
- int_f *buf)
+ int_f *namelen,
+ _fcd name,
+ hsize_t_f *width,
+ hsize_t_f *height,
+ int_f *buf)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = (int)*namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
-/*
- * Call H5IMmake_image_8bitf function.
- */
- c_loc_id = (hid_t)*loc_id;
- ret = H5IMmake_image_8bitf(c_loc_id,c_name,(hsize_t)*width,(hsize_t)*height,buf);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ int c_namelen;
+ hsize_t w = (hsize_t)*width;
+ hsize_t h = (hsize_t)*height;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = (int)*namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ /*
+ * call H5IMmake_image_8bitf function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+ ret = H5IMmake_image_8bitf(c_loc_id,c_name,w,h,buf);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+
+ return ret_value;
+
+
}
/*-------------------------------------------------------------------------
- * Function: h5imread_image_c
- *
- * Purpose: Call H5IMread_image
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 05, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5imread_image_c
+*
+* Purpose: Call H5IMread_image
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 05, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5imread_image_c (hid_t_f *loc_id,
@@ -95,235 +107,268 @@ nh5imread_image_c (hid_t_f *loc_id,
_fcd name,
int_f *buf)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
-
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = (int)*namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
-/*
- * Call H5IMread_image function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5IMread_imagef(c_loc_id,c_name,buf);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ int c_namelen;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = (int)*namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ /*
+ * call H5IMread_image function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5IMread_imagef(c_loc_id,c_name,buf);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: h5immake_image_24bit_c
- *
- * Purpose: Call H5IMmake_image_24bit
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 05, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5immake_image_24bit_c
+*
+* Purpose: Call H5IMmake_image_24bit
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 05, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5immake_image_24bit_c (hid_t_f *loc_id,
int_f *namelen,
_fcd name,
- int_f *ilen,
+ int_f *ilen,
_fcd il,
hsize_t_f *width,
hsize_t_f *height,
void *buf)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
- char *c_il;
- int c_ilen;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_ilen = *ilen;
- c_il = (char *)HD5f2cstring(il, c_ilen);
- if (c_il == NULL) return ret_value;
-
-/*
- * Call H5IMmake_image_24bitf function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5IMmake_image_24bitf(c_loc_id,c_name,(hsize_t)*width,(hsize_t)*height,c_il,buf);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ int c_namelen;
+ char *c_il = NULL;
+ int c_ilen;
+ hsize_t w = (hsize_t)*width;
+ hsize_t h = (hsize_t)*height;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_ilen = *ilen;
+ c_il = (char *)HD5f2cstring(il, c_ilen);
+ if (c_il == NULL)
+ goto done;
+
+ /*
+ * call H5IMmake_image_24bitf function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5IMmake_image_24bitf(c_loc_id,c_name,w,h,c_il,buf);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+ if(c_il!=NULL)
+ free(c_il);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: h5imget_image_info_c
- *
- * Purpose: Call H5IMget_image_info
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 05, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5imget_image_info_c
+*
+* Purpose: Call H5IMget_image_info
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 05, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5imget_image_info_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hsize_t_f *width,
- hsize_t_f *height,
- hsize_t_f *planes,
- hsize_t_f *npals,
- int_f *ilen,
- _fcd interlace)
+ int_f *namelen,
+ _fcd name,
+ hsize_t_f *width,
+ hsize_t_f *height,
+ hsize_t_f *planes,
+ hsize_t_f *npals,
+ int_f *ilen,
+ _fcd interlace)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
- hsize_t c_width;
- hsize_t c_height;
- hsize_t c_planes;
- hssize_t c_npals;
- char *c_buf=NULL; /* Buffer to hold C string */
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
-/*
- * Allocate buffer to hold name of an attribute
- */
- if ((c_buf = malloc((size_t)*ilen +1)) == NULL)
- return ret_value;
-
-/*
- * Call H5IMget_image_info function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5IMget_image_info(c_loc_id,c_name,&c_width,&c_height,&c_planes,c_buf,&c_npals);
-
- *width = (hsize_t_f) c_width;
- *height = (hsize_t_f) c_height;
- *planes = (hsize_t_f) c_planes;
- *npals = (hsize_t_f) c_npals;
-
-
-/*
- * Convert C name to FORTRAN and place it in the given buffer
- */
- HD5packFstring(c_buf, _fcdtocp(interlace), (size_t)*ilen);
-
- if(c_buf) free(c_buf);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ int c_namelen;
+ hsize_t c_width;
+ hsize_t c_height;
+ hsize_t c_planes;
+ hssize_t c_npals;
+ char *c_buf=NULL; /* buffer to hold C string */
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ /*
+ * allocate buffer to hold name of an attribute
+ */
+ if ((c_buf = malloc((size_t)*ilen +1)) == NULL)
+ goto done;
+
+ /*
+ * call H5IMget_image_info function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5IMget_image_info(c_loc_id,c_name,&c_width,&c_height,&c_planes,c_buf,&c_npals);
+
+ if (ret < 0)
+ goto done;
+
+ *width = (hsize_t_f) c_width;
+ *height = (hsize_t_f) c_height;
+ *planes = (hsize_t_f) c_planes;
+ *npals = (hsize_t_f) c_npals;
+
+ /*
+ * convert C name to FORTRAN and place it in the given buffer
+ */
+ HD5packFstring(c_buf, _fcdtocp(interlace), (size_t)*ilen);
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+ if(c_buf!=NULL)
+ free(c_buf);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: h5imis_image_c
- *
- * Purpose: Call H5IMis_image
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 06, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5imis_image_c
+*
+* Purpose: Call H5IMis_image
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 06, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5imis_image_c(hid_t_f *loc_id,
int_f *namelen,
_fcd name)
{
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ int c_namelen;
+ herr_t ret;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL) return -1;
+
+ /*
+ * call H5LTget_dataset_ndims function.
+ */
+ c_loc_id = (hid_t)*loc_id;
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return -1;
+ ret = H5IMis_image(c_loc_id, c_name);
-/*
- * Call H5LTget_dataset_ndims function.
- */
- c_loc_id = (hid_t)*loc_id;
+ if(c_name!=NULL)
+ free(c_name);
- return( H5IMis_image(c_loc_id, c_name));
+ return ret;
}
/*-------------------------------------------------------------------------
- * Function: h5immake_palette_c
- *
- * Purpose: Call H5IMmake_palette
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 06, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5immake_palette_c
+*
+* Purpose: Call H5IMmake_palette
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 06, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5immake_palette_c (hid_t_f *loc_id,
@@ -332,62 +377,72 @@ nh5immake_palette_c (hid_t_f *loc_id,
hsize_t_f *dims,
void *buf)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
- hsize_t *c_dims;
- int i;
- int rank=2;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_dims = malloc(sizeof(hsize_t) * (rank ));
- if (!c_dims) return ret_value;
-
- for (i = 0; i < rank ; i++) {
- c_dims[i] = dims[i];
- }
-
-/*
- * Call H5IMmake_palette function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5IMmake_palettef(c_loc_id,c_name,c_dims,buf);
-
- free (c_dims);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ int c_namelen;
+ hsize_t *c_dims;
+ int i;
+ int rank=2;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_dims = malloc(sizeof(hsize_t) * (rank ));
+ if (c_dims == NULL)
+ goto done;
+
+ for (i = 0; i < rank ; i++)
+ {
+ c_dims[i] = dims[i];
+ }
+
+ /*
+ * call H5IMmake_palette function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5IMmake_palettef(c_loc_id,c_name,c_dims,buf);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+ if(c_dims!=NULL)
+ free(c_dims);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: h5imlink_palette_c
- *
- * Purpose: Call H5IMlink_palette
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 06, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5imlink_palette_c
+*
+* Purpose: Call H5IMlink_palette
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 06, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5imlink_palette_c (hid_t_f *loc_id,
@@ -396,119 +451,138 @@ nh5imlink_palette_c (hid_t_f *loc_id,
int_f *ilen,
_fcd pal_name)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
- char *c_namepal;
- int c_namelenpal;
-
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_namelenpal = *ilen;
- c_namepal = (char *)HD5f2cstring(pal_name, c_namelenpal);
- if (c_namepal == NULL) return ret_value;
-
-/*
- * Call H5IMlink_palette function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5IMlink_palette(c_loc_id,c_name,c_namepal);
-
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ char *c_namepal = NULL;
+ int c_namelen;
+ int c_namelenpal;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_namelenpal = *ilen;
+ c_namepal = (char *)HD5f2cstring(pal_name, c_namelenpal);
+ if (c_namepal == NULL)
+ goto done;
+
+ /*
+ * call H5IMlink_palette function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5IMlink_palette(c_loc_id,c_name,c_namepal);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+ if(c_namepal!=NULL)
+ free(c_namepal);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: h5imunlink_palette_c
- *
- * Purpose: Call H5IMunlink_palette
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 06, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5imunlink_palette_c
+*
+* Purpose: Call H5IMunlink_palette
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 06, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5imunlink_palette_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *ilen,
- _fcd pal_name)
+ int_f *namelen,
+ _fcd name,
+ int_f *ilen,
+ _fcd pal_name)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
- char *c_namepal;
- int c_namelenpal;
-
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_namelenpal = *ilen;
- c_namepal = (char *)HD5f2cstring(pal_name, c_namelenpal);
- if (c_namepal == NULL) return ret_value;
-
-/*
- * Call H5IMunlink_palette function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5IMunlink_palette(c_loc_id,c_name,c_namepal);
-
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ char *c_namepal = NULL;
+ int c_namelen;
+ int c_namelenpal;
+
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_namelenpal = *ilen;
+ c_namepal = (char *)HD5f2cstring(pal_name, c_namelenpal);
+ if (c_namepal == NULL)
+ goto done;
+
+ /*
+ * call H5IMunlink_palette function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5IMunlink_palette(c_loc_id,c_name,c_namepal);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+ if(c_namepal!=NULL)
+ free(c_namepal);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: h5imget_npalettes_c
- *
- * Purpose: Call H5IMget_npalettes
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 06 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5imget_npalettes_c
+*
+* Purpose: Call H5IMget_npalettes
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 06 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5imget_npalettes_c(hid_t_f *loc_id,
@@ -516,189 +590,220 @@ nh5imget_npalettes_c(hid_t_f *loc_id,
_fcd name,
hsize_t_f *npals)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
- hssize_t c_npals;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
- /*
- * Call H5IMget_image_info function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5IMget_npalettes(c_loc_id,c_name,&c_npals);
-
- *npals = (hsize_t_f) c_npals;
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ int c_namelen;
+ hssize_t c_npals;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ /*
+ * call H5IMget_image_info function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5IMget_npalettes(c_loc_id,c_name,&c_npals);
+
+ *npals = (hsize_t_f) c_npals;
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: h5imget_palette_info_c
- *
- * Purpose: Call H5IMget_palette_info
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 06 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5imget_palette_info_c
+*
+* Purpose: Call H5IMget_palette_info
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 06 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5imget_palette_info_c(hid_t_f *loc_id,
int_f *namelen,
- _fcd name,
- int_f *pal_number,
- hsize_t_f *dims)
+ _fcd name,
+ int_f *pal_number,
+ hsize_t_f *dims)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
- hsize_t c_dims[2];
- int i;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
- /*
- * Call H5IMget_image_info function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5IMget_palette_info(c_loc_id,c_name,*pal_number,c_dims);
-
- for (i = 0; i < 2 ; i++) {
- dims[i] = (hsize_t_f) c_dims[i];
- }
-
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ int c_namelen;
+ hsize_t c_dims[2];
+ int i;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ /*
+ * call H5IMget_image_info function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5IMget_palette_info(c_loc_id,c_name,*pal_number,c_dims);
+
+ if (ret < 0)
+ goto done;
+
+ for (i = 0; i < 2 ; i++)
+ {
+ dims[i] = (hsize_t_f) c_dims[i];
+ }
+
+ ret_value = 0;
+
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: h5imget_palette_c
- *
- * Purpose: Call H5IMget_palette
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 06 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5imget_palette_c
+*
+* Purpose: Call H5IMget_palette
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 06 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5imget_palette_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *pal_number,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *pal_number,
+ void *buf)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
- /*
- * Call H5IMget_image_info function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5IMget_palettef(c_loc_id,c_name,*pal_number,buf);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ int c_namelen;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ /*
+ * call H5IMget_image_info function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5IMget_palettef(c_loc_id,c_name,*pal_number,buf);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: h5imis_palette_c
- *
- * Purpose: Call H5IMis_palette
- *
- * Return: true, false, fail
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 06, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5imis_palette_c
+*
+* Purpose: Call H5IMis_palette
+*
+* Return: true, false, fail
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 06, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5imis_palette_c(hid_t_f *loc_id,
int_f *namelen,
- _fcd name)
+ _fcd name)
{
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return -1;
-
-/*
- * Call H5IMis_palette function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- return( H5IMis_palette(c_loc_id, c_name));
+ hid_t c_loc_id;
+ char *c_name;
+ int c_namelen;
+ herr_t ret;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL) return -1;
+
+ /*
+ * call H5IMis_palette function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5IMis_palette(c_loc_id, c_name);
+
+ if(c_name!=NULL)
+ free(c_name);
+
+ return ret;
}
diff --git a/hl/fortran/src/H5IMff.f90 b/hl/fortran/src/H5IMff.f90
index 0fd4cd8..6e13c30 100755
--- a/hl/fortran/src/H5IMff.f90
+++ b/hl/fortran/src/H5IMff.f90
@@ -67,9 +67,9 @@ subroutine h5immake_image_8bit_f(loc_id,&
interface
integer function h5immake_image_8bit_c(loc_id,namelen,dset_name,width,height,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5IMMAKE_IMAGE_8BIT_C'::h5immake_image_8bit_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMMAKE_IMAGE_8BIT_C'::h5immake_image_8bit_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer :: namelen ! lenght of name buffer
@@ -127,9 +127,9 @@ subroutine h5imread_image_f(loc_id,&
interface
integer function h5imread_image_c(loc_id,namelen,dset_name,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5IMREAD_IMAGE_C'::h5imread_image_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMREAD_IMAGE_C'::h5imread_image_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer :: namelen ! lenght of name buffer
@@ -191,9 +191,9 @@ subroutine h5immake_image_24bit_f(loc_id,&
interface
integer function h5immake_image_24bit_c(loc_id,namelen,dset_name,ilen,il,width,height,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5IMMAKE_IMAGE_24BIT_C'::h5immake_image_24bit_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMMAKE_IMAGE_24BIT_C'::h5immake_image_24bit_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: il
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -265,9 +265,9 @@ subroutine h5imget_image_info_f(loc_id,&
interface
integer function h5imget_image_info_c(loc_id,namelen,dset_name,width,height,planes,npals,ilen,interlace)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5IMGET_IMAGE_INFO_C'::h5imget_image_info_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMGET_IMAGE_INFO_C'::h5imget_image_info_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: interlace
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -326,9 +326,9 @@ integer function h5imis_image_f(loc_id,&
interface
integer function h5imis_image_c(loc_id,namelen,dset_name)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5IMIS_IMAGE_C'::h5imis_image_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMIS_IMAGE_C'::h5imis_image_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer :: namelen ! lenght of name buffer
@@ -385,9 +385,9 @@ subroutine h5immake_palette_f(loc_id,&
interface
integer function h5immake_palette_c(loc_id,namelen,dset_name,pal_dims,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5IMMAKE_PALETTE_C'::h5immake_palette_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMMAKE_PALETTE_C'::h5immake_palette_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer :: namelen ! lenght of name buffer
@@ -444,9 +444,9 @@ subroutine h5imlink_palette_f(loc_id,&
interface
integer function h5imlink_palette_c(loc_id,namelen,dset_name,ilen,pal_name)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5IMLINK_PALETTE_C'::h5imlink_palette_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMLINK_PALETTE_C'::h5imlink_palette_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: pal_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -506,9 +506,9 @@ subroutine h5imunlink_palette_f(loc_id,&
interface
integer function h5imunlink_palette_c(loc_id,namelen,dset_name,ilen,pal_name)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5IMUNLINK_PALETTE_C'::h5imunlink_palette_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMUNLINK_PALETTE_C'::h5imunlink_palette_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: pal_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -567,9 +567,9 @@ subroutine h5imget_npalettes_f(loc_id,&
interface
integer function h5imget_npalettes_c(loc_id,namelen,dset_name,npals)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5IMGET_NPALETTES_C'::h5imget_npalettes_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMGET_NPALETTES_C'::h5imget_npalettes_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
character(len=*), intent(in) :: dset_name ! name of the dataset
@@ -627,9 +627,9 @@ subroutine h5imget_palette_info_f(loc_id,&
interface
integer function h5imget_palette_info_c(loc_id,namelen,dset_name,pal_number,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5IMGET_PALETTE_INFO_C'::h5imget_palette_info_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMGET_PALETTE_INFO_C'::h5imget_palette_info_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
character(len=*), intent(in) :: dset_name ! name of the dataset
@@ -689,9 +689,9 @@ subroutine h5imget_palette_f(loc_id,&
interface
integer function h5imget_palette_c(loc_id,namelen,dset_name,pal_number,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5IMGET_PALETTE_C'::h5imget_palette_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMGET_PALETTE_C'::h5imget_palette_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer :: namelen ! lenght of name buffer
@@ -744,9 +744,9 @@ integer function h5imis_palette_f(loc_id,&
interface
integer function h5imis_palette_c(loc_id,namelen,dset_name)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5IMIS_PALETTE_C'::h5imis_palette_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMIS_PALETTE_C'::h5imis_palette_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer :: namelen ! lenght of name buffer
diff --git a/hl/fortran/src/H5LTf90proto.h b/hl/fortran/src/H5LTf90proto.h
index 247a3e6..8a9d6c0 100755
--- a/hl/fortran/src/H5LTf90proto.h
+++ b/hl/fortran/src/H5LTf90proto.h
@@ -1,17 +1,17 @@
- /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
- * terms governing use, modification, and redistribution, is contained in *
- * the files COPYING and Copyright.html. COPYING can be found at the root *
- * of the source code distribution tree; Copyright.html can be found at the *
- * root level of an installed copy of the electronic HDF5 document set and *
- * is linked from the top-level documents page. It can also be found at *
- * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+* Copyright by The HDF Group. *
+* Copyright by the Board of Trustees of the University of Illinois. *
+* All rights reserved. *
+* *
+* This file is part of HDF5. The full HDF5 copyright notice, including *
+* terms governing use, modification, and redistribution, is contained in *
+* the files COPYING and Copyright.html. COPYING can be found at the root *
+* of the source code distribution tree; Copyright.html can be found at the *
+* root level of an installed copy of the electronic HDF5 document set and *
+* is linked from the top-level documents page. It can also be found at *
+* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
+* access to either file, you may request a copy from help@hdfgroup.org. *
+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#ifndef _H5LTf90proto_H
@@ -28,8 +28,8 @@ H5_DLL void HD5packFstring (char *src, char *dest, size_t len);
/*
- * Functions from H5LTfc.c
- */
+* Functions from H5LTfc.c
+*/
# define nh5ltmake_dataset_c H5_FC_FUNC_(h5ltmake_dataset_c, H5LTMAKE_DATASET_C)
# define nh5ltmake_dataset_int1_c H5_FC_FUNC_(h5ltmake_dataset_int1_c, H5LTMAKE_DATASET_INT1_C)
# define nh5ltmake_dataset_int2_c H5_FC_FUNC_(h5ltmake_dataset_int2_c, H5LTMAKE_DATASET_INT2_C)
@@ -89,9 +89,9 @@ H5_DLL void HD5packFstring (char *src, char *dest, size_t len);
# define nh5ltget_attribute_info_c H5_FC_FUNC_(h5ltget_attribute_info_c, H5LTGET_ATTRIBUTE_INFO_C)
/*-------------------------------------------------------------------------
- * Image
- *-------------------------------------------------------------------------
- */
+* Image
+*-------------------------------------------------------------------------
+*/
# define nh5immake_image_8bit_c H5_FC_FUNC_(h5immake_image_8bit_c, H5IMMAKE_IMAGE_8BIT_C)
# define nh5immake_image_24bit_c H5_FC_FUNC_(h5immake_image_24bit_c, H5IMMAKE_IMAGE_24BIT_C)
# define nh5imread_image_c H5_FC_FUNC_(h5imread_image_c, H5IMREAD_IMAGE_C)
@@ -106,9 +106,9 @@ H5_DLL void HD5packFstring (char *src, char *dest, size_t len);
# define nh5imis_palette_c H5_FC_FUNC_(h5imis_palette_c, H5IMIS_PALETTE_C)
/*-------------------------------------------------------------------------
- * Table
- *-------------------------------------------------------------------------
- */
+* Table
+*-------------------------------------------------------------------------
+*/
# define nh5tbmake_table_c H5_FC_FUNC_(h5tbmake_table_c, H5TBMAKE_TABLE_C)
# define nh5tbwrite_field_name_c H5_FC_FUNC_(h5tbwrite_field_name_c, H5TBWRITE_FIELD_NAME_C)
# define nh5tbwrite_field_name_int_c H5_FC_FUNC_(h5tbwrite_field_name_int_c, H5TBWRITE_FIELD_NAME_INT_C)
@@ -152,182 +152,182 @@ nh5ltmake_dataset_c (hid_t_f *loc_id,
H5_DLL
int_f
nh5ltmake_dataset_int1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
nh5ltmake_dataset_int2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
nh5ltmake_dataset_int3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
nh5ltmake_dataset_fl1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
nh5ltmake_dataset_fl2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
nh5ltmake_dataset_fl3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
nh5ltmake_dataset_dl1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
nh5ltmake_dataset_dl2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
nh5ltmake_dataset_dl3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
nh5ltmake_dataset_nint1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
nh5ltmake_dataset_nint2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
nh5ltmake_dataset_nint3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
nh5ltmake_dataset_nfl1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
nh5ltmake_dataset_nfl2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
nh5ltmake_dataset_nfl3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
nh5ltmake_dataset_ndl1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
nh5ltmake_dataset_ndl2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
nh5ltmake_dataset_ndl3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf);
H5_DLL
int_f
@@ -336,253 +336,254 @@ nh5ltread_dataset_c (hid_t_f *loc_id,
_fcd name,
hid_t_f *type_id,
void *buf,
- hsize_t_f *dims);
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_int1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_int2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_int3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_fl1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_fl2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_fl3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_dl1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_dl2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_dl3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_nint1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_nint2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_nint3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_nfl1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_nfl2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_nfl3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_ndl1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_ndl2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltread_dataset_ndl3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims);
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5ltset_attribute_int_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- size_t_f *size,
- void *buf);
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ size_t_f *size,
+ void *buf);
H5_DLL
int_f
nh5ltset_attribute_float_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- size_t_f *size,
- void *buf);
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ size_t_f *size,
+ void *buf);
H5_DLL
int_f
nh5ltset_attribute_double_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- size_t_f *size,
- void *buf);
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ size_t_f *size,
+ void *buf);
H5_DLL
int_f
nh5ltset_attribute_string_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- void *buf);
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ int_f *buflen,
+ void *buf);
H5_DLL
int_f
nh5ltget_attribute_int_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- void *buf);
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ void *buf);
H5_DLL
int_f
nh5ltget_attribute_float_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- void *buf);
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ void *buf);
H5_DLL
int_f
nh5ltget_attribute_double_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- void *buf);
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ void *buf);
H5_DLL
int_f
nh5ltget_attribute_string_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- void *buf);
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ void *buf);
H5_DLL
int_f
nh5ltget_dataset_ndims_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank);
+ int_f *namelen,
+ _fcd name,
+ int_f *rank);
H5_DLL
int_f
@@ -595,34 +596,35 @@ int_f
nh5ltget_dataset_info_c(hid_t_f *loc_id,
int_f *namelen,
_fcd name,
- hsize_t_f *dims,
+ hsize_t_f *dims,
int_f *type_class,
- size_t_f *type_size);
+ size_t_f *type_size);
H5_DLL
int_f
nh5ltget_attribute_ndims_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- int_f *rank);
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ int_f *rank);
H5_DLL
int_f
nh5ltget_attribute_info_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *attrnamelen,
- _fcd attrname,
- hsize_t_f *dims,
- int_f *type_class,
- size_t_f *type_size);
+ int_f *namelen,
+ _fcd name,
+ int_f *attrnamelen,
+ _fcd attrname,
+ hsize_t_f *dims,
+ int_f *type_class,
+ size_t_f *type_size);
H5_DLL
int_f
nh5ltmake_dataset_string_c (hid_t_f *loc_id,
int_f *namelen,
_fcd name,
+ int_f *buflen,
char *buf);
H5_DLL
@@ -633,18 +635,18 @@ nh5ltread_dataset_string_c (hid_t_f *loc_id,
char *buf);
/*-------------------------------------------------------------------------
- * Image
- *-------------------------------------------------------------------------
- */
+* Image
+*-------------------------------------------------------------------------
+*/
H5_DLL
int_f
nh5immake_image_8bit_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hsize_t_f *width,
- hsize_t_f *height,
- int_f *buf);
+ int_f *namelen,
+ _fcd name,
+ hsize_t_f *width,
+ hsize_t_f *height,
+ int_f *buf);
H5_DLL
int_f
nh5imread_image_c (hid_t_f *loc_id,
@@ -657,22 +659,22 @@ int_f
nh5immake_image_24bit_c (hid_t_f *loc_id,
int_f *namelen,
_fcd name,
- int_f *ilen,
+ int_f *ilen,
_fcd il,
hsize_t_f *width,
hsize_t_f *height,
- void *buf);
+ void *buf);
H5_DLL
int_f
nh5imget_image_info_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hsize_t_f *width,
- hsize_t_f *height,
- hsize_t_f *planes,
- hsize_t_f *npals,
- int_f *ilen,
- _fcd interlace);
+ int_f *namelen,
+ _fcd name,
+ hsize_t_f *width,
+ hsize_t_f *height,
+ hsize_t_f *planes,
+ hsize_t_f *npals,
+ int_f *ilen,
+ _fcd interlace);
H5_DLL
@@ -701,71 +703,71 @@ nh5imlink_palette_c (hid_t_f *loc_id,
H5_DLL
int_f
nh5imunlink_palette_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *ilen,
- _fcd pal_name);
+ int_f *namelen,
+ _fcd name,
+ int_f *ilen,
+ _fcd pal_name);
H5_DLL
int_f
nh5imget_npalettes_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hsize_t_f *npals);
+ int_f *namelen,
+ _fcd name,
+ hsize_t_f *npals);
H5_DLL
int_f
nh5imget_palette_info_c(hid_t_f *loc_id,
int_f *namelen,
- _fcd name,
- int_f *pal_number,
- hsize_t_f *dims);
+ _fcd name,
+ int_f *pal_number,
+ hsize_t_f *dims);
H5_DLL
int_f
nh5imget_palette_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *pal_number,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *pal_number,
+ void *buf);
H5_DLL
int_f
nh5imis_palette_c(hid_t_f *loc_id,
int_f *namelen,
- _fcd name);
+ _fcd name);
/*-------------------------------------------------------------------------
- * Table
- *-------------------------------------------------------------------------
- */
+* Table
+*-------------------------------------------------------------------------
+*/
H5_DLL
int_f
nh5tbmake_table_c(int_f *namelen1,
- _fcd name1,
- hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hsize_t_f *nfields,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- size_t_f *field_offset,
- hid_t_f *field_types,
- hsize_t_f *chunk_size,
- int_f *compress,
- int_f *len, /* field_names lenghts */
- _fcd buf); /* field_names */
+ _fcd name1,
+ hid_t_f *loc_id,
+ int_f *namelen,
+ _fcd name,
+ hsize_t_f *nfields,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ size_t_f *field_offset,
+ hid_t_f *field_types,
+ hsize_t_f *chunk_size,
+ int_f *compress,
+ int_f *len, /* field_names lenghts */
+ _fcd buf); /* field_names */
H5_DLL
int_f
nh5tbwrite_field_name_c(hid_t_f *loc_id,
int_f *namelen,
_fcd name,
- int_f *namelen1,
+ int_f *namelen1,
_fcd field_name,
hsize_t_f *start,
hsize_t_f *nrecords,
@@ -775,165 +777,165 @@ nh5tbwrite_field_name_c(hid_t_f *loc_id,
H5_DLL
int_f
nh5tbwrite_field_name_int_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
nh5tbwrite_field_name_fl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
nh5tbwrite_field_name_dl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
nh5tbwrite_field_name_st_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
nh5tbread_field_name_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
nh5tbread_field_name_int_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
nh5tbread_field_name_fl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
nh5tbread_field_name_dl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
nh5tbread_field_name_st_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
nh5tbwrite_field_index_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
nh5tbwrite_field_index_int_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
nh5tbwrite_field_index_fl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
nh5tbwrite_field_index_dl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
nh5tbwrite_field_index_st_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
@@ -949,53 +951,53 @@ nh5tbread_field_index_c(hid_t_f *loc_id,
H5_DLL
int_f
nh5tbread_field_index_int_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
nh5tbread_field_index_fl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
nh5tbread_field_index_dl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
nh5tbread_field_index_st_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf);
H5_DLL
int_f
nh5tbinsert_field_c(hid_t_f *loc_id,
int_f *namelen,
_fcd name,
- int_f *namelen1,
+ int_f *namelen1,
_fcd field_name,
hid_t_f *field_type,
int_f *position,
@@ -1004,71 +1006,71 @@ nh5tbinsert_field_c(hid_t_f *loc_id,
H5_DLL
int_f
nh5tbinsert_field_int_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hid_t_f *field_type,
- int_f *position,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hid_t_f *field_type,
+ int_f *position,
+ void *buf);
H5_DLL
int_f
nh5tbinsert_field_fl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hid_t_f *field_type,
- int_f *position,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hid_t_f *field_type,
+ int_f *position,
+ void *buf);
H5_DLL
int_f
nh5tbinsert_field_dl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hid_t_f *field_type,
- int_f *position,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hid_t_f *field_type,
+ int_f *position,
+ void *buf);
H5_DLL
int_f
nh5tbinsert_field_st_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hid_t_f *field_type,
- int_f *position,
- void *buf);
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hid_t_f *field_type,
+ int_f *position,
+ void *buf);
H5_DLL
int_f
nh5tbdelete_field_c(hid_t_f *loc_id,
int_f *namelen,
_fcd name,
- int_f *namelen1,
- _fcd field_name);
+ int_f *namelen1,
+ _fcd field_name);
H5_DLL
int_f
nh5tbget_table_info_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hsize_t_f *nfields,
- hsize_t_f *nrecords);
+ int_f *namelen,
+ _fcd name,
+ hsize_t_f *nfields,
+ hsize_t_f *nrecords);
H5_DLL
int_f
nh5tbget_field_info_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hsize_t_f *nfields,
- size_t_f *field_sizes,
- size_t_f *field_offsets,
- size_t_f *type_size,
- int_f *namelen2, /* field_names lenghts */
- _fcd field_names) ; /* field_names */
+ int_f *namelen,
+ _fcd name,
+ hsize_t_f *nfields,
+ size_t_f *field_sizes,
+ size_t_f *field_offsets,
+ size_t_f *type_size,
+ int_f *namelen2, /* field_names lenghts */
+ _fcd field_names) ; /* field_names */
diff --git a/hl/fortran/src/H5LTfc.c b/hl/fortran/src/H5LTfc.c
index 6aa3354..039385a 100755
--- a/hl/fortran/src/H5LTfc.c
+++ b/hl/fortran/src/H5LTfc.c
@@ -1,17 +1,17 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
- * terms governing use, modification, and redistribution, is contained in *
- * the files COPYING and Copyright.html. COPYING can be found at the root *
- * of the source code distribution tree; Copyright.html can be found at the *
- * root level of an installed copy of the electronic HDF5 document set and *
- * is linked from the top-level documents page. It can also be found at *
- * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+* Copyright by The HDF Group. *
+* Copyright by the Board of Trustees of the University of Illinois. *
+* All rights reserved. *
+* *
+* This file is part of HDF5. The full HDF5 copyright notice, including *
+* terms governing use, modification, and redistribution, is contained in *
+* the files COPYING and Copyright.html. COPYING can be found at the root *
+* of the source code distribution tree; Copyright.html can be found at the *
+* root level of an installed copy of the electronic HDF5 document set and *
+* is linked from the top-level documents page. It can also be found at *
+* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
+* access to either file, you may request a copy from help@hdfgroup.org. *
+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* This files contains C stubs for H5D Fortran APIs */
@@ -21,23 +21,23 @@
/*-------------------------------------------------------------------------
- * Function: H5LTmake_dataset_c
- *
- * Purpose: Call H5LTmake_dataset
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: September 09, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTmake_dataset_c
+*
+* Purpose: Call H5LTmake_dataset
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: September 09, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5ltmake_dataset_c (hid_t_f *loc_id,
@@ -48,57 +48,66 @@ nh5ltmake_dataset_c (hid_t_f *loc_id,
hid_t_f *type_id,
void *buf)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- hid_t c_type_id;
- char *c_name;
- int c_namelen;
- hsize_t *c_dims;
- int i;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_dims = malloc(sizeof(hsize_t) * (*rank ));
- if (!c_dims) return ret_value;
-
-/*
- * Transpose dimension arrays because of C-FORTRAN storage order
- */
- for (i = 0; i < *rank ; i++) {
- c_dims[i] = dims[*rank - i - 1];
- }
-
-/*
- * Call H5LTmake_dataset function.
- */
- c_loc_id = (hid_t)*loc_id;
- c_type_id = (hid_t)*type_id;
-
- ret = H5LTmake_dataset(c_loc_id, c_name, *rank, c_dims, c_type_id, buf );
-
- free (c_dims);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ hid_t c_type_id;
+ char *c_name = NULL;
+ hsize_t *c_dims = NULL;
+ int c_namelen;
+ int i;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_dims = malloc(sizeof(hsize_t) * (*rank ));
+ if (c_dims == NULL)
+ goto done;
+
+ /*
+ * transpose dimension arrays because of C-FORTRAN storage order
+ */
+ for (i = 0; i < *rank ; i++)
+ {
+ c_dims[i] = dims[*rank - i - 1];
+ }
+
+ /*
+ * call H5LTmake_dataset function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+ c_type_id = (hid_t)*type_id;
+
+ ret = H5LTmake_dataset(c_loc_id, c_name, *rank, c_dims, c_type_id, buf );
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+ if(c_dims!=NULL)
+ free(c_dims);
+ return ret_value;
}
int_f
nh5ltmake_dataset_int1_c (hid_t_f *loc_id,
int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf)
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf)
{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
}
int_f
nh5ltmake_dataset_int2_c (hid_t_f *loc_id,
@@ -109,7 +118,7 @@ nh5ltmake_dataset_int2_c (hid_t_f *loc_id,
hid_t_f *type_id,
void *buf)
{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
}
int_f
nh5ltmake_dataset_int3_c (hid_t_f *loc_id,
@@ -120,7 +129,7 @@ nh5ltmake_dataset_int3_c (hid_t_f *loc_id,
hid_t_f *type_id,
void *buf)
{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
}
int_f
nh5ltmake_dataset_fl1_c (hid_t_f *loc_id,
@@ -131,7 +140,7 @@ nh5ltmake_dataset_fl1_c (hid_t_f *loc_id,
hid_t_f *type_id,
void *buf)
{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
}
int_f
nh5ltmake_dataset_fl2_c (hid_t_f *loc_id,
@@ -142,7 +151,7 @@ nh5ltmake_dataset_fl2_c (hid_t_f *loc_id,
hid_t_f *type_id,
void *buf)
{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
}
int_f
nh5ltmake_dataset_fl3_c (hid_t_f *loc_id,
@@ -153,7 +162,7 @@ nh5ltmake_dataset_fl3_c (hid_t_f *loc_id,
hid_t_f *type_id,
void *buf)
{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
}
int_f
nh5ltmake_dataset_dl1_c (hid_t_f *loc_id,
@@ -164,7 +173,7 @@ nh5ltmake_dataset_dl1_c (hid_t_f *loc_id,
hid_t_f *type_id,
void *buf)
{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
}
int_f
nh5ltmake_dataset_dl2_c (hid_t_f *loc_id,
@@ -175,7 +184,7 @@ nh5ltmake_dataset_dl2_c (hid_t_f *loc_id,
hid_t_f *type_id,
void *buf)
{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
}
int_f
nh5ltmake_dataset_dl3_c (hid_t_f *loc_id,
@@ -186,21 +195,43 @@ nh5ltmake_dataset_dl3_c (hid_t_f *loc_id,
hid_t_f *type_id,
void *buf)
{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
}
int_f
nh5ltmake_dataset_nint1_c (hid_t_f *loc_id,
- int_f *namelen,
+ int_f *namelen,
_fcd name,
int_f *rank,
hsize_t_f *dims,
hid_t_f *type_id,
void *buf)
{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
}
int_f
nh5ltmake_dataset_nint2_c (hid_t_f *loc_id,
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf)
+{
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+}
+int_f
+nh5ltmake_dataset_nint3_c (hid_t_f *loc_id,
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf)
+{
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+}
+int_f
+nh5ltmake_dataset_nfl1_c (hid_t_f *loc_id,
int_f *namelen,
_fcd name,
int_f *rank,
@@ -208,10 +239,10 @@ nh5ltmake_dataset_nint2_c (hid_t_f *loc_id,
hid_t_f *type_id,
void *buf)
{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
}
int_f
-nh5ltmake_dataset_nint3_c (hid_t_f *loc_id,
+nh5ltmake_dataset_nfl2_c (hid_t_f *loc_id,
int_f *namelen,
_fcd name,
int_f *rank,
@@ -219,92 +250,70 @@ nh5ltmake_dataset_nint3_c (hid_t_f *loc_id,
hid_t_f *type_id,
void *buf)
{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_nfl1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf)
-{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_nfl2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf)
-{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
}
int_f
nh5ltmake_dataset_nfl3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf)
{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
}
int_f
nh5ltmake_dataset_ndl1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf)
{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
}
int_f
nh5ltmake_dataset_ndl2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf)
{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
}
int_f
nh5ltmake_dataset_ndl3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *rank,
- hsize_t_f *dims,
- hid_t_f *type_id,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *rank,
+ hsize_t_f *dims,
+ hid_t_f *type_id,
+ void *buf)
{
- return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
+ return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
}
/*-------------------------------------------------------------------------
- * Function: H5LTread_dataset_c
- *
- * Purpose: Call H5LTmake_dataset
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: September 09, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTread_dataset_c
+*
+* Purpose: Call H5LTmake_dataset
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: September 09, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5ltread_dataset_c (hid_t_f *loc_id,
@@ -314,282 +323,308 @@ nh5ltread_dataset_c (hid_t_f *loc_id,
void *buf,
hsize_t_f *dims)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- hid_t c_type_id;
- char *c_name;
- int c_namelen;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
-/*
- * Call H5LTread_dataset function.
- */
- c_loc_id = (hid_t)*loc_id;
- c_type_id = (hid_t)*type_id;
-
- ret = H5LTread_dataset(c_loc_id, c_name, c_type_id, buf );
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ hid_t c_type_id;
+ char *c_name = NULL;
+ int c_namelen;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ /*
+ * call H5LTread_dataset function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+ c_type_id = (hid_t)*type_id;
+
+ ret = H5LTread_dataset(c_loc_id, c_name, c_type_id, buf );
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+
+ return ret_value;
}
int_f
nh5ltread_dataset_int1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
int_f
nh5ltread_dataset_int2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
int_f
nh5ltread_dataset_int3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
int_f
nh5ltread_dataset_fl1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
int_f
nh5ltread_dataset_fl2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
int_f
nh5ltread_dataset_fl3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
int_f
nh5ltread_dataset_dl1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
int_f
nh5ltread_dataset_dl2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
int_f
nh5ltread_dataset_dl3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
int_f
nh5ltread_dataset_nint1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
int_f
nh5ltread_dataset_nint2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
int_f
nh5ltread_dataset_nint3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
int_f
nh5ltread_dataset_nfl1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
int_f
nh5ltread_dataset_nfl2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
int_f
nh5ltread_dataset_nfl3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
int_f
nh5ltread_dataset_ndl1_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
int_f
nh5ltread_dataset_ndl2_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
int_f
nh5ltread_dataset_ndl3_c (hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hid_t_f *type_id,
- void *buf,
- hsize_t_f *dims)
+ int_f *namelen,
+ _fcd name,
+ hid_t_f *type_id,
+ void *buf,
+ hsize_t_f *dims)
{
- return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
+ return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
}
/*-------------------------------------------------------------------------
- * Function: H5LTmake_dataset_string_c
- *
- * Purpose: Call H5LTmake_dataset
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: September 09, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTmake_dataset_string_c
+*
+* Purpose: Call H5LTmake_dataset
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: September 09, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5ltmake_dataset_string_c (hid_t_f *loc_id,
int_f *namelen,
_fcd name,
+ int_f *buflen,
char *buf)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
-/*
- * Call H5LTmake_dataset_string function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5LTmake_dataset_string(c_loc_id,c_name,buf);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ int c_namelen;
+ char *c_buf = NULL;
+ int c_buflen;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_buflen = *buflen;
+ c_buf = (char *)HD5f2cstring(buf, c_buflen);
+ if (c_buf == NULL)
+ goto done;
+
+ /*
+ * call H5LTmake_dataset_string function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5LTmake_dataset_string(c_loc_id,c_name,c_buf);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+ if(c_buf!=NULL)
+ free(c_buf);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: H5LTread_dataset_string_c
- *
- * Purpose: Call H5LTread_dataset_string
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: September 09, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTread_dataset_string_c
+*
+* Purpose: Call H5LTread_dataset_string
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: September 09, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5ltread_dataset_string_c (hid_t_f *loc_id,
@@ -597,541 +632,654 @@ nh5ltread_dataset_string_c (hid_t_f *loc_id,
_fcd name,
char *buf)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
-/*
- * Call H5LTread_dataset_string function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5LTread_dataset_string(c_loc_id,c_name,buf);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ int c_namelen;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ /*
+ * call H5LTread_dataset_string function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5LTread_dataset_string(c_loc_id,c_name,buf);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: H5LTset_attribute_int_c
- *
- * Purpose: Call H5LTset_attribute_int
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 05, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTset_attribute_int_c
+*
+* Purpose: Call H5LTset_attribute_int
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 05, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5ltset_attribute_int_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- size_t_f *size,
- void *buf)
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ size_t_f *size,
+ void *buf)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- char *c_attrname;
- int c_namelen;
- int c_attrnamelen;
- size_t c_size;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(dsetname, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_attrnamelen = (int)*attrnamelen;
- c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
- if (c_attrname == NULL) return ret_value;
-
-/*
- * Call H5LTset_attribute_int function.
- */
- c_loc_id = (hid_t)*loc_id;
- c_size = (size_t)*size;
-
- if (sizeof(int_f) == sizeof(int))
- ret = H5LTset_attribute_int(c_loc_id,c_name,c_attrname,buf,c_size);
- else if (sizeof(int_f) == sizeof(long))
- ret = H5LTset_attribute_long(c_loc_id,c_name,c_attrname,buf,c_size);
- else if (sizeof(int_f) == sizeof(long_long))
- ret = H5LTset_attribute_long_long(c_loc_id,c_name,c_attrname,buf,c_size);
- else
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ char *c_attrname = NULL;
+ int c_namelen;
+ int c_attrnamelen;
+ size_t c_size;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(dsetname, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_attrnamelen = (int)*attrnamelen;
+ c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
+ if (c_attrname == NULL)
+ goto done;
+
+ /*
+ * call H5LTset_attribute_int function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+ c_size = (size_t)*size;
+
+ if (sizeof(int_f) == sizeof(int))
+ ret = H5LTset_attribute_int(c_loc_id,c_name,c_attrname,buf,c_size);
+ else if (sizeof(int_f) == sizeof(long))
+ ret = H5LTset_attribute_long(c_loc_id,c_name,c_attrname,buf,c_size);
+ else if (sizeof(int_f) == sizeof(long long))
+ ret = H5LTset_attribute_long_long(c_loc_id,c_name,c_attrname,buf,c_size);
+ else
+ goto done;
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+ if(c_attrname!=NULL)
+ free(c_attrname);
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: H5LTset_attribute_float_c
- *
- * Purpose: Call H5LTset_attribute_float
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 05, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTset_attribute_float_c
+*
+* Purpose: Call H5LTset_attribute_float
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 05, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5ltset_attribute_float_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- size_t_f *size,
- void *buf)
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ size_t_f *size,
+ void *buf)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- char *c_attrname;
- int c_namelen;
- int c_attrnamelen;
- size_t c_size;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(dsetname, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_attrnamelen = *attrnamelen;
- c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
- if (c_attrname == NULL) return ret_value;
-
-/*
- * Call H5LTset_attribute_float function.
- */
- c_loc_id = (hid_t)*loc_id;
- c_size = (size_t)*size;
-
- ret = H5LTset_attribute_float(c_loc_id,c_name,c_attrname,buf,c_size);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ char *c_attrname = NULL;
+ int c_namelen;
+ int c_attrnamelen;
+ size_t c_size;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(dsetname, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_attrnamelen = *attrnamelen;
+ c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
+ if (c_attrname == NULL)
+ goto done;
+
+ /*
+ * Call H5LTset_attribute_float function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+ c_size = (size_t)*size;
+
+ ret = H5LTset_attribute_float(c_loc_id,c_name,c_attrname,buf,c_size);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+ if(c_attrname!=NULL)
+ free(c_attrname);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: H5LTset_attribute_double_c
- *
- * Purpose: Call H5LTset_attribute_double
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 05, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTset_attribute_double_c
+*
+* Purpose: Call H5LTset_attribute_double
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 05, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5ltset_attribute_double_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- size_t_f *size,
- void *buf)
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ size_t_f *size,
+ void *buf)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- char *c_attrname;
- int c_namelen;
- int c_attrnamelen;
- size_t c_size;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(dsetname, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_attrnamelen = *attrnamelen;
- c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
- if (c_attrname == NULL) return ret_value;
-
-/*
- * Call H5LTset_attribute_double function.
- */
- c_loc_id = (hid_t)*loc_id;
- c_size = (size_t)*size;
-
- ret = H5LTset_attribute_double(c_loc_id,c_name,c_attrname,buf,c_size);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ char *c_attrname = NULL;
+ int c_namelen;
+ int c_attrnamelen;
+ size_t c_size;
+
+ /*
+ * Convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(dsetname, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_attrnamelen = *attrnamelen;
+ c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
+ if (c_attrname == NULL)
+ goto done;
+
+ /*
+ * Call H5LTset_attribute_double function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+ c_size = (size_t)*size;
+
+ ret = H5LTset_attribute_double(c_loc_id,c_name,c_attrname,buf,c_size);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+ if(c_attrname!=NULL)
+ free(c_attrname);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: H5LTset_attribute_string_c
- *
- * Purpose: Call H5LTset_attribute_string
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 05, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTset_attribute_string_c
+*
+* Purpose: Call H5LTset_attribute_string
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 05, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5ltset_attribute_string_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- void *buf)
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ int_f *buflen,
+ void *buf)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- char *c_attrname;
- int c_namelen;
- int c_attrnamelen;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(dsetname, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_attrnamelen = *attrnamelen;
- c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
- if (c_attrname == NULL) return ret_value;
-
-/*
- * Call H5LTset_attribute_string function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5LTset_attribute_string(c_loc_id,c_name,c_attrname,buf);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ char *c_attrname = NULL;
+ int c_namelen;
+ int c_attrnamelen;
+ char *c_buf = NULL;
+ int c_buflen;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(dsetname, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_attrnamelen = *attrnamelen;
+ c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
+ if (c_attrname == NULL)
+ goto done;
+
+ c_buflen = *buflen;
+ c_buf = (char *)HD5f2cstring(buf, c_buflen);
+ if (c_buf == NULL)
+ goto done;
+
+
+ /*
+ * call H5LTset_attribute_string function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5LTset_attribute_string(c_loc_id,c_name,c_attrname,c_buf);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+ if(c_attrname!=NULL)
+ free(c_attrname);
+ if(c_buf!=NULL)
+ free(c_buf);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_int_c
- *
- * Purpose: Call H5LTget_attribute_int
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 05, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_int_c
+*
+* Purpose: Call H5LTget_attribute_int
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 05, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5ltget_attribute_int_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- void *buf)
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ void *buf)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
- char *c_attrname;
- int c_attrnamelen;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = (int)*namelen;
- c_name = (char *)HD5f2cstring(dsetname, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_attrnamelen = (int)*attrnamelen;
- c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
- if (c_attrname == NULL) return ret_value;
-
-/*
- * Call H5LTget_attribute_int function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- if(sizeof(int_f) == sizeof(int))
- ret = H5LTget_attribute_int(c_loc_id,c_name,c_attrname,buf);
- else if (sizeof(int_f) == sizeof(long))
- ret = H5LTget_attribute_long(c_loc_id,c_name,c_attrname,buf);
- else if (sizeof(int_f) == sizeof(long_long))
- ret = H5LTget_attribute_long_long(c_loc_id,c_name,c_attrname,buf);
- else
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ char *c_attrname = NULL;
+ int c_namelen;
+ int c_attrnamelen;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = (int)*namelen;
+ c_name = (char *)HD5f2cstring(dsetname, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_attrnamelen = (int)*attrnamelen;
+ c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
+ if (c_attrname == NULL)
+ goto done;
+
+ /*
+ * call H5LTget_attribute_int function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ if(sizeof(int_f) == sizeof(int))
+ ret = H5LTget_attribute_int(c_loc_id,c_name,c_attrname,buf);
+ else if (sizeof(int_f) == sizeof(long))
+ ret = H5LTget_attribute_long(c_loc_id,c_name,c_attrname,buf);
+ else if (sizeof(int_f) == sizeof(long long))
+ ret = H5LTget_attribute_long_long(c_loc_id,c_name,c_attrname,buf);
+ else
+ goto done;
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+ if(c_attrname!=NULL)
+ free(c_attrname);
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_float_c
- *
- * Purpose: Call H5LTget_attribute_float
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 05, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_float_c
+*
+* Purpose: Call H5LTget_attribute_float
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 05, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5ltget_attribute_float_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- void *buf)
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ void *buf)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
- char *c_attrname;
- int c_attrnamelen;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = (int)*namelen;
- c_name = (char *)HD5f2cstring(dsetname, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_attrnamelen = (int)*attrnamelen;
- c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
- if (c_attrname == NULL) return ret_value;
-
-/*
- * Call H5LTget_attribute_int function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5LTget_attribute_float(c_loc_id,c_name,c_attrname,buf);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ char *c_attrname = NULL;
+ int c_namelen;
+ int c_attrnamelen;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = (int)*namelen;
+ c_name = (char *)HD5f2cstring(dsetname, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_attrnamelen = (int)*attrnamelen;
+ c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
+ if (c_attrname == NULL)
+ goto done;
+
+ /*
+ * call H5LTget_attribute_int function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5LTget_attribute_float(c_loc_id,c_name,c_attrname,buf);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+ if(c_attrname!=NULL)
+ free(c_attrname);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_double_c
- *
- * Purpose: Call H5LTget_attribute_double
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 05, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_double_c
+*
+* Purpose: Call H5LTget_attribute_double
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 05, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5ltget_attribute_double_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- void *buf)
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ void *buf)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
- char *c_attrname;
- int c_attrnamelen;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = (int)*namelen;
- c_name = (char *)HD5f2cstring(dsetname, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_attrnamelen = (int)*attrnamelen;
- c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
- if (c_attrname == NULL) return ret_value;
-
-/*
- * Call H5LTget_attribute_int function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5LTget_attribute_double(c_loc_id,c_name,c_attrname,buf);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ char *c_attrname = NULL;
+ int c_namelen;
+ int c_attrnamelen;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = (int)*namelen;
+ c_name = (char *)HD5f2cstring(dsetname, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_attrnamelen = (int)*attrnamelen;
+ c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
+ if (c_attrname == NULL)
+ goto done;
+
+ /*
+ * call H5LTget_attribute_int function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5LTget_attribute_double(c_loc_id,c_name,c_attrname,buf);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+ if(c_attrname!=NULL)
+ free(c_attrname);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_string_c
- *
- * Purpose: Call H5LTget_attribute_string
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 05, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_string_c
+*
+* Purpose: Call H5LTget_attribute_string
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 05, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5ltget_attribute_string_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- void *buf)
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ void *buf)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
- char *c_attrname;
- int c_attrnamelen;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = (int)*namelen;
- c_name = (char *)HD5f2cstring(dsetname, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_attrnamelen = (int)*attrnamelen;
- c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
- if (c_attrname == NULL) return ret_value;
-
-/*
- * Call H5LTget_attribute_int function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5LTget_attribute_string(c_loc_id,c_name,c_attrname,buf);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ char *c_attrname = NULL;
+ int c_namelen;
+ int c_attrnamelen;
+
+ /*
+ * Convert FORTRAN name to C name
+ */
+ c_namelen = (int)*namelen;
+ c_name = (char *)HD5f2cstring(dsetname, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_attrnamelen = (int)*attrnamelen;
+ c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
+ if (c_attrname == NULL)
+ goto done;
+
+ /*
+ * Call H5LTget_attribute_int function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5LTget_attribute_string(c_loc_id,c_name,c_attrname,buf);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+ if(c_attrname!=NULL)
+ free(c_attrname);
+
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: H5LTget_dataset_ndims_c
- *
- * Purpose: Call H5LTget_dataset_ndims
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: September 09, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_dataset_ndims_c
+*
+* Purpose: Call H5LTget_dataset_ndims
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: September 09, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5ltget_dataset_ndims_c(hid_t_f *loc_id,
@@ -1139,96 +1287,111 @@ nh5ltget_dataset_ndims_c(hid_t_f *loc_id,
_fcd name,
int_f *rank)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
- int c_rank;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = (int)*namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
-/*
- * Call H5LTget_dataset_ndims function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5LTget_dataset_ndims(c_loc_id, c_name, &c_rank);
-
- if (ret < 0) return ret_value;
- *rank = (int_f)c_rank;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ int c_namelen;
+ int c_rank;
+
+ /*
+ * Convert FORTRAN name to C name
+ */
+ c_namelen = (int)*namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ /*
+ * Call H5LTget_dataset_ndims function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5LTget_dataset_ndims(c_loc_id, c_name, &c_rank);
+
+ if (ret < 0)
+ goto done;
+
+ *rank = (int_f)c_rank;
+ ret_value = 0;
+
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: h5ltfind_dataset_c
- *
- * Purpose: Call H5LTfind_dataset
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: September 09, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5ltfind_dataset_c
+*
+* Purpose: Call H5LTfind_dataset
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: September 09, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5ltfind_dataset_c(hid_t_f *loc_id,
int_f *namelen,
_fcd name)
{
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ int c_namelen;
+ herr_t ret;
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = (int)*namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return -1;
+ /*
+ * Convert FORTRAN name to C name
+ */
+ c_namelen = (int)*namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL) return -1;
-/*
- * Call H5LTget_dataset_ndims function.
- */
- c_loc_id = (hid_t)*loc_id;
+ /*
+ * Call H5LTget_dataset_ndims function.
+ */
+ c_loc_id = (hid_t)*loc_id;
- return( H5LTfind_dataset(c_loc_id, c_name));
+ ret = H5LTfind_dataset(c_loc_id, c_name);
+
+ if(c_name!=NULL)
+ free(c_name);
+
+ return ret;
}
/*-------------------------------------------------------------------------
- * Function: h5ltget_dataset_info_c
- *
- * Purpose: Call H5LTget_dataset_info
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: September 09, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5ltget_dataset_info_c
+*
+* Purpose: Call H5LTget_dataset_info
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: September 09, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5ltget_dataset_info_c(hid_t_f *loc_id,
@@ -1238,170 +1401,222 @@ nh5ltget_dataset_info_c(hid_t_f *loc_id,
int_f *type_class,
size_t_f *type_size)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- int c_namelen;
- H5T_class_t c_classtype;
- size_t c_type_size;
- hsize_t c_dims[32];
- int i;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = (int)*namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
-/*
- * Call H5LTget_dataset_ndims function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5LTget_dataset_info(c_loc_id, c_name, c_dims, &c_classtype, &c_type_size);
-
- *type_class = c_classtype;
- *type_size = (size_t_f)c_type_size;
- for (i = 0; i < 32 ; i++) {
- dims[i] = (hsize_t_f) c_dims[i];
- }
-
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ int c_namelen;
+ H5T_class_t c_classtype;
+ size_t c_type_size;
+ hsize_t c_dims[32];
+ int i;
+ int c_rank;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = (int)*namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ /*
+ * call H5LTget_dataset_ndims function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5LTget_dataset_info(c_loc_id, c_name, c_dims, &c_classtype, &c_type_size);
+ if (ret < 0)
+ goto done;
+
+ *type_class = c_classtype;
+ *type_size = (size_t_f)c_type_size;
+
+ /*
+ * transpose dimension arrays because of C-FORTRAN storage order
+ */
+
+ ret = H5LTget_dataset_ndims(c_loc_id, c_name, &c_rank);
+ if (ret < 0)
+ goto done;
+
+ for (i = 0; i < c_rank ; i++)
+ {
+ dims[i] = (hsize_t_f) c_dims[c_rank - i - 1];
+ }
+
+
+ ret_value = 0;
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: h5ltget_attribute_ndims_c
- *
- * Purpose: Call H5LTget_attribute_ndims
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 05, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5ltget_attribute_ndims_c
+*
+* Purpose: Call H5LTget_attribute_ndims
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 05, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5ltget_attribute_ndims_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd dsetname,
- int_f *attrnamelen,
- _fcd attrname,
- int_f *rank)
+ int_f *namelen,
+ _fcd dsetname,
+ int_f *attrnamelen,
+ _fcd attrname,
+ int_f *rank)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- char *c_attrname;
- int c_namelen;
- int c_attrnamelen;
- int c_rank;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen =(int) *namelen;
- c_name = (char *)HD5f2cstring(dsetname, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_attrnamelen = (int)*attrnamelen;
- c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
- if (c_attrname == NULL) return ret_value;
-
-/*
- * Call H5LTset_attribute_ndims function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5LTget_attribute_ndims(c_loc_id,c_name,c_attrname,&c_rank);
-
- if (ret < 0) return ret_value;
- *rank = (int_f)c_rank;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ char *c_attrname = NULL;
+ int c_namelen;
+ int c_attrnamelen;
+ int c_rank;
+
+ /*
+ * Convert FORTRAN name to C name
+ */
+ c_namelen =(int) *namelen;
+ c_name = (char *)HD5f2cstring(dsetname, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_attrnamelen = (int)*attrnamelen;
+ c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
+ if (c_attrname == NULL)
+ goto done;
+
+ /*
+ * Call H5LTset_attribute_ndims function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5LTget_attribute_ndims(c_loc_id,c_name,c_attrname,&c_rank);
+
+ if (ret < 0)
+ goto done;
+
+ *rank = (int_f)c_rank;
+ ret_value = 0;
+
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+ if(c_attrname!=NULL)
+ free(c_attrname);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: h5ltget_attribute_info_c
- *
- * Purpose: Call H5LTget_attribute_info
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: September 09, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5ltget_attribute_info_c
+*
+* Purpose: Call H5LTget_attribute_info
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: September 09, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5ltget_attribute_info_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *attrnamelen,
- _fcd attrname,
- hsize_t_f *dims,
- int_f *type_class,
- size_t_f *type_size)
+ int_f *namelen,
+ _fcd name,
+ int_f *attrnamelen,
+ _fcd attrname,
+ hsize_t_f *dims,
+ int_f *type_class,
+ size_t_f *type_size)
{
- int ret_value = -1;
- herr_t ret;
- hid_t c_loc_id;
- char *c_name;
- char *c_attrname;
- int c_namelen;
- int c_attrnamelen;
- H5T_class_t c_classtype;
- size_t c_type_size;
- hsize_t c_dims[32];
- int i;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = (int)*namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_attrnamelen = (int)*attrnamelen;
- c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
- if (c_attrname == NULL) return ret_value;
-
-/*
- * Call H5LTget_dataset_ndims function.
- */
- c_loc_id = (hid_t)*loc_id;
-
- ret = H5LTget_attribute_info(c_loc_id,c_name,c_attrname,c_dims,&c_classtype,&c_type_size);
-
- *type_class = c_classtype;
- *type_size = (size_t_f)c_type_size;
- for (i = 0; i < 32 ; i++) {
- dims[i] = (hsize_t_f) c_dims[i];
- }
-
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ hid_t c_loc_id;
+ char *c_name = NULL;
+ char *c_attrname = NULL;
+ int c_namelen;
+ int c_attrnamelen;
+ H5T_class_t c_classtype;
+ size_t c_type_size;
+ hsize_t c_dims[32];
+ int i;
+ int c_rank;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = (int)*namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_attrnamelen = (int)*attrnamelen;
+ c_attrname = (char *)HD5f2cstring(attrname, c_attrnamelen);
+ if (c_attrname == NULL)
+ goto done;
+
+ /*
+ * call H5LTget_attribute_info function.
+ */
+ c_loc_id = (hid_t)*loc_id;
+
+ ret = H5LTget_attribute_info(c_loc_id,c_name,c_attrname,c_dims,&c_classtype,&c_type_size);
+ if (ret < 0)
+ goto done;
+
+ *type_class = c_classtype;
+ *type_size = (size_t_f)c_type_size;
+
+ /*
+ * transpose dimension arrays because of C-FORTRAN storage order
+ */
+
+ ret = H5LTget_attribute_ndims(c_loc_id,c_name,c_attrname,&c_rank);
+ if (ret < 0)
+ goto done;
+
+ for (i = 0; i < c_rank ; i++)
+ {
+ dims[i] = (hsize_t_f) c_dims[c_rank - i - 1];
+ }
+
+ ret_value = 0;
+
+
+done:
+ if(c_name!=NULL)
+ free(c_name);
+ if(c_attrname!=NULL)
+ free(c_attrname);
+
+
+ return ret_value;
}
diff --git a/hl/fortran/src/H5LTff.f90 b/hl/fortran/src/H5LTff.f90
index 45d9a23..b622206 100755
--- a/hl/fortran/src/H5LTff.f90
+++ b/hl/fortran/src/H5LTff.f90
@@ -132,9 +132,9 @@ subroutine h5ltmake_dataset_f_int1(loc_id,&
interface
integer function h5ltmake_dataset_int1_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_INT1_C'::h5ltmake_dataset_int1_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_INT1_C'::h5ltmake_dataset_int1_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -198,9 +198,9 @@ subroutine h5ltmake_dataset_f_int2(loc_id,&
interface
integer function h5ltmake_dataset_int2_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_INT2_C'::h5ltmake_dataset_int2_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_INT2_C'::h5ltmake_dataset_int2_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -265,9 +265,9 @@ subroutine h5ltmake_dataset_f_int3(loc_id,&
interface
integer function h5ltmake_dataset_int3_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_INT3_C'::h5ltmake_dataset_int3_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_INT3_C'::h5ltmake_dataset_int3_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -332,9 +332,9 @@ subroutine h5ltmake_dataset_f_float1(loc_id,&
interface
integer function h5ltmake_dataset_fl1_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_FL1_C'::h5ltmake_dataset_fl1_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_FL1_C'::h5ltmake_dataset_fl1_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -398,9 +398,9 @@ subroutine h5ltmake_dataset_f_float2(loc_id,&
interface
integer function h5ltmake_dataset_fl2_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_FL2_C'::h5ltmake_dataset_fl2_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_FL2_C'::h5ltmake_dataset_fl2_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -465,9 +465,9 @@ subroutine h5ltmake_dataset_f_float3(loc_id,&
interface
integer function h5ltmake_dataset_fl3_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_FL3_C'::h5ltmake_dataset_fl3_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_FL3_C'::h5ltmake_dataset_fl3_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -531,9 +531,9 @@ subroutine h5ltmake_dataset_f_double1(loc_id,&
interface
integer function h5ltmake_dataset_dl1_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_DL1_C'::h5ltmake_dataset_dl1_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_DL1_C'::h5ltmake_dataset_dl1_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -597,9 +597,9 @@ subroutine h5ltmake_dataset_f_double2(loc_id,&
interface
integer function h5ltmake_dataset_dl2_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_DL2_C'::h5ltmake_dataset_dl2_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_DL2_C'::h5ltmake_dataset_dl2_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -664,9 +664,9 @@ subroutine h5ltmake_dataset_f_double3(loc_id,&
interface
integer function h5ltmake_dataset_dl3_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_DL3_C'::h5ltmake_dataset_dl3_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_DL3_C'::h5ltmake_dataset_dl3_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -730,9 +730,9 @@ subroutine h5ltread_dataset_f_int1(loc_id,&
interface
integer function h5ltread_dataset_int1_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_INT1_C'::h5ltread_dataset_int1_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_INT1_C'::h5ltread_dataset_int1_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(HID_T), intent(IN) :: loc_id ! file or group identifier
integer(HID_T), intent(IN) :: type_id ! datatype identifier
@@ -793,9 +793,9 @@ subroutine h5ltread_dataset_f_int2(loc_id,&
interface
integer function h5ltread_dataset_int2_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_INT2_C'::h5ltread_dataset_int2_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_INT2_C'::h5ltread_dataset_int2_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -857,9 +857,9 @@ subroutine h5ltread_dataset_f_int3(loc_id,&
interface
integer function h5ltread_dataset_int3_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_INT3_C'::h5ltread_dataset_int3_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_INT3_C'::h5ltread_dataset_int3_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -923,9 +923,9 @@ subroutine h5ltread_dataset_f_float1(loc_id,&
interface
integer function h5ltread_dataset_fl1_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_FL1_C'::h5ltread_dataset_fl1_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_FL1_C'::h5ltread_dataset_fl1_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -987,9 +987,9 @@ subroutine h5ltread_dataset_f_float2(loc_id,&
interface
integer function h5ltread_dataset_fl2_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_FL2_C'::h5ltread_dataset_fl2_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_FL2_C'::h5ltread_dataset_fl2_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -1051,9 +1051,9 @@ subroutine h5ltread_dataset_f_float3(loc_id,&
interface
integer function h5ltread_dataset_fl3_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_FL3_C'::h5ltread_dataset_fl3_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_FL3_C'::h5ltread_dataset_fl3_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -1115,9 +1115,9 @@ subroutine h5ltread_dataset_f_double1(loc_id,&
interface
integer function h5ltread_dataset_dl1_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_DL1_C'::h5ltread_dataset_dl1_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_DL1_C'::h5ltread_dataset_dl1_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -1178,9 +1178,9 @@ subroutine h5ltread_dataset_f_double2(loc_id,&
interface
integer function h5ltread_dataset_dl2_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_DL2_C'::h5ltread_dataset_dl2_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_DL2_C'::h5ltread_dataset_dl2_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -1242,9 +1242,9 @@ subroutine h5ltread_dataset_f_double3(loc_id,&
interface
integer function h5ltread_dataset_dl3_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_DL3_C'::h5ltread_dataset_dl3_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_DL3_C'::h5ltread_dataset_dl3_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -1306,9 +1306,9 @@ subroutine h5ltmake_dataset_int_f_1 (loc_id,&
interface
integer function h5ltmake_dataset_nint1_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NINT1_C'::h5ltmake_dataset_nint1_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NINT1_C'::h5ltmake_dataset_nint1_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -1371,9 +1371,9 @@ subroutine h5ltmake_dataset_int_f_2 (loc_id,&
interface
integer function h5ltmake_dataset_nint2_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NINT2_C'::h5ltmake_dataset_nint2_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NINT2_C'::h5ltmake_dataset_nint2_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -1438,9 +1438,9 @@ subroutine h5ltmake_dataset_int_f_3 (loc_id,&
interface
integer function h5ltmake_dataset_nint3_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NINT3_C'::h5ltmake_dataset_nint3_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NINT3_C'::h5ltmake_dataset_nint3_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -1504,9 +1504,9 @@ subroutine h5ltmake_dataset_float_f_1 (loc_id,&
interface
integer function h5ltmake_dataset_nfl1_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NFL1_C'::h5ltmake_dataset_nfl1_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NFL1_C'::h5ltmake_dataset_nfl1_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -1568,9 +1568,9 @@ subroutine h5ltmake_dataset_float_f_2 (loc_id,&
interface
integer function h5ltmake_dataset_nfl2_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NFL2_C'::h5ltmake_dataset_nfl2_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NFL2_C'::h5ltmake_dataset_nfl2_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -1633,9 +1633,9 @@ subroutine h5ltmake_dataset_float_f_3 (loc_id,&
interface
integer function h5ltmake_dataset_nfl3_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NFL3_C'::h5ltmake_dataset_nfl3_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NFL3_C'::h5ltmake_dataset_nfl3_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -1701,9 +1701,9 @@ subroutine h5ltmake_dataset_double_f_1 (loc_id,&
interface
integer function h5ltmake_dataset_ndl1_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NDL1_C'::h5ltmake_dataset_ndl1_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NDL1_C'::h5ltmake_dataset_ndl1_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -1767,9 +1767,9 @@ subroutine h5ltmake_dataset_double_f_2 (loc_id,&
interface
integer function h5ltmake_dataset_ndl2_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NDL2_C'::h5ltmake_dataset_ndl2_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NDL2_C'::h5ltmake_dataset_ndl2_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -1832,9 +1832,9 @@ subroutine h5ltmake_dataset_double_f_3 (loc_id,&
interface
integer function h5ltmake_dataset_ndl3_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NDL3_C'::h5ltmake_dataset_ndl3_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NDL3_C'::h5ltmake_dataset_ndl3_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -1897,9 +1897,9 @@ subroutine h5ltread_dataset_int_f_1(loc_id,&
interface
integer function h5ltread_dataset_nint1_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NINT1_C'::h5ltread_dataset_nint1_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NINT1_C'::h5ltread_dataset_nint1_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -1960,9 +1960,9 @@ subroutine h5ltread_dataset_int_f_2(loc_id,&
interface
integer function h5ltread_dataset_nint2_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NINT2_C'::h5ltread_dataset_nint2_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NINT2_C'::h5ltread_dataset_nint2_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -2022,9 +2022,9 @@ subroutine h5ltread_dataset_int_f_3(loc_id,&
interface
integer function h5ltread_dataset_nint3_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NINT3_C'::h5ltread_dataset_nint3_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NINT3_C'::h5ltread_dataset_nint3_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -2085,9 +2085,9 @@ subroutine h5ltread_dataset_float_f_1(loc_id,&
interface
integer function h5ltread_dataset_nfl1_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NFL1_C'::h5ltread_dataset_nfl1_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NFL1_C'::h5ltread_dataset_nfl1_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -2148,9 +2148,9 @@ subroutine h5ltread_dataset_float_f_2(loc_id,&
interface
integer function h5ltread_dataset_nfl2_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NFL2_C'::h5ltread_dataset_nfl2_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NFL2_C'::h5ltread_dataset_nfl2_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -2210,9 +2210,9 @@ subroutine h5ltread_dataset_float_f_3(loc_id,&
interface
integer function h5ltread_dataset_nfl3_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NFL3_C'::h5ltread_dataset_nfl3_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NFL3_C'::h5ltread_dataset_nfl3_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -2272,9 +2272,9 @@ subroutine h5ltread_dataset_double_f_1(loc_id,&
interface
integer function h5ltread_dataset_ndl1_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NDL1_C'::h5ltread_dataset_ndl1_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NDL1_C'::h5ltread_dataset_ndl1_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -2335,9 +2335,9 @@ subroutine h5ltread_dataset_double_f_2(loc_id,&
interface
integer function h5ltread_dataset_ndl2_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NDL2_C'::h5ltread_dataset_ndl2_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NDL2_C'::h5ltread_dataset_ndl2_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -2397,9 +2397,9 @@ subroutine h5ltread_dataset_double_f_3(loc_id,&
interface
integer function h5ltread_dataset_ndl3_c(loc_id,namelen,dset_name,type_id,buf,dims)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NDL3_C'::h5ltread_dataset_ndl3_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NDL3_C'::h5ltread_dataset_ndl3_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer(hid_t), intent(in) :: type_id ! datatype identifier
@@ -2453,23 +2453,26 @@ subroutine h5ltmake_dataset_string_f(loc_id,&
character(len=*), intent(in) :: buf ! data buffer
integer :: errcode ! error code
integer :: namelen ! name length
+ integer :: buflen ! buffer length
interface
- integer function h5ltmake_dataset_string_c(loc_id,namelen,dset_name,buf)
+ integer function h5ltmake_dataset_string_c(loc_id,namelen,dset_name,buflen,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_STRING_C'::h5ltmake_dataset_string_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_STRING_C'::h5ltmake_dataset_string_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer :: namelen ! lenght of name buffer
+ integer :: buflen ! lenght of data buffer
character(len=*), intent(in) :: dset_name ! name of the dataset
character(len=*), intent(in) :: buf ! data buffer
end function h5ltmake_dataset_string_c
end interface
namelen = len(dset_name)
- errcode = h5ltmake_dataset_string_c(loc_id,namelen,dset_name,buf)
+ buflen = len(buf)
+ errcode = h5ltmake_dataset_string_c(loc_id,namelen,dset_name,buflen,buf)
end subroutine h5ltmake_dataset_string_f
@@ -2513,9 +2516,9 @@ subroutine h5ltread_dataset_string_f(loc_id,&
interface
integer function h5ltread_dataset_string_c(loc_id,namelen,dset_name,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_STRING_C'::h5ltread_dataset_string_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_STRING_C'::h5ltread_dataset_string_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer :: namelen ! lenght of name buffer
@@ -2582,9 +2585,9 @@ subroutine h5ltset_attribute_int_f(loc_id,&
interface
integer function h5ltset_attribute_int_c(loc_id,namelen,dset_name,attrlen,attr_name,size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTSET_ATTRIBUTE_INT_C'::h5ltset_attribute_int_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTSET_ATTRIBUTE_INT_C'::h5ltset_attribute_int_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: attr_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -2648,9 +2651,9 @@ subroutine h5ltset_attribute_float_f(loc_id,&
interface
integer function h5ltset_attribute_float_c(loc_id,namelen,dset_name,attrlen,attr_name,size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTSET_ATTRIBUTE_FLOAT_C'::h5ltset_attribute_float_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTSET_ATTRIBUTE_FLOAT_C'::h5ltset_attribute_float_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: attr_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -2714,9 +2717,9 @@ subroutine h5ltset_attribute_double_f(loc_id,&
interface
integer function h5ltset_attribute_double_c(loc_id,namelen,dset_name,attrlen,attr_name,size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTSET_ATTRIBUTE_DOUBLE_C'::h5ltset_attribute_double_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTSET_ATTRIBUTE_DOUBLE_C'::h5ltset_attribute_double_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: attr_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -2775,18 +2778,20 @@ subroutine h5ltset_attribute_string_f(loc_id,&
character(len=*), intent(in) :: buf ! data buffer
integer :: namelen ! name length
integer :: attrlen ! name length
+ integer :: buflen ! data buffer length
interface
- integer function h5ltset_attribute_string_c(loc_id,namelen,dset_name,attrlen,attr_name,buf)
+ integer function h5ltset_attribute_string_c(loc_id,namelen,dset_name,attrlen,attr_name,buflen,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTSET_ATTRIBUTE_STRING_C'::h5ltset_attribute_string_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTSET_ATTRIBUTE_STRING_C'::h5ltset_attribute_string_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: attr_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer :: namelen ! lenght of name buffer
integer :: attrlen ! lenght of attr name buffer
+ integer :: buflen ! data buffer length
character(len=*), intent(in) :: dset_name ! name of the dataset
character(len=*), intent(in) :: attr_name ! name of the attribute
character(len=*), intent(in) :: buf ! data buffer
@@ -2795,7 +2800,8 @@ subroutine h5ltset_attribute_string_f(loc_id,&
namelen = len(dset_name)
attrlen = len(attr_name)
- errcode = h5ltset_attribute_string_c(loc_id,namelen,dset_name,attrlen,attr_name,buf)
+ buflen = len(buf)
+ errcode = h5ltset_attribute_string_c(loc_id,namelen,dset_name,attrlen,attr_name,buflen,buf)
end subroutine h5ltset_attribute_string_f
@@ -2844,9 +2850,9 @@ subroutine h5ltget_attribute_int_f(loc_id,&
interface
integer function h5ltget_attribute_int_c(loc_id,namelen,dset_name,attrlen,attr_name,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_INT_C'::h5ltget_attribute_int_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_INT_C'::h5ltget_attribute_int_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: attr_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -2908,9 +2914,9 @@ subroutine h5ltget_attribute_float_f(loc_id,&
interface
integer function h5ltget_attribute_float_c(loc_id,namelen,dset_name,attrlen,attr_name,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_FLOAT_C'::h5ltget_attribute_float_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_FLOAT_C'::h5ltget_attribute_float_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: attr_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -2971,9 +2977,9 @@ subroutine h5ltget_attribute_double_f(loc_id,&
interface
integer function h5ltget_attribute_double_c(loc_id,namelen,dset_name,attrlen,attr_name,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_DOUBLE_C'::h5ltget_attribute_double_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_DOUBLE_C'::h5ltget_attribute_double_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: attr_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -3034,9 +3040,9 @@ subroutine h5ltget_attribute_string_f(loc_id,&
interface
integer function h5ltget_attribute_string_c(loc_id,namelen,dset_name,attrlen,attr_name,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_STRING_C'::h5ltget_attribute_string_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_STRING_C'::h5ltget_attribute_string_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: attr_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -3098,9 +3104,9 @@ subroutine h5ltget_dataset_ndims_f(loc_id,&
interface
integer function h5ltget_dataset_ndims_c(loc_id,namelen,dset_name,rank)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTGET_DATASET_NDIMS_C'::h5ltget_dataset_ndims_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTGET_DATASET_NDIMS_C'::h5ltget_dataset_ndims_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer :: namelen ! lenght of name buffer
@@ -3153,9 +3159,9 @@ integer function h5ltfind_dataset_f(loc_id,&
interface
integer function h5ltfind_dataset_c(loc_id,namelen,dset_name)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTFIND_DATASET_C'::h5ltfind_dataset_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTFIND_DATASET_C'::h5ltfind_dataset_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer :: namelen ! lenght of name buffer
@@ -3213,9 +3219,9 @@ subroutine h5ltget_dataset_info_f(loc_id,&
interface
integer function h5ltget_dataset_info_c(loc_id,namelen,dset_name,dims,type_class,type_size)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTGET_DATASET_INFO_C'::h5ltget_dataset_info_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTGET_DATASET_INFO_C'::h5ltget_dataset_info_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
integer :: namelen ! lenght of name buffer
@@ -3280,9 +3286,9 @@ subroutine h5ltget_attribute_ndims_f(loc_id,&
interface
integer function h5ltget_attribute_ndims_c(loc_id,namelen,dset_name,attrlen,attr_name,rank)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_NDIMS_C'::h5ltget_attribute_ndims_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_NDIMS_C'::h5ltget_attribute_ndims_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: attr_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -3348,9 +3354,9 @@ subroutine h5ltget_attribute_info_f(loc_id,&
interface
integer function h5ltget_attribute_info_c(loc_id,namelen,dset_name,attrlen,attr_name,dims,type_class,type_size)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_INFO_C'::h5ltget_attribute_info_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_INFO_C'::h5ltget_attribute_info_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: attr_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
diff --git a/hl/fortran/src/H5TBfc.c b/hl/fortran/src/H5TBfc.c
index cea094a..38af99c 100755
--- a/hl/fortran/src/H5TBfc.c
+++ b/hl/fortran/src/H5TBfc.c
@@ -1,17 +1,17 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
- * terms governing use, modification, and redistribution, is contained in *
- * the files COPYING and Copyright.html. COPYING can be found at the root *
- * of the source code distribution tree; Copyright.html can be found at the *
- * root level of an installed copy of the electronic HDF5 document set and *
- * is linked from the top-level documents page. It can also be found at *
- * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+* Copyright by The HDF Group. *
+* Copyright by the Board of Trustees of the University of Illinois. *
+* All rights reserved. *
+* *
+* This file is part of HDF5. The full HDF5 copyright notice, including *
+* terms governing use, modification, and redistribution, is contained in *
+* the files COPYING and Copyright.html. COPYING can be found at the root *
+* of the source code distribution tree; Copyright.html can be found at the *
+* root level of an installed copy of the electronic HDF5 document set and *
+* is linked from the top-level documents page. It can also be found at *
+* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
+* access to either file, you may request a copy from help@hdfgroup.org. *
+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* This files contains C stubs for H5D Fortran APIs */
@@ -19,23 +19,23 @@
#include "H5LTf90proto.h"
/*-------------------------------------------------------------------------
- * Function: h5tbmake_table_c
- *
- * Purpose: Call H5TBmake_table
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 06, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5tbmake_table_c
+*
+* Purpose: Call H5TBmake_table
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 06, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5tbmake_table_c(int_f *namelen1,
_fcd name1,
@@ -52,472 +52,550 @@ nh5tbmake_table_c(int_f *namelen1,
int_f *namelen2, /* field_names lenghts */
_fcd field_names) /* field_names */
{
- int ret_value = -1;
- herr_t ret;
- char *c_name;
- int c_namelen;
- char *c_name1;
- int c_namelen1;
- hsize_t num_elem;
- hsize_t i;
- int max_len=1;
- hid_t c_loc_id = *loc_id;
- hsize_t c_nfields = *nfields;
- hsize_t c_nrecords = *nrecords;
- hsize_t c_chunk_size = *chunk_size;
- size_t c_type_size = *type_size;
- size_t *c_field_offset;
- hid_t *c_field_types;
- char **c_field_names;
- char *tmp, *tmp_p;
-
- num_elem = *nfields;
-
- for (i=0; i < num_elem; i++) {
- if (namelen2[i] > max_len) max_len = namelen2[i];
- }
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_namelen1 = *namelen1;
- c_name1 = (char *)HD5f2cstring(name1, c_namelen1);
- if (c_name1 == NULL) return ret_value;
-
- c_field_offset = (size_t*)malloc(sizeof(size_t) * (size_t)c_nfields);
- if (!c_field_offset) return ret_value;
-
- c_field_types = (hid_t*)malloc(sizeof(hid_t) * (size_t)c_nfields);
- if (!c_field_types) return ret_value;
-
- for (i=0; i < num_elem; i++) {
- c_field_offset[i] = field_offset[i];
- c_field_types[i] = field_types[i];
- }
-
-/*
- * Allocate array of character pointers
- */
- c_field_names = (char **)malloc((size_t)num_elem * sizeof(char *));
- if (c_field_names == NULL) return ret_value;
-
- /* Copy data to long C string */
- tmp = (char *)HD5f2cstring(field_names, (int)(max_len*num_elem));
- if (tmp == NULL) {
- free(c_field_names);
- return ret_value;
- }
-
-/*
- * Move data from temorary buffer
- */
- tmp_p = tmp;
- for (i=0; i < num_elem; i++) {
- c_field_names[i] = (char *) malloc((size_t)namelen2[i]+1);
- memcpy(c_field_names[i], tmp_p, (size_t)namelen2[i]);
- c_field_names[i][namelen2[i]] = '\0';
- tmp_p = tmp_p + max_len;
- }
-
-/*
- * Call H5TBmake_table function.
- */
-
- ret = H5TBmake_table(c_name1,c_loc_id,c_name,c_nfields,c_nrecords,c_type_size,
- c_field_names,c_field_offset,c_field_types,c_chunk_size,NULL,*compress,NULL);
-
- for (i=0; i < num_elem; i++) {
- free (c_field_names[i]);
- }
- free(c_field_names);
- free(tmp);
- free(c_field_offset);
- free(c_field_types);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ char *c_name = NULL;
+ int c_namelen;
+ char *c_name1 = NULL;
+ int c_namelen1;
+ hsize_t num_elem;
+ hsize_t i;
+ int max_len=1;
+ hid_t c_loc_id = *loc_id;
+ hsize_t c_nfields = *nfields;
+ hsize_t c_nrecords = *nrecords;
+ hsize_t c_chunk_size = *chunk_size;
+ size_t c_type_size = *type_size;
+ size_t *c_field_offset = NULL;
+ hid_t *c_field_types = NULL;
+ char **c_field_names = NULL;
+ char *tmp = NULL, *tmp_p = NULL;
+
+ num_elem = *nfields;
+
+ for ( i = 0; i < num_elem; i++)
+ {
+ if (namelen2[i] > max_len) max_len = namelen2[i];
+ }
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_namelen1 = *namelen1;
+ c_name1 = (char *)HD5f2cstring(name1, c_namelen1);
+ if (c_name1 == NULL)
+ goto done;
+
+ c_field_offset = (size_t*)malloc(sizeof(size_t) * (size_t)c_nfields);
+ if (!c_field_offset)
+ goto done;
+
+ c_field_types = (hid_t*)malloc(sizeof(hid_t) * (size_t)c_nfields);
+ if (!c_field_types)
+ goto done;
+
+ for ( i = 0; i < num_elem; i++)
+ {
+ c_field_offset[i] = field_offset[i];
+ c_field_types[i] = field_types[i];
+ }
+
+ /*
+ * allocate array of character pointers
+ */
+ c_field_names = (char **)malloc((size_t)num_elem * sizeof(char *));
+ if (c_field_names == NULL)
+ goto done;
+
+ /* copy data to long C string */
+ tmp = (char *)HD5f2cstring(field_names, (int)(max_len*num_elem));
+ if (tmp == NULL)
+ {
+ goto done;
+ }
+
+ /*
+ * move data from temorary buffer
+ */
+ tmp_p = tmp;
+ for (i=0; i < num_elem; i++)
+ {
+ c_field_names[i] = (char *) malloc((size_t)namelen2[i]+1);
+ memcpy(c_field_names[i], tmp_p, (size_t)namelen2[i]);
+ c_field_names[i][namelen2[i]] = '\0';
+ tmp_p = tmp_p + max_len;
+ }
+
+ /*
+ * call H5TBmake_table function.
+ */
+
+ ret = H5TBmake_table(c_name1,
+ c_loc_id,
+ c_name,
+ c_nfields,
+ c_nrecords,
+ c_type_size,
+ c_field_names,
+ c_field_offset,
+ c_field_types,
+ c_chunk_size,
+ NULL,
+ *compress,
+ NULL);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name != NULL)
+ free(c_name);
+ if(c_name1 != NULL)
+ free(c_name1);
+
+ for ( i = 0; i < num_elem; i++)
+ {
+ if ( c_field_names[i] )
+ free (c_field_names[i]);
+ }
+ if ( c_field_names )
+ free(c_field_names);
+ if ( tmp )
+ free(tmp);
+ if ( c_field_offset )
+ free(c_field_offset);
+ if ( c_field_types )
+ free(c_field_types);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: h5tbwrite_field_name_c
- *
- * Purpose: Call H5TBwrite_fields_name
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 12, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5tbwrite_field_name_c
+*
+* Purpose: Call H5TBwrite_fields_name
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 12, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5tbwrite_field_name_c(hid_t_f *loc_id,
int_f *namelen,
_fcd name,
- int_f *namelen1,
+ int_f *namelen1,
_fcd field_name,
hsize_t_f *start,
hsize_t_f *nrecords,
size_t_f *type_size,
void *buf)
{
- int ret_value = -1;
- herr_t ret;
- char *c_name;
- int c_namelen;
- char *c_name1;
- int c_namelen1;
- hid_t c_loc_id = *loc_id;
- hsize_t c_start = *start;
- hsize_t c_nrecords = *nrecords;
- size_t c_type_size = *type_size;
- size_t c_type_sizes[1];
-
- c_type_sizes[0] = c_type_size;
-
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_namelen1 = *namelen1;
- c_name1 = (char *)HD5f2cstring(field_name, c_namelen1);
- if (c_name1 == NULL) return ret_value;
-
-/*
- * Call H5TBwrite_fields_name function.
- */
-
- ret = H5TBwrite_fields_name(c_loc_id,c_name,c_name1,c_start,c_nrecords,c_type_size,
- 0,c_type_sizes,buf);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ char *c_name = NULL;
+ int c_namelen;
+ char *c_name1 = NULL;
+ int c_namelen1;
+ hid_t c_loc_id = *loc_id;
+ hsize_t c_start = *start;
+ hsize_t c_nrecords = *nrecords;
+ size_t c_type_size = *type_size;
+ size_t c_type_sizes[1];
+
+ c_type_sizes[0] = c_type_size;
+
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_namelen1 = *namelen1;
+ c_name1 = (char *)HD5f2cstring(field_name, c_namelen1);
+ if (c_name1 == NULL)
+ goto done;
+
+ /*
+ * call H5TBwrite_fields_name function.
+ */
+
+ ret = H5TBwrite_fields_name(c_loc_id,
+ c_name,
+ c_name1,
+ c_start,
+ c_nrecords,
+ c_type_size,
+ 0,
+ c_type_sizes,
+ buf);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+
+done:
+ if(c_name != NULL)
+ free(c_name);
+ if(c_name1 != NULL)
+ free(c_name1);
+
+ return ret_value;
}
int_f
nh5tbwrite_field_name_int_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- return nh5tbwrite_field_name_c(loc_id,namelen,name,namelen1,field_name,start,nrecords,type_size,buf);
+ return nh5tbwrite_field_name_c(loc_id,namelen,name,namelen1,field_name,start,nrecords,type_size,buf);
}
int_f
nh5tbwrite_field_name_fl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- return nh5tbwrite_field_name_c(loc_id,namelen,name,namelen1,field_name,start,nrecords,type_size,buf);
+ return nh5tbwrite_field_name_c(loc_id,namelen,name,namelen1,field_name,start,nrecords,type_size,buf);
}
int_f
nh5tbwrite_field_name_dl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- return nh5tbwrite_field_name_c(loc_id,namelen,name,namelen1,field_name,start,nrecords,type_size,buf);
+ return nh5tbwrite_field_name_c(loc_id,namelen,name,namelen1,field_name,start,nrecords,type_size,buf);
}
int_f
nh5tbwrite_field_name_st_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- return nh5tbwrite_field_name_c(loc_id,namelen,name,namelen1,field_name,start,nrecords,type_size,buf);
+ return nh5tbwrite_field_name_c(loc_id,namelen,name,namelen1,field_name,start,nrecords,type_size,buf);
}
/*-------------------------------------------------------------------------
- * Function: h5tbread_field_name_c
- *
- * Purpose: Call H5TBread_fields_name
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 12, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5tbread_field_name_c
+*
+* Purpose: Call H5TBread_fields_name
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 12, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5tbread_field_name_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
+ int_f *namelen,
+ _fcd name,
int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- int ret_value = -1;
- herr_t ret;
- char *c_name;
- int c_namelen;
- char *c_name1;
- int c_namelen1;
- hid_t c_loc_id = *loc_id;
- hsize_t c_start = *start;
- hsize_t c_nrecords = *nrecords;
- size_t c_type_size = *type_size;
- size_t c_type_sizes[1];
-
- c_type_sizes[0] = c_type_size;
-
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_namelen1 = *namelen1;
- c_name1 = (char *)HD5f2cstring(field_name, c_namelen1);
- if (c_name1 == NULL) return ret_value;
-
-/*
- * Call H5TBread_fields_name function.
- */
-
- ret = H5TBread_fields_name(c_loc_id,c_name,c_name1,c_start,c_nrecords,c_type_size,
- 0,c_type_sizes,buf);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ char *c_name = NULL;
+ int c_namelen;
+ char *c_name1 = NULL;
+ int c_namelen1;
+ hid_t c_loc_id = *loc_id;
+ hsize_t c_start = *start;
+ hsize_t c_nrecords = *nrecords;
+ size_t c_type_size = *type_size;
+ size_t c_type_sizes[1];
+
+ c_type_sizes[0] = c_type_size;
+
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_namelen1 = *namelen1;
+ c_name1 = (char *)HD5f2cstring(field_name, c_namelen1);
+ if (c_name1 == NULL)
+ goto done;
+
+ /*
+ * call H5TBread_fields_name function.
+ */
+
+ ret = H5TBread_fields_name(c_loc_id,
+ c_name,
+ c_name1,
+ c_start,
+ c_nrecords,
+ c_type_size,
+ 0,
+ c_type_sizes,
+ buf);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+
+done:
+ if(c_name != NULL)
+ free(c_name);
+
+ return ret_value;
}
int_f
nh5tbread_field_name_int_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- return nh5tbread_field_name_c(loc_id,namelen,name,namelen1,field_name,start,nrecords,type_size,buf);
+ return nh5tbread_field_name_c(loc_id,namelen,name,namelen1,field_name,start,nrecords,type_size,buf);
}
int_f
nh5tbread_field_name_fl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- return nh5tbread_field_name_c(loc_id,namelen,name,namelen1,field_name,start,nrecords,type_size,buf);
+ return nh5tbread_field_name_c(loc_id,namelen,name,namelen1,field_name,start,nrecords,type_size,buf);
}
int_f
nh5tbread_field_name_dl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- return nh5tbread_field_name_c(loc_id,namelen,name,namelen1,field_name,start,nrecords,type_size,buf);
+ return nh5tbread_field_name_c(loc_id,namelen,name,namelen1,field_name,start,nrecords,type_size,buf);
}
int_f
nh5tbread_field_name_st_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- return nh5tbread_field_name_c(loc_id,namelen,name,namelen1,field_name,start,nrecords,type_size,buf);
+ return nh5tbread_field_name_c(loc_id,namelen,name,namelen1,field_name,start,nrecords,type_size,buf);
}
/*-------------------------------------------------------------------------
- * Function: h5tbwrite_field_index_c
- *
- * Purpose: Call H5TBwrite_fields_index
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 12, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5tbwrite_field_index_c
+*
+* Purpose: Call H5TBwrite_fields_index
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 12, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5tbwrite_field_index_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- int ret_value = -1;
- herr_t ret;
- char *c_name;
- int c_namelen;
- hid_t c_loc_id = *loc_id;
- hsize_t c_start = *start;
- hsize_t c_nrecords = *nrecords;
- size_t c_type_size = *type_size;
- size_t c_type_sizes[1];
- int c_field_index[1];
-
- c_type_sizes[0] = c_type_size;
- c_field_index[0] = *field_index - 1; /* C zero based index */
-
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
-
-/*
- * Call H5TBwrite_fields_name function.
- */
-
- ret = H5TBwrite_fields_index(c_loc_id,c_name,(hsize_t)1,c_field_index,c_start,c_nrecords,c_type_size,
- 0,c_type_sizes,buf);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ char *c_name = NULL;
+ int c_namelen;
+ hid_t c_loc_id = *loc_id;
+ hsize_t c_start = *start;
+ hsize_t c_nrecords = *nrecords;
+ size_t c_type_size = *type_size;
+ size_t c_type_sizes[1];
+ int c_field_index[1];
+
+ c_type_sizes[0] = c_type_size;
+ c_field_index[0] = *field_index - 1; /* C zero based index */
+
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+
+ /*
+ * call H5TBwrite_fields_name function.
+ */
+
+ ret = H5TBwrite_fields_index(c_loc_id,c_name,(hsize_t)1,c_field_index,c_start,c_nrecords,c_type_size,
+ 0,c_type_sizes,buf);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name != NULL)
+ free(c_name);
+
+ return ret_value;
}
int_f
nh5tbwrite_field_index_int_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- return nh5tbwrite_field_index_c(loc_id,namelen,name,field_index,start,nrecords,type_size,buf);
+ return nh5tbwrite_field_index_c(loc_id,namelen,name,field_index,start,nrecords,type_size,buf);
}
int_f
nh5tbwrite_field_index_fl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- return nh5tbwrite_field_index_c(loc_id,namelen,name,field_index,start,nrecords,type_size,buf);
+ return nh5tbwrite_field_index_c(loc_id,namelen,name,field_index,start,nrecords,type_size,buf);
}
int_f
nh5tbwrite_field_index_dl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- return nh5tbwrite_field_index_c(loc_id,namelen,name,field_index,start,nrecords,type_size,buf);
+ return nh5tbwrite_field_index_c(loc_id,namelen,name,field_index,start,nrecords,type_size,buf);
}
int_f
nh5tbwrite_field_index_st_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- return nh5tbwrite_field_index_c(loc_id,namelen,name,field_index,start,nrecords,type_size,buf);
+ return nh5tbwrite_field_index_c(loc_id,namelen,name,field_index,start,nrecords,type_size,buf);
}
/*-------------------------------------------------------------------------
- * Function: h5tbread_field_index_c
- *
- * Purpose: Call H5TBread_fields_index
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 12, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5tbread_field_index_c
+*
+* Purpose: Call H5TBread_fields_index
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 12, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5tbread_field_index_c(hid_t_f *loc_id,
@@ -529,432 +607,506 @@ nh5tbread_field_index_c(hid_t_f *loc_id,
size_t_f *type_size,
void *buf)
{
- int ret_value = -1;
- herr_t ret;
- char *c_name;
- int c_namelen;
- hid_t c_loc_id = *loc_id;
- hsize_t c_start = *start;
- hsize_t c_nrecords = *nrecords;
- size_t c_type_size = *type_size;
- size_t c_type_sizes[1];
- int c_field_index[1];
-
- c_type_sizes[0] = c_type_size;
- c_field_index[0] = *field_index - 1; /* C zero based index */
-
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
-/*
- * Call H5TBread_fields_index function.
- */
-
- ret = H5TBread_fields_index(c_loc_id,c_name,(hsize_t)1,c_field_index,c_start,c_nrecords,c_type_size,
- 0,c_type_sizes,buf);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ char *c_name = NULL;
+ int c_namelen;
+ hid_t c_loc_id = *loc_id;
+ hsize_t c_start = *start;
+ hsize_t c_nrecords = *nrecords;
+ size_t c_type_size = *type_size;
+ size_t c_type_sizes[1];
+ int c_field_index[1];
+
+ c_type_sizes[0] = c_type_size;
+ c_field_index[0] = *field_index - 1; /* C zero based index */
+
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ /*
+ * call H5TBread_fields_index function.
+ */
+
+ ret = H5TBread_fields_index(c_loc_id,
+ c_name,(hsize_t)1,
+ c_field_index,
+ c_start,
+ c_nrecords,
+ c_type_size,
+ 0,
+ c_type_sizes,
+ buf);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name != NULL)
+ free(c_name);
+
+ return ret_value;
}
int_f
nh5tbread_field_index_int_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- return nh5tbread_field_index_c(loc_id,namelen,name,field_index,start,nrecords,type_size,buf);
+ return nh5tbread_field_index_c(loc_id,namelen,name,field_index,start,nrecords,type_size,buf);
}
int_f
nh5tbread_field_index_fl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- return nh5tbread_field_index_c(loc_id,namelen,name,field_index,start,nrecords,type_size,buf);
+ return nh5tbread_field_index_c(loc_id,namelen,name,field_index,start,nrecords,type_size,buf);
}
int_f
nh5tbread_field_index_dl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- return nh5tbread_field_index_c(loc_id,namelen,name,field_index,start,nrecords,type_size,buf);
+ return nh5tbread_field_index_c(loc_id,namelen,name,field_index,start,nrecords,type_size,buf);
}
int_f
nh5tbread_field_index_st_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *field_index,
+ hsize_t_f *start,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ void *buf)
{
- return nh5tbread_field_index_c(loc_id,namelen,name,field_index,start,nrecords,type_size,buf);
+ return nh5tbread_field_index_c(loc_id,namelen,name,field_index,start,nrecords,type_size,buf);
}
/*-------------------------------------------------------------------------
- * Function: h5tbinsert_field_c
- *
- * Purpose: Call H5TBinsert_field
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 13, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5tbinsert_field_c
+*
+* Purpose: Call H5TBinsert_field
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 13, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5tbinsert_field_c(hid_t_f *loc_id,
int_f *namelen,
_fcd name,
- int_f *namelen1,
+ int_f *namelen1,
_fcd field_name,
hid_t_f *field_type,
int_f *position,
void *buf)
{
- int ret_value = -1;
- herr_t ret;
- char *c_name;
- int c_namelen;
- char *c_name1;
- int c_namelen1;
- hid_t c_loc_id = *loc_id;
- hid_t c_field_type = *field_type;
- hsize_t c_position = *position;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_namelen1 = *namelen1;
- c_name1 = (char *)HD5f2cstring(field_name, c_namelen1);
- if (c_name1 == NULL) return ret_value;
-
-/*
- * Call H5TBinsert_field function.
- */
-
- ret = H5TBinsert_field(c_loc_id,c_name,c_name1,c_field_type,c_position,NULL,buf);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ char *c_name = NULL;
+ int c_namelen;
+ char *c_name1 = NULL;
+ int c_namelen1;
+ hid_t c_loc_id = *loc_id;
+ hid_t c_field_type = *field_type;
+ hsize_t c_position = *position;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_namelen1 = *namelen1;
+ c_name1 = (char *)HD5f2cstring(field_name, c_namelen1);
+ if (c_name1 == NULL)
+ goto done;
+
+ /*
+ * call H5TBinsert_field function.
+ */
+
+ ret = H5TBinsert_field(c_loc_id,
+ c_name,
+ c_name1,
+ c_field_type,
+ c_position,
+ NULL,
+ buf);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name != NULL)
+ free(c_name);
+ if(c_name1 != NULL)
+ free(c_name1);
+
+ return ret_value;
}
int_f
nh5tbinsert_field_int_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hid_t_f *field_type,
- int_f *position,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hid_t_f *field_type,
+ int_f *position,
+ void *buf)
{
- return nh5tbinsert_field_c(loc_id,namelen,name,namelen1,field_name,field_type,position,buf);
+ return nh5tbinsert_field_c(loc_id,namelen,name,namelen1,field_name,field_type,position,buf);
}
int_f
nh5tbinsert_field_fl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hid_t_f *field_type,
- int_f *position,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hid_t_f *field_type,
+ int_f *position,
+ void *buf)
{
- return nh5tbinsert_field_c(loc_id,namelen,name,namelen1,field_name,field_type,position,buf);
+ return nh5tbinsert_field_c(loc_id,namelen,name,namelen1,field_name,field_type,position,buf);
}
int_f
nh5tbinsert_field_dl_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hid_t_f *field_type,
- int_f *position,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hid_t_f *field_type,
+ int_f *position,
+ void *buf)
{
- return nh5tbinsert_field_c(loc_id,namelen,name,namelen1,field_name,field_type,position,buf);
+ return nh5tbinsert_field_c(loc_id,namelen,name,namelen1,field_name,field_type,position,buf);
}
int_f
nh5tbinsert_field_st_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- int_f *namelen1,
- _fcd field_name,
- hid_t_f *field_type,
- int_f *position,
- void *buf)
+ int_f *namelen,
+ _fcd name,
+ int_f *namelen1,
+ _fcd field_name,
+ hid_t_f *field_type,
+ int_f *position,
+ void *buf)
{
- return nh5tbinsert_field_c(loc_id,namelen,name,namelen1,field_name,field_type,position,buf);
+ return nh5tbinsert_field_c(loc_id,namelen,name,namelen1,field_name,field_type,position,buf);
}
/*-------------------------------------------------------------------------
- * Function: h5tbdelete_field_c
- *
- * Purpose: Call H5TBdelete_field
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 13, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5tbdelete_field_c
+*
+* Purpose: Call H5TBdelete_field
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 13, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5tbdelete_field_c(hid_t_f *loc_id,
int_f *namelen,
_fcd name,
- int_f *namelen1,
- _fcd field_name)
+ int_f *namelen1,
+ _fcd field_name)
{
- int ret_value = -1;
- herr_t ret;
- char *c_name;
- int c_namelen;
- char *c_name1;
- int c_namelen1;
- hid_t c_loc_id = *loc_id;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
- c_namelen1 = *namelen1;
- c_name1 = (char *)HD5f2cstring(field_name, c_namelen1);
- if (c_name1 == NULL) return ret_value;
-
-/*
- * Call H5TBinsert_field function.
- */
-
- ret = H5TBdelete_field(c_loc_id,c_name,c_name1);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ char *c_name = NULL;
+ int c_namelen;
+ char *c_name1 = NULL;
+ int c_namelen1;
+ hid_t c_loc_id = *loc_id;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ c_namelen1 = *namelen1;
+ c_name1 = (char *)HD5f2cstring(field_name, c_namelen1);
+ if (c_name1 == NULL)
+ goto done;
+
+ /*
+ * call H5TBinsert_field function.
+ */
+
+ ret = H5TBdelete_field(c_loc_id,
+ c_name,
+ c_name1);
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+done:
+ if(c_name != NULL)
+ free(c_name);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: h5tbget_table_info_c
- *
- * Purpose: Call H5TBread_fields_index
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 12, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5tbget_table_info_c
+*
+* Purpose: Call H5TBread_fields_index
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 12, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5tbget_table_info_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hsize_t_f *nfields,
- hsize_t_f *nrecords)
+ int_f *namelen,
+ _fcd name,
+ hsize_t_f *nfields,
+ hsize_t_f *nrecords)
{
- int ret_value = -1;
- herr_t ret;
- char *c_name;
- int c_namelen;
- hid_t c_loc_id = *loc_id;
- hsize_t c_nfields;
- hsize_t c_nrecords;
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
-/*
- * Call H5TBread_fields_index function.
- */
-
- ret = H5TBget_table_info(c_loc_id,c_name,&c_nfields,&c_nrecords);
-
- *nfields = (hsize_t_f) c_nfields;;
- *nrecords = (hsize_t_f) c_nrecords;
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ char *c_name = NULL;
+ int c_namelen;
+ hid_t c_loc_id = *loc_id;
+ hsize_t c_nfields;
+ hsize_t c_nrecords;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+ /*
+ * call H5TBread_fields_index function.
+ */
+
+ ret = H5TBget_table_info(c_loc_id,
+ c_name,
+ &c_nfields,
+ &c_nrecords);
+
+ if (ret < 0)
+ goto done;
+
+ *nfields = (hsize_t_f) c_nfields;;
+ *nrecords = (hsize_t_f) c_nrecords;
+
+ ret_value = 0;
+
+done:
+ if(c_name != NULL)
+ free(c_name);
+
+ return ret_value;
}
/*-------------------------------------------------------------------------
- * Function: h5tbget_field_info_c
- *
- * Purpose: Call H5TBget_field_info
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: October 13, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: h5tbget_field_info_c
+*
+* Purpose: Call H5TBget_field_info
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: October 13, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
int_f
nh5tbget_field_info_c(hid_t_f *loc_id,
- int_f *namelen,
- _fcd name,
- hsize_t_f *nfields,
- size_t_f *field_sizes,
- size_t_f *field_offsets,
- size_t_f *type_size,
- int_f *namelen2, /* field_names lenghts */
- _fcd field_names) /* field_names */
+ int_f *namelen,
+ _fcd name,
+ hsize_t_f *nfields,
+ size_t_f *field_sizes,
+ size_t_f *field_offsets,
+ size_t_f *type_size,
+ int_f *namelen2, /* field_names lenghts */
+ _fcd field_names) /* field_names */
{
- int ret_value = -1;
- herr_t ret;
- char *c_name;
- int c_namelen;
- hsize_t num_elem;
- hsize_t i;
- int max_len=1;
- hid_t c_loc_id = *loc_id;
- hsize_t c_nfields = *nfields;
- size_t *c_field_sizes;
- size_t *c_field_offsets;
- size_t c_type_size;
- char **c_field_names;
- char *tmp, *tmp_p;
- int c_lenmax=HLTB_MAX_FIELD_LEN;
- size_t length = 0;
-
- num_elem = c_nfields;
-
- for (i=0; i < num_elem; i++) {
- if (namelen2[i] > max_len) max_len = namelen2[i];
- }
-
-/*
- * Convert FORTRAN name to C name
- */
- c_namelen = *namelen;
- c_name = (char *)HD5f2cstring(name, c_namelen);
- if (c_name == NULL) return ret_value;
-
-
- c_field_offsets = (size_t*)malloc(sizeof(size_t) * (size_t)c_nfields);
- if (!c_field_offsets) return ret_value;
-
- c_field_sizes = (size_t*)malloc(sizeof(size_t) * (size_t)c_nfields);
- if (!c_field_sizes) return ret_value;
-
- c_field_names = malloc( sizeof(char*) * (size_t)c_nfields );
- if (!c_field_names) return ret_value;
- for ( i = 0; i < c_nfields; i++)
- {
- c_field_names[i] = malloc( sizeof(char) * HLTB_MAX_FIELD_LEN );
- }
-
-/*
- * Call H5TBget_field_info function.
- */
-
- ret = H5TBget_field_info(c_loc_id,c_name,c_field_names,c_field_sizes,c_field_offsets,
- &c_type_size);
-
- /* return values*/
-
- /* names array */
- tmp = (char *)malloc(c_lenmax* (size_t) c_nfields + 1);
- tmp_p = tmp;
- memset(tmp,' ', c_lenmax* (size_t) c_nfields);
- tmp[c_lenmax*c_nfields] = '\0';
- for (i=0; i < c_nfields; i++) {
- memcpy(tmp_p, c_field_names[i], strlen(c_field_names[i]));
- namelen2[i] = (int_f)strlen(c_field_names[i]);
- length = MAX(length, strlen(c_field_names[i]));
- tmp_p = tmp_p + c_lenmax;
- }
- HD5packFstring(tmp, _fcdtocp(field_names), (int)(c_lenmax*c_nfields));
-
-
- *type_size = (size_t_f)c_type_size;
- for (i=0; i < num_elem; i++)
- {
- field_sizes[i] = (size_t_f)c_field_sizes[i];
- field_offsets[i] = (size_t_f)c_field_offsets[i];
- }
-
-
-
- /* free */
-
- for (i=0; i < num_elem; i++) {
- free (c_field_names[i]);
- }
- free(c_field_names);
- free(tmp);
- free(c_field_offsets);
- free(c_field_sizes);
-
- if (ret < 0) return ret_value;
- ret_value = 0;
- return ret_value;
+ int ret_value = -1;
+ herr_t ret;
+ char *c_name = NULL;
+ int c_namelen;
+ hsize_t num_elem;
+ hsize_t i;
+ int max_len=1;
+ hid_t c_loc_id = *loc_id;
+ hsize_t c_nfields = *nfields;
+ size_t *c_field_sizes = NULL;
+ size_t *c_field_offsets = NULL;
+ size_t c_type_size;
+ char **c_field_names = NULL;
+ char *tmp = NULL, *tmp_p = NULL;
+ int c_lenmax=HLTB_MAX_FIELD_LEN;
+ size_t length = 0;
+
+ num_elem = c_nfields;
+
+ for (i=0; i < num_elem; i++)
+ {
+ if (namelen2[i] > max_len) max_len = namelen2[i];
+ }
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ c_namelen = *namelen;
+ c_name = (char *)HD5f2cstring(name, c_namelen);
+ if (c_name == NULL)
+ goto done;
+
+
+ c_field_offsets = (size_t*)malloc(sizeof(size_t) * (size_t)c_nfields);
+ if (!c_field_offsets)
+ goto done;
+
+ c_field_sizes = (size_t*)malloc(sizeof(size_t) * (size_t)c_nfields);
+ if (!c_field_sizes)
+ goto done;
+
+ c_field_names = malloc( sizeof(char*) * (size_t)c_nfields );
+ if (!c_field_names) return ret_value;
+ for ( i = 0; i < c_nfields; i++)
+ {
+ c_field_names[i] = malloc( sizeof(char) * HLTB_MAX_FIELD_LEN );
+ }
+
+ /*
+ * call H5TBget_field_info function.
+ */
+
+ ret = H5TBget_field_info(c_loc_id,
+ c_name,
+ c_field_names,
+ c_field_sizes,
+ c_field_offsets,
+ &c_type_size);
+
+ /* return values*/
+
+ /* names array */
+ tmp = (char *)malloc(c_lenmax* (size_t) c_nfields + 1);
+ tmp_p = tmp;
+ memset(tmp,' ', c_lenmax* (size_t) c_nfields);
+ tmp[c_lenmax*c_nfields] = '\0';
+ for (i=0; i < c_nfields; i++)
+ {
+ memcpy(tmp_p, c_field_names[i], strlen(c_field_names[i]));
+ namelen2[i] = (int_f)strlen(c_field_names[i]);
+ length = MAX(length, strlen(c_field_names[i]));
+ tmp_p = tmp_p + c_lenmax;
+ }
+ HD5packFstring(tmp, _fcdtocp(field_names), (int)(c_lenmax*c_nfields));
+
+
+ *type_size = (size_t_f)c_type_size;
+ for (i=0; i < num_elem; i++)
+ {
+ field_sizes[i] = (size_t_f)c_field_sizes[i];
+ field_offsets[i] = (size_t_f)c_field_offsets[i];
+ }
+
+
+ if (ret < 0)
+ goto done;
+
+ ret_value = 0;
+
+
+done:
+ if(c_name != NULL)
+ free(c_name);
+
+ for ( i = 0; i < num_elem; i++)
+ {
+ if ( c_field_names[i] )
+ free (c_field_names[i]);
+ }
+ if ( c_field_names )
+ free(c_field_names);
+ if ( tmp )
+ free(tmp);
+ if ( c_field_offsets )
+ free(c_field_offsets);
+ if ( c_field_sizes )
+ free(c_field_sizes);
+
+ return ret_value;
}
diff --git a/hl/fortran/src/H5TBff.f90 b/hl/fortran/src/H5TBff.f90
index 781bd6a..03ecc6e 100755
--- a/hl/fortran/src/H5TBff.f90
+++ b/hl/fortran/src/H5TBff.f90
@@ -136,9 +136,9 @@ subroutine h5tbmake_table_f(table_title,&
field_names)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBMAKE_TABLE_C'::h5tbmake_table_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBMAKE_TABLE_C'::h5tbmake_table_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: table_title
character(len=*), intent(in) :: table_title ! name of the dataset
@@ -231,9 +231,9 @@ subroutine h5tbwrite_field_name_f_int(loc_id,&
start,nrecords,type_size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_NAME_INT_C'::h5tbwrite_field_name_int_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_NAME_INT_C'::h5tbwrite_field_name_int_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: field_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -306,9 +306,9 @@ subroutine h5tbwrite_field_name_f_float(loc_id,&
start,nrecords,type_size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_NAME_FL_C'::h5tbwrite_field_name_fl_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_NAME_FL_C'::h5tbwrite_field_name_fl_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: field_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -383,9 +383,9 @@ subroutine h5tbwrite_field_name_f_double(loc_id,&
start,nrecords,type_size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_NAME_DL_C'::h5tbwrite_field_name_dl_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_NAME_DL_C'::h5tbwrite_field_name_dl_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: field_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -458,9 +458,9 @@ subroutine h5tbwrite_field_name_f_string(loc_id,&
start,nrecords,type_size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_NAME_ST_C'::h5tbwrite_field_name_st_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_NAME_ST_C'::h5tbwrite_field_name_st_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: field_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -534,9 +534,9 @@ subroutine h5tbread_field_name_f_int(loc_id,&
start,nrecords,type_size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_NAME_INT_C'::h5tbread_field_name_int_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_NAME_INT_C'::h5tbread_field_name_int_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: field_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -609,9 +609,9 @@ subroutine h5tbread_field_name_f_float(loc_id,&
start,nrecords,type_size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_NAME_FL_C'::h5tbread_field_name_fl_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_NAME_FL_C'::h5tbread_field_name_fl_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: field_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -684,9 +684,9 @@ subroutine h5tbread_field_name_f_double(loc_id,&
start,nrecords,type_size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_NAME_DL_C'::h5tbread_field_name_dl_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_NAME_DL_C'::h5tbread_field_name_dl_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: field_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -759,9 +759,9 @@ subroutine h5tbread_field_name_f_string(loc_id,&
start,nrecords,type_size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_NAME_ST_C'::h5tbread_field_name_st_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_NAME_ST_C'::h5tbread_field_name_st_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: field_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -834,9 +834,9 @@ subroutine h5tbwrite_field_index_f_int(loc_id,&
start,nrecords,type_size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_INDEX_INT_C'::h5tbwrite_field_index_int_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_INDEX_INT_C'::h5tbwrite_field_index_int_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
character(len=*), intent(in) :: dset_name ! name of the dataset
@@ -905,9 +905,9 @@ subroutine h5tbwrite_field_index_f_float(loc_id,&
start,nrecords,type_size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_INDEX_FL_C'::h5tbwrite_field_index_fl_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_INDEX_FL_C'::h5tbwrite_field_index_fl_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
character(len=*), intent(in) :: dset_name ! name of the dataset
@@ -978,9 +978,9 @@ subroutine h5tbwrite_field_index_f_double(loc_id,&
start,nrecords,type_size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_INDEX_DL_C'::h5tbwrite_field_index_dl_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_INDEX_DL_C'::h5tbwrite_field_index_dl_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
character(len=*), intent(in) :: dset_name ! name of the dataset
@@ -1049,9 +1049,9 @@ subroutine h5tbwrite_field_index_f_string(loc_id,&
start,nrecords,type_size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_INDEX_ST_C'::h5tbwrite_field_index_st_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_INDEX_ST_C'::h5tbwrite_field_index_st_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
character(len=*), intent(in) :: dset_name ! name of the dataset
@@ -1121,9 +1121,9 @@ subroutine h5tbread_field_index_f_int(loc_id,&
start,nrecords,type_size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_INDEX_INT_C'::h5tbread_field_index_int_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_INDEX_INT_C'::h5tbread_field_index_int_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
character(len=*), intent(in) :: dset_name ! name of the dataset
@@ -1192,9 +1192,9 @@ subroutine h5tbread_field_index_f_float(loc_id,&
start,nrecords,type_size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_INDEX_FL_C'::h5tbread_field_index_fl_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_INDEX_FL_C'::h5tbread_field_index_fl_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
character(len=*), intent(in) :: dset_name ! name of the dataset
@@ -1263,9 +1263,9 @@ subroutine h5tbread_field_index_f_double(loc_id,&
start,nrecords,type_size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_INDEX_DL_C'::h5tbread_field_index_dl_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_INDEX_DL_C'::h5tbread_field_index_dl_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
character(len=*), intent(in) :: dset_name ! name of the dataset
@@ -1334,9 +1334,9 @@ subroutine h5tbread_field_index_f_string(loc_id,&
start,nrecords,type_size,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_INDEX_ST_C'::h5tbread_field_index_st_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_INDEX_ST_C'::h5tbread_field_index_st_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
character(len=*), intent(in) :: dset_name ! name of the dataset
@@ -1405,9 +1405,9 @@ subroutine h5tbinsert_field_f_int(loc_id,&
field_type,field_index,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBINSERT_FIELD_INT_C'::h5tbinsert_field_int_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBINSERT_FIELD_INT_C'::h5tbinsert_field_int_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: field_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -1478,9 +1478,9 @@ subroutine h5tbinsert_field_f_float(loc_id,&
field_type,field_index,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBINSERT_FIELD_FL_C'::h5tbinsert_field_fl_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBINSERT_FIELD_FL_C'::h5tbinsert_field_fl_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: field_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -1551,9 +1551,9 @@ subroutine h5tbinsert_field_f_double(loc_id,&
field_type,field_index,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBINSERT_FIELD_DL_C'::h5tbinsert_field_dl_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBINSERT_FIELD_DL_C'::h5tbinsert_field_dl_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: field_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -1625,9 +1625,9 @@ subroutine h5tbinsert_field_f_string(loc_id,&
field_type,field_index,buf)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBINSERT_FIELD_ST_C'::h5tbinsert_field_st_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBINSERT_FIELD_ST_C'::h5tbinsert_field_st_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: field_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
@@ -1692,9 +1692,9 @@ subroutine h5tbdelete_field_f(loc_id,&
integer function h5tbdelete_field_c(loc_id,namelen,dset_name,namelen1,field_name)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBDELETE_FIELD_C'::h5tbdelete_field_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBDELETE_FIELD_C'::h5tbdelete_field_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
!DEC$ATTRIBUTES reference :: field_name
integer(HID_T), intent(IN) :: loc_id ! file or group identifier
@@ -1756,9 +1756,9 @@ subroutine h5tbget_table_info_f(loc_id,&
interface
integer function h5tbget_table_info_c(loc_id,namelen,dset_name,nfields,nrecords)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBGET_TABLE_INFO_C'::h5tbget_table_info_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBGET_TABLE_INFO_C'::h5tbget_table_info_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
character(len=*), intent(in) :: dset_name ! name of the dataset
@@ -1826,9 +1826,9 @@ subroutine h5tbget_field_info_f(loc_id,&
field_sizes,field_offsets,type_size,namelen2,field_names)
use h5global
- !DEC$ IF DEFINED(HDF5F90_WINDOWS)
- !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5TBGET_FIELD_INFO_C'::h5tbget_field_info_c
- !DEC$ ENDIF
+ !DEC$IF DEFINED(HDF5F90_WINDOWS)
+ !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBGET_FIELD_INFO_C'::h5tbget_field_info_c
+ !DEC$ENDIF
!DEC$ATTRIBUTES reference :: dset_name
integer(hid_t), intent(in) :: loc_id ! file or group identifier
character(len=*), intent(in) :: dset_name ! name of the dataset
diff --git a/hl/fortran/src/Makefile.am b/hl/fortran/src/Makefile.am
index 0285412..d4fec65 100644
--- a/hl/fortran/src/Makefile.am
+++ b/hl/fortran/src/Makefile.am
@@ -20,20 +20,24 @@
# HDF5 High-Level Fortran Makefile(.in)
include $(top_srcdir)/config/commence.am
+include $(top_srcdir)/config/lt_vers.am
INCLUDES=-I$(top_srcdir)/src -I$(top_srcdir)/hl/src -I$(top_builddir)/hl/src \
-I$(top_srcdir)/fortran/src -I$(top_builddir)/fortran/src
-AM_FCFLAGS=-I$(top_builddir)/fortran/src $(F9XMODFLAG)$(top_builddir)/fortran/src
+AM_FCFLAGS+=-I$(top_builddir)/fortran/src $(F9XMODFLAG)$(top_builddir)/fortran/src
# Our main target, the high-level fortran library
lib_LTLIBRARIES=libhdf5hl_fortran.la
+# Add libtool numbers to the HDF5 HL Fortran library (from config/lt_vers.am)
+libhdf5hl_fortran_la_LDFLAGS= -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
+
# Some Fortran compilers can't build shared libraries, so sometimes we
# want to build a shared C library and a static Fortran library. If so,
# pass the -static flag to the library linker.
if FORTRAN_SHARED_CONDITIONAL
else
- AM_LDFLAGS=-static
+ AM_LDFLAGS+=-static
endif
# Source files for the library
@@ -57,12 +61,12 @@ clean-local:
install-data-local:
@if test -n "$(F9XMODEXT)" && test "X$(F9XMODEXT)" != "Xo"; then \
- $(CP) $(top_builddir)/$(subdir)/*.$(F9XMODEXT) $(includedir)/. ; \
+ $(CP) $(top_builddir)/$(subdir)/*.$(F9XMODEXT) $(DESTDIR)$(includedir)/. ; \
fi
uninstall-local:
@if test -n "$(F9XMODEXT)" -a "X$(F9XMODEXT)" != "Xo"; then \
- if test -f "$(includedir)/hdf5.$(F9XMODEXT)" -o -f "$(includedir)/HDF5.$(F9XMODEXT)"; then \
+ if test -f "$(includedir)/hdf5.$(F9XMODEXT)" -o -f "$(DESTDIR)$(includedir)/HDF5.$(F9XMODEXT)"; then \
set -x; $(RM) $(includedir)/*.$(F9XMODEXT); \
fi; \
fi
diff --git a/hl/fortran/src/Makefile.in b/hl/fortran/src/Makefile.in
index 7d3c3b8..f1ab935 100644
--- a/hl/fortran/src/Makefile.in
+++ b/hl/fortran/src/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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.
@@ -33,8 +34,9 @@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@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
@@ -51,7 +53,13 @@ build_triplet = @build@
host_triplet = @host@
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(top_srcdir)/config/commence.am \
- $(top_srcdir)/config/conclude.am
+ $(top_srcdir)/config/conclude.am \
+ $(top_srcdir)/config/lt_vers.am
+
+# Some Fortran compilers can't build shared libraries, so sometimes we
+# want to build a shared C library and a static Fortran library. If so,
+# pass the -static flag to the library linker.
+@FORTRAN_SHARED_CONDITIONAL_FALSE@am__append_1 = -static
TESTS =
subdir = hl/fortran/src
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -61,22 +69,41 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/src/H5config.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 = `echo $$p | sed -e 's|^.*/||'`;
+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__installdirs = "$(DESTDIR)$(libdir)"
-libLTLIBRARIES_INSTALL = $(INSTALL)
LTLIBRARIES = $(lib_LTLIBRARIES)
libhdf5hl_fortran_la_LIBADD =
am_libhdf5hl_fortran_la_OBJECTS = H5LTfc.lo H5IMfc.lo H5IMcc.lo \
H5TBfc.lo H5LTff.lo H5IMff.lo H5TBff.lo
libhdf5hl_fortran_la_OBJECTS = $(am_libhdf5hl_fortran_la_OBJECTS)
+libhdf5hl_fortran_la_LINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+ $(libhdf5hl_fortran_la_LDFLAGS) $(LDFLAGS) -o $@
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
am__depfiles_maybe = depfiles
+am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
@@ -87,20 +114,33 @@ LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@
FCCOMPILE = $(FC) $(AM_FCFLAGS) $(FCFLAGS)
-LTFCCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+LTFCCOMPILE = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
FCLD = $(FC)
-FCLINK = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
- $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \
- $@
+FCLINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
SOURCES = $(libhdf5hl_fortran_la_SOURCES)
DIST_SOURCES = $(libhdf5hl_fortran_la_SOURCES)
ETAGS = etags
CTAGS = ctags
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = /home1/packages/automake/automake-1.9.6/bin/aclocal-1.9 -I /afs/ncsa/projects/hdf/packages/libtool_1.5.14/Linux_2.4/share/aclocal
ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
AMTAR = @AMTAR@
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+AM_CFLAGS = @AM_CFLAGS@ @H5_CFLAGS@
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@ -I$(top_builddir)/fortran/src \
+ $(F9XMODFLAG)$(top_builddir)/fortran/src
+AM_LDFLAGS = @AM_LDFLAGS@ $(am__append_1)
AM_MAKEFLAGS = @AM_MAKEFLAGS@
AR = @AR@
@@ -114,21 +154,18 @@ BYTESEX = @BYTESEX@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_VERSION = @CC_VERSION@
-
-# H5_CFLAGS holds flags that should be used as CFLAGS when building hdf5,
-# but which shouldn't be exported to h5cc for building other programs.
-CFLAGS = @CFLAGS@ @H5_CFLAGS@
+CFLAGS = @CFLAGS@
CLEARFILEBUF = @CLEARFILEBUF@
CODESTACK = @CODESTACK@
CONFIG_DATE = @CONFIG_DATE@
CONFIG_MODE = @CONFIG_MODE@
CONFIG_USER = @CONFIG_USER@
CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@ @H5_CPPFLAGS@
+CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@ @H5_CXXFLAGS@
+CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEBUG_PKG = @DEBUG_PKG@
DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
@@ -151,7 +188,7 @@ F9XMODEXT = @F9XMODEXT@
F9XMODFLAG = @F9XMODFLAG@
F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
FC = @FC@
-FCFLAGS = @FCFLAGS@ @H5_FCFLAGS@
+FCFLAGS = @FCFLAGS@
FCFLAGS_f90 = @FCFLAGS_f90@
FCLIBS = @FCLIBS@
FGREP = @FGREP@
@@ -189,6 +226,8 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LINUX_LFS = @LINUX_LFS@
+LIPO = @LIPO@
+LL_PATH = @LL_PATH@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_STATIC_EXEC = @LT_STATIC_EXEC@
@@ -199,13 +238,17 @@ MPE = @MPE@
MPI_GET_SIZE = @MPI_GET_SIZE@
NM = @NM@
NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
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@
PARALLEL = @PARALLEL@
PATH_SEPARATOR = @PATH_SEPARATOR@
@@ -221,12 +264,7 @@ SEARCH = @SEARCH@
SED = @SED@
SETX = @SETX@
SET_MAKE = @SET_MAKE@
-
-# Hardcode SHELL to be /bin/sh. Most machines have this shell, and
-# on at least one machine configure fails to detect its existence (janus).
-# Also, when HDF5 is configured on one machine but run on another,
-# configure's automatic SHELL detection may not work on the build machine.
-SHELL = /bin/sh
+SHELL = @SHELL@
SIZE_T = @SIZE_T@
STATIC_EXEC = @STATIC_EXEC@
STATIC_SHARED = @STATIC_SHARED@
@@ -246,6 +284,7 @@ USE_FILTER_SHUFFLE = @USE_FILTER_SHUFFLE@
USE_FILTER_SZIP = @USE_FILTER_SZIP@
USINGMEMCHECKER = @USINGMEMCHECKER@
VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -268,6 +307,8 @@ build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
+
+# Install directories that automake doesn't know about
docdir = $(exec_prefix)/doc
dvidir = @dvidir@
enable_shared = @enable_shared@
@@ -279,9 +320,7 @@ host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
-
-# Install directories that automake doesn't know about
-includedir = $(exec_prefix)/include
+includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
@@ -301,6 +340,7 @@ sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -345,18 +385,21 @@ TRACE = perl $(top_srcdir)/bin/trace
# .chklog files are output from those tests.
# *.clog are from the MPE option.
CHECK_CLEANFILES = *.chkexe *.chklog *.clog
+
+# Add libtool shared library version numbers to the HDF5 library
+# See libtool versioning documentation online.
+LT_VERS_INTERFACE = 6
+LT_VERS_REVISION = 45
+LT_VERS_AGE = 0
INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/hl/src -I$(top_builddir)/hl/src \
-I$(top_srcdir)/fortran/src -I$(top_builddir)/fortran/src
-AM_FCFLAGS = -I$(top_builddir)/fortran/src $(F9XMODFLAG)$(top_builddir)/fortran/src
# Our main target, the high-level fortran library
lib_LTLIBRARIES = libhdf5hl_fortran.la
-# Some Fortran compilers can't build shared libraries, so sometimes we
-# want to build a shared C library and a static Fortran library. If so,
-# pass the -static flag to the library linker.
-@FORTRAN_SHARED_CONDITIONAL_FALSE@AM_LDFLAGS = -static
+# Add libtool numbers to the HDF5 HL Fortran library (from config/lt_vers.am)
+libhdf5hl_fortran_la_LDFLAGS = -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
# Source files for the library
#if BUILD_PARALLEL_CONDITIONAL
@@ -385,18 +428,18 @@ all: all-am
.SUFFIXES:
.SUFFIXES: .c .f90 .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
- && exit 0; \
+ ( 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) --foreign hl/fortran/src/Makefile'; \
- cd $(top_srcdir) && \
- $(AUTOMAKE) --foreign hl/fortran/src/Makefile
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/fortran/src/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign hl/fortran/src/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -414,23 +457,28 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
@$(NORMAL_INSTALL)
test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ list2=; for p in $$list; do \
if test -f $$p; then \
- f=$(am__strip_dir) \
- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+ list2="$$list2 $$p"; \
else :; fi; \
- done
+ done; \
+ test -z "$$list2" || { \
+ 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)'; for p in $$list; do \
- p=$(am__strip_dir) \
- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+ @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:
@@ -442,7 +490,7 @@ clean-libLTLIBRARIES:
rm -f "$${dir}/so_locations"; \
done
libhdf5hl_fortran.la: $(libhdf5hl_fortran_la_OBJECTS) $(libhdf5hl_fortran_la_DEPENDENCIES)
- $(FCLINK) -rpath $(libdir) $(libhdf5hl_fortran_la_OBJECTS) $(libhdf5hl_fortran_la_LIBADD) $(LIBS)
+ $(libhdf5hl_fortran_la_LINK) -rpath $(libdir) $(libhdf5hl_fortran_la_OBJECTS) $(libhdf5hl_fortran_la_LIBADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -457,33 +505,33 @@ distclean-compile:
.c.o:
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
.c.obj:
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
.f90.o:
- $(FCCOMPILE) -c -o $@ $<
+ $(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
.f90.obj:
- $(FCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+ $(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'`
.f90.lo:
- $(LTFCCOMPILE) -c -o $@ $<
+ $(LTFCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
mostlyclean-libtool:
-rm -f *.lo
@@ -496,14 +544,14 @@ ID: $(HEADERS) $(SOURCES) $(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; nonemtpy = 1; } \
+ $(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)
- tags=; \
+ set x; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
@@ -511,29 +559,34 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique; \
+ 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)
- tags=; \
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)$$tags$$unique" \
+ test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$tags $$unique
+ $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -554,13 +607,17 @@ distdir: $(DISTFILES)
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 -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
@@ -592,6 +649,7 @@ 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"
@@ -613,6 +671,8 @@ dvi-am:
html: html-am
+html-am:
+
info: info-am
info-am:
@@ -621,18 +681,28 @@ install-data-am: install-data-local
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
@@ -656,7 +726,7 @@ ps-am:
uninstall-am: uninstall-libLTLIBRARIES uninstall-local
-.MAKE: install-am install-strip
+.MAKE: check-am install-am install-strip
.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \
clean clean-generic clean-libLTLIBRARIES clean-libtool \
@@ -686,6 +756,19 @@ uninstall-am: uninstall-libLTLIBRARIES uninstall-local
help:
@$(top_srcdir)/bin/makehelp
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5. The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html. COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page. It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have
+# access to either file, you may request a copy from help@hdfgroup.org.
+
# Fortran module files can have different extensions and different names
# (e.g., different capitalizations) on different platforms. Write rules
# for them explicitly rather than trying to teach automake about them.
@@ -699,12 +782,12 @@ clean-local:
install-data-local:
@if test -n "$(F9XMODEXT)" && test "X$(F9XMODEXT)" != "Xo"; then \
- $(CP) $(top_builddir)/$(subdir)/*.$(F9XMODEXT) $(includedir)/. ; \
+ $(CP) $(top_builddir)/$(subdir)/*.$(F9XMODEXT) $(DESTDIR)$(includedir)/. ; \
fi
uninstall-local:
@if test -n "$(F9XMODEXT)" -a "X$(F9XMODEXT)" != "Xo"; then \
- if test -f "$(includedir)/hdf5.$(F9XMODEXT)" -o -f "$(includedir)/HDF5.$(F9XMODEXT)"; then \
+ if test -f "$(includedir)/hdf5.$(F9XMODEXT)" -o -f "$(DESTDIR)$(includedir)/HDF5.$(F9XMODEXT)"; then \
set -x; $(RM) $(includedir)/*.$(F9XMODEXT); \
fi; \
fi
@@ -911,6 +994,7 @@ check-vfd: $(LIB) $(PROGS) $(TESTS)
HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1; \
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:
diff --git a/hl/fortran/test/Makefile.am b/hl/fortran/test/Makefile.am
index 9c94bed..7f149c8 100644
--- a/hl/fortran/test/Makefile.am
+++ b/hl/fortran/test/Makefile.am
@@ -21,15 +21,15 @@
include $(top_srcdir)/config/commence.am
-AM_CPPFLAGS=-I$(top_srcdir)/src -I$(top_builddir)/src -I$(top_srcdir)/hl/src
-AM_FCFLAGS=-I$(top_builddir)/fortran/src -I$(top_builddir)/hl/fortran/src $(F9XMODFLAG)$(top_builddir)/fortran/src $(F9XMODFLAG)$(top_builddir)/hl/fortran/src
+AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_builddir)/src -I$(top_srcdir)/hl/src
+AM_FCFLAGS+=-I$(top_builddir)/fortran/src -I$(top_builddir)/hl/fortran/src $(F9XMODFLAG)$(top_builddir)/fortran/src $(F9XMODFLAG)$(top_builddir)/hl/fortran/src
# Some Fortran compilers can't build shared libraries, so sometimes we
# need to make sure the Fortran programs link against the static version
# of the HDF5 library. We do this by passing the -static flag to the linker.
if FORTRAN_SHARED_CONDITIONAL
else
- AM_LDFLAGS=-static
+ AM_LDFLAGS+=-static
endif
# Our main target, the test programs
diff --git a/hl/fortran/test/Makefile.in b/hl/fortran/test/Makefile.in
index c0e1dd6..f395240 100644
--- a/hl/fortran/test/Makefile.in
+++ b/hl/fortran/test/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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.
@@ -32,8 +33,9 @@
# HDF5 High-Level Fortran Makefile(.in)
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@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
@@ -51,6 +53,11 @@ host_triplet = @host@
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(top_srcdir)/config/commence.am \
$(top_srcdir)/config/conclude.am
+
+# Some Fortran compilers can't build shared libraries, so sometimes we
+# need to make sure the Fortran programs link against the static version
+# of the HDF5 library. We do this by passing the -static flag to the linker.
+@FORTRAN_SHARED_CONDITIONAL_FALSE@am__append_1 = -static
check_PROGRAMS = $(am__EXEEXT_1)
TESTS = $(check_PROGRAMS)
subdir = hl/fortran/test
@@ -61,6 +68,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/src/H5config.h
CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
am__EXEEXT_1 = tstlite$(EXEEXT) tstimage$(EXEEXT) tsttable$(EXEEXT)
am_tstimage_OBJECTS = tstimage.$(OBJEXT)
tstimage_OBJECTS = $(am_tstimage_OBJECTS)
@@ -76,21 +84,37 @@ tsttable_LDADD = $(LDADD)
tsttable_DEPENDENCIES = $(LIBH5F_HL) $(LIBH5F) $(LIBH5_HL) $(LIBHDF5)
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
FCCOMPILE = $(FC) $(AM_FCFLAGS) $(FCFLAGS)
-LTFCCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+LTFCCOMPILE = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
FCLD = $(FC)
-FCLINK = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
- $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \
- $@
+FCLINK = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
SOURCES = $(tstimage_SOURCES) $(tstlite_SOURCES) $(tsttable_SOURCES)
DIST_SOURCES = $(tstimage_SOURCES) $(tstlite_SOURCES) \
$(tsttable_SOURCES)
ETAGS = etags
CTAGS = ctags
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = /home1/packages/automake/automake-1.9.6/bin/aclocal-1.9 -I /afs/ncsa/projects/hdf/packages/libtool_1.5.14/Linux_2.4/share/aclocal
ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
AMTAR = @AMTAR@
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+AM_CFLAGS = @AM_CFLAGS@ @H5_CFLAGS@
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@ -I$(top_srcdir)/src \
+ -I$(top_builddir)/src -I$(top_srcdir)/hl/src
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@ -I$(top_builddir)/fortran/src \
+ -I$(top_builddir)/hl/fortran/src \
+ $(F9XMODFLAG)$(top_builddir)/fortran/src \
+ $(F9XMODFLAG)$(top_builddir)/hl/fortran/src
+AM_LDFLAGS = @AM_LDFLAGS@ $(am__append_1)
AM_MAKEFLAGS = @AM_MAKEFLAGS@
AR = @AR@
@@ -104,21 +128,18 @@ BYTESEX = @BYTESEX@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_VERSION = @CC_VERSION@
-
-# H5_CFLAGS holds flags that should be used as CFLAGS when building hdf5,
-# but which shouldn't be exported to h5cc for building other programs.
-CFLAGS = @CFLAGS@ @H5_CFLAGS@
+CFLAGS = @CFLAGS@
CLEARFILEBUF = @CLEARFILEBUF@
CODESTACK = @CODESTACK@
CONFIG_DATE = @CONFIG_DATE@
CONFIG_MODE = @CONFIG_MODE@
CONFIG_USER = @CONFIG_USER@
CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@ @H5_CPPFLAGS@
+CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@ @H5_CXXFLAGS@
+CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEBUG_PKG = @DEBUG_PKG@
DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
@@ -141,7 +162,7 @@ F9XMODEXT = @F9XMODEXT@
F9XMODFLAG = @F9XMODFLAG@
F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
FC = @FC@
-FCFLAGS = @FCFLAGS@ @H5_FCFLAGS@
+FCFLAGS = @FCFLAGS@
FCFLAGS_f90 = @FCFLAGS_f90@
FCLIBS = @FCLIBS@
FGREP = @FGREP@
@@ -179,6 +200,8 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LINUX_LFS = @LINUX_LFS@
+LIPO = @LIPO@
+LL_PATH = @LL_PATH@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_STATIC_EXEC = @LT_STATIC_EXEC@
@@ -189,13 +212,17 @@ MPE = @MPE@
MPI_GET_SIZE = @MPI_GET_SIZE@
NM = @NM@
NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
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@
PARALLEL = @PARALLEL@
PATH_SEPARATOR = @PATH_SEPARATOR@
@@ -211,12 +238,7 @@ SEARCH = @SEARCH@
SED = @SED@
SETX = @SETX@
SET_MAKE = @SET_MAKE@
-
-# Hardcode SHELL to be /bin/sh. Most machines have this shell, and
-# on at least one machine configure fails to detect its existence (janus).
-# Also, when HDF5 is configured on one machine but run on another,
-# configure's automatic SHELL detection may not work on the build machine.
-SHELL = /bin/sh
+SHELL = @SHELL@
SIZE_T = @SIZE_T@
STATIC_EXEC = @STATIC_EXEC@
STATIC_SHARED = @STATIC_SHARED@
@@ -236,6 +258,7 @@ USE_FILTER_SHUFFLE = @USE_FILTER_SHUFFLE@
USE_FILTER_SZIP = @USE_FILTER_SZIP@
USINGMEMCHECKER = @USINGMEMCHECKER@
VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -258,6 +281,8 @@ build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
+
+# Install directories that automake doesn't know about
docdir = $(exec_prefix)/doc
dvidir = @dvidir@
enable_shared = @enable_shared@
@@ -269,9 +294,7 @@ host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
-
-# Install directories that automake doesn't know about
-includedir = $(exec_prefix)/include
+includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
@@ -291,6 +314,7 @@ sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -338,13 +362,6 @@ TRACE = perl $(top_srcdir)/bin/trace
# Temporary files.
CHECK_CLEANFILES = *.chkexe *.chklog *.clog dsetf[1-4].h5 f1img.h5 \
f1tab.h5
-AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_builddir)/src -I$(top_srcdir)/hl/src
-AM_FCFLAGS = -I$(top_builddir)/fortran/src -I$(top_builddir)/hl/fortran/src $(F9XMODFLAG)$(top_builddir)/fortran/src $(F9XMODFLAG)$(top_builddir)/hl/fortran/src
-
-# Some Fortran compilers can't build shared libraries, so sometimes we
-# need to make sure the Fortran programs link against the static version
-# of the HDF5 library. We do this by passing the -static flag to the linker.
-@FORTRAN_SHARED_CONDITIONAL_FALSE@AM_LDFLAGS = -static
# Our main target, the test programs
TEST_PROG = tstlite tstimage tsttable
@@ -382,14 +399,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
- && exit 0; \
+ ( 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) --foreign hl/fortran/test/Makefile'; \
- cd $(top_srcdir) && \
- $(AUTOMAKE) --foreign hl/fortran/test/Makefile
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/fortran/test/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign hl/fortran/test/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -407,13 +424,16 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
clean-checkPROGRAMS:
- @list='$(check_PROGRAMS)'; for p in $$list; do \
- f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f $$p $$f"; \
- rm -f $$p $$f ; \
- done
+ @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
tstimage$(EXEEXT): $(tstimage_OBJECTS) $(tstimage_DEPENDENCIES)
@rm -f tstimage$(EXEEXT)
$(FCLINK) $(tstimage_OBJECTS) $(tstimage_LDADD) $(LIBS)
@@ -431,13 +451,13 @@ distclean-compile:
-rm -f *.tab.c
.f90.o:
- $(FCCOMPILE) -c -o $@ $<
+ $(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
.f90.obj:
- $(FCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+ $(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'`
.f90.lo:
- $(LTFCCOMPILE) -c -o $@ $<
+ $(LTFCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
mostlyclean-libtool:
-rm -f *.lo
@@ -450,14 +470,14 @@ ID: $(HEADERS) $(SOURCES) $(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; nonemtpy = 1; } \
+ $(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)
- tags=; \
+ set x; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
@@ -465,29 +485,34 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique; \
+ 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)
- tags=; \
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)$$tags$$unique" \
+ test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$tags $$unique
+ $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -508,13 +533,17 @@ distdir: $(DISTFILES)
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 -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
@@ -544,6 +573,7 @@ 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"
@@ -564,6 +594,8 @@ dvi-am:
html: html-am
+html-am:
+
info: info-am
info-am:
@@ -572,18 +604,28 @@ 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
@@ -605,7 +647,7 @@ ps-am:
uninstall-am:
-.MAKE: install-am install-strip
+.MAKE: check-am install-am install-strip
.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \
clean clean-checkPROGRAMS clean-generic clean-libtool ctags \
@@ -827,6 +869,7 @@ check-vfd: $(LIB) $(PROGS) $(TESTS)
HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1; \
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:
diff --git a/hl/fortran/test/tstlite.f90 b/hl/fortran/test/tstlite.f90
index c261ad8..168bb99 100644
--- a/hl/fortran/test/tstlite.f90
+++ b/hl/fortran/test/tstlite.f90
@@ -379,6 +379,7 @@ character(LEN=5), parameter :: dsetname3 = "dset3" ! Dataset name
character(LEN=5), parameter :: dsetname4 = "dset4" ! Dataset name
integer(HID_T) :: file_id ! File identifier
integer(HSIZE_T), dimension(3) :: dims = (/DIM1,DIM2,DIM3/) ! Dataset dimensions
+integer(HSIZE_T), dimension(3) :: dimsr ! Dataset dimensions
integer, dimension(DIM1*DIM2*DIM3) :: buf ! Data buffer
integer, dimension(DIM1*DIM2*DIM3) :: bufr ! Data buffer
integer, dimension(DIM1,DIM2,DIM3) :: buf2 ! Data buffer
@@ -390,6 +391,8 @@ double precision, dimension(DIM1,DIM2,DIM3) :: buf4r ! Data buffer
integer :: rank = 3 ! Dataset rank
integer :: errcode ! Error flag
integer :: i, j, k, n ! general purpose integers
+integer :: type_class
+integer(SIZE_T) :: type_size
call test_begin(' Make/Read datasets (3D) ')
@@ -537,6 +540,18 @@ do i = 1, dims(1)
end do
end do
+call h5ltget_dataset_info_f(file_id,dsetname4,dimsr,type_class,type_size,errcode )
+
+!
+! compare dimensions
+!
+do i = 1, rank
+ if ( dimsr(i) .ne. dims(i) ) then
+ print *, 'dimensions differ '
+ stop
+ endif
+end do
+
!
! Close the file.
!
@@ -574,6 +589,7 @@ character(LEN=5), parameter :: dsetname1 = "dset1" ! Dataset name
character(LEN=5), parameter :: dsetname2 = "dset2" ! Dataset name
character(LEN=5), parameter :: dsetname3 = "dset3" ! Dataset name
character(LEN=5), parameter :: dsetname4 = "dset4" ! Dataset name
+character(LEN=5), parameter :: dsetname5 = "dset5" ! Dataset name
integer(HSIZE_T), dimension(1) :: dims = (/DIM1/) ! Dataset dimensions
integer(HSIZE_T), dimension(1) :: dimsr ! Dataset dimensions
integer :: rank = 1 ! Dataset rank
@@ -701,7 +717,41 @@ end do
call passed()
-call test_begin(' Get dataset dimensions ')
+
+!-------------------------------------------------------------------------
+! string
+!-------------------------------------------------------------------------
+
+call test_begin(' Make/Read datasets (string) ')
+
+
+!
+! write dataset.
+!
+call h5ltmake_dataset_string_f(file_id, dsetname5, buf1, errcode)
+
+!
+! read dataset.
+!
+call h5ltread_dataset_string_f(file_id, dsetname5, buf1r, errcode)
+
+!
+! compare read and write buffers.
+!
+if ( buf1 .ne. buf1r ) then
+ print *, 'read buffer differs from write buffer'
+ print *, buf1, ' and ', buf1r
+ stop
+endif
+
+call passed()
+
+
+
+
+
+
+call test_begin(' Get dataset dimensions/info ')
!-------------------------------------------------------------------------
! h5ltget_dataset_ndims_f
@@ -713,20 +763,39 @@ if ( rankr .ne. rank ) then
stop
endif
-call passed()
!-------------------------------------------------------------------------
-! test find dataset function
+! test h5ltfind_dataset_f function
!-------------------------------------------------------------------------
-call test_begin(' Find dataset ')
+has = h5ltfind_dataset_f(file_id,dsetname4)
+if ( has .ne. 1 ) then
+ print *, 'h5ltfind_dataset_f return error'
+ stop
+endif
+
+!-------------------------------------------------------------------------
+! test h5ltget_dataset_info_f function
+!-------------------------------------------------------------------------
-!has = h5ltfind_dataset_f(file_id,dsetname4)
-!if ( has .ne. 1 ) then
-! print *, 'h5ltfind_dataset_f return error'
-! stop
-!endif
+
+call h5ltget_dataset_info_f(file_id,dsetname4,dimsr,type_class,type_size,errcode )
+
+!
+! compare dimensions
+!
+do i = 1, rank
+ if ( dimsr(i) .ne. dims(i) ) then
+ print *, 'dimensions differ '
+ stop
+ endif
+end do
+
+if ( type_class .ne. 1 ) then ! H5T_FLOAT
+ print *, 'wrong type class '
+ stop
+endif
!
! Close the file.
@@ -756,13 +825,14 @@ use HDF5 ! module of HDF5 library
implicit none
-character(len=9), parameter :: filename = "dsetf4.h5"! File name
+character(len=9), parameter :: filename = "dsetf5.h5"! File name
integer(HID_T) :: file_id ! File identifier
integer, parameter :: DIM1 = 10; ! Dimension of array
character(LEN=5), parameter :: attrname1 = "attr1" ! Attribute name
character(LEN=5), parameter :: attrname2 = "attr2" ! Attribute name
character(LEN=5), parameter :: attrname3 = "attr3" ! Attribute name
character(LEN=5), parameter :: attrname4 = "attr4" ! Attribute name
+character(LEN=5), parameter :: attrname5 = "attr5" ! Attribute name
character(LEN=8), parameter :: buf1 = "mystring" ! Data buffer
character(LEN=8) :: bufr1 ! Data buffer
integer, dimension(DIM1) :: buf2 ! Data buffer
@@ -901,11 +971,42 @@ end do
call passed()
+
+!-------------------------------------------------------------------------
+! string
+!-------------------------------------------------------------------------
+
+call test_begin(' Set/Get attributes string ')
+
+
+!
+! write attribute.
+!
+call h5ltset_attribute_string_f(file_id,dsetname1,attrname5,buf1,errcode)
+
+!
+! read attribute.
+!
+call h5ltget_attribute_string_f(file_id,dsetname1,attrname5,bufr1,errcode)
+
+!
+! compare read and write buffers.
+!
+
+if ( buf1 .ne. bufr1 ) then
+ print *, 'read buffer differs from write buffer'
+ print *, buf1, ' and ', bufr1
+ stop
+ endif
+
+
+call passed()
+
!-------------------------------------------------------------------------
! get attribute rank
!-------------------------------------------------------------------------
-call test_begin(' Get attribute rank ')
+call test_begin(' Get attribute rank/info ')
call h5ltget_attribute_ndims_f(file_id,dsetname1,attrname2,rankr,errcode)
@@ -916,6 +1017,19 @@ if ( rankr .ne. 1 ) then
endif
+call h5ltget_attribute_info_f(file_id,dsetname1,attrname2,dimsr,type_class,type_size,errcode)
+
+!
+! compare dimensions
+!
+do i = 1, rank
+ if ( dimsr(i) .ne. dims(i) ) then
+ print *, 'dimensions differ '
+ stop
+ endif
+end do
+
+
!
! Close the file.
!
diff --git a/hl/src/COPYING b/hl/src/COPYING
index ef0cbaf..6903daf 100755
--- a/hl/src/COPYING
+++ b/hl/src/COPYING
@@ -1,5 +1,5 @@
- Copyright by The HDF Group (THG) and
+ Copyright by The HDF Group and
The Board of Trustees of the University of Illinois.
All rights reserved.
diff --git a/hl/src/H5DS.c b/hl/src/H5DS.c
index 08345c6..e15c132 100644
--- a/hl/src/H5DS.c
+++ b/hl/src/H5DS.c
@@ -1,17 +1,17 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
- * terms governing use, modification, and redistribution, is contained in *
- * the files COPYING and Copyright.html. COPYING can be found at the root *
- * of the source code distribution tree; Copyright.html can be found at the *
- * root level of an installed copy of the electronic HDF5 document set and *
- * is linked from the top-level documents page. It can also be found at *
- * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+* Copyright by The HDF Group. *
+* Copyright by the Board of Trustees of the University of Illinois. *
+* All rights reserved. *
+* *
+* This file is part of HDF5. The full HDF5 copyright notice, including *
+* terms governing use, modification, and redistribution, is contained in *
+* the files COPYING and Copyright.html. COPYING can be found at the root *
+* of the source code distribution tree; Copyright.html can be found at the *
+* root level of an installed copy of the electronic HDF5 document set and *
+* is linked from the top-level documents page. It can also be found at *
+* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
+* access to either file, you may request a copy from help@hdfgroup.org. *
+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <assert.h>
#include <stdlib.h>
@@ -24,2043 +24,2249 @@
/*-------------------------------------------------------------------------
- * Function: H5DSset_scale
- *
- * Purpose: The dataset DSID is converted to a Dimension Scale dataset.
- * Creates the CLASS attribute, set to the value "DIMENSION_SCALE"
- * and an empty REFERENCE_LIST attribute.
- * If DIMNAME is specified, then an attribute called NAME is created,
- * with the value DIMNAME.
- *
- * Return: Success: SUCCEED, Failure: FAIL
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: January 04, 2005
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5DSset_scale
+*
+* Purpose: The dataset DSID is converted to a Dimension Scale dataset.
+* Creates the CLASS attribute, set to the value "DIMENSION_SCALE"
+* and an empty REFERENCE_LIST attribute.
+* If DIMNAME is specified, then an attribute called NAME is created,
+* with the value DIMNAME.
+*
+* Return: Success: SUCCEED, Failure: FAIL
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: January 04, 2005
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5DSset_scale(hid_t dsid,
const char *dimname)
{
- int has_dimlist;
- H5I_type_t it;
+ int has_dimlist;
+ H5I_type_t it;
-/*-------------------------------------------------------------------------
- * parameter checking
- *-------------------------------------------------------------------------
- */
- /* get ID type */
- if ((it = H5Iget_type(dsid)) < 0)
- return FAIL;
+ /*-------------------------------------------------------------------------
+ * parameter checking
+ *-------------------------------------------------------------------------
+ */
+ /* get ID type */
+ if ((it = H5Iget_type(dsid)) < 0)
+ return FAIL;
- if (H5I_DATASET!=it)
- return FAIL;
+ if (H5I_DATASET!=it)
+ return FAIL;
-/*-------------------------------------------------------------------------
- * check if the dataset is a dataset wich has references to dimension scales
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * check if the dataset is a dataset wich has references to dimension scales
+ *-------------------------------------------------------------------------
+ */
- /* try to find the attribute "DIMENSION_LIST" */
- if ((has_dimlist = H5LT_find_attribute(dsid,DIMENSION_LIST)) < 0)
- return FAIL;
+ /* try to find the attribute "DIMENSION_LIST" */
+ if ((has_dimlist = H5LT_find_attribute(dsid,DIMENSION_LIST)) < 0)
+ return FAIL;
- if (has_dimlist == 1)
- return FAIL;
+ if (has_dimlist == 1)
+ return FAIL;
-/*-------------------------------------------------------------------------
- * write the standard attributes for a Dimension Scale dataset
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * write the standard attributes for a Dimension Scale dataset
+ *-------------------------------------------------------------------------
+ */
- if (H5LT_set_attribute_string(dsid,"CLASS",DIMENSION_SCALE_CLASS) < 0)
- return FAIL;
+ if (H5LT_set_attribute_string(dsid,"CLASS",DIMENSION_SCALE_CLASS) < 0)
+ return FAIL;
- if (dimname!=NULL)
- {
- if (H5LT_set_attribute_string(dsid,"NAME",dimname) < 0)
- return FAIL;
- }
+ if (dimname!=NULL)
+ {
+ if (H5LT_set_attribute_string(dsid,"NAME",dimname) < 0)
+ return FAIL;
+ }
- return SUCCEED;
+ return SUCCEED;
}
/*-------------------------------------------------------------------------
- * Function: H5DSattach_scale
- *
- * Purpose: Define Dimension Scale DSID to be associated with dimension IDX
- * of Dataset DID. Entries are created in the DIMENSION_LIST and
- * REFERENCE_LIST attributes.
- *
- * Return:
- * Success: SUCCEED
- * Failure: FAIL
- *
- * Fails if: Bad arguments
- * If DSID is not a Dimension Scale
- * If DID is a Dimension Scale (A Dimension Scale cannot have scales)
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: December 20, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5DSattach_scale
+*
+* Purpose: Define Dimension Scale DSID to be associated with dimension IDX
+* of Dataset DID. Entries are created in the DIMENSION_LIST and
+* REFERENCE_LIST attributes.
+*
+* Return:
+* Success: SUCCEED
+* Failure: FAIL
+*
+* Fails if: Bad arguments
+* If DSID is not a Dimension Scale
+* If DID is a Dimension Scale (A Dimension Scale cannot have scales)
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: December 20, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5DSattach_scale(hid_t did,
hid_t dsid,
unsigned int idx)
{
- int has_dimlist;
- int has_reflist;
- int is_ds;
- hssize_t nelmts;
- hid_t sid; /* space ID */
- hid_t tid = -1; /* attribute type ID */
- hid_t aid = -1; /* attribute ID */
- int rank; /* rank of dataset */
- hsize_t *dims; /* dimension of the "REFERENCE_LIST" array */
- ds_list_t dsl; /* attribute data in the DS pointing to the dataset */
- ds_list_t *dsbuf; /* array of attribute data in the DS pointing to the dataset */
- hobj_ref_t ref_to_ds; /* reference to the DS */
- hobj_ref_t ref_j; /* iterator reference */
- hvl_t *buf; /* VL buffer to store in the attribute */
- hid_t dsid_j; /* DS dataset ID in DIMENSION_LIST */
- H5O_info_t oi1, oi2;
- H5I_type_t it1, it2;
- int i, len;
- int found_ds=0;
-
-/*-------------------------------------------------------------------------
- * parameter checking
- *-------------------------------------------------------------------------
- */
- /* the dataset cannot be a DS dataset */
- if ((H5DSis_scale(did))==1)
- return FAIL;
-
- /* get info for the dataset in the parameter list */
- if(H5Oget_info(did, &oi1) < 0)
- return FAIL;
-
- /* get info for the scale in the parameter list */
- if(H5Oget_info(dsid, &oi2) < 0)
- return FAIL;
-
- /* same object, not valid */
- if(oi1.fileno == oi2.fileno && oi1.addr == oi2.addr)
- return FAIL;
-
- /* get ID type */
- if ((it1 = H5Iget_type(did)) < 0)
- return FAIL;
- if ((it2 = H5Iget_type(dsid)) < 0)
- return FAIL;
-
- if (H5I_DATASET!=it1 || H5I_DATASET!=it2)
- return FAIL;
-
- /* the DS dataset cannot have dimension scales */
- if (H5LT_find_attribute(dsid,DIMENSION_LIST)==1)
- return FAIL;
-
- /* check if the dataset is a "reserved" dataset (image, table) */
- if (H5DS_is_reserved(did)==1)
- return FAIL;
-
-
-/*-------------------------------------------------------------------------
- * The dataset may or may not have the associated DS attribute
- * First we try to open to see if it is already there; if not, it is created.
- * If it exists, the array of references is extended to hold the reference
- * to the new DS
- *-------------------------------------------------------------------------
- */
-
- /* get dataset space */
- if ((sid = H5Dget_space(did)) < 0)
- return FAIL;
-
- /* get rank */
- if ((rank=H5Sget_simple_extent_ndims(sid)) < 0)
- goto out;
-
- /* scalar rank */
- if (rank==0)
- rank=1;
-
- /* close dataset space */
- if (H5Sclose(sid) < 0)
- return FAIL;
-
- /* parameter range checking */
- if (idx>(unsigned)rank-1)
- return FAIL;
-
-/*-------------------------------------------------------------------------
- * two references are created: one to the DS, saved in "DIMENSION_LIST"
- * and one to the dataset, saved in "REFERENCE_LIST"
- *-------------------------------------------------------------------------
- */
- /* create a reference for the >>DS<< dataset */
- if (H5Rcreate(&ref_to_ds,dsid,".",H5R_OBJECT,-1) < 0)
- return FAIL;
-
- /* create a reference for the >>data<< dataset */
- if (H5Rcreate(&dsl.ref,did,".",H5R_OBJECT,-1) < 0)
- return FAIL;
-
- /* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */
- if ((has_dimlist = H5LT_find_attribute(did,DIMENSION_LIST)) < 0)
- return FAIL;
-
-/*-------------------------------------------------------------------------
- * it does not exist. we create the attribute and its reference data
- *-------------------------------------------------------------------------
- */
- if (has_dimlist == 0)
- {
- /* create one entry array */
- dims = (hsize_t*) malloc (1 * sizeof (hsize_t));
-
- if(dims == NULL)
- return FAIL;
-
- dims[0] = rank;
-
- /* space for the attribute */
- if((sid = H5Screate_simple(1, dims, NULL)) < 0)
- return FAIL;
-
- /* create the type for the attribute "DIMENSION_LIST" */
- if((tid = H5Tvlen_create(H5T_STD_REF_OBJ)) < 0)
- goto out;
-
- /* create the attribute */
- if((aid = H5Acreate2(did, DIMENSION_LIST, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
-
- /* allocate and initialize the VL */
- buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
-
- if(buf == NULL)
- goto out;
-
- for(i = 0; i < rank; i++) {
- buf[i].len = 0;
- buf[i].p = NULL;
- }
-
- /* store the REF information in the index of the dataset that has the DS */
- buf[idx].len = 1;
- buf[idx].p = malloc( 1 * sizeof(hobj_ref_t));
- ((hobj_ref_t *)buf[idx].p)[0] = ref_to_ds;
-
- /* write the attribute with the reference */
- if (H5Awrite(aid,tid,buf) < 0)
- goto out;
-
- /* close */
- if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf) < 0)
- goto out;
- if (H5Sclose(sid) < 0)
- goto out;
- if (H5Tclose(tid) < 0)
- goto out;
- if (H5Aclose(aid) < 0)
- goto out;
-
- if (dims)
- free(dims);
- if (buf)
- free(buf);
-
- }
-
-/*-------------------------------------------------------------------------
- * the attribute already exists, open it, extend the buffer,
- * and insert the new reference
- *-------------------------------------------------------------------------
- */
-
- else if ( has_dimlist == 1 )
- {
- if((aid = H5Aopen(did, DIMENSION_LIST, H5P_DEFAULT)) < 0)
- goto out;
-
- if((tid = H5Aget_type(aid)) < 0)
- goto out;
-
- if((sid = H5Aget_space(aid)) < 0)
- goto out;
-
- /* allocate and initialize the VL */
- buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
-
- if(buf == NULL)
- goto out;
-
- /* read */
- if(H5Aread(aid, tid, buf) < 0)
- goto out;
-
- /* check to avoid inserting duplicates. it is not FAIL, just do nothing */
- /* iterate all the REFs in this dimension IDX */
- for (i=0; i<(int)buf[idx].len; i++)
- {
- /* get the reference */
- ref_j = ((hobj_ref_t *)buf[idx].p)[i];
-
- /* get the scale id for this REF */
- if ((dsid_j = H5Rdereference(did,H5R_OBJECT,&ref_j)) < 0)
- goto out;
-
- /* get info for DS in the parameter list */
- if(H5Oget_info(dsid, &oi1) < 0)
- goto out;
-
- /* get info for this DS */
- if(H5Oget_info(dsid_j, &oi2) < 0)
- goto out;
-
- /* same object, so this DS scale is already in this DIM IDX */
- if(oi1.fileno == oi2.fileno && oi1.addr == oi2.addr)
- found_ds = 1;
-
- /* close the dereferenced dataset */
- if (H5Dclose(dsid_j) < 0)
- goto out;
- }
-
- if (found_ds==0)
- {
- /* we are adding one more DS to this dimension */
- if ( buf[idx].len > 0 )
- {
- buf[idx].len++;
- len = buf[idx].len;
- buf[idx].p = realloc( buf[idx].p, len * sizeof(hobj_ref_t));
- ((hobj_ref_t *)buf[idx].p)[ len-1 ] = ref_to_ds;
- }
- else
- {
- /* store the REF information in the index of the dataset that has the DS */
- buf[idx].len = 1;
- buf[idx].p = malloc( 1 * sizeof(hobj_ref_t));
- ((hobj_ref_t *)buf[idx].p)[0] = ref_to_ds;
- }
- }
-
- /* write the attribute with the new references */
- if (H5Awrite(aid,tid,buf) < 0)
- goto out;
-
- /* close */
- if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf) < 0)
- goto out;
- if (H5Sclose(sid) < 0)
- goto out;
- if (H5Tclose(tid) < 0)
- goto out;
- if (H5Aclose(aid) < 0)
- goto out;
- if (buf)
- free(buf);
-
- } /* has_dimlist */
-
-/*-------------------------------------------------------------------------
- * save DS info on the >>DS<< dataset
- *-------------------------------------------------------------------------
- */
-
- /* try to find the attribute "REFERENCE_LIST" on the >>DS<< dataset */
- if ((has_reflist = H5LT_find_attribute(dsid,REFERENCE_LIST)) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * it does not exist. we create the attribute and its reference data
- *-------------------------------------------------------------------------
- */
- if (has_reflist == 0)
- {
- /* create one entry array */
- dims = (hsize_t*) malloc (1 * sizeof (hsize_t));
-
- if (dims == NULL)
- goto out;
-
- dims[0] = 1;
-
- /* space for the attribute */
- if ((sid = H5Screate_simple(1,dims,NULL)) < 0)
- goto out;
-
- /* create the compound datatype for the attribute "REFERENCE_LIST" */
- if((tid = H5Tcreate(H5T_COMPOUND, sizeof(ds_list_t))) < 0)
- goto out;
-
- /* insert reference field */
- if(H5Tinsert(tid, "dataset", HOFFSET(ds_list_t,ref), H5T_STD_REF_OBJ) < 0)
- goto out;
-
- /* insert dimension idx of the dataset field */
- if(H5Tinsert(tid, "dimension", HOFFSET(ds_list_t, dim_idx), H5T_NATIVE_INT) < 0)
- goto out;
-
- /* create the attribute */
- if((aid = H5Acreate2(dsid, REFERENCE_LIST, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
-
- /* store the IDX information */
- dsl.dim_idx = idx;
-
- /* write the attribute with the reference */
- if(H5Awrite(aid, tid, &dsl) < 0)
- goto out;
-
- /* close */
- if(H5Sclose(sid) < 0)
- goto out;
- if(H5Tclose(tid) < 0)
- goto out;
- if(H5Aclose(aid) < 0)
- goto out;
-
- if(dims)
- free(dims);
- }
-
-/*-------------------------------------------------------------------------
- * the "REFERENCE_LIST" array already exists, open it and extend it
- *-------------------------------------------------------------------------
- */
-
- else if(has_reflist == 1)
- {
- if((aid = H5Aopen(dsid, REFERENCE_LIST, H5P_DEFAULT)) < 0)
- goto out;
-
- if((tid = H5Aget_type(aid)) < 0)
- goto out;
-
- /* get and save the old reference(s) */
- if((sid = H5Aget_space(aid)) < 0)
- goto out;
-
- if((nelmts = H5Sget_simple_extent_npoints(sid)) < 0)
- goto out;
-
- nelmts++;
-
- dsbuf = malloc((size_t)nelmts * sizeof(ds_list_t));
-
- if (dsbuf == NULL)
- goto out;
-
- if (H5Aread(aid,tid,dsbuf) < 0)
- goto out;
-
- /* close */
- if (H5Sclose(sid) < 0)
- goto out;
- if (H5Aclose(aid) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * create a new attribute
- *-------------------------------------------------------------------------
- */
-
- /* the attribute must be deleted, in order to the new one can reflect the changes*/
- if(H5Adelete(dsid, REFERENCE_LIST) < 0)
- goto out;
-
- /* store the IDX information (index of the dataset that has the DS) */
- dsl.dim_idx = idx;
- dsbuf[nelmts-1] = dsl;
-
- /* create a new data space for the new references array */
- dims = (hsize_t *)malloc((size_t)nelmts * sizeof(hsize_t));
- if(dims == NULL)
- goto out;
- dims[0] = nelmts;
-
- if((sid = H5Screate_simple(1, dims, NULL)) < 0)
- goto out;
-
- if(dims)
- free(dims);
-
- /* create the attribute again with the changes of space */
- if((aid = H5Acreate2(dsid, REFERENCE_LIST, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
+ int has_dimlist;
+ int has_reflist;
+ int is_ds;
+ hssize_t nelmts;
+ hid_t sid; /* space ID */
+ hid_t tid = -1; /* attribute type ID */
+ hid_t ntid = -1; /* attribute native type ID */
+ hid_t aid = -1; /* attribute ID */
+ int rank; /* rank of dataset */
+ hsize_t *dims=NULL; /* dimension of the "REFERENCE_LIST" array */
+ ds_list_t dsl; /* attribute data in the DS pointing to the dataset */
+ ds_list_t *dsbuf=NULL; /* array of attribute data in the DS pointing to the dataset */
+ hobj_ref_t ref_to_ds; /* reference to the DS */
+ hobj_ref_t ref_j; /* iterator reference */
+ hvl_t *buf=NULL; /* VL buffer to store in the attribute */
+ hid_t dsid_j; /* DS dataset ID in DIMENSION_LIST */
+ H5O_info_t oi1, oi2;
+ H5I_type_t it1, it2;
+ int i, len;
+ int found_ds=0;
+ htri_t is_scale;
+
+ /*-------------------------------------------------------------------------
+ * parameter checking
+ *-------------------------------------------------------------------------
+ */
+
+ if ((is_scale = H5DSis_scale(did)) < 0)
+ return FAIL;
+
+ /* the dataset cannot be a DS dataset */
+ if ( is_scale == 1)
+ return FAIL;
+
+ /* get info for the dataset in the parameter list */
+ if(H5Oget_info(did, &oi1) < 0)
+ return FAIL;
+
+ /* get info for the scale in the parameter list */
+ if(H5Oget_info(dsid, &oi2) < 0)
+ return FAIL;
+
+ /* same object, not valid */
+ if(oi1.fileno == oi2.fileno && oi1.addr == oi2.addr)
+ return FAIL;
+
+ /* get ID type */
+ if ((it1 = H5Iget_type(did)) < 0)
+ return FAIL;
+ if ((it2 = H5Iget_type(dsid)) < 0)
+ return FAIL;
+
+ if (H5I_DATASET!=it1 || H5I_DATASET!=it2)
+ return FAIL;
+
+ /* the DS dataset cannot have dimension scales */
+ if (H5LT_find_attribute(dsid,DIMENSION_LIST)==1)
+ return FAIL;
+
+ /* check if the dataset is a "reserved" dataset (image, table) */
+ if (H5DS_is_reserved(did)==1)
+ return FAIL;
+
+
+ /*-------------------------------------------------------------------------
+ * The dataset may or may not have the associated DS attribute
+ * First we try to open to see if it is already there; if not, it is created.
+ * If it exists, the array of references is extended to hold the reference
+ * to the new DS
+ *-------------------------------------------------------------------------
+ */
+
+ /* get dataset space */
+ if ((sid = H5Dget_space(did)) < 0)
+ return FAIL;
+
+ /* get rank */
+ if ((rank=H5Sget_simple_extent_ndims(sid)) < 0)
+ goto out;
+
+ /* scalar rank */
+ if (rank==0)
+ rank=1;
+
+ /* close dataset space */
+ if (H5Sclose(sid) < 0)
+ return FAIL;
+
+ /* parameter range checking */
+ if (idx>(unsigned)rank-1)
+ return FAIL;
+
+ /*-------------------------------------------------------------------------
+ * two references are created: one to the DS, saved in "DIMENSION_LIST"
+ * and one to the dataset, saved in "REFERENCE_LIST"
+ *-------------------------------------------------------------------------
+ */
+ /* create a reference for the >>DS<< dataset */
+ if (H5Rcreate(&ref_to_ds,dsid,".",H5R_OBJECT,-1) < 0)
+ return FAIL;
+
+ /* create a reference for the >>data<< dataset */
+ if (H5Rcreate(&dsl.ref,did,".",H5R_OBJECT,-1) < 0)
+ return FAIL;
+
+ /* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */
+ if ((has_dimlist = H5LT_find_attribute(did,DIMENSION_LIST)) < 0)
+ return FAIL;
+
+ /*-------------------------------------------------------------------------
+ * it does not exist. we create the attribute and its reference data
+ *-------------------------------------------------------------------------
+ */
+ if (has_dimlist == 0)
+ {
+ /* create one entry array */
+ dims = (hsize_t*) malloc (1 * sizeof (hsize_t));
+
+ if(dims == NULL)
+ return FAIL;
+
+ dims[0] = rank;
+
+ /* space for the attribute */
+ if((sid = H5Screate_simple(1, dims, NULL)) < 0)
+ return FAIL;
+
+ /* create the type for the attribute "DIMENSION_LIST" */
+ if((tid = H5Tvlen_create(H5T_STD_REF_OBJ)) < 0)
+ goto out;
+
+ /* create the attribute */
+ if((aid = H5Acreate2(did, DIMENSION_LIST, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* allocate and initialize the VL */
+ buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
+
+ if(buf == NULL)
+ goto out;
+
+ for(i = 0; i < rank; i++) {
+ buf[i].len = 0;
+ buf[i].p = NULL;
+ }
+
+ /* store the REF information in the index of the dataset that has the DS */
+ buf[idx].len = 1;
+ buf[idx].p = malloc( 1 * sizeof(hobj_ref_t));
+ ((hobj_ref_t *)buf[idx].p)[0] = ref_to_ds;
+
+ /* write the attribute with the reference */
+ if (H5Awrite(aid,tid,buf) < 0)
+ goto out;
+
+ /* close */
+ if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf) < 0)
+ goto out;
+ if (H5Sclose(sid) < 0)
+ goto out;
+ if (H5Tclose(tid) < 0)
+ goto out;
+ if (H5Aclose(aid) < 0)
+ goto out;
+
+ if (dims)
+ {
+ free(dims);
+ dims = NULL;
+ }
+ if (buf)
+ {
+ free(buf);
+ buf = NULL;
+ }
- /* write the attribute with the new references */
- if(H5Awrite(aid, tid, dsbuf) < 0)
- goto out;
+ }
- /* close */
- if(H5Sclose(sid) < 0)
- goto out;
- if(H5Tclose(tid) < 0)
- goto out;
- if(H5Aclose(aid) < 0)
- goto out;
+ /*-------------------------------------------------------------------------
+ * the attribute already exists, open it, extend the buffer,
+ * and insert the new reference
+ *-------------------------------------------------------------------------
+ */
- if (dsbuf)
- free(dsbuf);
+ else if ( has_dimlist == 1 )
+ {
+ if((aid = H5Aopen(did, DIMENSION_LIST, H5P_DEFAULT)) < 0)
+ goto out;
+
+ if((tid = H5Aget_type(aid)) < 0)
+ goto out;
+
+ if((sid = H5Aget_space(aid)) < 0)
+ goto out;
+
+ /* allocate and initialize the VL */
+ buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
+
+ if(buf == NULL)
+ goto out;
+
+ /* read */
+ if(H5Aread(aid, tid, buf) < 0)
+ goto out;
+
+ /* check to avoid inserting duplicates. it is not FAIL, just do nothing */
+ /* iterate all the REFs in this dimension IDX */
+ for (i=0; i<(int)buf[idx].len; i++)
+ {
+ /* get the reference */
+ ref_j = ((hobj_ref_t *)buf[idx].p)[i];
+
+ /* get the scale id for this REF */
+ if ((dsid_j = H5Rdereference(did,H5R_OBJECT,&ref_j)) < 0)
+ goto out;
+
+ /* get info for DS in the parameter list */
+ if(H5Oget_info(dsid, &oi1) < 0)
+ goto out;
+
+ /* get info for this DS */
+ if(H5Oget_info(dsid_j, &oi2) < 0)
+ goto out;
+
+ /* same object, so this DS scale is already in this DIM IDX */
+ if(oi1.fileno == oi2.fileno && oi1.addr == oi2.addr)
+ found_ds = 1;
+
+ /* close the dereferenced dataset */
+ if (H5Dclose(dsid_j) < 0)
+ goto out;
+ }
+
+ if (found_ds==0)
+ {
+ /* we are adding one more DS to this dimension */
+ if ( buf[idx].len > 0 )
+ {
+ buf[idx].len++;
+ len = buf[idx].len;
+ buf[idx].p = realloc( buf[idx].p, len * sizeof(hobj_ref_t));
+ ((hobj_ref_t *)buf[idx].p)[ len-1 ] = ref_to_ds;
+ }
+ else
+ {
+ /* store the REF information in the index of the dataset that has the DS */
+ buf[idx].len = 1;
+ buf[idx].p = malloc( 1 * sizeof(hobj_ref_t));
+ ((hobj_ref_t *)buf[idx].p)[0] = ref_to_ds;
+ }
+ }
+
+ /* write the attribute with the new references */
+ if (H5Awrite(aid,tid,buf) < 0)
+ goto out;
+
+ /* close */
+ if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf) < 0)
+ goto out;
+ if (H5Sclose(sid) < 0)
+ goto out;
+ if (H5Tclose(tid) < 0)
+ goto out;
+ if (H5Aclose(aid) < 0)
+ goto out;
+ if (buf)
+ {
+ free(buf);
+ buf = NULL;
+ }
+
+ } /* has_dimlist */
+
+ /*-------------------------------------------------------------------------
+ * save DS info on the >>DS<< dataset
+ *-------------------------------------------------------------------------
+ */
+
+ /* try to find the attribute "REFERENCE_LIST" on the >>DS<< dataset */
+ if ((has_reflist = H5LT_find_attribute(dsid,REFERENCE_LIST)) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * it does not exist. we create the attribute and its reference data
+ *-------------------------------------------------------------------------
+ */
+ if (has_reflist == 0)
+ {
+ /* create one entry array */
+ dims = (hsize_t*) malloc (1 * sizeof (hsize_t));
+
+ if (dims == NULL)
+ goto out;
+
+ dims[0] = 1;
+
+ /* space for the attribute */
+ if ((sid = H5Screate_simple(1,dims,NULL)) < 0)
+ goto out;
+
+ /* create the compound datatype for the attribute "REFERENCE_LIST" */
+ if((tid = H5Tcreate(H5T_COMPOUND, sizeof(ds_list_t))) < 0)
+ goto out;
+
+ /* insert reference field */
+ if(H5Tinsert(tid, "dataset", HOFFSET(ds_list_t,ref), H5T_STD_REF_OBJ) < 0)
+ goto out;
+
+ /* insert dimension idx of the dataset field */
+ if(H5Tinsert(tid, "dimension", HOFFSET(ds_list_t, dim_idx), H5T_NATIVE_INT) < 0)
+ goto out;
+
+ /* create the attribute */
+ if((aid = H5Acreate2(dsid, REFERENCE_LIST, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* store the IDX information */
+ dsl.dim_idx = idx;
+
+ /* write the attribute with the reference */
+ if(H5Awrite(aid, tid, &dsl) < 0)
+ goto out;
+
+ /* close */
+ if(H5Sclose(sid) < 0)
+ goto out;
+ if(H5Tclose(tid) < 0)
+ goto out;
+ if(H5Aclose(aid) < 0)
+ goto out;
+
+ if(dims)
+ {
+ free(dims);
+ dims = NULL;
+ }
+ }
- } /* has_reflist */
+ /*-------------------------------------------------------------------------
+ * the "REFERENCE_LIST" array already exists, open it and extend it
+ *-------------------------------------------------------------------------
+ */
-/*-------------------------------------------------------------------------
- * write the standard attributes for a Dimension Scale dataset
- *-------------------------------------------------------------------------
- */
+ else if(has_reflist == 1)
+ {
+ if((aid = H5Aopen(dsid, REFERENCE_LIST, H5P_DEFAULT)) < 0)
+ goto out;
+
+ if((tid = H5Aget_type(aid)) < 0)
+ goto out;
+
+ if((ntid = H5Tget_native_type(tid, H5T_DIR_DEFAULT)) < 0)
+ goto out;
+
+ /* get and save the old reference(s) */
+ if((sid = H5Aget_space(aid)) < 0)
+ goto out;
+
+ if((nelmts = H5Sget_simple_extent_npoints(sid)) < 0)
+ goto out;
+
+ nelmts++;
+
+ dsbuf = (ds_list_t*) malloc((size_t)nelmts * sizeof(ds_list_t));
+
+ if (dsbuf == NULL)
+ goto out;
+
+ if (H5Aread(aid,ntid,dsbuf) < 0)
+ goto out;
+
+ /* close */
+ if (H5Sclose(sid) < 0)
+ goto out;
+ if (H5Aclose(aid) < 0)
+ goto out;
+ if (H5Tclose(ntid) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * create a new attribute
+ *-------------------------------------------------------------------------
+ */
+
+ /* the attribute must be deleted, in order to the new one can reflect the changes*/
+ if(H5Adelete(dsid, REFERENCE_LIST) < 0)
+ goto out;
+
+ /* store the IDX information (index of the dataset that has the DS) */
+ dsl.dim_idx = idx;
+ dsbuf[nelmts-1] = dsl;
+
+ /* create a new data space for the new references array */
+ dims = (hsize_t *)malloc((size_t)nelmts * sizeof(hsize_t));
+ if(dims == NULL)
+ goto out;
+ dims[0] = nelmts;
+
+ if((sid = H5Screate_simple(1, dims, NULL)) < 0)
+ goto out;
+
+ if (dims)
+ {
+ free(dims);
+ dims = NULL;
+ }
+
+ /* create the attribute again with the changes of space */
+ if((aid = H5Acreate2(dsid, REFERENCE_LIST, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* write the attribute with the new references */
+ if(H5Awrite(aid, tid, dsbuf) < 0)
+ goto out;
+
+ /* close */
+ if(H5Sclose(sid) < 0)
+ goto out;
+ if(H5Tclose(tid) < 0)
+ goto out;
+ if(H5Aclose(aid) < 0)
+ goto out;
+
+ if (dsbuf)
+ {
+ free(dsbuf);
+ dsbuf = NULL;
+ }
+
+ } /* has_reflist */
+
+ /*-------------------------------------------------------------------------
+ * write the standard attributes for a Dimension Scale dataset
+ *-------------------------------------------------------------------------
+ */
+
+ if ((is_ds=H5DSis_scale(dsid)) < 0)
+ return FAIL;
+
+ if (is_ds == 0 )
+ {
+ if (H5LT_set_attribute_string(dsid,"CLASS",DIMENSION_SCALE_CLASS) < 0)
+ return FAIL;
+ }
- if ((is_ds=H5DSis_scale(dsid)) < 0)
- return FAIL;
+ return SUCCEED;
- if (is_ds == 0 )
- {
- if (H5LT_set_attribute_string(dsid,"CLASS",DIMENSION_SCALE_CLASS) < 0)
- return FAIL;
- }
+ /* error zone */
+out:
- return SUCCEED;
+ if (dims)
+ {
+ free(dims);
+ dims = NULL;
+ }
+ if (buf)
+ {
+ free(buf);
+ buf = NULL;
+ }
+ if (dsbuf)
+ {
+ free(dsbuf);
+ dsbuf = NULL;
+ }
-/* error zone, gracefully close */
-out:
- H5E_BEGIN_TRY {
- H5Sclose(sid);
- H5Aclose(aid);
- H5Tclose(tid);
- } H5E_END_TRY;
- return FAIL;
+ H5E_BEGIN_TRY {
+ H5Sclose(sid);
+ H5Aclose(aid);
+ H5Tclose(ntid);
+ H5Tclose(tid);
+ } H5E_END_TRY;
+ return FAIL;
}
/*-------------------------------------------------------------------------
- * Function: H5DSdetach_scale
- *
- * Purpose: If possible, deletes association of Dimension Scale DSID with
- * dimension IDX of Dataset DID. This deletes the entries in the
- * DIMENSION_LIST and REFERENCE_LIST attributes.
- *
- * Return:
- * Success: SUCCEED
- * Failure: FAIL
- *
- * Fails if: Bad arguments
- * The dataset DID or DSID do not exist.
- * The DSID is not a Dimension Scale
- * DSID is not attached to DID.
- * Note that a scale may be associated with more than dimension of the same dataset.
- * If so, the detach operation only deletes one of the associations, for DID.
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: December 20, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5DSdetach_scale
+*
+* Purpose: If possible, deletes association of Dimension Scale DSID with
+* dimension IDX of Dataset DID. This deletes the entries in the
+* DIMENSION_LIST and REFERENCE_LIST attributes.
+*
+* Return:
+* Success: SUCCEED
+* Failure: FAIL
+*
+* Fails if: Bad arguments
+* The dataset DID or DSID do not exist.
+* The DSID is not a Dimension Scale
+* DSID is not attached to DID.
+* Note that a scale may be associated with more than dimension of the same dataset.
+* If so, the detach operation only deletes one of the associations, for DID.
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: December 20, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5DSdetach_scale(hid_t did,
hid_t dsid,
unsigned int idx)
{
- int has_dimlist;
- int has_reflist;
- hssize_t nelmts;
- hid_t dsid_j; /* DS dataset ID in DIMENSION_LIST */
+ int has_dimlist;
+ int has_reflist;
+ hssize_t nelmts;
+ hid_t dsid_j; /* DS dataset ID in DIMENSION_LIST */
hid_t did_i; /* dataset ID in REFERENCE_LIST */
- hid_t sid; /* space ID */
- hid_t tid = -1; /* attribute type ID */
- hid_t aid = -1; /* attribute ID */
- int rank; /* rank of dataset */
- ds_list_t *dsbuf = NULL; /* array of attribute data in the DS pointing to the dataset */
- ds_list_t *dsbufn = NULL; /* array of attribute data in the DS pointing to the dataset */
- hsize_t *dims = NULL; /* dimension of the "REFERENCE_LIST" array */
- hobj_ref_t ref; /* reference to the DS */
- hvl_t *buf = NULL; /* VL buffer to store in the attribute */
- unsigned i, j, jj;
- H5O_info_t oi1, oi2, oi3, oi4;
- int found_dset = 0, found_ds = 0;
- H5I_type_t it1, it2;
-
-/*-------------------------------------------------------------------------
- * parameter checking
- *-------------------------------------------------------------------------
- */
- /* the dataset cannot be a DS dataset */
- if ((H5DSis_scale(did))==1)
- return FAIL;
-
- /* get info for the dataset in the parameter list */
- if(H5Oget_info(did, &oi1) < 0)
- return FAIL;
-
- /* get info for the scale in the parameter list */
- if(H5Oget_info(dsid, &oi2) < 0)
- return FAIL;
-
- /* same object, not valid */
- if(oi1.fileno == oi2.fileno && oi1.addr == oi2.addr)
- return FAIL;
-
- /* get ID type */
- if ((it1 = H5Iget_type(did)) < 0)
- return FAIL;
- if ((it2 = H5Iget_type(dsid)) < 0)
- return FAIL;
-
- if (H5I_DATASET!=it1 || H5I_DATASET!=it2)
- return FAIL;
-
-
-/*-------------------------------------------------------------------------
- * Find "DIMENSION_LIST"
- *-------------------------------------------------------------------------
- */
- /* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */
- if ((has_dimlist = H5LT_find_attribute(did,DIMENSION_LIST)) < 0)
- return FAIL;
-
- if (has_dimlist == 0)
- return FAIL;
-
- /* get dataset space */
- if ((sid = H5Dget_space(did)) < 0)
- return FAIL;
-
- /* get rank */
- if ((rank=H5Sget_simple_extent_ndims(sid)) < 0)
- goto out;
-
- /* close dataset space */
- if (H5Sclose(sid) < 0)
- return FAIL;
-
-
-/*-------------------------------------------------------------------------
- * find "REFERENCE_LIST"
- *-------------------------------------------------------------------------
- */
-
- /* try to find the attribute "REFERENCE_LIST" on the >>DS<< dataset */
- if((has_reflist = H5LT_find_attribute(dsid, REFERENCE_LIST)) < 0)
- return FAIL;
-
- if(has_reflist == 0)
- return FAIL;
-
-/*-------------------------------------------------------------------------
- * open "DIMENSION_LIST", and delete the reference
- *-------------------------------------------------------------------------
- */
-
- if((aid = H5Aopen(did, DIMENSION_LIST, H5P_DEFAULT)) < 0)
- return FAIL;
-
- if((tid = H5Aget_type(aid)) < 0)
- goto out;
-
- if((sid = H5Aget_space(aid)) < 0)
- goto out;
-
- /* allocate and initialize the VL */
- buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
-
- if(buf == NULL)
- goto out;
-
- /* read */
- if (H5Aread(aid,tid,buf) < 0)
- goto out;
-
- /* reset */
- if ( buf[idx].len > 0 )
- {
- for (j=0; j<buf[idx].len; j++)
- {
- /* get the reference */
- ref = ((hobj_ref_t *)buf[idx].p)[j];
-
- /* get the DS id */
- if ((dsid_j = H5Rdereference(did,H5R_OBJECT,&ref)) < 0)
- goto out;
-
- /* get info for DS in the parameter list */
- if(H5Oget_info(dsid, &oi1) < 0)
- goto out;
-
- /* get info for this DS */
- if(H5Oget_info(dsid_j, &oi2) < 0)
- goto out;
-
- /* same object, reset */
- if(oi1.fileno == oi2.fileno && oi1.addr == oi2.addr) {
- for(jj=j; jj<buf[idx].len-1; jj++)
- ((hobj_ref_t *)buf[idx].p)[jj] = ((hobj_ref_t *)buf[idx].p)[jj+1];
- buf[idx].len--;
-
- found_ds = 1;
-
- /* close the dereferenced dataset and break */
- if (H5Dclose(dsid_j) < 0)
- goto out;
- break;
- }
-
- /* close the dereferenced dataset */
- if (H5Dclose(dsid_j) < 0)
- goto out;
- } /* j */
- } /* if */
-
- /* write the attribute */
- if (H5Awrite(aid,tid,buf) < 0)
- goto out;
-
- /* close */
- if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf) < 0)
- goto out;
- if (H5Sclose(sid) < 0)
- goto out;
- if (H5Tclose(tid) < 0)
- goto out;
- if(H5Aclose(aid) < 0)
- goto out;
- if(buf)
- free(buf);
-
- /* the scale must be present */
- if(found_ds == 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * the "REFERENCE_LIST" array exists, update
- *-------------------------------------------------------------------------
- */
-
- if((aid = H5Aopen(dsid, REFERENCE_LIST, H5P_DEFAULT)) < 0)
- goto out;
-
- if((tid = H5Aget_type(aid)) < 0)
- goto out;
-
- /* get and save the old reference(s) */
- if((sid = H5Aget_space(aid)) < 0)
- goto out;
-
- if((nelmts = H5Sget_simple_extent_npoints(sid)) < 0)
- goto out;
-
- dsbuf = malloc((size_t)nelmts * sizeof(ds_list_t));
- if(dsbuf == NULL)
- goto out;
-
- if (H5Aread(aid,tid,dsbuf) < 0)
- goto out;
+ hid_t sid; /* space ID */
+ hid_t tid = -1; /* attribute type ID */
+ hid_t ntid = -1; /* attribute native type ID */
+ hid_t aid = -1; /* attribute ID */
+ int rank; /* rank of dataset */
+ ds_list_t *dsbuf = NULL; /* array of attribute data in the DS pointing to the dataset */
+ ds_list_t *dsbufn = NULL; /* array of attribute data in the DS pointing to the dataset */
+ hsize_t *dims = NULL; /* dimension of the "REFERENCE_LIST" array */
+ hobj_ref_t ref; /* reference to the DS */
+ hvl_t *buf = NULL; /* VL buffer to store in the attribute */
+ unsigned i, j, jj;
+ H5O_info_t oi1, oi2, oi3, oi4;
+ int found_dset = 0, found_ds = 0;
+ H5I_type_t it1, it2;
+ htri_t is_scale;
+
+ /*-------------------------------------------------------------------------
+ * parameter checking
+ *-------------------------------------------------------------------------
+ */
+
+ if ((is_scale = H5DSis_scale(did)) < 0)
+ return FAIL;
+
+ /* the dataset cannot be a DS dataset */
+ if ( is_scale == 1)
+ return FAIL;
+
+ /* get info for the dataset in the parameter list */
+ if(H5Oget_info(did, &oi1) < 0)
+ return FAIL;
+
+ /* get info for the scale in the parameter list */
+ if(H5Oget_info(dsid, &oi2) < 0)
+ return FAIL;
+
+ /* same object, not valid */
+ if(oi1.fileno == oi2.fileno && oi1.addr == oi2.addr)
+ return FAIL;
+
+ /* get ID type */
+ if ((it1 = H5Iget_type(did)) < 0)
+ return FAIL;
+ if ((it2 = H5Iget_type(dsid)) < 0)
+ return FAIL;
+
+ if (H5I_DATASET!=it1 || H5I_DATASET!=it2)
+ return FAIL;
+
+
+ /*-------------------------------------------------------------------------
+ * Find "DIMENSION_LIST"
+ *-------------------------------------------------------------------------
+ */
+ /* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */
+ if ((has_dimlist = H5LT_find_attribute(did,DIMENSION_LIST)) < 0)
+ return FAIL;
+
+ if (has_dimlist == 0)
+ return FAIL;
+
+ /* get dataset space */
+ if ((sid = H5Dget_space(did)) < 0)
+ return FAIL;
+
+ /* get rank */
+ if ((rank=H5Sget_simple_extent_ndims(sid)) < 0)
+ goto out;
+
+ /* close dataset space */
+ if (H5Sclose(sid) < 0)
+ return FAIL;
+
+ /* parameter range checking */
+ if (idx>(unsigned)rank-1)
+ return FAIL;
+
+ /*-------------------------------------------------------------------------
+ * find "REFERENCE_LIST"
+ *-------------------------------------------------------------------------
+ */
+
+ /* try to find the attribute "REFERENCE_LIST" on the >>DS<< dataset */
+ if((has_reflist = H5LT_find_attribute(dsid, REFERENCE_LIST)) < 0)
+ return FAIL;
+
+ if(has_reflist == 0)
+ return FAIL;
+
+ /*-------------------------------------------------------------------------
+ * open "DIMENSION_LIST", and delete the reference
+ *-------------------------------------------------------------------------
+ */
+
+ if((aid = H5Aopen(did, DIMENSION_LIST, H5P_DEFAULT)) < 0)
+ return FAIL;
+
+ if((tid = H5Aget_type(aid)) < 0)
+ goto out;
+
+ if((sid = H5Aget_space(aid)) < 0)
+ goto out;
+
+ /* allocate and initialize the VL */
+ buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
+
+ if(buf == NULL)
+ goto out;
+
+ /* read */
+ if (H5Aread(aid,tid,buf) < 0)
+ goto out;
+
+ /* reset */
+ if ( buf[idx].len > 0 )
+ {
+ for (j=0; j<buf[idx].len; j++)
+ {
+ /* get the reference */
+ ref = ((hobj_ref_t *)buf[idx].p)[j];
+
+ /* get the DS id */
+ if ((dsid_j = H5Rdereference(did,H5R_OBJECT,&ref)) < 0)
+ goto out;
+
+ /* get info for DS in the parameter list */
+ if(H5Oget_info(dsid, &oi1) < 0)
+ goto out;
+
+ /* get info for this DS */
+ if(H5Oget_info(dsid_j, &oi2) < 0)
+ goto out;
+
+ /* same object, reset */
+ if(oi1.fileno == oi2.fileno && oi1.addr == oi2.addr)
+ {
+ size_t len;
+
+ for(jj=j; jj<buf[idx].len-1; jj++)
+ {
+ ((hobj_ref_t *)buf[idx].p)[jj] = ((hobj_ref_t *)buf[idx].p)[jj+1];
+ }
+
+ buf[idx].len--;
+ len = buf[idx].len;
+ buf[idx].p = realloc( buf[idx].p, len * sizeof(hobj_ref_t));
+
+ found_ds = 1;
+
+ /* close the dereferenced dataset and break */
+ if (H5Dclose(dsid_j) < 0)
+ goto out;
+ break;
+ }
+
+ /* close the dereferenced dataset */
+ if (H5Dclose(dsid_j) < 0)
+ goto out;
+ } /* j */
+ } /* if */
+
+ /* write the attribute */
+ if (H5Awrite(aid,tid,buf) < 0)
+ goto out;
+
+ /* close */
+ if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf) < 0)
+ goto out;
+ if (H5Sclose(sid) < 0)
+ goto out;
+ if (H5Tclose(tid) < 0)
+ goto out;
+ if (H5Aclose(aid) < 0)
+ goto out;
+
+ if (buf)
+ {
+ free(buf);
+ buf = NULL;
+ }
- for(i=0; i<nelmts; i++)
- {
- /* get the reference to the dataset */
- ref = dsbuf[i].ref;
+ /* the scale must be present */
+ if(found_ds == 0)
+ goto out;
- /* get the dataset id */
- if ((did_i = H5Rdereference(did,H5R_OBJECT,&ref)) < 0)
- goto out;
+ /*-------------------------------------------------------------------------
+ * the "REFERENCE_LIST" array exists, update
+ *-------------------------------------------------------------------------
+ */
- /* get info for dataset in the parameter list */
- if(H5Oget_info(did, &oi3) < 0)
- goto out;
+ if((aid = H5Aopen(dsid, REFERENCE_LIST, H5P_DEFAULT)) < 0)
+ goto out;
- /* get info for this dataset */
- if(H5Oget_info(did_i, &oi4) < 0)
- goto out;
+ if((tid = H5Aget_type(aid)) < 0)
+ goto out;
+
+ if((ntid = H5Tget_native_type(tid, H5T_DIR_DEFAULT)) < 0)
+ goto out;
- /* same object, reset. we want to detach only for this DIM */
- if(oi3.fileno == oi4.fileno && oi3.addr == oi4.addr && (int)idx == dsbuf[i].dim_idx) {
- for(jj=i; jj<nelmts-1; jj++)
- dsbuf[jj] = dsbuf[jj+1];
- nelmts--;
- found_dset=1;
+ /* get and save the old reference(s) */
+ if((sid = H5Aget_space(aid)) < 0)
+ goto out;
- /* close the dereferenced dataset and break */
- if (H5Dclose(did_i) < 0)
- goto out;
- break;
- } /* if */
+ if((nelmts = H5Sget_simple_extent_npoints(sid)) < 0)
+ goto out;
- /* close the dereferenced dataset */
- if (H5Dclose(did_i) < 0)
- goto out;
+ dsbuf = (ds_list_t*) malloc((size_t)nelmts * sizeof(ds_list_t));
+ if(dsbuf == NULL)
+ goto out;
- } /* i */
+ if (H5Aread(aid,ntid,dsbuf) < 0)
+ goto out;
- /* close space and attribute */
- if (H5Sclose(sid) < 0)
- goto out;
- if (H5Aclose(aid) < 0)
- goto out;
+ for(i=0; i<nelmts; i++)
+ {
+ /* get the reference to the dataset */
+ ref = dsbuf[i].ref;
+
+ /* get the dataset id */
+ if ((did_i = H5Rdereference(did,H5R_OBJECT,&ref)) < 0)
+ goto out;
+
+ /* get info for dataset in the parameter list */
+ if(H5Oget_info(did, &oi3) < 0)
+ goto out;
+
+ /* get info for this dataset */
+ if(H5Oget_info(did_i, &oi4) < 0)
+ goto out;
+
+ /* same object, reset. we want to detach only for this DIM */
+ if(oi3.fileno == oi4.fileno && oi3.addr == oi4.addr && (int)idx == dsbuf[i].dim_idx) {
+ for(jj=i; jj<nelmts-1; jj++)
+ dsbuf[jj] = dsbuf[jj+1];
+ nelmts--;
+ found_dset=1;
+
+ /* close the dereferenced dataset and break */
+ if (H5Dclose(did_i) < 0)
+ goto out;
+ break;
+ } /* if */
+
+ /* close the dereferenced dataset */
+ if (H5Dclose(did_i) < 0)
+ goto out;
+
+ } /* i */
+
+ /* close space and attribute */
+ if (H5Sclose(sid) < 0)
+ goto out;
+ if (H5Aclose(aid) < 0)
+ goto out;
+ if (H5Tclose(ntid) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * check if we found the pointed dataset
+ *-------------------------------------------------------------------------
+ */
+
+ /* the pointed dataset must exist */
+ if (found_dset == 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * create a new attribute
+ *-------------------------------------------------------------------------
+ */
+
+ /* the attribute must be deleted, in order to the new one can reflect the changes*/
+ if (H5Adelete(dsid, REFERENCE_LIST) < 0)
+ goto out;
+
+ /* don't do anything for an empty array */
+ if(nelmts)
+ {
+ /* create a new data space for the new references array */
+ dims = (hsize_t*)malloc((size_t)nelmts * sizeof (hsize_t));
+ if(dims == NULL)
+ goto out;
+ dims[0] = nelmts;
+
+ dsbufn = (ds_list_t*) malloc((size_t)nelmts * sizeof(ds_list_t));
+ if(dsbufn == NULL)
+ goto out;
+
+ /* store the new information */
+ for(i = 0; i < nelmts; i++)
+ dsbufn[i] = dsbuf[i];
+
+ if((sid = H5Screate_simple(1, dims, NULL)) < 0)
+ goto out;
+
+ /* create the attribute again with the changes of space */
+ if((aid = H5Acreate2(dsid, REFERENCE_LIST, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* write the new attribute with the new references */
+ if(H5Awrite(aid, tid, dsbufn) < 0)
+ goto out;
+
+ /* close space and attribute */
+ if(H5Sclose(sid) < 0)
+ goto out;
+ if(H5Aclose(aid) < 0)
+ goto out;
+ } /* nelmts */
+
+ /* close type */
+ if (H5Tclose(tid) < 0)
+ goto out;
+
+ if (dsbuf)
+ {
+ free(dsbuf);
+ dsbuf=NULL;
+ }
+ if (dsbufn)
+ {
+ free(dsbufn);
+ dsbufn=NULL;
+ }
+ if (dims)
+ {
+ free(dims);
+ dims=NULL;
+ }
-/*-------------------------------------------------------------------------
- * check if we found the pointed dataset
- *-------------------------------------------------------------------------
- */
- /* the pointed dataset must exist */
- if (found_dset == 0)
- goto out;
+ return SUCCEED;
-/*-------------------------------------------------------------------------
- * create a new attribute
- *-------------------------------------------------------------------------
- */
-
- /* the attribute must be deleted, in order to the new one can reflect the changes*/
- if(H5Adelete(dsid, REFERENCE_LIST) < 0)
- goto out;
-
- /* don't do anything for an empty array */
- if(nelmts)
- {
- /* create a new data space for the new references array */
- dims = (hsize_t*)malloc((size_t)nelmts * sizeof (hsize_t));
- if(dims == NULL)
- goto out;
- dims[0] = nelmts;
-
- dsbufn = malloc((size_t)nelmts * sizeof(ds_list_t));
- if(dsbufn == NULL)
- goto out;
-
- /* store the new information */
- for(i = 0; i < nelmts; i++)
- dsbufn[i] = dsbuf[i];
-
- if((sid = H5Screate_simple(1, dims, NULL)) < 0)
- goto out;
-
- /* create the attribute again with the changes of space */
- if((aid = H5Acreate2(dsid, REFERENCE_LIST, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
-
- /* write the new attribute with the new references */
- if(H5Awrite(aid, tid, dsbufn) < 0)
- goto out;
-
- /* close space and attribute */
- if(H5Sclose(sid) < 0)
- goto out;
- if(H5Aclose(aid) < 0)
- goto out;
- } /* nelmts */
-
- /* close type */
- if (H5Tclose(tid) < 0)
- goto out;
-
- if (dsbuf) {
- free(dsbuf);
- dsbuf=NULL;
- }
- if (dsbufn) {
- free(dsbufn);
- dsbufn=NULL;
- }
- if (dims) {
- free(dims);
- dims=NULL;
- }
-
-
- return SUCCEED;
-
-/* error zone, gracefully close */
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Sclose(sid);
- H5Aclose(aid);
- H5Tclose(tid);
- if (dsbuf)
- free(dsbuf);
- if (dsbufn)
- free(dsbufn);
- if (dims)
- free(dims);
- } H5E_END_TRY;
- return FAIL;
+ H5E_BEGIN_TRY {
+ H5Sclose(sid);
+ H5Aclose(aid);
+ H5Tclose(ntid);
+ H5Tclose(tid);
+
+ if (dsbuf)
+ {
+ free(dsbuf);
+ dsbuf=NULL;
+ }
+ if (dsbufn)
+ {
+ free(dsbufn);
+ dsbufn=NULL;
+ }
+ if (dims)
+ {
+ free(dims);
+ dims=NULL;
+ }
+ if (buf)
+ {
+ free(buf);
+ buf=NULL;
+ }
+ } H5E_END_TRY;
+ return FAIL;
}
/*-------------------------------------------------------------------------
- * Function: H5DSis_attached
- *
- * Purpose: Report if dimension scale DSID is currently attached to
- * dimension IDX of dataset DID by checking if DID has a pointer in the REFERENCE_LIST
- * attribute and DSID (scale ) has a pointer in the DIMENSION_LIST attribute
- *
- * Return:
- * 1: both the DS and the dataset pointers match
- * 0: one of them or both do not match
- * FAIL (-1): error
- *
- * Fails if: Bad arguments
- * If DSID is not a Dimension Scale
- * If DID is a Dimension Scale (A Dimension Scale cannot have scales)
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: February 18, 2005
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5DSis_attached
+*
+* Purpose: Report if dimension scale DSID is currently attached to
+* dimension IDX of dataset DID by checking if DID has a pointer in the REFERENCE_LIST
+* attribute and DSID (scale ) has a pointer in the DIMENSION_LIST attribute
+*
+* Return:
+* 1: both the DS and the dataset pointers match
+* 0: one of them or both do not match
+* FAIL (-1): error
+*
+* Fails if: Bad arguments
+* If DSID is not a Dimension Scale
+* If DID is a Dimension Scale (A Dimension Scale cannot have scales)
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: February 18, 2005
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
htri_t H5DSis_attached(hid_t did,
hid_t dsid,
unsigned int idx)
{
- int has_dimlist;
- int has_reflist;
- hssize_t nelmts;
- hid_t sid; /* space ID */
- hid_t tid = -1; /* attribute type ID */
- hid_t aid = -1; /* attribute ID */
- int rank; /* rank of dataset */
- ds_list_t *dsbuf; /* array of attribute data in the DS pointing to the dataset */
- hobj_ref_t ref; /* reference to the DS */
- hvl_t *buf; /* VL buffer to store in the attribute */
- hid_t dsid_j; /* DS dataset ID in DIMENSION_LIST */
+ int has_dimlist;
+ int has_reflist;
+ hssize_t nelmts;
+ hid_t sid; /* space ID */
+ hid_t tid = -1; /* attribute type ID */
+ hid_t ntid = -1; /* attribute native type ID */
+ hid_t aid = -1; /* attribute ID */
+ int rank; /* rank of dataset */
+ ds_list_t *dsbuf; /* array of attribute data in the DS pointing to the dataset */
+ hobj_ref_t ref; /* reference to the DS */
+ hvl_t *buf; /* VL buffer to store in the attribute */
+ hid_t dsid_j; /* DS dataset ID in DIMENSION_LIST */
hid_t did_i; /* dataset ID in REFERENCE_LIST */
- H5O_info_t oi1, oi2, oi3, oi4;
- H5I_type_t it1, it2;
- int i;
- int found_dset=0, found_ds=0;
-
-/*-------------------------------------------------------------------------
- * parameter checking
- *-------------------------------------------------------------------------
- */
- /* the dataset cannot be a DS dataset */
- if ((H5DSis_scale(did))==1)
- return FAIL;
-
- /* get info for the dataset in the parameter list */
- if(H5Oget_info(did, &oi1) < 0)
- return FAIL;
-
- /* get info for the scale in the parameter list */
- if(H5Oget_info(dsid, &oi2) < 0)
- return FAIL;
-
- /* same object, not valid */
- if(oi1.fileno == oi2.fileno && oi1.addr == oi2.addr)
- return FAIL;
-
- /* get ID type */
- if ((it1 = H5Iget_type(did)) < 0)
- return FAIL;
- if ((it2 = H5Iget_type(dsid)) < 0)
- return FAIL;
-
- if (H5I_DATASET!=it1 || H5I_DATASET!=it2)
- return FAIL;
-
-/*-------------------------------------------------------------------------
- * get space
- *-------------------------------------------------------------------------
- */
-
- /* get dataset space */
- if ((sid = H5Dget_space(did)) < 0)
- return FAIL;
-
- /* get rank */
- if ((rank=H5Sget_simple_extent_ndims(sid)) < 0)
- goto out;
-
- /* close dataset space */
- if (H5Sclose(sid) < 0)
- goto out;
-
- /* parameter range checking */
- if(idx > ((unsigned)rank - 1))
- goto out;
-
- /* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */
- if((has_dimlist = H5LT_find_attribute(did, DIMENSION_LIST)) < 0)
- return FAIL;
-
-/*-------------------------------------------------------------------------
- * open "DIMENSION_LIST"
- *-------------------------------------------------------------------------
- */
-
- if(has_dimlist == 1)
- {
- if((aid = H5Aopen(did, DIMENSION_LIST, H5P_DEFAULT)) < 0)
- goto out;
-
- if((tid = H5Aget_type(aid)) < 0)
- goto out;
-
- if((sid = H5Aget_space(aid)) < 0)
- goto out;
-
- /* allocate and initialize the VL */
- buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
-
- if(buf == NULL)
- goto out;
-
- /* read */
- if (H5Aread(aid,tid,buf) < 0)
- goto out;
-
- /* iterate all the REFs in this dimension IDX */
- for (i=0; i<(int)buf[idx].len; i++)
- {
- /* get the reference */
- ref = ((hobj_ref_t *)buf[idx].p)[i];
-
- /* get the scale id for this REF */
- if ((dsid_j = H5Rdereference(did,H5R_OBJECT,&ref)) < 0)
- goto out;
-
- /* get info for DS in the parameter list */
- if(H5Oget_info(dsid, &oi1) < 0)
- goto out;
-
- /* get info for this DS */
- if(H5Oget_info(dsid_j, &oi2) < 0)
- goto out;
-
- /* same object */
- if(oi1.fileno == oi2.fileno && oi1.addr == oi2.addr)
- found_ds = 1;
-
- /* close the dereferenced dataset */
- if (H5Dclose(dsid_j) < 0)
- goto out;
-
- }
-
-
- /* close */
- if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf) < 0)
- goto out;
- if (H5Sclose(sid) < 0)
- goto out;
- if (H5Tclose(tid) < 0)
- goto out;
- if (H5Aclose(aid) < 0)
- goto out;
- if (buf)
- free(buf);
- } /* has_dimlist */
-
-/*-------------------------------------------------------------------------
- * info on the >>DS<< dataset
- *-------------------------------------------------------------------------
- */
-
- /* try to find the attribute "REFERENCE_LIST" on the >>DS<< dataset */
- if((has_reflist = H5LT_find_attribute(dsid, REFERENCE_LIST)) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * open "REFERENCE_LIST"
- *-------------------------------------------------------------------------
- */
-
- if(has_reflist == 1)
- {
- if((aid = H5Aopen(dsid, REFERENCE_LIST, H5P_DEFAULT)) < 0)
- goto out;
-
- if((tid = H5Aget_type(aid)) < 0)
- goto out;
-
- /* get and save the old reference(s) */
- if((sid = H5Aget_space(aid)) < 0)
- goto out;
-
- if((nelmts = H5Sget_simple_extent_npoints(sid)) < 0)
- goto out;
-
- dsbuf = malloc((size_t)nelmts * sizeof(ds_list_t));
-
- if (dsbuf == NULL)
- goto out;
-
- if (H5Aread(aid,tid,dsbuf) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * iterate
- *-------------------------------------------------------------------------
- */
-
- for(i=0; i<nelmts; i++)
- {
- /* get the reference */
- ref = dsbuf[i].ref;
-
- /* the reference was not deleted */
- if (ref)
- {
- /* get the dataset id */
- if ((did_i = H5Rdereference(did,H5R_OBJECT,&ref)) < 0)
- goto out;
-
- /* get info for dataset in the parameter list */
- if(H5Oget_info(did, &oi3) < 0)
- goto out;
-
- /* get info for this dataset */
- if(H5Oget_info(did_i, &oi4) < 0)
- goto out;
-
- /* same object */
- if(oi3.fileno == oi4.fileno && oi3.addr == oi4.addr && (int)idx==dsbuf[i].dim_idx)
- found_dset=1;
-
- /* close the dereferenced dataset */
- if (H5Dclose(did_i) < 0)
- goto out;
- } /* if */
- } /* i */
-
-
- /* close */
- if (H5Sclose(sid) < 0)
- goto out;
- if (H5Tclose(tid) < 0)
- goto out;
- if (H5Aclose(aid) < 0)
- goto out;
- if (dsbuf)
- free(dsbuf);
- } /* has_reflist */
-
- if (found_ds && found_dset)
- return 1;
- else
- return 0;
-
-/* error zone, gracefully close */
+ H5O_info_t oi1, oi2, oi3, oi4;
+ H5I_type_t it1, it2;
+ int i;
+ int found_dset=0, found_ds=0;
+ htri_t is_scale;
+
+ /*-------------------------------------------------------------------------
+ * parameter checking
+ *-------------------------------------------------------------------------
+ */
+
+ if ((is_scale = H5DSis_scale(did)) < 0)
+ return FAIL;
+
+ /* the dataset cannot be a DS dataset */
+ if ( is_scale == 1)
+ return FAIL;
+
+ /* get info for the dataset in the parameter list */
+ if(H5Oget_info(did, &oi1) < 0)
+ return FAIL;
+
+ /* get info for the scale in the parameter list */
+ if(H5Oget_info(dsid, &oi2) < 0)
+ return FAIL;
+
+ /* same object, not valid */
+ if(oi1.fileno == oi2.fileno && oi1.addr == oi2.addr)
+ return FAIL;
+
+ /* get ID type */
+ if ((it1 = H5Iget_type(did)) < 0)
+ return FAIL;
+ if ((it2 = H5Iget_type(dsid)) < 0)
+ return FAIL;
+
+ if (H5I_DATASET!=it1 || H5I_DATASET!=it2)
+ return FAIL;
+
+ /*-------------------------------------------------------------------------
+ * get space
+ *-------------------------------------------------------------------------
+ */
+
+ /* get dataset space */
+ if ((sid = H5Dget_space(did)) < 0)
+ return FAIL;
+
+ /* get rank */
+ if ((rank=H5Sget_simple_extent_ndims(sid)) < 0)
+ goto out;
+
+ /* close dataset space */
+ if (H5Sclose(sid) < 0)
+ goto out;
+
+ /* parameter range checking */
+ if(idx > ((unsigned)rank - 1))
+ return FAIL;
+
+ /* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */
+ if((has_dimlist = H5LT_find_attribute(did, DIMENSION_LIST)) < 0)
+ return FAIL;
+
+ /*-------------------------------------------------------------------------
+ * open "DIMENSION_LIST"
+ *-------------------------------------------------------------------------
+ */
+
+ if(has_dimlist == 1)
+ {
+ if((aid = H5Aopen(did, DIMENSION_LIST, H5P_DEFAULT)) < 0)
+ goto out;
+
+ if((tid = H5Aget_type(aid)) < 0)
+ goto out;
+
+ if((sid = H5Aget_space(aid)) < 0)
+ goto out;
+
+ /* allocate and initialize the VL */
+ buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
+
+ if(buf == NULL)
+ goto out;
+
+ /* read */
+ if (H5Aread(aid,tid,buf) < 0)
+ goto out;
+
+ /* iterate all the REFs in this dimension IDX */
+ for (i=0; i<(int)buf[idx].len; i++)
+ {
+ /* get the reference */
+ ref = ((hobj_ref_t *)buf[idx].p)[i];
+
+ /* get the scale id for this REF */
+ if ((dsid_j = H5Rdereference(did,H5R_OBJECT,&ref)) < 0)
+ goto out;
+
+ /* get info for DS in the parameter list */
+ if(H5Oget_info(dsid, &oi1) < 0)
+ goto out;
+
+ /* get info for this DS */
+ if(H5Oget_info(dsid_j, &oi2) < 0)
+ goto out;
+
+ /* same object */
+ if(oi1.fileno == oi2.fileno && oi1.addr == oi2.addr)
+ found_ds = 1;
+
+ /* close the dereferenced dataset */
+ if (H5Dclose(dsid_j) < 0)
+ goto out;
+
+ }
+
+
+ /* close */
+ if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf) < 0)
+ goto out;
+ if (H5Sclose(sid) < 0)
+ goto out;
+ if (H5Tclose(tid) < 0)
+ goto out;
+ if (H5Aclose(aid) < 0)
+ goto out;
+ if (buf)
+ {
+ free(buf);
+ buf = NULL;
+ }
+ } /* has_dimlist */
+
+ /*-------------------------------------------------------------------------
+ * info on the >>DS<< dataset
+ *-------------------------------------------------------------------------
+ */
+
+ /* try to find the attribute "REFERENCE_LIST" on the >>DS<< dataset */
+ if((has_reflist = H5LT_find_attribute(dsid, REFERENCE_LIST)) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * open "REFERENCE_LIST"
+ *-------------------------------------------------------------------------
+ */
+
+ if(has_reflist == 1)
+ {
+ if((aid = H5Aopen(dsid, REFERENCE_LIST, H5P_DEFAULT)) < 0)
+ goto out;
+
+ if((tid = H5Aget_type(aid)) < 0)
+ goto out;
+
+ if((ntid = H5Tget_native_type(tid, H5T_DIR_DEFAULT)) < 0)
+ goto out;
+
+ /* get and save the old reference(s) */
+ if((sid = H5Aget_space(aid)) < 0)
+ goto out;
+
+ if((nelmts = H5Sget_simple_extent_npoints(sid)) < 0)
+ goto out;
+
+ dsbuf = (ds_list_t*) malloc((size_t)nelmts * sizeof(ds_list_t));
+
+ if (dsbuf == NULL)
+ goto out;
+
+ if (H5Aread(aid,ntid,dsbuf) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * iterate
+ *-------------------------------------------------------------------------
+ */
+
+ for(i=0; i<nelmts; i++)
+ {
+ /* get the reference */
+ ref = dsbuf[i].ref;
+
+ /* the reference was not deleted */
+ if (ref)
+ {
+ /* get the dataset id */
+ if ((did_i = H5Rdereference(did,H5R_OBJECT,&ref)) < 0)
+ goto out;
+
+ /* get info for dataset in the parameter list */
+ if(H5Oget_info(did, &oi3) < 0)
+ goto out;
+
+ /* get info for this dataset */
+ if(H5Oget_info(did_i, &oi4) < 0)
+ goto out;
+
+ /* same object */
+ if(oi3.fileno == oi4.fileno && oi3.addr == oi4.addr && (int)idx==dsbuf[i].dim_idx)
+ found_dset=1;
+
+ /* close the dereferenced dataset */
+ if (H5Dclose(did_i) < 0)
+ goto out;
+ } /* if */
+ } /* i */
+
+
+ /* close */
+ if (H5Sclose(sid) < 0)
+ goto out;
+ if (H5Tclose(ntid) < 0)
+ goto out;
+ if (H5Tclose(tid) < 0)
+ goto out;
+ if (H5Aclose(aid) < 0)
+ goto out;
+ if (dsbuf)
+ {
+ free(dsbuf);
+ dsbuf = NULL;
+ }
+ } /* has_reflist */
+
+ if (found_ds && found_dset)
+ return 1;
+ else
+ return 0;
+
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Sclose(sid);
- H5Aclose(aid);
- H5Tclose(tid);
- } H5E_END_TRY;
- return FAIL;
+ H5E_BEGIN_TRY {
+ H5Sclose(sid);
+ H5Aclose(aid);
+ H5Tclose(tid);
+ } H5E_END_TRY;
+
+ if (buf)
+ {
+ free(buf);
+ buf = NULL;
+ }
+ if (dsbuf)
+ {
+ free(dsbuf);
+ dsbuf = NULL;
+ }
+ return FAIL;
}
/*-------------------------------------------------------------------------
- * Function: H5DSiterate_scales
- *
- * Purpose: H5DSiterate_scales iterates over the scales attached to dimension DIM
- * of dataset DID. For each scale in the list, the visitor_data and some
- * additional information, specified below, are passed to the visitor function.
- * The iteration begins with the IDX object in the group and the next element
- * to be processed by the operator is returned in IDX. If IDX is NULL, then the
- * iterator starts at zero.
- *
- * Parameters:
- *
- * hid_t DID; IN: the dataset
- * unsigned int dim; IN: the dimension of the dataset
- * int *idx; IN/OUT: input the index to start iterating, output the
- * next index to visit. If NULL, start at the first position.
- * H5DS_iterate_t visitor; IN: the visitor function
- * void *visitor_data; IN: arbitrary data to pass to the visitor function.
- *
- * Iterate over all scales of DIM, calling an application callback
- * with the item, key and any operator data.
- *
- * The operator callback receives a pointer to the item ,
- * and the pointer to the operator data passed
- * in to H5SL_iterate ('op_data'). The return values from an operator are:
- * A. Zero causes the iterator to continue, returning zero when all
- * nodes of that type have been processed.
- * B. Positive causes the iterator to immediately return that positive
- * value, indicating short-circuit success.
- * C. Negative causes the iterator to immediately return that value,
- * indicating failure.
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: January 31, 2005
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5DSiterate_scales
+*
+* Purpose: H5DSiterate_scales iterates over the scales attached to dimension DIM
+* of dataset DID. For each scale in the list, the visitor_data and some
+* additional information, specified below, are passed to the visitor function.
+* The iteration begins with the IDX object in the group and the next element
+* to be processed by the operator is returned in IDX. If IDX is NULL, then the
+* iterator starts at zero.
+*
+* Parameters:
+*
+* hid_t DID; IN: the dataset
+* unsigned int DIM; IN: the dimension of the dataset
+* int *DS_IDX; IN/OUT: on input the dimension scale index to start iterating,
+* on output the next index to visit. If NULL, start at
+* the first position.
+* H5DS_iterate_t VISITOR; IN: the visitor function
+* void *VISITOR_DATA; IN: arbitrary data to pass to the visitor function.
+*
+* Iterate over all scales of DIM, calling an application callback
+* with the item, key and any operator data.
+*
+* The operator callback receives a pointer to the item ,
+* and the pointer to the operator data passed
+* in to H5SL_iterate ('op_data'). The return values from an operator are:
+* A. Zero causes the iterator to continue, returning zero when all
+* nodes of that type have been processed.
+* B. Positive causes the iterator to immediately return that positive
+* value, indicating short-circuit success.
+* C. Negative causes the iterator to immediately return that value,
+* indicating failure.
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: January 31, 2005
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5DSiterate_scales(hid_t did,
unsigned int dim,
- int *idx,
+ int *ds_idx,
H5DS_iterate_t visitor,
void *visitor_data )
{
- hid_t scale_id;
- int rank;
- hobj_ref_t ref; /* reference to the DS */
- hid_t sid; /* space ID */
- hid_t tid = -1; /* attribute type ID */
- hid_t aid = -1; /* attribute ID */
- hvl_t *buf=NULL; /* VL buffer to store in the attribute */
- H5I_type_t it; /* ID type */
- herr_t ret_value=0;
- int j_idx;
- int nscales;
- int has_dimlist;
- int i;
-
-/*-------------------------------------------------------------------------
- * parameter checking
- *-------------------------------------------------------------------------
- */
- /* get ID type */
- if ((it = H5Iget_type(did)) < 0)
- return FAIL;
-
- if (H5I_DATASET!=it)
- return FAIL;
-
- /* get the number of scales assotiated with this DIM */
- if ((nscales = H5DSget_num_scales(did,dim)) < 0)
- return FAIL;
-
- /* get dataset space */
- if ((sid = H5Dget_space(did)) < 0)
- return FAIL;
-
- /* get rank */
- if ((rank=H5Sget_simple_extent_ndims(sid)) < 0)
- goto out;
-
- /* close dataset space */
- if(H5Sclose(sid) < 0)
- goto out;
-
- /* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */
- if((has_dimlist = H5LT_find_attribute(did, DIMENSION_LIST)) < 0)
- return FAIL;
-
- if(has_dimlist == 0)
- return SUCCEED;
-
- else if(has_dimlist == 1)
- {
- if((aid = H5Aopen(did, DIMENSION_LIST, H5P_DEFAULT)) < 0)
- goto out;
- if((tid = H5Aget_type(aid)) < 0)
- goto out;
- if((sid = H5Aget_space(aid)) < 0)
- goto out;
-
- /* allocate and initialize the VL */
- buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
-
- if(buf == NULL)
- goto out;
-
- /* read */
- if(H5Aread(aid, tid, buf) < 0)
- goto out;
-
- if ( buf[dim].len > 0 )
- {
- if (idx!=NULL)
- j_idx = *idx;
- else
- j_idx=0;
-
- /* iterate */
- for(i=j_idx; i<nscales; i++)
- {
- /* get the reference */
- ref = ((hobj_ref_t *)buf[dim].p)[ i ];
-
- /* disable error reporting, the ID might refer to a deleted dataset */
- H5E_BEGIN_TRY {
- /* get the DS id */
- if ((scale_id = H5Rdereference(did,H5R_OBJECT,&ref)) < 0)
- goto out;
- } H5E_END_TRY;
-
- if((ret_value=(visitor)(did,dim,scale_id,visitor_data))!=0)
+ hid_t scale_id;
+ int rank;
+ hobj_ref_t ref; /* reference to the DS */
+ hid_t sid; /* space ID */
+ hid_t tid = -1; /* attribute type ID */
+ hid_t aid = -1; /* attribute ID */
+ hvl_t *buf=NULL; /* VL buffer to store in the attribute */
+ H5I_type_t it; /* ID type */
+ herr_t ret_value=0;
+ int j_idx;
+ int nscales;
+ int has_dimlist;
+ int i;
+
+ /*-------------------------------------------------------------------------
+ * parameter checking
+ *-------------------------------------------------------------------------
+ */
+ /* get ID type */
+ if ((it = H5Iget_type(did)) < 0)
+ return FAIL;
+
+ if (H5I_DATASET!=it)
+ return FAIL;
+
+ /* get the number of scales assotiated with this DIM */
+ if ((nscales = H5DSget_num_scales(did,dim)) < 0)
+ return FAIL;
+
+ /* parameter range checking */
+ if (ds_idx!=NULL)
{
- /* set the return IDX OUT value at current scale index and break */
- if (idx!=NULL)
- {
- *idx = i;
- }
+ if (*ds_idx>=nscales)
+ return FAIL;
+ }
- /* close the DS id */
- if (H5Dclose(scale_id) < 0)
- goto out;
+ /* get dataset space */
+ if ((sid = H5Dget_space(did)) < 0)
+ return FAIL;
- break;
- }
+ /* get rank */
+ if ((rank=H5Sget_simple_extent_ndims(sid)) < 0)
+ goto out;
- /* close the DS id */
- if (H5Dclose(scale_id) < 0)
- goto out;
+ /* close dataset space */
+ if(H5Sclose(sid) < 0)
+ goto out;
- } /* i */
- } /* if */
+ if ( dim >= (unsigned)rank )
+ return FAIL;
- /* close */
- if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf) < 0)
- goto out;
- if (H5Sclose(sid) < 0)
- goto out;
- if (H5Tclose(tid) < 0)
- goto out;
- if (H5Aclose(aid) < 0)
- goto out;
- if (buf)
- free(buf);
+ /* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */
+ if((has_dimlist = H5LT_find_attribute(did, DIMENSION_LIST)) < 0)
+ return FAIL;
- } /* if has_dimlist */
+ if(has_dimlist == 0)
+ return SUCCEED;
- return ret_value;
+ else if(has_dimlist == 1)
+ {
+ if((aid = H5Aopen(did, DIMENSION_LIST, H5P_DEFAULT)) < 0)
+ goto out;
+ if((tid = H5Aget_type(aid)) < 0)
+ goto out;
+ if((sid = H5Aget_space(aid)) < 0)
+ goto out;
+
+ /* allocate and initialize the VL */
+ buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
+
+ if(buf == NULL)
+ goto out;
+
+ /* read */
+ if(H5Aread(aid, tid, buf) < 0)
+ goto out;
+
+ if ( buf[dim].len > 0 )
+ {
+ if (ds_idx!=NULL)
+ j_idx = *ds_idx;
+ else
+ j_idx=0;
+
+ /* iterate */
+ for(i=j_idx; i<nscales; i++)
+ {
+ /* get the reference */
+ ref = ((hobj_ref_t *)buf[dim].p)[ i ];
+
+ /* disable error reporting, the ID might refer to a deleted dataset */
+ H5E_BEGIN_TRY {
+ /* get the DS id */
+ if ((scale_id = H5Rdereference(did,H5R_OBJECT,&ref)) < 0)
+ goto out;
+ } H5E_END_TRY;
+
+ /* set the return IDX OUT value at current scale index */
+ if (ds_idx!=NULL)
+ {
+ *ds_idx = i;
+ }
+
+ if((ret_value=(visitor)(did,dim,scale_id,visitor_data))!=0)
+ {
+ /* break */
+
+ /* close the DS id */
+ if (H5Dclose(scale_id) < 0)
+ goto out;
+
+ break;
+ }
+
+ /* close the DS id */
+ if (H5Dclose(scale_id) < 0)
+ goto out;
+
+ } /* i */
+ } /* if */
+
+ /* close */
+ if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf) < 0)
+ goto out;
+ if (H5Sclose(sid) < 0)
+ goto out;
+ if (H5Tclose(tid) < 0)
+ goto out;
+ if (H5Aclose(aid) < 0)
+ goto out;
+ if (buf)
+ {
+ free(buf);
+ buf = NULL;
+ }
+
+ } /* if has_dimlist */
+
+ return ret_value;
out:
- H5E_BEGIN_TRY {
- if (buf)
- {
- H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf);
- free(buf);
- }
- H5Sclose(sid);
- H5Aclose(aid);
- H5Tclose(tid);
- } H5E_END_TRY;
- return FAIL;
+ H5E_BEGIN_TRY {
+ if (buf)
+ {
+ H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf);
+ free(buf);
+ }
+ H5Sclose(sid);
+ H5Aclose(aid);
+ H5Tclose(tid);
+ } H5E_END_TRY;
+ return FAIL;
}
/*-------------------------------------------------------------------------
- * Function: H5DSset_label
- *
- * Purpose: Set label for the dimension IDX of dataset DID to the value LABEL
- *
- * Return: Success: SUCCEED, Failure: FAIL
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: January 11, 2005
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-
-herr_t H5DSset_label(hid_t did,
- unsigned int idx,
- const char *label)
+* Function: H5DSset_label
+*
+* Purpose: Set label for the dimension IDX of dataset DID to the value LABEL
+*
+* Return: Success: SUCCEED, Failure: FAIL
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: January 11, 2005
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
+
+herr_t H5DSset_label(hid_t did, unsigned int idx, const char *label)
{
- int has_labels;
- hid_t sid; /* space ID */
- hid_t tid = -1; /* attribute type ID */
- hid_t aid = -1; /* attribute ID */
- int rank; /* rank of dataset */
- hsize_t dims[1]; /* dimensions of dataset */
- const char **buf=NULL; /* buffer to store in the attribute */
- H5I_type_t it; /* ID type */
- unsigned int i;
-
-/*-------------------------------------------------------------------------
- * parameter checking
- *-------------------------------------------------------------------------
- */
- /* get ID type */
- if ((it = H5Iget_type(did)) < 0)
- return FAIL;
-
- if (H5I_DATASET!=it)
- return FAIL;
-
-/*-------------------------------------------------------------------------
- * attribute "DIMENSION_LABELS"
- *-------------------------------------------------------------------------
- */
-
- /* try to find the attribute "DIMENSION_LABELS" on the >>data<< dataset */
- if ((has_labels = H5LT_find_attribute(did,DIMENSION_LABELS)) < 0)
- return FAIL;
-
- /* get dataset space */
- if ((sid = H5Dget_space(did)) < 0)
- return FAIL;
-
- /* get rank */
- if ((rank=H5Sget_simple_extent_ndims(sid)) < 0)
- goto out;
-
- /* close dataset space */
- if (H5Sclose(sid) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * make the attribute and insert label
- *-------------------------------------------------------------------------
- */
-
- if (has_labels == 0)
- {
- dims[0] = rank;
-
- /* space for the attribute */
- if((sid = H5Screate_simple(1, dims, NULL)) < 0)
- goto out;
-
- /* create the datatype */
- if((tid = H5Tcopy(H5T_C_S1)) < 0)
- goto out;
- if(H5Tset_size(tid, H5T_VARIABLE) < 0)
- goto out;
-
- /* create the attribute */
- if((aid = H5Acreate2(did, DIMENSION_LABELS, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
-
- /* allocate and initialize */
- buf = (const char **)malloc((size_t)rank * sizeof(char *));
-
- if(buf == NULL)
- goto out;
-
- for(i = 0; i < (unsigned int)rank; i++)
- buf[i] = NULL;
-
- /* store the label information in the required index */
- buf[idx] = label;
-
- /* write the attribute with the label */
- if (H5Awrite(aid,tid,buf) < 0)
- goto out;
-
- /* close */
- if (H5Sclose(sid) < 0)
- goto out;
- if(H5Tclose(tid) < 0)
- goto out;
- if(H5Aclose(aid) < 0)
- goto out;
- if(buf)
- free(buf);
- }
-
-/*-------------------------------------------------------------------------
- * just insert label
- *-------------------------------------------------------------------------
- */
-
- else
- {
- if((aid = H5Aopen(did, DIMENSION_LABELS, H5P_DEFAULT)) < 0)
- goto out;
-
- if((tid = H5Aget_type(aid)) < 0)
- goto out;
-
- /* allocate and initialize */
- buf = (const char **)malloc((size_t)rank * sizeof(char *));
-
- if(buf == NULL)
- goto out;
-
- /* read */
- if(H5Aread(aid, tid, buf) < 0)
- goto out;
-
- /* store the label information in the required index */
- buf[idx] = label;
+ int has_labels;
+ hid_t sid = -1; /* space ID */
+ hid_t tid = -1; /* attribute type ID */
+ hid_t aid = -1; /* attribute ID */
+ int rank; /* rank of dataset */
+ hsize_t dims[1]; /* dimensions of dataset */
+ const char **buf = NULL; /* buffer to store in the attribute */
+ H5I_type_t it; /* ID type */
+ unsigned int i;
+
+ /*-------------------------------------------------------------------------
+ * parameter checking
+ *-------------------------------------------------------------------------
+ */
+ /* get ID type */
+ if ((it = H5Iget_type(did)) < 0)
+ return FAIL;
+
+ if (H5I_DATASET != it)
+ return FAIL;
+
+ /* get dataset space */
+ if ((sid = H5Dget_space(did)) < 0)
+ return FAIL;
+
+ /* get rank */
+ if ((rank = H5Sget_simple_extent_ndims(sid)) < 0)
+ goto out;
+
+ /* close dataset space */
+ if (H5Sclose(sid) < 0)
+ goto out;
+
+ if ( idx >= (unsigned)rank )
+ return FAIL;
+
+ /*-------------------------------------------------------------------------
+ * attribute "DIMENSION_LABELS"
+ *-------------------------------------------------------------------------
+ */
+
+ /* try to find the attribute "DIMENSION_LABELS" on the >>data<< dataset */
+ if ((has_labels = H5LT_find_attribute(did, DIMENSION_LABELS)) < 0)
+ return FAIL;
+
+ /*-------------------------------------------------------------------------
+ * make the attribute and insert label
+ *-------------------------------------------------------------------------
+ */
+
+ if (has_labels == 0)
+ {
+ dims[0] = rank;
+
+ /* space for the attribute */
+ if ((sid = H5Screate_simple(1, dims, NULL)) < 0)
+ goto out;
+
+ /* create the datatype */
+ if ((tid = H5Tcopy(H5T_C_S1)) < 0)
+ goto out;
+ if (H5Tset_size(tid, H5T_VARIABLE) < 0)
+ goto out;
+
+ /* create the attribute */
+ if ((aid = H5Acreate2(did, DIMENSION_LABELS, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* allocate and initialize */
+ buf = (const char **) malloc((size_t) rank * sizeof(char *));
+
+ if (buf == NULL)
+ goto out;
+
+ for (i = 0; i < (unsigned int) rank; i++)
+ buf[i] = NULL;
+
+ /* store the label information in the required index */
+ buf[idx] = label;
+
+ /* write the attribute with the label */
+ if (H5Awrite(aid, tid, buf) < 0)
+ goto out;
+
+ /* close */
+ if (H5Sclose(sid) < 0)
+ goto out;
+ if (H5Tclose(tid) < 0)
+ goto out;
+ if (H5Aclose(aid) < 0)
+ goto out;
+ if (buf)
+ {
+ free(buf);
+ buf = NULL;
+ }
+ }
- /* write the attribute with the new references */
- if (H5Awrite(aid,tid,buf) < 0)
- goto out;
+ /*-------------------------------------------------------------------------
+ * just insert label
+ *-------------------------------------------------------------------------
+ */
- /* close */
- if (H5Tclose(tid) < 0)
- goto out;
- if (H5Aclose(aid) < 0)
- goto out;
- if (buf)
- free(buf);
- }
+ else
+ {
+ if ((aid = H5Aopen(did, DIMENSION_LABELS, H5P_DEFAULT)) < 0)
+ goto out;
+
+ if ((tid = H5Aget_type(aid)) < 0)
+ goto out;
+
+ /* allocate and initialize */
+ buf = (const char **) malloc((size_t) rank * sizeof(char *));
+
+ if (buf == NULL)
+ goto out;
+
+ /* read */
+ if (H5Aread(aid, tid, (void *) buf) < 0)
+ goto out;
+
+ /* free the ptr that will be replaced by label */
+ if (buf[idx])
+ free((void *)buf[idx]);
+
+ /* store the label information in the required index */
+ buf[idx] = label;
+
+ /* write the attribute with the new references */
+ if (H5Awrite(aid, tid, buf) < 0)
+ goto out;
+
+ /* label was brought in, so don't free */
+ buf[idx] = NULL;
+
+ /* free all the ptr's from the H5Aread() */
+ for (i = 0; i < (unsigned int) rank; i++)
+ {
+ if (buf[i])
+ free((void *)buf[i]);
+ }
+
+ /* close */
+ if (H5Tclose(tid) < 0)
+ goto out;
+ if (H5Aclose(aid) < 0)
+ goto out;
+ if (buf)
+ {
+ free(buf);
+ buf = NULL;
+ }
+ }
- return SUCCEED;
+ return SUCCEED;
- /* error zone, gracefully close */
-out:
- H5E_BEGIN_TRY {
- H5Sclose(sid);
- H5Aclose(aid);
- H5Tclose(tid);
- } H5E_END_TRY;
- return FAIL;
+ /* error zone */
+out:
+ if (buf)
+ {
+ if (buf[idx]) /* check if we errored during H5Awrite */
+ buf[idx] = NULL; /* don't free label */
+ /* free all the ptr's from the H5Aread() */
+ for (i = 0; i < (unsigned int) rank; i++)
+ {
+ if (buf[i])
+ free((void *)buf[i]);
+ }
+ free(buf);
+ }
+ H5E_BEGIN_TRY
+ {
+ H5Sclose(sid);
+ H5Aclose(aid);
+ H5Tclose(tid);
+ }H5E_END_TRY;
+ return FAIL;
}
/*-------------------------------------------------------------------------
- * Function: H5DSget_label
- *
- * Purpose: Read the label LABEL for dimension IDX of dataset DID
- * Up to 'size' characters are stored in 'label' followed by a '\0' string
- * terminator. If the label is longer than 'size'-1,
- * the string terminator is stored in the last position of the buffer to
- * properly terminate the string.
- *
- * Return: 0 if no label found, size of label if found, Failure: FAIL
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: January 11, 2005
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-ssize_t H5DSget_label(hid_t did,
- unsigned int idx,
- char *label,
- size_t size)
+* Function: H5DSget_label
+*
+* Purpose: Read the label LABEL for dimension IDX of dataset DID
+* Up to 'size' characters are stored in 'label' followed by a '\0' string
+* terminator. If the label is longer than 'size'-1,
+* the string terminator is stored in the last position of the buffer to
+* properly terminate the string.
+*
+* Return: 0 if no label found, size of label if found, Failure: FAIL
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: January 11, 2005
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
+ssize_t H5DSget_label(hid_t did, unsigned int idx, char *label, size_t size)
{
- int has_labels;
- hid_t sid; /* space ID */
- hid_t tid = -1; /* attribute type ID */
- hid_t aid = -1; /* attribute ID */
- int rank; /* rank of dataset */
- char **buf=NULL; /* buffer to store in the attribute */
- H5I_type_t it; /* ID type */
- size_t nbytes;
- size_t copy_len;
+ int has_labels;
+ hid_t sid = -1; /* space ID */
+ hid_t tid = -1; /* attribute type ID */
+ hid_t aid = -1; /* attribute ID */
+ int rank; /* rank of dataset */
+ char **buf = NULL; /* buffer to store in the attribute */
+ H5I_type_t it; /* ID type */
+ size_t nbytes;
+ size_t copy_len;
+ int i;
+
+ /*-------------------------------------------------------------------------
+ * parameter checking
+ *-------------------------------------------------------------------------
+ */
+ /* get ID type */
+ if ((it = H5Iget_type(did)) < 0)
+ return FAIL;
+
+ if (H5I_DATASET != it)
+ return FAIL;
+
+ /* get dataset space */
+ if ((sid = H5Dget_space(did)) < 0)
+ return FAIL;
+
+ /* get rank */
+ if ((rank = H5Sget_simple_extent_ndims(sid)) < 0)
+ goto out;
+
+ /* close dataset space */
+ if (H5Sclose(sid) < 0)
+ goto out;
+
+ if ( idx >= (unsigned)rank )
+ return FAIL;
+
+ /*-------------------------------------------------------------------------
+ * attribute "DIMENSION_LABELS"
+ *-------------------------------------------------------------------------
+ */
+
+ /* try to find the attribute "DIMENSION_LABELS" on the >>data<< dataset */
+ if ((has_labels = H5LT_find_attribute(did, DIMENSION_LABELS)) < 0)
+ return FAIL;
+
+ /* return 0 and NULL for label if no label found */
+ if (has_labels == 0)
+ {
+ if (label)
+ label[0] = 0;
+ return 0;
+ }
-/*-------------------------------------------------------------------------
- * parameter checking
- *-------------------------------------------------------------------------
- */
- /* get ID type */
- if ((it = H5Iget_type(did)) < 0)
- return FAIL;
+ /*-------------------------------------------------------------------------
+ * open the attribute and read label
+ *-------------------------------------------------------------------------
+ */
- if (H5I_DATASET!=it)
- return FAIL;
+ assert (has_labels == 1);
+ if ((aid = H5Aopen(did, DIMENSION_LABELS, H5P_DEFAULT)) < 0)
+ goto out;
-/*-------------------------------------------------------------------------
- * attribute "DIMENSION_LABELS"
- *-------------------------------------------------------------------------
- */
-
- /* try to find the attribute "DIMENSION_LABELS" on the >>data<< dataset */
- if ((has_labels = H5LT_find_attribute(did,DIMENSION_LABELS)) < 0)
- return FAIL;
-
- /* return 0 and NULL for label if no label found */
- if (has_labels == 0)
- {
- if (label)
- label=NULL;
- return 0;
- }
-
- /* get dataset space */
- if ((sid = H5Dget_space(did)) < 0)
- return FAIL;
-
- /* get rank */
- if((rank = H5Sget_simple_extent_ndims(sid)) < 0)
- goto out;
-
- /* close dataset space */
- if(H5Sclose(sid) < 0)
- goto out;
+ if ((tid = H5Aget_type(aid)) < 0)
+ goto out;
-/*-------------------------------------------------------------------------
- * open the attribute and read label
- *-------------------------------------------------------------------------
- */
+ /* allocate and initialize */
+ buf = (char **) malloc((size_t) rank * sizeof(char *));
- assert (has_labels == 1);
- if((aid = H5Aopen(did, DIMENSION_LABELS, H5P_DEFAULT)) < 0)
- goto out;
+ if (buf == NULL)
+ goto out;
- if((tid = H5Aget_type(aid)) < 0)
- goto out;
+ /* read */
+ if (H5Aread(aid, tid, buf) < 0)
+ goto out;
- /* allocate and initialize */
- buf = (char **)malloc((size_t)rank * sizeof(char *));
+ /* get the real string length */
+ nbytes = strlen(buf[idx]);
- if(buf == NULL)
- goto out;
+ /* compute the string length which will fit into the user's buffer */
+ copy_len = MIN(size-1, nbytes);
- /* read */
- if(H5Aread(aid, tid, buf) < 0)
- goto out;
-
- /* get the real string length */
- nbytes = strlen(buf[idx]);
-
- /* compute the string length which will fit into the user's buffer */
- copy_len = MIN(size-1, nbytes);
+ /* copy all/some of the name */
+ if (label)
+ {
+ memcpy(label, buf[idx], copy_len);
- /* copy all/some of the name */
- if( label ) {
- memcpy(label, buf[idx], copy_len);
+ /* terminate the string */
+ label[copy_len] = '\0';
+ }
- /* terminate the string */
- label[copy_len]='\0';
+ /* free all the ptr's from the H5Aread() */
+ for (i = 0; i < rank; i++)
+ {
+ if (buf[i])
+ free(buf[i]);
+ }
- /* close */
- if (H5Tclose(tid) < 0)
- goto out;
- if (H5Aclose(aid) < 0)
- goto out;
- if (buf)
- free(buf);
- }
+ /* close */
+ if (H5Tclose(tid) < 0)
+ goto out;
+ if (H5Aclose(aid) < 0)
+ goto out;
+ if (buf)
+ {
+ free(buf);
+ buf = NULL;
+ }
- return (ssize_t) nbytes;
+ return (ssize_t) nbytes;
- /* error zone, gracefully close */
-out:
- H5E_BEGIN_TRY {
- H5Sclose(sid);
- H5Aclose(aid);
- H5Tclose(tid);
- } H5E_END_TRY;
- return FAIL;
+ /* error zone */
+out:
+ if (buf)
+ {
+ /* free all the ptr's from the H5Aread() */
+ for (i = 0; i < rank; i++)
+ {
+ if (buf[i])
+ free(buf[i]);
+ }
+ free(buf);
+ }
+ H5E_BEGIN_TRY
+ {
+ H5Sclose(sid);
+ H5Aclose(aid);
+ H5Tclose(tid);
+ }H5E_END_TRY;
+ return FAIL;
}
/*-------------------------------------------------------------------------
- * Function: H5DSget_scale_name
- *
- * Purpose: Read the name of dataset scale DID into buffer NAME
- * Up to 'size' characters are stored in 'name' followed by a '\0' string
- * terminator. If the name is longer than 'size'-1,
- * the string terminator is stored in the last position of the buffer to
- * properly terminate the string.
- *
- * Return: size of name if found, zero if not found, Failure: FAIL
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: January 04, 2005
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5DSget_scale_name
+*
+* Purpose: Read the name of dataset scale DID into buffer NAME
+* Up to 'size' characters are stored in 'name' followed by a '\0' string
+* terminator. If the name is longer than 'size'-1,
+* the string terminator is stored in the last position of the buffer to
+* properly terminate the string.
+*
+* Return: size of name if found, zero if not found, Failure: FAIL
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: January 04, 2005
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
ssize_t H5DSget_scale_name(hid_t did,
char *name,
size_t size)
{
- hid_t aid; /* attribute ID */
- hid_t tid = -1; /* attribute type ID */
- hid_t sid; /* space ID */
- H5I_type_t it; /* ID type */
- size_t nbytes;
- size_t copy_len;
- int has_name;
- char *buf=NULL;
-
-/*-------------------------------------------------------------------------
- * parameter checking
- *-------------------------------------------------------------------------
- */
- /* get ID type */
- if ((it = H5Iget_type(did)) < 0)
- return FAIL;
-
- if (H5I_DATASET!=it)
- return FAIL;
-
- if ((H5DSis_scale(did))<=0)
- return FAIL;
-
-/*-------------------------------------------------------------------------
- * check if the DS has a name
- *-------------------------------------------------------------------------
- */
+ hid_t aid; /* attribute ID */
+ hid_t tid = -1; /* attribute type ID */
+ hid_t sid; /* space ID */
+ H5I_type_t it; /* ID type */
+ size_t nbytes;
+ size_t copy_len;
+ int has_name;
+ char *buf=NULL;
+
+ /*-------------------------------------------------------------------------
+ * parameter checking
+ *-------------------------------------------------------------------------
+ */
+ /* get ID type */
+ if ((it = H5Iget_type(did)) < 0)
+ return FAIL;
+
+ if (H5I_DATASET!=it)
+ return FAIL;
+
+ if ((H5DSis_scale(did))<=0)
+ return FAIL;
+
+ /*-------------------------------------------------------------------------
+ * check if the DS has a name
+ *-------------------------------------------------------------------------
+ */
+
+ /* try to find the attribute "NAME" on the >>DS<< dataset */
+ if ((has_name = H5LT_find_attribute(did, "NAME")) < 0)
+ return FAIL;
+
+ if (has_name == 0)
+ return 0;
+
+ /*-------------------------------------------------------------------------
+ * open the attribute
+ *-------------------------------------------------------------------------
+ */
+
+ if((aid = H5Aopen(did, "NAME", H5P_DEFAULT)) < 0)
+ return FAIL;
+
+ /* get space */
+ if((sid = H5Aget_space(aid)) < 0)
+ goto out;
+
+ /* get type */
+ if((tid = H5Aget_type(aid)) < 0)
+ goto out;
+
+ /* get the size */
+ if((nbytes = H5Tget_size(tid)) == 0)
+ goto out;
+
+ /* allocate a temporary buffer */
+ buf = (char*)malloc(nbytes * sizeof(char));
+ if (buf == NULL)
+ goto out;
+
+ /* read */
+ if (H5Aread(aid,tid,buf) < 0)
+ goto out;
+
+ /* compute the string length which will fit into the user's buffer */
+ copy_len = MIN(size-1, nbytes);
+
+ /* copy all/some of the name */
+ if (name) {
+ memcpy(name, buf, copy_len);
+
+ /* terminate the string */
+ name[copy_len]='\0';
+ }
- /* try to find the attribute "NAME" on the >>DS<< dataset */
- if((has_name = H5LT_find_attribute(did, "NAME")) < 0)
- return FAIL;
+ /* close */
+ if (H5Tclose(tid) < 0)
+ goto out;
+ if (H5Aclose(aid) < 0)
+ goto out;
+ if (H5Sclose(sid) < 0)
+ goto out;
+ if (buf)
+ {
+ free(buf);
+ buf=NULL;
+ }
- if(has_name == 0)
- return 0;
+ return (ssize_t) nbytes;
-/*-------------------------------------------------------------------------
- * open the attribute
- *-------------------------------------------------------------------------
- */
-
- if((aid = H5Aopen(did, "NAME", H5P_DEFAULT)) < 0)
- return FAIL;
-
- /* get space */
- if((sid = H5Aget_space(aid)) < 0)
- goto out;
-
- /* get type */
- if((tid = H5Aget_type(aid)) < 0)
- goto out;
-
- /* get the size */
- if((nbytes = H5Tget_size(tid)) == 0)
- goto out;
-
- /* allocate a temporary buffer */
- buf = (char*)malloc(nbytes * sizeof(char));
- if (buf == NULL)
- goto out;
-
- /* read */
- if (H5Aread(aid,tid,buf) < 0)
- goto out;
-
- /* compute the string length which will fit into the user's buffer */
- copy_len = MIN(size-1, nbytes);
-
- /* copy all/some of the name */
- if (name) {
- memcpy(name, buf, copy_len);
-
- /* terminate the string */
- name[copy_len]='\0';
- }
-
- /* close */
- if (H5Tclose(tid) < 0)
- goto out;
- if (H5Aclose(aid) < 0)
- goto out;
- if (H5Sclose(sid) < 0)
- goto out;
- if (buf)
- {
- free(buf);
- buf=NULL;
- }
-
- return (ssize_t) nbytes;
-
- /* error zone, gracefully close */
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Aclose(aid);
- H5Tclose(tid);
- H5Sclose(sid);
- } H5E_END_TRY;
- if (buf)
- free(buf);
- return FAIL;
+ H5E_BEGIN_TRY {
+ H5Aclose(aid);
+ H5Tclose(tid);
+ H5Sclose(sid);
+ } H5E_END_TRY;
+ if (buf)
+ {
+ free(buf);
+ buf=NULL;
+ }
+ return FAIL;
}
/*-------------------------------------------------------------------------
- * Function: H5DSis_scale
- *
- * Purpose: check if the dataset DID is a dimension scale
- *
- * Return: 1, is, 0, not, FAIL, error
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: January 04, 2005
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5DSis_scale
+*
+* Purpose: check if the dataset DID is a dimension scale
+*
+* Return: 1, is, 0, not, FAIL, error
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: January 04, 2005
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
htri_t H5DSis_scale(hid_t did)
{
- hid_t tid = -1; /* attribute type ID */
- hid_t aid; /* attribute ID */
- herr_t has_class; /* has the "CLASS" attribute */
- htri_t is_ds; /* boolean return value */
- H5I_type_t it; /* ID type */
- char buf[20];
-
-/*-------------------------------------------------------------------------
- * parameter checking
- *-------------------------------------------------------------------------
- */
- /* get ID type */
- if ((it = H5Iget_type(did)) < 0)
- return FAIL;
-
- if(H5I_DATASET != it)
- return FAIL;
-
- /* try to find the attribute "CLASS" on the dataset */
- if((has_class = H5LT_find_attribute(did, "CLASS")) < 0)
- return FAIL;
-
- if(has_class == 0)
- is_ds = 0;
-
- else
- {
- if((aid = H5Aopen(did, "CLASS", H5P_DEFAULT)) < 0)
- goto out;
+ hid_t tid = -1; /* attribute type ID */
+ hid_t aid; /* attribute ID */
+ herr_t has_class; /* has the "CLASS" attribute */
+ htri_t is_ds; /* boolean return value */
+ H5I_type_t it; /* ID type */
+ char buf[20];
+
+ /*-------------------------------------------------------------------------
+ * parameter checking
+ *-------------------------------------------------------------------------
+ */
+ /* get ID type */
+ if ((it = H5Iget_type(did)) < 0)
+ return FAIL;
+
+ if(H5I_DATASET != it)
+ return FAIL;
+
+ /* try to find the attribute "CLASS" on the dataset */
+ if((has_class = H5LT_find_attribute(did, "CLASS")) < 0)
+ return FAIL;
+
+ if(has_class == 0)
+ is_ds = 0;
+
+ else
+ {
+ if((aid = H5Aopen(did, "CLASS", H5P_DEFAULT)) < 0)
+ goto out;
- if((tid = H5Aget_type(aid)) < 0)
- goto out;
+ if((tid = H5Aget_type(aid)) < 0)
+ goto out;
- if(H5Aread(aid, tid, buf) < 0)
- goto out;
+ if(H5Aread(aid, tid, buf) < 0)
+ goto out;
- if(strcmp(buf, DIMENSION_SCALE_CLASS)==0)
- is_ds = 1;
- else
- is_ds = 0;
+ if(strcmp(buf, DIMENSION_SCALE_CLASS)==0)
+ is_ds = 1;
+ else
+ is_ds = 0;
- if(H5Tclose(tid) < 0)
- goto out;
+ if(H5Tclose(tid) < 0)
+ goto out;
- if (H5Aclose(aid) < 0)
- goto out;
- }
+ if (H5Aclose(aid) < 0)
+ goto out;
+ }
- return is_ds;
+ return is_ds;
-/* error zone, gracefully close */
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Aclose(aid);
- H5Tclose(tid);
- } H5E_END_TRY;
- return FAIL;
+ H5E_BEGIN_TRY {
+ H5Aclose(aid);
+ H5Tclose(tid);
+ } H5E_END_TRY;
+ return FAIL;
}
/*-------------------------------------------------------------------------
- * Function: H5DSget_num_scales
- *
- * Purpose: get the number of scales linked to the IDX dimension of dataset DID
- *
- * Return:
- * Success: number of scales
- * Failure: FAIL
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: January 13, 2005
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5DSget_num_scales
+*
+* Purpose: get the number of scales linked to the IDX dimension of dataset DID
+*
+* Return:
+* Success: number of scales
+* Failure: FAIL
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: January 13, 2005
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
int H5DSget_num_scales(hid_t did,
unsigned int idx)
{
- int has_dimlist;
- hid_t sid; /* space ID */
- hid_t tid = -1; /* attribute type ID */
- hid_t aid = -1; /* attribute ID */
- int rank; /* rank of dataset */
- hvl_t *buf; /* VL buffer to store in the attribute */
- H5I_type_t it; /* ID type */
- int nscales;
-
-/*-------------------------------------------------------------------------
- * parameter checking
- *-------------------------------------------------------------------------
- */
- /* get ID type */
- if ((it = H5Iget_type(did)) < 0)
- return FAIL;
-
- if (H5I_DATASET!=it)
- return FAIL;
-
-/*-------------------------------------------------------------------------
- * the attribute "DIMENSION_LIST" on the >>data<< dataset must exist
- *-------------------------------------------------------------------------
- */
- /* get dataset space */
- if ((sid = H5Dget_space(did)) < 0)
- return FAIL;
-
- /* get rank */
- if ((rank=H5Sget_simple_extent_ndims(sid)) < 0)
- goto out;
-
- /* close dataset space */
- if (H5Sclose(sid) < 0)
- goto out;
-
- /* dimemsion index IDX range checking */
- if (idx>=(unsigned int )rank)
- return FAIL;
-
- /* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */
- if((has_dimlist = H5LT_find_attribute(did, DIMENSION_LIST)) < 0)
- return FAIL;
-
- /* it does not exist */
- if(has_dimlist == 0)
- return 0;
-
-/*-------------------------------------------------------------------------
- * the attribute exists, open it
- *-------------------------------------------------------------------------
- */
-
- else
- {
- if((aid = H5Aopen(did, DIMENSION_LIST, H5P_DEFAULT)) < 0)
- goto out;
- if((tid = H5Aget_type(aid)) < 0)
- goto out;
- if((sid = H5Aget_space(aid)) < 0)
- goto out;
-
- /* allocate and initialize the VL */
- buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
-
- if(buf == NULL)
- goto out;
-
- /* read */
- if(H5Aread(aid, tid, buf) < 0)
- goto out;
-
- nscales=(int)buf[idx].len;
-
- /* close */
- if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf) < 0)
- goto out;
- if (H5Sclose(sid) < 0)
- goto out;
- if (H5Tclose(tid) < 0)
- goto out;
- if (H5Aclose(aid) < 0)
- goto out;
- if (buf)
- free(buf);
-
- } /* has_dimlist */
-
- return nscales;
-
-/* error zone, gracefully close */
+ int has_dimlist;
+ hid_t sid; /* space ID */
+ hid_t tid = -1; /* attribute type ID */
+ hid_t aid = -1; /* attribute ID */
+ int rank; /* rank of dataset */
+ hvl_t *buf; /* VL buffer to store in the attribute */
+ H5I_type_t it; /* ID type */
+ int nscales;
+
+ /*-------------------------------------------------------------------------
+ * parameter checking
+ *-------------------------------------------------------------------------
+ */
+ /* get ID type */
+ if ((it = H5Iget_type(did)) < 0)
+ return FAIL;
+
+ if (H5I_DATASET!=it)
+ return FAIL;
+
+ /*-------------------------------------------------------------------------
+ * the attribute "DIMENSION_LIST" on the >>data<< dataset must exist
+ *-------------------------------------------------------------------------
+ */
+ /* get dataset space */
+ if ((sid = H5Dget_space(did)) < 0)
+ return FAIL;
+
+ /* get rank */
+ if ((rank=H5Sget_simple_extent_ndims(sid)) < 0)
+ goto out;
+
+ /* close dataset space */
+ if (H5Sclose(sid) < 0)
+ goto out;
+
+ /* dimemsion index IDX range checking */
+ if (idx>=(unsigned int )rank)
+ return FAIL;
+
+ /* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */
+ if((has_dimlist = H5LT_find_attribute(did, DIMENSION_LIST)) < 0)
+ return FAIL;
+
+ /* it does not exist */
+ if(has_dimlist == 0)
+ return 0;
+
+ /*-------------------------------------------------------------------------
+ * the attribute exists, open it
+ *-------------------------------------------------------------------------
+ */
+
+ else
+ {
+ if((aid = H5Aopen(did, DIMENSION_LIST, H5P_DEFAULT)) < 0)
+ goto out;
+ if((tid = H5Aget_type(aid)) < 0)
+ goto out;
+ if((sid = H5Aget_space(aid)) < 0)
+ goto out;
+
+ /* allocate and initialize the VL */
+ buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
+
+ if(buf == NULL)
+ goto out;
+
+ /* read */
+ if(H5Aread(aid, tid, buf) < 0)
+ goto out;
+
+ nscales=(int)buf[idx].len;
+
+ /* close */
+ if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf) < 0)
+ goto out;
+ if (H5Sclose(sid) < 0)
+ goto out;
+ if (H5Tclose(tid) < 0)
+ goto out;
+ if (H5Aclose(aid) < 0)
+ goto out;
+ if (buf)
+ {
+ free(buf);
+ buf = NULL;
+ }
+
+ } /* has_dimlist */
+
+ return nscales;
+
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Sclose(sid);
- H5Aclose(aid);
- H5Tclose(tid);
- } H5E_END_TRY;
- return FAIL;
+ H5E_BEGIN_TRY {
+ H5Sclose(sid);
+ H5Aclose(aid);
+ H5Tclose(tid);
+ } H5E_END_TRY;
+
+ if (buf)
+ {
+ free(buf);
+ buf = NULL;
+ }
+ return FAIL;
}
/*-------------------------------------------------------------------------
- * Function: H5DS_is_reserved
- *
- * Purpose: Verify that a dataset's CLASS is either an image, palette or table
- *
- * Return: true, false, fail
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: March 19, 2005
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5DS_is_reserved
+*
+* Purpose: Verify that a dataset's CLASS is either an image, palette or table
+*
+* Return: true, false, fail
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: March 19, 2005
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5DS_is_reserved(hid_t did)
{
- int has_class;
- hid_t tid = -1;
- hid_t aid = -1;
- char buf[40];
- herr_t ret;
+ int has_class;
+ hid_t tid = -1;
+ hid_t aid = -1;
+ char buf[40];
+ herr_t ret;
- /* try to find the attribute "CLASS" on the dataset */
- if((has_class = H5LT_find_attribute(did, "CLASS")) < 0)
- return -1;
+ /* try to find the attribute "CLASS" on the dataset */
+ if((has_class = H5LT_find_attribute(did, "CLASS")) < 0)
+ return -1;
- if(has_class == 0)
- return 0;
+ if(has_class == 0)
+ return 0;
- assert(has_class == 1);
- if((aid = H5Aopen(did, "CLASS", H5P_DEFAULT)) < 0)
- goto out;
+ assert(has_class == 1);
+ if((aid = H5Aopen(did, "CLASS", H5P_DEFAULT)) < 0)
+ goto out;
- if((tid = H5Aget_type(aid)) < 0)
- goto out;
+ if((tid = H5Aget_type(aid)) < 0)
+ goto out;
- if(H5Aread(aid, tid, buf) < 0)
- goto out;
+ if(H5Aread(aid, tid, buf) < 0)
+ goto out;
- if(strcmp(buf, IMAGE_CLASS) == 0 ||
- strcmp(buf, PALETTE_CLASS) == 0 ||
- strcmp(buf, TABLE_CLASS) == 0 )
- ret = 1;
- else
- ret = 0;
+ if(strcmp(buf, IMAGE_CLASS) == 0 ||
+ strcmp(buf, PALETTE_CLASS) == 0 ||
+ strcmp(buf, TABLE_CLASS) == 0 )
+ ret = 1;
+ else
+ ret = 0;
- if (H5Tclose(tid) < 0)
- goto out;
+ if (H5Tclose(tid) < 0)
+ goto out;
- if (H5Aclose(aid) < 0)
- goto out;
+ if (H5Aclose(aid) < 0)
+ goto out;
- return ret;
+ return ret;
-/* error zone, gracefully close */
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Tclose(tid);
- H5Aclose(aid);
- } H5E_END_TRY;
- return FAIL;
+ H5E_BEGIN_TRY
+ {
+ H5Tclose(tid);
+ H5Aclose(aid);
+ } H5E_END_TRY;
+ return FAIL;
}
diff --git a/hl/src/H5IM.c b/hl/src/H5IM.c
index d760675..361a65b 100644
--- a/hl/src/H5IM.c
+++ b/hl/src/H5IM.c
@@ -1,17 +1,17 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
- * terms governing use, modification, and redistribution, is contained in *
- * the files COPYING and Copyright.html. COPYING can be found at the root *
- * of the source code distribution tree; Copyright.html can be found at the *
- * root level of an installed copy of the electronic HDF5 document set and *
- * is linked from the top-level documents page. It can also be found at *
- * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+* Copyright by The HDF Group. *
+* Copyright by the Board of Trustees of the University of Illinois. *
+* All rights reserved. *
+* *
+* This file is part of HDF5. The full HDF5 copyright notice, including *
+* terms governing use, modification, and redistribution, is contained in *
+* the files COPYING and Copyright.html. COPYING can be found at the root *
+* of the source code distribution tree; Copyright.html can be found at the *
+* root level of an installed copy of the electronic HDF5 document set and *
+* is linked from the top-level documents page. It can also be found at *
+* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
+* access to either file, you may request a copy from help@hdfgroup.org. *
+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "H5IMprivate.h"
#include "H5LTprivate.h"
@@ -19,155 +19,156 @@
#include <stdlib.h>
/*-------------------------------------------------------------------------
- * Function: H5IMmake_image_8bit
- *
- * Purpose: Creates and writes an image an 8 bit image
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
- *
- * Date: June 13, 2001
- *
- * Comments:
- * based on HDF5 Image and Palette Specification
- * http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5IMmake_image_8bit
+*
+* Purpose: Creates and writes an image an 8 bit image
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
+*
+* Date: June 13, 2001
+*
+* Comments:
+* based on HDF5 Image and Palette Specification
+* http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5IMmake_image_8bit( hid_t loc_id,
- const char *dset_name,
- hsize_t width,
- hsize_t height,
- const unsigned char *buffer )
+ const char *dset_name,
+ hsize_t width,
+ hsize_t height,
+ const unsigned char *buf )
{
- hsize_t dims[IMAGE8_RANK];
+ hsize_t dims[IMAGE8_RANK];
- /* Initialize the image dimensions */
- dims[0] = height;
- dims[1] = width;
+ /* Initialize the image dimensions */
+ dims[0] = height;
+ dims[1] = width;
- /* Make the dataset */
- if ( H5LTmake_dataset( loc_id, dset_name, IMAGE8_RANK, dims, H5T_NATIVE_UCHAR, buffer ) < 0)
- return -1;
+ /* Make the dataset */
+ if ( H5LTmake_dataset( loc_id, dset_name, IMAGE8_RANK, dims, H5T_NATIVE_UCHAR, buf ) < 0)
+ return -1;
- /* Attach the CLASS attribute */
- if ( H5LTset_attribute_string( loc_id, dset_name, "CLASS", IMAGE_CLASS ) < 0)
- return -1;
+ /* Attach the CLASS attribute */
+ if ( H5LTset_attribute_string( loc_id, dset_name, "CLASS", IMAGE_CLASS ) < 0)
+ return -1;
- /* Attach the VERSION attribute */
- if ( H5LTset_attribute_string( loc_id, dset_name, "IMAGE_VERSION", IMAGE_VERSION ) < 0)
- return -1;
+ /* Attach the VERSION attribute */
+ if ( H5LTset_attribute_string( loc_id, dset_name, "IMAGE_VERSION", IMAGE_VERSION ) < 0)
+ return -1;
- /* Attach the IMAGE_SUBCLASS attribute */
- if ( H5LTset_attribute_string( loc_id, dset_name, "IMAGE_SUBCLASS", "IMAGE_INDEXED" ) < 0)
- return -1;
+ /* Attach the IMAGE_SUBCLASS attribute */
+ if ( H5LTset_attribute_string( loc_id, dset_name, "IMAGE_SUBCLASS", "IMAGE_INDEXED" ) < 0)
+ return -1;
- return 0;
+ return 0;
}
/*-------------------------------------------------------------------------
- * Function: H5IMmake_image_24bit
- *
- * Purpose:
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
- *
- * Date: June 13, 2001
- *
- * Comments:
- * based on HDF5 Image and Palette Specification
- * http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
- *
- * Interlace Mode Dimensions in the Dataspace
- * INTERLACE_PIXEL [height][width][pixel components]
- * INTERLACE_PLANE [pixel components][height][width]
- *
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5IMmake_image_24bit
+*
+* Purpose:
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
+*
+* Date: June 13, 2001
+*
+* Comments:
+* based on HDF5 Image and Palette Specification
+* http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
+*
+* Interlace Mode Dimensions in the Dataspace
+* INTERLACE_PIXEL [height][width][pixel components]
+* INTERLACE_PLANE [pixel components][height][width]
+*
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5IMmake_image_24bit( hid_t loc_id,
- const char *dset_name,
- hsize_t width,
- hsize_t height,
- const char *interlace,
- const unsigned char *buffer )
+ const char *dset_name,
+ hsize_t width,
+ hsize_t height,
+ const char *interlace,
+ const unsigned char *buf )
{
- hsize_t dims[IMAGE24_RANK];
-
- /* Initialize the image dimensions */
-
- if ( strcmp( interlace, "INTERLACE_PIXEL" ) == 0 )
- {
- /* Number of color planes is defined as the third dimension */
- dims[0] = height;
- dims[1] = width;
- dims[2] = IMAGE24_RANK;
- }
- else
- if ( strcmp( interlace, "INTERLACE_PLANE" ) == 0 )
- {
- /* Number of color planes is defined as the first dimension */
- dims[0] = IMAGE24_RANK;
- dims[1] = height;
- dims[2] = width;
- }
- else return -1;
-
- /* Make the dataset */
- if ( H5LTmake_dataset( loc_id, dset_name, IMAGE24_RANK, dims, H5T_NATIVE_UCHAR, buffer ) < 0)
- return -1;
-
- /* Attach the CLASS attribute */
- if ( H5LTset_attribute_string( loc_id, dset_name, "CLASS", IMAGE_CLASS ) < 0)
- return -1;
-
- /* Attach the VERSION attribute */
- if ( H5LTset_attribute_string( loc_id, dset_name, "IMAGE_VERSION", IMAGE_VERSION ) < 0)
- return -1;
-
- /* Attach the IMAGE_SUBCLASS attribute */
- if ( H5LTset_attribute_string( loc_id, dset_name, "IMAGE_SUBCLASS", "IMAGE_TRUECOLOR" ) < 0)
- return -1;
-
- /* Attach the INTERLACE_MODE attribute. This attributes is only for true color images */
- if ( H5LTset_attribute_string( loc_id, dset_name, "INTERLACE_MODE", interlace ) < 0)
- return -1;
-
- return 0;
+ hsize_t dims[IMAGE24_RANK];
+
+ /* Initialize the image dimensions */
+
+ if ( strcmp( interlace, "INTERLACE_PIXEL" ) == 0 )
+ {
+ /* Number of color planes is defined as the third dimension */
+ dims[0] = height;
+ dims[1] = width;
+ dims[2] = IMAGE24_RANK;
+ }
+ else
+ if ( strcmp( interlace, "INTERLACE_PLANE" ) == 0 )
+ {
+ /* Number of color planes is defined as the first dimension */
+ dims[0] = IMAGE24_RANK;
+ dims[1] = height;
+ dims[2] = width;
+ }
+ else return -1;
+
+ /* Make the dataset */
+ if ( H5LTmake_dataset( loc_id, dset_name, IMAGE24_RANK, dims, H5T_NATIVE_UCHAR, buf ) < 0)
+ return -1;
+
+ /* Attach the CLASS attribute */
+ if ( H5LTset_attribute_string( loc_id, dset_name, "CLASS", IMAGE_CLASS ) < 0)
+ return -1;
+
+ /* Attach the VERSION attribute */
+ if ( H5LTset_attribute_string( loc_id, dset_name, "IMAGE_VERSION", IMAGE_VERSION ) < 0)
+ return -1;
+
+ /* Attach the IMAGE_SUBCLASS attribute */
+ if ( H5LTset_attribute_string( loc_id, dset_name, "IMAGE_SUBCLASS", "IMAGE_TRUECOLOR" ) < 0)
+ return -1;
+
+ /* Attach the INTERLACE_MODE attribute. This attributes is only for true color images */
+ if ( H5LTset_attribute_string( loc_id, dset_name, "INTERLACE_MODE", interlace ) < 0)
+ return -1;
+
+ return 0;
}
/*-------------------------------------------------------------------------
- * Function: find_palette
- *
- * Purpose: operator function used by H5LT_find_palette
- *
- * Return:
- *
- * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
- *
- * Date: May 28, 2001
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-find_palette(hid_t loc_id, const char *name, const H5A_info_t *ainfo,
- void *op_data)
+* Function: find_palette
+*
+* Purpose: operator function used by H5LT_find_palette
+*
+* Return:
+*
+* Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
+*
+* Date: May 28, 2001
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
+static herr_t find_palette(hid_t loc_id,
+ const char *name,
+ const H5A_info_t *ainfo,
+ void *op_data)
{
int ret = H5_ITER_CONT;
@@ -175,9 +176,9 @@ find_palette(hid_t loc_id, const char *name, const H5A_info_t *ainfo,
loc_id = loc_id; ainfo = ainfo; op_data = op_data;
/* Define a positive value for return value if the attribute was found. This will
- * cause the iterator to immediately return that positive value,
- * indicating short-circuit success
- */
+ * cause the iterator to immediately return that positive value,
+ * indicating short-circuit success
+ */
if(strcmp(name, "PALETTE") == 0)
ret = H5_ITER_STOP;
@@ -186,23 +187,23 @@ find_palette(hid_t loc_id, const char *name, const H5A_info_t *ainfo,
/*-------------------------------------------------------------------------
- * Function: H5IM_find_palette
- *
- * Purpose: Private function. Find the attribute "PALETTE" in the image dataset
- *
- * Return: Success: 1, Failure: 0
- *
- * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
- *
- * Date: May 11, 2001
- *
- * Comments:
- * The function uses H5Aiterate2 with the operator function find_palette
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5IM_find_palette
+*
+* Purpose: Private function. Find the attribute "PALETTE" in the image dataset
+*
+* Return: Success: 1, Failure: 0
+*
+* Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
+*
+* Date: May 11, 2001
+*
+* Comments:
+* The function uses H5Aiterate2 with the operator function find_palette
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5IM_find_palette( hid_t loc_id )
{
@@ -211,1010 +212,1011 @@ herr_t H5IM_find_palette( hid_t loc_id )
/*-------------------------------------------------------------------------
- * Function: H5IMget_image_info
- *
- * Purpose: Gets information about an image dataset (dimensions, interlace mode
- * and number of associated palettes).
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
- *
- * Date: July 25, 2001
- *
- * Comments:
- * based on HDF5 Image and Palette Specification
- * http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5IMget_image_info
+*
+* Purpose: Gets information about an image dataset (dimensions, interlace mode
+* and number of associated palettes).
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
+*
+* Date: July 25, 2001
+*
+* Comments:
+* based on HDF5 Image and Palette Specification
+* http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5IMget_image_info( hid_t loc_id,
- const char *dset_name,
- hsize_t *width,
- hsize_t *height,
- hsize_t *planes,
- char *interlace,
- hssize_t *npals )
+ const char *dset_name,
+ hsize_t *width,
+ hsize_t *height,
+ hsize_t *planes,
+ char *interlace,
+ hssize_t *npals )
{
- hid_t did, sid;
- hsize_t dims[IMAGE24_RANK];
- hid_t attr_id;
- hid_t attr_type;
- int has_attr;
- hid_t attr_space_id;
- hid_t attr_class;
- int has_pal;
+ hid_t did;
+ hid_t sid;
+ hsize_t dims[IMAGE24_RANK];
+ hid_t aid;
+ hid_t asid;
+ hid_t atid;
+ H5T_class_t aclass;
+ int has_pal;
+ int has_attr;
- /*assume initially we have no palettes attached*/
- *npals = 0;
+ /*assume initially we have no palettes attached*/
+ *npals = 0;
- /* Open the dataset. */
- if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- return -1;
+ /* Open the dataset. */
+ if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ return -1;
- /* Try to find the attribute "INTERLACE_MODE" on the >>image<< dataset */
- has_attr = H5LT_find_attribute(did, "INTERLACE_MODE");
+ /* Try to find the attribute "INTERLACE_MODE" on the >>image<< dataset */
+ has_attr = H5LT_find_attribute(did, "INTERLACE_MODE");
- /* It exists, get it */
- if(has_attr == 1)
- {
+ /* It exists, get it */
+ if(has_attr == 1)
+ {
- if((attr_id = H5Aopen(did, "INTERLACE_MODE", H5P_DEFAULT)) < 0)
- goto out;
+ if((aid = H5Aopen(did, "INTERLACE_MODE", H5P_DEFAULT)) < 0)
+ goto out;
- if((attr_type = H5Aget_type(attr_id)) < 0)
- goto out;
+ if((atid = H5Aget_type(aid)) < 0)
+ goto out;
- if(H5Aread(attr_id, attr_type, interlace) < 0)
- goto out;
+ if(H5Aread(aid, atid, interlace) < 0)
+ goto out;
- if(H5Tclose(attr_type) < 0)
- goto out;
+ if(H5Tclose(atid) < 0)
+ goto out;
- if(H5Aclose(attr_id) < 0)
- goto out;
- }
+ if(H5Aclose(aid) < 0)
+ goto out;
+ }
- /* Get the dataspace handle */
- if ( (sid = H5Dget_space( did )) < 0)
- goto out;
+ /* Get the dataspace handle */
+ if ( (sid = H5Dget_space( did )) < 0)
+ goto out;
- /* Get dimensions */
- if ( H5Sget_simple_extent_dims( sid, dims, NULL) < 0)
- goto out;
+ /* Get dimensions */
+ if ( H5Sget_simple_extent_dims( sid, dims, NULL) < 0)
+ goto out;
- /* Initialize the image dimensions */
+ /* Initialize the image dimensions */
- if ( has_attr == 1 )
- /* This is a 24 bit image */
- {
+ if ( has_attr == 1 )
+ /* This is a 24 bit image */
+ {
- if ( strcmp( interlace, "INTERLACE_PIXEL" ) == 0 )
- {
- /* Number of color planes is defined as the third dimension */
- *height = dims[0];
- *width = dims[1];
- *planes = dims[2];
- }
- else
- if ( strcmp( interlace, "INTERLACE_PLANE" ) == 0 )
- {
- /* Number of color planes is defined as the first dimension */
- *planes = dims[0];
- *height = dims[1];
- *width = dims[2];
- }
- else return -1;
- }
- else
- /* This is a 8 bit image */
- {
- *height = dims[0];
- *width = dims[1];
- *planes = 1;
- }
+ if ( strcmp( interlace, "INTERLACE_PIXEL" ) == 0 )
+ {
+ /* Number of color planes is defined as the third dimension */
+ *height = dims[0];
+ *width = dims[1];
+ *planes = dims[2];
+ }
+ else
+ if ( strcmp( interlace, "INTERLACE_PLANE" ) == 0 )
+ {
+ /* Number of color planes is defined as the first dimension */
+ *planes = dims[0];
+ *height = dims[1];
+ *width = dims[2];
+ }
+ else return -1;
+ }
+ else
+ /* This is a 8 bit image */
+ {
+ *height = dims[0];
+ *width = dims[1];
+ *planes = 1;
+ }
- /* Close */
- if ( H5Sclose( sid ) < 0)
- goto out;
+ /* Close */
+ if ( H5Sclose( sid ) < 0)
+ goto out;
- /* Get number of palettes */
+ /* Get number of palettes */
- /* Try to find the attribute "PALETTE" on the >>image<< dataset */
- has_pal = H5IM_find_palette(did);
+ /* Try to find the attribute "PALETTE" on the >>image<< dataset */
+ has_pal = H5IM_find_palette(did);
- if(has_pal == 1)
- {
+ if(has_pal == 1)
+ {
- if((attr_id = H5Aopen(did, "PALETTE", H5P_DEFAULT)) < 0)
- goto out;
+ if((aid = H5Aopen(did, "PALETTE", H5P_DEFAULT)) < 0)
+ goto out;
- if((attr_type = H5Aget_type(attr_id)) < 0)
- goto out;
+ if((atid = H5Aget_type(aid)) < 0)
+ goto out;
- if((attr_class = H5Tget_class(attr_type)) < 0)
- goto out;
+ if((aclass = H5Tget_class(atid)) < 0)
+ goto out;
- /* Check if it is really a reference */
+ /* Check if it is really a reference */
- if(attr_class == H5T_REFERENCE)
- {
+ if(aclass == H5T_REFERENCE)
+ {
- /* Get the reference(s) */
+ /* Get the reference(s) */
- if ( (attr_space_id = H5Aget_space( attr_id )) < 0)
- goto out;
+ if ( (asid = H5Aget_space( aid )) < 0)
+ goto out;
- *npals = H5Sget_simple_extent_npoints( attr_space_id );
+ *npals = H5Sget_simple_extent_npoints( asid );
- if ( H5Sclose( attr_space_id ) < 0)
- goto out;
+ if ( H5Sclose( asid ) < 0)
+ goto out;
- } /* H5T_REFERENCE */
+ } /* H5T_REFERENCE */
- if ( H5Tclose( attr_type ) < 0)
- goto out;
+ if ( H5Tclose( atid ) < 0)
+ goto out;
- /* Close the attribute. */
- if ( H5Aclose( attr_id ) < 0)
- goto out;
+ /* Close the attribute. */
+ if ( H5Aclose( aid ) < 0)
+ goto out;
- }
+ }
- /* End access to the dataset and release resources used by it. */
- if ( H5Dclose( did ) < 0)
- goto out;
+ /* End access to the dataset and release resources used by it. */
+ if ( H5Dclose( did ) < 0)
+ goto out;
- return 0;
+ return 0;
out:
- H5Dclose( did );
- return -1;
+ H5Dclose( did );
+ H5Aclose( aid );
+ H5Sclose( asid );
+ H5Tclose( atid );
+ return -1;
}
/*-------------------------------------------------------------------------
- * Function: H5IMread_image
- *
- * Purpose: Reads image data from disk.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
- *
- * Date: June 13, 2001
- *
- * Comments:
- * based on HDF5 Image and Palette Specification
- * http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5IMread_image
+*
+* Purpose: Reads image data from disk.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
+*
+* Date: June 13, 2001
+*
+* Comments:
+* based on HDF5 Image and Palette Specification
+* http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5IMread_image( hid_t loc_id,
const char *dset_name,
- unsigned char *buffer )
+ unsigned char *buf )
{
- hid_t did;
+ hid_t did;
- /* Open the dataset. */
- if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- return -1;
+ /* Open the dataset. */
+ if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ return -1;
- /* Read */
- if ( H5Dread( did, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, buffer ) < 0)
- goto out;
+ /* Read */
+ if ( H5Dread( did, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf ) < 0)
+ goto out;
- /* End access to the dataset and release resources used by it. */
- if ( H5Dclose( did ) )
- return -1;
+ /* End access to the dataset and release resources used by it. */
+ if ( H5Dclose( did ) )
+ return -1;
- return 0;
+ return 0;
out:
- H5Dclose( did );
- return -1;
+ H5Dclose( did );
+ return -1;
}
/*-------------------------------------------------------------------------
- * Function: H5IMmake_palette
- *
- * Purpose: Creates and writes a palette.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
- *
- * Date: May 01, 2001
- *
- * Comments:
- * based on HDF5 Image and Palette Specification
- * http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5IMmake_palette
+*
+* Purpose: Creates and writes a palette.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
+*
+* Date: May 01, 2001
+*
+* Comments:
+* based on HDF5 Image and Palette Specification
+* http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5IMmake_palette( hid_t loc_id,
- const char *pal_name,
- const hsize_t *pal_dims,
- const unsigned char *pal_data )
+ const char *pal_name,
+ const hsize_t *pal_dims,
+ const unsigned char *pal_data )
{
- int has_pal;
+ int has_pal;
- /* Check if the dataset already exists */
- has_pal = H5LTfind_dataset( loc_id, pal_name );
+ /* Check if the dataset already exists */
+ has_pal = H5LTfind_dataset( loc_id, pal_name );
- /* It exists. Return */
- if ( has_pal == 1 )
- return 0;
+ /* It exists. Return */
+ if ( has_pal == 1 )
+ return 0;
- /* Make the palette dataset. */
- if ( H5LTmake_dataset( loc_id, pal_name, 2, pal_dims, H5T_NATIVE_UCHAR, pal_data ) < 0 )
- return -1;
+ /* Make the palette dataset. */
+ if ( H5LTmake_dataset( loc_id, pal_name, 2, pal_dims, H5T_NATIVE_UCHAR, pal_data ) < 0 )
+ return -1;
- /* Attach the attribute "CLASS" to the >>palette<< dataset*/
- if ( H5LTset_attribute_string( loc_id, pal_name, "CLASS", PALETTE_CLASS ) < 0)
- return -1;
+ /* Attach the attribute "CLASS" to the >>palette<< dataset*/
+ if ( H5LTset_attribute_string( loc_id, pal_name, "CLASS", PALETTE_CLASS ) < 0)
+ return -1;
- /* Attach the attribute "PAL_VERSION" to the >>palette<< dataset*/
- if ( H5LTset_attribute_string( loc_id, pal_name, "PAL_VERSION", "1.2" ) < 0)
- return -1;
+ /* Attach the attribute "PAL_VERSION" to the >>palette<< dataset*/
+ if ( H5LTset_attribute_string( loc_id, pal_name, "PAL_VERSION", "1.2" ) < 0)
+ return -1;
- return 0;
+ return 0;
}
/*-------------------------------------------------------------------------
- * Function: H5IMlink_palette
- *
- * Purpose: This function attaches a palette to an existing image dataset
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
- *
- * Date: May 01, 2001
- *
- * Comments:
- * based on HDF5 Image and Palette Specification
- * http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
- *
- * An image (dataset) within an HDF5 file may optionally specify an array of
- * palettes to be viewed with. The dataset will have an attribute
- * which contains an array of object reference pointers which refer to palettes in the file.
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5IMlink_palette
+*
+* Purpose: This function attaches a palette to an existing image dataset
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
+*
+* Date: May 01, 2001
+*
+* Comments:
+* based on HDF5 Image and Palette Specification
+* http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
+*
+* An image (dataset) within an HDF5 file may optionally specify an array of
+* palettes to be viewed with. The dataset will have an attribute
+* which contains an array of object reference pointers which refer to palettes in the file.
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5IMlink_palette( hid_t loc_id,
- const char *image_name,
- const char *pal_name )
+ const char *image_name,
+ const char *pal_name )
{
- hid_t image_id;
- hid_t attr_type=-1;
- hid_t attr_id=-1;
- hid_t attr_space_id=-1;
- hid_t attr_class=-1;
- hobj_ref_t ref; /* write a new reference */
- hobj_ref_t *refbuf; /* buffer to read references */
- hssize_t n_refs;
- hsize_t dim_ref;
- int ok_pal;
-
- /* The image dataset may or may not have the attribute "PALETTE"
- * First we try to open to see if it is already there; if not, it is created.
- * If it exists, the array of references is extended to hold the reference
- * to the new palette
- */
-
- /* First we get the image id */
- if((image_id = H5Dopen2(loc_id, image_name, H5P_DEFAULT)) < 0)
- return -1;
-
- /* Try to find the attribute "PALETTE" on the >>image<< dataset */
- ok_pal = H5LT_find_attribute( image_id, "PALETTE" );
+ hid_t did;
+ hid_t atid=-1;
+ hid_t aid=-1;
+ hid_t asid=-1;
+ hobj_ref_t ref; /* write a new reference */
+ hobj_ref_t *refbuf; /* buffer to read references */
+ hssize_t n_refs;
+ hsize_t dim_ref;
+ int ok_pal;
+
+ /* The image dataset may or may not have the attribute "PALETTE"
+ * First we try to open to see if it is already there; if not, it is created.
+ * If it exists, the array of references is extended to hold the reference
+ * to the new palette
+ */
+
+ /* First we get the image id */
+ if((did = H5Dopen2(loc_id, image_name, H5P_DEFAULT)) < 0)
+ return -1;
+
+ /* Try to find the attribute "PALETTE" on the >>image<< dataset */
+ ok_pal = H5LT_find_attribute( did, "PALETTE" );
+
+ /*-------------------------------------------------------------------------
+ * It does not exist. We create the attribute and one reference
+ *-------------------------------------------------------------------------
+ */
+ if(ok_pal == 0 )
+ {
+ if((asid = H5Screate(H5S_SCALAR)) < 0)
+ goto out;
-/*-------------------------------------------------------------------------
- * It does not exist. We create the attribute and one reference
- *-------------------------------------------------------------------------
- */
- if(ok_pal == 0 )
- {
- if((attr_space_id = H5Screate(H5S_SCALAR)) < 0)
- goto out;
-
- /* Create the attribute type for the reference */
- if((attr_type = H5Tcopy(H5T_STD_REF_OBJ)) < 0)
- goto out;
-
- /* Create the attribute "PALETTE" to be attached to the image*/
- if((attr_id = H5Acreate2(image_id, "PALETTE", attr_type, attr_space_id, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
-
- /* Create a reference. The reference is created on the local id. */
- if(H5Rcreate(&ref, loc_id, pal_name, H5R_OBJECT, -1) < 0)
- goto out;
-
- /* Write the attribute with the reference */
- if(H5Awrite(attr_id, attr_type, &ref) < 0)
- goto out;
-
- /* close */
- if(H5Sclose(attr_space_id) < 0)
- goto out;
- if ( H5Tclose( attr_type ) < 0)
- goto out;
- if(H5Aclose(attr_id) < 0)
- goto out;
-
- }
+ /* Create the attribute type for the reference */
+ if((atid = H5Tcopy(H5T_STD_REF_OBJ)) < 0)
+ goto out;
-/*-------------------------------------------------------------------------
- * The attribute already exists, open it
- *-------------------------------------------------------------------------
- */
- else if(ok_pal == 1)
- {
- if((attr_id = H5Aopen(image_id, "PALETTE", H5P_DEFAULT)) < 0)
- goto out;
-
- if((attr_type = H5Aget_type(attr_id)) < 0)
- goto out;
-
- if((attr_class = H5Tget_class(attr_type)) < 0)
- goto out;
-
- /* Get and save the old reference(s) */
- if((attr_space_id = H5Aget_space(attr_id)) < 0)
- goto out;
-
- n_refs = H5Sget_simple_extent_npoints(attr_space_id);
-
- dim_ref = n_refs + 1;
-
- refbuf = malloc( sizeof(hobj_ref_t) * (int)dim_ref );
-
- if ( H5Aread( attr_id, attr_type, refbuf ) < 0)
- goto out;
-
- /* The attribute must be deleted, in order to the new one can reflect the changes*/
- if(H5Adelete(image_id, "PALETTE") < 0)
- goto out;
-
- /* Create a new reference for this palette. */
- if ( H5Rcreate( &ref, loc_id, pal_name, H5R_OBJECT, -1 ) < 0)
- goto out;
-
- refbuf[n_refs] = ref;
-
- /* Create the data space for the new references */
- if(H5Sclose(attr_space_id) < 0)
- goto out;
-
- if((attr_space_id = H5Screate_simple(1, &dim_ref, NULL)) < 0)
- goto out;
-
- /* Create the attribute again with the changes of space */
- if(H5Aclose(attr_id) < 0)
- goto out;
-
- if((attr_id = H5Acreate2(image_id, "PALETTE", attr_type, attr_space_id, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
-
- /* Write the attribute with the new references */
- if(H5Awrite(attr_id, attr_type, refbuf) < 0)
- goto out;
-
- /* close */
- if(H5Sclose(attr_space_id) < 0)
- goto out;
- if(H5Aclose(attr_id) < 0)
- goto out;
-
- free( refbuf );
-
- } /* ok_pal == 1 */
-
- /* Close the image dataset. */
- if ( H5Dclose( image_id ) < 0)
- return -1;
-
- return 0;
+ /* Create the attribute "PALETTE" to be attached to the image*/
+ if((aid = H5Acreate2(did, "PALETTE", atid, asid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* Create a reference. The reference is created on the local id. */
+ if(H5Rcreate(&ref, loc_id, pal_name, H5R_OBJECT, -1) < 0)
+ goto out;
+
+ /* Write the attribute with the reference */
+ if(H5Awrite(aid, atid, &ref) < 0)
+ goto out;
+
+ /* close */
+ if(H5Sclose(asid) < 0)
+ goto out;
+ if ( H5Tclose( atid ) < 0)
+ goto out;
+ if(H5Aclose(aid) < 0)
+ goto out;
+
+ }
+
+ /*-------------------------------------------------------------------------
+ * The attribute already exists, open it
+ *-------------------------------------------------------------------------
+ */
+ else if(ok_pal == 1)
+ {
+ if((aid = H5Aopen(did, "PALETTE", H5P_DEFAULT)) < 0)
+ goto out;
+
+ if((atid = H5Aget_type(aid)) < 0)
+ goto out;
+
+ if(H5Tget_class(atid) < 0)
+ goto out;
+
+ /* Get and save the old reference(s) */
+ if((asid = H5Aget_space(aid)) < 0)
+ goto out;
+
+ n_refs = H5Sget_simple_extent_npoints(asid);
+
+ dim_ref = n_refs + 1;
+
+ refbuf = (hobj_ref_t*)malloc( sizeof(hobj_ref_t) * (int)dim_ref );
+
+ if ( H5Aread( aid, atid, refbuf ) < 0)
+ goto out;
+
+ /* The attribute must be deleted, in order to the new one can reflect the changes*/
+ if(H5Adelete(did, "PALETTE") < 0)
+ goto out;
+
+ /* Create a new reference for this palette. */
+ if ( H5Rcreate( &ref, loc_id, pal_name, H5R_OBJECT, -1 ) < 0)
+ goto out;
+
+ refbuf[n_refs] = ref;
+
+ /* Create the data space for the new references */
+ if(H5Sclose(asid) < 0)
+ goto out;
+
+ if((asid = H5Screate_simple(1, &dim_ref, NULL)) < 0)
+ goto out;
+
+ /* Create the attribute again with the changes of space */
+ if(H5Aclose(aid) < 0)
+ goto out;
+
+ if((aid = H5Acreate2(did, "PALETTE", atid, asid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* Write the attribute with the new references */
+ if(H5Awrite(aid, atid, refbuf) < 0)
+ goto out;
+
+ /* close */
+ if(H5Sclose(asid) < 0)
+ goto out;
+ if(H5Aclose(aid) < 0)
+ goto out;
+
+ free( refbuf );
+
+ } /* ok_pal == 1 */
+
+ /* Close the image dataset. */
+ if ( H5Dclose( did ) < 0)
+ return -1;
+
+ return 0;
out:
- H5Dclose( image_id );
- H5Sclose( attr_space_id );
- H5Tclose( attr_type );
- H5Aclose( attr_id );
- return -1;
+ H5Dclose( did );
+ H5Sclose( asid );
+ H5Tclose( atid );
+ H5Aclose( aid );
+ return -1;
}
/*-------------------------------------------------------------------------
- * Function: H5IMunlink_palette
- *
- * Purpose: This function dettaches a palette from an existing image dataset
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
- *
- * Date: September 10, 2001
- *
- * Comments:
- * based on HDF5 Image and Palette Specification
- * http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5IMunlink_palette
+*
+* Purpose: This function dettaches a palette from an existing image dataset
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
+*
+* Date: September 10, 2001
+*
+* Comments:
+* based on HDF5 Image and Palette Specification
+* http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5IMunlink_palette( hid_t loc_id,
- const char *image_name,
- const char *pal_name )
+ const char *image_name,
+ const char *pal_name )
{
- hid_t image_id;
- hid_t attr_type;
- hid_t attr_id;
- hid_t attr_class;
- int ok_pal, has_pal;
+ hid_t did;
+ hid_t atid;
+ hid_t aid;
+ H5T_class_t aclass;
+ int ok_pal, has_pal;
- /* Try to find the palette dataset */
- has_pal = H5LTfind_dataset( loc_id, pal_name );
+ /* Try to find the palette dataset */
+ has_pal = H5LTfind_dataset( loc_id, pal_name );
- /* It does not exist. Return */
- if ( has_pal == 0 )
- return -1;
+ /* It does not exist. Return */
+ if ( has_pal == 0 )
+ return -1;
- /* The image dataset may or not have the attribute "PALETTE"
- * First we try to open to see if it is already there; if not, it is created.
- * If it exists, the array of references is extended to hold the reference
- * to the new palette
- */
+ /* The image dataset may or not have the attribute "PALETTE"
+ * First we try to open to see if it is already there; if not, it is created.
+ * If it exists, the array of references is extended to hold the reference
+ * to the new palette
+ */
- /* First we get the image id */
- if((image_id = H5Dopen2(loc_id, image_name, H5P_DEFAULT)) < 0)
- return -1;
+ /* First we get the image id */
+ if((did = H5Dopen2(loc_id, image_name, H5P_DEFAULT)) < 0)
+ return -1;
- /* Try to find the attribute "PALETTE" on the >>image<< dataset */
- ok_pal = H5LT_find_attribute(image_id, "PALETTE");
+ /* Try to find the attribute "PALETTE" on the >>image<< dataset */
+ ok_pal = H5LT_find_attribute(did, "PALETTE");
- /* It does not exist. Nothing to do */
- if(ok_pal == 0)
- return -1;
+ /* It does not exist. Nothing to do */
+ if(ok_pal == 0)
+ return -1;
- /* The attribute exists, open it */
- else if(ok_pal == 1)
- {
- if((attr_id = H5Aopen(image_id, "PALETTE", H5P_DEFAULT)) < 0)
- goto out;
+ /* The attribute exists, open it */
+ else if(ok_pal == 1)
+ {
+ if((aid = H5Aopen(did, "PALETTE", H5P_DEFAULT)) < 0)
+ goto out;
- if((attr_type = H5Aget_type(attr_id)) < 0)
- goto out;
+ if((atid = H5Aget_type(aid)) < 0)
+ goto out;
- if((attr_class = H5Tget_class(attr_type)) < 0)
- goto out;
+ if((aclass = H5Tget_class(atid)) < 0)
+ goto out;
- /* Check if it is really a reference */
- if(attr_class == H5T_REFERENCE)
- {
- /* Delete the attribute */
- if(H5Adelete(image_id, "PALETTE") < 0)
- goto out;
+ /* Check if it is really a reference */
+ if(aclass == H5T_REFERENCE)
+ {
+ /* Delete the attribute */
+ if(H5Adelete(did, "PALETTE") < 0)
+ goto out;
- } /* H5T_REFERENCE */
+ } /* H5T_REFERENCE */
- if(H5Tclose(attr_type) < 0)
- goto out;
+ if(H5Tclose(atid) < 0)
+ goto out;
- /* Close the attribute. */
- if(H5Aclose(attr_id) < 0)
- goto out;
+ /* Close the attribute. */
+ if(H5Aclose(aid) < 0)
+ goto out;
- } /* ok_pal */
+ } /* ok_pal */
- /* Close the image dataset. */
- if(H5Dclose(image_id) < 0)
- return -1;
+ /* Close the image dataset. */
+ if(H5Dclose(did) < 0)
+ return -1;
- return 0;
+ return 0;
out:
- H5Dclose( image_id );
- return -1;
+ H5Dclose( did );
+ return -1;
}
/*-------------------------------------------------------------------------
- * Function: H5IMget_npalettes
- *
- * Purpose: Gets the number of palettes associated to an image
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
- *
- * Date: July 22, 2001
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5IMget_npalettes
+*
+* Purpose: Gets the number of palettes associated to an image
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
+*
+* Date: July 22, 2001
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5IMget_npalettes( hid_t loc_id,
- const char *image_name,
- hssize_t *npals )
+ const char *image_name,
+ hssize_t *npals )
{
- hid_t image_id;
- hid_t attr_type;
- hid_t attr_id;
- hid_t attr_space_id;
- hid_t attr_class;
- int has_pal;
+ hid_t did;
+ hid_t atid;
+ hid_t aid;
+ hid_t asid;
+ H5T_class_t aclass;
+ int has_pal;
- /*assume initially we have no palettes attached*/
- *npals = 0;
+ /*assume initially we have no palettes attached*/
+ *npals = 0;
- /* Open the dataset. */
- if((image_id = H5Dopen2(loc_id, image_name, H5P_DEFAULT)) < 0)
- return -1;
+ /* Open the dataset. */
+ if((did = H5Dopen2(loc_id, image_name, H5P_DEFAULT)) < 0)
+ return -1;
- /* Try to find the attribute "PALETTE" on the >>image<< dataset */
- has_pal = H5IM_find_palette(image_id);
+ /* Try to find the attribute "PALETTE" on the >>image<< dataset */
+ has_pal = H5IM_find_palette(did);
- if(has_pal == 1 )
- {
+ if(has_pal == 1 )
+ {
- if((attr_id = H5Aopen(image_id, "PALETTE", H5P_DEFAULT)) < 0)
- goto out;
+ if((aid = H5Aopen(did, "PALETTE", H5P_DEFAULT)) < 0)
+ goto out;
- if((attr_type = H5Aget_type(attr_id)) < 0)
- goto out;
+ if((atid = H5Aget_type(aid)) < 0)
+ goto out;
- if((attr_class = H5Tget_class(attr_type)) < 0)
- goto out;
+ if((aclass = H5Tget_class(atid)) < 0)
+ goto out;
- /* Check if it is really a reference */
+ /* Check if it is really a reference */
- if(attr_class == H5T_REFERENCE)
- {
- if((attr_space_id = H5Aget_space(attr_id)) < 0)
- goto out;
+ if(aclass == H5T_REFERENCE)
+ {
+ if((asid = H5Aget_space(aid)) < 0)
+ goto out;
- *npals = H5Sget_simple_extent_npoints( attr_space_id );
+ *npals = H5Sget_simple_extent_npoints( asid );
- if ( H5Sclose( attr_space_id ) < 0)
- goto out;
+ if ( H5Sclose( asid ) < 0)
+ goto out;
- } /* H5T_REFERENCE */
+ } /* H5T_REFERENCE */
- if ( H5Tclose( attr_type ) < 0)
- goto out;
+ if ( H5Tclose( atid ) < 0)
+ goto out;
- /* Close the attribute. */
- if ( H5Aclose( attr_id ) < 0)
- goto out;
+ /* Close the attribute. */
+ if ( H5Aclose( aid ) < 0)
+ goto out;
- }
+ }
- /* Close the image dataset. */
- if ( H5Dclose( image_id ) < 0)
- return -1;
+ /* Close the image dataset. */
+ if ( H5Dclose( did ) < 0)
+ return -1;
- return 0;
+ return 0;
out:
- H5Dclose( image_id );
- return -1;
+ H5Dclose( did );
+ return -1;
}
/*-------------------------------------------------------------------------
- * Function: H5IMget_palette_info
- *
- * Purpose: Get palette information
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
- *
- * Date: July 22, 2001
- *
- * Comments:
- * based on HDF5 Image and Palette Specification
- * http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5IMget_palette_info
+*
+* Purpose: Get palette information
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
+*
+* Date: July 22, 2001
+*
+* Comments:
+* based on HDF5 Image and Palette Specification
+* http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5IMget_palette_info( hid_t loc_id,
- const char *image_name,
- int pal_number,
- hsize_t *pal_dims )
+ const char *image_name,
+ int pal_number,
+ hsize_t *pal_dims )
{
- hid_t image_id;
- int has_pal;
- hid_t attr_type=-1;
- hid_t attr_id;
- hid_t attr_space_id=-1;
- hid_t attr_class;
- hssize_t n_refs;
- hsize_t dim_ref;
- hobj_ref_t *refbuf; /* buffer to read references */
- hid_t pal_id;
- hid_t pal_space_id;
- hsize_t pal_maxdims[2];
-
- /* Open the dataset. */
- if((image_id = H5Dopen2(loc_id, image_name, H5P_DEFAULT)) < 0)
- return -1;
-
- /* Try to find the attribute "PALETTE" on the >>image<< dataset */
- has_pal = H5IM_find_palette(image_id);
-
- if(has_pal == 1)
- {
- if((attr_id = H5Aopen(image_id, "PALETTE", H5P_DEFAULT)) < 0)
- goto out;
-
- if((attr_type = H5Aget_type(attr_id)) < 0)
- goto out;
-
- if((attr_class = H5Tget_class(attr_type)) < 0)
- goto out;
-
- /* Get the reference(s) */
- if((attr_space_id = H5Aget_space(attr_id)) < 0)
- goto out;
-
- n_refs = H5Sget_simple_extent_npoints(attr_space_id);
-
- dim_ref = n_refs;
-
- refbuf = malloc( sizeof(hobj_ref_t) * (int)dim_ref );
-
- if ( H5Aread( attr_id, attr_type, refbuf ) < 0)
- goto out;
-
- /* Get the actual palette */
- if ( (pal_id = H5Rdereference( image_id, H5R_OBJECT, &refbuf[pal_number] )) < 0)
- goto out;
-
- if ( (pal_space_id = H5Dget_space( pal_id )) < 0)
- goto out;
-
- if ( H5Sget_simple_extent_ndims( pal_space_id ) < 0)
- goto out;
-
- if ( H5Sget_simple_extent_dims( pal_space_id, pal_dims, pal_maxdims ) < 0)
- goto out;
-
- /* close */
- if (H5Dclose(pal_id)<0)
- goto out;
- if ( H5Sclose( pal_space_id ) < 0)
- goto out;
- if ( H5Sclose( attr_space_id ) < 0)
- goto out;
- if ( H5Tclose( attr_type ) < 0)
- goto out;
- if ( H5Aclose( attr_id ) < 0)
- goto out;
- free( refbuf );
-
-
- }
-
- /* Close the image dataset. */
- if ( H5Dclose( image_id ) < 0)
- return -1;
-
- return 0;
-
+ hid_t did;
+ int has_pal;
+ hid_t atid=-1;
+ hid_t aid;
+ hid_t asid=-1;
+ hssize_t n_refs;
+ hsize_t dim_ref;
+ hobj_ref_t *refbuf; /* buffer to read references */
+ hid_t pal_id;
+ hid_t pal_space_id;
+ hsize_t pal_maxdims[2];
+
+ /* Open the dataset. */
+ if((did = H5Dopen2(loc_id, image_name, H5P_DEFAULT)) < 0)
+ return -1;
+
+ /* Try to find the attribute "PALETTE" on the >>image<< dataset */
+ has_pal = H5IM_find_palette(did);
+
+ if(has_pal == 1)
+ {
+ if((aid = H5Aopen(did, "PALETTE", H5P_DEFAULT)) < 0)
+ goto out;
+
+ if((atid = H5Aget_type(aid)) < 0)
+ goto out;
+
+ if(H5Tget_class(atid) < 0)
+ goto out;
+
+ /* Get the reference(s) */
+ if((asid = H5Aget_space(aid)) < 0)
+ goto out;
+
+ n_refs = H5Sget_simple_extent_npoints(asid);
+
+ dim_ref = n_refs;
+
+ refbuf = (hobj_ref_t*)malloc( sizeof(hobj_ref_t) * (int)dim_ref );
+
+ if ( H5Aread( aid, atid, refbuf ) < 0)
+ goto out;
+
+ /* Get the actual palette */
+ if ( (pal_id = H5Rdereference( did, H5R_OBJECT, &refbuf[pal_number] )) < 0)
+ goto out;
+
+ if ( (pal_space_id = H5Dget_space( pal_id )) < 0)
+ goto out;
+
+ if ( H5Sget_simple_extent_ndims( pal_space_id ) < 0)
+ goto out;
+
+ if ( H5Sget_simple_extent_dims( pal_space_id, pal_dims, pal_maxdims ) < 0)
+ goto out;
+
+ /* close */
+ if (H5Dclose(pal_id)<0)
+ goto out;
+ if ( H5Sclose( pal_space_id ) < 0)
+ goto out;
+ if ( H5Sclose( asid ) < 0)
+ goto out;
+ if ( H5Tclose( atid ) < 0)
+ goto out;
+ if ( H5Aclose( aid ) < 0)
+ goto out;
+ free( refbuf );
+
+
+ }
+
+ /* Close the image dataset. */
+ if ( H5Dclose( did ) < 0)
+ return -1;
+
+ return 0;
+
out:
- H5Dclose( image_id );
- H5Sclose( attr_space_id );
- H5Tclose( attr_type );
- H5Aclose( attr_id );
- return -1;
-
+ H5Dclose( did );
+ H5Sclose( asid );
+ H5Tclose( atid );
+ H5Aclose( aid );
+ return -1;
+
}
/*-------------------------------------------------------------------------
- * Function: H5IMget_palette
- *
- * Purpose: Read palette
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
- *
- * Date: August 30, 2001
- *
- * Comments:
- * based on HDF5 Image and Palette Specification
- * http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5IMget_palette
+*
+* Purpose: Read palette
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
+*
+* Date: August 30, 2001
+*
+* Comments:
+* based on HDF5 Image and Palette Specification
+* http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5IMget_palette( hid_t loc_id,
- const char *image_name,
- int pal_number,
- unsigned char *pal_data )
+ const char *image_name,
+ int pal_number,
+ unsigned char *pal_data )
{
- hid_t image_id;
- int has_pal;
- hid_t attr_type=-1;
- hid_t attr_id;
- hid_t attr_space_id=-1;
- hid_t attr_class;
- hssize_t n_refs;
- hsize_t dim_ref;
- hobj_ref_t *refbuf; /* buffer to read references */
- hid_t pal_id;
-
- /* Open the dataset. */
- if((image_id = H5Dopen2(loc_id, image_name, H5P_DEFAULT)) < 0)
- return -1;
-
- /* Try to find the attribute "PALETTE" on the >>image<< dataset */
- has_pal = H5IM_find_palette(image_id);
-
- if(has_pal == 1 )
- {
- if((attr_id = H5Aopen(image_id, "PALETTE", H5P_DEFAULT)) < 0)
- goto out;
-
- if((attr_type = H5Aget_type(attr_id)) < 0)
- goto out;
-
- if((attr_class = H5Tget_class(attr_type)) < 0)
- goto out;
-
- /* Get the reference(s) */
- if((attr_space_id = H5Aget_space(attr_id)) < 0)
- goto out;
-
- n_refs = H5Sget_simple_extent_npoints(attr_space_id);
-
- dim_ref = n_refs;
-
- refbuf = malloc( sizeof(hobj_ref_t) * (int)dim_ref );
-
- if ( H5Aread( attr_id, attr_type, refbuf ) < 0)
- goto out;
-
- /* Get the palette id */
- if ( (pal_id = H5Rdereference( image_id, H5R_OBJECT, &refbuf[pal_number] )) < 0)
- goto out;
-
- /* Read the palette dataset */
- if ( H5Dread( pal_id, H5Dget_type(pal_id), H5S_ALL, H5S_ALL, H5P_DEFAULT, pal_data ) < 0)
- goto out;
-
- /* close */
- if (H5Dclose(pal_id)<0)
- goto out;
- if ( H5Sclose( attr_space_id ) < 0)
- goto out;
- if ( H5Tclose( attr_type ) < 0)
- goto out;
- if ( H5Aclose( attr_id ) < 0)
- goto out;
- free( refbuf );
- }
-
- /* Close the image dataset. */
- if ( H5Dclose( image_id ) < 0)
- return -1;
-
- return 0;
+ hid_t did;
+ int has_pal;
+ hid_t atid=-1;
+ hid_t aid;
+ hid_t asid=-1;
+ hssize_t n_refs;
+ hsize_t dim_ref;
+ hobj_ref_t *refbuf; /* buffer to read references */
+ hid_t pal_id;
+
+ /* Open the dataset. */
+ if((did = H5Dopen2(loc_id, image_name, H5P_DEFAULT)) < 0)
+ return -1;
+
+ /* Try to find the attribute "PALETTE" on the >>image<< dataset */
+ has_pal = H5IM_find_palette(did);
+
+ if(has_pal == 1 )
+ {
+ if((aid = H5Aopen(did, "PALETTE", H5P_DEFAULT)) < 0)
+ goto out;
+
+ if((atid = H5Aget_type(aid)) < 0)
+ goto out;
+
+ if(H5Tget_class(atid) < 0)
+ goto out;
+
+ /* Get the reference(s) */
+ if((asid = H5Aget_space(aid)) < 0)
+ goto out;
+
+ n_refs = H5Sget_simple_extent_npoints(asid);
+
+ dim_ref = n_refs;
+
+ refbuf = (hobj_ref_t*)malloc( sizeof(hobj_ref_t) * (int)dim_ref );
+
+ if ( H5Aread( aid, atid, refbuf ) < 0)
+ goto out;
+
+ /* Get the palette id */
+ if ( (pal_id = H5Rdereference( did, H5R_OBJECT, &refbuf[pal_number] )) < 0)
+ goto out;
+
+ /* Read the palette dataset */
+ if ( H5Dread( pal_id, H5Dget_type(pal_id), H5S_ALL, H5S_ALL, H5P_DEFAULT, pal_data ) < 0)
+ goto out;
+
+ /* close */
+ if (H5Dclose(pal_id)<0)
+ goto out;
+ if ( H5Sclose( asid ) < 0)
+ goto out;
+ if ( H5Tclose( atid ) < 0)
+ goto out;
+ if ( H5Aclose( aid ) < 0)
+ goto out;
+ free( refbuf );
+ }
+
+ /* Close the image dataset. */
+ if ( H5Dclose( did ) < 0)
+ return -1;
+
+ return 0;
out:
- H5Dclose( image_id );
- H5Sclose( attr_space_id );
- H5Tclose( attr_type );
- H5Aclose( attr_id );
- return -1;
+ H5Dclose( did );
+ H5Sclose( asid );
+ H5Tclose( atid );
+ H5Aclose( aid );
+ return -1;
}
/*-------------------------------------------------------------------------
- * Function: H5IMis_image
- *
- * Purpose:
- *
- * Return: true, false, fail
- *
- * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
- *
- * Date: August 30, 2001
- *
- * Comments:
- * based on HDF5 Image and Palette Specification
- * http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5IMis_image
+*
+* Purpose:
+*
+* Return: true, false, fail
+*
+* Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
+*
+* Date: August 30, 2001
+*
+* Comments:
+* based on HDF5 Image and Palette Specification
+* http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5IMis_image( hid_t loc_id,
- const char *dset_name )
+ const char *dset_name )
{
- hid_t did;
- int has_class;
- hid_t attr_type;
- hid_t attr_id;
- char attr_data[20];
- herr_t ret;
+ hid_t did;
+ int has_class;
+ hid_t atid;
+ hid_t aid;
+ char attr_data[20];
+ herr_t ret;
- /* Assume initially fail condition */
- ret = -1;
+ /* Assume initially fail condition */
+ ret = -1;
- /* Open the dataset. */
- if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- return -1;
+ /* Open the dataset. */
+ if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ return -1;
- /* Try to find the attribute "CLASS" on the dataset */
- has_class = H5LT_find_attribute(did, "CLASS");
+ /* Try to find the attribute "CLASS" on the dataset */
+ has_class = H5LT_find_attribute(did, "CLASS");
- if(has_class == 0)
- {
- H5Dclose(did);
- return 0;
- }
- else if(has_class == 1)
- {
+ if(has_class == 0)
+ {
+ H5Dclose(did);
+ return 0;
+ }
+ else if(has_class == 1)
+ {
- if((attr_id = H5Aopen(did, "CLASS", H5P_DEFAULT)) < 0)
- goto out;
+ if((aid = H5Aopen(did, "CLASS", H5P_DEFAULT)) < 0)
+ goto out;
- if((attr_type = H5Aget_type(attr_id)) < 0)
- goto out;
+ if((atid = H5Aget_type(aid)) < 0)
+ goto out;
- if(H5Tget_class(attr_type) < 0)
- goto out;
+ if(H5Tget_class(atid) < 0)
+ goto out;
- if(H5Aread(attr_id, attr_type, attr_data) < 0)
- goto out;
+ if(H5Aread(aid, atid, attr_data) < 0)
+ goto out;
- if(strcmp(attr_data, IMAGE_CLASS) == 0)
- ret = 1;
- else
- ret = 0;
+ if(strcmp(attr_data, IMAGE_CLASS) == 0)
+ ret = 1;
+ else
+ ret = 0;
- if ( H5Tclose( attr_type ) < 0)
- goto out;
+ if ( H5Tclose( atid ) < 0)
+ goto out;
- if ( H5Aclose( attr_id ) < 0)
- goto out;
+ if ( H5Aclose( aid ) < 0)
+ goto out;
- }
+ }
- /* Close the dataset. */
- if ( H5Dclose( did ) < 0)
- return -1;
+ /* Close the dataset. */
+ if ( H5Dclose( did ) < 0)
+ return -1;
- return ret;
+ return ret;
out:
- H5Dclose( did );
- return -1;
+ H5Dclose( did );
+ return -1;
}
/*-------------------------------------------------------------------------
- * Function: H5IMis_palette
- *
- * Purpose:
- *
- * Return: true, false, fail
- *
- * Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
- *
- * Date: August 30, 2001
- *
- * Comments:
- * based on HDF5 Image and Palette Specification
- * http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5IMis_palette
+*
+* Purpose:
+*
+* Return: true, false, fail
+*
+* Programmer: Pedro Vicente Nunes, pvn@ncsa.uiuc.edu
+*
+* Date: August 30, 2001
+*
+* Comments:
+* based on HDF5 Image and Palette Specification
+* http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageSpec.html
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5IMis_palette( hid_t loc_id,
- const char *dset_name )
+ const char *dset_name )
{
- hid_t did;
- int has_class;
- hid_t attr_type;
- hid_t attr_id;
- char attr_data[20];
- herr_t ret;
+ hid_t did;
+ int has_class;
+ hid_t atid;
+ hid_t aid;
+ char attr_data[20];
+ herr_t ret;
- /* Assume initially fail condition */
- ret = -1;
+ /* Assume initially fail condition */
+ ret = -1;
- /* Open the dataset. */
- if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- return -1;
+ /* Open the dataset. */
+ if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ return -1;
- /* Try to find the attribute "CLASS" on the dataset */
- has_class = H5LT_find_attribute(did, "CLASS");
+ /* Try to find the attribute "CLASS" on the dataset */
+ has_class = H5LT_find_attribute(did, "CLASS");
- if(has_class == 0)
- {
- H5Dclose( did );
- return 0;
- }
- else if(has_class == 1)
- {
+ if(has_class == 0)
+ {
+ H5Dclose( did );
+ return 0;
+ }
+ else if(has_class == 1)
+ {
- if((attr_id = H5Aopen(did, "CLASS", H5P_DEFAULT)) < 0)
- goto out;
+ if((aid = H5Aopen(did, "CLASS", H5P_DEFAULT)) < 0)
+ goto out;
- if((attr_type = H5Aget_type(attr_id)) < 0)
- goto out;
+ if((atid = H5Aget_type(aid)) < 0)
+ goto out;
- if(H5Tget_class(attr_type) < 0)
- goto out;
+ if(H5Tget_class(atid) < 0)
+ goto out;
- if(H5Aread(attr_id, attr_type, attr_data) < 0)
- goto out;
+ if(H5Aread(aid, atid, attr_data) < 0)
+ goto out;
- if(strcmp(attr_data, PALETTE_CLASS) == 0)
- ret = 1;
- else
- ret = 0;
+ if(strcmp(attr_data, PALETTE_CLASS) == 0)
+ ret = 1;
+ else
+ ret = 0;
- if ( H5Tclose( attr_type ) < 0)
- goto out;
+ if ( H5Tclose( atid ) < 0)
+ goto out;
- if ( H5Aclose( attr_id ) < 0)
- goto out;
+ if ( H5Aclose( aid ) < 0)
+ goto out;
- }
+ }
- /* Close the dataset. */
- if ( H5Dclose( did ) < 0)
- return -1;
+ /* Close the dataset. */
+ if ( H5Dclose( did ) < 0)
+ return -1;
- return ret;
+ return ret;
out:
- H5Dclose( did );
- return -1;
+ H5Dclose( did );
+ return -1;
}
diff --git a/hl/src/H5LT.c b/hl/src/H5LT.c
index 78df61a..c38d383 100644
--- a/hl/src/H5LT.c
+++ b/hl/src/H5LT.c
@@ -1,17 +1,17 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
- * terms governing use, modification, and redistribution, is contained in *
- * the files COPYING and Copyright.html. COPYING can be found at the root *
- * of the source code distribution tree; Copyright.html can be found at the *
- * root level of an installed copy of the electronic HDF5 document set and *
- * is linked from the top-level documents page. It can also be found at *
- * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+* Copyright by The HDF Group. *
+* Copyright by the Board of Trustees of the University of Illinois. *
+* All rights reserved. *
+* *
+* This file is part of HDF5. The full HDF5 copyright notice, including *
+* terms governing use, modification, and redistribution, is contained in *
+* the files COPYING and Copyright.html. COPYING can be found at the root *
+* of the source code distribution tree; Copyright.html can be found at the *
+* root level of an installed copy of the electronic HDF5 document set and *
+* is linked from the top-level documents page. It can also be found at *
+* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
+* access to either file, you may request a copy from help@hdfgroup.org. *
+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <string.h>
#include <stdlib.h>
@@ -33,38 +33,38 @@ int indent = 0;
/*-------------------------------------------------------------------------
- *
- * internal functions
- *
- *-------------------------------------------------------------------------
- */
+*
+* internal functions
+*
+*-------------------------------------------------------------------------
+*/
static herr_t H5LT_get_attribute_mem(hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- hid_t mem_type_id,
- void *data);
-
-/*-------------------------------------------------------------------------
- * Function: H5LT_make_dataset
- *
- * Purpose: Creates and writes a dataset of a type tid
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Quincey Koziol, koziol@hdfgroup.org
- *
- * Date: October 10, 2007
- *
- *-------------------------------------------------------------------------
- */
+ const char *obj_name,
+ const char *attr_name,
+ hid_t mem_type_id,
+ void *data);
+
+/*-------------------------------------------------------------------------
+* Function: H5LT_make_dataset
+*
+* Purpose: Creates and writes a dataset of a type tid
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Quincey Koziol, koziol@hdfgroup.org
+*
+* Date: October 10, 2007
+*
+*-------------------------------------------------------------------------
+*/
static herr_t
H5LT_make_dataset_numerical( hid_t loc_id,
- const char *dset_name,
- int rank,
- const hsize_t *dims,
- hid_t tid,
- const void *data )
+ const char *dset_name,
+ int rank,
+ const hsize_t *dims,
+ hid_t tid,
+ const void *data )
{
hid_t did = -1, sid = -1;
@@ -100,124 +100,124 @@ out:
}
/*-------------------------------------------------------------------------
- *
- * Public functions
- *
- *-------------------------------------------------------------------------
- */
-
-/*-------------------------------------------------------------------------
- * Function: H5LTmake_dataset
- *
- * Purpose: Creates and writes a dataset of a type tid
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: March 19, 2001
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+*
+* Public functions
+*
+*-------------------------------------------------------------------------
+*/
+
+/*-------------------------------------------------------------------------
+* Function: H5LTmake_dataset
+*
+* Purpose: Creates and writes a dataset of a type tid
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: March 19, 2001
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTmake_dataset( hid_t loc_id,
- const char *dset_name,
- int rank,
- const hsize_t *dims,
- hid_t tid,
- const void *data )
+ const char *dset_name,
+ int rank,
+ const hsize_t *dims,
+ hid_t tid,
+ const void *data )
{
return(H5LT_make_dataset_numerical(loc_id, dset_name, rank, dims, tid, data));
}
/*-------------------------------------------------------------------------
- * Function: H5LTmake_dataset_char
- *
- * Purpose: Creates and writes a dataset of H5T_NATIVE_CHAR type
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 14, 2001
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTmake_dataset_char
+*
+* Purpose: Creates and writes a dataset of H5T_NATIVE_CHAR type
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 14, 2001
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTmake_dataset_char( hid_t loc_id,
- const char *dset_name,
- int rank,
- const hsize_t *dims,
- const char *data )
+ const char *dset_name,
+ int rank,
+ const hsize_t *dims,
+ const char *data )
{
return(H5LT_make_dataset_numerical(loc_id, dset_name, rank, dims, H5T_NATIVE_CHAR, data));
}
/*-------------------------------------------------------------------------
- * Function: H5LTmake_dataset_short
- *
- * Purpose: Creates and writes a dataset of H5T_NATIVE_SHORT type
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 14, 2001
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTmake_dataset_short
+*
+* Purpose: Creates and writes a dataset of H5T_NATIVE_SHORT type
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 14, 2001
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTmake_dataset_short( hid_t loc_id,
- const char *dset_name,
- int rank,
- const hsize_t *dims,
- const short *data )
+ const char *dset_name,
+ int rank,
+ const hsize_t *dims,
+ const short *data )
{
return(H5LT_make_dataset_numerical(loc_id, dset_name, rank, dims, H5T_NATIVE_SHORT, data));
}
/*-------------------------------------------------------------------------
- * Function: H5LTmake_dataset_int
- *
- * Purpose: Creates and writes a dataset of H5T_NATIVE_INT type
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 14, 2001
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTmake_dataset_int
+*
+* Purpose: Creates and writes a dataset of H5T_NATIVE_INT type
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 14, 2001
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTmake_dataset_int( hid_t loc_id,
- const char *dset_name,
- int rank,
- const hsize_t *dims,
- const int *data )
+ const char *dset_name,
+ int rank,
+ const hsize_t *dims,
+ const int *data )
{
return(H5LT_make_dataset_numerical(loc_id, dset_name, rank, dims, H5T_NATIVE_INT, data));
}
@@ -225,59 +225,59 @@ herr_t H5LTmake_dataset_int( hid_t loc_id,
/*-------------------------------------------------------------------------
- * Function: H5LTmake_dataset_long
- *
- * Purpose: Creates and writes a dataset of H5T_NATIVE_LONG type
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 14, 2001
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTmake_dataset_long
+*
+* Purpose: Creates and writes a dataset of H5T_NATIVE_LONG type
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 14, 2001
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTmake_dataset_long( hid_t loc_id,
- const char *dset_name,
- int rank,
- const hsize_t *dims,
- const long *data )
+ const char *dset_name,
+ int rank,
+ const hsize_t *dims,
+ const long *data )
{
return(H5LT_make_dataset_numerical(loc_id, dset_name, rank, dims, H5T_NATIVE_LONG, data));
}
/*-------------------------------------------------------------------------
- * Function: H5LTmake_dataset_float
- *
- * Purpose: Creates and writes a dataset of H5T_NATIVE_FLOAT type
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 14, 2001
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTmake_dataset_float
+*
+* Purpose: Creates and writes a dataset of H5T_NATIVE_FLOAT type
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 14, 2001
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTmake_dataset_float( hid_t loc_id,
- const char *dset_name,
- int rank,
- const hsize_t *dims,
- const float *data )
+ const char *dset_name,
+ int rank,
+ const hsize_t *dims,
+ const float *data )
{
return(H5LT_make_dataset_numerical(loc_id, dset_name, rank, dims, H5T_NATIVE_FLOAT, data));
}
@@ -285,53 +285,53 @@ herr_t H5LTmake_dataset_float( hid_t loc_id,
/*-------------------------------------------------------------------------
- * Function: H5LTmake_dataset_double
- *
- * Purpose: Creates and writes a dataset of H5T_NATIVE_DOUBLE type
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 14, 2001
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTmake_dataset_double
+*
+* Purpose: Creates and writes a dataset of H5T_NATIVE_DOUBLE type
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 14, 2001
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTmake_dataset_double( hid_t loc_id,
- const char *dset_name,
- int rank,
- const hsize_t *dims,
- const double *data )
+ const char *dset_name,
+ int rank,
+ const hsize_t *dims,
+ const double *data )
{
return(H5LT_make_dataset_numerical(loc_id, dset_name, rank, dims, H5T_NATIVE_DOUBLE, data));
}
/*-------------------------------------------------------------------------
- * Function: H5LTmake_dataset_string
- *
- * Purpose: Creates and writes a dataset of H5T_C_S1 type
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: October 05, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTmake_dataset_string
+*
+* Purpose: Creates and writes a dataset of H5T_C_S1 type
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: October 05, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTmake_dataset_string(hid_t loc_id,
@@ -389,18 +389,18 @@ out:
/*-------------------------------------------------------------------------
- * Function: H5LT_read_dataset
- *
- * Purpose: Reads a dataset from disk.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Quincey Koziol, koziol@hdfgroup.org
- *
- * Date: October 8, 2007
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LT_read_dataset
+*
+* Purpose: Reads a dataset from disk.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Quincey Koziol, koziol@hdfgroup.org
+*
+* Date: October 8, 2007
+*
+*-------------------------------------------------------------------------
+*/
static herr_t
H5LT_read_dataset_numerical(hid_t loc_id, const char *dset_name, hid_t tid, void *data)
@@ -427,18 +427,18 @@ out:
}
/*-------------------------------------------------------------------------
- * Function: H5LTread_dataset
- *
- * Purpose: Reads a dataset from disk.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: June 13, 2001
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTread_dataset
+*
+* Purpose: Reads a dataset from disk.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: June 13, 2001
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTread_dataset(hid_t loc_id,
const char *dset_name,
@@ -450,150 +450,150 @@ herr_t H5LTread_dataset(hid_t loc_id,
/*-------------------------------------------------------------------------
- * Function: H5LTread_dataset_char
- *
- * Purpose: Reads a dataset from disk.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 5, 2001
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTread_dataset_char
+*
+* Purpose: Reads a dataset from disk.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 5, 2001
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTread_dataset_char( hid_t loc_id,
- const char *dset_name,
- char *data )
+ const char *dset_name,
+ char *data )
{
return(H5LT_read_dataset_numerical(loc_id, dset_name, H5T_NATIVE_CHAR, data));
}
/*-------------------------------------------------------------------------
- * Function: H5LTread_dataset_short
- *
- * Purpose: Reads a dataset from disk.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 5, 2001
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTread_dataset_short
+*
+* Purpose: Reads a dataset from disk.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 5, 2001
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTread_dataset_short( hid_t loc_id,
- const char *dset_name,
- short *data )
+ const char *dset_name,
+ short *data )
{
return(H5LT_read_dataset_numerical(loc_id, dset_name, H5T_NATIVE_SHORT, data));
}
/*-------------------------------------------------------------------------
- * Function: H5LTread_dataset_int
- *
- * Purpose: Reads a dataset from disk.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 5, 2001
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTread_dataset_int
+*
+* Purpose: Reads a dataset from disk.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 5, 2001
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTread_dataset_int( hid_t loc_id,
- const char *dset_name,
- int *data )
+ const char *dset_name,
+ int *data )
{
return(H5LT_read_dataset_numerical(loc_id, dset_name, H5T_NATIVE_INT, data));
}
/*-------------------------------------------------------------------------
- * Function: H5LTread_dataset_long
- *
- * Purpose: Reads a dataset from disk.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 5, 2001
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTread_dataset_long
+*
+* Purpose: Reads a dataset from disk.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 5, 2001
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTread_dataset_long( hid_t loc_id,
- const char *dset_name,
- long *data )
+ const char *dset_name,
+ long *data )
{
return(H5LT_read_dataset_numerical(loc_id, dset_name, H5T_NATIVE_LONG, data));
}
/*-------------------------------------------------------------------------
- * Function: H5LTread_dataset_float
- *
- * Purpose: Reads a dataset from disk.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 5, 2001
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTread_dataset_float
+*
+* Purpose: Reads a dataset from disk.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 5, 2001
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTread_dataset_float( hid_t loc_id,
- const char *dset_name,
- float *data )
+ const char *dset_name,
+ float *data )
{
return(H5LT_read_dataset_numerical(loc_id, dset_name, H5T_NATIVE_FLOAT, data));
}
/*-------------------------------------------------------------------------
- * Function: H5LTread_dataset_double
- *
- * Purpose: Reads a dataset from disk.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 5, 2001
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTread_dataset_double
+*
+* Purpose: Reads a dataset from disk.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 5, 2001
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTread_dataset_double( hid_t loc_id,
- const char *dset_name,
- double *data )
+ const char *dset_name,
+ double *data )
{
return(H5LT_read_dataset_numerical(loc_id, dset_name, H5T_NATIVE_DOUBLE, data));
}
/*-------------------------------------------------------------------------
- * Function: H5LTread_dataset_string
- *
- * Purpose: Reads a dataset
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: October 05, 2004
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTread_dataset_string
+*
+* Purpose: Reads a dataset
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: October 05, 2004
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTread_dataset_string( hid_t loc_id,
- const char *dset_name,
- char *buf )
+ const char *dset_name,
+ char *buf )
{
hid_t did = -1;
hid_t tid = -1;
@@ -627,22 +627,22 @@ out:
/*-------------------------------------------------------------------------
- * Function: H5LTget_dataset_ndims
- *
- * Purpose: Gets the dimensionality of a dataset.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 4, 2001
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_dataset_ndims
+*
+* Purpose: Gets the dimensionality of a dataset.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 4, 2001
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTget_dataset_ndims( hid_t loc_id,
- const char *dset_name,
- int *rank )
+ const char *dset_name,
+ int *rank )
{
hid_t did = -1;
hid_t sid = -1;
@@ -679,25 +679,25 @@ out:
/*-------------------------------------------------------------------------
- * Function: H5LTget_dataset_info
- *
- * Purpose: Gets information about a dataset.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 4, 2001
- * Modified: February 28, 2006: checked for NULL parameters
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_dataset_info
+*
+* Purpose: Gets information about a dataset.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 4, 2001
+* Modified: February 28, 2006: checked for NULL parameters
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTget_dataset_info( hid_t loc_id,
- const char *dset_name,
- hsize_t *dims,
- H5T_class_t *type_class,
- size_t *type_size )
+ const char *dset_name,
+ hsize_t *dims,
+ H5T_class_t *type_class,
+ size_t *type_size )
{
hid_t did = -1;
hid_t tid = -1;
@@ -753,27 +753,27 @@ out:
}
/*-------------------------------------------------------------------------
- * Function: find_dataset
- *
- * Purpose: operator function used by H5LTfind_dataset
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: June 21, 2001
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: find_dataset
+*
+* Purpose: operator function used by H5LTfind_dataset
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: June 21, 2001
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
static herr_t
find_dataset(hid_t loc_id, const char *name, const H5L_info_t *linfo, void *op_data)
{
/* Define a default zero value for return. This will cause the iterator to continue if
- * the dataset is not found yet.
- */
+ * the dataset is not found yet.
+ */
int ret = 0;
/* Shut the compiler up */
@@ -781,9 +781,9 @@ find_dataset(hid_t loc_id, const char *name, const H5L_info_t *linfo, void *op_d
linfo = linfo;
/* Define a positive value for return value if the dataset was found. This will
- * cause the iterator to immediately return that positive value,
- * indicating short-circuit success
- */
+ * cause the iterator to immediately return that positive value,
+ * indicating short-circuit success
+ */
if(strcmp(name, (char *)op_data) == 0)
ret = 1;
@@ -792,26 +792,26 @@ find_dataset(hid_t loc_id, const char *name, const H5L_info_t *linfo, void *op_d
/*-------------------------------------------------------------------------
- * Function: H5LTfind_dataset
- *
- * Purpose: Inquires if a dataset named dset_name exists attached
- * to the object loc_id.
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: July 15, 2001
- *
- * Return:
- * Success: The return value of the first operator that
- * returns non-zero, or zero if all members were
- * processed with no operator returning non-zero.
- *
- * Failure: Negative if something goes wrong within the
- * library, or the negative value returned by one
- * of the operators.
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTfind_dataset
+*
+* Purpose: Inquires if a dataset named dset_name exists attached
+* to the object loc_id.
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: July 15, 2001
+*
+* Return:
+* Success: The return value of the first operator that
+* returns non-zero, or zero if all members were
+* processed with no operator returning non-zero.
+*
+* Failure: Negative if something goes wrong within the
+* library, or the negative value returned by one
+* of the operators.
+*
+*-------------------------------------------------------------------------
+*/
herr_t
H5LTfind_dataset( hid_t loc_id, const char *dset_name )
@@ -821,98 +821,98 @@ H5LTfind_dataset( hid_t loc_id, const char *dset_name )
/*-------------------------------------------------------------------------
- *
- * Set attribute functions
- *
- *-------------------------------------------------------------------------
- */
+*
+* Set attribute functions
+*
+*-------------------------------------------------------------------------
+*/
/*-------------------------------------------------------------------------
- * Function: H5LTset_attribute_string
- *
- * Purpose: Creates and writes a string attribute named attr_name and attaches
- * it to the object specified by the name obj_name.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: July 23, 2001
- *
- * Comments: If the attribute already exists, it is overwritten
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTset_attribute_string
+*
+* Purpose: Creates and writes a string attribute named attr_name and attaches
+* it to the object specified by the name obj_name.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: July 23, 2001
+*
+* Comments: If the attribute already exists, it is overwritten
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTset_attribute_string( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- const char *attr_data )
+ const char *obj_name,
+ const char *attr_name,
+ const char *attr_data )
{
- hid_t attr_type;
- hid_t attr_space_id;
- hid_t attr_id;
- hid_t obj_id;
- int has_attr;
- size_t attr_size;
+ hid_t attr_type;
+ hid_t attr_space_id;
+ hid_t attr_id;
+ hid_t obj_id;
+ int has_attr;
+ size_t attr_size;
- /* Open the object */
- if ((obj_id = H5Oopen(loc_id, obj_name, H5P_DEFAULT)) < 0)
- return -1;
+ /* Open the object */
+ if ((obj_id = H5Oopen(loc_id, obj_name, H5P_DEFAULT)) < 0)
+ return -1;
- /* Create the attribute */
- if ( (attr_type = H5Tcopy( H5T_C_S1 )) < 0 )
- goto out;
+ /* Create the attribute */
+ if ( (attr_type = H5Tcopy( H5T_C_S1 )) < 0 )
+ goto out;
- attr_size = strlen( attr_data ) + 1; /* extra null term */
+ attr_size = strlen( attr_data ) + 1; /* extra null term */
- if ( H5Tset_size( attr_type, (size_t)attr_size) < 0 )
- goto out;
+ if ( H5Tset_size( attr_type, (size_t)attr_size) < 0 )
+ goto out;
- if ( H5Tset_strpad( attr_type, H5T_STR_NULLTERM ) < 0 )
- goto out;
+ if ( H5Tset_strpad( attr_type, H5T_STR_NULLTERM ) < 0 )
+ goto out;
- if ( (attr_space_id = H5Screate( H5S_SCALAR )) < 0 )
- goto out;
+ if ( (attr_space_id = H5Screate( H5S_SCALAR )) < 0 )
+ goto out;
- /* Verify if the attribute already exists */
- has_attr = H5LT_find_attribute(obj_id, attr_name);
+ /* Verify if the attribute already exists */
+ has_attr = H5LT_find_attribute(obj_id, attr_name);
- /* The attribute already exists, delete it */
- if(has_attr == 1)
- if(H5Adelete(obj_id, attr_name) < 0)
- goto out;
+ /* The attribute already exists, delete it */
+ if(has_attr == 1)
+ if(H5Adelete(obj_id, attr_name) < 0)
+ goto out;
- /* Create and write the attribute */
+ /* Create and write the attribute */
- if((attr_id = H5Acreate2(obj_id, attr_name, attr_type, attr_space_id, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
+ if((attr_id = H5Acreate2(obj_id, attr_name, attr_type, attr_space_id, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
- if(H5Awrite(attr_id, attr_type, attr_data) < 0)
- goto out;
+ if(H5Awrite(attr_id, attr_type, attr_data) < 0)
+ goto out;
- if(H5Aclose(attr_id) < 0)
- goto out;
+ if(H5Aclose(attr_id) < 0)
+ goto out;
- if(H5Sclose(attr_space_id) < 0)
- goto out;
+ if(H5Sclose(attr_space_id) < 0)
+ goto out;
- if(H5Tclose(attr_type) < 0)
- goto out;
+ if(H5Tclose(attr_type) < 0)
+ goto out;
- /* Close the object */
- if(H5Oclose(obj_id) < 0)
- return -1;
+ /* Close the object */
+ if(H5Oclose(obj_id) < 0)
+ return -1;
- return 0;
+ return 0;
out:
- H5Oclose(obj_id);
- return -1;
+ H5Oclose(obj_id);
+ return -1;
}
@@ -920,185 +920,185 @@ out:
/*-------------------------------------------------------------------------
- * Function: H5LT_set_attribute_numerical
- *
- * Purpose: Private function used by H5LTset_attribute_int and H5LTset_attribute_float
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: July 25, 2001
- *
- * Comments:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LT_set_attribute_numerical
+*
+* Purpose: Private function used by H5LTset_attribute_int and H5LTset_attribute_float
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: July 25, 2001
+*
+* Comments:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LT_set_attribute_numerical( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- size_t size,
- hid_t tid,
- const void *data )
+ const char *obj_name,
+ const char *attr_name,
+ size_t size,
+ hid_t tid,
+ const void *data )
{
- hid_t obj_id, sid, attr_id;
- hsize_t dim_size=size;
- int has_attr;
+ hid_t obj_id, sid, attr_id;
+ hsize_t dim_size=size;
+ int has_attr;
- /* Open the object */
- if ((obj_id = H5Oopen(loc_id, obj_name, H5P_DEFAULT)) < 0)
- return -1;
+ /* Open the object */
+ if ((obj_id = H5Oopen(loc_id, obj_name, H5P_DEFAULT)) < 0)
+ return -1;
- /* Create the data space for the attribute. */
- if ( (sid = H5Screate_simple( 1, &dim_size, NULL )) < 0 )
- goto out;
+ /* Create the data space for the attribute. */
+ if ( (sid = H5Screate_simple( 1, &dim_size, NULL )) < 0 )
+ goto out;
- /* Verify if the attribute already exists */
- has_attr = H5LT_find_attribute(obj_id, attr_name);
+ /* Verify if the attribute already exists */
+ has_attr = H5LT_find_attribute(obj_id, attr_name);
- /* The attribute already exists, delete it */
- if(has_attr == 1)
- if(H5Adelete(obj_id, attr_name) < 0)
- goto out;
+ /* The attribute already exists, delete it */
+ if(has_attr == 1)
+ if(H5Adelete(obj_id, attr_name) < 0)
+ goto out;
- /* Create the attribute. */
- if((attr_id = H5Acreate2(obj_id, attr_name, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
+ /* Create the attribute. */
+ if((attr_id = H5Acreate2(obj_id, attr_name, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
- /* Write the attribute data. */
- if(H5Awrite(attr_id, tid, data) < 0)
- goto out;
+ /* Write the attribute data. */
+ if(H5Awrite(attr_id, tid, data) < 0)
+ goto out;
- /* Close the attribute. */
- if(H5Aclose(attr_id) < 0)
- goto out;
+ /* Close the attribute. */
+ if(H5Aclose(attr_id) < 0)
+ goto out;
- /* Close the dataspace. */
- if(H5Sclose(sid) < 0)
- goto out;
+ /* Close the dataspace. */
+ if(H5Sclose(sid) < 0)
+ goto out;
- /* Close the object */
- if(H5Oclose(obj_id) < 0)
- return -1;
+ /* Close the object */
+ if(H5Oclose(obj_id) < 0)
+ return -1;
- return 0;
+ return 0;
out:
- H5Oclose(obj_id);
- return -1;
+ H5Oclose(obj_id);
+ return -1;
}
/*-------------------------------------------------------------------------
- * Function: H5LTset_attribute_char
- *
- * Purpose: Create and write an attribute.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 7, 2001
- *
- * Comments:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTset_attribute_char
+*
+* Purpose: Create and write an attribute.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 7, 2001
+*
+* Comments:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTset_attribute_char( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- const char *data,
- size_t size )
+ const char *obj_name,
+ const char *attr_name,
+ const char *data,
+ size_t size )
{
- if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
- H5T_NATIVE_CHAR, data ) < 0 )
- return -1;
+ if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
+ H5T_NATIVE_CHAR, data ) < 0 )
+ return -1;
- return 0;
+ return 0;
}
/*-------------------------------------------------------------------------
- * Function: H5LTset_attribute_uchar
- *
- * Purpose: Create and write an attribute.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: March 8, 2004
- *
- * Comments:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTset_attribute_uchar
+*
+* Purpose: Create and write an attribute.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: March 8, 2004
+*
+* Comments:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTset_attribute_uchar( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- const unsigned char *data,
- size_t size )
+ const char *obj_name,
+ const char *attr_name,
+ const unsigned char *data,
+ size_t size )
{
- if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
- H5T_NATIVE_UCHAR, data ) < 0 )
- return -1;
+ if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
+ H5T_NATIVE_UCHAR, data ) < 0 )
+ return -1;
- return 0;
+ return 0;
}
/*-------------------------------------------------------------------------
- * Function: H5LTset_attribute_short
- *
- * Purpose: Create and write an attribute.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 7, 2001
- *
- * Comments:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTset_attribute_short
+*
+* Purpose: Create and write an attribute.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 7, 2001
+*
+* Comments:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTset_attribute_short( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- const short *data,
- size_t size )
+ const char *obj_name,
+ const char *attr_name,
+ const short *data,
+ size_t size )
{
- if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
- H5T_NATIVE_SHORT, data ) < 0 )
- return -1;
+ if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
+ H5T_NATIVE_SHORT, data ) < 0 )
+ return -1;
- return 0;
+ return 0;
}
/*-------------------------------------------------------------------------
- * Function: H5LTset_attribute_ushort
- *
- * Purpose: Create and write an attribute.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: March 8, 2004
- *
- * Comments:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTset_attribute_ushort
+*
+* Purpose: Create and write an attribute.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: March 8, 2004
+*
+* Comments:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTset_attribute_ushort( hid_t loc_id,
const char *obj_name,
@@ -1107,60 +1107,60 @@ herr_t H5LTset_attribute_ushort( hid_t loc_id,
size_t size )
{
- if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
- H5T_NATIVE_USHORT, data ) < 0 )
- return -1;
+ if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
+ H5T_NATIVE_USHORT, data ) < 0 )
+ return -1;
- return 0;
+ return 0;
}
/*-------------------------------------------------------------------------
- * Function: H5LTset_attribute_int
- *
- * Purpose: Create and write an attribute.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 7, 2001
- *
- * Comments:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTset_attribute_int
+*
+* Purpose: Create and write an attribute.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 7, 2001
+*
+* Comments:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTset_attribute_int( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- const int *data,
- size_t size )
+ const char *obj_name,
+ const char *attr_name,
+ const int *data,
+ size_t size )
{
- if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
- H5T_NATIVE_INT, data ) < 0 )
- return -1;
+ if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
+ H5T_NATIVE_INT, data ) < 0 )
+ return -1;
- return 0;
+ return 0;
}
/*-------------------------------------------------------------------------
- * Function: H5LTset_attribute_uint
- *
- * Purpose: Create and write an attribute.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: March 8, 2004
- *
- * Comments:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTset_attribute_uint
+*
+* Purpose: Create and write an attribute.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: March 8, 2004
+*
+* Comments:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTset_attribute_uint( hid_t loc_id,
const char *obj_name,
@@ -1169,92 +1169,92 @@ herr_t H5LTset_attribute_uint( hid_t loc_id,
size_t size )
{
- if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
- H5T_NATIVE_UINT, data ) < 0 )
- return -1;
+ if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
+ H5T_NATIVE_UINT, data ) < 0 )
+ return -1;
- return 0;
+ return 0;
}
/*-------------------------------------------------------------------------
- * Function: H5LTset_attribute_long
- *
- * Purpose: Create and write an attribute.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 7, 2001
- *
- * Comments:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTset_attribute_long
+*
+* Purpose: Create and write an attribute.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 7, 2001
+*
+* Comments:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTset_attribute_long( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- const long *data,
- size_t size )
+ const char *obj_name,
+ const char *attr_name,
+ const long *data,
+ size_t size )
{
- if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
- H5T_NATIVE_LONG, data ) < 0 )
- return -1;
+ if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
+ H5T_NATIVE_LONG, data ) < 0 )
+ return -1;
- return 0;
+ return 0;
}
/*-------------------------------------------------------------------------
- * Function: H5LTset_attribute_long_long
- *
- * Purpose: Create and write an attribute.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Elena Pourmal, epourmal@ncsa.uiuc.edu
- *
- * Date: June 17, 2005
- *
- * Comments: This function was added to support attributes of type long long
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTset_attribute_long_long
+*
+* Purpose: Create and write an attribute.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Elena Pourmal, epourmal@ncsa.uiuc.edu
+*
+* Date: June 17, 2005
+*
+* Comments: This function was added to support attributes of type long long
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTset_attribute_long_long( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- const long_long *data,
- size_t size )
+ const char *obj_name,
+ const char *attr_name,
+ const long long *data,
+ size_t size )
{
- if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
- H5T_NATIVE_LLONG, data ) < 0 )
- return -1;
+ if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
+ H5T_NATIVE_LLONG, data ) < 0 )
+ return -1;
- return 0;
+ return 0;
}
/*-------------------------------------------------------------------------
- * Function: H5LTset_attribute_ulong
- *
- * Purpose: Create and write an attribute.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: March 8, 2004
- *
- * Comments:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTset_attribute_ulong
+*
+* Purpose: Create and write an attribute.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: March 8, 2004
+*
+* Comments:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTset_attribute_ulong( hid_t loc_id,
const char *obj_name,
@@ -1263,99 +1263,99 @@ herr_t H5LTset_attribute_ulong( hid_t loc_id,
size_t size )
{
- if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
- H5T_NATIVE_ULONG, data ) < 0 )
- return -1;
+ if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
+ H5T_NATIVE_ULONG, data ) < 0 )
+ return -1;
- return 0;
+ return 0;
}
/*-------------------------------------------------------------------------
- * Function: H5LTset_attribute_float
- *
- * Purpose: Create and write an attribute.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: July 25, 2001
- *
- * Comments:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTset_attribute_float
+*
+* Purpose: Create and write an attribute.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: July 25, 2001
+*
+* Comments:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTset_attribute_float( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- const float *data,
- size_t size )
+ const char *obj_name,
+ const char *attr_name,
+ const float *data,
+ size_t size )
{
- if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
- H5T_NATIVE_FLOAT, data ) < 0 )
- return -1;
+ if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
+ H5T_NATIVE_FLOAT, data ) < 0 )
+ return -1;
- return 0;
+ return 0;
}
/*-------------------------------------------------------------------------
- * Function: H5LTset_attribute_double
- *
- * Purpose: Create and write an attribute.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 7, 2001
- *
- * Comments:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTset_attribute_double
+*
+* Purpose: Create and write an attribute.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 7, 2001
+*
+* Comments:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTset_attribute_double( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- const double *data,
- size_t size )
+ const char *obj_name,
+ const char *attr_name,
+ const double *data,
+ size_t size )
{
- if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
- H5T_NATIVE_DOUBLE, data ) < 0 )
- return -1;
+ if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size,
+ H5T_NATIVE_DOUBLE, data ) < 0 )
+ return -1;
- return 0;
+ return 0;
}
/*-------------------------------------------------------------------------
- * Function: find_attr
- *
- * Purpose: operator function used by H5LT_find_attribute
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: June 21, 2001
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: find_attr
+*
+* Purpose: operator function used by H5LT_find_attribute
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: June 21, 2001
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
static herr_t
find_attr(hid_t loc_id, const char *name, const H5A_info_t *ainfo,
- void *op_data)
+ void *op_data)
{
int ret = H5_ITER_CONT;
@@ -1363,9 +1363,9 @@ find_attr(hid_t loc_id, const char *name, const H5A_info_t *ainfo,
loc_id = loc_id; ainfo = ainfo;
/* Define a positive value for return value if the attribute was found. This will
- * cause the iterator to immediately return that positive value,
- * indicating short-circuit success
- */
+ * cause the iterator to immediately return that positive value,
+ * indicating short-circuit success
+ */
if(strcmp(name, (char *)op_data) == 0)
ret = H5_ITER_STOP;
@@ -1374,51 +1374,51 @@ find_attr(hid_t loc_id, const char *name, const H5A_info_t *ainfo,
/*-------------------------------------------------------------------------
- * Function: H5LTfind_attribute
- *
- * Purpose: Inquires if an attribute named attr_name exists attached to
- * the object loc_id.
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: May 17, 2006
- *
- * Comments:
- * Calls the private version of the function
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTfind_attribute
+*
+* Purpose: Inquires if an attribute named attr_name exists attached to
+* the object loc_id.
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: May 17, 2006
+*
+* Comments:
+* Calls the private version of the function
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTfind_attribute( hid_t loc_id, const char* attr_name )
{
- return H5LT_find_attribute(loc_id,attr_name);
+ return H5LT_find_attribute(loc_id,attr_name);
}
/*-------------------------------------------------------------------------
- * Function: H5LT_find_attribute
- *
- * Purpose: Inquires if an attribute named attr_name exists attached to the object loc_id.
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: June 21, 2001
- *
- * Comments:
- * The function uses H5Aiterate2 with the operator function find_attr
- *
- * Return:
- * Success: The return value of the first operator that
- * returns non-zero, or zero if all members were
- * processed with no operator returning non-zero.
- *
- * Failure: Negative if something goes wrong within the
- * library, or the negative value returned by one
- * of the operators.
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LT_find_attribute
+*
+* Purpose: Inquires if an attribute named attr_name exists attached to the object loc_id.
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: June 21, 2001
+*
+* Comments:
+* The function uses H5Aiterate2 with the operator function find_attr
+*
+* Return:
+* Success: The return value of the first operator that
+* returns non-zero, or zero if all members were
+* processed with no operator returning non-zero.
+*
+* Failure: Negative if something goes wrong within the
+* library, or the negative value returned by one
+* of the operators.
+*
+*-------------------------------------------------------------------------
+*/
herr_t
H5LT_find_attribute( hid_t loc_id, const char* attr_name )
@@ -1429,146 +1429,146 @@ H5LT_find_attribute( hid_t loc_id, const char* attr_name )
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_ndims
- *
- * Purpose: Gets the dimensionality of an attribute.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 4, 2001
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_ndims
+*
+* Purpose: Gets the dimensionality of an attribute.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 4, 2001
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTget_attribute_ndims( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- int *rank )
+ const char *obj_name,
+ const char *attr_name,
+ int *rank )
{
- hid_t attr_id;
- hid_t sid;
- hid_t obj_id;
+ hid_t attr_id;
+ hid_t sid;
+ hid_t obj_id;
- /* Open the object */
- if((obj_id = H5Oopen(loc_id, obj_name, H5P_DEFAULT)) < 0)
- return -1;
+ /* Open the object */
+ if((obj_id = H5Oopen(loc_id, obj_name, H5P_DEFAULT)) < 0)
+ return -1;
- /* Open the attribute. */
- if((attr_id = H5Aopen(obj_id, attr_name, H5P_DEFAULT)) < 0)
- {
- H5Oclose(obj_id);
- return -1;
- }
+ /* Open the attribute. */
+ if((attr_id = H5Aopen(obj_id, attr_name, H5P_DEFAULT)) < 0)
+ {
+ H5Oclose(obj_id);
+ return -1;
+ }
- /* Get the dataspace handle */
- if((sid = H5Aget_space(attr_id)) < 0)
- goto out;
+ /* Get the dataspace handle */
+ if((sid = H5Aget_space(attr_id)) < 0)
+ goto out;
- /* Get rank */
- if((*rank = H5Sget_simple_extent_ndims(sid)) < 0)
- goto out;
+ /* Get rank */
+ if((*rank = H5Sget_simple_extent_ndims(sid)) < 0)
+ goto out;
- /* Terminate access to the attribute */
- if ( H5Sclose( sid ) < 0 )
- goto out;
+ /* Terminate access to the attribute */
+ if ( H5Sclose( sid ) < 0 )
+ goto out;
- /* End access to the attribute */
- if ( H5Aclose( attr_id ) )
- goto out;;
+ /* End access to the attribute */
+ if ( H5Aclose( attr_id ) )
+ goto out;;
- /* Close the object */
- if(H5Oclose(obj_id) < 0 )
- return -1;
+ /* Close the object */
+ if(H5Oclose(obj_id) < 0 )
+ return -1;
- return 0;
+ return 0;
out:
- H5Aclose( attr_id );
- H5Oclose(obj_id);
- return -1;
+ H5Aclose( attr_id );
+ H5Oclose(obj_id);
+ return -1;
}
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_info
- *
- * Purpose: Gets information about an attribute.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 4, 2001
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_info
+*
+* Purpose: Gets information about an attribute.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 4, 2001
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTget_attribute_info( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- hsize_t *dims,
- H5T_class_t *type_class,
- size_t *type_size )
+ const char *obj_name,
+ const char *attr_name,
+ hsize_t *dims,
+ H5T_class_t *type_class,
+ size_t *type_size )
{
- hid_t attr_id;
- hid_t tid;
- hid_t sid;
- hid_t obj_id;
+ hid_t attr_id;
+ hid_t tid;
+ hid_t sid;
+ hid_t obj_id;
- /* Open the object */
- if((obj_id = H5Oopen(loc_id, obj_name, H5P_DEFAULT)) < 0)
- return -1;
+ /* Open the object */
+ if((obj_id = H5Oopen(loc_id, obj_name, H5P_DEFAULT)) < 0)
+ return -1;
- /* Open the attribute. */
- if((attr_id = H5Aopen(obj_id, attr_name, H5P_DEFAULT)) < 0)
- {
- H5Oclose(obj_id);
- return -1;
- }
+ /* Open the attribute. */
+ if((attr_id = H5Aopen(obj_id, attr_name, H5P_DEFAULT)) < 0)
+ {
+ H5Oclose(obj_id);
+ return -1;
+ }
- /* Get an identifier for the datatype. */
- tid = H5Aget_type(attr_id);
+ /* Get an identifier for the datatype. */
+ tid = H5Aget_type(attr_id);
- /* Get the class. */
- *type_class = H5Tget_class(tid);
+ /* Get the class. */
+ *type_class = H5Tget_class(tid);
- /* Get the size. */
- *type_size = H5Tget_size( tid );
+ /* Get the size. */
+ *type_size = H5Tget_size( tid );
- /* Get the dataspace handle */
- if ( (sid = H5Aget_space( attr_id )) < 0 )
- goto out;
+ /* Get the dataspace handle */
+ if ( (sid = H5Aget_space( attr_id )) < 0 )
+ goto out;
- /* Get dimensions */
- if ( H5Sget_simple_extent_dims( sid, dims, NULL) < 0 )
- goto out;
+ /* Get dimensions */
+ if ( H5Sget_simple_extent_dims( sid, dims, NULL) < 0 )
+ goto out;
- /* Terminate access to the dataspace */
- if ( H5Sclose( sid ) < 0 )
- goto out;
+ /* Terminate access to the dataspace */
+ if ( H5Sclose( sid ) < 0 )
+ goto out;
- /* Release the datatype. */
- if ( H5Tclose( tid ) )
- goto out;
+ /* Release the datatype. */
+ if ( H5Tclose( tid ) )
+ goto out;
- /* End access to the attribute */
- if ( H5Aclose( attr_id ) )
- goto out;
+ /* End access to the attribute */
+ if ( H5Aclose( attr_id ) )
+ goto out;
- /* Close the object */
- if(H5Oclose(obj_id) < 0 )
- return -1;
+ /* Close the object */
+ if(H5Oclose(obj_id) < 0 )
+ return -1;
- return 0;
+ return 0;
out:
- H5Tclose(tid);
- H5Aclose(attr_id);
- H5Oclose(obj_id);
- return -1;
+ H5Tclose(tid);
+ H5Aclose(attr_id);
+ H5Oclose(obj_id);
+ return -1;
}
@@ -1576,65 +1576,65 @@ out:
/*-------------------------------------------------------------------------
- * Function: H5LTtext_to_dtype
- *
- * Purpose: Convert DDL description to HDF5 data type.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Raymond Lu, slu@ncsa.uiuc.edu
- *
- * Date: October 6, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTtext_to_dtype
+*
+* Purpose: Convert DDL description to HDF5 data type.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Raymond Lu, slu@ncsa.uiuc.edu
+*
+* Date: October 6, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
hid_t H5LTtext_to_dtype(const char *text, H5LT_lang_t lang_type)
{
- extern int H5LTyyparse(void);
- hid_t type_id;
+ extern int H5LTyyparse(void);
+ hid_t type_id;
- if(lang_type <= H5LT_LANG_ERR || lang_type >= H5LT_NO_LANG)
- goto out;
+ if(lang_type <= H5LT_LANG_ERR || lang_type >= H5LT_NO_LANG)
+ goto out;
- if(lang_type != H5LT_DDL) {
- fprintf(stderr, "only DDL is supported for now.\n");
- goto out;
- }
+ if(lang_type != H5LT_DDL) {
+ fprintf(stderr, "only DDL is supported for now.\n");
+ goto out;
+ }
- input_len = strlen(text);
- myinput = strdup(text);
+ input_len = strlen(text);
+ myinput = strdup(text);
- if((type_id = H5LTyyparse()) < 0)
- goto out;
+ if((type_id = H5LTyyparse()) < 0)
+ goto out;
- free(myinput);
- input_len = 0;
+ free(myinput);
+ input_len = 0;
- return type_id;
+ return type_id;
out:
- return -1;
+ return -1;
}
/*-------------------------------------------------------------------------
- * Function: indentation
- *
- * Purpose: Print spaces for indentation
- *
- * Return: void
- *
- * Programmer: Raymond Lu, slu@ncsa.uiuc.edu
- *
- * Date: December 6, 2005
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: indentation
+*
+* Purpose: Print spaces for indentation
+*
+* Return: void
+*
+* Programmer: Raymond Lu, slu@ncsa.uiuc.edu
+*
+* Date: December 6, 2005
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
static void
indentation(int x, char* str)
{
@@ -1648,17 +1648,17 @@ indentation(int x, char* str)
}
/*-------------------------------------------------------------------------
- * Function: print_enum
- *
- * Purpose: prints the enum data
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Raymond Lu
- *
- * Modifications:
- *
- *-----------------------------------------------------------------------*/
+* Function: print_enum
+*
+* Purpose: prints the enum data
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Raymond Lu
+*
+* Modifications:
+*
+*-----------------------------------------------------------------------*/
static herr_t
print_enum(hid_t type, char* str, int indt)
{
@@ -1668,7 +1668,7 @@ print_enum(hid_t type, char* str, int indt)
int nmembs; /*number of members */
char tmp_str[256];
int nchars; /*number of output characters */
- hid_t super; /*enum base integer type */
+ hid_t super = -1; /*enum base integer type */
hid_t native = -1; /*native integer data type */
size_t super_size; /*enum base type size */
size_t dst_size; /*destination value type size */
@@ -1682,9 +1682,9 @@ print_enum(hid_t type, char* str, int indt)
goto out;
/* Use buffer of INT or UNSIGNED INT to print enum values because
- * we don't expect these values to be so big that INT or UNSIGNED
- * INT can't hold.
- */
+ * we don't expect these values to be so big that INT or UNSIGNED
+ * INT can't hold.
+ */
if (H5T_SGN_NONE == H5Tget_sign(super)) {
native = H5T_NATIVE_UINT;
} else {
@@ -1699,9 +1699,9 @@ print_enum(hid_t type, char* str, int indt)
value = (unsigned char*)calloc((size_t)nmembs, MAX(dst_size, super_size));
for (i = 0; i < nmembs; i++) {
- if((name[i] = H5Tget_member_name(type, (unsigned)i))==NULL)
+ if((name[i] = H5Tget_member_name(type, (unsigned)i))==NULL)
goto out;
- if(H5Tget_member_value(type, (unsigned)i, value + i * super_size) < 0)
+ if(H5Tget_member_value(type, (unsigned)i, value + i * super_size) < 0)
goto out;
}
@@ -1712,71 +1712,85 @@ print_enum(hid_t type, char* str, int indt)
}
/*
- * Sort members by increasing value
- * ***not implemented yet***
- */
+ * Sort members by increasing value
+ * ***not implemented yet***
+ */
/* Print members */
for (i = 0; i < nmembs; i++) {
- indentation(indt + COL, str);
- nchars = sprintf(tmp_str, "\"%s\"", name[i]);
+ indentation(indt + COL, str);
+ nchars = sprintf(tmp_str, "\"%s\"", name[i]);
strcat(str, tmp_str);
- sprintf(tmp_str, "%*s ", MAX(0, 16 - nchars), "");
+ sprintf(tmp_str, "%*s ", MAX(0, 16 - nchars), "");
strcat(str, tmp_str);
- if (H5T_SGN_NONE == H5Tget_sign(native)) {
- /*On SGI Altix(cobalt), wrong values were printed out with "value+i*dst_size"
- *strangely, unless use another pointer "copy".*/
- copy = value+i*dst_size;
- sprintf(tmp_str,"%u", *((unsigned int*)((void *)copy)));
+ if (H5T_SGN_NONE == H5Tget_sign(native)) {
+ /*On SGI Altix(cobalt), wrong values were printed out with "value+i*dst_size"
+ *strangely, unless use another pointer "copy".*/
+ copy = value+i*dst_size;
+ sprintf(tmp_str,"%u", *((unsigned int*)((void *)copy)));
strcat(str, tmp_str);
- } else {
- /*On SGI Altix(cobalt), wrong values were printed out with "value+i*dst_size"
- *strangely, unless use another pointer "copy".*/
- copy = value+i*dst_size;
- sprintf(tmp_str,"%d", *((int*)((void *)copy)));
+ } else {
+ /*On SGI Altix(cobalt), wrong values were printed out with "value+i*dst_size"
+ *strangely, unless use another pointer "copy".*/
+ copy = value+i*dst_size;
+ sprintf(tmp_str,"%d", *((int*)((void *)copy)));
strcat(str, tmp_str);
- }
+ }
- strcat(str, ";\n");
+ strcat(str, ";\n");
}
/* Release resources */
- for (i = 0; i < nmembs; i++)
- free(name[i]);
+ for(i = 0; i < nmembs; i++)
+ free(name[i]);
free(name);
free(value);
H5Tclose(super);
- if (0 == nmembs) {
- sprintf(tmp_str, "\n%*s <empty>", indt + 4, "");
+ if(0 == nmembs) {
+ sprintf(tmp_str, "\n%*s <empty>", indt + 4, "");
strcat(str, tmp_str);
- }
+ } /* end if */
return ret;
out:
+ /* Release resources */
+ if(name) {
+ for(i = 0; i < nmembs; i++)
+ if(name[i])
+ free(name[i]);
+ free(name);
+ } /* end if */
+
+ if(value)
+ free(value);
+
+ if(super >= 0)
+ H5Tclose(super);
+
return FAIL;
}
/*-------------------------------------------------------------------------
- * Function: H5LTdtype_to_text
- *
- * Purpose: Convert HDF5 data type to DDL description.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Raymond Lu, slu@ncsa.uiuc.edu
- *
- * Date: December 6, 2005
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTdtype_to_text
+*
+* Purpose: Convert HDF5 data type to DDL description.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Raymond Lu, slu@ncsa.uiuc.edu
+*
+* Date: December 6, 2005
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTdtype_to_text(hid_t dtype, char *str, H5LT_lang_t lang_type, size_t *len)
{
size_t str_len = INCREMENT;
@@ -1792,6 +1806,7 @@ herr_t H5LTdtype_to_text(hid_t dtype, char *str, H5LT_lang_t lang_type, size_t *
if((ret = H5LT_dtype_to_text(dtype, &text_str, lang_type, &str_len, 1)) < 0)
goto out;
*len = strlen(text_str) + 1;
+ free(text_str);
} else if(len && str) {
if((ret = H5LT_dtype_to_text(dtype, &str, lang_type, len, 0)) < 0)
goto out;
@@ -1805,24 +1820,24 @@ out:
}
/*-------------------------------------------------------------------------
- * Function: H5LT_dtype_to_text
- *
- * Purpose: Private function to convert HDF5 data type to DDL description.
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Raymond Lu, slu@ncsa.uiuc.edu
- *
- * Date: December 20, 2005
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LT_dtype_to_text
+*
+* Purpose: Private function to convert HDF5 data type to DDL description.
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Raymond Lu, slu@ncsa.uiuc.edu
+*
+* Date: December 20, 2005
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LT_dtype_to_text(hid_t dtype, char **dt_str, H5LT_lang_t lang, size_t *slen,
- hbool_t no_user_buf)
+ hbool_t no_user_buf)
{
H5T_class_t tcls;
char tmp_str[256];
@@ -1834,8 +1849,8 @@ herr_t H5LT_dtype_to_text(hid_t dtype, char **dt_str, H5LT_lang_t lang, size_t *
*slen += INCREMENT;
tmp = (char*)realloc(*dt_str, *slen);
if(tmp != *dt_str) {
- free(*dt_str);
- *dt_str = tmp;
+ free(*dt_str);
+ *dt_str = tmp;
}
}
@@ -1930,152 +1945,155 @@ herr_t H5LT_dtype_to_text(hid_t dtype, char **dt_str, H5LT_lang_t lang, size_t *
break;
case H5T_STRING:
{
- /* Make a copy of type in memory in case when DTYPE is on disk, the size
- * will be bigger than in memory. This makes it easier to compare
- * types in memory. */
- hid_t str_type;
- H5T_order_t order;
- hid_t tmp_type;
- size_t size;
- H5T_str_t str_pad;
- H5T_cset_t cset;
- htri_t is_vlstr;
-
- if((tmp_type = H5Tcopy(dtype)) < 0)
- goto out;
- if((size = H5Tget_size(tmp_type))==0)
- goto out;
- if((str_pad = H5Tget_strpad(tmp_type)) < 0)
- goto out;
- if((cset = H5Tget_cset(tmp_type)) < 0)
- goto out;
- if((is_vlstr = H5Tis_variable_str(tmp_type)) < 0)
- goto out;
+ /* Make a copy of type in memory in case when DTYPE is on disk, the size
+ * will be bigger than in memory. This makes it easier to compare
+ * types in memory. */
+ hid_t str_type;
+ H5T_order_t order;
+ hid_t tmp_type;
+ size_t size;
+ H5T_str_t str_pad;
+ H5T_cset_t cset;
+ htri_t is_vlstr;
+
+ if((tmp_type = H5Tcopy(dtype)) < 0)
+ goto out;
+ if((size = H5Tget_size(tmp_type))==0)
+ goto out;
+ if((str_pad = H5Tget_strpad(tmp_type)) < 0)
+ goto out;
+ if((cset = H5Tget_cset(tmp_type)) < 0)
+ goto out;
+ if((is_vlstr = H5Tis_variable_str(tmp_type)) < 0)
+ goto out;
- /* Print lead-in */
- sprintf(*dt_str, "H5T_STRING {\n");
- indent += COL;
+ /* Print lead-in */
+ sprintf(*dt_str, "H5T_STRING {\n");
+ indent += COL;
- indentation(indent + COL, *dt_str);
+ indentation(indent + COL, *dt_str);
- if(is_vlstr)
- strcat(*dt_str, "STRSIZE H5T_VARIABLE;\n");
- else {
- sprintf(tmp_str, "STRSIZE %d;\n", (int)size);
- strcat(*dt_str, tmp_str);
- }
+ if(is_vlstr)
+ strcat(*dt_str, "STRSIZE H5T_VARIABLE;\n");
+ else {
+ sprintf(tmp_str, "STRSIZE %d;\n", (int)size);
+ strcat(*dt_str, tmp_str);
+ }
- indentation(indent + COL, *dt_str);
+ indentation(indent + COL, *dt_str);
- if (str_pad == H5T_STR_NULLTERM)
- strcat(*dt_str, "STRPAD H5T_STR_NULLTERM;\n");
- else if (str_pad == H5T_STR_NULLPAD)
- strcat(*dt_str, "STRPAD H5T_STR_NULLPAD;\n");
- else if (str_pad == H5T_STR_SPACEPAD)
- strcat(*dt_str, "STRPAD H5T_STR_SPACEPAD;\n");
- else
- strcat(*dt_str, "STRPAD H5T_STR_ERROR;\n");
+ if (str_pad == H5T_STR_NULLTERM)
+ strcat(*dt_str, "STRPAD H5T_STR_NULLTERM;\n");
+ else if (str_pad == H5T_STR_NULLPAD)
+ strcat(*dt_str, "STRPAD H5T_STR_NULLPAD;\n");
+ else if (str_pad == H5T_STR_SPACEPAD)
+ strcat(*dt_str, "STRPAD H5T_STR_SPACEPAD;\n");
+ else
+ strcat(*dt_str, "STRPAD H5T_STR_ERROR;\n");
- indentation(indent + COL, *dt_str);
+ indentation(indent + COL, *dt_str);
- if (cset == H5T_CSET_ASCII)
- strcat(*dt_str, "CSET H5T_CSET_ASCII;\n");
- else if (cset == H5T_CSET_UTF8)
- strcat(*dt_str, "CSET H5T_CSET_UTF8;\n");
- else
- strcat(*dt_str, "CSET unknown;\n");
+ if (cset == H5T_CSET_ASCII)
+ strcat(*dt_str, "CSET H5T_CSET_ASCII;\n");
+ else if (cset == H5T_CSET_UTF8)
+ strcat(*dt_str, "CSET H5T_CSET_UTF8;\n");
+ else
+ strcat(*dt_str, "CSET unknown;\n");
- /* Reproduce a C type string */
- if((str_type = H5Tcopy(H5T_C_S1)) < 0)
- goto out;
- if(is_vlstr) {
- if(H5Tset_size(str_type, H5T_VARIABLE) < 0)
+ /* Reproduce a C type string */
+ if((str_type = H5Tcopy(H5T_C_S1)) < 0)
goto out;
- } else {
- if(H5Tset_size(str_type, size) < 0)
+ if(is_vlstr) {
+ if(H5Tset_size(str_type, H5T_VARIABLE) < 0)
+ goto out;
+ } else {
+ if(H5Tset_size(str_type, size) < 0)
+ goto out;
+ }
+ if(H5Tset_cset(str_type, cset) < 0)
+ goto out;
+ if(H5Tset_strpad(str_type, str_pad) < 0)
goto out;
- }
- if(H5Tset_cset(str_type, cset) < 0)
- goto out;
- if(H5Tset_strpad(str_type, str_pad) < 0)
- goto out;
- indentation(indent + COL, *dt_str);
+ indentation(indent + COL, *dt_str);
- /* Check C variable-length string first. Are the two types equal? */
- if (H5Tequal(tmp_type, str_type)) {
- strcat(*dt_str, "CTYPE H5T_C_S1;\n");
- goto next;
- }
+ /* Check C variable-length string first. Are the two types equal? */
+ if (H5Tequal(tmp_type, str_type)) {
+ strcat(*dt_str, "CTYPE H5T_C_S1;\n");
+ goto next;
+ }
- /* Change the endianness and see if they're equal. */
- if((order = H5Tget_order(tmp_type)) < 0)
- goto out;
- if(order==H5T_ORDER_LE) {
- if(H5Tset_order(str_type, H5T_ORDER_LE) < 0)
+ /* Change the endianness and see if they're equal. */
+ if((order = H5Tget_order(tmp_type)) < 0)
goto out;
- } else if(order==H5T_ORDER_BE) {
- if(H5Tset_order(str_type, H5T_ORDER_BE) < 0)
+ if(order==H5T_ORDER_LE) {
+ if(H5Tset_order(str_type, H5T_ORDER_LE) < 0)
+ goto out;
+ } else if(order==H5T_ORDER_BE) {
+ if(H5Tset_order(str_type, H5T_ORDER_BE) < 0)
+ goto out;
+ }
+
+ if (H5Tequal(tmp_type, str_type)) {
+ strcat(*dt_str, "H5T_C_S1;\n");
+ goto next;
+ }
+
+ /* If not equal to C variable-length string, check Fortran type.
+ * Actually H5Tequal can't tell difference between H5T_C_S1 and H5T_FORTRAN_S1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
+ if(H5Tclose(str_type) < 0)
goto out;
- }
-
- if (H5Tequal(tmp_type, str_type)) {
- strcat(*dt_str, "H5T_C_S1;\n");
- goto next;
- }
-
- /* If not equal to C variable-length string, check Fortran type.
- * Actually H5Tequal can't tell difference between H5T_C_S1 and H5T_FORTRAN_S1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
- if(H5Tclose(str_type) < 0)
- goto out;
- if((str_type = H5Tcopy(H5T_FORTRAN_S1)) < 0)
- goto out;
- if(H5Tset_cset(str_type, cset) < 0)
- goto out;
- if(H5Tset_size(str_type, size) < 0)
- goto out;
- if(H5Tset_strpad(str_type, str_pad) < 0)
- goto out;
-
- /* Are the two types equal? */
- if (H5Tequal(tmp_type, str_type)) {
- strcat(*dt_str, "CTYPE H5T_FORTRAN_S1;\n");
- goto next;
- }
-
- /* Change the endianness and see if they're equal. */
- if((order = H5Tget_order(tmp_type)) < 0)
- goto out;
- if(order==H5T_ORDER_LE) {
- if(H5Tset_order(str_type, H5T_ORDER_LE) < 0)
+ if((str_type = H5Tcopy(H5T_FORTRAN_S1)) < 0)
goto out;
- } else if(order==H5T_ORDER_BE) {
- if(H5Tset_order(str_type, H5T_ORDER_BE) < 0)
+ if(H5Tset_cset(str_type, cset) < 0)
+ goto out;
+ if(H5Tset_size(str_type, size) < 0)
+ goto out;
+ if(H5Tset_strpad(str_type, str_pad) < 0)
goto out;
- }
- /* Are the two types equal? */
- if (H5Tequal(tmp_type, str_type)) {
- strcat(*dt_str, "CTYPE H5T_FORTRAN_S1;\n");
- goto next;
- }
+ /* Are the two types equal? */
+ if (H5Tequal(tmp_type, str_type)) {
+ strcat(*dt_str, "CTYPE H5T_FORTRAN_S1;\n");
+ goto next;
+ }
- /* Type doesn't match any of above. */
- strcat(*dt_str, "CTYPE unknown_one_character_type;\n ");
+ /* Change the endianness and see if they're equal. */
+ if((order = H5Tget_order(tmp_type)) < 0)
+ goto out;
+ if(order==H5T_ORDER_LE) {
+ if(H5Tset_order(str_type, H5T_ORDER_LE) < 0)
+ goto out;
+ } else if(order==H5T_ORDER_BE) {
+ if(H5Tset_order(str_type, H5T_ORDER_BE) < 0)
+ goto out;
+ }
+
+ /* Are the two types equal? */
+ if (H5Tequal(tmp_type, str_type)) {
+ strcat(*dt_str, "CTYPE H5T_FORTRAN_S1;\n");
+ goto next;
+ }
+
+ /* Type doesn't match any of above. */
+ strcat(*dt_str, "CTYPE unknown_one_character_type;\n ");
next:
- H5Tclose(str_type);
- H5Tclose(tmp_type);
+ H5Tclose(str_type);
+ H5Tclose(tmp_type);
- /* Print closing */
- indent -= COL;
- indentation(indent + COL, *dt_str);
- strcat(*dt_str, "}");
+ /* Print closing */
+ indent -= COL;
+ indentation(indent + COL, *dt_str);
+ strcat(*dt_str, "}");
- break;
+ break;
}
case H5T_OPAQUE:
+ {
+ char *tag;
+
/* Print lead-in */
sprintf(*dt_str, "H5T_OPAQUE {\n");
indent += COL;
@@ -2085,7 +2103,12 @@ next:
strcat(*dt_str, tmp_str);
indentation(indent + COL, *dt_str);
- sprintf(tmp_str, "OPQ_TAG \"%s\";\n", H5Tget_tag(dtype));
+ tag = H5Tget_tag(dtype);
+ if(tag) {
+ sprintf(tmp_str, "OPQ_TAG \"%s\";\n", tag);
+ free(tag);
+ } else
+ sprintf(tmp_str, "OPQ_TAG \"\";\n");
strcat(*dt_str, tmp_str);
/* Print closing */
@@ -2094,168 +2117,169 @@ next:
strcat(*dt_str, "}");
break;
+ }
case H5T_ENUM:
{
- hid_t super;
- size_t super_len;
- char* stmp;
+ hid_t super;
+ size_t super_len;
+ char* stmp;
- /* Print lead-in */
- sprintf(*dt_str, "H5T_ENUM {\n");
- indent += COL;
- indentation(indent + COL, *dt_str);
+ /* Print lead-in */
+ sprintf(*dt_str, "H5T_ENUM {\n");
+ indent += COL;
+ indentation(indent + COL, *dt_str);
- if((super = H5Tget_super(dtype)) < 0)
- goto out;
- if(H5LTdtype_to_text(super, NULL, lang, &super_len) < 0)
- goto out;
- stmp = (char*)calloc(super_len, sizeof(char));
- if(H5LTdtype_to_text(super, stmp, lang, &super_len) < 0)
- goto out;
- strcat(*dt_str, stmp);
- free(stmp);
- strcat(*dt_str, ";\n");
- H5Tclose(super);
-
- if(print_enum(dtype, *dt_str, indent) < 0)
- goto out;
+ if((super = H5Tget_super(dtype)) < 0)
+ goto out;
+ if(H5LTdtype_to_text(super, NULL, lang, &super_len) < 0)
+ goto out;
+ stmp = (char*)calloc(super_len, sizeof(char));
+ if(H5LTdtype_to_text(super, stmp, lang, &super_len) < 0)
+ goto out;
+ strcat(*dt_str, stmp);
+ free(stmp);
+ strcat(*dt_str, ";\n");
+ H5Tclose(super);
- /* Print closing */
- indent -= COL;
- indentation(indent + COL, *dt_str);
- strcat(*dt_str, "}");
+ if(print_enum(dtype, *dt_str, indent) < 0)
+ goto out;
- break;
+ /* Print closing */
+ indent -= COL;
+ indentation(indent + COL, *dt_str);
+ strcat(*dt_str, "}");
+
+ break;
}
case H5T_VLEN:
{
- hid_t super;
- size_t super_len;
- char* stmp;
+ hid_t super;
+ size_t super_len;
+ char* stmp;
- /* Print lead-in */
- sprintf(*dt_str, "H5T_VLEN {\n");
- indent += COL;
- indentation(indent + COL, *dt_str);
+ /* Print lead-in */
+ sprintf(*dt_str, "H5T_VLEN {\n");
+ indent += COL;
+ indentation(indent + COL, *dt_str);
- if((super = H5Tget_super(dtype)) < 0)
- goto out;
- if(H5LTdtype_to_text(super, NULL, lang, &super_len) < 0)
- goto out;
- stmp = (char*)calloc(super_len, sizeof(char));
- if(H5LTdtype_to_text(super, stmp, lang, &super_len) < 0)
- goto out;
- strcat(*dt_str, stmp);
- free(stmp);
- strcat(*dt_str, "\n");
- H5Tclose(super);
+ if((super = H5Tget_super(dtype)) < 0)
+ goto out;
+ if(H5LTdtype_to_text(super, NULL, lang, &super_len) < 0)
+ goto out;
+ stmp = (char*)calloc(super_len, sizeof(char));
+ if(H5LTdtype_to_text(super, stmp, lang, &super_len) < 0)
+ goto out;
+ strcat(*dt_str, stmp);
+ free(stmp);
+ strcat(*dt_str, "\n");
+ H5Tclose(super);
- /* Print closing */
- indent -= COL;
- indentation(indent + COL, *dt_str);
- strcat(*dt_str, "}");
+ /* Print closing */
+ indent -= COL;
+ indentation(indent + COL, *dt_str);
+ strcat(*dt_str, "}");
- break;
+ break;
}
case H5T_ARRAY:
{
- hid_t super;
- size_t super_len;
- char* stmp;
- hsize_t dims[H5S_MAX_RANK];
- int ndims;
-
- /* Print lead-in */
- sprintf(*dt_str, "H5T_ARRAY {\n");
- indent += COL;
- indentation(indent + COL, *dt_str);
-
- /* Get array information */
- if((ndims = H5Tget_array_ndims(dtype)) < 0)
- goto out;
- if(H5Tget_array_dims2(dtype, dims) < 0)
- goto out;
-
- /* Print array dimensions */
- for (i = 0; i < ndims; i++) {
- sprintf(tmp_str, "[%d]", (int) dims[i]);
- strcat(*dt_str, tmp_str);
- }
- strcat(*dt_str, " ");
-
- if((super = H5Tget_super(dtype)) < 0)
- goto out;
- if(H5LTdtype_to_text(super, NULL, lang, &super_len) < 0)
- goto out;
- stmp = (char*)calloc(super_len, sizeof(char));
- if(H5LTdtype_to_text(super, stmp, lang, &super_len) < 0)
- goto out;
- strcat(*dt_str, stmp);
- free(stmp);
- strcat(*dt_str, "\n");
- H5Tclose(super);
-
- /* Print closing */
- indent -= COL;
- indentation(indent + COL, *dt_str);
- strcat(*dt_str, "}");
-
- break;
- }
- case H5T_COMPOUND:
- {
- char *mname;
- hid_t mtype;
- size_t moffset;
- H5T_class_t mclass;
- size_t mlen;
- char* mtmp;
- int nmembs;
-
- if((nmembs = H5Tget_nmembers(dtype)) < 0)
- goto out;
-
- sprintf(*dt_str, "H5T_COMPOUND {\n");
- indent += COL;
+ hid_t super;
+ size_t super_len;
+ char* stmp;
+ hsize_t dims[H5S_MAX_RANK];
+ int ndims;
+
+ /* Print lead-in */
+ sprintf(*dt_str, "H5T_ARRAY {\n");
+ indent += COL;
+ indentation(indent + COL, *dt_str);
- for (i = 0; i < nmembs; i++) {
- if((mname = H5Tget_member_name(dtype, (unsigned)i))==NULL)
+ /* Get array information */
+ if((ndims = H5Tget_array_ndims(dtype)) < 0)
goto out;
- if((mtype = H5Tget_member_type(dtype, (unsigned)i)) < 0)
+ if(H5Tget_array_dims2(dtype, dims) < 0)
goto out;
- moffset = H5Tget_member_offset(dtype, (unsigned)i);
- indentation(indent + COL, *dt_str);
- if((mclass = H5Tget_class(mtype)) < 0)
- goto out;
- if (H5T_COMPOUND == mclass)
- indent += COL;
+ /* Print array dimensions */
+ for (i = 0; i < ndims; i++) {
+ sprintf(tmp_str, "[%d]", (int) dims[i]);
+ strcat(*dt_str, tmp_str);
+ }
+ strcat(*dt_str, " ");
- if(H5LTdtype_to_text(mtype, NULL, lang, &mlen) < 0)
+ if((super = H5Tget_super(dtype)) < 0)
goto out;
- mtmp = (char*)calloc(mlen, sizeof(char));
- if(H5LTdtype_to_text(mtype, mtmp, lang, &mlen) < 0)
+ if(H5LTdtype_to_text(super, NULL, lang, &super_len) < 0)
goto out;
- strcat(*dt_str, mtmp);
- free(mtmp);
-
- if (H5T_COMPOUND == mclass)
- indent -= COL;
+ stmp = (char*)calloc(super_len, sizeof(char));
+ if(H5LTdtype_to_text(super, stmp, lang, &super_len) < 0)
+ goto out;
+ strcat(*dt_str, stmp);
+ free(stmp);
+ strcat(*dt_str, "\n");
+ H5Tclose(super);
- sprintf(tmp_str, " \"%s\"", mname);
- strcat(*dt_str, tmp_str);
- free(mname);
+ /* Print closing */
+ indent -= COL;
+ indentation(indent + COL, *dt_str);
+ strcat(*dt_str, "}");
- sprintf(tmp_str, " : %lu;\n", (unsigned long)moffset);
- strcat(*dt_str, tmp_str);
+ break;
}
+ case H5T_COMPOUND:
+ {
+ char *mname;
+ hid_t mtype;
+ size_t moffset;
+ H5T_class_t mclass;
+ size_t mlen;
+ char* mtmp;
+ int nmembs;
+
+ if((nmembs = H5Tget_nmembers(dtype)) < 0)
+ goto out;
- /* Print closing */
- indent -= COL;
- indentation(indent + COL, *dt_str);
- strcat(*dt_str, "}");
+ sprintf(*dt_str, "H5T_COMPOUND {\n");
+ indent += COL;
+
+ for (i = 0; i < nmembs; i++) {
+ if((mname = H5Tget_member_name(dtype, (unsigned)i))==NULL)
+ goto out;
+ if((mtype = H5Tget_member_type(dtype, (unsigned)i)) < 0)
+ goto out;
+ moffset = H5Tget_member_offset(dtype, (unsigned)i);
+ indentation(indent + COL, *dt_str);
+
+ if((mclass = H5Tget_class(mtype)) < 0)
+ goto out;
+ if (H5T_COMPOUND == mclass)
+ indent += COL;
+
+ if(H5LTdtype_to_text(mtype, NULL, lang, &mlen) < 0)
+ goto out;
+ mtmp = (char*)calloc(mlen, sizeof(char));
+ if(H5LTdtype_to_text(mtype, mtmp, lang, &mlen) < 0)
+ goto out;
+ strcat(*dt_str, mtmp);
+ free(mtmp);
+
+ if (H5T_COMPOUND == mclass)
+ indent -= COL;
+
+ sprintf(tmp_str, " \"%s\"", mname);
+ strcat(*dt_str, tmp_str);
+ free(mname);
+
+ sprintf(tmp_str, " : %lu;\n", (unsigned long)moffset);
+ strcat(*dt_str, tmp_str);
+ }
+
+ /* Print closing */
+ indent -= COL;
+ indentation(indent + COL, *dt_str);
+ strcat(*dt_str, "}");
- break;
+ break;
}
case H5T_TIME:
sprintf(*dt_str, "H5T_TIME: not yet implemented");
@@ -2278,77 +2302,77 @@ out:
/*-------------------------------------------------------------------------
- *
- * Get attribute functions
- *
- *-------------------------------------------------------------------------
- */
+*
+* Get attribute functions
+*
+*-------------------------------------------------------------------------
+*/
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_string
- *
- * Purpose: Reads an attribute named attr_name
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 19, 2002
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_string
+*
+* Purpose: Reads an attribute named attr_name
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 19, 2002
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTget_attribute_string( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- char *data )
+ const char *obj_name,
+ const char *attr_name,
+ char *data )
{
- /* identifiers */
- hid_t obj_id;
+ /* identifiers */
+ hid_t obj_id;
- /* Open the object */
- if ((obj_id = H5Oopen( loc_id, obj_name, H5P_DEFAULT)) < 0)
- return -1;
+ /* Open the object */
+ if ((obj_id = H5Oopen( loc_id, obj_name, H5P_DEFAULT)) < 0)
+ return -1;
- /* Get the attribute */
- if ( H5LT_get_attribute_disk( obj_id, attr_name, data ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LT_get_attribute_disk( obj_id, attr_name, data ) < 0 )
+ return -1;
- /* Close the object */
- if(H5Oclose(obj_id) < 0)
- return -1;
+ /* Close the object */
+ if(H5Oclose(obj_id) < 0)
+ return -1;
- return 0;
+ return 0;
}
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_char
- *
- * Purpose: Reads an attribute named attr_name
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 19, 2002
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_char
+*
+* Purpose: Reads an attribute named attr_name
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 19, 2002
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTget_attribute_char( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- char *data )
+ const char *obj_name,
+ const char *attr_name,
+ char *data )
{
/* Get the attribute */
if(H5LT_get_attribute_mem(loc_id, obj_name, attr_name, H5T_NATIVE_CHAR, data) < 0)
@@ -2358,26 +2382,26 @@ herr_t H5LTget_attribute_char( hid_t loc_id,
}
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_uchar
- *
- * Purpose: Reads an attribute named attr_name
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: March 8, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_uchar
+*
+* Purpose: Reads an attribute named attr_name
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: March 8, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTget_attribute_uchar( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- unsigned char *data )
+ const char *obj_name,
+ const char *attr_name,
+ unsigned char *data )
{
/* Get the attribute */
if(H5LT_get_attribute_mem(loc_id, obj_name, attr_name, H5T_NATIVE_UCHAR, data) < 0)
@@ -2389,26 +2413,26 @@ herr_t H5LTget_attribute_uchar( hid_t loc_id,
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_short
- *
- * Purpose: Reads an attribute named attr_name
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 19, 2002
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_short
+*
+* Purpose: Reads an attribute named attr_name
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 19, 2002
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTget_attribute_short( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- short *data )
+ const char *obj_name,
+ const char *attr_name,
+ short *data )
{
/* Get the attribute */
if(H5LT_get_attribute_mem(loc_id, obj_name, attr_name, H5T_NATIVE_SHORT, data) < 0)
@@ -2418,22 +2442,22 @@ herr_t H5LTget_attribute_short( hid_t loc_id,
}
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_ushort
- *
- * Purpose: Reads an attribute named attr_name
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: March 8, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_ushort
+*
+* Purpose: Reads an attribute named attr_name
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: March 8, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTget_attribute_ushort( hid_t loc_id,
const char *obj_name,
const char *attr_name,
@@ -2449,26 +2473,26 @@ herr_t H5LTget_attribute_ushort( hid_t loc_id,
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_int
- *
- * Purpose: Reads an attribute named attr_name
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 19, 2002
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_int
+*
+* Purpose: Reads an attribute named attr_name
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 19, 2002
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTget_attribute_int( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- int *data )
+ const char *obj_name,
+ const char *attr_name,
+ int *data )
{
/* Get the attribute */
if(H5LT_get_attribute_mem(loc_id, obj_name, attr_name, H5T_NATIVE_INT, data) < 0)
@@ -2478,22 +2502,22 @@ herr_t H5LTget_attribute_int( hid_t loc_id,
}
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_uint
- *
- * Purpose: Reads an attribute named attr_name
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: March 8, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_uint
+*
+* Purpose: Reads an attribute named attr_name
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: March 8, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTget_attribute_uint( hid_t loc_id,
const char *obj_name,
const char *attr_name,
@@ -2509,22 +2533,22 @@ herr_t H5LTget_attribute_uint( hid_t loc_id,
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_long
- *
- * Purpose: Reads an attribute named attr_name
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 19, 2002
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_long
+*
+* Purpose: Reads an attribute named attr_name
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 19, 2002
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTget_attribute_long( hid_t loc_id,
const char *obj_name,
const char *attr_name,
@@ -2538,26 +2562,26 @@ herr_t H5LTget_attribute_long( hid_t loc_id,
}
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_long_long
- *
- * Purpose: Reads an attribute named attr_name
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Elena Pourmal, epourmal@ncsa.uiuc.edu
- *
- * Date: June 17, 2005
- *
- * Comments: This funstion was added to suuport INTEGER*8 Fortran types
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_long_long
+*
+* Purpose: Reads an attribute named attr_name
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Elena Pourmal, epourmal@ncsa.uiuc.edu
+*
+* Date: June 17, 2005
+*
+* Comments: This funstion was added to suuport INTEGER*8 Fortran types
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTget_attribute_long_long( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- long_long *data )
+ const char *obj_name,
+ const char *attr_name,
+ long long *data )
{
/* Get the attribute */
if(H5LT_get_attribute_mem(loc_id, obj_name, attr_name, H5T_NATIVE_LLONG, data) < 0)
@@ -2568,26 +2592,26 @@ herr_t H5LTget_attribute_long_long( hid_t loc_id,
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_ulong
- *
- * Purpose: Reads an attribute named attr_name
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: March 8, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_ulong
+*
+* Purpose: Reads an attribute named attr_name
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: March 8, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTget_attribute_ulong( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- unsigned long *data )
+ const char *obj_name,
+ const char *attr_name,
+ unsigned long *data )
{
/* Get the attribute */
if(H5LT_get_attribute_mem(loc_id, obj_name, attr_name, H5T_NATIVE_ULONG, data) < 0)
@@ -2598,28 +2622,28 @@ herr_t H5LTget_attribute_ulong( hid_t loc_id,
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_float
- *
- * Purpose: Reads an attribute named attr_name
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 19, 2002
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_float
+*
+* Purpose: Reads an attribute named attr_name
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 19, 2002
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTget_attribute_float( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- float *data )
+ const char *obj_name,
+ const char *attr_name,
+ float *data )
{
/* Get the attribute */
if(H5LT_get_attribute_mem(loc_id, obj_name, attr_name, H5T_NATIVE_FLOAT, data) < 0)
@@ -2630,28 +2654,28 @@ herr_t H5LTget_attribute_float( hid_t loc_id,
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute_double
- *
- * Purpose: Reads an attribute named attr_name
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 19, 2002
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute_double
+*
+* Purpose: Reads an attribute named attr_name
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 19, 2002
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTget_attribute_double( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- double *data )
+ const char *obj_name,
+ const char *attr_name,
+ double *data )
{
/* Get the attribute */
if(H5LT_get_attribute_mem(loc_id, obj_name, attr_name, H5T_NATIVE_DOUBLE, data) < 0)
@@ -2662,29 +2686,29 @@ herr_t H5LTget_attribute_double( hid_t loc_id,
/*-------------------------------------------------------------------------
- * Function: H5LTget_attribute
- *
- * Purpose: Reads an attribute named attr_name with the memory type mem_type_id
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 19, 2002
- *
- * Comments: Private function
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LTget_attribute
+*
+* Purpose: Reads an attribute named attr_name with the memory type mem_type_id
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 19, 2002
+*
+* Comments: Private function
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LTget_attribute( hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- hid_t mem_type_id,
- void *data )
+ const char *obj_name,
+ const char *attr_name,
+ hid_t mem_type_id,
+ void *data )
{
/* Get the attribute */
if(H5LT_get_attribute_mem(loc_id, obj_name, attr_name, mem_type_id, data) < 0)
@@ -2695,35 +2719,35 @@ herr_t H5LTget_attribute( hid_t loc_id,
/*-------------------------------------------------------------------------
- * private functions
- *-------------------------------------------------------------------------
- */
+* private functions
+*-------------------------------------------------------------------------
+*/
/*-------------------------------------------------------------------------
- * Function: H5LT_get_attribute_mem
- *
- * Purpose: Reads an attribute named attr_name with the memory type mem_type_id
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 19, 2002
- *
- * Comments: Private function
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LT_get_attribute_mem
+*
+* Purpose: Reads an attribute named attr_name with the memory type mem_type_id
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 19, 2002
+*
+* Comments: Private function
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
static herr_t H5LT_get_attribute_mem(hid_t loc_id,
- const char *obj_name,
- const char *attr_name,
- hid_t mem_type_id,
- void *data)
+ const char *obj_name,
+ const char *attr_name,
+ hid_t mem_type_id,
+ void *data)
{
/* identifiers */
hid_t obj_id = -1;
@@ -2745,7 +2769,7 @@ static herr_t H5LT_get_attribute_mem(hid_t loc_id,
/* Close the object */
if(H5Oclose(obj_id) < 0)
- goto out;
+ goto out;
obj_id = -1;
return 0;
@@ -2757,138 +2781,138 @@ out:
}
/*-------------------------------------------------------------------------
- * Function: H5LT_get_attribute_disk
- *
- * Purpose: Reads an attribute named attr_name with the datatype stored on disk
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: September 19, 2002
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LT_get_attribute_disk
+*
+* Purpose: Reads an attribute named attr_name with the datatype stored on disk
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: September 19, 2002
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LT_get_attribute_disk( hid_t loc_id,
- const char *attr_name,
- void *attr_out )
+ const char *attr_name,
+ void *attr_out )
{
- /* identifiers */
- hid_t attr_id;
- hid_t attr_type;
+ /* identifiers */
+ hid_t attr_id;
+ hid_t attr_type;
- if(( attr_id = H5Aopen(loc_id, attr_name, H5P_DEFAULT)) < 0)
- return -1;
+ if(( attr_id = H5Aopen(loc_id, attr_name, H5P_DEFAULT)) < 0)
+ return -1;
- if((attr_type = H5Aget_type(attr_id)) < 0)
- goto out;
+ if((attr_type = H5Aget_type(attr_id)) < 0)
+ goto out;
- if(H5Aread(attr_id, attr_type, attr_out) < 0)
- goto out;
+ if(H5Aread(attr_id, attr_type, attr_out) < 0)
+ goto out;
- if(H5Tclose(attr_type) < 0)
- goto out;
+ if(H5Tclose(attr_type) < 0)
+ goto out;
- if ( H5Aclose( attr_id ) < 0 )
- return -1;;
+ if ( H5Aclose( attr_id ) < 0 )
+ return -1;;
- return 0;
+ return 0;
out:
- H5Tclose( attr_type );
- H5Aclose( attr_id );
- return -1;
+ H5Tclose( attr_type );
+ H5Aclose( attr_id );
+ return -1;
}
/*-------------------------------------------------------------------------
- * Function: H5LT_set_attribute_string
- *
- * Purpose: creates and writes an attribute named NAME to the dataset DSET_ID
- *
- * Return: FAIL on error, SUCCESS on success
- *
- * Programmer: pvn@ncsa.uiuc.edu
- *
- * Date: January 04, 2005
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5LT_set_attribute_string
+*
+* Purpose: creates and writes an attribute named NAME to the dataset DSET_ID
+*
+* Return: FAIL on error, SUCCESS on success
+*
+* Programmer: pvn@ncsa.uiuc.edu
+*
+* Date: January 04, 2005
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5LT_set_attribute_string(hid_t dset_id,
const char *name,
const char *buf )
{
- hid_t tid;
- hid_t sid = -1;
- hid_t aid = -1;
- int has_attr;
- size_t size;
-
- /* verify if the attribute already exists */
- has_attr = H5LT_find_attribute(dset_id,name);
-
- /* the attribute already exists, delete it */
- if(has_attr == 1)
- if(H5Adelete(dset_id, name) < 0)
- return FAIL;
+ hid_t tid;
+ hid_t sid = -1;
+ hid_t aid = -1;
+ int has_attr;
+ size_t size;
-/*-------------------------------------------------------------------------
- * create the attribute type
- *-------------------------------------------------------------------------
- */
- if((tid = H5Tcopy(H5T_C_S1)) < 0)
- return FAIL;
+ /* verify if the attribute already exists */
+ has_attr = H5LT_find_attribute(dset_id,name);
- size = strlen(buf) + 1; /* extra null term */
+ /* the attribute already exists, delete it */
+ if(has_attr == 1)
+ if(H5Adelete(dset_id, name) < 0)
+ return FAIL;
+
+ /*-------------------------------------------------------------------------
+ * create the attribute type
+ *-------------------------------------------------------------------------
+ */
+ if((tid = H5Tcopy(H5T_C_S1)) < 0)
+ return FAIL;
+
+ size = strlen(buf) + 1; /* extra null term */
- if(H5Tset_size(tid,(size_t)size) < 0)
- goto out;
+ if(H5Tset_size(tid,(size_t)size) < 0)
+ goto out;
- if(H5Tset_strpad(tid, H5T_STR_NULLTERM) < 0)
- goto out;
+ if(H5Tset_strpad(tid, H5T_STR_NULLTERM) < 0)
+ goto out;
- if((sid = H5Screate(H5S_SCALAR)) < 0)
- goto out;
+ if((sid = H5Screate(H5S_SCALAR)) < 0)
+ goto out;
-/*-------------------------------------------------------------------------
- * create and write the attribute
- *-------------------------------------------------------------------------
- */
- if((aid = H5Acreate2(dset_id, name, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
+ /*-------------------------------------------------------------------------
+ * create and write the attribute
+ *-------------------------------------------------------------------------
+ */
+ if((aid = H5Acreate2(dset_id, name, tid, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
- if(H5Awrite(aid, tid, buf) < 0)
- goto out;
+ if(H5Awrite(aid, tid, buf) < 0)
+ goto out;
- if(H5Aclose(aid) < 0)
- goto out;
+ if(H5Aclose(aid) < 0)
+ goto out;
- if(H5Sclose(sid) < 0)
- goto out;
+ if(H5Sclose(sid) < 0)
+ goto out;
- if(H5Tclose(tid) < 0)
- goto out;
+ if(H5Tclose(tid) < 0)
+ goto out;
- return SUCCEED;
+ return SUCCEED;
- /* error zone, gracefully close */
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Aclose(aid);
- H5Tclose(tid);
- H5Sclose(sid);
- } H5E_END_TRY;
- return FAIL;
+ H5E_BEGIN_TRY {
+ H5Aclose(aid);
+ H5Tclose(tid);
+ H5Sclose(sid);
+ } H5E_END_TRY;
+ return FAIL;
}
diff --git a/hl/src/H5LTanalyze.c b/hl/src/H5LTanalyze.c
index f46b9ea..9e9eec2 100644
--- a/hl/src/H5LTanalyze.c
+++ b/hl/src/H5LTanalyze.c
@@ -849,7 +849,7 @@ hbool_t first_quote = 1;
/* For Lex and Yacc */
/*int input_len;
char *myinput;*/
-
+
#define TAG_STRING 1
#line 834 "H5LTanalyze.c"
@@ -1288,17 +1288,17 @@ YY_RULE_SETUP
case 40:
YY_RULE_SETUP
#line 121 "H5LTanalyze.l"
-{return token(H5T_STR_NULLTERM_TOKEN);}
+{return token(H5T_STR_NULLTERM_TOKEN);}
YY_BREAK
case 41:
YY_RULE_SETUP
#line 122 "H5LTanalyze.l"
-{return token(H5T_STR_NULLPAD_TOKEN);}
+{return token(H5T_STR_NULLPAD_TOKEN);}
YY_BREAK
case 42:
YY_RULE_SETUP
#line 123 "H5LTanalyze.l"
-{return token(H5T_STR_SPACEPAD_TOKEN);}
+{return token(H5T_STR_SPACEPAD_TOKEN);}
YY_BREAK
case 43:
YY_RULE_SETUP
@@ -1363,12 +1363,12 @@ YY_RULE_SETUP
case 55:
YY_RULE_SETUP
#line 139 "H5LTanalyze.l"
-{
- if( is_str_size || (is_enum && is_enum_memb) ||
+{
+ if( is_str_size || (is_enum && is_enum_memb) ||
is_opq_size || (asindex>-1 && arr_stack[asindex].is_dim) ||
(csindex>-1 && cmpd_stack[csindex].is_field) ) {
H5LTyylval.ival = atoi(yytext);
- return NUMBER;
+ return NUMBER;
} else
REJECT;
}
@@ -1378,7 +1378,7 @@ YY_RULE_SETUP
#line 149 "H5LTanalyze.l"
{
/*if it's first quote, and is a compound field name or an enum symbol*/
- if((is_opq_tag || is_enum || (csindex>-1 && cmpd_stack[csindex].is_field))
+ if((is_opq_tag || is_enum || (csindex>-1 && cmpd_stack[csindex].is_field))
&& first_quote) {
first_quote = 0;
BEGIN TAG_STRING;
@@ -2323,8 +2323,8 @@ int main()
int my_yyinput(char *buf, int max_size)
{
int ret;
-
- memcpy(buf, myinput, input_len);
+
+ memcpy(buf, myinput, input_len);
ret = input_len;
return ret;
}
diff --git a/hl/src/H5LTparse.c b/hl/src/H5LTparse.c
index 35c4670..98dcbd5 100644
--- a/hl/src/H5LTparse.c
+++ b/hl/src/H5LTparse.c
@@ -14,9 +14,8 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* This file was generated by Yacc with the command "yacc -pH5LTyy -o H5LTparse.c -d H5LTparse.y"
- * Do NOT modify it by hand.
+ * on jam. Do NOT modify it by hand.
*/
-
#ifndef lint
static char const
yyrcsid[] = "$FreeBSD: src/usr.bin/yacc/skeleton.c,v 1.28 2000/01/17 02:04:06 bde Exp $";
@@ -1053,22 +1052,35 @@ case 92:
short short_val=(short)yylval.ival;
int int_val=(int)yylval.ival;
long long_val=(long)yylval.ival;
- long_long llong_val=(long_long)yylval.ival;
+ long long llong_val=(long long)yylval.ival;
hid_t super = H5Tget_super(enum_id);
hid_t native = H5Tget_native_type(super, H5T_DIR_ASCEND);
-
+ H5T_order_t super_order = H5Tget_order(super);
+ H5T_order_t native_order = H5Tget_order(native);
+
if(is_enum && is_enum_memb) { /*if it's an enum member*/
/*To handle machines of different endianness*/
- if(H5Tequal(native, H5T_NATIVE_SCHAR) || H5Tequal(native, H5T_NATIVE_UCHAR))
+ if(H5Tequal(native, H5T_NATIVE_SCHAR) || H5Tequal(native, H5T_NATIVE_UCHAR)) {
+ if(super_order != native_order)
+ H5Tconvert(native, super, 1, &char_val, NULL, H5P_DEFAULT);
H5Tenum_insert(enum_id, enum_memb_symbol, &char_val);
- else if(H5Tequal(native, H5T_NATIVE_SHORT) || H5Tequal(native, H5T_NATIVE_USHORT))
+ } else if(H5Tequal(native, H5T_NATIVE_SHORT) || H5Tequal(native, H5T_NATIVE_USHORT)) {
+ if(super_order != native_order)
+ H5Tconvert(native, super, 1, &short_val, NULL, H5P_DEFAULT);
H5Tenum_insert(enum_id, enum_memb_symbol, &short_val);
- else if(H5Tequal(native, H5T_NATIVE_INT) || H5Tequal(native, H5T_NATIVE_UINT))
+ } else if(H5Tequal(native, H5T_NATIVE_INT) || H5Tequal(native, H5T_NATIVE_UINT)) {
+ if(super_order != native_order)
+ H5Tconvert(native, super, 1, &int_val, NULL, H5P_DEFAULT);
H5Tenum_insert(enum_id, enum_memb_symbol, &int_val);
- else if(H5Tequal(native, H5T_NATIVE_LONG) || H5Tequal(native, H5T_NATIVE_ULONG))
+ } else if(H5Tequal(native, H5T_NATIVE_LONG) || H5Tequal(native, H5T_NATIVE_ULONG)) {
+ if(super_order != native_order)
+ H5Tconvert(native, super, 1, &long_val, NULL, H5P_DEFAULT);
H5Tenum_insert(enum_id, enum_memb_symbol, &long_val);
- else if(H5Tequal(native, H5T_NATIVE_LLONG) || H5Tequal(native, H5T_NATIVE_ULLONG))
+ } else if(H5Tequal(native, H5T_NATIVE_LLONG) || H5Tequal(native, H5T_NATIVE_ULLONG)) {
+ if(super_order != native_order)
+ H5Tconvert(native, super, 1, &llong_val, NULL, H5P_DEFAULT);
H5Tenum_insert(enum_id, enum_memb_symbol, &llong_val);
+ }
is_enum_memb = 0;
if(enum_memb_symbol) free(enum_memb_symbol);
@@ -1078,7 +1090,7 @@ case 92:
H5Tclose(native);
}
break;
-#line 1063 "H5LTparse.c"
+#line 1076 "H5LTparse.c"
}
yyssp -= yym;
yystate = *yyssp;
diff --git a/hl/src/H5LTparse.y b/hl/src/H5LTparse.y
index 7866add..a021efc 100644
--- a/hl/src/H5LTparse.y
+++ b/hl/src/H5LTparse.y
@@ -337,22 +337,35 @@ enum_def : '"' enum_symbol '"' {
short short_val=(short)yylval.ival;
int int_val=(int)yylval.ival;
long long_val=(long)yylval.ival;
- long_long llong_val=(long_long)yylval.ival;
+ long long llong_val=(long long)yylval.ival;
hid_t super = H5Tget_super(enum_id);
hid_t native = H5Tget_native_type(super, H5T_DIR_ASCEND);
-
+ H5T_order_t super_order = H5Tget_order(super);
+ H5T_order_t native_order = H5Tget_order(native);
+
if(is_enum && is_enum_memb) { /*if it's an enum member*/
/*To handle machines of different endianness*/
- if(H5Tequal(native, H5T_NATIVE_SCHAR) || H5Tequal(native, H5T_NATIVE_UCHAR))
+ if(H5Tequal(native, H5T_NATIVE_SCHAR) || H5Tequal(native, H5T_NATIVE_UCHAR)) {
+ if(super_order != native_order)
+ H5Tconvert(native, super, 1, &char_val, NULL, H5P_DEFAULT);
H5Tenum_insert(enum_id, enum_memb_symbol, &char_val);
- else if(H5Tequal(native, H5T_NATIVE_SHORT) || H5Tequal(native, H5T_NATIVE_USHORT))
+ } else if(H5Tequal(native, H5T_NATIVE_SHORT) || H5Tequal(native, H5T_NATIVE_USHORT)) {
+ if(super_order != native_order)
+ H5Tconvert(native, super, 1, &short_val, NULL, H5P_DEFAULT);
H5Tenum_insert(enum_id, enum_memb_symbol, &short_val);
- else if(H5Tequal(native, H5T_NATIVE_INT) || H5Tequal(native, H5T_NATIVE_UINT))
+ } else if(H5Tequal(native, H5T_NATIVE_INT) || H5Tequal(native, H5T_NATIVE_UINT)) {
+ if(super_order != native_order)
+ H5Tconvert(native, super, 1, &int_val, NULL, H5P_DEFAULT);
H5Tenum_insert(enum_id, enum_memb_symbol, &int_val);
- else if(H5Tequal(native, H5T_NATIVE_LONG) || H5Tequal(native, H5T_NATIVE_ULONG))
+ } else if(H5Tequal(native, H5T_NATIVE_LONG) || H5Tequal(native, H5T_NATIVE_ULONG)) {
+ if(super_order != native_order)
+ H5Tconvert(native, super, 1, &long_val, NULL, H5P_DEFAULT);
H5Tenum_insert(enum_id, enum_memb_symbol, &long_val);
- else if(H5Tequal(native, H5T_NATIVE_LLONG) || H5Tequal(native, H5T_NATIVE_ULLONG))
+ } else if(H5Tequal(native, H5T_NATIVE_LLONG) || H5Tequal(native, H5T_NATIVE_ULLONG)) {
+ if(super_order != native_order)
+ H5Tconvert(native, super, 1, &llong_val, NULL, H5P_DEFAULT);
H5Tenum_insert(enum_id, enum_memb_symbol, &llong_val);
+ }
is_enum_memb = 0;
if(enum_memb_symbol) free(enum_memb_symbol);
diff --git a/hl/src/H5LTpublic.h b/hl/src/H5LTpublic.h
index 05670d2..7fb873a 100644
--- a/hl/src/H5LTpublic.h
+++ b/hl/src/H5LTpublic.h
@@ -203,7 +203,7 @@ H5_HLDLL herr_t H5LTset_attribute_long( hid_t loc_id,
H5_HLDLL herr_t H5LTset_attribute_long_long( hid_t loc_id,
const char *obj_name,
const char *attr_name,
- const long_long *buffer,
+ const long long *buffer,
size_t size );
H5_HLDLL herr_t H5LTset_attribute_ulong( hid_t loc_id,
@@ -280,7 +280,7 @@ H5_HLDLL herr_t H5LTget_attribute_long( hid_t loc_id,
H5_HLDLL herr_t H5LTget_attribute_long_long( hid_t loc_id,
const char *obj_name,
const char *attr_name,
- long_long *data );
+ long long *data );
H5_HLDLL herr_t H5LTget_attribute_ulong( hid_t loc_id,
const char *obj_name,
diff --git a/hl/src/H5PT.c b/hl/src/H5PT.c
index 2119cca..3d16db5 100644
--- a/hl/src/H5PT.c
+++ b/hl/src/H5PT.c
@@ -33,10 +33,10 @@ static H5I_type_t H5PT_ptable_id_type = H5I_UNINIT;
#define H5PT_HASH_TABLE_SIZE 64
/* Packet Table private functions */
-herr_t H5PT_close( htbl_t* table );
-herr_t H5PT_create_index(htbl_t *table_id);
-herr_t H5PT_set_index(htbl_t *table_id, hsize_t pt_index);
-herr_t H5PT_get_index(htbl_t *table_id, hsize_t *pt_index);
+static herr_t H5PT_close( htbl_t* table );
+static herr_t H5PT_create_index(htbl_t *table_id);
+static herr_t H5PT_set_index(htbl_t *table_id, hsize_t pt_index);
+static herr_t H5PT_get_index(htbl_t *table_id, hsize_t *pt_index);
/*-------------------------------------------------------------------------
*
@@ -269,6 +269,8 @@ hid_t H5PTopen( hid_t loc_id,
goto out;
if( H5Sget_simple_extent_dims( space_id, dims, NULL) < 0)
goto out;
+ if(H5Sclose(space_id) < 0)
+ goto out;
table->size = dims[0];
/* Get an ID for this table */
@@ -284,6 +286,7 @@ hid_t H5PTopen( hid_t loc_id,
out:
H5E_BEGIN_TRY
H5Tclose(type_id);
+ H5Sclose(space_id);
if(table)
{
H5Dclose(table->dset_id);
@@ -314,7 +317,8 @@ out:
*
*-------------------------------------------------------------------------
*/
-herr_t H5PT_close( htbl_t* table)
+static herr_t
+H5PT_close( htbl_t* table)
{
if(table == NULL)
goto out;
@@ -567,7 +571,8 @@ out:
*
*-------------------------------------------------------------------------
*/
-herr_t H5PT_create_index(htbl_t *table)
+static herr_t
+H5PT_create_index(htbl_t *table)
{
if( table != NULL)
{
@@ -577,7 +582,8 @@ herr_t H5PT_create_index(htbl_t *table)
return -1;
}
-herr_t H5PT_set_index(htbl_t *table, hsize_t index)
+static herr_t
+H5PT_set_index(htbl_t *table, hsize_t index)
{
/* Ensure index is valid */
if( table != NULL )
@@ -591,7 +597,8 @@ herr_t H5PT_set_index(htbl_t *table, hsize_t index)
return -1;
}
-herr_t H5PT_get_index(htbl_t *table, hsize_t *index)
+static herr_t
+H5PT_get_index(htbl_t *table, hsize_t *index)
{
/* Ensure index is valid */
if( table != NULL )
diff --git a/hl/src/H5TB.c b/hl/src/H5TB.c
index e80f86c..a035319 100644
--- a/hl/src/H5TB.c
+++ b/hl/src/H5TB.c
@@ -1,17 +1,17 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
- * terms governing use, modification, and redistribution, is contained in *
- * the files COPYING and Copyright.html. COPYING can be found at the root *
- * of the source code distribution tree; Copyright.html can be found at the *
- * root level of an installed copy of the electronic HDF5 document set and *
- * is linked from the top-level documents page. It can also be found at *
- * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+* Copyright by The HDF Group. *
+* Copyright by the Board of Trustees of the University of Illinois. *
+* All rights reserved. *
+* *
+* This file is part of HDF5. The full HDF5 copyright notice, including *
+* terms governing use, modification, and redistribution, is contained in *
+* the files COPYING and Copyright.html. COPYING can be found at the root *
+* of the source code distribution tree; Copyright.html can be found at the *
+* root level of an installed copy of the electronic HDF5 document set and *
+* is linked from the top-level documents page. It can also be found at *
+* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
+* access to either file, you may request a copy from help@hdfgroup.org. *
+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <stdlib.h>
#include <string.h>
@@ -20,11 +20,11 @@
/*-------------------------------------------------------------------------
- *
- * internal functions
- *
- *-------------------------------------------------------------------------
- */
+*
+* internal functions
+*
+*-------------------------------------------------------------------------
+*/
static int H5TB_find_field(const char *field,
const char *field_list);
@@ -43,974 +43,436 @@ static hid_t H5TB_create_type(hid_t loc_id,
hid_t ftype_id);
/*-------------------------------------------------------------------------
- *
- * Create functions
- *
- *-------------------------------------------------------------------------
- */
-
-/*-------------------------------------------------------------------------
- * Function: H5TBmake_table
- *
- * Purpose: Make a table
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- * Quincey Koziol
- *
- * Date: January 17, 2001
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+*
+* Create functions
+*
+*-------------------------------------------------------------------------
+*/
+
+/*-------------------------------------------------------------------------
+* Function: H5TBmake_table
+*
+* Purpose: Make a table
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+* Quincey Koziol
+*
+* Date: January 17, 2001
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5TBmake_table( const char *table_title,
- hid_t loc_id,
- const char *dset_name,
- hsize_t nfields,
- hsize_t nrecords,
- size_t type_size,
- const char *field_names[],
- const size_t *field_offset,
- const hid_t *field_types,
- hsize_t chunk_size,
- void *fill_data,
- int compress,
- const void *data )
+ hid_t loc_id,
+ const char *dset_name,
+ hsize_t nfields,
+ hsize_t nrecords,
+ size_t type_size,
+ const char *field_names[],
+ const size_t *field_offset,
+ const hid_t *field_types,
+ hsize_t chunk_size,
+ void *fill_data,
+ int compress,
+ const void *buf )
{
- hid_t did;
- hid_t sid;
- hid_t mem_type_id;
- hid_t plist_id;
- hsize_t dims[1];
- hsize_t dims_chunk[1];
- hsize_t maxdims[1] = { H5S_UNLIMITED };
- char attr_name[255];
- char *member_name;
- hid_t attr_id;
- char aux[255];
- hsize_t i;
- unsigned char *tmp_buf;
-
- dims[0] = nrecords;
- dims_chunk[0] = chunk_size;
-
- /* Create the memory data type. */
- if ((mem_type_id = H5Tcreate (H5T_COMPOUND, type_size )) < 0)
- return -1;
-
- /* Insert fields. */
- for ( i = 0; i < nfields; i++)
- {
- if(H5Tinsert(mem_type_id, field_names[i], field_offset[i], field_types[i] ) < 0)
- return -1;
- }
-
- /* Create a simple data space with unlimited size */
- if((sid = H5Screate_simple( 1, dims, maxdims )) < 0)
- return -1;
-
- /* Modify dataset creation properties, i.e. enable chunking */
- plist_id = H5Pcreate(H5P_DATASET_CREATE);
- if(H5Pset_chunk(plist_id, 1, dims_chunk) < 0)
- return -1;
-
- /* Set the fill value using a struct as the data type. */
- if(fill_data)
- if(H5Pset_fill_value(plist_id, mem_type_id, fill_data) < 0)
- return -1;
-
- /*
- Dataset creation property list is modified to use
- GZIP compression with the compression effort set to 6.
- Note that compression can be used only when dataset is chunked.
- */
- if(compress)
- if(H5Pset_deflate(plist_id, 6) < 0)
- return -1;
-
- /* Create the dataset. */
- if((did = H5Dcreate2(loc_id, dset_name, mem_type_id, sid, H5P_DEFAULT, plist_id, H5P_DEFAULT)) < 0)
- goto out;
-
- /* Only write if there is something to write */
- if(data)
- /* Write data to the dataset. */
- if(H5Dwrite( did, mem_type_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, data ) < 0)
- goto out;
-
- /* Terminate access to the data space. */
- if(H5Sclose(sid) < 0)
- goto out;
-
- /* End access to the dataset */
- if(H5Dclose(did) < 0)
- goto out;
-
- /* End access to the property list */
- if(H5Pclose(plist_id) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * Set the conforming table attributes
- *-------------------------------------------------------------------------
- */
-
- /* Attach the CLASS attribute */
- if(H5LTset_attribute_string( loc_id, dset_name, "CLASS", TABLE_CLASS ) < 0)
- goto out;
-
- /* Attach the VERSION attribute */
- if(H5LTset_attribute_string( loc_id, dset_name, "VERSION", "2.0" ) < 0)
- goto out;
-
- /* Attach the TITLE attribute */
- if(H5LTset_attribute_string( loc_id, dset_name, "TITLE", table_title ) < 0)
- goto out;
-
- /* Attach the FIELD_ name attribute */
- for ( i = 0; i < nfields; i++)
- {
-
- /* Get the member name */
- member_name = H5Tget_member_name( mem_type_id,(unsigned) i );
-
- strcpy( attr_name, "FIELD_" );
- sprintf( aux, "%d", (int)i );
- strcat( attr_name, aux );
- sprintf( aux, "%s", "_NAME" );
- strcat( attr_name, aux );
+ hid_t did;
+ hid_t sid;
+ hid_t mem_type_id;
+ hid_t plist_id;
+ hsize_t dims[1];
+ hsize_t dims_chunk[1];
+ hsize_t maxdims[1] = { H5S_UNLIMITED };
+ char attr_name[255];
+ char *member_name;
+ hid_t attr_id;
+ char aux[255];
+ hsize_t i;
+ unsigned char *tmp_buf;
+
+ dims[0] = nrecords;
+ dims_chunk[0] = chunk_size;
+
+ /* create the memory data type. */
+ if ((mem_type_id = H5Tcreate (H5T_COMPOUND, type_size )) < 0)
+ return -1;
+
+ /* insert fields. */
+ for ( i = 0; i < nfields; i++)
+ {
+ if(H5Tinsert(mem_type_id, field_names[i], field_offset[i], field_types[i] ) < 0)
+ return -1;
+ }
- /* Attach the attribute */
- if(H5LTset_attribute_string( loc_id, dset_name, attr_name, member_name ) < 0)
- goto out;
+ /* create a simple data space with unlimited size */
+ if ((sid = H5Screate_simple( 1, dims, maxdims )) < 0)
+ return -1;
- free( member_name );
+ /* modify dataset creation properties, i.e. enable chunking */
+ plist_id = H5Pcreate(H5P_DATASET_CREATE);
+ if (H5Pset_chunk(plist_id, 1, dims_chunk) < 0)
+ return -1;
- }
+ /* set the fill value using a struct as the data type. */
+ if (fill_data)
+ {
+ if(H5Pset_fill_value(plist_id, mem_type_id, fill_data) < 0)
+ return -1;
+ }
- /* Attach the FIELD_ fill value attribute */
- if(fill_data )
- {
+ /*
+ dataset creation property list is modified to use
+ GZIP compression with the compression effort set to 6.
+ */
+ if (compress)
+ {
+ if(H5Pset_deflate(plist_id, 6) < 0)
+ return -1;
+ }
- tmp_buf = fill_data;
+ /* create the dataset. */
+ if ((did = H5Dcreate2(loc_id, dset_name, mem_type_id, sid, H5P_DEFAULT, plist_id, H5P_DEFAULT)) < 0)
+ goto out;
- /* Open the dataset. */
- if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- return -1;
+ /* only write if there is something to write */
+ if (buf)
+ {
+ /* Write data to the dataset. */
+ if (H5Dwrite( did, mem_type_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf ) < 0)
+ goto out;
+ }
- if (( sid = H5Screate(H5S_SCALAR)) < 0)
- goto out;
+ /* terminate access to the data space. */
+ if (H5Sclose(sid) < 0)
+ goto out;
- for ( i = 0; i < nfields; i++)
- {
+ /* end access to the dataset */
+ if (H5Dclose(did) < 0)
+ goto out;
- /* Get the member name */
- member_name = H5Tget_member_name(mem_type_id, (unsigned)i);
+ /* end access to the property list */
+ if (H5Pclose(plist_id) < 0)
+ goto out;
- strcpy(attr_name, "FIELD_");
- sprintf(aux, "%d", (int)i);
- strcat(attr_name, aux);
- sprintf(aux, "%s", "_FILL");
- strcat(attr_name, aux);
+ /*-------------------------------------------------------------------------
+ * set the conforming table attributes
+ *-------------------------------------------------------------------------
+ */
- if((attr_id = H5Acreate2(did, attr_name, field_types[i], sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
+ /* attach the CLASS attribute */
+ if (H5LTset_attribute_string( loc_id, dset_name, "CLASS", TABLE_CLASS ) < 0)
+ goto out;
- if(H5Awrite(attr_id, field_types[i], tmp_buf+field_offset[i]) < 0)
- goto out;
+ /* attach the VERSION attribute */
+ if (H5LTset_attribute_string( loc_id, dset_name, "VERSION", TABLE_VERSION ) < 0)
+ goto out;
- if(H5Aclose(attr_id) < 0)
- goto out;
+ /* attach the TITLE attribute */
+ if (H5LTset_attribute_string( loc_id, dset_name, "TITLE", table_title ) < 0)
+ goto out;
- free(member_name);
- }
+ /* attach the FIELD_ name attribute */
+ for ( i = 0; i < nfields; i++)
+ {
+ /* get the member name */
+ member_name = H5Tget_member_name( mem_type_id,(unsigned) i );
- /* Close the dataset. */
- H5Dclose( did );
+ strcpy( attr_name, "FIELD_" );
+ sprintf( aux, "%d", (int)i );
+ strcat( attr_name, aux );
+ sprintf( aux, "%s", "_NAME" );
+ strcat( attr_name, aux );
- /* Close data space. */
- H5Sclose( sid );
- }
+ /* attach the attribute */
+ if (H5LTset_attribute_string( loc_id, dset_name, attr_name, member_name ) < 0)
+ goto out;
- /* Release the datatype. */
- if(H5Tclose( mem_type_id ) < 0)
- return -1;
+ free( member_name );
-return 0;
+ }
-/* error zone, gracefully close */
-out:
- H5E_BEGIN_TRY {
- H5Dclose(did);
- H5Sclose(sid);
- H5Pclose(plist_id);
- H5Tclose(mem_type_id);
- } H5E_END_TRY;
- return -1;
+ /* attach the FIELD_ fill value attribute */
+ if (fill_data )
+ {
-}
+ tmp_buf = (unsigned char *) fill_data;
-/*-------------------------------------------------------------------------
- *
- * Write functions
- *
- *-------------------------------------------------------------------------
- */
+ /* open the dataset. */
+ if ((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ return -1;
-/*-------------------------------------------------------------------------
- * Function: H5TBappend_records
- *
- * Purpose: Appends records to a table
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmers:
- * Pedro Vicente, pvn@ncsa.uiuc.edu
- * Quincey Koziol
- *
- * Date: November 19, 2001
- *
- * Comments: Uses memory offsets
- *
- * Modifications: April 1, 2004
- * the DST_SIZES parameter is used to define the memory type ID
- * returned by H5TB_create_type
- *
- *-------------------------------------------------------------------------
- */
+ if (( sid = H5Screate(H5S_SCALAR)) < 0)
+ goto out;
-herr_t H5TBappend_records( hid_t loc_id,
- const char *dset_name,
- hsize_t nrecords,
- size_t type_size,
- const size_t *field_offset,
- const size_t *field_sizes,
- const void *data )
-{
- hid_t did;
- hid_t tid=-1;
- hid_t mem_type_id=-1;
- hid_t sid=-1;
- hid_t mem_space_id=-1;
- hsize_t nrecords_orig;
- hsize_t nfields;
+ for ( i = 0; i < nfields; i++)
+ {
- /* Get the original number of records and fields */
- if(H5TBget_table_info ( loc_id, dset_name, &nfields, &nrecords_orig ) < 0)
- return -1;
+ /* get the member name */
+ member_name = H5Tget_member_name(mem_type_id, (unsigned)i);
- /* Open the dataset. */
- if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- goto out;
+ strcpy(attr_name, "FIELD_");
+ sprintf(aux, "%d", (int)i);
+ strcat(attr_name, aux);
+ sprintf(aux, "%s", "_FILL");
+ strcat(attr_name, aux);
- /* Get the datatypes */
- if((tid = H5Dget_type( did )) < 0)
- goto out;
+ if ((attr_id = H5Acreate2(did, attr_name, field_types[i], sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
- if ((mem_type_id=H5TB_create_type(loc_id,dset_name,type_size,field_offset,field_sizes,tid)) < 0)
- goto out;
+ if (H5Awrite(attr_id, field_types[i], tmp_buf+field_offset[i]) < 0)
+ goto out;
- /* Append the records */
- if ((H5TB_common_append_records(did, mem_type_id, (size_t)nrecords, nrecords_orig, data)) < 0)
- goto out;
+ if (H5Aclose(attr_id) < 0)
+ goto out;
- /* Release the datatype. */
- if(H5Tclose( tid ) < 0)
- return -1;
+ free(member_name);
+ }
- /* Release the datatype. */
- if(H5Tclose( mem_type_id ) < 0)
- goto out;
+ /* terminate access to the data space. */
+ if (H5Sclose(sid) < 0)
+ goto out;
- /* End access to the dataset */
- if(H5Dclose( did ) < 0)
- goto out;
+ /* end access to the dataset */
+ if (H5Dclose(did) < 0)
+ goto out;
+ }
+ /* release the datatype. */
+ if (H5Tclose( mem_type_id ) < 0)
+ return -1;
-return 0;
+ return 0;
-/* error zone, gracefully close */
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Dclose(did);
- H5Tclose(mem_type_id);
- H5Tclose(tid);
- H5Sclose(mem_space_id);
- H5Sclose(sid);
- } H5E_END_TRY;
- return -1;
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Sclose(sid);
+ H5Pclose(plist_id);
+ H5Tclose(mem_type_id);
+ } H5E_END_TRY;
+ return -1;
+
}
/*-------------------------------------------------------------------------
- * Function: H5TBwrite_records
- *
- * Purpose: Writes records
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 19, 2001
- *
- * Comments: Uses memory offsets
- *
- * Modifications: April 1, 2004
- * the DST_SIZES parameter is used to define the memory type ID
- * returned by H5TB_create_type
- *
- *-------------------------------------------------------------------------
- */
-
+*
+* Write functions
+*
+*-------------------------------------------------------------------------
+*/
+
+/*-------------------------------------------------------------------------
+* Function: H5TBappend_records
+*
+* Purpose: Appends records to a table
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmers:
+* Pedro Vicente, pvn@ncsa.uiuc.edu
+* Quincey Koziol
+*
+* Date: November 19, 2001
+*
+* Comments: Uses memory offsets
+*
+* Modifications: April 1, 2004
+* the FIELD_SIZES parameter is used to define the memory type ID
+* returned by H5TB_create_type
+*
+*-------------------------------------------------------------------------
+*/
-herr_t H5TBwrite_records( hid_t loc_id,
+herr_t H5TBappend_records( hid_t loc_id,
const char *dset_name,
- hsize_t start,
hsize_t nrecords,
size_t type_size,
const size_t *field_offset,
const size_t *field_sizes,
- const void *data )
-{
-
- hid_t did;
- hid_t tid;
- hsize_t count[1];
- hsize_t offset[1];
- hid_t sid=-1;
- hid_t mem_space_id=-1;
- hsize_t mem_size[1];
- hsize_t dims[1];
- hid_t mem_type_id=-1;
-
- /* Open the dataset. */
- if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- return -1;
-
- /* Get the datatype */
- if((tid = H5Dget_type( did )) < 0)
- goto out;
-
- if ((mem_type_id=H5TB_create_type(loc_id,dset_name,type_size,field_offset,field_sizes,tid)) < 0)
- goto out;
-
- /* Get the dataspace handle */
- if((sid = H5Dget_space( did )) < 0)
- goto out;
-
- /* Get records */
- if(H5Sget_simple_extent_dims( sid, dims, NULL) < 0)
- goto out;
-
- if(start + nrecords > dims[0] )
- goto out;
-
- /* Define a hyperslab in the dataset of the size of the records */
- offset[0] = start;
- count[0] = nrecords;
- if(H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
- goto out;
-
- /* Create a memory dataspace handle */
- mem_size[0] = count[0];
- if((mem_space_id = H5Screate_simple( 1, mem_size, NULL )) < 0)
- goto out;
-
- if(H5Dwrite( did, mem_type_id, mem_space_id, sid, H5P_DEFAULT, data ) < 0)
- goto out;
-
- /* Terminate access to the memory dataspace */
- if(H5Sclose( mem_space_id ) < 0)
- goto out;
-
- /* Terminate access to the dataspace */
- if(H5Sclose( sid ) < 0)
- goto out;
-
- /* Release the datatype. */
- if(H5Tclose( tid ) < 0)
- goto out;
-
- /* Release the datatype. */
- if(H5Tclose( mem_type_id ) < 0)
- return -1;
-
- /* End access to the dataset */
- if(H5Dclose( did ) < 0)
- return -1;
-
-
-return 0;
-
-/* error zone, gracefully close */
-out:
- H5E_BEGIN_TRY {
- H5Dclose(did);
- H5Tclose(mem_type_id);
- H5Tclose(tid);
- H5Sclose(mem_space_id);
- H5Sclose(sid);
- } H5E_END_TRY;
- return -1;
-}
-
-/*-------------------------------------------------------------------------
- * Function: H5TBwrite_fields_name
- *
- * Purpose: Writes fields
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 21, 2001
- *
- * Comments:
- *
- * Modifications: April 1, 2004
- * the DST_SIZES parameter is used to define the memory type ID
- * returned by H5TB_create_type
- *
- *-------------------------------------------------------------------------
- */
-herr_t H5TBwrite_fields_name( hid_t loc_id,
- const char *dset_name,
- const char *field_names,
- hsize_t start,
- hsize_t nrecords,
- size_t type_size,
- const size_t *field_offset,
- const size_t *field_sizes,
- const void *data )
-{
-
- hid_t did;
- hid_t tid=-1;
- hid_t write_type_id=-1;
- hid_t member_type_id;
- hid_t nmtype_id;
- hsize_t count[1];
- hsize_t offset[1];
- hid_t mem_space_id=-1;
- hid_t file_space_id=-1;
- char *member_name;
- hssize_t nfields;
- hssize_t i, j;
- hid_t PRESERVE;
- size_t size_native;
-
- /* Create xfer properties to preserve initialized data */
- if ((PRESERVE = H5Pcreate (H5P_DATASET_XFER)) < 0)
- return -1;
- if (H5Pset_preserve (PRESERVE, 1) < 0)
- return -1;
-
- /* Open the dataset. */
- if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- goto out;
-
- /* Get the datatype */
- if((tid = H5Dget_type( did )) < 0)
- goto out;
-
- /* Get the number of fields */
- if(( nfields = H5Tget_nmembers( tid )) < 0)
- goto out;
-
- /* Create a write id */
- if(( write_type_id = H5Tcreate( H5T_COMPOUND, type_size )) < 0)
- goto out;
-
- j = 0;
-
- /* Iterate tru the members */
- for ( i = 0; i < nfields; i++)
- {
- /* Get the member name */
- member_name = H5Tget_member_name( tid, (unsigned)i );
-
- if(H5TB_find_field( member_name, field_names ) > 0 )
- {
-
- /* Get the member type */
- if(( member_type_id = H5Tget_member_type( tid,(unsigned) i )) < 0)
- goto out;
-
- /* Convert to native type */
- if ((nmtype_id=H5Tget_native_type(member_type_id,H5T_DIR_DEFAULT)) < 0)
- goto out;
-
- size_native=H5Tget_size(nmtype_id);
-
- /* Adjust, if necessary */
- if (field_sizes[j]!=size_native)
- {
- if (H5Tset_size(nmtype_id, field_sizes[j]) < 0)
- goto out;
- }
-
- /* The field in the file is found by its name */
- if(field_offset )
- {
- if(H5Tinsert( write_type_id, member_name, field_offset[j], nmtype_id ) < 0)
- goto out;
- }
- /* Only one field */
- else
- {
- if(H5Tinsert( write_type_id, member_name, (size_t)0, nmtype_id ) < 0)
- goto out;
- }
-
- j++;
-
- /* Close */
- if(H5Tclose( member_type_id ) < 0)
- goto out;
- if(H5Tclose( nmtype_id ) < 0)
- goto out;
- }
-
- free( member_name );
-
- }
-
- /* Get the dataspace handle */
- if((file_space_id = H5Dget_space( did )) < 0)
- goto out;
- if((mem_space_id = H5Screate_simple(1, &nrecords, NULL)) < 0)
- goto out;
-
- /* Define a hyperslab in the dataset */
- offset[0] = start;
- count[0] = nrecords;
- if(H5Sselect_hyperslab( file_space_id, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
- goto out;
-
- /* Write */
- if(H5Dwrite( did, write_type_id, mem_space_id, file_space_id, PRESERVE, data ) < 0)
- goto out;
-
- /* close */
- if(H5Tclose( write_type_id ) )
- goto out;
- if(H5Tclose( tid ) < 0)
- return -1;
- if(H5Dclose( did ) < 0)
- return -1;
- if(H5Pclose( PRESERVE ) < 0)
- return -1;
- if(H5Sclose( file_space_id ) < 0)
- return -1;
- if(H5Sclose( mem_space_id ) < 0)
- return -1;
-
-return 0;
-
- /* error zone, gracefully close */
-out:
- H5E_BEGIN_TRY {
- H5Pclose(PRESERVE);
- H5Dclose(did);
- H5Sclose(file_space_id);
- H5Sclose(mem_space_id);
- H5Tclose(write_type_id);
- H5Tclose(tid);
- } H5E_END_TRY;
- return -1;
-
-}
-
-
-
-/*-------------------------------------------------------------------------
- * Function: H5TBwrite_fields_index
- *
- * Purpose: Writes fields
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 21, 2001
- *
- * Comments: Uses memory offsets
- *
- * Modifications: April 1, 2004
- * the DST_SIZES parameter is used to define the memory type ID
- * returned by H5TB_create_type
- *
- *-------------------------------------------------------------------------
- */
-
-
-herr_t H5TBwrite_fields_index( hid_t loc_id,
- const char *dset_name,
- hsize_t nfields,
- const int *field_index,
- hsize_t start,
- hsize_t nrecords,
- size_t type_size,
- const size_t *field_offset,
- const size_t *field_sizes,
- const void *data )
+ const void *buf )
{
-
- hid_t did;
- hid_t tid=-1;
- hid_t write_type_id=-1;
- hid_t member_type_id;
- hid_t nmtype_id;
- hsize_t count[1];
- hsize_t offset[1];
- hid_t mem_space_id=-1;
- hid_t file_space_id=-1;
- char *member_name;
- hsize_t i, j;
- hid_t PRESERVE;
- size_t size_native;
-
- /* Create xfer properties to preserve initialized data */
- if ((PRESERVE = H5Pcreate (H5P_DATASET_XFER)) < 0)
- return -1;
- if (H5Pset_preserve (PRESERVE, 1) < 0)
- return -1;
-
- /* Open the dataset. */
- if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- goto out;
-
- /* Get the datatype */
- if((tid = H5Dget_type( did )) < 0)
- goto out;
-
- /* Create a write id */
- if(( write_type_id = H5Tcreate( H5T_COMPOUND, type_size )) < 0)
- goto out;
-
- /* Iterate tru the members */
- for ( i = 0; i < nfields; i++)
- {
-
- j = field_index[i];
-
- /* Get the member name */
- member_name = H5Tget_member_name( tid, (unsigned) j );
-
- /* Get the member type */
- if(( member_type_id = H5Tget_member_type( tid, (unsigned) j )) < 0)
- goto out;
-
- /* Convert to native type */
- if ((nmtype_id=H5Tget_native_type(member_type_id,H5T_DIR_DEFAULT)) < 0)
- goto out;
-
- size_native=H5Tget_size(nmtype_id);
-
- if (field_sizes[i]!=size_native)
- {
- if (H5Tset_size(nmtype_id, field_sizes[i]) < 0)
- goto out;
- }
-
- /* The field in the file is found by its name */
- if(field_offset )
- {
- if(H5Tinsert( write_type_id, member_name, field_offset[ i ], nmtype_id ) < 0)
- goto out;
- }
- /* Only one field */
- else
- {
- if(H5Tinsert( write_type_id, member_name, (size_t)0, nmtype_id ) < 0)
- goto out;
- }
- /* Close */
- if(H5Tclose( member_type_id ) < 0)
- goto out;
- if(H5Tclose( nmtype_id ) < 0)
- goto out;
-
- free( member_name );
-
- }
-
- /* Get the dataspace handles */
- if((file_space_id = H5Dget_space( did )) < 0)
- goto out;
- if((mem_space_id = H5Screate_simple(1, &nrecords, NULL)) < 0)
- goto out;
-
- /* Define a hyperslab in the dataset */
- offset[0] = start;
- count[0] = nrecords;
- if(H5Sselect_hyperslab( file_space_id, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
- goto out;
-
- /* Write */
- if(H5Dwrite( did, write_type_id, mem_space_id, file_space_id, PRESERVE, data ) < 0)
- goto out;
-
- /* close */
- if(H5Tclose( write_type_id ) )
- goto out;
- if(H5Tclose( tid ) < 0)
- return -1;
- if(H5Dclose( did ) < 0)
- return -1;
- if(H5Pclose( PRESERVE ) < 0)
- return -1;
- if(H5Sclose( file_space_id ) < 0)
- return -1;
- if(H5Sclose( mem_space_id ) < 0)
- return -1;
-
-return 0;
-
- /* error zone, gracefully close */
+ hid_t did;
+ hid_t tid=-1;
+ hid_t mem_type_id=-1;
+ hid_t sid=-1;
+ hid_t m_sid=-1;
+ hsize_t nrecords_orig;
+ hsize_t nfields;
+
+ /* get the original number of records and fields */
+ if (H5TBget_table_info ( loc_id, dset_name, &nfields, &nrecords_orig ) < 0)
+ return -1;
+
+ /* open the dataset. */
+ if ((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the datatypes */
+ if ((tid = H5Dget_type( did )) < 0)
+ goto out;
+
+ if ((mem_type_id=H5TB_create_type(loc_id,dset_name,type_size,field_offset,field_sizes,tid)) < 0)
+ goto out;
+
+ /* append the records */
+ if ((H5TB_common_append_records(did, mem_type_id, (size_t)nrecords, nrecords_orig, buf)) < 0)
+ goto out;
+
+ /* close */
+ if (H5Tclose( tid ) < 0)
+ return -1;
+ if (H5Tclose( mem_type_id ) < 0)
+ goto out;
+ if (H5Dclose( did ) < 0)
+ goto out;
+
+ return 0;
+
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Pclose(PRESERVE);
- H5Dclose(did);
- H5Sclose(file_space_id);
- H5Sclose(mem_space_id);
- H5Tclose(write_type_id);
- H5Tclose(tid);
- } H5E_END_TRY;
- return -1;
-}
-
-
-/*-------------------------------------------------------------------------
- *
- * Read functions
- *
- *-------------------------------------------------------------------------
- */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5TBread_table
- *
- * Purpose: Reads a table
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 20, 2001
- *
- * Comments:
- *
- * Modifications: April 1, 2004
- * used a memory type ID returned by H5TB_create_type
- *
- *-------------------------------------------------------------------------
- */
-
-herr_t H5TBread_table( hid_t loc_id,
- const char *dset_name,
- size_t type_size,
- const size_t *field_offset,
- const size_t *field_sizes,
- void *dst_buf )
-{
- hid_t did;
- hid_t ftype_id=-1;
- hid_t mem_type_id=-1;
- hid_t sid;
- hsize_t dims[1];
-
- /* open the dataset. */
- if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- return -1;
-
- /* get the dataspace handle */
- if((sid = H5Dget_space( did )) < 0)
- goto out;
-
- /* get dimensions */
- if(H5Sget_simple_extent_dims( sid, dims, NULL) < 0)
- goto out;
-
- /* get the datatypes */
- if ((ftype_id=H5Dget_type (did)) < 0)
- goto out;
-
- if ((mem_type_id=H5TB_create_type(loc_id,dset_name,type_size,field_offset,field_sizes,ftype_id)) < 0)
- goto out;
-
- /* read */
- if(H5Dread( did, mem_type_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, dst_buf) < 0)
- goto out;
-
- /* close */
- if(H5Tclose( ftype_id ) < 0)
- goto out;
- if(H5Tclose( mem_type_id ) < 0)
- goto out;
- if(H5Sclose( sid ) < 0)
- goto out;
- if(H5Dclose( did ) < 0)
- return -1;
-
- return 0;
-
- /* error zone, gracefully close */
-out:
- H5E_BEGIN_TRY {
- H5Dclose(did);
- H5Tclose(mem_type_id);
- H5Tclose(ftype_id);
- H5Sclose(sid);
- } H5E_END_TRY;
- return -1;
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did);
+ H5Tclose(mem_type_id);
+ H5Tclose(tid);
+ H5Sclose(m_sid);
+ H5Sclose(sid);
+ } H5E_END_TRY;
+ return -1;
}
/*-------------------------------------------------------------------------
- * Function: H5TBread_records
- *
- * Purpose: Reads records
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 19, 2001
- *
- * Comments:
- *
- * Modifications: April 1, 2004
- * the DST_SIZES parameter is used to define the memory type ID
- * returned by H5TB_create_type
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5TBwrite_records
+*
+* Purpose: Writes records
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 19, 2001
+*
+* Comments: Uses memory offsets
+*
+* Modifications: April 1, 2004
+* the FIELD_SIZES parameter is used to define the memory type ID
+* returned by H5TB_create_type
+*
+*-------------------------------------------------------------------------
+*/
-herr_t H5TBread_records( hid_t loc_id,
+herr_t H5TBwrite_records( hid_t loc_id,
const char *dset_name,
hsize_t start,
hsize_t nrecords,
size_t type_size,
const size_t *field_offset,
const size_t *field_sizes,
- void *data )
+ const void *buf )
{
- hid_t did;
- hid_t ftype_id;
- hid_t mem_type_id=-1;
- hsize_t count[1];
- hsize_t offset[1];
- hid_t sid=-1;
- hsize_t dims[1];
- hid_t mem_space_id=-1;
- hsize_t mem_size[1];
- hsize_t nrecords_orig;
- hsize_t nfields;
-
- /* get the number of records and fields */
- if(H5TBget_table_info ( loc_id, dset_name, &nfields, &nrecords_orig ) < 0)
- return -1;
-
- /* open the dataset */
- if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- return -1;
-
- /* get the datatypes */
- if((ftype_id = H5Dget_type( did )) < 0)
- goto out;
-
- if ((mem_type_id=H5TB_create_type(loc_id,dset_name,type_size,field_offset,field_sizes,ftype_id)) < 0)
- goto out;
-
- /* Read the records */
- if ((H5TB_common_read_records(did, mem_type_id, start, (size_t)nrecords, nrecords_orig, data)) < 0)
- goto out;
-
- /* get the dataspace handle */
- if((sid = H5Dget_space( did )) < 0)
- goto out;
-
- /* get records */
- if(H5Sget_simple_extent_dims( sid, dims, NULL) < 0)
- goto out;
-
- if(start + nrecords > dims[0] )
- goto out;
-
- /* define a hyperslab in the dataset of the size of the records */
- offset[0] = start;
- count[0] = nrecords;
- if(H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
- goto out;
-
- /* create a memory dataspace handle */
- mem_size[0] = count[0];
- if((mem_space_id = H5Screate_simple( 1, mem_size, NULL )) < 0)
- goto out;
-
- /* read */
- if(H5Dread( did, mem_type_id, mem_space_id, sid, H5P_DEFAULT, data ) < 0)
- goto out;
-
- /* close */
- if(H5Sclose( mem_space_id ) < 0)
- goto out;
- if(H5Sclose( sid ) < 0)
- goto out;
- if(H5Tclose( ftype_id ) < 0)
- return -1;
- if(H5Tclose( mem_type_id ) < 0)
- return -1;
- if(H5Dclose( did ) < 0)
- return -1;
-
- return 0;
-
- /* error zone, gracefully close */
+ hid_t did;
+ hid_t tid;
+ hsize_t count[1];
+ hsize_t offset[1];
+ hid_t sid=-1;
+ hid_t m_sid=-1;
+ hsize_t mem_size[1];
+ hsize_t dims[1];
+ hid_t mem_type_id=-1;
+
+ /* open the dataset. */
+ if ((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ return -1;
+
+ /* get the datatype */
+ if ((tid = H5Dget_type( did )) < 0)
+ goto out;
+
+ if ((mem_type_id=H5TB_create_type(loc_id,dset_name,type_size,field_offset,field_sizes,tid)) < 0)
+ goto out;
+
+ /* get the dataspace handle */
+ if ((sid = H5Dget_space( did )) < 0)
+ goto out;
+
+ /* get records */
+ if (H5Sget_simple_extent_dims( sid, dims, NULL) < 0)
+ goto out;
+
+ if (start + nrecords > dims[0] )
+ goto out;
+
+ /* define a hyperslab in the dataset of the size of the records */
+ offset[0] = start;
+ count[0] = nrecords;
+ if (H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
+ goto out;
+
+ /* create a memory dataspace handle */
+ mem_size[0] = count[0];
+ if ((m_sid = H5Screate_simple( 1, mem_size, NULL )) < 0)
+ goto out;
+
+ if (H5Dwrite( did, mem_type_id, m_sid, sid, H5P_DEFAULT, buf ) < 0)
+ goto out;
+
+ /* close */
+ if (H5Sclose( m_sid ) < 0)
+ goto out;
+ if (H5Sclose( sid ) < 0)
+ goto out;
+ if (H5Tclose( tid ) < 0)
+ goto out;
+ if (H5Tclose( mem_type_id ) < 0)
+ return -1;
+ if (H5Dclose( did ) < 0)
+ return -1;
+
+ return 0;
+
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Dclose(did);
- H5Tclose(mem_type_id);
- H5Tclose(ftype_id);
- H5Sclose(mem_space_id);
- H5Sclose(sid);
- } H5E_END_TRY;
- return -1;
-
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did);
+ H5Tclose(mem_type_id);
+ H5Tclose(tid);
+ H5Sclose(m_sid);
+ H5Sclose(sid);
+ } H5E_END_TRY;
+ return -1;
}
-
/*-------------------------------------------------------------------------
- * Function: H5TBread_fields_name
- *
- * Purpose: Reads fields
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 19, 2001
- *
- * Comments:
- *
- * Modifications: April 1, 2004
- * the DST_SIZES parameter is used to define the memory type ID
- * returned by H5TB_create_type
- *
- *-------------------------------------------------------------------------
- */
-
-
-herr_t H5TBread_fields_name( hid_t loc_id,
+* Function: H5TBwrite_fields_name
+*
+* Purpose: Writes fields
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 21, 2001
+*
+* Comments:
+*
+* Modifications: April 1, 2004
+* the FIELD_SIZES parameter is used to define a memory type ID
+*
+*-------------------------------------------------------------------------
+*/
+herr_t H5TBwrite_fields_name( hid_t loc_id,
const char *dset_name,
const char *field_names,
hsize_t start,
@@ -1018,154 +480,169 @@ herr_t H5TBread_fields_name( hid_t loc_id,
size_t type_size,
const size_t *field_offset,
const size_t *field_sizes,
- void *data )
+ const void *buf )
{
+ hid_t did;
+ hid_t tid=-1;
+ hid_t write_type_id=-1;
+ hid_t member_type_id;
+ hid_t nmtype_id;
+ hsize_t count[1];
+ hsize_t offset[1];
+ hid_t m_sid=-1;
+ hid_t file_space_id=-1;
+ char *member_name;
+ hssize_t nfields;
+ hssize_t i, j;
+ hid_t preserve_id;
+ size_t size_native;
+
+ /* create xfer properties to preserve initialized data */
+ if ((preserve_id = H5Pcreate (H5P_DATASET_XFER)) < 0)
+ return -1;
+ if (H5Pset_preserve (preserve_id, 1) < 0)
+ return -1;
+
+ /* open the dataset. */
+ if ((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the datatype */
+ if ((tid = H5Dget_type( did )) < 0)
+ goto out;
+
+ /* get the number of fields */
+ if (( nfields = H5Tget_nmembers( tid )) < 0)
+ goto out;
+
+ /* create a write id */
+ if (( write_type_id = H5Tcreate( H5T_COMPOUND, type_size )) < 0)
+ goto out;
+
+ j = 0;
+
+ /* iterate tru the members */
+ for ( i = 0; i < nfields; i++)
+ {
+ /* get the member name */
+ member_name = H5Tget_member_name( tid, (unsigned)i );
+
+ if(H5TB_find_field( member_name, field_names ) > 0 )
+ {
+
+ /* get the member type */
+ if(( member_type_id = H5Tget_member_type( tid,(unsigned) i )) < 0)
+ goto out;
+
+ /* convert to native type */
+ if ((nmtype_id=H5Tget_native_type(member_type_id,H5T_DIR_DEFAULT)) < 0)
+ goto out;
+
+ size_native=H5Tget_size(nmtype_id);
+
+ /* adjust, if necessary */
+ if (field_sizes[j]!=size_native)
+ {
+ if (H5Tset_size(nmtype_id, field_sizes[j]) < 0)
+ goto out;
+ }
+
+ /* the field in the file is found by its name */
+ if (field_offset )
+ {
+ if (H5Tinsert( write_type_id, member_name, field_offset[j], nmtype_id ) < 0)
+ goto out;
+ }
+ /* only one field */
+ else
+ {
+ if (H5Tinsert( write_type_id, member_name, (size_t)0, nmtype_id ) < 0)
+ goto out;
+ }
+
+ j++;
+
+ /* close */
+ if(H5Tclose( member_type_id ) < 0)
+ goto out;
+ if(H5Tclose( nmtype_id ) < 0)
+ goto out;
+ }
+
+ free( member_name );
- hid_t did;
- hid_t ftype_id=-1;
- hid_t mem_type_id=-1;
- hid_t mtype_id;
- hid_t nmtype_id;
- char *member_name;
- hssize_t nfields;
- hsize_t count[1];
- hsize_t offset[1];
- hid_t sid=-1;
- hid_t mem_space_id=-1;
- hsize_t mem_size[1];
- size_t size_native;
- hssize_t i, j;
-
- /* open the dataset */
- if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- goto out;
-
- /* get the datatype */
- if((ftype_id = H5Dget_type( did )) < 0)
- goto out;
-
- /* get the number of fields */
- if(( nfields = H5Tget_nmembers( ftype_id )) < 0)
- goto out;
-
- /* create a memory read id */
- if(( mem_type_id = H5Tcreate( H5T_COMPOUND, type_size )) < 0)
- goto out;
-
- /* iterate tru the members */
- for ( i=0,j=0; i<nfields; i++)
- {
- /* get the member name */
- member_name = H5Tget_member_name( ftype_id, (unsigned)i );
-
- if(H5TB_find_field( member_name, field_names ) > 0 )
- {
- /* get the member type */
- if(( mtype_id = H5Tget_member_type( ftype_id, (unsigned) i )) < 0)
- goto out;
-
- /* convert to native type */
- if ((nmtype_id=H5Tget_native_type(mtype_id,H5T_DIR_DEFAULT)) < 0)
- goto out;
-
- size_native=H5Tget_size(nmtype_id);
-
- if (field_sizes[j]!=size_native)
- {
- if (H5Tset_size(nmtype_id, field_sizes[j]) < 0)
- goto out;
- }
- /* the field in the file is found by its name */
- if(field_offset )
- {
- if(H5Tinsert( mem_type_id, member_name, field_offset[j], nmtype_id ) < 0)
- goto out;
- }
- else
- {
- if(H5Tinsert( mem_type_id, member_name, (size_t)0, nmtype_id ) < 0)
- goto out;
- }
-
- /* close */
- if(H5Tclose( mtype_id ) < 0)
- goto out;
- if(H5Tclose( nmtype_id ) < 0)
- goto out;
- j++;
- }
- free( member_name );
- }
-
- /* get the dataspace handle */
- if((sid = H5Dget_space( did )) < 0)
- goto out;
-
- /* define a hyperslab in the dataset */
- offset[0] = start;
- count[0] = nrecords;
- if(H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
- goto out;
-
- /* create a memory dataspace handle */
- mem_size[0] = count[0];
- if((mem_space_id = H5Screate_simple( 1, mem_size, NULL )) < 0)
- goto out;
-
- /* read */
- if(H5Dread( did, mem_type_id, mem_space_id, sid, H5P_DEFAULT, data ) < 0)
- goto out;
-
- /* close */
- if(H5Tclose( mem_type_id ) )
- goto out;
- if(H5Tclose( ftype_id ) < 0)
- return -1;
- if(H5Sclose( sid ) < 0)
- goto out;
- if(H5Sclose( mem_space_id ) < 0)
- goto out;
- if(H5Dclose( did ) < 0)
- return -1;
-
- return 0;
-
-/* error zone, gracefully close */
+ }
+
+ /* get the dataspace handle */
+ if ((file_space_id = H5Dget_space( did )) < 0)
+ goto out;
+ if ((m_sid = H5Screate_simple(1, &nrecords, NULL)) < 0)
+ goto out;
+
+ /* define a hyperslab in the dataset */
+ offset[0] = start;
+ count[0] = nrecords;
+ if (H5Sselect_hyperslab( file_space_id, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
+ goto out;
+
+ /* write */
+ if (H5Dwrite( did, write_type_id, m_sid, file_space_id, preserve_id, buf ) < 0)
+ goto out;
+
+ /* close */
+ if(H5Tclose( write_type_id ) )
+ goto out;
+ if(H5Tclose( tid ) < 0)
+ return -1;
+ if(H5Dclose( did ) < 0)
+ return -1;
+ if(H5Pclose( preserve_id ) < 0)
+ return -1;
+ if(H5Sclose( file_space_id ) < 0)
+ return -1;
+ if(H5Sclose( m_sid ) < 0)
+ return -1;
+
+ return 0;
+
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Dclose(did);
- H5Tclose(mem_type_id);
- H5Tclose(ftype_id);
- H5Sclose(mem_space_id);
- H5Sclose(sid);
- } H5E_END_TRY;
- return -1;
+ H5E_BEGIN_TRY
+ {
+ H5Pclose(preserve_id);
+ H5Dclose(did);
+ H5Sclose(file_space_id);
+ H5Sclose(m_sid);
+ H5Tclose(write_type_id);
+ H5Tclose(tid);
+ } H5E_END_TRY;
+ return -1;
}
+
/*-------------------------------------------------------------------------
- * Function: H5TBread_fields_index
- *
- * Purpose: Reads fields
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 19, 2001
- *
- * Comments:
- *
- * Modifications: April 1, 2004
- * the DST_SIZES parameter is used to define the memory type ID
- * returned by H5TB_create_type
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5TBwrite_fields_index
+*
+* Purpose: Writes fields
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 21, 2001
+*
+* Comments: Uses memory offsets
+*
+* Modifications: April 1, 2004
+* the FIELD_SIZES parameter is used to define a memory type ID
+*
+*-------------------------------------------------------------------------
+*/
-herr_t H5TBread_fields_index( hid_t loc_id,
+herr_t H5TBwrite_fields_index( hid_t loc_id,
const char *dset_name,
hsize_t nfields,
const int *field_index,
@@ -1174,2376 +651,2801 @@ herr_t H5TBread_fields_index( hid_t loc_id,
size_t type_size,
const size_t *field_offset,
const size_t *field_sizes,
- void *data )
-{
-
- hid_t did;
- hid_t tid=-1;
- hid_t read_type_id=-1;
- hid_t member_type_id;
- hid_t nmtype_id;
- char *member_name;
- hsize_t count[1];
- hsize_t offset[1];
- hid_t sid=-1;
- hid_t mem_space_id=-1;
- hsize_t mem_size[1];
- size_t size_native;
- hsize_t i, j;
-
- /* Open the dataset. */
- if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- goto out;
-
- /* Get the datatype */
- if((tid = H5Dget_type( did )) < 0)
- goto out;
-
- /* Create a read id */
- if(( read_type_id = H5Tcreate( H5T_COMPOUND, type_size )) < 0)
- goto out;
-
- /* Iterate tru the members */
- for ( i = 0; i < nfields; i++)
- {
- j = field_index[i];
-
- /* Get the member name */
- member_name = H5Tget_member_name( tid, (unsigned) j );
-
- /* Get the member type */
- if(( member_type_id = H5Tget_member_type( tid, (unsigned) j )) < 0)
- goto out;
-
- /* Get the member size */
- if(H5Tget_size( member_type_id ) == 0 )
- goto out;
-
- /* Convert to native type */
- if ((nmtype_id=H5Tget_native_type(member_type_id,H5T_DIR_DEFAULT)) < 0)
- goto out;
-
- size_native=H5Tget_size(nmtype_id);
-
- if (field_sizes[i]!=size_native)
- {
- if (H5Tset_size(nmtype_id, field_sizes[i]) < 0)
- goto out;
- }
-
- /* The field in the file is found by its name */
- if(field_offset )
- {
- if(H5Tinsert( read_type_id, member_name, field_offset[i], nmtype_id ) < 0)
- goto out;
- }
- else
- {
- if(H5Tinsert( read_type_id, member_name, (size_t)0, nmtype_id ) < 0)
- goto out;
- }
-
- /* Close the member type */
- if(H5Tclose( member_type_id ) < 0)
- goto out;
- if(H5Tclose( nmtype_id ) < 0)
- goto out;
-
- free( member_name );
- }
-
- /* Get the dataspace handle */
- if((sid = H5Dget_space( did )) < 0)
- goto out;
-
- /* Define a hyperslab in the dataset */
- offset[0] = start;
- count[0] = nrecords;
- if(H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
- goto out;
-
- /* Create a memory dataspace handle */
- mem_size[0] = count[0];
- if((mem_space_id = H5Screate_simple( 1, mem_size, NULL )) < 0)
- goto out;
-
- /* Read */
- if(H5Dread( did, read_type_id, mem_space_id, sid, H5P_DEFAULT, data ) < 0)
- goto out;
-
- /* Terminate access to the dataspace */
- if(H5Sclose( sid ) < 0)
- goto out;
-
- /* Terminate access to the memory dataspace */
- if(H5Sclose( mem_space_id ) < 0)
- goto out;
-
- /* End access to the read id */
- if(H5Tclose( read_type_id ) )
- goto out;
-
- /* Release the datatype. */
- if(H5Tclose( tid ) < 0)
- return -1;
-
- /* End access to the dataset */
- if(H5Dclose( did ) < 0)
- return -1;
-
-return 0;
-
-/* error zone, gracefully close */
-out:
- H5E_BEGIN_TRY {
- H5Dclose(did);
- H5Tclose(read_type_id);
- H5Tclose(tid);
- H5Sclose(mem_space_id);
- H5Sclose(sid);
- } H5E_END_TRY;
- return -1;
-
-}
-
-
-/*-------------------------------------------------------------------------
- *
- * Manipulation functions
- *
- *-------------------------------------------------------------------------
- */
-
-/*-------------------------------------------------------------------------
- * Function: H5TBdelete_record
- *
- * Purpose: Delete records from middle of table ("pulling up" all the records after it)
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 26, 2001
- *
- * Modifications: April 29, 2003
- *
- *
- *-------------------------------------------------------------------------
- */
-
-herr_t H5TBdelete_record( hid_t loc_id,
- const char *dset_name,
- hsize_t start,
- hsize_t nrecords )
+ const void *buf )
{
+ hid_t did;
+ hid_t tid=-1;
+ hid_t write_type_id=-1;
+ hid_t member_type_id;
+ hid_t nmtype_id;
+ hsize_t count[1];
+ hsize_t offset[1];
+ hid_t m_sid=-1;
+ hid_t file_space_id=-1;
+ char *member_name;
+ hsize_t i, j;
+ hid_t preserve_id;
+ size_t size_native;
+
+ /* create xfer properties to preserve initialized data */
+ if ((preserve_id = H5Pcreate (H5P_DATASET_XFER)) < 0)
+ return -1;
+ if (H5Pset_preserve (preserve_id, 1) < 0)
+ return -1;
+
+ /* open the dataset. */
+ if ((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the datatype */
+ if ((tid = H5Dget_type( did )) < 0)
+ goto out;
+
+ /* create a write id */
+ if (( write_type_id = H5Tcreate( H5T_COMPOUND, type_size )) < 0)
+ goto out;
+
+ /* iterate tru the members */
+ for ( i = 0; i < nfields; i++)
+ {
- hsize_t nfields;
- hsize_t ntotal_records;
- hsize_t read_start;
- hsize_t read_nrecords;
- hid_t did;
- hid_t tid;
- hsize_t count[1];
- hsize_t offset[1];
- hid_t sid;
- hid_t mem_space_id;
- hsize_t mem_size[1];
- unsigned char *tmp_buf;
- size_t src_size;
- size_t *src_offset;
- size_t *src_sizes;
- hsize_t nrows;
- hsize_t dims[1];
-
-
-/*-------------------------------------------------------------------------
- * First we get information about type size and offsets on disk
- *-------------------------------------------------------------------------
- */
-
- /* Get the number of records and fields */
- if(H5TBget_table_info ( loc_id, dset_name, &nfields, &ntotal_records ) < 0)
- return -1;
-
- src_offset = (size_t *)malloc((size_t)nfields * sizeof(size_t));
- src_sizes = (size_t *)malloc((size_t)nfields * sizeof(size_t));
-
- if(src_offset == NULL )
- return -1;
-
- /* Get field info */
- if(H5TBget_field_info( loc_id, dset_name, NULL, src_sizes, src_offset, &src_size ) < 0)
- return -1;
-
-/*-------------------------------------------------------------------------
- * Read the records after the deleted one(s)
- *-------------------------------------------------------------------------
- */
-
- read_start = start + nrecords;
- read_nrecords = ntotal_records - read_start;
- tmp_buf = (unsigned char *)calloc((size_t) read_nrecords, src_size );
-
- if(tmp_buf == NULL )
- return -1;
-
- /* Read the records after the deleted one(s) */
- if(H5TBread_records( loc_id, dset_name, read_start, read_nrecords, src_size,
- src_offset, src_sizes, tmp_buf ) < 0)
- return -1;
-
-
-/*-------------------------------------------------------------------------
- * Write the records in another position
- *-------------------------------------------------------------------------
- */
-
- /* Open the dataset. */
- if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- return -1;
-
- /* Get the datatype */
- if((tid = H5Dget_type( did )) < 0)
- goto out;
-
- /* Get the dataspace handle */
- if((sid = H5Dget_space( did )) < 0)
- goto out;
-
- /* Define a hyperslab in the dataset of the size of the records */
- offset[0] = start;
- count[0] = read_nrecords;
- if(H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
- goto out;
-
- /* Create a memory dataspace handle */
- mem_size[0] = count[0];
- if((mem_space_id = H5Screate_simple( 1, mem_size, NULL )) < 0)
- goto out;
-
- if(H5Dwrite( did, tid, mem_space_id, sid, H5P_DEFAULT, tmp_buf ) < 0)
- goto out;
-
- /* Terminate access to the memory dataspace */
- if(H5Sclose( mem_space_id ) < 0)
- goto out;
-
- /* Terminate access to the dataspace */
- if(H5Sclose( sid ) < 0)
- goto out;
-
- /* Release the datatype. */
- if(H5Tclose( tid ) < 0)
- goto out;
-
-
-/*-------------------------------------------------------------------------
- * Change the table dimension
- *-------------------------------------------------------------------------
- */
- dims[0] = ntotal_records - nrecords;
- if(H5Dset_extent( did, dims ) < 0)
- goto out;
-
- /* End access to the dataset */
- if(H5Dclose( did ) < 0)
- return -1;
-
- free( tmp_buf );
- free( src_offset );
- free( src_sizes );
-
-
-/*-------------------------------------------------------------------------
- * Store the new dimension as an attribute
- *-------------------------------------------------------------------------
- */
-
- nrows = ntotal_records - nrecords;
- /* Set the attribute */
- if (H5LT_set_attribute_numerical(loc_id,dset_name,"NROWS",(size_t)1,
- H5T_NATIVE_LLONG,&nrows) < 0)
- return -1;
-
+ j = field_index[i];
+
+ /* get the member name */
+ member_name = H5Tget_member_name( tid, (unsigned) j );
+
+ /* get the member type */
+ if (( member_type_id = H5Tget_member_type( tid, (unsigned) j )) < 0)
+ goto out;
+
+ /* convert to native type */
+ if ((nmtype_id = H5Tget_native_type(member_type_id,H5T_DIR_DEFAULT)) < 0)
+ goto out;
+
+ size_native = H5Tget_size(nmtype_id);
+
+ if (field_sizes[i]!=size_native)
+ {
+ if (H5Tset_size(nmtype_id, field_sizes[i]) < 0)
+ goto out;
+ }
+
+ /* the field in the file is found by its name */
+ if ( field_offset )
+ {
+ if (H5Tinsert( write_type_id, member_name, field_offset[ i ], nmtype_id ) < 0)
+ goto out;
+ }
+ /* only one field */
+ else
+ {
+ if (H5Tinsert( write_type_id, member_name, (size_t)0, nmtype_id ) < 0)
+ goto out;
+ }
+ /* close */
+ if(H5Tclose( member_type_id ) < 0)
+ goto out;
+ if(H5Tclose( nmtype_id ) < 0)
+ goto out;
+
+ free( member_name );
- return 0;
+ }
+ /* get the dataspace handles */
+ if ((file_space_id = H5Dget_space( did )) < 0)
+ goto out;
+ if ((m_sid = H5Screate_simple(1, &nrecords, NULL)) < 0)
+ goto out;
+
+ /* define a hyperslab in the dataset */
+ offset[0] = start;
+ count[0] = nrecords;
+ if (H5Sselect_hyperslab( file_space_id, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
+ goto out;
+
+ /* write */
+ if (H5Dwrite( did, write_type_id, m_sid, file_space_id, preserve_id, buf ) < 0)
+ goto out;
+
+ /* close */
+ if (H5Tclose( write_type_id ) )
+ goto out;
+ if (H5Tclose( tid ) < 0)
+ return -1;
+ if (H5Dclose( did ) < 0)
+ return -1;
+ if (H5Pclose( preserve_id ) < 0)
+ return -1;
+ if (H5Sclose( file_space_id ) < 0)
+ return -1;
+ if (H5Sclose( m_sid ) < 0)
+ return -1;
+
+ return 0;
+
+ /* error zone */
out:
- H5Dclose( did );
- return -1;
+ H5E_BEGIN_TRY
+ {
+ H5Pclose(preserve_id);
+ H5Dclose(did);
+ H5Sclose(file_space_id);
+ H5Sclose(m_sid);
+ H5Tclose(write_type_id);
+ H5Tclose(tid);
+ } H5E_END_TRY;
+ return -1;
}
-/*-------------------------------------------------------------------------
- * Function: H5TBinsert_record
- *
- * Purpose: Inserts records into middle of table ("pushing down" all the records after it)
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 26, 2001
- *
- * Comments: Uses memory offsets
- *
- * Modifications: April 1, 2004
- * the DST_SIZES parameter is used to define the memory type ID
- * returned by H5TB_create_type
- *
- *-------------------------------------------------------------------------
- */
-
-
-herr_t H5TBinsert_record( hid_t loc_id,
- const char *dset_name,
- hsize_t start,
- hsize_t nrecords,
- size_t type_size,
- const size_t *field_offset,
- const size_t *field_sizes,
- void *data )
-{
-
- hsize_t nfields;
- hsize_t ntotal_records;
- hsize_t read_nrecords;
- hid_t did;
- hid_t tid=-1;
- hid_t mem_type_id=-1;
- hsize_t count[1];
- hsize_t offset[1];
- hid_t sid=-1;
- hid_t mem_space_id=-1;
- hsize_t dims[1];
- hsize_t mem_dims[1];
- unsigned char *tmp_buf;
/*-------------------------------------------------------------------------
- * Read the records after the inserted one(s)
- *-------------------------------------------------------------------------
- */
-
- /* Get the dimensions */
- if(H5TBget_table_info ( loc_id, dset_name, &nfields, &ntotal_records ) < 0)
- return -1;
-
- /* Open the dataset. */
- if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- goto out;
-
- /* Get the datatype */
- if((tid = H5Dget_type( did )) < 0)
- goto out;
-
- /* Create the memory data type. */
- if ((mem_type_id=H5TB_create_type(loc_id,dset_name,type_size,field_offset,field_sizes,tid)) < 0)
- goto out;
-
- read_nrecords = ntotal_records - start;
- tmp_buf = (unsigned char *)calloc((size_t) read_nrecords, type_size);
+*
+* Read functions
+*
+*-------------------------------------------------------------------------
+*/
- /* Read the records after the inserted one(s) */
- if(H5TBread_records( loc_id, dset_name, start, read_nrecords, type_size, field_offset,
- field_sizes, tmp_buf ) < 0)
- return -1;
-
- /* Extend the dataset */
- dims[0] = ntotal_records + nrecords;
-
- if(H5Dset_extent(did, dims) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * Write the inserted records
- *-------------------------------------------------------------------------
- */
-
- /* Create a simple memory data space */
- mem_dims[0] = nrecords;
- if((mem_space_id = H5Screate_simple(1, mem_dims, NULL)) < 0)
- return -1;
-
- /* Get the file data space */
- if((sid = H5Dget_space( did )) < 0)
- return -1;
-
- /* Define a hyperslab in the dataset to write the new data */
- offset[0] = start;
- count[0] = nrecords;
- if(H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
- goto out;
-
- if(H5Dwrite( did, mem_type_id, mem_space_id, sid, H5P_DEFAULT, data ) < 0)
- goto out;
-
- /* Terminate access to the dataspace */
- if(H5Sclose( mem_space_id ) < 0)
- goto out;
- if(H5Sclose( sid ) < 0)
- goto out;
/*-------------------------------------------------------------------------
- * Write the "pushed down" records
- *-------------------------------------------------------------------------
- */
-
- /* Create a simple memory data space */
- mem_dims[0]=read_nrecords;
- if((mem_space_id = H5Screate_simple( 1, mem_dims, NULL )) < 0)
- return -1;
-
- /* Get the file data space */
- if((sid = H5Dget_space( did )) < 0)
- return -1;
-
- /* Define a hyperslab in the dataset to write the new data */
- offset[0] = start + nrecords;
- count[0] = read_nrecords;
- if(H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
- goto out;
-
- if(H5Dwrite( did, mem_type_id, mem_space_id, sid, H5P_DEFAULT, tmp_buf ) < 0)
- goto out;
+* Function: H5TBread_table
+*
+* Purpose: Reads a table
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 20, 2001
+*
+* Comments:
+*
+* Modifications: April 1, 2004
+* used a memory type ID returned by H5TB_create_type
+*
+*-------------------------------------------------------------------------
+*/
- /* Terminate access to the dataspace */
- if(H5Sclose( mem_space_id ) < 0)
- goto out;
-
- if(H5Sclose( sid ) < 0)
- goto out;
-
- /* Release the datatype. */
- if(H5Tclose( tid ) < 0)
- return -1;
-
- /* Release the datatype. */
- if(H5Tclose( mem_type_id ) < 0)
- return -1;
-
- /* End access to the dataset */
- if(H5Dclose( did ) < 0)
- return -1;
-
- free( tmp_buf );
-
- return 0;
-
- /* error zone, gracefully close */
+herr_t H5TBread_table( hid_t loc_id,
+ const char *dset_name,
+ size_t type_size,
+ const size_t *field_offset,
+ const size_t *field_sizes,
+ void *dst_buf )
+{
+ hid_t did;
+ hid_t ftype_id=-1;
+ hid_t mem_type_id=-1;
+ hid_t sid;
+ hsize_t dims[1];
+
+ /* open the dataset. */
+ if ((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ return -1;
+
+ /* get the dataspace handle */
+ if ((sid = H5Dget_space( did )) < 0)
+ goto out;
+
+ /* get dimensions */
+ if (H5Sget_simple_extent_dims( sid, dims, NULL) < 0)
+ goto out;
+
+ /* get the datatypes */
+ if ((ftype_id=H5Dget_type (did)) < 0)
+ goto out;
+
+ if ((mem_type_id=H5TB_create_type(loc_id,dset_name,type_size,field_offset,field_sizes,ftype_id)) < 0)
+ goto out;
+
+ /* read */
+ if (H5Dread( did, mem_type_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, dst_buf) < 0)
+ goto out;
+
+ /* close */
+ if (H5Tclose( ftype_id ) < 0)
+ goto out;
+ if (H5Tclose( mem_type_id ) < 0)
+ goto out;
+ if (H5Sclose( sid ) < 0)
+ goto out;
+ if (H5Dclose( did ) < 0)
+ return -1;
+
+ return 0;
+
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Dclose(did);
- H5Sclose(sid);
- H5Sclose(mem_space_id);
- H5Tclose(mem_type_id);
- H5Tclose(tid);
- } H5E_END_TRY;
- return -1;
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did);
+ H5Tclose(mem_type_id);
+ H5Tclose(ftype_id);
+ H5Sclose(sid);
+ } H5E_END_TRY;
+ return -1;
}
/*-------------------------------------------------------------------------
- * Function: H5TBadd_records_from
- *
- * Purpose: Add records from first table to second table
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: December 5, 2001
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
-
-herr_t H5TBadd_records_from( hid_t loc_id,
- const char *dset_name1,
- hsize_t start1,
- hsize_t nrecords,
- const char *dset_name2,
- hsize_t start2 )
-{
+* Function: H5TBread_records
+*
+* Purpose: Reads records
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 19, 2001
+*
+* Comments:
+*
+* Modifications: April 1, 2004
+* the FIELD_SIZES parameter is used to define the memory type ID
+* returned by H5TB_create_type
+*
+*-------------------------------------------------------------------------
+*/
- /* Identifiers for the 1st dataset. */
- hid_t dataset_id1;
- hid_t type_id1;
- hid_t space_id1=-1;
- hid_t mem_space_id1=-1;
- size_t type_size1;
-
- hsize_t count[1];
- hsize_t offset[1];
- hsize_t mem_size[1];
- hsize_t nfields;
- hsize_t ntotal_records;
- unsigned char *tmp_buf;
- size_t src_size;
- size_t *src_offset;
- size_t *src_sizes;
-/*-------------------------------------------------------------------------
- * First we get information about type size and offsets on disk
- *-------------------------------------------------------------------------
- */
-
- /* Get the number of records and fields */
- if(H5TBget_table_info ( loc_id, dset_name1, &nfields, &ntotal_records ) < 0)
- return -1;
-
- src_offset = (size_t *)malloc((size_t)nfields * sizeof(size_t));
- src_sizes = (size_t *)malloc((size_t)nfields * sizeof(size_t));
-
- if(src_offset == NULL )
- return -1;
-
- /* Get field info */
- if(H5TBget_field_info( loc_id, dset_name1, NULL, src_sizes, src_offset, &src_size ) < 0)
- return -1;
-
-/*-------------------------------------------------------------------------
- * Get information about the first table and read it
- *-------------------------------------------------------------------------
- */
-
- /* Open the 1st dataset. */
- if((dataset_id1 = H5Dopen2(loc_id, dset_name1, H5P_DEFAULT)) < 0)
- return -1;
-
- /* Get the datatype */
- if((type_id1 = H5Dget_type( dataset_id1 )) < 0)
- goto out;
-
- /* Get the dataspace handle */
- if((space_id1 = H5Dget_space( dataset_id1 )) < 0)
- goto out;
-
- /* Get the size of the datatype */
- if(( type_size1 = H5Tget_size( type_id1 )) == 0 )
- goto out;
-
- tmp_buf = (unsigned char *)calloc((size_t)nrecords, type_size1 );
-
- /* Define a hyperslab in the dataset of the size of the records */
- offset[0] = start1;
- count[0] = nrecords;
- if(H5Sselect_hyperslab( space_id1, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
- goto out;
-
- /* Create a memory dataspace handle */
- mem_size[0] = count[0];
- if((mem_space_id1 = H5Screate_simple( 1, mem_size, NULL )) < 0)
- goto out;
-
- if(H5Dread( dataset_id1, type_id1, mem_space_id1, space_id1, H5P_DEFAULT, tmp_buf ) < 0)
- goto out;
+herr_t H5TBread_records( hid_t loc_id,
+ const char *dset_name,
+ hsize_t start,
+ hsize_t nrecords,
+ size_t type_size,
+ const size_t *field_offset,
+ const size_t *field_sizes,
+ void *buf )
+{
-/*-------------------------------------------------------------------------
- * Add to the second table
- *-------------------------------------------------------------------------
- */
- if(H5TBinsert_record(loc_id,dset_name2,start2,nrecords,src_size,src_offset,src_sizes,tmp_buf ) < 0)
- goto out;
+ hid_t did;
+ hid_t ftype_id;
+ hid_t mem_type_id=-1;
+ hid_t sid=-1;
+ hid_t m_sid=-1;
+ hsize_t nrecords_orig;
+ hsize_t nfields;
-/*-------------------------------------------------------------------------
- * Close resources for table 1
- *-------------------------------------------------------------------------
- */
+ /* get the number of records and fields */
+ if (H5TBget_table_info ( loc_id, dset_name, &nfields, &nrecords_orig ) < 0)
+ return -1;
- /* Terminate access to the memory dataspace */
- if(H5Sclose( mem_space_id1 ) < 0)
- goto out;
+ /* open the dataset */
+ if ((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ return -1;
- /* Terminate access to the dataspace */
- if(H5Sclose( space_id1 ) < 0)
- goto out;
+ /* get the datatypes */
+ if ((ftype_id = H5Dget_type( did )) < 0)
+ goto out;
- /* Release the datatype. */
- if(H5Tclose( type_id1 ) < 0)
- return -1;
+ if ((mem_type_id=H5TB_create_type(loc_id,dset_name,type_size,field_offset,field_sizes,ftype_id)) < 0)
+ goto out;
- /* End access to the dataset */
- if(H5Dclose( dataset_id1 ) < 0)
- return -1;
+ /* read the records */
+ if ((H5TB_common_read_records(did, mem_type_id, start, (size_t)nrecords, nrecords_orig, buf)) < 0)
+ goto out;
- free( tmp_buf );
- free( src_offset );
- free( src_sizes );
+ /* close */
+ if (H5Tclose( ftype_id ) < 0)
+ return -1;
+ if (H5Tclose( mem_type_id ) < 0)
+ return -1;
+ if (H5Dclose( did ) < 0)
+ return -1;
-return 0;
+ return 0;
- /* error zone, gracefully close */
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Dclose(dataset_id1);
- H5Sclose(space_id1);
- H5Sclose(mem_space_id1);
- H5Tclose(type_id1);
- } H5E_END_TRY;
- return -1;
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Tclose(mem_type_id);
+ H5Tclose(ftype_id);
+ H5Sclose(m_sid);
+ H5Sclose(sid);
+ } H5E_END_TRY;
+ return -1;
}
-/*-------------------------------------------------------------------------
- * Function: H5TBcombine_tables
- *
- * Purpose: Combine records from two tables into a third
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: December 10, 2001
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
-herr_t H5TBcombine_tables( hid_t loc_id1,
- const char *dset_name1,
- hid_t loc_id2,
- const char *dset_name2,
- const char *dset_name3 )
-{
-
- /* Identifiers for the 1st dataset. */
- hid_t dataset_id1;
- hid_t type_id1;
- hid_t space_id1;
- hid_t plist_id1;
-
- /* Identifiers for the 2nd dataset. */
- hid_t dataset_id2;
- hid_t type_id2;
- hid_t space_id2;
- hid_t plist_id2;
-
- /* Identifiers for the 3rd dataset. */
- hid_t dataset_id3;
- hid_t type_id3;
- hid_t space_id3;
- hid_t plist_id3;
-
- hsize_t count[1];
- hsize_t offset[1];
- hid_t mem_space_id;
- hsize_t mem_size[1];
- hsize_t nfields;
- hsize_t nrecords;
- hsize_t dims[1];
- hsize_t maxdims[1] = { H5S_UNLIMITED };
-
-
- size_t type_size;
- hid_t sid;
- hid_t member_type_id;
- size_t member_offset;
- char attr_name[255];
- hid_t attr_id;
- char aux[255];
- unsigned char *tmp_buf;
- unsigned char *tmp_fill_buf;
- hsize_t i;
- size_t src_size;
- size_t *src_offset;
- size_t *src_sizes;
- int has_fill=0;
/*-------------------------------------------------------------------------
- * First we get information about type size and offsets on disk
- *-------------------------------------------------------------------------
- */
-
- /* Get the number of records and fields */
- if(H5TBget_table_info ( loc_id1, dset_name1, &nfields, &nrecords ) < 0)
- return -1;
-
- src_offset = (size_t *)malloc((size_t)nfields * sizeof(size_t));
- src_sizes = (size_t *)malloc((size_t)nfields * sizeof(size_t));
-
+* Function: H5TBread_fields_name
+*
+* Purpose: Reads fields
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 19, 2001
+*
+* Comments:
+*
+* Modifications: April 1, 2004
+* the FIELD_SIZES parameter is used to define the memory type ID
+* returned by H5TB_create_type
+*
+*-------------------------------------------------------------------------
+*/
- if(src_offset == NULL )
- return -1;
- /* Get field info */
- if(H5TBget_field_info( loc_id1, dset_name1, NULL, src_sizes, src_offset, &src_size ) < 0)
- return -1;
-
-/*-------------------------------------------------------------------------
- * Get information about the first table
- *-------------------------------------------------------------------------
- */
-
- /* Open the 1st dataset. */
- if((dataset_id1 = H5Dopen2(loc_id1, dset_name1, H5P_DEFAULT)) < 0)
- goto out;
+herr_t H5TBread_fields_name( hid_t loc_id,
+ const char *dset_name,
+ const char *field_names,
+ hsize_t start,
+ hsize_t nrecords,
+ size_t type_size,
+ const size_t *field_offset,
+ const size_t *field_sizes,
+ void *buf )
+{
- /* Get the datatype */
- if((type_id1 = H5Dget_type( dataset_id1 )) < 0)
- goto out;
+ hid_t did;
+ hid_t ftype_id=-1;
+ hid_t mem_type_id=-1;
+ hid_t mtype_id;
+ hid_t nmtype_id;
+ char *member_name;
+ hssize_t nfields;
+ hsize_t count[1];
+ hsize_t offset[1];
+ hid_t sid=-1;
+ hid_t m_sid=-1;
+ hsize_t mem_size[1];
+ size_t size_native;
+ hssize_t i, j;
+
+ /* open the dataset */
+ if ((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the datatype */
+ if ((ftype_id = H5Dget_type( did )) < 0)
+ goto out;
+
+ /* get the number of fields */
+ if (( nfields = H5Tget_nmembers( ftype_id )) < 0)
+ goto out;
+
+ /* create a memory read id */
+ if (( mem_type_id = H5Tcreate( H5T_COMPOUND, type_size )) < 0)
+ goto out;
+
+ /* iterate tru the members */
+ for ( i=0,j=0; i<nfields; i++)
+ {
+ /* get the member name */
+ member_name = H5Tget_member_name( ftype_id, (unsigned)i );
+
+ if(H5TB_find_field( member_name, field_names ) > 0 )
+ {
+ /* get the member type */
+ if (( mtype_id = H5Tget_member_type( ftype_id, (unsigned) i )) < 0)
+ goto out;
+
+ /* convert to native type */
+ if ((nmtype_id=H5Tget_native_type(mtype_id,H5T_DIR_DEFAULT)) < 0)
+ goto out;
+
+ size_native=H5Tget_size(nmtype_id);
+
+ if (field_sizes[j]!=size_native)
+ {
+ if (H5Tset_size(nmtype_id, field_sizes[j]) < 0)
+ goto out;
+ }
+ /* the field in the file is found by its name */
+ if(field_offset )
+ {
+ if(H5Tinsert( mem_type_id, member_name, field_offset[j], nmtype_id ) < 0)
+ goto out;
+ }
+ else
+ {
+ if(H5Tinsert( mem_type_id, member_name, (size_t)0, nmtype_id ) < 0)
+ goto out;
+ }
+
+ /* close */
+ if(H5Tclose( mtype_id ) < 0)
+ goto out;
+ if(H5Tclose( nmtype_id ) < 0)
+ goto out;
+ j++;
+ }
+ free( member_name );
+ }
- /* Get the dataspace handle */
- if((space_id1 = H5Dget_space( dataset_id1 )) < 0)
- goto out;
+ /* get the dataspace handle */
+ if ((sid = H5Dget_space( did )) < 0)
+ goto out;
+
+ /* define a hyperslab in the dataset */
+ offset[0] = start;
+ count[0] = nrecords;
+ if (H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
+ goto out;
+
+ /* create a memory dataspace handle */
+ mem_size[0] = count[0];
+ if ((m_sid = H5Screate_simple( 1, mem_size, NULL )) < 0)
+ goto out;
+
+ /* read */
+ if (H5Dread( did, mem_type_id, m_sid, sid, H5P_DEFAULT, buf ) < 0)
+ goto out;
+
+ /* close */
+ if (H5Tclose( mem_type_id ) )
+ goto out;
+ if (H5Tclose( ftype_id ) < 0)
+ return -1;
+ if (H5Sclose( sid ) < 0)
+ goto out;
+ if (H5Sclose( m_sid ) < 0)
+ goto out;
+ if (H5Dclose( did ) < 0)
+ return -1;
+
+ return 0;
+
+ /* error zone */
+out:
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did);
+ H5Tclose(mem_type_id);
+ H5Tclose(ftype_id);
+ H5Sclose(m_sid);
+ H5Sclose(sid);
+ } H5E_END_TRY;
+ return -1;
- /* Get creation properties list */
- if((plist_id1 = H5Dget_create_plist( dataset_id1 )) < 0)
- goto out;
+}
- /* Get the dimensions */
- if(H5TBget_table_info ( loc_id1, dset_name1, &nfields, &nrecords ) < 0)
- return -1;
/*-------------------------------------------------------------------------
- * Make the merged table with no data originally
- *-------------------------------------------------------------------------
- */
+* Function: H5TBread_fields_index
+*
+* Purpose: Reads fields
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 19, 2001
+*
+* Comments:
+*
+* Modifications: April 1, 2004
+* the FIELD_SIZES parameter is used to define the memory type ID
+* returned by H5TB_create_type
+*
+*-------------------------------------------------------------------------
+*/
- /* Clone the property list */
- if((plist_id3 = H5Pcopy(plist_id1)) < 0)
- goto out;
- /* Clone the type id */
- if((type_id3 = H5Tcopy(type_id1)) < 0)
- goto out;
+herr_t H5TBread_fields_index( hid_t loc_id,
+ const char *dset_name,
+ hsize_t nfields,
+ const int *field_index,
+ hsize_t start,
+ hsize_t nrecords,
+ size_t type_size,
+ const size_t *field_offset,
+ const size_t *field_sizes,
+ void *buf )
+{
-/*-------------------------------------------------------------------------
- * Here we do not clone the file space from the 1st dataset, because we want to create
- * an empty table. Instead we create a new dataspace with zero records and expandable.
- *-------------------------------------------------------------------------
- */
- dims[0] = 0;
+ hid_t did;
+ hid_t tid=-1;
+ hid_t read_type_id=-1;
+ hid_t member_type_id;
+ hid_t nmtype_id;
+ char *member_name;
+ hsize_t count[1];
+ hsize_t offset[1];
+ hid_t sid=-1;
+ hid_t m_sid=-1;
+ hsize_t mem_size[1];
+ size_t size_native;
+ hsize_t i, j;
+
+ /* open the dataset. */
+ if ((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the datatype */
+ if ((tid = H5Dget_type( did )) < 0)
+ goto out;
+
+ /* create a read id */
+ if (( read_type_id = H5Tcreate( H5T_COMPOUND, type_size )) < 0)
+ goto out;
+
+ /* iterate tru the members */
+ for ( i = 0; i < nfields; i++)
+ {
+ j = field_index[i];
+
+ /* get the member name */
+ member_name = H5Tget_member_name( tid, (unsigned) j );
+
+ /* get the member type */
+ if (( member_type_id = H5Tget_member_type( tid, (unsigned) j )) < 0)
+ goto out;
+
+ /* get the member size */
+ if (H5Tget_size( member_type_id ) == 0 )
+ goto out;
+
+ /* convert to native type */
+ if ((nmtype_id=H5Tget_native_type(member_type_id,H5T_DIR_DEFAULT)) < 0)
+ goto out;
+
+ size_native=H5Tget_size(nmtype_id);
+
+ if (field_sizes[i]!=size_native)
+ {
+ if (H5Tset_size(nmtype_id, field_sizes[i]) < 0)
+ goto out;
+ }
+
+ /* the field in the file is found by its name */
+ if (field_offset )
+ {
+ if(H5Tinsert( read_type_id, member_name, field_offset[i], nmtype_id ) < 0)
+ goto out;
+ }
+ else
+ {
+ if(H5Tinsert( read_type_id, member_name, (size_t)0, nmtype_id ) < 0)
+ goto out;
+ }
+
+ /* close the member type */
+ if (H5Tclose( member_type_id ) < 0)
+ goto out;
+ if (H5Tclose( nmtype_id ) < 0)
+ goto out;
+
+ free( member_name );
+ }
-/* Create a simple data space with unlimited size */
- if((space_id3 = H5Screate_simple(1, dims, maxdims)) < 0)
- return -1;
+ /* get the dataspace handle */
+ if ((sid = H5Dget_space( did )) < 0)
+ goto out;
+
+ /* define a hyperslab in the dataset */
+ offset[0] = start;
+ count[0] = nrecords;
+ if (H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
+ goto out;
+
+ /* create a memory dataspace handle */
+ mem_size[0] = count[0];
+ if ((m_sid = H5Screate_simple( 1, mem_size, NULL )) < 0)
+ goto out;
+
+ /* read */
+ if (H5Dread( did, read_type_id, m_sid, sid, H5P_DEFAULT, buf ) < 0)
+ goto out;
+
+ /* close */
+ if (H5Sclose( sid ) < 0)
+ goto out;
+ if (H5Sclose( m_sid ) < 0)
+ goto out;
+ if (H5Tclose( read_type_id ) )
+ goto out;
+ if (H5Tclose( tid ) < 0)
+ return -1;
+ if (H5Dclose( did ) < 0)
+ return -1;
+
+ return 0;
+
+ /* error zone */
+out:
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did);
+ H5Tclose(read_type_id);
+ H5Tclose(tid);
+ H5Sclose(m_sid);
+ H5Sclose(sid);
+ } H5E_END_TRY;
+ return -1;
- /* Create the dataset */
- if((dataset_id3 = H5Dcreate2(loc_id1, dset_name3, type_id3, space_id3, H5P_DEFAULT, plist_id3, H5P_DEFAULT)) < 0)
- goto out;
+}
-/*-------------------------------------------------------------------------
- * Attach the conforming table attributes
- *-------------------------------------------------------------------------
- */
- if(H5TB_attach_attributes("Merge table", loc_id1, dset_name3, nfields, type_id3) < 0)
- goto out;
/*-------------------------------------------------------------------------
- * Get attributes
- *-------------------------------------------------------------------------
- */
-
- type_size = H5Tget_size(type_id3);
-
- /* alloc fill value attribute buffer */
- tmp_fill_buf = (unsigned char *)malloc(type_size);
-
- /* Get the fill value attributes */
- has_fill = H5TBAget_fill(loc_id1, dset_name1, dataset_id1, tmp_fill_buf);
+*
+* Manipulation functions
+*
+*-------------------------------------------------------------------------
+*/
/*-------------------------------------------------------------------------
- * Attach the fill attributes from previous table
- *-------------------------------------------------------------------------
- */
- if(has_fill == 1 )
- {
-
- if (( sid = H5Screate(H5S_SCALAR)) < 0)
- goto out;
+* Function: H5TBdelete_record
+*
+* Purpose: Delete records from middle of table ("pulling up" all the records after it)
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 26, 2001
+*
+* Modifications: April 29, 2003
+*
+*
+*-------------------------------------------------------------------------
+*/
- for ( i = 0; i < nfields; i++)
- {
-
- /* Get the member type */
- if(( member_type_id = H5Tget_member_type( type_id3, (unsigned) i )) < 0)
- goto out;
+herr_t H5TBdelete_record( hid_t loc_id,
+ const char *dset_name,
+ hsize_t start,
+ hsize_t nrecords )
+{
- /* Get the member offset */
- member_offset = H5Tget_member_offset(type_id3, (unsigned)i);
+ hsize_t nfields;
+ hsize_t ntotal_records;
+ hsize_t read_start;
+ hsize_t read_nrecords;
+ hid_t did=-1;
+ hid_t tid=-1;
+ hid_t sid=-1;
+ hid_t m_sid=-1;
+ hsize_t count[1];
+ hsize_t offset[1];
+ hsize_t mem_size[1];
+ unsigned char *tmp_buf=NULL;
+ size_t src_size;
+ size_t *src_offset;
+ size_t *src_sizes;
+ hsize_t dims[1];
+
+ /*-------------------------------------------------------------------------
+ * first we get information about type size and offsets on disk
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the number of records and fields */
+ if (H5TBget_table_info ( loc_id, dset_name, &nfields, &ntotal_records ) < 0)
+ return -1;
+
+ src_offset = (size_t *)malloc((size_t)nfields * sizeof(size_t));
+ src_sizes = (size_t *)malloc((size_t)nfields * sizeof(size_t));
+
+ if (src_offset == NULL )
+ return -1;
+ if (src_sizes == NULL )
+ return -1;
+
+ /* get field info */
+ if (H5TBget_field_info( loc_id, dset_name, NULL, src_sizes, src_offset, &src_size ) < 0)
+ return -1;
+
+ /* open the dataset. */
+ if ((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ return -1;
+
+ /*-------------------------------------------------------------------------
+ * read the records after the deleted one(s)
+ *-------------------------------------------------------------------------
+ */
+
+ read_start = start + nrecords;
+ read_nrecords = ntotal_records - read_start;
+
+ if ( read_nrecords )
+ {
+ tmp_buf = (unsigned char *)calloc((size_t) read_nrecords, src_size );
- strcpy(attr_name, "FIELD_");
- sprintf(aux, "%d", (int)i);
- strcat(attr_name, aux);
- sprintf(aux, "%s", "_FILL");
- strcat(attr_name, aux);
+ if (tmp_buf == NULL )
+ return -1;
- if((attr_id = H5Acreate2(dataset_id3, attr_name, member_type_id, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
+ /* read the records after the deleted one(s) */
+ if (H5TBread_records( loc_id, dset_name, read_start, read_nrecords, src_size, src_offset, src_sizes, tmp_buf ) < 0)
+ return -1;
- if(H5Awrite(attr_id, member_type_id, tmp_fill_buf+member_offset) < 0)
- goto out;
+ /*-------------------------------------------------------------------------
+ * write the records in another position
+ *-------------------------------------------------------------------------
+ */
- if(H5Aclose(attr_id) < 0)
- goto out;
+ /* get the datatype */
+ if ((tid = H5Dget_type( did )) < 0)
+ goto out;
- if(H5Tclose(member_type_id) < 0)
- goto out;
- }
+ /* get the dataspace handle */
+ if ((sid = H5Dget_space( did )) < 0)
+ goto out;
- /* Close data space. */
- if(H5Sclose( sid ) < 0)
- goto out;
- }
+ /* define a hyperslab in the dataset of the size of the records */
+ offset[0] = start;
+ count[0] = read_nrecords;
+ if (H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
+ goto out;
-/*-------------------------------------------------------------------------
- * Read data from 1st table
- *-------------------------------------------------------------------------
- */
+ /* create a memory dataspace handle */
+ mem_size[0] = count[0];
+ if ((m_sid = H5Screate_simple( 1, mem_size, NULL )) < 0)
+ goto out;
- tmp_buf = (unsigned char *)calloc((size_t) nrecords, type_size );
+ if (H5Dwrite( did, tid, m_sid, sid, H5P_DEFAULT, tmp_buf ) < 0)
+ goto out;
- /* Define a hyperslab in the dataset of the size of the records */
- offset[0] = 0;
- count[0] = nrecords;
- if(H5Sselect_hyperslab( space_id1, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
- goto out;
+ /* close */
+ if (H5Sclose( m_sid ) < 0)
+ goto out;
+ if (H5Sclose( sid ) < 0)
+ goto out;
+ if (H5Tclose( tid ) < 0)
+ goto out;
- /* Create a memory dataspace handle */
- mem_size[0] = count[0];
- if((mem_space_id = H5Screate_simple( 1, mem_size, NULL )) < 0)
- goto out;
+ } /* read_nrecords */
- if(H5Dread( dataset_id1, type_id1, mem_space_id, space_id1, H5P_DEFAULT, tmp_buf ) < 0)
- goto out;
-/*-------------------------------------------------------------------------
- * Save data from 1st table into new table
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * change the dataset dimension
+ *-------------------------------------------------------------------------
+ */
+ dims[0] = ntotal_records - nrecords;
+ if (H5Dset_extent( did, dims ) < 0)
+ goto out;
- /* Append the records to the new table */
- if(H5TBappend_records( loc_id1, dset_name3, nrecords, src_size, src_offset, src_sizes, tmp_buf ) < 0)
- goto out;
+ /* close dataset */
+ if (H5Dclose( did ) < 0)
+ return -1;
-/*-------------------------------------------------------------------------
- * Release resources from 1st table
- *-------------------------------------------------------------------------
- */
+ if (tmp_buf !=NULL)
+ free( tmp_buf );
+ free( src_offset );
+ free( src_sizes );
- /* Terminate access to the memory dataspace */
- if(H5Sclose( mem_space_id ) < 0)
- goto out;
- /* Terminate access to the dataspace */
- if(H5Sclose( space_id1 ) < 0)
- goto out;
+ return 0;
- /* Release the datatype. */
- if(H5Tclose( type_id1 ) < 0)
- goto out;
+ /* error zone */
+out:
- /* Terminate access to a property list */
- if(H5Pclose( plist_id1 ) < 0)
- goto out;
+ if (tmp_buf !=NULL )
+ free( tmp_buf );
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did);
+ H5Tclose(tid);
+ H5Sclose(sid);
+ } H5E_END_TRY;
+ return -1;
- /* End access to the dataset */
- if(H5Dclose( dataset_id1 ) < 0)
- goto out;
- /* Release resources. */
- free( tmp_buf );
+}
/*-------------------------------------------------------------------------
- * Get information about the 2nd table
- *-------------------------------------------------------------------------
- */
-
- /* Open the dataset. */
- if((dataset_id2 = H5Dopen2(loc_id2, dset_name2, H5P_DEFAULT)) < 0)
- goto out;
-
- /* Get the datatype */
- if((type_id2 = H5Dget_type( dataset_id2 )) < 0)
- goto out;
+* Function: H5TBinsert_record
+*
+* Purpose: Inserts records into middle of table ("pushing down" all the records after it)
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 26, 2001
+*
+* Comments: Uses memory offsets
+*
+* Modifications: April 1, 2004
+* the FIELD_SIZES parameter is used to define the memory type ID
+* returned by H5TB_create_type
+*
+*-------------------------------------------------------------------------
+*/
- /* Get the dataspace handle */
- if((space_id2 = H5Dget_space( dataset_id2 )) < 0)
- goto out;
- /* Get the property list handle */
- if((plist_id2 = H5Dget_create_plist( dataset_id2 )) < 0)
- goto out;
+herr_t H5TBinsert_record( hid_t loc_id,
+ const char *dset_name,
+ hsize_t start,
+ hsize_t nrecords,
+ size_t type_size,
+ const size_t *field_offset,
+ const size_t *field_sizes,
+ void *buf )
+{
- /* Get the dimensions */
- if(H5TBget_table_info ( loc_id2, dset_name2, &nfields, &nrecords ) < 0)
- return -1;
+ hsize_t nfields;
+ hsize_t ntotal_records;
+ hsize_t read_nrecords;
+ hid_t did;
+ hid_t tid=-1;
+ hid_t mem_type_id=-1;
+ hsize_t count[1];
+ hsize_t offset[1];
+ hid_t sid=-1;
+ hid_t m_sid=-1;
+ hsize_t dims[1];
+ hsize_t mem_dims[1];
+ unsigned char *tmp_buf;
+
+ /*-------------------------------------------------------------------------
+ * read the records after the inserted one(s)
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the dimensions */
+ if (H5TBget_table_info ( loc_id, dset_name, &nfields, &ntotal_records ) < 0)
+ return -1;
+
+ /* open the dataset. */
+ if ((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the datatype */
+ if ((tid = H5Dget_type( did )) < 0)
+ goto out;
+
+ /* create the memory data type. */
+ if ((mem_type_id=H5TB_create_type(loc_id,dset_name,type_size,field_offset,field_sizes,tid)) < 0)
+ goto out;
+
+ read_nrecords = ntotal_records - start;
+ tmp_buf = (unsigned char *)calloc((size_t) read_nrecords, type_size);
+
+ /* read the records after the inserted one(s) */
+ if (H5TBread_records( loc_id, dset_name, start, read_nrecords, type_size, field_offset, field_sizes, tmp_buf ) < 0)
+ return -1;
+
+ /* extend the dataset */
+ dims[0] = ntotal_records + nrecords;
+
+ if (H5Dset_extent(did, dims) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * write the inserted records
+ *-------------------------------------------------------------------------
+ */
+
+ /* create a simple memory data space */
+ mem_dims[0] = nrecords;
+ if ((m_sid = H5Screate_simple(1, mem_dims, NULL)) < 0)
+ return -1;
+
+ /* get the file data space */
+ if ((sid = H5Dget_space( did )) < 0)
+ return -1;
+
+ /* define a hyperslab in the dataset to write the new data */
+ offset[0] = start;
+ count[0] = nrecords;
+ if (H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
+ goto out;
+
+ if (H5Dwrite( did, mem_type_id, m_sid, sid, H5P_DEFAULT, buf ) < 0)
+ goto out;
+
+ /* terminate access to the dataspace */
+ if (H5Sclose( m_sid ) < 0)
+ goto out;
+ if (H5Sclose( sid ) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * write the "pushed down" records
+ *-------------------------------------------------------------------------
+ */
+
+ /* create a simple memory data space */
+ mem_dims[0]=read_nrecords;
+ if ((m_sid = H5Screate_simple( 1, mem_dims, NULL )) < 0)
+ return -1;
+
+ /* get the file data space */
+ if ((sid = H5Dget_space( did )) < 0)
+ return -1;
+
+ /* define a hyperslab in the dataset to write the new data */
+ offset[0] = start + nrecords;
+ count[0] = read_nrecords;
+ if (H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
+ goto out;
+
+ if (H5Dwrite( did, mem_type_id, m_sid, sid, H5P_DEFAULT, tmp_buf ) < 0)
+ goto out;
+
+ /* close */
+ if (H5Sclose( m_sid ) < 0)
+ goto out;
+ if (H5Sclose( sid ) < 0)
+ goto out;
+ if (H5Tclose( tid ) < 0)
+ return -1;
+ if (H5Tclose( mem_type_id ) < 0)
+ return -1;
+ if (H5Dclose( did ) < 0)
+ return -1;
+
+ free( tmp_buf );
+
+ return 0;
+
+ /* error zone */
+out:
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did);
+ H5Sclose(sid);
+ H5Sclose(m_sid);
+ H5Tclose(mem_type_id);
+ H5Tclose(tid);
+ } H5E_END_TRY;
+ return -1;
+}
/*-------------------------------------------------------------------------
- * Read data from 2nd table
- *-------------------------------------------------------------------------
- */
-
- tmp_buf = (unsigned char *)calloc((size_t) nrecords, type_size );
+* Function: H5TBadd_records_from
+*
+* Purpose: Add records from first table to second table
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: December 5, 2001
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
- /* Define a hyperslab in the dataset of the size of the records */
- offset[0] = 0;
- count[0] = nrecords;
- if(H5Sselect_hyperslab( space_id2, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
- goto out;
-
- /* Create a memory dataspace handle */
- mem_size[0] = count[0];
- if((mem_space_id = H5Screate_simple( 1, mem_size, NULL )) < 0)
- goto out;
-
- if(H5Dread( dataset_id2, type_id2, mem_space_id, space_id2, H5P_DEFAULT, tmp_buf ) < 0)
- goto out;
-
-
-/*-------------------------------------------------------------------------
- * Save data from 2nd table into new table
- *-------------------------------------------------------------------------
- */
+herr_t H5TBadd_records_from( hid_t loc_id,
+ const char *dset_name1,
+ hsize_t start1,
+ hsize_t nrecords,
+ const char *dset_name2,
+ hsize_t start2 )
+{
+ hid_t did_1;
+ hid_t tid_1;
+ hid_t sid_1=-1;
+ hid_t msid_1=-1;
+ size_t type_size1;
+ hsize_t count[1];
+ hsize_t offset[1];
+ hsize_t mem_size[1];
+ hsize_t nfields;
+ hsize_t ntotal_records;
+ unsigned char *tmp_buf;
+ size_t src_size;
+ size_t *src_offset;
+ size_t *src_sizes;
+
+ /*-------------------------------------------------------------------------
+ * first we get information about type size and offsets on disk
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the number of records and fields */
+ if (H5TBget_table_info ( loc_id, dset_name1, &nfields, &ntotal_records ) < 0)
+ return -1;
+
+ src_offset = (size_t *)malloc((size_t)nfields * sizeof(size_t));
+ src_sizes = (size_t *)malloc((size_t)nfields * sizeof(size_t));
+
+ if (src_offset == NULL )
+ return -1;
+
+ /* get field info */
+ if (H5TBget_field_info( loc_id, dset_name1, NULL, src_sizes, src_offset, &src_size ) < 0)
+ return -1;
+
+ /*-------------------------------------------------------------------------
+ * Get information about the first table and read it
+ *-------------------------------------------------------------------------
+ */
+
+ /* open the 1st dataset. */
+ if ((did_1 = H5Dopen2(loc_id, dset_name1, H5P_DEFAULT)) < 0)
+ return -1;
+
+ /* get the datatype */
+ if ((tid_1 = H5Dget_type( did_1 )) < 0)
+ goto out;
+
+ /* get the dataspace handle */
+ if ((sid_1 = H5Dget_space( did_1 )) < 0)
+ goto out;
+
+ /* get the size of the datatype */
+ if (( type_size1 = H5Tget_size( tid_1 )) == 0 )
+ goto out;
+
+ tmp_buf = (unsigned char *)calloc((size_t)nrecords, type_size1 );
+
+ /* define a hyperslab in the dataset of the size of the records */
+ offset[0] = start1;
+ count[0] = nrecords;
+ if (H5Sselect_hyperslab( sid_1, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
+ goto out;
+
+ /* create a memory dataspace handle */
+ mem_size[0] = count[0];
+ if ((msid_1 = H5Screate_simple( 1, mem_size, NULL )) < 0)
+ goto out;
+
+ if (H5Dread( did_1, tid_1, msid_1, sid_1, H5P_DEFAULT, tmp_buf ) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * add to the second table
+ *-------------------------------------------------------------------------
+ */
+ if (H5TBinsert_record(loc_id,dset_name2,start2,nrecords,src_size,src_offset,src_sizes,tmp_buf ) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * close resources for table 1
+ *-------------------------------------------------------------------------
+ */
+
+ if (H5Sclose( msid_1 ) < 0)
+ goto out;
+ if (H5Sclose( sid_1 ) < 0)
+ goto out;
+ if (H5Tclose( tid_1 ) < 0)
+ return -1;
+ if (H5Dclose( did_1 ) < 0)
+ return -1;
+
+ free( tmp_buf );
+ free( src_offset );
+ free( src_sizes );
+
+ return 0;
+
+ /* error zone */
+out:
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did_1);
+ H5Sclose(sid_1);
+ H5Sclose(msid_1);
+ H5Tclose(tid_1);
+ } H5E_END_TRY;
+ return -1;
- /* append the records to the new table */
- if(H5TBappend_records( loc_id1, dset_name3, nrecords, src_size, src_offset, src_sizes, tmp_buf ) < 0)
- goto out;
+}
/*-------------------------------------------------------------------------
- * Release resources from 2nd table
- *-------------------------------------------------------------------------
- */
-
- /* Terminate access to the memory dataspace */
- if(H5Sclose( mem_space_id ) < 0)
- goto out;
+* Function: H5TBcombine_tables
+*
+* Purpose: Combine records from two tables into a third
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: December 10, 2001
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
+herr_t H5TBcombine_tables( hid_t loc_id1,
+ const char *dset_name1,
+ hid_t loc_id2,
+ const char *dset_name2,
+ const char *dset_name3 )
+{
- /* Terminate access to the dataspace */
- if(H5Sclose( space_id2 ) < 0)
- goto out;
+ /* identifiers for the 1st dataset. */
+ hid_t did_1=-1;
+ hid_t tid_1=-1;
+ hid_t sid_1=-1;
+ hid_t pid_1=-1;
+ /* identifiers for the 2nd dataset. */
+ hid_t did_2=-1;
+ hid_t tid_2=-1;
+ hid_t sid_2=-1;
+ hid_t pid_2=-1;
+ /* identifiers for the 3rd dataset. */
+ hid_t did_3=-1;
+ hid_t tid_3=-1;
+ hid_t sid_3=-1;
+ hid_t pid_3=-1;
+ hsize_t count[1];
+ hsize_t offset[1];
+ hid_t m_sid;
+ hsize_t mem_size[1];
+ hsize_t nfields;
+ hsize_t nrecords;
+ hsize_t dims[1];
+ hsize_t maxdims[1] = { H5S_UNLIMITED };
+ size_t type_size;
+ hid_t sid;
+ hid_t member_type_id;
+ size_t member_offset;
+ char attr_name[255];
+ hid_t attr_id;
+ char aux[255];
+ unsigned char *tmp_buf;
+ unsigned char *tmp_fill_buf;
+ hsize_t i;
+ size_t src_size;
+ size_t *src_offset;
+ size_t *src_sizes;
+ int has_fill=0;
+
+ /*-------------------------------------------------------------------------
+ * first we get information about type size and offsets on disk
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the number of records and fields */
+ if (H5TBget_table_info ( loc_id1, dset_name1, &nfields, &nrecords ) < 0)
+ return -1;
+
+ src_offset = (size_t *)malloc((size_t)nfields * sizeof(size_t));
+ src_sizes = (size_t *)malloc((size_t)nfields * sizeof(size_t));
+
+ if (src_offset == NULL )
+ return -1;
+
+ /* get field info */
+ if (H5TBget_field_info( loc_id1, dset_name1, NULL, src_sizes, src_offset, &src_size ) < 0)
+ return -1;
+
+ /*-------------------------------------------------------------------------
+ * get information about the first table
+ *-------------------------------------------------------------------------
+ */
+
+ /* open the 1st dataset. */
+ if ((did_1 = H5Dopen2(loc_id1, dset_name1, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the datatype */
+ if ((tid_1 = H5Dget_type( did_1 )) < 0)
+ goto out;
+
+ /* get the dataspace handle */
+ if ((sid_1 = H5Dget_space( did_1 )) < 0)
+ goto out;
+
+ /* get creation properties list */
+ if ((pid_1 = H5Dget_create_plist( did_1 )) < 0)
+ goto out;
+
+ /* get the dimensions */
+ if (H5TBget_table_info ( loc_id1, dset_name1, &nfields, &nrecords ) < 0)
+ return -1;
+
+ /*-------------------------------------------------------------------------
+ * make the merged table with no data originally
+ *-------------------------------------------------------------------------
+ */
+
+ /* clone the property list */
+ if ((pid_3 = H5Pcopy(pid_1)) < 0)
+ goto out;
+
+ /* clone the type id */
+ if ((tid_3 = H5Tcopy(tid_1)) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * here we do not clone the file space from the 1st dataset, because we want to create
+ * an empty table. Instead we create a new dataspace with zero records and expandable.
+ *-------------------------------------------------------------------------
+ */
+ dims[0] = 0;
+
+ /* create a simple data space with unlimited size */
+ if ((sid_3 = H5Screate_simple(1, dims, maxdims)) < 0)
+ return -1;
+
+ /* create the dataset */
+ if ((did_3 = H5Dcreate2(loc_id1, dset_name3, tid_3, sid_3, H5P_DEFAULT, pid_3, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * attach the conforming table attributes
+ *-------------------------------------------------------------------------
+ */
+ if (H5TB_attach_attributes("Merge table", loc_id1, dset_name3, nfields, tid_3) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * get attributes
+ *-------------------------------------------------------------------------
+ */
+
+ type_size = H5Tget_size(tid_3);
+
+ /* alloc fill value attribute buffer */
+ tmp_fill_buf = (unsigned char *)malloc(type_size);
+
+ /* get the fill value attributes */
+ has_fill = H5TBAget_fill(loc_id1, dset_name1, did_1, tmp_fill_buf);
+
+ /*-------------------------------------------------------------------------
+ * attach the fill attributes from previous table
+ *-------------------------------------------------------------------------
+ */
+ if (has_fill == 1 )
+ {
- /* Release the datatype. */
- if(H5Tclose( type_id2 ) < 0)
- return -1;
+ if (( sid = H5Screate(H5S_SCALAR)) < 0)
+ goto out;
- /* Terminate access to a property list */
- if(H5Pclose( plist_id2 ) < 0)
- goto out;
+ for ( i = 0; i < nfields; i++)
+ {
- /* End access to the dataset */
- if(H5Dclose( dataset_id2 ) < 0)
- return -1;
+ /* get the member type */
+ if (( member_type_id = H5Tget_member_type( tid_3, (unsigned) i )) < 0)
+ goto out;
-/*-------------------------------------------------------------------------
- * Release resources from 3rd table
- *-------------------------------------------------------------------------
- */
+ /* get the member offset */
+ member_offset = H5Tget_member_offset(tid_3, (unsigned)i);
- /* Terminate access to the dataspace */
- if(H5Sclose( space_id3 ) < 0)
- return -1;
+ strcpy(attr_name, "FIELD_");
+ sprintf(aux, "%d", (int)i);
+ strcat(attr_name, aux);
+ sprintf(aux, "%s", "_FILL");
+ strcat(attr_name, aux);
- /* Release the datatype. */
- if(H5Tclose( type_id3 ) < 0)
- return -1;
+ if ((attr_id = H5Acreate2(did_3, attr_name, member_type_id, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
- /* Terminate access to a property list */
- if(H5Pclose( plist_id3 ) < 0)
- return -1;
+ if (H5Awrite(attr_id, member_type_id, tmp_fill_buf+member_offset) < 0)
+ goto out;
- /* End access to the dataset */
- if(H5Dclose( dataset_id3 ) < 0)
- return -1;
+ if (H5Aclose(attr_id) < 0)
+ goto out;
- /* Release resources. */
- free( tmp_buf );
- free( tmp_fill_buf );
- free( src_offset );
- free( src_sizes );
+ if (H5Tclose(member_type_id) < 0)
+ goto out;
+ }
-return 0;
+ /* close data space. */
+ if (H5Sclose( sid ) < 0)
+ goto out;
+ }
+ /*-------------------------------------------------------------------------
+ * read data from 1st table
+ *-------------------------------------------------------------------------
+ */
+
+ tmp_buf = (unsigned char *)calloc((size_t) nrecords, type_size );
+
+ /* define a hyperslab in the dataset of the size of the records */
+ offset[0] = 0;
+ count[0] = nrecords;
+ if (H5Sselect_hyperslab( sid_1, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
+ goto out;
+
+ /* create a memory dataspace handle */
+ mem_size[0] = count[0];
+ if ((m_sid = H5Screate_simple( 1, mem_size, NULL )) < 0)
+ goto out;
+
+ if (H5Dread( did_1, tid_1, m_sid, sid_1, H5P_DEFAULT, tmp_buf ) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * save data from 1st table into new table
+ *-------------------------------------------------------------------------
+ */
+
+ /* append the records to the new table */
+ if (H5TBappend_records( loc_id1, dset_name3, nrecords, src_size, src_offset, src_sizes, tmp_buf ) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * release resources from 1st table
+ *-------------------------------------------------------------------------
+ */
+
+ if (H5Sclose( m_sid ) < 0)
+ goto out;
+ if(H5Sclose( sid_1 ) < 0)
+ goto out;
+ if(H5Tclose( tid_1 ) < 0)
+ goto out;
+ if(H5Pclose( pid_1 ) < 0)
+ goto out;
+ if(H5Dclose( did_1 ) < 0)
+ goto out;
+
+ /* Release resources. */
+ free( tmp_buf );
+
+ /*-------------------------------------------------------------------------
+ * get information about the 2nd table
+ *-------------------------------------------------------------------------
+ */
+
+ /* open the dataset. */
+ if ((did_2 = H5Dopen2(loc_id2, dset_name2, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the datatype */
+ if ((tid_2 = H5Dget_type( did_2 )) < 0)
+ goto out;
+
+ /* get the dataspace handle */
+ if ((sid_2 = H5Dget_space( did_2 )) < 0)
+ goto out;
+
+ /* get the property list handle */
+ if ((pid_2 = H5Dget_create_plist( did_2 )) < 0)
+ goto out;
+
+ /* get the dimensions */
+ if (H5TBget_table_info ( loc_id2, dset_name2, &nfields, &nrecords ) < 0)
+ return -1;
+
+ /*-------------------------------------------------------------------------
+ * read data from 2nd table
+ *-------------------------------------------------------------------------
+ */
+
+ tmp_buf = (unsigned char *)calloc((size_t) nrecords, type_size );
+
+ /* define a hyperslab in the dataset of the size of the records */
+ offset[0] = 0;
+ count[0] = nrecords;
+ if (H5Sselect_hyperslab( sid_2, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
+ goto out;
+
+ /* create a memory dataspace handle */
+ mem_size[0] = count[0];
+ if ((m_sid = H5Screate_simple( 1, mem_size, NULL )) < 0)
+ goto out;
+
+ if (H5Dread( did_2, tid_2, m_sid, sid_2, H5P_DEFAULT, tmp_buf ) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * save data from 2nd table into new table
+ *-------------------------------------------------------------------------
+ */
+
+ /* append the records to the new table */
+ if (H5TBappend_records( loc_id1, dset_name3, nrecords, src_size, src_offset, src_sizes, tmp_buf ) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * release resources from 2nd table
+ *-------------------------------------------------------------------------
+ */
+
+ if (H5Sclose( m_sid ) < 0)
+ goto out;
+ if (H5Sclose( sid_2 ) < 0)
+ goto out;
+ if (H5Tclose( tid_2 ) < 0)
+ return -1;
+ if (H5Pclose( pid_2 ) < 0)
+ goto out;
+ if (H5Dclose( did_2 ) < 0)
+ return -1;
+
+ /*-------------------------------------------------------------------------
+ * release resources from 3rd table
+ *-------------------------------------------------------------------------
+ */
+
+ if (H5Sclose( sid_3 ) < 0)
+ return -1;
+ if (H5Tclose( tid_3 ) < 0)
+ return -1;
+ if (H5Pclose( pid_3 ) < 0)
+ return -1;
+ if (H5Dclose( did_3 ) < 0)
+ return -1;
+
+ /* Release resources. */
+ free( tmp_buf );
+ free( tmp_fill_buf );
+ free( src_offset );
+ free( src_sizes );
+
+ return 0;
+
+ /* error zone */
out:
- H5Dclose( dataset_id1 );
- return -1;
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did_1);
+ H5Sclose(sid_1);
+ H5Tclose(tid_1);
+ H5Pclose(pid_1);
+ H5Dclose(did_2);
+ H5Sclose(sid_2);
+ H5Tclose(tid_2);
+ H5Pclose(pid_2);
+ H5Dclose(did_3);
+ H5Sclose(sid_3);
+ H5Tclose(tid_3);
+ H5Pclose(pid_3);
+ } H5E_END_TRY;
+ return -1;
}
-
-
/*-------------------------------------------------------------------------
- * Function: H5TBinsert_field
- *
- * Purpose: Inserts a field
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: January 30, 2002
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5TBinsert_field
+*
+* Purpose: Inserts a field
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: January 30, 2002
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5TBinsert_field( hid_t loc_id,
- const char *dset_name,
- const char *field_name,
- hid_t field_type,
- hsize_t position,
- const void *fill_data,
- const void *data )
+ const char *dset_name,
+ const char *field_name,
+ hid_t field_type,
+ hsize_t position,
+ const void *fill_data,
+ const void *buf )
{
+ /* identifiers for the 1st, original dataset */
+ hid_t did_1;
+ hid_t tid_1;
+ hid_t sid_1;
+ hid_t pid_1;
+ hid_t msid_1;
+ /* identifiers for the 2nd, new dataset */
+ hid_t did_2;
+ hid_t tid_2;
+ hid_t sid_2;
+ hid_t pid_2;
+ hid_t msid_2;
+ hid_t member_type_id;
+ size_t member_size;
+ size_t new_member_size = 0;
+ char *member_name;
+ size_t total_size;
+ hsize_t nfields;
+ hsize_t nrecords;
+ hsize_t dims_chunk[1];
+ hsize_t dims[1];
+ hsize_t maxdims[1] = { H5S_UNLIMITED };
+ hsize_t count[1];
+ hsize_t offset[1];
+ hsize_t mem_size[1];
+ hid_t write_type_id;
+ hid_t preserve_id;
+ size_t curr_offset;
+ int inserted;
+ hsize_t idx;
+ char table_title[255];
+ size_t member_offset;
+ char attr_name[255];
+ hid_t attr_id;
+ char aux[255];
+ unsigned char *tmp_buf;
+ unsigned char *tmp_fill_buf;
+ hsize_t i;
+
+ /* get the number of records and fields */
+ if (H5TBget_table_info ( loc_id, dset_name, &nfields, &nrecords ) < 0)
+ return -1;
+
+ /*-------------------------------------------------------------------------
+ * get information about the old data type
+ *-------------------------------------------------------------------------
+ */
+
+ /* open the dataset. */
+ if ((did_1 = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ return -1;
+
+ /* get creation properties list */
+ if ((pid_1 = H5Dget_create_plist( did_1 )) < 0)
+ goto out;
+
+ /* get the datatype */
+ if ((tid_1 = H5Dget_type( did_1 )) < 0)
+ goto out;
+
+ /* get the size of the datatype */
+ if (( total_size = H5Tget_size( tid_1 )) == 0 )
+ goto out;
+
+ /* get the dataspace handle */
+ if ((sid_1 = H5Dget_space( did_1 )) < 0)
+ goto out;
+
+ /* get dimension */
+ if (H5Sget_simple_extent_dims( sid_1, dims, NULL) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * get attributes
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the table title */
+ if ((H5TBAget_title( did_1, table_title )) < 0)
+ goto out;
+
+ /* alloc fill value attribute buffer */
+ tmp_fill_buf = (unsigned char *)malloc(total_size );
+
+ /* get the fill value attributes */
+ if ((H5TBAget_fill( loc_id, dset_name, did_1, tmp_fill_buf )) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * create a new data type
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the new member size */
+ member_size = H5Tget_size( field_type );
+
+ /* create the data type. */
+ if (( tid_2 = H5Tcreate (H5T_COMPOUND,(size_t)(total_size + member_size) )) < 0)
+ goto out;
+
+ curr_offset = 0;
+ inserted = 0;
+
+ /* insert the old fields, counting with the new one */
+ for ( i = 0; i < nfields + 1; i++)
+ {
+ idx = i;
+ if (inserted )
+ idx = i - 1;
- /* Identifiers for the 1st, original dataset */
- hid_t dataset_id1;
- hid_t type_id1;
- hid_t space_id1;
- hid_t plist_id1;
- hid_t mem_space_id1;
-
- /* Identifiers for the 2nd, new dataset */
- hid_t dataset_id2;
- hid_t type_id2;
- hid_t space_id2;
- hid_t plist_id2;
- hid_t mem_space_id2;
-
- hid_t member_type_id;
- size_t member_size;
- size_t new_member_size = 0;
- char *member_name;
- size_t total_size;
- hsize_t nfields;
- hsize_t nrecords;
- hsize_t dims_chunk[1];
- hsize_t dims[1];
- hsize_t maxdims[1] = { H5S_UNLIMITED };
- hsize_t count[1];
- hsize_t offset[1];
- hsize_t mem_size[1];
- hid_t write_type_id;
- hid_t PRESERVE;
- size_t curr_offset;
- int inserted;
- hsize_t idx;
- char table_title[255];
- size_t member_offset;
- char attr_name[255];
- hid_t attr_id;
- char aux[255];
- unsigned char *tmp_buf;
- unsigned char *tmp_fill_buf;
- hsize_t i;
-
- /* Get the number of records and fields */
- if(H5TBget_table_info ( loc_id, dset_name, &nfields, &nrecords ) < 0)
- return -1;
-
-/*-------------------------------------------------------------------------
- * Get information about the old data type
- *-------------------------------------------------------------------------
- */
-
- /* Open the dataset. */
- if((dataset_id1 = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- return -1;
-
- /* Get creation properties list */
- if((plist_id1 = H5Dget_create_plist( dataset_id1 )) < 0)
- goto out;
-
- /* Get the datatype */
- if((type_id1 = H5Dget_type( dataset_id1 )) < 0)
- goto out;
-
- /* Get the size of the datatype */
- if(( total_size = H5Tget_size( type_id1 )) == 0 )
- goto out;
-
- /* Get the dataspace handle */
- if((space_id1 = H5Dget_space( dataset_id1 )) < 0)
- goto out;
-
- /* Get dimension */
- if(H5Sget_simple_extent_dims( space_id1, dims, NULL) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * Get attributes
- *-------------------------------------------------------------------------
- */
-
- /* Get the table title */
- if((H5TBAget_title( dataset_id1, table_title )) < 0)
- goto out;
-
- /* alloc fill value attribute buffer */
- tmp_fill_buf = (unsigned char *)malloc(total_size );
-
- /* Get the fill value attributes */
- if((H5TBAget_fill( loc_id, dset_name, dataset_id1, tmp_fill_buf )) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * Create a new data type
- *-------------------------------------------------------------------------
- */
-
- /* Get the new member size */
- member_size = H5Tget_size( field_type );
-
- /* Create the data type. */
- if (( type_id2 = H5Tcreate (H5T_COMPOUND,(size_t)(total_size + member_size) )) < 0)
- goto out;
-
- curr_offset = 0;
- inserted = 0;
-
- /* Insert the old fields, counting with the new one */
- for ( i = 0; i < nfields + 1; i++)
- {
- idx = i;
- if(inserted )
- idx = i - 1;
-
- if(i == position ) {
- /* Get the new member size */
- new_member_size = H5Tget_size( field_type );
-
- /* Insert the new field type */
- if(H5Tinsert( type_id2, field_name, curr_offset, field_type ) < 0)
- goto out;
-
- curr_offset += new_member_size;
-
- inserted = 1;
-
- continue;
- }
-
- /* Get the member name */
- member_name = H5Tget_member_name( type_id1, (unsigned)idx );
-
- /* Get the member type */
- if(( member_type_id = H5Tget_member_type( type_id1,(unsigned)idx )) < 0)
- goto out;
-
- /* Get the member size */
- member_size = H5Tget_size( member_type_id );
-
- /* Insert it into the new type */
- if(H5Tinsert( type_id2, member_name, curr_offset, member_type_id ) < 0)
- goto out;
-
- curr_offset += member_size;
-
- free( member_name );
-
- /* Close the member type */
- if(H5Tclose( member_type_id ) < 0)
- goto out;
- } /* i */
-
-/*-------------------------------------------------------------------------
- * Create a new temporary dataset
- *-------------------------------------------------------------------------
- */
-
- /* Retrieve the size of chunk */
- if(H5Pget_chunk(plist_id1, 1, dims_chunk) < 0)
- goto out;
-
- /* Create a new simple data space with unlimited size, using the dimension */
- if((space_id2 = H5Screate_simple( 1, dims, maxdims)) < 0)
- return -1;
-
- /* Modify dataset creation properties, i.e. enable chunking */
- plist_id2 = H5Pcreate(H5P_DATASET_CREATE);
- if(H5Pset_chunk(plist_id2, 1, dims_chunk) < 0)
- return -1;
-
- /* Create the dataset. */
- if((dataset_id2 = H5Dcreate2(loc_id, "new", type_id2, space_id2, H5P_DEFAULT, plist_id2, H5P_DEFAULT)) < 0)
- goto out;
-
-
-/*-------------------------------------------------------------------------
- * Read data from 1st table
- *-------------------------------------------------------------------------
- */
-
- tmp_buf = (unsigned char *)calloc((size_t)nrecords, (size_t)total_size);
-
- /* Define a hyperslab in the dataset of the size of the records */
- offset[0] = 0;
- count[0] = nrecords;
- if(H5Sselect_hyperslab(space_id1, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
- goto out;
-
- /* Create a memory dataspace handle */
- mem_size[0] = count[0];
- if((mem_space_id1 = H5Screate_simple(1, mem_size, NULL)) < 0)
- goto out;
-
- if(H5Dread(dataset_id1, type_id1, mem_space_id1, H5S_ALL, H5P_DEFAULT, tmp_buf) < 0)
- goto out;
-
-
-/*-------------------------------------------------------------------------
- * Save data from 1st table into new table, using the 1st type id
- *-------------------------------------------------------------------------
- */
+ if (i == position )
+ {
+ /* get the new member size */
+ new_member_size = H5Tget_size( field_type );
- /* Write */
- if(H5Dwrite( dataset_id2, type_id1, mem_space_id1, H5S_ALL, H5P_DEFAULT, tmp_buf ) < 0)
- goto out;
+ /* insert the new field type */
+ if (H5Tinsert( tid_2, field_name, curr_offset, field_type ) < 0)
+ goto out;
+ curr_offset += new_member_size;
-/*-------------------------------------------------------------------------
- * Save the function supplied data of the new field
- *-------------------------------------------------------------------------
- */
+ inserted = 1;
+ continue;
+ }
- /* Create a write id */
- if(( write_type_id = H5Tcreate( H5T_COMPOUND, (size_t)new_member_size )) < 0)
- goto out;
+ /* get the member name */
+ member_name = H5Tget_member_name( tid_1, (unsigned)idx );
- /* The field in the file is found by its name */
- if(H5Tinsert( write_type_id, field_name, (size_t)0, field_type ) < 0)
- goto out;
+ /* get the member type */
+ if (( member_type_id = H5Tget_member_type( tid_1,(unsigned)idx )) < 0)
+ goto out;
- /* Create xfer properties to preserve initialized data */
- if ((PRESERVE = H5Pcreate (H5P_DATASET_XFER)) < 0)
- goto out;
- if (H5Pset_preserve (PRESERVE, 1) < 0)
- goto out;
+ /* get the member size */
+ member_size = H5Tget_size( member_type_id );
- /* Only write if there is something to write */
- if(data )
- {
+ /* insert it into the new type */
+ if (H5Tinsert( tid_2, member_name, curr_offset, member_type_id ) < 0)
+ goto out;
- /* Create a memory dataspace handle */
- if((mem_space_id2 = H5Screate_simple( 1, mem_size, NULL )) < 0)
- goto out;
+ curr_offset += member_size;
- /* Write */
- if(H5Dwrite( dataset_id2, write_type_id, mem_space_id2, space_id2, PRESERVE, data ) < 0)
- goto out;
+ free( member_name );
- /* Terminate access to the memory dataspace */
- if(H5Sclose( mem_space_id2 ) < 0)
- goto out;
- }
+ /* close the member type */
+ if(H5Tclose( member_type_id ) < 0)
+ goto out;
- /* End access to the property list */
- if(H5Pclose( PRESERVE ) < 0)
- goto out;
+ } /* i */
+ /*-------------------------------------------------------------------------
+ * create a new temporary dataset
+ *-------------------------------------------------------------------------
+ */
+ /* retrieve the size of chunk */
+ if (H5Pget_chunk(pid_1, 1, dims_chunk) < 0)
+ goto out;
-/*-------------------------------------------------------------------------
- * Release resources from 1st table
- *-------------------------------------------------------------------------
- */
+ /* create a new simple data space with unlimited size, using the dimension */
+ if ((sid_2 = H5Screate_simple( 1, dims, maxdims)) < 0)
+ return -1;
- /* Terminate access to the memory dataspace */
- if(H5Sclose( mem_space_id1 ) < 0)
- goto out;
+ /* modify dataset creation properties, i.e. enable chunking */
+ pid_2 = H5Pcreate(H5P_DATASET_CREATE);
+ if (H5Pset_chunk(pid_2, 1, dims_chunk) < 0)
+ return -1;
- /* Release the datatype. */
- if(H5Tclose( type_id1 ) < 0)
- goto out;
+ /* create the dataset. */
+ if ((did_2 = H5Dcreate2(loc_id, "new", tid_2, sid_2, H5P_DEFAULT, pid_2, H5P_DEFAULT)) < 0)
+ goto out;
- /* Terminate access to a property list */
- if(H5Pclose( plist_id1 ) < 0)
- goto out;
+ /*-------------------------------------------------------------------------
+ * read data from 1st table
+ *-------------------------------------------------------------------------
+ */
- /* Terminate access to the data space */
- if(H5Sclose( space_id1 ) < 0)
- goto out;
+ tmp_buf = (unsigned char *)calloc((size_t)nrecords, (size_t)total_size);
- /* End access to the dataset */
- if(H5Dclose( dataset_id1 ) < 0)
- goto out;
+ /* define a hyperslab in the dataset of the size of the records */
+ offset[0] = 0;
+ count[0] = nrecords;
+ if (H5Sselect_hyperslab(sid_1, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
+ goto out;
+ /* create a memory dataspace handle */
+ mem_size[0] = count[0];
+ if ((msid_1 = H5Screate_simple(1, mem_size, NULL)) < 0)
+ goto out;
-/*-------------------------------------------------------------------------
- * Release resources from 2nd table
- *-------------------------------------------------------------------------
- */
+ if (H5Dread(did_1, tid_1, msid_1, H5S_ALL, H5P_DEFAULT, tmp_buf) < 0)
+ goto out;
- /* Terminate access to the dataspace */
- if(H5Sclose( space_id2 ) < 0)
- goto out;
+ /*-------------------------------------------------------------------------
+ * save data from 1st table into new table, using the 1st type id
+ *-------------------------------------------------------------------------
+ */
- /* Release the datatype. */
- if(H5Tclose( type_id2 ) < 0)
- return -1;
+ /* write */
+ if (H5Dwrite( did_2, tid_1, msid_1, H5S_ALL, H5P_DEFAULT, tmp_buf ) < 0)
+ goto out;
- /* Terminate access to a property list */
- if(H5Pclose( plist_id2 ) < 0)
- goto out;
+ /*-------------------------------------------------------------------------
+ * save the function supplied data of the new field
+ *-------------------------------------------------------------------------
+ */
- /* End access to the dataset */
- if(H5Dclose( dataset_id2 ) < 0)
- return -1;
-/*-------------------------------------------------------------------------
- * Delete 1st table
- *-------------------------------------------------------------------------
- */
- if(H5Ldelete( loc_id, dset_name, H5P_DEFAULT ) < 0)
- return -1;
-
-/*-------------------------------------------------------------------------
- * Rename 2nd table
- *-------------------------------------------------------------------------
- */
+ /* create a write id */
+ if (( write_type_id = H5Tcreate( H5T_COMPOUND, (size_t)new_member_size )) < 0)
+ goto out;
- if(H5Lmove( loc_id, "new", H5L_SAME_LOC, dset_name, H5P_DEFAULT, H5P_DEFAULT ) < 0)
- return -1;
+ /* the field in the file is found by its name */
+ if (H5Tinsert( write_type_id, field_name, (size_t)0, field_type ) < 0)
+ goto out;
-/*-------------------------------------------------------------------------
- * Attach the conforming table attributes
- *-------------------------------------------------------------------------
- */
+ /* create xfer properties to preserve initialized data */
+ if ((preserve_id = H5Pcreate (H5P_DATASET_XFER)) < 0)
+ goto out;
+ if (H5Pset_preserve (preserve_id, 1) < 0)
+ goto out;
- /* Get the number of records and fields */
- if(H5TBget_table_info ( loc_id, dset_name, &nfields, &nrecords ) < 0)
- return -1;
-
- /* Open the dataset. */
- if((dataset_id1 = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- return -1;
-
- /* Get the datatype */
- if((type_id1 = H5Dget_type( dataset_id1 )) < 0)
- goto out;
-
- /* Set the attributes */
- if(H5TB_attach_attributes( table_title, loc_id, dset_name,(hsize_t) nfields, type_id1 ) < 0)
- return -1;
-/*-------------------------------------------------------------------------
- * Attach the fill attributes from previous table
- *-------------------------------------------------------------------------
- */
-
- if (( space_id1 = H5Screate(H5S_SCALAR)) < 0)
- goto out;
-
- for ( i = 0; i < nfields-1; i++)
- {
- /* Get the member type */
- if(( member_type_id = H5Tget_member_type( type_id1, (unsigned) i )) < 0)
- goto out;
+ /* only write if there is something to write */
+ if ( buf )
+ {
+ /* create a memory dataspace handle */
+ if ((msid_2 = H5Screate_simple( 1, mem_size, NULL )) < 0)
+ goto out;
- /* Get the member offset */
- member_offset = H5Tget_member_offset(type_id1, (unsigned)i);
+ /* write */
+ if (H5Dwrite( did_2, write_type_id, msid_2, sid_2, preserve_id, buf ) < 0)
+ goto out;
- strcpy(attr_name, "FIELD_");
- sprintf(aux, "%d", (int)i);
- strcat(attr_name, aux);
- sprintf(aux, "%s", "_FILL");
- strcat(attr_name, aux);
+ /* terminate access to the memory dataspace */
+ if (H5Sclose( msid_2 ) < 0)
+ goto out;
+ }
- if((attr_id = H5Acreate2(dataset_id1, attr_name, member_type_id, space_id1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
+ /* end access to the property list */
+ if (H5Pclose( preserve_id ) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * release resources from 1st table
+ *-------------------------------------------------------------------------
+ */
+
+ if (H5Sclose( msid_1 ) < 0)
+ goto out;
+ if (H5Tclose( tid_1 ) < 0)
+ goto out;
+ if (H5Pclose( pid_1 ) < 0)
+ goto out;
+ if (H5Sclose( sid_1 ) < 0)
+ goto out;
+ if (H5Dclose( did_1 ) < 0)
+ goto out;
+
+
+ /*-------------------------------------------------------------------------
+ * release resources from 2nd table
+ *-------------------------------------------------------------------------
+ */
+
+ if (H5Sclose( sid_2 ) < 0)
+ goto out;
+ if (H5Tclose( tid_2 ) < 0)
+ goto out;
+ if (H5Pclose( pid_2 ) < 0)
+ goto out;
+ if (H5Dclose( did_2 ) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * delete 1st table
+ *-------------------------------------------------------------------------
+ */
+ if (H5Ldelete( loc_id, dset_name, H5P_DEFAULT ) < 0)
+ return -1;
+
+ /*-------------------------------------------------------------------------
+ * rename 2nd table
+ *-------------------------------------------------------------------------
+ */
+
+ if (H5Lmove( loc_id, "new", H5L_SAME_LOC, dset_name, H5P_DEFAULT, H5P_DEFAULT ) < 0)
+ return -1;
+
+ /*-------------------------------------------------------------------------
+ * attach the conforming table attributes
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the number of records and fields */
+ if (H5TBget_table_info ( loc_id, dset_name, &nfields, &nrecords ) < 0)
+ return -1;
+
+ /* open the dataset. */
+ if ((did_1 = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ return -1;
+
+ /* get the datatype */
+ if ((tid_1 = H5Dget_type( did_1 )) < 0)
+ goto out;
+
+ /* set the attributes */
+ if (H5TB_attach_attributes( table_title, loc_id, dset_name,(hsize_t) nfields, tid_1 ) < 0)
+ return -1;
+
+ /*-------------------------------------------------------------------------
+ * attach the fill attributes from previous table
+ *-------------------------------------------------------------------------
+ */
+
+ if (( sid_1 = H5Screate(H5S_SCALAR)) < 0)
+ goto out;
+
+ for ( i = 0; i < nfields-1; i++)
+ {
+ /* get the member type */
+ if(( member_type_id = H5Tget_member_type( tid_1, (unsigned) i )) < 0)
+ goto out;
- if(H5Awrite(attr_id, member_type_id, tmp_fill_buf+member_offset) < 0)
- goto out;
+ /* get the member offset */
+ member_offset = H5Tget_member_offset(tid_1, (unsigned)i);
- if(H5Aclose(attr_id) < 0)
- goto out;
+ strcpy(attr_name, "FIELD_");
+ sprintf(aux, "%d", (int)i);
+ strcat(attr_name, aux);
+ sprintf(aux, "%s", "_FILL");
+ strcat(attr_name, aux);
- /* Close the member type */
- if(H5Tclose(member_type_id) < 0)
- goto out;
- }
+ if ((attr_id = H5Acreate2(did_1, attr_name, member_type_id, sid_1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
-/*-------------------------------------------------------------------------
- * Attach the fill attribute from the new field, if present
- *-------------------------------------------------------------------------
- */
- if(fill_data)
- {
+ if (H5Awrite(attr_id, member_type_id, tmp_fill_buf+member_offset) < 0)
+ goto out;
- strcpy(attr_name, "FIELD_");
- sprintf(aux, "%d",(int)(nfields - 1));
- strcat(attr_name, aux);
- sprintf(aux, "%s", "_FILL");
- strcat(attr_name, aux);
+ if (H5Aclose(attr_id) < 0)
+ goto out;
- /* Get the member type */
- if((member_type_id = H5Tget_member_type(type_id1, (unsigned)nfields - 1)) < 0)
- goto out;
+ /* close the member type */
+ if (H5Tclose(member_type_id) < 0)
+ goto out;
+ }
- if((attr_id = H5Acreate2(dataset_id1, attr_name, member_type_id, space_id1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
+ /*-------------------------------------------------------------------------
+ * attach the fill attribute from the new field, if present
+ *-------------------------------------------------------------------------
+ */
+ if (fill_data)
+ {
- if(H5Awrite(attr_id, member_type_id, fill_data) < 0)
- goto out;
+ strcpy(attr_name, "FIELD_");
+ sprintf(aux, "%d",(int)(nfields - 1));
+ strcat(attr_name, aux);
+ sprintf(aux, "%s", "_FILL");
+ strcat(attr_name, aux);
- if(H5Aclose(attr_id) < 0)
- goto out;
+ /* get the member type */
+ if ((member_type_id = H5Tget_member_type(tid_1, (unsigned)nfields - 1)) < 0)
+ goto out;
- if(H5Tclose(member_type_id) < 0)
- goto out;
+ if ((attr_id = H5Acreate2(did_1, attr_name, member_type_id, sid_1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
- }
+ if (H5Awrite(attr_id, member_type_id, fill_data) < 0)
+ goto out;
- /* Close data space. */
- if(H5Sclose( space_id1 ) < 0)
- goto out;
+ if (H5Aclose(attr_id) < 0)
+ goto out;
- /* Release the datatype. */
- if(H5Tclose( type_id1 ) < 0)
- goto out;
+ if (H5Tclose(member_type_id) < 0)
+ goto out;
- /* End access to the dataset */
- if(H5Dclose( dataset_id1 ) < 0)
- goto out;
+ }
- /* Release resources. */
- free ( tmp_buf );
- free ( tmp_fill_buf );
+ /* close */
+ if (H5Sclose( sid_1 ) < 0)
+ goto out;
+ if (H5Tclose( tid_1 ) < 0)
+ goto out;
+ if (H5Dclose( did_1 ) < 0)
+ goto out;
+ /* release resources. */
+ free ( tmp_buf );
+ free ( tmp_fill_buf );
-return 0;
+ return 0;
+ /* error zone */
out:
- H5Dclose( dataset_id1 );
- return -1;
-}
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did_1);
+ H5Sclose(sid_1);
+ H5Tclose(tid_1);
+ H5Pclose(pid_1);
+ H5Dclose(did_2);
+ H5Sclose(sid_2);
+ H5Tclose(tid_2);
+ H5Pclose(pid_2);
+
+ } H5E_END_TRY;
+ return -1;
+}
/*-------------------------------------------------------------------------
- * Function: H5TBdelete_field
- *
- * Purpose: Deletes a field
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: January 30, 2002
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5TBdelete_field
+*
+* Purpose: Deletes a field
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: January 30, 2002
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5TBdelete_field( hid_t loc_id,
- const char *dset_name,
- const char *field_name )
+ const char *dset_name,
+ const char *field_name )
{
+ /* identifiers for the 1st original dataset */
+ hid_t did_1;
+ hid_t tid_1;
+ hid_t sid_1;
+ hid_t pid_1;
+ /* identifiers for the 2nd new dataset */
+ hid_t did_2;
+ hid_t tid_2;
+ hid_t sid_2;
+ hid_t pid_2;
+ hid_t member_type_id;
+ size_t member_size;
+ char *member_name;
+ size_t type_size1;
+ size_t type_size2;
+ hsize_t nfields;
+ hsize_t nrecords;
+ hsize_t dims_chunk[1];
+ hsize_t dims[1];
+ hsize_t maxdims[1] = { H5S_UNLIMITED };
+ hid_t preserve_id;
+ size_t curr_offset;
+ size_t delete_member_size = 0;
+ hid_t read_type_id;
+ hid_t write_type_id;
+ unsigned char *tmp_buf;
+ unsigned char *tmp_fill_buf;
+ char attr_name[255];
+ char aux[255];
+ char table_title[255];
+ size_t member_offset;
+ hid_t attr_id;
+ hsize_t i;
+ int has_fill=0;
+
+ /* get the number of records and fields */
+ if (H5TBget_table_info ( loc_id, dset_name, &nfields, &nrecords ) < 0)
+ return -1;
+
+ /*-------------------------------------------------------------------------
+ * get information about the old data type
+ *-------------------------------------------------------------------------
+ */
+
+ /* open the dataset. */
+ if ((did_1 = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ return -1;
+
+ /* get creation properties list */
+ if ((pid_1 = H5Dget_create_plist( did_1 )) < 0)
+ goto out;
+
+ /* get the datatype */
+ if ((tid_1 = H5Dget_type( did_1 )) < 0)
+ goto out;
+
+ /* get the size of the datatype */
+ type_size1 = H5Tget_size( tid_1 );
+
+ /* get the dataspace handle */
+ if ((sid_1 = H5Dget_space( did_1 )) < 0)
+ goto out;
+
+ /* get dimension */
+ if (H5Sget_simple_extent_dims( sid_1, dims, NULL) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * create a new data type; first we find the size of the datatype to delete
+ *-------------------------------------------------------------------------
+ */
+
+ /* check out the field */
+ for ( i = 0; i < nfields; i++)
+ {
+ /* get the member name */
+ member_name = H5Tget_member_name( tid_1,(unsigned) i );
+
+ /* we want to find the field to delete */
+ if (H5TB_find_field( member_name, field_name ) > 0 )
+ {
+ /* get the member type */
+ if (( member_type_id = H5Tget_member_type( tid_1,(unsigned) i )) < 0)
+ goto out;
+
+ /* get the member size */
+ delete_member_size = H5Tget_size( member_type_id );
+
+ /* close the member type */
+ if (H5Tclose( member_type_id ) < 0)
+ goto out;
+
+ free( member_name );
+
+ break;
+
+ }
+
+ free( member_name );
+
+ } /* i */
+
+ /* no field to delete was found */
+ if (delete_member_size == 0 )
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * create a new data type; we now insert all the fields into the new type
+ *-------------------------------------------------------------------------
+ */
+
+ type_size2 = type_size1 - delete_member_size;
+
+ /* create the data type. */
+ if (( tid_2 = H5Tcreate (H5T_COMPOUND, type_size2 )) < 0)
+ goto out;
+
+ curr_offset = 0;
+
+ /* alloc fill value attribute buffer */
+ tmp_fill_buf = (unsigned char *)malloc((size_t) type_size2 );
+
+ /*-------------------------------------------------------------------------
+ * get attributes from previous table in the process
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the table title */
+ if ((H5TBAget_title( did_1, table_title )) < 0)
+ goto out;
+
+ /* insert the old fields except the one to delete */
+ for ( i = 0; i < nfields; i++)
+ {
+ /* get the member name */
+ member_name = H5Tget_member_name( tid_1, (unsigned) i );
+
+ /* we want to skip the field to delete */
+ if (H5TB_find_field( member_name, field_name ) > 0 )
+ {
+ free( member_name );
+ continue;
+ }
- /* Identifiers for the 1st original dataset */
- hid_t dataset_id1;
- hid_t type_id1;
- hid_t space_id1;
- hid_t plist_id1;
-
- /* Identifiers for the 2nd new dataset */
- hid_t dataset_id2;
- hid_t type_id2;
- hid_t space_id2;
- hid_t plist_id2;
-
- hid_t member_type_id;
- size_t member_size;
- char *member_name;
- size_t type_size1;
- size_t type_size2;
- hsize_t nfields;
- hsize_t nrecords;
- hsize_t dims_chunk[1];
- hsize_t dims[1];
- hsize_t maxdims[1] = { H5S_UNLIMITED };
- hid_t PRESERVE;
- size_t curr_offset;
- size_t delete_member_size = 0;
- hid_t read_type_id;
- hid_t write_type_id;
- unsigned char *tmp_buf;
- unsigned char *tmp_fill_buf;
- char attr_name[255];
- char aux[255];
- char table_title[255];
- size_t member_offset;
- hid_t attr_id;
- hsize_t i;
- int has_fill=0;
-
- /* Get the number of records and fields */
- if(H5TBget_table_info ( loc_id, dset_name, &nfields, &nrecords ) < 0)
- return -1;
-
-/*-------------------------------------------------------------------------
- * Get information about the old data type
- *-------------------------------------------------------------------------
- */
-
- /* Open the dataset. */
- if((dataset_id1 = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- return -1;
-
- /* Get creation properties list */
- if((plist_id1 = H5Dget_create_plist( dataset_id1 )) < 0)
- goto out;
-
- /* Get the datatype */
- if((type_id1 = H5Dget_type( dataset_id1 )) < 0)
- goto out;
-
- /* Get the size of the datatype */
- type_size1 = H5Tget_size( type_id1 );
-
- /* Get the dataspace handle */
- if((space_id1 = H5Dget_space( dataset_id1 )) < 0)
- goto out;
-
- /* Get dimension */
- if(H5Sget_simple_extent_dims( space_id1, dims, NULL) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * Create a new data type; first we find the size of the datatype to delete
- *-------------------------------------------------------------------------
- */
-
- /* Check out the field */
- for ( i = 0; i < nfields; i++)
- {
-
- /* Get the member name */
- member_name = H5Tget_member_name( type_id1,(unsigned) i );
-
- /* We want to find the field to delete */
- if(H5TB_find_field( member_name, field_name ) > 0 )
- {
- /* Get the member type */
- if(( member_type_id = H5Tget_member_type( type_id1,(unsigned) i )) < 0)
- goto out;
-
- /* Get the member size */
- delete_member_size = H5Tget_size( member_type_id );
-
- /* Close the member type */
- if(H5Tclose( member_type_id ) < 0)
- goto out;
-
- free( member_name );
-
- break;
-
- }
-
- free( member_name );
-
- } /* i */
-
- /* No field to delete was found */
- if(delete_member_size == 0 )
- goto out;
-
-/*-------------------------------------------------------------------------
- * Create a new data type; we now insert all the fields into the new type
- *-------------------------------------------------------------------------
- */
-
- type_size2 = type_size1 - delete_member_size;
+ /* get the member type */
+ if (( member_type_id = H5Tget_member_type( tid_1, (unsigned)i )) < 0)
+ goto out;
- /* Create the data type. */
- if (( type_id2 = H5Tcreate (H5T_COMPOUND, type_size2 )) < 0)
- goto out;
+ /* get the member size */
+ member_size = H5Tget_size( member_type_id );
- curr_offset = 0;
+ /* insert it into the new type */
+ if (H5Tinsert( tid_2, member_name, curr_offset, member_type_id ) < 0)
+ goto out;
- /* alloc fill value attribute buffer */
- tmp_fill_buf = (unsigned char *)malloc((size_t) type_size2 );
+ /*-------------------------------------------------------------------------
+ * get the fill value information
+ *-------------------------------------------------------------------------
+ */
+
+ strcpy( attr_name, "FIELD_" );
+ sprintf( aux, "%d", (int)i );
+ strcat( attr_name, aux );
+ sprintf( aux, "%s", "_FILL" );
+ strcat( attr_name, aux );
-/*-------------------------------------------------------------------------
- * Get attributes from previous table in the process
- *-------------------------------------------------------------------------
- */
-
- /* Get the table title */
- if((H5TBAget_title( dataset_id1, table_title )) < 0)
- goto out;
-
- /* Insert the old fields except the one to delete */
- for ( i = 0; i < nfields; i++)
- {
-
- /* Get the member name */
- member_name = H5Tget_member_name( type_id1, (unsigned) i );
-
- /* We want to skip the field to delete */
- if(H5TB_find_field( member_name, field_name ) > 0 )
- {
- free( member_name );
- continue;
- }
-
- /* Get the member type */
- if(( member_type_id = H5Tget_member_type( type_id1, (unsigned)i )) < 0)
- goto out;
-
- /* Get the member size */
- member_size = H5Tget_size( member_type_id );
-
- /* Insert it into the new type */
- if(H5Tinsert( type_id2, member_name, curr_offset, member_type_id ) < 0)
- goto out;
-
- /*-------------------------------------------------------------------------
- * Get the fill value information
- *-------------------------------------------------------------------------
- */
+ /* check if we have the _FILL attribute */
+ has_fill = H5LT_find_attribute( did_1, attr_name );
+
+ /* get it */
+ if (has_fill == 1 )
+ {
+ if(H5LT_get_attribute_disk( did_1, attr_name, tmp_fill_buf+curr_offset ) < 0)
+ goto out;
+ }
- strcpy( attr_name, "FIELD_" );
- sprintf( aux, "%d", (int)i );
- strcat( attr_name, aux );
- sprintf( aux, "%s", "_FILL" );
- strcat( attr_name, aux );
+ curr_offset += member_size;
- /* Check if we have the _FILL attribute */
- has_fill = H5LT_find_attribute( dataset_id1, attr_name );
+ free(member_name);
- /* Get it */
- if(has_fill == 1 )
- {
- if(H5LT_get_attribute_disk( dataset_id1, attr_name, tmp_fill_buf+curr_offset ) < 0)
- goto out;
- }
+ /* close the member type */
+ if (H5Tclose(member_type_id) < 0)
+ goto out;
+ } /* i */
- curr_offset += member_size;
+ /*-------------------------------------------------------------------------
+ * create a new temporary dataset
+ *-------------------------------------------------------------------------
+ */
- free(member_name);
-
- /* Close the member type */
- if(H5Tclose(member_type_id) < 0)
- goto out;
- } /* i */
-
-/*-------------------------------------------------------------------------
- * Create a new temporary dataset
- *-------------------------------------------------------------------------
- */
-
- /* Retrieve the size of chunk */
- if(H5Pget_chunk(plist_id1, 1, dims_chunk) < 0)
- goto out;
-
- /* Create a new simple data space with unlimited size, using the dimension */
- if((space_id2 = H5Screate_simple(1, dims, maxdims)) < 0)
- return -1;
-
- /* Modify dataset creation properties, i.e. enable chunking */
- plist_id2 = H5Pcreate(H5P_DATASET_CREATE);
- if(H5Pset_chunk(plist_id2, 1, dims_chunk) < 0)
- return -1;
-
- /* Create the dataset. */
- if((dataset_id2 = H5Dcreate2(loc_id, "new", type_id2, space_id2, H5P_DEFAULT, plist_id2, H5P_DEFAULT)) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * We have to read field by field of the old dataset and save it into the new one
- *-------------------------------------------------------------------------
- */
- for ( i = 0; i < nfields; i++) {
- /* Get the member name */
- member_name = H5Tget_member_name(type_id1, (unsigned)i);
+ /* retrieve the size of chunk */
+ if (H5Pget_chunk(pid_1, 1, dims_chunk) < 0)
+ goto out;
- /* Skip the field to delete */
- if(H5TB_find_field(member_name, field_name) > 0) {
- free(member_name);
- continue;
- }
+ /* create a new simple data space with unlimited size, using the dimension */
+ if ((sid_2 = H5Screate_simple(1, dims, maxdims)) < 0)
+ return -1;
- /* Get the member type */
- if((member_type_id = H5Tget_member_type(type_id1, (unsigned)i)) < 0)
- goto out;
-
- /* Get the member size */
- member_size = H5Tget_size(member_type_id);
-
- /* Create a read id */
- if((read_type_id = H5Tcreate(H5T_COMPOUND, member_size)) < 0)
- goto out;
-
- /* Insert it into the new type */
- if(H5Tinsert( read_type_id, member_name, (size_t)0, member_type_id ) < 0)
- goto out;
-
- tmp_buf = (unsigned char *)calloc((size_t) nrecords, member_size );
-
- /* Read */
- if(H5Dread( dataset_id1, read_type_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, tmp_buf ) < 0)
- goto out;
-
- /* Create a write id */
- if(( write_type_id = H5Tcreate( H5T_COMPOUND, member_size )) < 0)
- goto out;
-
- /* The field in the file is found by its name */
- if(H5Tinsert( write_type_id, member_name, (size_t)0, member_type_id ) < 0)
- goto out;
-
- /* Create xfer properties to preserve initialized data */
- if ((PRESERVE = H5Pcreate (H5P_DATASET_XFER)) < 0)
- goto out;
- if (H5Pset_preserve (PRESERVE, 1) < 0)
- goto out;
-
- /* Write */
- if(H5Dwrite( dataset_id2, write_type_id, H5S_ALL, H5S_ALL, PRESERVE, tmp_buf ) < 0)
- goto out;
-
- /* End access to the property list */
- if(H5Pclose( PRESERVE ) < 0)
- goto out;
-
- /* Close the member type */
- if(H5Tclose( member_type_id ) < 0)
- goto out;
-
- /* Close the read type */
- if(H5Tclose( read_type_id ) < 0)
- goto out;
-
- /* Close the write type */
- if(H5Tclose( write_type_id ) < 0)
- goto out;
-
- /* Release resources. */
- free( member_name );
- free ( tmp_buf );
-
- } /* i */
-
-/*-------------------------------------------------------------------------
- * Release resources from 1st table
- *-------------------------------------------------------------------------
- */
-
- /* Release the datatype. */
- if(H5Tclose( type_id1 ) < 0)
- goto out;
-
- /* Terminate access to a property list */
- if(H5Pclose( plist_id1 ) < 0)
- goto out;
-
- /* Terminate access to the data space */
- if(H5Sclose( space_id1 ) < 0)
- goto out;
-
- /* End access to the dataset */
- if(H5Dclose( dataset_id1 ) < 0)
- goto out;
-
-
-/*-------------------------------------------------------------------------
- * Release resources from 2nd table
- *-------------------------------------------------------------------------
- */
-
- /* Terminate access to the dataspace */
- if(H5Sclose( space_id2 ) < 0)
- goto out;
-
- /* Release the datatype. */
- if(H5Tclose( type_id2 ) < 0)
- return -1;
-
- /* Terminate access to a property list */
- if(H5Pclose( plist_id2 ) < 0)
- goto out;
-
- /* End access to the dataset */
- if(H5Dclose( dataset_id2 ) < 0)
- return -1;
-
-/*-------------------------------------------------------------------------
- * Delete 1st table
- *-------------------------------------------------------------------------
- */
-
- if(H5Ldelete( loc_id, dset_name, H5P_DEFAULT ) < 0)
- return -1;
-
-/*-------------------------------------------------------------------------
- * Rename 2nd table
- *-------------------------------------------------------------------------
- */
-
- if(H5Lmove( loc_id, "new", H5L_SAME_LOC, dset_name, H5P_DEFAULT, H5P_DEFAULT ) < 0)
- return -1;
-
-/*-------------------------------------------------------------------------
- * Attach the conforming table attributes
- *-------------------------------------------------------------------------
- */
-
- /* Get the number of records and fields */
- if(H5TBget_table_info ( loc_id, dset_name, &nfields, &nrecords ) < 0)
- return -1;
-
- /* Open the dataset. */
- if((dataset_id1 = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- return -1;
-
- /* Get the datatype */
- if((type_id1 = H5Dget_type( dataset_id1 )) < 0)
- goto out;
-
- /* Set the attributes */
- if(H5TB_attach_attributes( table_title, loc_id, dset_name, nfields, type_id1 ) < 0)
- return -1;
-
-/*-------------------------------------------------------------------------
- * Attach the fill attributes from previous table
- *-------------------------------------------------------------------------
- */
-
- if(has_fill == 1)
- {
- if((space_id1 = H5Screate(H5S_SCALAR)) < 0)
- goto out;
+ /* modify dataset creation properties, i.e. enable chunking */
+ pid_2 = H5Pcreate(H5P_DATASET_CREATE);
+ if (H5Pset_chunk(pid_2, 1, dims_chunk) < 0)
+ return -1;
+
+ /* create the dataset. */
+ if ((did_2 = H5Dcreate2(loc_id, "new", tid_2, sid_2, H5P_DEFAULT, pid_2, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * we have to read field by field of the old dataset and save it into the new one
+ *-------------------------------------------------------------------------
+ */
+ for ( i = 0; i < nfields; i++)
+ {
+ /* get the member name */
+ member_name = H5Tget_member_name(tid_1, (unsigned)i);
+
+ /* skip the field to delete */
+ if (H5TB_find_field(member_name, field_name) > 0)
+ {
+ free(member_name);
+ continue;
+ }
+
+ /* get the member type */
+ if ((member_type_id = H5Tget_member_type(tid_1, (unsigned)i)) < 0)
+ goto out;
+
+ /* get the member size */
+ member_size = H5Tget_size(member_type_id);
+
+ /* create a read id */
+ if ((read_type_id = H5Tcreate(H5T_COMPOUND, member_size)) < 0)
+ goto out;
+
+ /* insert it into the new type */
+ if (H5Tinsert( read_type_id, member_name, (size_t)0, member_type_id ) < 0)
+ goto out;
+
+ tmp_buf = (unsigned char *)calloc((size_t) nrecords, member_size );
+
+ /* read */
+ if (H5Dread( did_1, read_type_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, tmp_buf ) < 0)
+ goto out;
+
+ /* create a write id */
+ if (( write_type_id = H5Tcreate( H5T_COMPOUND, member_size )) < 0)
+ goto out;
+
+ /* the field in the file is found by its name */
+ if (H5Tinsert( write_type_id, member_name, (size_t)0, member_type_id ) < 0)
+ goto out;
+
+ /* create xfer properties to preserve initialized data */
+ if ((preserve_id = H5Pcreate (H5P_DATASET_XFER)) < 0)
+ goto out;
+ if (H5Pset_preserve (preserve_id, 1) < 0)
+ goto out;
+
+ /* write */
+ if(H5Dwrite( did_2, write_type_id, H5S_ALL, H5S_ALL, preserve_id, tmp_buf ) < 0)
+ goto out;
+
+ /* end access to the property list */
+ if (H5Pclose( preserve_id ) < 0)
+ goto out;
+
+ /* close the member type */
+ if (H5Tclose( member_type_id ) < 0)
+ goto out;
+
+ /* close the read type */
+ if (H5Tclose( read_type_id ) < 0)
+ goto out;
+
+ /* close the write type */
+ if (H5Tclose( write_type_id ) < 0)
+ goto out;
+
+ /* release resources. */
+ free( member_name );
+ free ( tmp_buf );
+
+ } /* i */
+
+ /*-------------------------------------------------------------------------
+ * release resources from 1st table
+ *-------------------------------------------------------------------------
+ */
+
+ if (H5Tclose( tid_1 ) < 0)
+ goto out;
+ if (H5Pclose( pid_1 ) < 0)
+ goto out;
+ if (H5Sclose( sid_1 ) < 0)
+ goto out;
+ if (H5Dclose( did_1 ) < 0)
+ goto out;
+
+
+ /*-------------------------------------------------------------------------
+ * release resources from 2nd table
+ *-------------------------------------------------------------------------
+ */
+
+ if (H5Sclose( sid_2 ) < 0)
+ goto out;
+ if (H5Tclose( tid_2 ) < 0)
+ goto out;
+ if (H5Pclose( pid_2 ) < 0)
+ goto out;
+ if (H5Dclose( did_2 ) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * delete 1st table
+ *-------------------------------------------------------------------------
+ */
+
+ if (H5Ldelete( loc_id, dset_name, H5P_DEFAULT ) < 0)
+ return -1;
+
+ /*-------------------------------------------------------------------------
+ * rename 2nd table
+ *-------------------------------------------------------------------------
+ */
+
+ if (H5Lmove( loc_id, "new", H5L_SAME_LOC, dset_name, H5P_DEFAULT, H5P_DEFAULT ) < 0)
+ return -1;
+
+ /*-------------------------------------------------------------------------
+ * attach the conforming table attributes
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the number of records and fields */
+ if (H5TBget_table_info ( loc_id, dset_name, &nfields, &nrecords ) < 0)
+ return -1;
+
+ /* open the dataset. */
+ if ((did_1 = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ return -1;
+
+ /* get the datatype */
+ if ((tid_1 = H5Dget_type( did_1 )) < 0)
+ goto out;
+
+ /* set the attributes */
+ if (H5TB_attach_attributes( table_title, loc_id, dset_name, nfields, tid_1 ) < 0)
+ return -1;
+
+ /*-------------------------------------------------------------------------
+ * attach the fill attributes from previous table
+ *-------------------------------------------------------------------------
+ */
+
+ if (has_fill == 1)
+ {
+ if((sid_1 = H5Screate(H5S_SCALAR)) < 0)
+ goto out;
- for(i = 0; i < nfields; i++)
- {
+ for(i = 0; i < nfields; i++)
+ {
- /* Get the member type */
- if(( member_type_id = H5Tget_member_type( type_id1, (unsigned)i )) < 0)
- goto out;
+ /* get the member type */
+ if (( member_type_id = H5Tget_member_type( tid_1, (unsigned)i )) < 0)
+ goto out;
- /* Get the member offset */
- member_offset = H5Tget_member_offset(type_id1, (unsigned)i);
+ /* get the member offset */
+ member_offset = H5Tget_member_offset(tid_1, (unsigned)i);
- strcpy(attr_name, "FIELD_");
- sprintf(aux, "%d", (int)i);
- strcat(attr_name, aux);
- sprintf(aux, "%s", "_FILL");
- strcat(attr_name, aux);
+ strcpy(attr_name, "FIELD_");
+ sprintf(aux, "%d", (int)i);
+ strcat(attr_name, aux);
+ sprintf(aux, "%s", "_FILL");
+ strcat(attr_name, aux);
- if((attr_id = H5Acreate2(dataset_id1, attr_name, member_type_id, space_id1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
+ if ((attr_id = H5Acreate2(did_1, attr_name, member_type_id, sid_1, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
- if(H5Awrite(attr_id, member_type_id, tmp_fill_buf+member_offset) < 0)
- goto out;
+ if (H5Awrite(attr_id, member_type_id, tmp_fill_buf+member_offset) < 0)
+ goto out;
- if(H5Aclose(attr_id) < 0)
- goto out;
+ if (H5Aclose(attr_id) < 0)
+ goto out;
- /* Close the member type */
- if(H5Tclose(member_type_id) < 0)
- goto out;
- }
+ /* close the member type */
+ if (H5Tclose(member_type_id) < 0)
+ goto out;
+ }
- /* Close data space. */
- if(H5Sclose(space_id1) < 0)
- goto out;
+ /* close data space. */
+ if (H5Sclose(sid_1) < 0)
+ goto out;
- } /*has_fill*/
+ } /*has_fill*/
- /* Release the datatype. */
- if(H5Tclose( type_id1 ) < 0)
- goto out;
+ /* release the datatype. */
+ if (H5Tclose( tid_1 ) < 0)
+ goto out;
- /* End access to the dataset */
- if(H5Dclose( dataset_id1 ) < 0)
- goto out;
+ /* end access to the dataset */
+ if (H5Dclose( did_1 ) < 0)
+ goto out;
- /* Release resources. */
- free ( tmp_fill_buf );
+ /* Release resources. */
+ free ( tmp_fill_buf );
-return 0;
+ return 0;
+ /* error zone */
out:
- H5Dclose( dataset_id1 );
- return -1;
-}
-
-/*-------------------------------------------------------------------------
- *
- * Table attribute functions
- *
- *-------------------------------------------------------------------------
- */
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did_1);
+ H5Sclose(sid_1);
+ H5Tclose(tid_1);
+ H5Pclose(pid_1);
+ H5Dclose(did_2);
+ H5Sclose(sid_2);
+ H5Tclose(tid_2);
+ H5Pclose(pid_2);
+
+ } H5E_END_TRY;
+ return -1;
+}
/*-------------------------------------------------------------------------
- * Function: H5TBAget_title
- *
- * Purpose: Read the table title
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: January 30, 2001
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+*
+* Table attribute functions
+*
+*-------------------------------------------------------------------------
+*/
+
+/*-------------------------------------------------------------------------
+* Function: H5TBAget_title
+*
+* Purpose: Read the table title
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: January 30, 2001
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5TBAget_title( hid_t loc_id,
- char *table_title )
+ char *table_title )
{
- /* Get the TITLE attribute */
- if(H5LT_get_attribute_disk( loc_id, "TITLE", table_title ) < 0)
- return -1;
+ /* Get the TITLE attribute */
+ if(H5LT_get_attribute_disk( loc_id, "TITLE", table_title ) < 0)
+ return -1;
- return 0;
+ return 0;
}
/*-------------------------------------------------------------------------
- * Function: H5TBAget_fill
- *
- * Purpose: Read the table attribute fill values
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: January 30, 2002
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5TBAget_fill
+*
+* Purpose: Read the table attribute fill values
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: January 30, 2002
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5TBAget_fill( hid_t loc_id,
- const char *dset_name,
- hid_t dset_id,
- unsigned char *dst_buf )
+ const char *dset_name,
+ hid_t dset_id,
+ unsigned char *dst_buf )
{
- hsize_t nfields;
- hsize_t nrecords;
- char attr_name[255];
- char aux[255];
- hsize_t i;
- size_t *src_offset;
- int has_fill=0;
-
- /* Get the number of records and fields */
- if(H5TBget_table_info ( loc_id, dset_name, &nfields, &nrecords ) < 0)
- return -1;
-
- src_offset = (size_t *)malloc((size_t)nfields * sizeof(size_t));
+ hsize_t nfields;
+ hsize_t nrecords;
+ char attr_name[255];
+ char aux[255];
+ hsize_t i;
+ size_t *src_offset;
+ int has_fill=0;
- if (src_offset == NULL )
- return -1;
+ /* get the number of records and fields */
+ if (H5TBget_table_info ( loc_id, dset_name, &nfields, &nrecords ) < 0)
+ return -1;
- /* Get field info */
- if(H5TBget_field_info( loc_id, dset_name, NULL, NULL, src_offset, NULL ) < 0)
- goto out;
+ src_offset = (size_t *)malloc((size_t)nfields * sizeof(size_t));
- for ( i = 0; i < nfields; i++)
- {
- strcpy( attr_name, "FIELD_" );
- sprintf( aux, "%d", (int)i );
- strcat( attr_name, aux );
- sprintf( aux, "%s", "_FILL" );
- strcat( attr_name, aux );
+ if (src_offset == NULL )
+ return -1;
- /* Check if we have the _FILL attribute */
- has_fill = H5LT_find_attribute( dset_id, attr_name );
+ /* get field info */
+ if (H5TBget_field_info( loc_id, dset_name, NULL, NULL, src_offset, NULL ) < 0)
+ goto out;
- /* Get it */
- if(has_fill == 1 )
- {
- if(H5LT_get_attribute_disk( dset_id, attr_name, dst_buf+src_offset[i] ) < 0)
- goto out;
- }
+ for ( i = 0; i < nfields; i++)
+ {
+ strcpy( attr_name, "FIELD_" );
+ sprintf( aux, "%d", (int)i );
+ strcat( attr_name, aux );
+ sprintf( aux, "%s", "_FILL" );
+ strcat( attr_name, aux );
+
+ /* check if we have the _FILL attribute */
+ has_fill = H5LT_find_attribute( dset_id, attr_name );
+
+ /* get it */
+ if (has_fill == 1 )
+ {
+ if(H5LT_get_attribute_disk( dset_id, attr_name, dst_buf+src_offset[i] ) < 0)
+ goto out;
+ }
- }
+ }
- free( src_offset );
+ free( src_offset );
- return has_fill;
+ return has_fill;
out:
- free( src_offset );
- return -1;
+ free( src_offset );
+ return -1;
}
/*-------------------------------------------------------------------------
- *
- * Inquiry functions
- *
- *-------------------------------------------------------------------------
- */
-
-/*-------------------------------------------------------------------------
- * Function: H5TBget_table_info
- *
- * Purpose: Gets the number of records and fields of a table
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 19, 2001
- *
- * Comments:
- *
- * Modifications: May 08, 2003
- * In version 2.0 of Table, the number of records is stored as an
- * attribute "NROWS"
- *
- *
- *-------------------------------------------------------------------------
- */
+*
+* Inquiry functions
+*
+*-------------------------------------------------------------------------
+*/
+
+/*-------------------------------------------------------------------------
+* Function: H5TBget_table_info
+*
+* Purpose: Gets the number of records and fields of a table
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 19, 2001
+*
+* Comments:
+*
+* Modifications:
+* May 08, 2003
+* In version 2.0 of Table, the number of records is stored as an
+* attribute "NROWS"
+* November 24, 2008
+* In version 3.0 of Table, "NROWS" was deprecated
+*
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5TBget_table_info ( hid_t loc_id,
- const char *dset_name,
- hsize_t *nfields,
- hsize_t *nrecords )
+ const char *dset_name,
+ hsize_t *nfields,
+ hsize_t *nrecords )
{
- hid_t tid;
- hid_t sid=-1;
- hid_t did;
- int num_members;
- hsize_t dims[1];
- int has_attr;
- hsize_t n[1];
-
- /* Open the dataset. */
- if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- return -1;
-
- /* Get the datatype */
- if((tid = H5Dget_type( did )) < 0)
- goto out;
-
- /* Get the number of members */
- if((num_members = H5Tget_nmembers( tid )) < 0)
- goto out;
-
- if (nfields)
- *nfields = num_members;
+ hid_t tid=-1;
+ hid_t sid=-1;
+ hid_t did=-1;
+ int num_members;
+ hsize_t dims[1];
+
+ /* open the dataset. */
+ if ((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ return -1;
+
+ /* get the datatype */
+ if ((tid = H5Dget_type( did )) < 0)
+ goto out;
+
+ /* get the number of members */
+ if ((num_members = H5Tget_nmembers( tid )) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * get number of nfields
+ *-------------------------------------------------------------------------
+ */
+
+ if (nfields)
+ {
+ *nfields = num_members;
+ }
-/*-------------------------------------------------------------------------
- * Get number of records
- *-------------------------------------------------------------------------
- */
-
- if (nrecords)
- {
- /* Try to find the attribute "NROWS" */
- has_attr = H5LT_find_attribute( did, "NROWS" );
-
- /* It exists, get it */
- if(has_attr == 1 )
- {
- /* Get the attribute */
- if(H5LTget_attribute(loc_id,dset_name,"NROWS",H5T_NATIVE_LLONG,n) < 0)
- return -1;
+ /*-------------------------------------------------------------------------
+ * get number of records
+ *-------------------------------------------------------------------------
+ */
- /**nrecords = *n;*/
- *nrecords = n[0];
- }
- else
- {
- /* Get the dataspace handle */
- if((sid = H5Dget_space( did )) < 0)
- goto out;
+ if (nrecords)
+ {
+ /* get the dataspace handle */
+ if ((sid = H5Dget_space( did )) < 0)
+ goto out;
- /* Get records */
- if(H5Sget_simple_extent_dims( sid, dims, NULL) < 0)
- goto out;
+ /* get dimension */
+ if (H5Sget_simple_extent_dims( sid, dims, NULL) < 0)
+ goto out;
- /* Terminate access to the dataspace */
- if(H5Sclose( sid ) < 0)
- goto out;
+ /* terminate access to the dataspace */
+ if (H5Sclose( sid ) < 0)
+ goto out;
- *nrecords = dims[0];
- }
- }/*nrecords*/
+ *nrecords = dims[0];
+ }
- /* close */
- if(H5Tclose( tid ) < 0)
- goto out;
- if(H5Dclose( did ) < 0)
- return -1;
+ /* close */
+ if (H5Tclose( tid ) < 0)
+ goto out;
+ if (H5Dclose( did ) < 0)
+ return -1;
-return 0;
+ return 0;
-/* error zone, gracefully close */
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Dclose(did);
- H5Sclose(sid);
- H5Tclose(tid);
- } H5E_END_TRY;
- return -1;
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did);
+ H5Sclose(sid);
+ H5Tclose(tid);
+ } H5E_END_TRY;
+ return -1;
}
/*-------------------------------------------------------------------------
- * Function: H5TBget_field_info
- *
- * Purpose: Get information about fields
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 19, 2001
- *
- * Comments:
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5TBget_field_info
+*
+* Purpose: Get information about fields
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 19, 2001
+*
+* Comments:
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5TBget_field_info( hid_t loc_id,
- const char *dset_name,
- char *field_names[],
- size_t *field_sizes,
- size_t *field_offsets,
- size_t *type_size )
+ const char *dset_name,
+ char *field_names[],
+ size_t *field_sizes,
+ size_t *field_offsets,
+ size_t *type_size )
{
- hid_t did;
- hid_t ftype_id;
- hid_t native_type_id;
- hssize_t nfields;
- char *member_name;
- hid_t member_type_id;
- hid_t nativem_type_id;
- size_t member_size;
- size_t member_offset;
- size_t size;
- hssize_t i;
-
- /* Open the dataset. */
- if((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- goto out;
-
- /* Get the datatype */
- if(( ftype_id = H5Dget_type( did )) < 0)
- goto out;
-
- if ((native_type_id = H5Tget_native_type(ftype_id,H5T_DIR_DEFAULT)) < 0)
- goto out;
-
- /* Get the type size */
- size = H5Tget_size( native_type_id );
-
- if(type_size )
- *type_size = size;
-
- /* Get the number of members */
- if(( nfields = H5Tget_nmembers( ftype_id )) < 0)
- goto out;
+ hid_t did; /* dataset ID */
+ hid_t tid; /* file type ID */
+ hid_t n_tid; /* native type ID */
+ hid_t m_tid; /* member type ID */
+ hid_t nm_tid; /* native member ID */
+ hssize_t nfields;
+ char *member_name;
+ size_t member_size;
+ size_t member_offset;
+ size_t size;
+ hssize_t i;
+
+ /* open the dataset. */
+ if ((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the datatype */
+ if (( tid = H5Dget_type( did )) < 0)
+ goto out;
+
+ if ((n_tid = H5Tget_native_type(tid,H5T_DIR_DEFAULT)) < 0)
+ goto out;
+
+ /* get the type size */
+ size = H5Tget_size( n_tid );
+
+ if ( type_size )
+ {
+ *type_size = size;
+ }
- /* Iterate tru the members */
- for ( i = 0; i < nfields; i++)
- {
- /* Get the member name */
- member_name = H5Tget_member_name( ftype_id, (unsigned)i );
+ /* get the number of members */
+ if (( nfields = H5Tget_nmembers( tid )) < 0)
+ goto out;
- if(field_names )
- strcpy( field_names[i], member_name );
+ /* iterate tru the members */
+ for ( i = 0; i < nfields; i++)
+ {
+ /* get the member name */
+ member_name = H5Tget_member_name( tid, (unsigned)i );
- /* Get the member type */
- if(( member_type_id = H5Tget_member_type( ftype_id,(unsigned) i )) < 0)
- goto out;
- if ((nativem_type_id = H5Tget_native_type(member_type_id,H5T_DIR_DEFAULT)) < 0)
- goto out;
+ if (field_names )
+ {
+ strcpy( field_names[i], member_name );
+ }
- /* Get the member size */
- member_size = H5Tget_size( nativem_type_id );
+ /* get the member type */
+ if (( m_tid = H5Tget_member_type( tid,(unsigned) i )) < 0)
+ goto out;
+ if ((nm_tid = H5Tget_native_type(m_tid,H5T_DIR_DEFAULT)) < 0)
+ goto out;
- if(field_sizes )
- field_sizes[i] = member_size;
+ /* get the member size */
+ member_size = H5Tget_size( nm_tid );
- /* Get the member offset */
- member_offset = H5Tget_member_offset( native_type_id,(unsigned) i );
+ if(field_sizes )
+ {
+ field_sizes[i] = member_size;
+ }
- if(field_offsets )
- field_offsets[i] = member_offset;
+ /* get the member offset */
+ member_offset = H5Tget_member_offset( n_tid,(unsigned) i );
- /* Close the member type */
- if(H5Tclose( member_type_id ) < 0)
- goto out;
- if(H5Tclose( nativem_type_id ) < 0)
- goto out;
+ if(field_offsets )
+ {
+ field_offsets[i] = member_offset;
+ }
- free( member_name );
+ /* close the member types */
+ if (H5Tclose( m_tid ) < 0)
+ goto out;
+ if (H5Tclose( nm_tid ) < 0)
+ goto out;
- } /* i */
+ free( member_name );
- /* Release the datatype. */
- if(H5Tclose( ftype_id ) < 0)
- return -1;
- if(H5Tclose( native_type_id ) < 0)
- return -1;
+ } /* i */
- /* End access to the dataset */
- if(H5Dclose( did ) < 0)
- return -1;
+ /* close */
+ if (H5Tclose( tid ) < 0)
+ goto out;
+ if (H5Tclose( n_tid ) < 0)
+ goto out;
+ if (H5Dclose( did ) < 0)
+ return -1;
-return 0;
+ return 0;
+ /* error zone */
out:
- H5Dclose( did );
- return -1;
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did);
+ H5Tclose(tid);
+ H5Tclose(n_tid);
+ } H5E_END_TRY;
+ return -1;
}
/*-------------------------------------------------------------------------
- *
- * internal functions
- *
- *-------------------------------------------------------------------------
- */
+*
+* internal functions
+*
+*-------------------------------------------------------------------------
+*/
/*-------------------------------------------------------------------------
- * Function: H5TB_find_field
- *
- * Purpose: Find a string field
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: November 19, 2001
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5TB_find_field
+*
+* Purpose: Find a string field
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: November 19, 2001
+*
+*-------------------------------------------------------------------------
+*/
static
int H5TB_find_field( const char *field, const char *field_list )
{
const char *start = field_list;
const char *end;
-
- while ( (end = strstr( start, "," )) != 0 )
+
+ while ( (end = strstr( start, "," )) != 0 )
{
size_t count = end - start;
if(strncmp(start, field, count) == 0 && count == strlen(field) )
return 1;
start = end + 1;
}
-
+
if(strcmp( start, field ) == 0 )
return 1;
-
+
return -1;
-
+
}
/*-------------------------------------------------------------------------
- * Function: H5TB_attach_attributes
- *
- * Purpose: Private function that creates the conforming table attributes;
- * Used by H5TBcombine_tables; not used by H5TBmake_table, which does not read
- * the fill value attributes from an existing table
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: December 6, 2001
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5TB_attach_attributes
+*
+* Purpose: Private function that creates the conforming table attributes;
+* Used by H5TBcombine_tables; not used by H5TBmake_table, which does not read
+* the fill value attributes from an existing table
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: December 6, 2001
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
static
herr_t H5TB_attach_attributes( const char *table_title,
- hid_t loc_id,
- const char *dset_name,
- hsize_t nfields,
- hid_t tid )
+ hid_t loc_id,
+ const char *dset_name,
+ hsize_t nfields,
+ hid_t tid )
{
- char attr_name[255];
- char *member_name;
- char aux[255];
- hsize_t i;
+ char attr_name[255];
+ char *member_name;
+ char aux[255];
+ hsize_t i;
- /* Attach the CLASS attribute */
- if(H5LTset_attribute_string( loc_id, dset_name, "CLASS", TABLE_CLASS ) < 0)
- goto out;
+ /* attach the CLASS attribute */
+ if (H5LTset_attribute_string( loc_id, dset_name, "CLASS", TABLE_CLASS ) < 0)
+ goto out;
- /* Attach the VERSION attribute */
- if(H5LTset_attribute_string( loc_id, dset_name, "VERSION", "2.0" ) < 0)
- goto out;
+ /* attach the VERSION attribute */
+ if (H5LTset_attribute_string( loc_id, dset_name, "VERSION", TABLE_VERSION ) < 0)
+ goto out;
- /* Attach the TITLE attribute */
- if(H5LTset_attribute_string( loc_id, dset_name, "TITLE", table_title ) < 0)
- goto out;
+ /* attach the TITLE attribute */
+ if (H5LTset_attribute_string( loc_id, dset_name, "TITLE", table_title ) < 0)
+ goto out;
- /* Attach the FIELD_ name attribute */
- for ( i = 0; i < nfields; i++)
- {
+ /* attach the FIELD_ name attribute */
+ for ( i = 0; i < nfields; i++)
+ {
- /* Get the member name */
- member_name = H5Tget_member_name( tid, (unsigned)i );
+ /* get the member name */
+ member_name = H5Tget_member_name( tid, (unsigned)i );
- strcpy( attr_name, "FIELD_" );
- sprintf( aux, "%d", (int)i );
- strcat( attr_name, aux );
- sprintf( aux, "%s", "_NAME" );
- strcat( attr_name, aux );
+ strcpy( attr_name, "FIELD_" );
+ sprintf( aux, "%d", (int)i );
+ strcat( attr_name, aux );
+ sprintf( aux, "%s", "_NAME" );
+ strcat( attr_name, aux );
- /* Attach the attribute */
- if(H5LTset_attribute_string( loc_id, dset_name, attr_name, member_name ) < 0)
- goto out;
+ /* attach the attribute */
+ if (H5LTset_attribute_string( loc_id, dset_name, attr_name, member_name ) < 0)
+ goto out;
- free( member_name );
+ free( member_name );
- }
+ }
- return 0;
+ return 0;
out:
- return -1;
+ return -1;
}
/*-------------------------------------------------------------------------
- * Function: H5TB_create_type
- *
- * Purpose: Private function that creates a memory type ID
- *
- * Return: Success: the memory type ID, Failure: -1
- *
- * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
- *
- * Date: March 31, 2004
- *
- * Comments:
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5TB_create_type
+*
+* Purpose: Private function that creates a memory type ID
+*
+* Return: Success: the memory type ID, Failure: -1
+*
+* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+*
+* Date: March 31, 2004
+*
+* Comments:
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
static
hid_t H5TB_create_type(hid_t loc_id,
@@ -3553,232 +3455,235 @@ hid_t H5TB_create_type(hid_t loc_id,
const size_t *field_sizes,
hid_t ftype_id)
{
- hid_t mem_type_id;
- hid_t mtype_id=-1;
- hid_t nmtype_id=-1;
- size_t size_native;
- hsize_t nfields;
- char **fnames;
- unsigned i;
-
- /* get the number of fields */
- if (H5TBget_table_info(loc_id,dset_name,&nfields,NULL) < 0)
- return -1;
-
- if ((fnames=malloc(sizeof(char*)*(size_t)nfields))==NULL)
- return -1;
-
- for ( i=0; i<nfields; i++)
- {
- if ((fnames[i]=malloc(sizeof(char)*HLTB_MAX_FIELD_LEN))==NULL) {
- free(fnames);
- return -1;
- }
- }
-
- /* get field info */
- if(H5TBget_field_info(loc_id,dset_name,fnames,NULL,NULL,NULL) < 0)
- goto out;
-
- /* create the memory data type */
- if ((mem_type_id=H5Tcreate(H5T_COMPOUND,type_size)) < 0)
- goto out;
-
- /* get each field ID and adjust its size, if necessary */
- for ( i=0; i<nfields; i++)
- {
- if ((mtype_id=H5Tget_member_type(ftype_id,i)) < 0)
- goto out;
- if ((nmtype_id=H5Tget_native_type(mtype_id,H5T_DIR_DEFAULT)) < 0)
- goto out;
- size_native=H5Tget_size(nmtype_id);
- if (field_sizes[i]!=size_native)
- {
- if (H5Tset_size(nmtype_id,field_sizes[i]) < 0)
- goto out;
- }
- if (H5Tinsert(mem_type_id,fnames[i],field_offset[i],nmtype_id) < 0)
- goto out;
- if (H5Tclose(mtype_id) < 0)
- goto out;
- if (H5Tclose(nmtype_id) < 0)
- goto out;
- }
-
- for ( i=0; i<nfields; i++)
- {
- free (fnames[i]);
- }
- free (fnames);
-
- return mem_type_id;
-
- /* error zone, gracefully close and free */
+ hid_t mem_type_id;
+ hid_t mtype_id=-1;
+ hid_t nmtype_id=-1;
+ size_t size_native;
+ hsize_t nfields;
+ char **fnames;
+ unsigned i;
+
+ /* get the number of fields */
+ if (H5TBget_table_info(loc_id,dset_name,&nfields,NULL) < 0)
+ return -1;
+
+ if ((fnames = (char**) malloc(sizeof(char*)*(size_t)nfields))==NULL)
+ return -1;
+
+ for ( i = 0; i < nfields; i++)
+ {
+ if ((fnames[i] = (char*) malloc(sizeof(char)*HLTB_MAX_FIELD_LEN))==NULL)
+ {
+ free(fnames);
+ return -1;
+ }
+ }
+
+ /* get field info */
+ if (H5TBget_field_info(loc_id,dset_name,fnames,NULL,NULL,NULL) < 0)
+ goto out;
+
+ /* create the memory data type */
+ if ((mem_type_id=H5Tcreate(H5T_COMPOUND,type_size)) < 0)
+ goto out;
+
+ /* get each field ID and adjust its size, if necessary */
+ for ( i = 0; i < nfields; i++)
+ {
+ if ((mtype_id = H5Tget_member_type(ftype_id,i)) < 0)
+ goto out;
+ if ((nmtype_id = H5Tget_native_type(mtype_id,H5T_DIR_DEFAULT)) < 0)
+ goto out;
+ size_native = H5Tget_size(nmtype_id);
+ if (field_sizes[i]!=size_native)
+ {
+ if (H5Tset_size(nmtype_id,field_sizes[i]) < 0)
+ goto out;
+ }
+ if (H5Tinsert(mem_type_id,fnames[i],field_offset[i],nmtype_id) < 0)
+ goto out;
+ if (H5Tclose(mtype_id) < 0)
+ goto out;
+ if (H5Tclose(nmtype_id) < 0)
+ goto out;
+ }
+
+ for ( i=0; i<nfields; i++)
+ {
+ free (fnames[i]);
+ }
+ free (fnames);
+
+ return mem_type_id;
+
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Tclose(mtype_id);
- H5Tclose(nmtype_id);
- } H5E_END_TRY;
- for ( i=0; i<nfields; i++)
- {
- if (fnames[i])
- free (fnames[i]);
- }
- if (fnames)
- free (fnames);
- return -1;
+ H5E_BEGIN_TRY
+ {
+ H5Tclose(mtype_id);
+ H5Tclose(nmtype_id);
+ } H5E_END_TRY;
+ for ( i=0; i<nfields; i++)
+ {
+ if (fnames[i])
+ free (fnames[i]);
+ }
+ if (fnames)
+ free (fnames);
+ return -1;
}
/*-------------------------------------------------------------------------
- *
- * Functions shared between H5TB and H5PT
- *
- *-------------------------------------------------------------------------
- */
-
-/*-------------------------------------------------------------------------
- * Function: H5TB_common_append_records
- *
- * Purpose: Common code for reading records shared between H5PT and H5TB
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
- * James Laird, jlaird@ncsa.uiuc.edu
- *
- * Date: March 8, 2004
- *
- * Comments: Called by H5TBappend_records and H5PTappend_records
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+*
+* Functions shared between H5TB and H5PT
+*
+*-------------------------------------------------------------------------
+*/
+
+/*-------------------------------------------------------------------------
+* Function: H5TB_common_append_records
+*
+* Purpose: Common code for reading records shared between H5PT and H5TB
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
+* James Laird, jlaird@ncsa.uiuc.edu
+*
+* Date: March 8, 2004
+*
+* Comments: Called by H5TBappend_records and H5PTappend_records
+*
+* Modifications:
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5TB_common_append_records( hid_t dataset_id,
hid_t mem_type_id,
size_t nrecords,
hsize_t orig_table_size,
- const void * data)
+ const void * buf)
{
- hsize_t count[1];
- hsize_t offset[1];
- hid_t space_id = H5I_BADID;
- hid_t mem_space_id = H5I_BADID;
- hsize_t dims[1];
- hsize_t mem_dims[1];
-
- /* Extend the dataset */
- dims[0] = nrecords + orig_table_size;
- if(H5Dset_extent(dataset_id, dims) < 0)
- goto out;
-
- /* Create a simple memory data space */
- mem_dims[0] = nrecords;
- if((mem_space_id = H5Screate_simple(1, mem_dims, NULL)) < 0)
- goto out;
-
- /* Get a copy of the new file data space for writing */
- if((space_id = H5Dget_space(dataset_id)) < 0)
- goto out;
-
- /* Define a hyperslab in the dataset */
- offset[0] = orig_table_size;
- count[0] = nrecords;
- if(H5Sselect_hyperslab( space_id, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
- goto out;
-
- /* Write the records */
- if(H5Dwrite( dataset_id, mem_type_id, mem_space_id, space_id, H5P_DEFAULT, data ) < 0)
- goto out;
-
- /* Terminate access to the dataspace */
- if(H5Sclose( mem_space_id ) < 0)
- goto out;
-
- if(H5Sclose( space_id ) < 0)
- goto out;
-
- return 0;
+ hsize_t count[1];
+ hsize_t offset[1];
+ hid_t sid = H5I_BADID;
+ hid_t m_sid = H5I_BADID;
+ hsize_t dims[1];
+ hsize_t mem_dims[1];
+
+ /* extend the dataset */
+ dims[0] = nrecords + orig_table_size;
+ if (H5Dset_extent(dataset_id, dims) < 0)
+ goto out;
+
+ /* create a simple memory data space */
+ mem_dims[0] = nrecords;
+ if((m_sid = H5Screate_simple(1, mem_dims, NULL)) < 0)
+ goto out;
+
+ /* get a copy of the new file data space for writing */
+ if ((sid = H5Dget_space(dataset_id)) < 0)
+ goto out;
+
+ /* define a hyperslab in the dataset */
+ offset[0] = orig_table_size;
+ count[0] = nrecords;
+ if (H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
+ goto out;
+
+ /* write the records */
+ if (H5Dwrite( dataset_id, mem_type_id, m_sid, sid, H5P_DEFAULT, buf ) < 0)
+ goto out;
+
+ /* close */
+ if (H5Sclose( m_sid ) < 0)
+ goto out;
+ if (H5Sclose( sid ) < 0)
+ goto out;
+
+ return 0;
out:
- H5E_BEGIN_TRY
- H5Sclose(mem_space_id);
- H5Sclose(space_id);
- H5E_END_TRY
- return -1;
+ H5E_BEGIN_TRY
+ {
+ H5Sclose(m_sid);
+ H5Sclose(sid);
+ }
+ H5E_END_TRY;
+ return -1;
}
/*-------------------------------------------------------------------------
- * Function: H5TB_common_read_records
- *
- * Purpose: Common code for reading records shared between H5PT and H5TB
- *
- * Return: Success: 0, Failure: -1
- *
- * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
- * James Laird, jlaird@ncsa.uiuc.edu
- *
- * Date: March 8, 2004
- *
- * Comments: Called by H5TBread_records and H5PTread_records
- *
- * Modifications:
- *
- *
- *-------------------------------------------------------------------------
- */
+* Function: H5TB_common_read_records
+*
+* Purpose: Common code for reading records shared between H5PT and H5TB
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
+* James Laird, jlaird@ncsa.uiuc.edu
+*
+* Date: March 8, 2004
+*
+* Comments: Called by H5TBread_records and H5PTread_records
+*
+* Modifications:
+*
+*
+*-------------------------------------------------------------------------
+*/
herr_t H5TB_common_read_records( hid_t dataset_id,
hid_t mem_type_id,
hsize_t start,
size_t nrecords,
hsize_t table_size,
- void *data)
+ void *buf)
{
- hsize_t count[1];
- hsize_t offset[1];
- hid_t space_id = H5I_BADID;
- hid_t mem_space_id = H5I_BADID;
- hsize_t mem_size[1];
-
- /* Make sure the read request is in bounds */
- if(start + nrecords > table_size )
- goto out;
-
- /* Get the dataspace handle */
- if((space_id = H5Dget_space( dataset_id )) < 0)
- goto out;
-
- /* Define a hyperslab in the dataset of the size of the records */
- offset[0] = start;
- count[0] = nrecords;
- if(H5Sselect_hyperslab( space_id, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
- goto out;
-
- /* Create a memory dataspace handle */
- mem_size[0] = count[0];
- if ((mem_space_id = H5Screate_simple( 1, mem_size, NULL )) < 0)
- goto out;
- if ((H5Dread( dataset_id, mem_type_id, mem_space_id, space_id, H5P_DEFAULT, data)) < 0)
- goto out;
-
- /* Terminate access to the memory dataspace */
- if(H5Sclose( mem_space_id ) < 0)
- goto out;
-
- /* Terminate access to the dataspace */
- if(H5Sclose( space_id ) < 0)
- goto out;
-
- return 0;
+ hsize_t count[1];
+ hsize_t offset[1];
+ hid_t sid = H5I_BADID;
+ hid_t m_sid = H5I_BADID;
+ hsize_t mem_size[1];
+
+ /* make sure the read request is in bounds */
+ if (start + nrecords > table_size )
+ goto out;
+
+ /* get the dataspace handle */
+ if ((sid = H5Dget_space( dataset_id )) < 0)
+ goto out;
+
+ /* define a hyperslab in the dataset of the size of the records */
+ offset[0] = start;
+ count[0] = nrecords;
+ if (H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
+ goto out;
+
+ /* create a memory dataspace handle */
+ mem_size[0] = count[0];
+ if ((m_sid = H5Screate_simple( 1, mem_size, NULL )) < 0)
+ goto out;
+ if ((H5Dread( dataset_id, mem_type_id, m_sid, sid, H5P_DEFAULT, buf)) < 0)
+ goto out;
+
+ /* close */
+ if (H5Sclose( m_sid ) < 0)
+ goto out;
+ if (H5Sclose( sid ) < 0)
+ goto out;
+
+ return 0;
out:
- H5E_BEGIN_TRY
- H5Sclose(space_id);
- H5Sclose(mem_space_id);
- H5E_END_TRY
- return -1;
+ H5E_BEGIN_TRY
+ {
+ H5Sclose(sid);
+ H5Sclose(m_sid);
+ }
+ H5E_END_TRY;
+ return -1;
}
diff --git a/hl/src/H5TBprivate.h b/hl/src/H5TBprivate.h
index d4e5635..e2b668d 100644
--- a/hl/src/H5TBprivate.h
+++ b/hl/src/H5TBprivate.h
@@ -24,6 +24,7 @@
#define TABLE_CLASS "TABLE"
+#define TABLE_VERSION "3.0"
#define HLTB_MAX_FIELD_LEN 255
/*-------------------------------------------------------------------------
diff --git a/hl/src/H5TBpublic.h b/hl/src/H5TBpublic.h
index 143ceeb..4dd17bb 100644
--- a/hl/src/H5TBpublic.h
+++ b/hl/src/H5TBpublic.h
@@ -41,7 +41,7 @@ H5_HLDLL herr_t H5TBmake_table( const char *table_title,
hsize_t chunk_size,
void *fill_data,
int compress,
- const void *data );
+ const void *buf );
/*-------------------------------------------------------------------------
@@ -57,7 +57,7 @@ H5_HLDLL herr_t H5TBappend_records( hid_t loc_id,
size_t type_size,
const size_t *field_offset,
const size_t *dst_sizes,
- const void *data );
+ const void *buf );
H5_HLDLL herr_t H5TBwrite_records( hid_t loc_id,
const char *dset_name,
@@ -66,7 +66,7 @@ H5_HLDLL herr_t H5TBwrite_records( hid_t loc_id,
size_t type_size,
const size_t *field_offset,
const size_t *dst_sizes,
- const void *data );
+ const void *buf );
H5_HLDLL herr_t H5TBwrite_fields_name( hid_t loc_id,
@@ -77,7 +77,7 @@ H5_HLDLL herr_t H5TBwrite_fields_name( hid_t loc_id,
size_t type_size,
const size_t *field_offset,
const size_t *dst_sizes,
- const void *data );
+ const void *buf );
H5_HLDLL herr_t H5TBwrite_fields_index( hid_t loc_id,
const char *dset_name,
@@ -88,7 +88,7 @@ H5_HLDLL herr_t H5TBwrite_fields_index( hid_t loc_id,
size_t type_size,
const size_t *field_offset,
const size_t *dst_sizes,
- const void *data );
+ const void *buf );
/*-------------------------------------------------------------------------
@@ -116,7 +116,7 @@ H5_HLDLL herr_t H5TBread_fields_name( hid_t loc_id,
size_t type_size,
const size_t *field_offset,
const size_t *dst_sizes,
- void *data );
+ void *buf );
H5_HLDLL herr_t H5TBread_fields_index( hid_t loc_id,
const char *dset_name,
@@ -127,7 +127,7 @@ H5_HLDLL herr_t H5TBread_fields_index( hid_t loc_id,
size_t type_size,
const size_t *field_offset,
const size_t *dst_sizes,
- void *data );
+ void *buf );
H5_HLDLL herr_t H5TBread_records( hid_t loc_id,
@@ -137,7 +137,7 @@ H5_HLDLL herr_t H5TBread_records( hid_t loc_id,
size_t type_size,
const size_t *dst_offset,
const size_t *dst_sizes,
- void *data );
+ void *buf );
/*-------------------------------------------------------------------------
*
@@ -181,7 +181,7 @@ H5_HLDLL herr_t H5TBinsert_record( hid_t loc_id,
size_t dst_size,
const size_t *dst_offset,
const size_t *dst_sizes,
- void *data );
+ void *buf );
H5_HLDLL herr_t H5TBadd_records_from( hid_t loc_id,
const char *dset_name1,
@@ -202,7 +202,7 @@ H5_HLDLL herr_t H5TBinsert_field( hid_t loc_id,
hid_t field_type,
hsize_t position,
const void *fill_data,
- const void *data );
+ const void *buf );
H5_HLDLL herr_t H5TBdelete_field( hid_t loc_id,
const char *dset_name,
diff --git a/hl/src/Makefile.am b/hl/src/Makefile.am
index 37bff7b..0eecbbb 100644
--- a/hl/src/Makefile.am
+++ b/hl/src/Makefile.am
@@ -19,13 +19,17 @@
#
include $(top_srcdir)/config/commence.am
+include $(top_srcdir)/config/lt_vers.am
# Add include directories to the C preprocessor flags
-AM_CPPFLAGS=-I$(top_srcdir)/src
+AM_CPPFLAGS+=-I$(top_srcdir)/src
# This library is our main target.
lib_LTLIBRARIES=libhdf5_hl.la
+# Add libtool numbers to the HDF5 hl library (from config/lt_vers.am)
+libhdf5_hl_la_LDFLAGS= -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
+
libhdf5_hl_la_SOURCES=H5DS.c H5IM.c H5LT.c H5LTanalyze.c H5LTparse.c H5PT.c H5TB.c
# Public header files (to be installed)
diff --git a/hl/src/Makefile.in b/hl/src/Makefile.in
index 10d5d03..20cbf7b 100644
--- a/hl/src/Makefile.in
+++ b/hl/src/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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.
@@ -34,8 +35,9 @@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@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
@@ -52,7 +54,8 @@ build_triplet = @build@
host_triplet = @host@
DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in $(top_srcdir)/config/commence.am \
- $(top_srcdir)/config/conclude.am COPYING
+ $(top_srcdir)/config/conclude.am \
+ $(top_srcdir)/config/lt_vers.am COPYING
TESTS =
subdir = hl/src
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -62,22 +65,41 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/src/H5config.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 = `echo $$p | sed -e 's|^.*/||'`;
+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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
-libLTLIBRARIES_INSTALL = $(INSTALL)
LTLIBRARIES = $(lib_LTLIBRARIES)
libhdf5_hl_la_LIBADD =
am_libhdf5_hl_la_OBJECTS = H5DS.lo H5IM.lo H5LT.lo H5LTanalyze.lo \
H5LTparse.lo H5PT.lo H5TB.lo
libhdf5_hl_la_OBJECTS = $(am_libhdf5_hl_la_OBJECTS)
+libhdf5_hl_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(libhdf5_hl_la_LDFLAGS) $(LDFLAGS) -o $@
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
am__depfiles_maybe = depfiles
+am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
@@ -89,14 +111,27 @@ LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
$(LDFLAGS) -o $@
SOURCES = $(libhdf5_hl_la_SOURCES)
DIST_SOURCES = $(libhdf5_hl_la_SOURCES)
-includeHEADERS_INSTALL = $(INSTALL_HEADER)
HEADERS = $(include_HEADERS)
ETAGS = etags
CTAGS = ctags
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = /home1/packages/automake/automake-1.9.6/bin/aclocal-1.9 -I /afs/ncsa/projects/hdf/packages/libtool_1.5.14/Linux_2.4/share/aclocal
ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
AMTAR = @AMTAR@
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+AM_CFLAGS = @AM_CFLAGS@ @H5_CFLAGS@
+
+# Add include directories to the C preprocessor flags
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@ -I$(top_srcdir)/src
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@
AM_MAKEFLAGS = @AM_MAKEFLAGS@
AR = @AR@
@@ -110,21 +145,18 @@ BYTESEX = @BYTESEX@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_VERSION = @CC_VERSION@
-
-# H5_CFLAGS holds flags that should be used as CFLAGS when building hdf5,
-# but which shouldn't be exported to h5cc for building other programs.
-CFLAGS = @CFLAGS@ @H5_CFLAGS@
+CFLAGS = @CFLAGS@
CLEARFILEBUF = @CLEARFILEBUF@
CODESTACK = @CODESTACK@
CONFIG_DATE = @CONFIG_DATE@
CONFIG_MODE = @CONFIG_MODE@
CONFIG_USER = @CONFIG_USER@
CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@ @H5_CPPFLAGS@
+CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@ @H5_CXXFLAGS@
+CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEBUG_PKG = @DEBUG_PKG@
DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
@@ -147,7 +179,7 @@ F9XMODEXT = @F9XMODEXT@
F9XMODFLAG = @F9XMODFLAG@
F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
FC = @FC@
-FCFLAGS = @FCFLAGS@ @H5_FCFLAGS@
+FCFLAGS = @FCFLAGS@
FCFLAGS_f90 = @FCFLAGS_f90@
FCLIBS = @FCLIBS@
FGREP = @FGREP@
@@ -185,6 +217,8 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LINUX_LFS = @LINUX_LFS@
+LIPO = @LIPO@
+LL_PATH = @LL_PATH@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_STATIC_EXEC = @LT_STATIC_EXEC@
@@ -195,13 +229,17 @@ MPE = @MPE@
MPI_GET_SIZE = @MPI_GET_SIZE@
NM = @NM@
NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
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@
PARALLEL = @PARALLEL@
PATH_SEPARATOR = @PATH_SEPARATOR@
@@ -217,12 +255,7 @@ SEARCH = @SEARCH@
SED = @SED@
SETX = @SETX@
SET_MAKE = @SET_MAKE@
-
-# Hardcode SHELL to be /bin/sh. Most machines have this shell, and
-# on at least one machine configure fails to detect its existence (janus).
-# Also, when HDF5 is configured on one machine but run on another,
-# configure's automatic SHELL detection may not work on the build machine.
-SHELL = /bin/sh
+SHELL = @SHELL@
SIZE_T = @SIZE_T@
STATIC_EXEC = @STATIC_EXEC@
STATIC_SHARED = @STATIC_SHARED@
@@ -242,6 +275,7 @@ USE_FILTER_SHUFFLE = @USE_FILTER_SHUFFLE@
USE_FILTER_SZIP = @USE_FILTER_SZIP@
USINGMEMCHECKER = @USINGMEMCHECKER@
VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -264,6 +298,8 @@ build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
+
+# Install directories that automake doesn't know about
docdir = $(exec_prefix)/doc
dvidir = @dvidir@
enable_shared = @enable_shared@
@@ -275,9 +311,7 @@ host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
-
-# Install directories that automake doesn't know about
-includedir = $(exec_prefix)/include
+includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
@@ -297,6 +331,7 @@ sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -342,11 +377,17 @@ TRACE = perl $(top_srcdir)/bin/trace
# *.clog are from the MPE option.
CHECK_CLEANFILES = *.chkexe *.chklog *.clog
-# Add include directories to the C preprocessor flags
-AM_CPPFLAGS = -I$(top_srcdir)/src
+# Add libtool shared library version numbers to the HDF5 library
+# See libtool versioning documentation online.
+LT_VERS_INTERFACE = 6
+LT_VERS_REVISION = 45
+LT_VERS_AGE = 0
# This library is our main target.
lib_LTLIBRARIES = libhdf5_hl.la
+
+# Add libtool numbers to the HDF5 hl library (from config/lt_vers.am)
+libhdf5_hl_la_LDFLAGS = -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
libhdf5_hl_la_SOURCES = H5DS.c H5IM.c H5LT.c H5LTanalyze.c H5LTparse.c H5PT.c H5TB.c
# Public header files (to be installed)
@@ -371,18 +412,18 @@ all: all-am
.SUFFIXES:
.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
- && exit 0; \
+ ( 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) --foreign hl/src/Makefile'; \
- cd $(top_srcdir) && \
- $(AUTOMAKE) --foreign hl/src/Makefile
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/src/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign hl/src/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -400,23 +441,28 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
@$(NORMAL_INSTALL)
test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ list2=; for p in $$list; do \
if test -f $$p; then \
- f=$(am__strip_dir) \
- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+ list2="$$list2 $$p"; \
else :; fi; \
- done
+ done; \
+ test -z "$$list2" || { \
+ 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)'; for p in $$list; do \
- p=$(am__strip_dir) \
- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+ @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:
@@ -428,7 +474,7 @@ clean-libLTLIBRARIES:
rm -f "$${dir}/so_locations"; \
done
libhdf5_hl.la: $(libhdf5_hl_la_OBJECTS) $(libhdf5_hl_la_DEPENDENCIES)
- $(LINK) -rpath $(libdir) $(libhdf5_hl_la_OBJECTS) $(libhdf5_hl_la_LIBADD) $(LIBS)
+ $(libhdf5_hl_la_LINK) -rpath $(libdir) $(libhdf5_hl_la_OBJECTS) $(libhdf5_hl_la_LIBADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -446,21 +492,21 @@ distclean-compile:
.c.o:
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
.c.obj:
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
@@ -473,34 +519,37 @@ clean-libtool:
install-includeHEADERS: $(include_HEADERS)
@$(NORMAL_INSTALL)
test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
- @list='$(include_HEADERS)'; for p in $$list; do \
+ @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+ for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- f=$(am__strip_dir) \
- echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \
- $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \
+ 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)'; for p in $$list; do \
- f=$(am__strip_dir) \
- echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \
- rm -f "$(DESTDIR)$(includedir)/$$f"; \
- done
+ @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(includedir)" && rm -f $$files
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; nonemtpy = 1; } \
+ $(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)
- tags=; \
+ set x; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
@@ -508,29 +557,34 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique; \
+ 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)
- tags=; \
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)$$tags$$unique" \
+ test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$tags $$unique
+ $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -551,13 +605,17 @@ distdir: $(DISTFILES)
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 -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
@@ -589,6 +647,7 @@ 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"
@@ -610,6 +669,8 @@ dvi-am:
html: html-am
+html-am:
+
info: info-am
info-am:
@@ -618,18 +679,28 @@ install-data-am: install-includeHEADERS
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
@@ -652,7 +723,7 @@ ps-am:
uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
-.MAKE: install-am install-strip
+.MAKE: check-am install-am install-strip
.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \
clean clean-generic clean-libLTLIBRARIES clean-libtool ctags \
@@ -682,6 +753,19 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
help:
@$(top_srcdir)/bin/makehelp
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5. The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html. COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page. It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have
+# access to either file, you may request a copy from help@hdfgroup.org.
+
# lib/progs/tests targets recurse into subdirectories. build-* targets
# build files in this directory.
build-lib: $(LIB)
@@ -876,6 +960,7 @@ check-vfd: $(LIB) $(PROGS) $(TESTS)
HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1; \
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:
diff --git a/hl/test/COPYING b/hl/test/COPYING
index ef0cbaf..6903daf 100755
--- a/hl/test/COPYING
+++ b/hl/test/COPYING
@@ -1,5 +1,5 @@
- Copyright by The HDF Group (THG) and
+ Copyright by The HDF Group and
The Board of Trustees of the University of Illinois.
All rights reserved.
diff --git a/hl/test/Makefile.am b/hl/test/Makefile.am
index 99832e8..fc6e969 100644
--- a/hl/test/Makefile.am
+++ b/hl/test/Makefile.am
@@ -22,7 +22,7 @@
include $(top_srcdir)/config/commence.am
# Add include directories to C preprocessor flags
-AM_CPPFLAGS=-I. -I$(srcdir) -I$(top_builddir)/src -I$(top_srcdir)/src -I$(top_builddir)/test -I$(top_srcdir)/test -I$(top_srcdir)/hl/src
+AM_CPPFLAGS+=-I. -I$(srcdir) -I$(top_builddir)/src -I$(top_srcdir)/src -I$(top_builddir)/test -I$(top_srcdir)/test -I$(top_srcdir)/hl/src
# The tests depend on the hdf5, hdf5 test, and hdf5_hl libraries
LDADD=$(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
@@ -32,8 +32,19 @@ LDADD=$(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
TEST_PROG=test_lite test_image test_table test_ds test_packet
check_PROGRAMS=$(TEST_PROG)
+# These programs generate test files for the tests. They don't need to be
+# compiled every time we want to test the library. However, putting
+# them in a conditional causes automake to generate rules so that they
+# can be built by hand. They can also be built by specifying
+# --enable-build-all at configure time.
+BUILD_ALL_PROGS=gen_test_ds
+
+if BUILD_ALL_CONDITIONAL
+ noinst_PROGRAMS=$(BUILD_ALL_PROGS)
+endif
+
# Temporary files. These files are the ones created by running `make test'.
-CHECK_CLEANFILES+=combine_tables[1-2].h5 test_ds[1-6].h5 test_image[1-3].h5 \
+CHECK_CLEANFILES+=combine_tables[1-2].h5 test_ds[1-9].h5 test_image[1-3].h5 \
test_lite[1-2].h5 test_table.h5 test_packet_table.h5 \
test_packet_compress.h5
diff --git a/hl/test/Makefile.in b/hl/test/Makefile.in
index 4d29416..4a5aa5b 100644
--- a/hl/test/Makefile.in
+++ b/hl/test/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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.
@@ -32,10 +33,12 @@
#
# HDF5 High-Level Test Makefile(.in)
#
+
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@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
@@ -54,6 +57,7 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(top_srcdir)/config/commence.am \
$(top_srcdir)/config/conclude.am COPYING
check_PROGRAMS = $(am__EXEEXT_1)
+@BUILD_ALL_CONDITIONAL_TRUE@noinst_PROGRAMS = $(am__EXEEXT_2)
TESTS = $(check_PROGRAMS)
subdir = hl/test
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -63,8 +67,15 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/src/H5config.h
CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
am__EXEEXT_1 = test_lite$(EXEEXT) test_image$(EXEEXT) \
test_table$(EXEEXT) test_ds$(EXEEXT) test_packet$(EXEEXT)
+am__EXEEXT_2 = gen_test_ds$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+gen_test_ds_SOURCES = gen_test_ds.c
+gen_test_ds_OBJECTS = gen_test_ds.$(OBJEXT)
+gen_test_ds_LDADD = $(LDADD)
+gen_test_ds_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
test_ds_SOURCES = test_ds.c
test_ds_OBJECTS = test_ds.$(OBJEXT)
test_ds_LDADD = $(LDADD)
@@ -88,6 +99,7 @@ test_table_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
am__depfiles_maybe = depfiles
+am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
@@ -97,16 +109,33 @@ CCLD = $(CC)
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@
-SOURCES = test_ds.c test_image.c test_lite.c test_packet.c \
- test_table.c
-DIST_SOURCES = test_ds.c test_image.c test_lite.c test_packet.c \
- test_table.c
+SOURCES = gen_test_ds.c test_ds.c test_image.c test_lite.c \
+ test_packet.c test_table.c
+DIST_SOURCES = gen_test_ds.c test_ds.c test_image.c test_lite.c \
+ test_packet.c test_table.c
ETAGS = etags
CTAGS = ctags
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = /home1/packages/automake/automake-1.9.6/bin/aclocal-1.9 -I /afs/ncsa/projects/hdf/packages/libtool_1.5.14/Linux_2.4/share/aclocal
ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
AMTAR = @AMTAR@
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+AM_CFLAGS = @AM_CFLAGS@ @H5_CFLAGS@
+
+# Add include directories to C preprocessor flags
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@ -I. -I$(srcdir) \
+ -I$(top_builddir)/src -I$(top_srcdir)/src \
+ -I$(top_builddir)/test -I$(top_srcdir)/test \
+ -I$(top_srcdir)/hl/src
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@
AM_MAKEFLAGS = @AM_MAKEFLAGS@
AR = @AR@
@@ -120,21 +149,18 @@ BYTESEX = @BYTESEX@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_VERSION = @CC_VERSION@
-
-# H5_CFLAGS holds flags that should be used as CFLAGS when building hdf5,
-# but which shouldn't be exported to h5cc for building other programs.
-CFLAGS = @CFLAGS@ @H5_CFLAGS@
+CFLAGS = @CFLAGS@
CLEARFILEBUF = @CLEARFILEBUF@
CODESTACK = @CODESTACK@
CONFIG_DATE = @CONFIG_DATE@
CONFIG_MODE = @CONFIG_MODE@
CONFIG_USER = @CONFIG_USER@
CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@ @H5_CPPFLAGS@
+CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@ @H5_CXXFLAGS@
+CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEBUG_PKG = @DEBUG_PKG@
DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
@@ -157,7 +183,7 @@ F9XMODEXT = @F9XMODEXT@
F9XMODFLAG = @F9XMODFLAG@
F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
FC = @FC@
-FCFLAGS = @FCFLAGS@ @H5_FCFLAGS@
+FCFLAGS = @FCFLAGS@
FCFLAGS_f90 = @FCFLAGS_f90@
FCLIBS = @FCLIBS@
FGREP = @FGREP@
@@ -195,6 +221,8 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LINUX_LFS = @LINUX_LFS@
+LIPO = @LIPO@
+LL_PATH = @LL_PATH@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_STATIC_EXEC = @LT_STATIC_EXEC@
@@ -205,13 +233,17 @@ MPE = @MPE@
MPI_GET_SIZE = @MPI_GET_SIZE@
NM = @NM@
NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
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@
PARALLEL = @PARALLEL@
PATH_SEPARATOR = @PATH_SEPARATOR@
@@ -227,12 +259,7 @@ SEARCH = @SEARCH@
SED = @SED@
SETX = @SETX@
SET_MAKE = @SET_MAKE@
-
-# Hardcode SHELL to be /bin/sh. Most machines have this shell, and
-# on at least one machine configure fails to detect its existence (janus).
-# Also, when HDF5 is configured on one machine but run on another,
-# configure's automatic SHELL detection may not work on the build machine.
-SHELL = /bin/sh
+SHELL = @SHELL@
SIZE_T = @SIZE_T@
STATIC_EXEC = @STATIC_EXEC@
STATIC_SHARED = @STATIC_SHARED@
@@ -252,6 +279,7 @@ USE_FILTER_SHUFFLE = @USE_FILTER_SHUFFLE@
USE_FILTER_SZIP = @USE_FILTER_SZIP@
USINGMEMCHECKER = @USINGMEMCHECKER@
VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -274,6 +302,8 @@ build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
+
+# Install directories that automake doesn't know about
docdir = $(exec_prefix)/doc
dvidir = @dvidir@
enable_shared = @enable_shared@
@@ -285,9 +315,7 @@ host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
-
-# Install directories that automake doesn't know about
-includedir = $(exec_prefix)/include
+includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
@@ -307,6 +335,7 @@ sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -353,12 +382,9 @@ TRACE = perl $(top_srcdir)/bin/trace
# Temporary files. These files are the ones created by running `make test'.
CHECK_CLEANFILES = *.chkexe *.chklog *.clog combine_tables[1-2].h5 \
- test_ds[1-6].h5 test_image[1-3].h5 test_lite[1-2].h5 \
+ test_ds[1-9].h5 test_image[1-3].h5 test_lite[1-2].h5 \
test_table.h5 test_packet_table.h5 test_packet_compress.h5
-# Add include directories to C preprocessor flags
-AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_builddir)/src -I$(top_srcdir)/src -I$(top_builddir)/test -I$(top_srcdir)/test -I$(top_srcdir)/hl/src
-
# The tests depend on the hdf5, hdf5 test, and hdf5_hl libraries
LDADD = $(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
@@ -366,6 +392,13 @@ LDADD = $(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
# order to be executed, generally most specific tests to least specific tests.
TEST_PROG = test_lite test_image test_table test_ds test_packet
+# These programs generate test files for the tests. They don't need to be
+# compiled every time we want to test the library. However, putting
+# them in a conditional causes automake to generate rules so that they
+# can be built by hand. They can also be built by specifying
+# --enable-build-all at configure time.
+BUILD_ALL_PROGS = gen_test_ds
+
# Automake needs to be taught how to build lib, progs, and tests targets.
# These will be filled in automatically for the most part (e.g.,
# lib_LIBRARIES are built for lib target), but EXTRA_LIB, EXTRA_PROG, and
@@ -389,14 +422,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
- && exit 0; \
+ ( 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) --foreign hl/test/Makefile'; \
- cd $(top_srcdir) && \
- $(AUTOMAKE) --foreign hl/test/Makefile
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/test/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign hl/test/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -414,13 +447,28 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
clean-checkPROGRAMS:
- @list='$(check_PROGRAMS)'; for p in $$list; do \
- f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f $$p $$f"; \
- rm -f $$p $$f ; \
- done
+ @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
+
+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
+gen_test_ds$(EXEEXT): $(gen_test_ds_OBJECTS) $(gen_test_ds_DEPENDENCIES)
+ @rm -f gen_test_ds$(EXEEXT)
+ $(LINK) $(gen_test_ds_OBJECTS) $(gen_test_ds_LDADD) $(LIBS)
test_ds$(EXEEXT): $(test_ds_OBJECTS) $(test_ds_DEPENDENCIES)
@rm -f test_ds$(EXEEXT)
$(LINK) $(test_ds_OBJECTS) $(test_ds_LDADD) $(LIBS)
@@ -443,6 +491,7 @@ mostlyclean-compile:
distclean-compile:
-rm -f *.tab.c
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_test_ds.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ds.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_image.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_lite.Po@am__quote@
@@ -451,21 +500,21 @@ distclean-compile:
.c.o:
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
.c.obj:
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
@@ -481,14 +530,14 @@ ID: $(HEADERS) $(SOURCES) $(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; nonemtpy = 1; } \
+ $(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)
- tags=; \
+ set x; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
@@ -496,29 +545,34 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique; \
+ 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)
- tags=; \
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)$$tags$$unique" \
+ test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$tags $$unique
+ $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -539,13 +593,17 @@ distdir: $(DISTFILES)
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 -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
@@ -553,7 +611,7 @@ check-am: all-am
$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
$(MAKE) $(AM_MAKEFLAGS) check-TESTS
check: check-am
-all-am: Makefile all-local
+all-am: Makefile $(PROGRAMS) all-local
installdirs:
install: install-am
install-exec: install-exec-am
@@ -575,6 +633,7 @@ 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"
@@ -582,7 +641,7 @@ maintainer-clean-generic:
clean: clean-am
clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
- mostlyclean-am
+ clean-noinstPROGRAMS mostlyclean-am
distclean: distclean-am
-rm -rf ./$(DEPDIR)
@@ -596,6 +655,8 @@ dvi-am:
html: html-am
+html-am:
+
info: info-am
info-am:
@@ -604,18 +665,28 @@ 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
@@ -638,18 +709,18 @@ ps-am:
uninstall-am:
-.MAKE: install-am install-strip
+.MAKE: check-am install-am install-strip
.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \
- clean clean-checkPROGRAMS 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-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 \
+ clean clean-checkPROGRAMS 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 mostlyclean-local pdf \
pdf-am ps ps-am tags uninstall uninstall-am
@@ -860,6 +931,7 @@ check-vfd: $(LIB) $(PROGS) $(TESTS)
HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1; \
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:
diff --git a/hl/test/gen_test_ds.c b/hl/test/gen_test_ds.c
new file mode 100644
index 0000000..573fe20
--- /dev/null
+++ b/hl/test/gen_test_ds.c
@@ -0,0 +1,595 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group. *
+ * Copyright by the Board of Trustees of the University of Illinois. *
+ * All rights reserved. *
+ * *
+ * This file is part of HDF5. The full HDF5 copyright notice, including *
+ * terms governing use, modification, and redistribution, is contained in *
+ * the files COPYING and Copyright.html. COPYING can be found at the root *
+ * of the source code distribution tree; Copyright.html can be found at the *
+ * root level of an installed copy of the electronic HDF5 document set and *
+ * is linked from the top-level documents page. It can also be found at *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
+ * access to either file, you may request a copy from help@hdfgroup.org. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Purpose: This program is run to generate an HDF5 data file with datasets
+ * that use dimension scales.
+ *
+ * Compile and run this program to generate the "test_ds_xx.h5"
+ * file, where xx is "le" on a little-endian machine and "be"
+ * on a big-endian machine.
+ * Move it to the test directory in the current branch.
+ * The test: test_foreign_scaleattached(const char *fileforeign)
+ * in test_ds.c will read them.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "h5hltest.h"
+#include "H5DSpublic.h"
+#include "H5LTpublic.h"
+
+/* prototypes */
+static hid_t open_test_file(const char *fileext);
+herr_t create_long_dataset(hid_t fid, const char *dsname, const char *dsidx);
+herr_t test_attach_scale(hid_t fid, hid_t did, const char *name, unsigned int idx);
+herr_t test_detach_scale(hid_t fid, hid_t did, const char *name, unsigned int idx);
+herr_t test_set_scalename(hid_t fid, hid_t did, const char *name, const char *scalename, unsigned int idx);
+herr_t test_cmp_scalename(hid_t fid, hid_t did, const char *name, const char *scalename, unsigned int idx);
+
+static int test_long_attachscales(const char *filename);
+static int test_duplicatelong_attachscales(const char *filename);
+static int test_long_scalenames(const char *filename);
+static int test_samelong_scalenames(const char *filename);
+static int test_foreign_scaleattached(const char *filename);
+
+
+#define DIM_DATA 12
+#define DIM1_SIZE 3
+#define DIM2_SIZE 4
+#define DIM3_SIZE 12
+#define DIM4_SIZE 2
+#define DIM0 0
+#define DIM1 1
+#define DIM2 2
+#define DIM3 3
+
+#define DATASET_NAME "dset_"
+#define DS_1_NAME "ds_1_"
+#define DS_2_NAME "ds_2_"
+#define DS_3_NAME "ds_3_"
+#define DS_4_NAME "ds_4_"
+
+#define SCALE_1_NAME "scalename_1_"
+#define SCALE_2_NAME "scalename_2_"
+#define SCALE_3_NAME "scalename_3_"
+#define SCALE_4_NAME "scalename_4_"
+
+#define FILENAME "test_ds_"
+#define FILEEXT ".h5"
+
+/*-------------------------------------------------------------------------
+ * the main program
+ *-------------------------------------------------------------------------
+ */
+int main(int argc , char **argv)
+{
+ int nerrors=0;
+ char filename[65];
+
+
+ if (argc < 2) {
+ printf("Usage: gen_test [le | be]\n");
+ return 1;
+ }
+
+ if ( argv[1] && (strcmp("le",argv[1])!=0) && (strcmp("be",argv[1])!=0) ) {
+ printf("Usage: gen_test [le | be]\n");
+ return 1;
+ }
+
+ /* create file to be used in following tests */
+ strcpy(filename, FILENAME);
+ strcat(filename, argv[1]);
+ strcat(filename, FILEEXT);
+ if(H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT) < 0) {
+ nerrors = 1;
+ goto error;
+ }
+ nerrors += test_long_attachscales(filename) < 0 ? 1 : 0;
+ nerrors += test_duplicatelong_attachscales(filename) < 0 ? 1 : 0;
+ nerrors += test_samelong_scalenames(filename) < 0 ? 1 : 0;
+ nerrors += test_foreign_scaleattached(filename) < 0 ? 1 : 0;
+
+
+ if(nerrors) goto error;
+ printf("Dimension scales file generation passed.\n");
+ return 0;
+
+error:
+ printf("***** %d DIMENSION SCALES FILE GENERATION FAILED! *****\n",nerrors);
+ return 1;
+}
+
+static hid_t open_test_file(const char *fileext)
+{
+ char filename[65];
+
+ strcpy(filename, FILENAME);
+ strcat(filename, fileext);
+ strcat(filename, FILEEXT);
+
+ return H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT);
+}
+
+/*-------------------------------------------------------------------------
+ * create "data" dataset
+ *-------------------------------------------------------------------------
+ */
+
+herr_t create_long_dataset(hid_t fid, const char *name, const char *dsidx)
+{
+ int rank = 4;
+ int rankds = 1;
+ hsize_t dims[4] = {DIM1_SIZE,DIM2_SIZE,DIM3_SIZE,DIM4_SIZE};
+ long buf[DIM_DATA*3*2] = {1,2,3,4,5,6,7,8,9,10,11,12,
+ 1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,
+ 1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,
+ 1,2,3,4,5,6,7,8,9,10,11,12};
+ hsize_t s1_dim[1] = {DIM1_SIZE};
+ hsize_t s2_dim[1] = {DIM2_SIZE};
+ hsize_t s3_dim[1] = {DIM3_SIZE};
+ hsize_t s4_dim[1] = {DIM4_SIZE};
+ long s1_wbuf[DIM1_SIZE] = {10,20,30};
+ long s2_wbuf[DIM2_SIZE] = {100,200,300,400};
+ long s3_wbuf[DIM3_SIZE] = {10,10,10,20,20,20,30,30,30,40,40,40};
+ long s4_wbuf[DIM4_SIZE] = {18,18};
+
+ /* make a dataset */
+ if(H5LTmake_dataset_long(fid, name, rank, dims, buf) >= 0) {
+ /* make a DS dataset for the first dimension */
+ char dsname[32];
+
+ strcpy(dsname, DS_1_NAME);
+ strcat(dsname, dsidx);
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_long(fid, dsname, rankds, s1_dim, s1_wbuf) < 0)
+ return FAIL;
+
+ strcpy(dsname, DS_2_NAME);
+ strcat(dsname, dsidx);
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_long(fid, dsname, rankds, s2_dim, s2_wbuf) < 0)
+ return FAIL;
+
+ strcpy(dsname, DS_3_NAME);
+ strcat(dsname, dsidx);
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_long(fid, dsname, rankds, s3_dim, s3_wbuf) < 0)
+ return FAIL;
+
+ strcpy(dsname, DS_4_NAME);
+ strcat(dsname, dsidx);
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_long(fid, dsname, rankds, s4_dim, s4_wbuf) < 0)
+ return FAIL;
+ }
+ else
+ return FAIL;
+ return SUCCEED;
+}
+
+herr_t test_attach_scale(hid_t fid, hid_t did, const char *name, unsigned int idx)
+{
+ herr_t ret_value = FAIL;
+ hid_t dsid = -1;
+
+ if((dsid = H5Dopen2(fid, name, H5P_DEFAULT)) >= 0) {
+ if(H5DSis_attached(did, dsid, idx) == 0) {
+ if(H5DSattach_scale(did, dsid, idx) >= 0) {
+ if(H5DSis_attached(did, dsid, idx) > 0) {
+ /* printf(" scale attached "); */
+ ret_value = SUCCEED;
+ }
+ else if(H5DSis_attached(did, dsid, idx) == 0) {
+ printf(" scale not attached ");
+ }
+ }
+ }
+ if(H5Dclose(dsid) < 0)
+ ret_value = FAIL;
+ }
+
+ return ret_value;
+}
+
+herr_t test_detach_scale(hid_t fid, hid_t did, const char *name, unsigned int idx)
+{
+ herr_t ret_value = FAIL;
+ hid_t dsid = -1;
+
+ if((dsid = H5Dopen2(fid, name, H5P_DEFAULT)) >= 0) {
+ if(H5DSis_attached(did, dsid, idx) == 1) {
+ if(H5DSdetach_scale(did, dsid, idx) >= 0) {
+ if(H5DSis_attached(did, dsid, idx) == 0) {
+ ret_value = SUCCEED;
+ }
+ }
+ }
+ if(H5Dclose(dsid) < 0)
+ ret_value = FAIL;
+ }
+
+ return ret_value;
+}
+
+herr_t test_set_scalename(hid_t fid, hid_t did, const char *name, const char *scalename, unsigned int idx)
+{
+ herr_t ret_value = FAIL;
+ hid_t dsid = -1;
+
+ if((dsid = H5Dopen2(fid, name, H5P_DEFAULT)) >= 0) {
+ if(H5DSis_attached(did, dsid, idx) == 1) {
+ if(H5DSset_scale(dsid, scalename) >= 0) {
+ if(H5DSis_attached(did, dsid, idx) == 1) {
+ ret_value = SUCCEED;
+ }
+ }
+ }
+ if(H5Dclose(dsid) < 0)
+ ret_value = FAIL;
+ }
+
+ return ret_value;
+}
+
+herr_t test_cmp_scalename(hid_t fid, hid_t did, const char *name, const char *scalename, unsigned int idx)
+{
+ herr_t ret_value = FAIL;
+ hid_t dsid = -1;
+ ssize_t name_len;
+ char *name_out=NULL;
+
+ if((dsid = H5Dopen2(fid, name, H5P_DEFAULT)) >= 0) {
+ if(H5DSis_attached(did, dsid, idx) == 1) {
+ if((name_len=H5DSget_scale_name(dsid,NULL,(size_t)0)) > 0) {
+ name_out = (char*)malloc((size_t)name_len * sizeof (char));
+ if(name_out != NULL) {
+ if(H5DSget_scale_name(dsid, name_out, (size_t)name_len) >= 0) {
+ if(strcmp(scalename,name_out)==0) {
+ ret_value = SUCCEED;
+ }
+ free(name_out);
+ name_out=NULL;
+ }
+ }
+ }
+ }
+ if(H5Dclose(dsid) < 0)
+ ret_value = FAIL;
+ }
+
+ return ret_value;
+}
+
+static int test_long_attachscales(const char *filename)
+{
+ hid_t fid = -1;
+ hid_t did = -1;
+ char dsname[32];
+ char scalename[32];
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "al");
+
+ TESTING2("test_long_attachscales");
+
+ if((fid = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* make a dataset */
+ if(create_long_dataset(fid, dsname, "al") < 0)
+ goto out;
+
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ strcpy(scalename, DS_1_NAME);
+ strcat(scalename, "al");
+ if(test_attach_scale(fid, did, scalename, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_2_NAME);
+ strcat(scalename, "al");
+ if(test_attach_scale(fid, did, scalename, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_3_NAME);
+ strcat(scalename, "al");
+ if(test_attach_scale(fid, did, scalename, DIM2) < 0)
+ goto out;
+
+ strcpy(scalename, DS_4_NAME);
+ strcat(scalename, "al");
+ if(test_attach_scale(fid, did, scalename, DIM3) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return SUCCEED;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
+
+static int test_duplicatelong_attachscales(const char *filename)
+{
+ hid_t fid = -1;
+ hid_t did = -1;
+ char dsname[32];
+ char scalename[32];
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "al2");
+
+ TESTING2("test_duplicatelong_attachscales");
+
+ if((fid = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* make a dataset 2 */
+ if(create_long_dataset(fid, dsname, "al2") < 0)
+ goto out;
+
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ strcpy(scalename, DS_1_NAME);
+ strcat(scalename, "al");
+ if(test_attach_scale(fid, did, scalename, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_2_NAME);
+ strcat(scalename, "al");
+ if(test_attach_scale(fid, did, scalename, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_3_NAME);
+ strcat(scalename, "al");
+ if(test_attach_scale(fid, did, scalename, DIM2) < 0)
+ goto out;
+
+ strcpy(scalename, DS_4_NAME);
+ strcat(scalename, "al");
+ if(test_attach_scale(fid, did, scalename, DIM3) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return SUCCEED;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
+
+static int test_long_scalenames(const char *filename) {
+ hid_t fid = -1;
+ hid_t did = -1;
+ char dsname[32];
+ char scalename[32];
+ char name[32];
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "al");
+
+ if((fid = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
+ goto out;
+
+ TESTING2("set long scale/cmp scale name");
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ strcpy(scalename, DS_1_NAME);
+ strcat(scalename, "al");
+ strcpy(name, SCALE_1_NAME);
+ strcat(name, "al");
+ if(test_set_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_2_NAME);
+ strcat(scalename, "al");
+ strcpy(name, SCALE_2_NAME);
+ strcat(name, "al");
+ if(test_set_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_3_NAME);
+ strcat(scalename, "al");
+ strcpy(name, SCALE_3_NAME);
+ strcat(name, "al");
+ if(test_set_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ strcpy(scalename, DS_4_NAME);
+ strcat(scalename, "al");
+ strcpy(name, SCALE_4_NAME);
+ strcat(name, "al");
+ if(test_set_scalename(fid, did, scalename, name, DIM3) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM3) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return SUCCEED;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
+
+static int test_samelong_scalenames(const char *filename) {
+ hid_t fid = -1;
+ hid_t did = -1;
+ char dsname[32];
+ char scalename[32];
+ char name[32];
+
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "al2");
+
+ if((fid = open_test_file(filename)) < 0)
+ goto out;
+
+ TESTING2("set same long scale/cmp scale name");
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ strcpy(scalename, DS_1_NAME);
+ strcat(scalename, "al");
+ strcpy(name, DS_1_NAME);
+ strcat(name, "al");
+ if(test_set_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_2_NAME);
+ strcat(scalename, "al");
+ strcpy(name, DS_2_NAME);
+ strcat(name, "al");
+ if(test_set_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_3_NAME);
+ strcat(scalename, "al");
+ strcpy(name, DS_3_NAME);
+ strcat(name, "al");
+ if(test_set_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ strcpy(scalename, DS_4_NAME);
+ strcat(scalename, "al");
+ strcpy(name, DS_4_NAME);
+ strcat(name, "al");
+ if(test_set_scalename(fid, did, scalename, name, DIM3) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM3) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return SUCCEED;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
+
+static int test_foreign_scaleattached(const char *filename)
+{
+ herr_t ret_value = FAIL;
+ hid_t fid = -1;
+ hid_t did = -1;
+ hid_t dsid = -1;
+
+ TESTING2("test_foreign_scaleattached");
+
+ if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+ goto out;
+
+ if((did = H5Dopen2(fid, "/dset_al", H5P_DEFAULT)) >= 0) {
+ if((dsid = H5Dopen2(fid, "/ds_4_al", H5P_DEFAULT)) >= 0) {
+ if(H5DSis_attached(did, dsid, 3) == 1) {
+ ret_value = SUCCEED;
+ }
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ }
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ if(ret_value == FAIL)
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return 0;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
diff --git a/hl/test/test_ds.c b/hl/test/test_ds.c
index 8fb8604..32622ed 100644
--- a/hl/test/test_ds.c
+++ b/hl/test/test_ds.c
@@ -24,11 +24,56 @@
static herr_t verify_scale(hid_t dset, unsigned dim, hid_t scale, void *visitor_data);
static herr_t read_scale(hid_t dset, unsigned dim, hid_t scale, void *visitor_data);
static herr_t match_dim_scale(hid_t did, unsigned dim, hid_t dsid, void *visitor_data);
-static herr_t op_bogus(hid_t did, unsigned dim, hid_t dsid, void *visitor_data);
+static herr_t op_continue(hid_t did, unsigned dim, hid_t dsid, void *visitor_data);
+static herr_t op_stop(hid_t did, unsigned dim, hid_t dsid, void *visitor_data);
/* prototypes */
+static int create_test_file(const char *fileext);
+static int open_test_file(const char *fileext);
+herr_t create_char_dataset(hid_t fid, const char *dsidx, int fulldims);
+herr_t create_short_dataset(hid_t fid, const char *dsidx, int fulldims);
+herr_t create_int_dataset(hid_t fid, const char *dsidx, int fulldims);
+herr_t create_long_dataset(hid_t fid, const char *dsname, const char *dsidx, int fulldims);
+herr_t create_float_dataset(hid_t fid, const char *dsidx, int fulldims);
+herr_t create_DS1_char_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, char *s_wbuf, char *s1_wbuf);
+herr_t create_DS2_char_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, char *s_wbuf, char *s1_wbuf, char *s2_wbuf);
+herr_t create_DS3_char_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, char *s_wbuf, char *s1_wbuf, char *s2_wbuf, char *s3_wbuf);
+herr_t create_DS1_short_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, short *s_wbuf, short *s1_wbuf);
+herr_t create_DS2_short_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, short *s_wbuf, short *s1_wbuf, short *s2_wbuf);
+herr_t create_DS3_short_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, short *s_wbuf, short *s1_wbuf, short *s2_wbuf, short *s3_wbuf);
+herr_t create_DS1_int_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, int *s_wbuf, int *s1_wbuf);
+herr_t create_DS2_int_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, int *s_wbuf, int *s1_wbuf, int *s2_wbuf);
+herr_t create_DS3_int_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, int *s_wbuf, int *s1_wbuf, int *s2_wbuf, int *s3_wbuf);
+herr_t create_DS1_long_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, long *s_wbuf, long *s1_wbuf);
+herr_t create_DS2_long_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, long *s_wbuf, long *s1_wbuf, long *s2_wbuf);
+herr_t create_DS3_long_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, long *s_wbuf, long *s1_wbuf, long *s2_wbuf, long *s3_wbuf);
+herr_t create_DS4_long_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, long *s_wbuf, long *s1_wbuf, long *s2_wbuf, long *s3_wbuf, long *s4_wbuf);
+herr_t create_DS1_float_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, float *s_wbuf, float *s1_wbuf);
+herr_t create_DS2_float_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, float *s_wbuf, float *s1_wbuf, float *s2_wbuf);
+herr_t create_DS3_float_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, float *s_wbuf, float *s1_wbuf, float *s2_wbuf, float *s3_wbuf);
+herr_t test_attach_scale(hid_t fid, hid_t did, const char *name, unsigned int idx);
+herr_t test_detach_scale(hid_t fid, hid_t did, const char *name, unsigned int idx);
+herr_t test_set_scalename(hid_t fid, hid_t did, const char *name, const char *scalename, unsigned int idx);
+herr_t test_cmp_scalename(hid_t fid, hid_t did, const char *name, const char *scalename, unsigned int idx);
+
+static int test_char_attachscales(const char *fileext);
+static int test_short_attachscales(const char *fileext);
+static int test_int_attachscales(const char *fileext);
+static int test_long_attachscales(const char *fileext);
+static int test_duplicatelong_attachscales(const char *fileext);
+static int test_float_attachscales(const char *fileext);
+static int test_numberofscales(const char *fileext);
+static int test_char_scalenames(const char *fileext);
+static int test_short_scalenames(const char *fileext);
+static int test_int_scalenames(const char *fileext);
+static int test_long_scalenames(const char *fileext);
+static int test_samelong_scalenames(const char *fileext);
+static int test_float_scalenames(const char *fileext);
+static int test_foreign_scaleattached(const char *fileforeign);
+
static int test_simple(void);
static int test_errors(void);
+static int test_errors2(void);
static int test_rank(void);
static int test_types(void);
static int test_iterators(void);
@@ -40,35 +85,55 @@ static int read_data( const char* fname, int ndims, hsize_t *dims, float **buf )
#define DIM_DATA 12
#define DIM1_SIZE 3
#define DIM2_SIZE 4
-#define DIM3_SIZE 2
+#define DIM3_SIZE 12
+#define DIM4_SIZE 2
#define DIM0 0
#define DIM1 1
#define DIM2 2
-
-#define DS_1_NAME "ds_a_1"
-#define DS_11_NAME "ds_a_11"
-#define DS_2_NAME "ds_a_2"
-#define DS_21_NAME "ds_a_21"
-#define DS_22_NAME "ds_a_22"
-#define DS_3_NAME "ds_a_3"
-
-#define SCALE_1_NAME "Latitude set 0"
-#define SCALE_11_NAME "Latitude set 1"
-#define SCALE_2_NAME "Longitude set 0"
-#define SCALE_21_NAME "Longitude set 1"
-#define SCALE_22_NAME "Longitude set 2"
+#define DIM3 3
+
+#define DATASET_NAME "dset_"
+#define DS_1_NAME "ds_1_"
+#define DS_11_NAME "ds_11_"
+#define DS_2_NAME "ds_2_"
+#define DS_21_NAME "ds_21_"
+#define DS_22_NAME "ds_22_"
+#define DS_3_NAME "ds_3_"
+#define DS_31_NAME "ds_31_"
+#define DS_32_NAME "ds_32_"
+#define DS_33_NAME "ds_33_"
+#define DS_4_NAME "ds_4_"
+#define DS_41_NAME "ds_41_"
+#define DS_42_NAME "ds_42_"
+#define DS_43_NAME "ds_43_"
+#define DS_44_NAME "ds_44_"
+
+#define SCALE_1_NAME "scalename_1_"
+#define SCALE_11_NAME "scalename_11_"
+#define SCALE_2_NAME "scalename_2_"
+#define SCALE_21_NAME "scalename_21_"
+#define SCALE_22_NAME "scalename_22_"
+#define SCALE_3_NAME "scalename_3_"
+#define SCALE_31_NAME "scalename_31_"
+#define SCALE_32_NAME "scalename_32_"
+#define SCALE_33_NAME "scalename_33_"
+#define SCALE_4_NAME "scalename_4_"
#define DIM0_LABEL "Latitude"
#define DIM1_LABEL "Longitude"
-#define FILE1 "test_ds1.h5"
-#define FILE2 "test_ds2.h5"
-#define FILE3 "test_ds3.h5"
-#define FILE4 "test_ds4.h5"
-#define FILE5 "test_ds5.h5"
-#define FILE6 "test_ds6.h5"
-
+#define FOREIGN_FILE1 "test_ds_le.h5"
+#define FOREIGN_FILE2 "test_ds_be.h5"
+#define FILENAME "test_ds"
+#define FILEEXT ".h5"
+#define FILE1 "test_ds3.h5"
+#define FILE2 "test_ds4.h5"
+#define FILE3 "test_ds5.h5"
+#define FILE4 "test_ds6.h5"
+#define FILE5 "test_ds7.h5"
+#define FILE6 "test_ds8.h5"
+#define FILE7 "test_ds9.h5"
/*-------------------------------------------------------------------------
* the main program
@@ -76,22 +141,51 @@ static int read_data( const char* fname, int ndims, hsize_t *dims, float **buf )
*/
int main(void)
{
- int nerrors=0;
-
- nerrors += test_simple() < 0 ?1:0;
- nerrors += test_errors() < 0 ?1:0;
- nerrors += test_rank() < 0 ?1:0;
- nerrors += test_iterators() < 0 ?1:0;
- nerrors += test_types() < 0 ?1:0;
- nerrors += test_data() < 0 ?1:0;
-
- if(nerrors) goto error;
- printf("All dimension scales tests passed.\n");
- return 0;
+ int nerrors=0;
+
+ /* create file to be used in following tests */
+ if(create_test_file("1") < 0) {
+ nerrors = 1;
+ goto error;
+ }
+ nerrors += test_char_attachscales("1") < 0 ? 1 : 0;
+ nerrors += test_short_attachscales("1") < 0 ? 1 : 0;
+ nerrors += test_int_attachscales("1") < 0 ? 1 : 0;
+ nerrors += test_long_attachscales("1") < 0 ? 1 : 0;
+ nerrors += test_float_attachscales("1") < 0 ? 1 : 0;
+ nerrors += test_char_scalenames("1") < 0 ? 1 : 0;
+ nerrors += test_short_scalenames("1") < 0 ? 1 : 0;
+ nerrors += test_int_scalenames("1") < 0 ? 1 : 0;
+ nerrors += test_long_scalenames("1") < 0 ? 1 : 0;
+ nerrors += test_float_scalenames("1") < 0 ? 1 : 0;
+ nerrors += test_numberofscales("1") < 0 ? 1 : 0;
+ if(create_test_file("2") < 0) {
+ nerrors = 1;
+ goto error;
+ }
+ nerrors += test_long_attachscales("2") < 0 ? 1 : 0;
+ nerrors += test_duplicatelong_attachscales("2") < 0 ? 1 : 0;
+ nerrors += test_samelong_scalenames("2") < 0 ? 1 : 0;
+ nerrors += test_foreign_scaleattached(FOREIGN_FILE1) < 0 ? 1 : 0;
+ nerrors += test_foreign_scaleattached(FOREIGN_FILE2) < 0 ? 1 : 0;
+
+/* the following tests have not been rewritten to match those above */
+ nerrors += test_simple() < 0 ?1:0;
+ nerrors += test_errors() < 0 ?1:0;
+ nerrors += test_errors2() < 0 ?1:0;
+ nerrors += test_rank() < 0 ?1:0;
+ nerrors += test_iterators() < 0 ?1:0;
+ nerrors += test_types() < 0 ?1:0;
+ nerrors += test_data() < 0 ?1:0;
+
+
+ if(nerrors) goto error;
+ printf("All dimension scales tests passed.\n");
+ return 0;
error:
- printf("***** %d DIMENSION SCALES TEST%s FAILED! *****\n",nerrors, 1 == nerrors ? "" : "S");
- return 1;
+ printf("***** %d DIMENSION SCALES TEST%s FAILED! *****\n",nerrors, 1 == nerrors ? "" : "S");
+ return 1;
}
@@ -101,6 +195,7 @@ error:
* Functions tested:
*
* H5DSattach_scale
+ * H5DSget_num_scales
* H5DSdetach_scale
* H5DSset_label
* H5DSget_label
@@ -108,1340 +203,3219 @@ error:
* H5DSget_scale_name
* H5DSis_scale
* H5DSiterate_scales
- * H5DSget_num_scales
*
*-------------------------------------------------------------------------
*/
-
-static int test_simple(void)
+static hid_t create_test_file(const char *fileext)
{
- hid_t fid; /* file ID */
- hid_t did = -1; /* dataset ID */
- hid_t dsid; /* DS dataset ID */
- hid_t sid; /* space ID */
- hid_t gid; /* group ID */
- int rank = RANK; /* rank of data dataset */
- int rankds = 1; /* rank of DS dataset */
- hsize_t dims[RANK] = {DIM1_SIZE,DIM2_SIZE}; /* size of data dataset */
- int buf[DIM_DATA] = {1,2,3,4,5,6,7,8,9,10,11,12}; /* data of data dataset */
- hsize_t s1_dim[1] = {DIM1_SIZE}; /* size of DS 1 dataset */
- hsize_t s2_dim[1] = {DIM2_SIZE}; /* size of DS 2 dataset */
- char sname[30]; /* scale name buffer */
- char dname[30]; /* dataset name */
- int s1_wbuf[DIM1_SIZE] = {10,20,30}; /* data of DS 1 dataset */
- int s11_wbuf[DIM1_SIZE] = {10,100,300}; /* data of DS 1 dataset */
- int s2_wbuf[DIM2_SIZE] = {100,200,300,400}; /* data of DS 2 dataset */
- int s21_wbuf[DIM2_SIZE] = {10,20,30,40}; /* data of DS 2 dataset */
- int s22_wbuf[DIM2_SIZE] = {5,10,50,300}; /* data of DS 2 dataset */
- char dim0_label[16]; /* read label for DIM 0 */
- char dim1_label[16]; /* read label for DIM 1 */
- char *dim0_labeld; /* read label for DIM 0 */
- char *dim1_labeld; /* read label for DIM 1 */
- char dim0_labels[3]; /* read label for DIM 0 */
- char dim1_labels[3]; /* read label for DIM 1 */
- ssize_t dim0_label_size; /* lenght of label buffer */
- ssize_t dim1_label_size; /* lenght of label buffer */
- unsigned int dim; /* dataset dimension index */
- int scale_idx; /* scale index */
- int nscales; /* number of scales in DIM */
- ssize_t name_len; /* lenght of name buffer */
- char *name_out=NULL; /* scale name buffer */
- char snames[3]; /* scale name buffer */
- int i, j;
-
-
- printf("Testing API functions\n");
-
-/*-------------------------------------------------------------------------
- * create a file for the test
- *-------------------------------------------------------------------------
- */
-
- /* create a file using default properties */
- if((fid=H5Fcreate(FILE1,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * create datasets: 1 "data" dataset and 4 dimension scales
- *-------------------------------------------------------------------------
- */
-
- /* make a dataset */
- if(H5LTmake_dataset_int(fid,"dset_a",rank,dims,buf) < 0)
- goto out;
-
- /* make a DS dataset for the first dimension */
- if(H5LTmake_dataset_int(fid,DS_1_NAME,rankds,s1_dim,s1_wbuf) < 0)
- goto out;
-
- /* make a DS dataset with an alternate scale for the 2nd dimension */
- if(H5LTmake_dataset_int(fid,DS_11_NAME,rankds,s1_dim,s11_wbuf) < 0)
- goto out;
-
- /* make a DS dataset for the second dimension */
- if(H5LTmake_dataset_int(fid,DS_2_NAME,rankds,s2_dim,s2_wbuf) < 0)
- goto out;
-
- /* make a DS dataset with an alternate scale for the 2nd dimension */
- if(H5LTmake_dataset_int(fid,DS_21_NAME,rankds,s2_dim,s21_wbuf) < 0)
- goto out;
-
- /* make a DS dataset with an alternate scale for the 2nd dimension */
- if(H5LTmake_dataset_int(fid,DS_22_NAME,rankds,s2_dim,s22_wbuf) < 0)
- goto out;
-
-
-/*-------------------------------------------------------------------------
- * test 1: attach scale
- *-------------------------------------------------------------------------
- */
-
- TESTING2("attach scales");
-
- /* get the dataset id for "dset_a" */
- if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * attach the DS_1_NAME dimension scale to "dset_a"
- *-------------------------------------------------------------------------
- */
-
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,DS_1_NAME, H5P_DEFAULT)) < 0)
- goto out;
-
- /* attach the DS_1_NAME dimension scale to "dset_a" at dimension 0 */
- if(H5DSattach_scale(did,dsid,DIM0) < 0)
- goto out;
-
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * attach the DS_11_NAME dimension scale to "dset_a"
- *-------------------------------------------------------------------------
- */
-
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,DS_11_NAME, H5P_DEFAULT)) < 0)
- goto out;
-
- /* attach the DS_11_NAME dimension scale to "dset_a" at dimension 0 */
- if(H5DSattach_scale(did,dsid,DIM0) < 0)
- goto out;
-
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * attach the DS_2_NAME dimension scale to "dset_a"
- *-------------------------------------------------------------------------
- */
-
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,DS_2_NAME, H5P_DEFAULT)) < 0)
- goto out;
-
- /* attach the "ds2" dimension scale to "dset_a" as the 2nd dimension */
- if(H5DSattach_scale(did,dsid,DIM1) < 0)
- goto out;
-
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * attach the DS_21_NAME dimension scale to "dset_a"
- *-------------------------------------------------------------------------
- */
-
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,DS_21_NAME, H5P_DEFAULT)) < 0)
- goto out;
-
- /* attach the DS_21_NAME dimension scale to "dset_a" as the 2nd dimension */
- if(H5DSattach_scale(did,dsid,DIM1) < 0)
- goto out;
-
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * attach the DS_22_NAME dimension scale to "dset_a"
- *-------------------------------------------------------------------------
- */
-
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,DS_22_NAME, H5P_DEFAULT)) < 0)
- goto out;
-
- /* attach the "ds22" dimension scale to "dset_a" as the 2nd dimension */
- if(H5DSattach_scale(did,dsid,DIM1) < 0)
- goto out;
-
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
-
-
-
-/*-------------------------------------------------------------------------
- * verify attachment
- *-------------------------------------------------------------------------
- */
-
- if((dsid = H5Dopen2(fid,DS_1_NAME, H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSis_attached(did,dsid,DIM0)<=0)
- goto out;
- if(H5Dclose(dsid))
- goto out;
-
- if((dsid = H5Dopen2(fid,DS_2_NAME, H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSis_attached(did,dsid,DIM1)<=0)
- goto out;
- if(H5Dclose(dsid))
- goto out;
-
- if((dsid = H5Dopen2(fid,DS_21_NAME, H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSis_attached(did,dsid,DIM1)<=0)
- goto out;
- if(H5Dclose(dsid))
- goto out;
-
- if((dsid = H5Dopen2(fid,DS_22_NAME, H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSis_attached(did,dsid,DIM1)<=0)
- goto out;
- if(H5Dclose(dsid))
- goto out;
-
-
- /* close dataset ID of "dset_a" */
- if(H5Dclose(did) < 0)
- goto out;
-
-
- PASSED();
-
-
-/*-------------------------------------------------------------------------
- * test 2: get number of scales
- *-------------------------------------------------------------------------
- */
-
- TESTING2("get number of scales");
-
-/*-------------------------------------------------------------------------
- * verify that "dset_a" has dimension scales
- *-------------------------------------------------------------------------
- */
-
- /* get the dataset id for "dset_a" */
- if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
- goto out;
-
- /* verify that "dset_a" has 1 dimension scale at DIM 0 */
- if((nscales = H5DSget_num_scales(did,0)) < 0)
- goto out;
- if(nscales!=2)
- goto out;
-
- /* verify that "dset_a" has 3 dimension scales at DIM 1 */
- if((nscales = H5DSget_num_scales(did,1)) < 0)
- goto out;
- if(nscales!=3)
- goto out;
-
- /* close dataset ID of "dset_a" */
- if(H5Dclose(did) < 0)
- goto out;
-
-
-/*-------------------------------------------------------------------------
- * create datasets: 1 "data" dataset and 1 dimension scale
- *-------------------------------------------------------------------------
- */
-
- /* make a dataset */
- if(H5LTmake_dataset_int(fid,"dset_b",rank,dims,buf) < 0)
- goto out;
-
- /* make a DS dataset for the first dimension */
- if(H5LTmake_dataset_int(fid,"ds_b_1",rankds,s1_dim,s1_wbuf) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * attach the scale to "dset_b"
- *-------------------------------------------------------------------------
- */
-
- if((did = H5Dopen2(fid,"dset_b", H5P_DEFAULT)) < 0)
- goto out;
- if((dsid = H5Dopen2(fid,"ds_b_1", H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSattach_scale(did,dsid,0) < 0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
- if(H5Dclose(did) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * verify if "dset_b" has dimension scales
- *-------------------------------------------------------------------------
- */
-
- /* get the dataset id for "dset_b" */
- if((did = H5Dopen2(fid,"dset_b", H5P_DEFAULT)) < 0)
- goto out;
-
- /* verify that "dset_b" has 1 dimension scale at DIM 0 */
- if((nscales = H5DSget_num_scales(did,0)) < 0)
- goto out;
- if(nscales!=1)
- goto out;
-
- /* verify that "dset_b" has 0 dimension scales at DIM 1 */
- if((nscales = H5DSget_num_scales(did,1)) < 0)
- goto out;
- if(nscales!=0)
- goto out;
-
- /* close dataset ID of "dset_b" */
- if(H5Dclose(did) < 0)
- goto out;
-
- PASSED();
-
-
-/*-------------------------------------------------------------------------
- * test 3: detach scales
- *-------------------------------------------------------------------------
- */
-
- TESTING2("detach scales ");
-
-
-/*-------------------------------------------------------------------------
- * create datasets: one "data" dataset and 4 dimension scales
- *-------------------------------------------------------------------------
- */
-
- /* make a dataset */
- if(H5LTmake_dataset_int(fid,"dset_c",rank,dims,buf) < 0)
- goto out;
-
- /* make a DS dataset for the first dimension */
- if(H5LTmake_dataset_int(fid,"ds_c_1",rankds,s1_dim,s1_wbuf) < 0)
- goto out;
-
- /* make a DS dataset for the second dimension */
- if(H5LTmake_dataset_int(fid,"ds_c_2",rankds,s2_dim,s2_wbuf) < 0)
- goto out;
-
- /* make a DS dataset with an alternate scale for the 2nd dimension */
- if(H5LTmake_dataset_int(fid,"ds_c_21",rankds,s2_dim,s2_wbuf) < 0)
- goto out;
-
- /* make a DS dataset with an alternate scale for the 2nd dimension */
- if(H5LTmake_dataset_int(fid,"ds_c_22",rankds,s2_dim,s2_wbuf) < 0)
- goto out;
-
-
-/*-------------------------------------------------------------------------
- * attach the scales to "dset_c"
- *-------------------------------------------------------------------------
- */
-
- if((did = H5Dopen2(fid,"dset_c", H5P_DEFAULT)) < 0)
- goto out;
-
- if((dsid = H5Dopen2(fid,"ds_c_1", H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSattach_scale(did,dsid,0) < 0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
-
- if((dsid = H5Dopen2(fid,"ds_c_2", H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSattach_scale(did,dsid,1) < 0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
-
- if((dsid = H5Dopen2(fid,"ds_c_21", H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSattach_scale(did,dsid,1) < 0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
-
- if((dsid = H5Dopen2(fid,"ds_c_22", H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSattach_scale(did,dsid,1) < 0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
-
- if(H5Dclose(did) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * verify if "dset_c" has dimension scales
- *-------------------------------------------------------------------------
- */
-
- if((did = H5Dopen2(fid,"dset_c", H5P_DEFAULT)) < 0)
- goto out;
- /* verify that "dset_c" has 1 dimension scale at DIM 0 */
- if((nscales = H5DSget_num_scales(did,0)) < 0)
- goto out;
- if(nscales!=1)
- goto out;
- /* verify that "dset_c" has 3 dimension scales at DIM 1 */
- if((nscales = H5DSget_num_scales(did,1)) < 0)
- goto out;
- if(nscales!=3)
- goto out;
- if(H5Dclose(did) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * detach the "ds_c_21" dimension scale to "dset_c"
- *-------------------------------------------------------------------------
- */
-
- /* get the dataset id for "dset_c" */
- if((did = H5Dopen2(fid,"dset_c", H5P_DEFAULT)) < 0)
- goto out;
-
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,"ds_c_21", H5P_DEFAULT)) < 0)
- goto out;
-
- /* detach the "ds_c_21" dimension scale to "dset_c" in DIM 1 */
- if(H5DSdetach_scale(did,dsid,1) < 0)
- goto out;
-
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
-
- /* close dataset ID of "dset_c" */
- if(H5Dclose(did) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * "dset_c" must have now 2 dimension scales at DIM 1
- *-------------------------------------------------------------------------
- */
-
- if((did = H5Dopen2(fid,"dset_c", H5P_DEFAULT)) < 0)
- goto out;
- /* verify that "dset_c" has 2 dimension scales at DIM 1 */
- if((nscales = H5DSget_num_scales(did,1)) < 0)
- goto out;
- if(nscales!=2)
- goto out;
- if(H5Dclose(did) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * detach the "ds_c_22" dimension scale to "dset_c"
- *-------------------------------------------------------------------------
- */
-
- /* get the dataset id for "dset_c" */
- if((did = H5Dopen2(fid,"dset_c", H5P_DEFAULT)) < 0)
- goto out;
-
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,"ds_c_22", H5P_DEFAULT)) < 0)
- goto out;
-
- /* detach the "ds_c_22" dimension scale to "dset_c" in DIM 1 */
- if(H5DSdetach_scale(did,dsid,1) < 0)
- goto out;
+ char filename[65];
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
-
- /* close dataset ID of "dset_c" */
- if(H5Dclose(did) < 0)
- goto out;
+ strcpy(filename, FILENAME);
+ strcat(filename, fileext);
+ strcat(filename, FILEEXT);
+ return H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+}
-/*-------------------------------------------------------------------------
- * "dset_c" must have now 1 dimension scale at DIM 1
- *-------------------------------------------------------------------------
- */
+static hid_t open_test_file(const char *fileext)
+{
+ char filename[65];
- if((did = H5Dopen2(fid,"dset_c", H5P_DEFAULT)) < 0)
- goto out;
- /* verify that "dset_c" has 1 dimension scale at DIM 1 */
- if((nscales = H5DSget_num_scales(did,1)) < 0)
- goto out;
- if(nscales!=1)
- goto out;
- if(H5Dclose(did) < 0)
- goto out;
+ strcpy(filename, FILENAME);
+ strcat(filename, fileext);
+ strcat(filename, FILEEXT);
+
+ return H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT);
+}
/*-------------------------------------------------------------------------
- * detach the "ds_c_2" dimension scale to "dset_c"
+ * create "data" dataset
*-------------------------------------------------------------------------
*/
+herr_t create_char_dataset(hid_t fid, const char *dsidx, int fulldims)
+{
+ int rank = 3;
+ int rankds = 1;
+ hsize_t dims[3] = {DIM1_SIZE,DIM2_SIZE,DIM3_SIZE};
+ char buf[DIM_DATA*3] = {1,2,3,4,5,6,7,8,9,10,11,12,
+ 1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12};
+ hsize_t s1_dim[1] = {DIM1_SIZE};
+ hsize_t s2_dim[1] = {DIM2_SIZE};
+ hsize_t s3_dim[1] = {DIM3_SIZE};
+ char s1_wbuf[DIM1_SIZE] = {1,2,3};
+ char s11_wbuf[DIM1_SIZE] = {10,20,30};
+ char s2_wbuf[DIM2_SIZE] = {10,20,30,40};
+ char s21_wbuf[DIM2_SIZE] = {1,2,3,4};
+ char s22_wbuf[DIM2_SIZE] = {5,10,50,100};
+ char s3_wbuf[DIM3_SIZE] = {10,10,10,20,20,20,30,30,30,40,40,40};
+ char s31_wbuf[DIM3_SIZE] = {1,1,1,2,2,2,3,3,3,4,4,4};
+ char s32_wbuf[DIM3_SIZE] = {5,5,5,10,10,10,50,50,50,100,100,100};
+ char s33_wbuf[DIM3_SIZE] = {6,6,6,12,12,12,53,53,53,120,120,120};
+ char name[32];
+
+ strcpy(name, DATASET_NAME);
+ strcat(name, dsidx);
+ /* make a dataset */
+ if(H5LTmake_dataset_char(fid, name, rank, dims, buf) >= 0) {
+ if(fulldims==0) {
+ /* make a DS dataset for the first dimension */
+ if(create_DS1_char_datasets(fid, dsidx, rankds, s1_dim, s1_wbuf, NULL) < 0)
+ return FAIL;
+
+ /* make a DS dataset for the second dimension */
+ if(create_DS2_char_datasets(fid, dsidx, rankds, s2_dim, s2_wbuf, NULL, NULL) < 0)
+ return FAIL;
+
+ /* make a DS dataset for the third dimension */
+ if(create_DS3_char_datasets(fid, dsidx, rankds, s3_dim, s3_wbuf, NULL, NULL, NULL) < 0)
+ return FAIL;
+ }
+ else {
+ if(create_DS1_char_datasets(fid, dsidx, rankds, s1_dim, s1_wbuf, s11_wbuf) < 0)
+ return FAIL;
+
+ if(create_DS2_char_datasets(fid, dsidx, rankds, s2_dim, s2_wbuf, s21_wbuf, s22_wbuf) < 0)
+ return FAIL;
+
+ if(create_DS3_char_datasets(fid, dsidx, rankds, s3_dim, s3_wbuf, s31_wbuf, s32_wbuf, s33_wbuf) < 0)
+ return FAIL;
+ }
+ }
+ else
+ return FAIL;
+ return SUCCEED;
+}
- /* get the dataset id for "dset_c" */
- if((did = H5Dopen2(fid,"dset_c", H5P_DEFAULT)) < 0)
- goto out;
-
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,"ds_c_2", H5P_DEFAULT)) < 0)
- goto out;
-
- /* detach the "ds_c_2" dimension scale to "dset_c" in DIM 1 */
- if(H5DSdetach_scale(did,dsid,1) < 0)
- goto out;
-
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
-
- /* close dataset ID of "dset_c" */
- if(H5Dclose(did) < 0)
- goto out;
+herr_t create_short_dataset(hid_t fid, const char *dsidx, int fulldims)
+{
+ int rank = 3;
+ int rankds = 1;
+ hsize_t dims[3] = {DIM1_SIZE,DIM2_SIZE,DIM3_SIZE};
+ short buf[DIM_DATA*3] = {1,2,3,4,5,6,7,8,9,10,11,12,
+ 1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12};
+ hsize_t s1_dim[1] = {DIM1_SIZE};
+ hsize_t s2_dim[1] = {DIM2_SIZE};
+ hsize_t s3_dim[1] = {DIM3_SIZE};
+ short s1_wbuf[DIM1_SIZE] = {10,20,30};
+ short s11_wbuf[DIM1_SIZE] = {10,100,300};
+ short s2_wbuf[DIM2_SIZE] = {100,200,300,400};
+ short s21_wbuf[DIM2_SIZE] = {10,20,30,40};
+ short s22_wbuf[DIM2_SIZE] = {5,10,50,300};
+ short s3_wbuf[DIM3_SIZE] = {10,10,10,20,20,20,30,30,30,40,40,40};
+ short s31_wbuf[DIM3_SIZE] = {1,1,1,2,2,2,3,3,3,4,4,4};
+ short s32_wbuf[DIM3_SIZE] = {5,5,5,10,10,10,50,50,50,100,100,100};
+ short s33_wbuf[DIM3_SIZE] = {6,6,6,12,12,12,53,53,53,140,140,140};
+ char name[32];
+
+ strcpy(name, DATASET_NAME);
+ strcat(name, dsidx);
+
+ /* make a dataset */
+ if(H5LTmake_dataset_short(fid, name, rank, dims, buf) >= 0) {
+ if(fulldims==0) {
+ /* make a DS dataset for the first dimension */
+ if(create_DS1_short_datasets(fid, dsidx, rankds, s1_dim, s1_wbuf, NULL) < 0)
+ return FAIL;
+
+ /* make a DS dataset for the second dimension */
+ if(create_DS2_short_datasets(fid, dsidx, rankds, s2_dim, s2_wbuf, NULL, NULL) < 0)
+ return FAIL;
+
+ /* make a DS dataset for the third dimension */
+ if(create_DS3_short_datasets(fid, dsidx, rankds, s3_dim, s3_wbuf, NULL, NULL, NULL) < 0)
+ return FAIL;
+ }
+ else {
+ if(create_DS1_short_datasets(fid, dsidx, rankds, s1_dim, s1_wbuf, s11_wbuf) < 0)
+ return FAIL;
+
+ if(create_DS2_short_datasets(fid, dsidx, rankds, s2_dim, s2_wbuf, s21_wbuf, s22_wbuf) < 0)
+ return FAIL;
+
+ if(create_DS3_short_datasets(fid, dsidx, rankds, s3_dim, s3_wbuf, s31_wbuf, s32_wbuf, s33_wbuf) < 0)
+ return FAIL;
+ }
+ }
+ else
+ return FAIL;
+ return SUCCEED;
+}
-/*-------------------------------------------------------------------------
- * "dset_c" must have now 0 dimension scales at DIM 1
- *-------------------------------------------------------------------------
- */
+herr_t create_int_dataset(hid_t fid, const char *dsidx, int fulldims)
+{
+ int rank = RANK;
+ int rankds = 1;
+ hsize_t dims[RANK] = {DIM1_SIZE,DIM2_SIZE};
+ int buf[DIM_DATA] = {1,2,3,4,5,6,7,8,9,10,11,12};
+ hsize_t s1_dim[1] = {DIM1_SIZE};
+ hsize_t s2_dim[1] = {DIM2_SIZE};
+ int s1_wbuf[DIM1_SIZE] = {10,20,30};
+ int s11_wbuf[DIM1_SIZE] = {10,100,300};
+ int s2_wbuf[DIM2_SIZE] = {100,200,300,400};
+ int s21_wbuf[DIM2_SIZE] = {10,20,30,40};
+ int s22_wbuf[DIM2_SIZE] = {5,10,50,300};
+ char name[32];
+
+ strcpy(name, DATASET_NAME);
+ strcat(name, dsidx);
+
+ /* make a dataset */
+ if(H5LTmake_dataset_int(fid, name, rank, dims, buf) >= 0) {
+ if(fulldims==0) {
+ /* make a DS dataset for the first dimension */
+ if(create_DS1_int_datasets(fid, dsidx, rankds, s1_dim, s1_wbuf, NULL) < 0)
+ return FAIL;
+
+ /* make a DS dataset for the second dimension */
+ if(create_DS2_int_datasets(fid, dsidx, rankds, s2_dim, s2_wbuf, NULL, NULL) < 0)
+ return FAIL;
+ }
+ else {
+ if(create_DS1_int_datasets(fid, dsidx, rankds, s1_dim, s1_wbuf, s11_wbuf) < 0)
+ return FAIL;
+
+ if(create_DS2_int_datasets(fid, dsidx, rankds, s2_dim, s2_wbuf, s21_wbuf, s22_wbuf) < 0)
+ return FAIL;
+ }
+ }
+ else
+ return FAIL;
+ return SUCCEED;
+}
- if((did = H5Dopen2(fid,"dset_c", H5P_DEFAULT)) < 0)
- goto out;
- /* verify that "dset_c" has 1 dimension scale at DIM 1 */
- if((nscales = H5DSget_num_scales(did,1)) < 0)
- goto out;
- if(nscales!=0)
- goto out;
- if(H5Dclose(did) < 0)
- goto out;
+herr_t create_long_dataset(hid_t fid, const char *dsname, const char *dsidx, int fulldims)
+{
+ int rank = 4;
+ int rankds = 1;
+ hsize_t dims[4] = {DIM1_SIZE,DIM2_SIZE,DIM3_SIZE,DIM4_SIZE};
+ long buf[DIM_DATA*3*2] = {1,2,3,4,5,6,7,8,9,10,11,12,
+ 1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,
+ 1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,
+ 1,2,3,4,5,6,7,8,9,10,11,12};
+ hsize_t s1_dim[1] = {DIM1_SIZE};
+ hsize_t s2_dim[1] = {DIM2_SIZE};
+ hsize_t s3_dim[1] = {DIM3_SIZE};
+ hsize_t s4_dim[1] = {DIM4_SIZE};
+ long s1_wbuf[DIM1_SIZE] = {10,20,30};
+ long s11_wbuf[DIM1_SIZE] = {10,100,300};
+ long s2_wbuf[DIM2_SIZE] = {100,200,300,400};
+ long s21_wbuf[DIM2_SIZE] = {10,20,30,40};
+ long s22_wbuf[DIM2_SIZE] = {5,10,50,300};
+ long s3_wbuf[DIM3_SIZE] = {10,10,10,20,20,20,30,30,30,40,40,40};
+ long s31_wbuf[DIM3_SIZE] = {1,1,1,2,2,2,3,3,3,4,4,4};
+ long s32_wbuf[DIM3_SIZE] = {5,5,5,10,10,10,50,50,50,100,100,100};
+ long s33_wbuf[DIM3_SIZE] = {6,6,6,12,12,12,53,53,53,140,140,140};
+ long s4_wbuf[DIM4_SIZE] = {18,18};
+ long s41_wbuf[DIM4_SIZE] = {8,8};
+ long s42_wbuf[DIM4_SIZE] = {80,80};
+ long s43_wbuf[DIM4_SIZE] = {180,180};
+ long s44_wbuf[DIM4_SIZE] = {280,280};
+ char name[32];
+
+ strcpy(name, dsname);
+
+ /* make a dataset */
+ if(H5LTmake_dataset_long(fid, name, rank, dims, buf) >= 0) {
+ if(fulldims==0) {
+ /* make a DS dataset for the first dimension */
+ if(create_DS1_long_datasets(fid, dsidx, rankds, s1_dim, s1_wbuf, NULL) < 0)
+ return FAIL;
+
+ /* make a DS dataset for the second dimension */
+ if(create_DS2_long_datasets(fid, dsidx, rankds, s2_dim, s2_wbuf, NULL, NULL) < 0)
+ return FAIL;
+
+ /* make a DS dataset for the third dimension */
+ if(create_DS3_long_datasets(fid, dsidx, rankds, s3_dim, s3_wbuf, NULL, NULL, NULL) < 0)
+ return FAIL;
+
+ /* make a DS dataset for the fourth dimension */
+ if(create_DS4_long_datasets(fid, dsidx, rankds, s4_dim, s4_wbuf, NULL, NULL, NULL, NULL) < 0)
+ return FAIL;
+ }
+ else {
+ if(create_DS1_long_datasets(fid, dsidx, rankds, s1_dim, s1_wbuf, s11_wbuf) < 0)
+ return FAIL;
+
+ if(create_DS2_long_datasets(fid, dsidx, rankds, s2_dim, s2_wbuf, s21_wbuf, s22_wbuf) < 0)
+ return FAIL;
+
+ if(create_DS3_long_datasets(fid, dsidx, rankds, s3_dim, s3_wbuf, s31_wbuf, s32_wbuf, s33_wbuf) < 0)
+ return FAIL;
+
+ if(create_DS4_long_datasets(fid, dsidx, rankds, s4_dim, s4_wbuf, s41_wbuf, s42_wbuf, s43_wbuf, s44_wbuf) < 0)
+ return FAIL;
+ }
+ }
+ else
+ return FAIL;
+ return SUCCEED;
+}
+herr_t create_float_dataset(hid_t fid, const char *dsidx, int fulldims)
+{
+ int rank = RANK;
+ int rankds = 1;
+ hsize_t dims[RANK] = {DIM1_SIZE,DIM2_SIZE};
+ float buf[DIM_DATA] = {1,2,3,4,5,6,7,8,9,10,11,12};
+ hsize_t s1_dim[1] = {DIM1_SIZE};
+ hsize_t s2_dim[1] = {DIM2_SIZE};
+ float s1_wbuf[DIM1_SIZE] = {10,20,30};
+ float s11_wbuf[DIM1_SIZE] = {10,100,300};
+ float s2_wbuf[DIM2_SIZE] = {100,200,300,400};
+ float s21_wbuf[DIM2_SIZE] = {10,20,30,40};
+ float s22_wbuf[DIM2_SIZE] = {5,10,50,300};
+ char name[32];
+
+ strcpy(name, DATASET_NAME);
+ strcat(name, dsidx);
+
+ /* make a dataset */
+ if(H5LTmake_dataset_float(fid, name, rank, dims, buf) >= 0) {
+ if(fulldims==0) {
+ /* make a DS dataset for the first dimension */
+ if(create_DS1_float_datasets(fid, dsidx, rankds, s1_dim, s1_wbuf, NULL) < 0)
+ return FAIL;
+
+ /* make a DS dataset for the second dimension */
+ if(create_DS2_float_datasets(fid, dsidx, rankds, s2_dim, s2_wbuf, NULL, NULL) < 0)
+ return FAIL;
+ }
+ else {
+ if(create_DS1_float_datasets(fid, dsidx, rankds, s1_dim, s1_wbuf, s11_wbuf) < 0)
+ return FAIL;
+
+ if(create_DS2_float_datasets(fid, dsidx, rankds, s2_dim, s2_wbuf, s21_wbuf, s22_wbuf) < 0)
+ return FAIL;
+ }
+ }
+ else
+ return FAIL;
+ return SUCCEED;
+}
/*-------------------------------------------------------------------------
- * create 3 datasets: 1 "data" dataset and 2 dimension scales
+ * create 2 dimension scales datasets for first dimension
*-------------------------------------------------------------------------
*/
- if(H5LTmake_dataset_int(fid,"dset_d",rank,dims,NULL) < 0)
- goto out;
- if(H5LTmake_dataset_int(fid,"ds_d_1",rankds,s1_dim,NULL) < 0)
- goto out;
- if(H5LTmake_dataset_int(fid,"ds_d_2",rankds,s2_dim,NULL) < 0)
- goto out;
+herr_t create_DS1_char_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, char *s_wbuf, char *s1_wbuf)
+{
+ char name[32];
+
+ strcpy(name, DS_1_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_char(fid, name, rankds, s_dim, s_wbuf) < 0)
+ return FAIL;
+
+ if(s1_wbuf!=NULL) {
+ strcpy(name, DS_11_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the first dimension */
+ if(H5LTmake_dataset_char(fid, name, rankds, s_dim, s1_wbuf) < 0)
+ return FAIL;
+ }
+
+ return SUCCEED;
+}
/*-------------------------------------------------------------------------
- * attach them
+ * create 3 dimension scales datasets for second dimension
*-------------------------------------------------------------------------
*/
- if((did = H5Dopen2(fid,"dset_d", H5P_DEFAULT)) < 0)
- goto out;
-
- if((dsid = H5Dopen2(fid,"ds_d_1", H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSattach_scale(did,dsid,0) < 0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
- if((dsid = H5Dopen2(fid,"ds_d_2", H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSattach_scale(did,dsid,1) < 0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
-
- if(H5Dclose(did) < 0)
- goto out;
+herr_t create_DS2_char_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, char *s_wbuf, char *s1_wbuf, char *s2_wbuf)
+{
+ char name[32];
+
+ strcpy(name, DS_2_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset for the second dimension */
+ if(H5LTmake_dataset_char(fid, name, rankds, s_dim, s_wbuf) < 0)
+ return FAIL;
+
+ if(s1_wbuf!=NULL) {
+ strcpy(name, DS_21_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_char(fid, name, rankds, s_dim, s1_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s2_wbuf!=NULL) {
+ strcpy(name, DS_22_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_char(fid, name, rankds, s_dim, s2_wbuf) < 0)
+ return FAIL;
+ }
+
+ return SUCCEED;
+}
/*-------------------------------------------------------------------------
- * verify
+ * create 1 dimension scales datasets for third dimension of dataset
*-------------------------------------------------------------------------
*/
-
- if((did = H5Dopen2(fid,"dset_d", H5P_DEFAULT)) < 0)
- goto out;
-
- if((dsid = H5Dopen2(fid,"ds_d_1", H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSis_attached(did,dsid,DIM0)<=0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
-
- if((dsid = H5Dopen2(fid,"ds_d_2", H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSis_attached(did,dsid,DIM1)<=0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
-
- if(H5Dclose(did) < 0)
- goto out;
-
+herr_t create_DS3_char_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, char *s_wbuf, char *s1_wbuf, char *s2_wbuf, char *s3_wbuf)
+{
+ char name[32];
+
+ strcpy(name, DS_3_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_char(fid, name, rankds, s_dim, s_wbuf) < 0)
+ return FAIL;
+
+ if(s1_wbuf!=NULL) {
+ strcpy(name, DS_31_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_char(fid, name, rankds, s_dim, s1_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s2_wbuf!=NULL) {
+ strcpy(name, DS_32_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_char(fid, name, rankds, s_dim, s2_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s3_wbuf!=NULL) {
+ strcpy(name, DS_33_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_char(fid, name, rankds, s_dim, s3_wbuf) < 0)
+ return FAIL;
+ }
+
+ return SUCCEED;
+}
/*-------------------------------------------------------------------------
- * detach
+ * create 2 dimension scales datasets for first dimension
*-------------------------------------------------------------------------
*/
-
- /* get the dataset id for "dset_d" */
- if((did = H5Dopen2(fid,"dset_d", H5P_DEFAULT)) < 0)
- goto out;
-
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,"ds_d_1", H5P_DEFAULT)) < 0)
- goto out;
-
- /* detach the dimension scale to "dset_d" in DIM 0 */
- if(H5DSdetach_scale(did,dsid,DIM0) < 0)
- goto out;
-
- /* verify attach, it must return 0 for no attach */
- if(H5DSis_attached(did,dsid,DIM0)!=0)
- goto out;
-
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
-
- /* close dataset ID of "dset_d" */
- if(H5Dclose(did) < 0)
- goto out;
+herr_t create_DS1_short_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, short *s_wbuf, short *s1_wbuf)
+{
+ char name[32];
+
+ strcpy(name, DS_1_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_short(fid, name, rankds, s_dim, s_wbuf) < 0)
+ return FAIL;
+
+ if(s1_wbuf!=NULL) {
+ strcpy(name, DS_11_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the first dimension */
+ if(H5LTmake_dataset_short(fid, name, rankds, s_dim, s1_wbuf) < 0)
+ return FAIL;
+ }
+
+ return SUCCEED;
+}
/*-------------------------------------------------------------------------
- * attach again
+ * create 3 dimension scales datasets for second dimension
*-------------------------------------------------------------------------
*/
-
- /* get the dataset id for "dset_d" */
- if((did = H5Dopen2(fid,"dset_d", H5P_DEFAULT)) < 0)
- goto out;
-
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,"ds_d_1", H5P_DEFAULT)) < 0)
- goto out;
-
- /* attach "ds_d_1" again in DIM 0 */
- if(H5DSattach_scale(did,dsid,DIM0) < 0)
- goto out;
-
- /* verify attach, it must return 1 for attach */
- if(H5DSis_attached(did,dsid,DIM0)!=1)
- goto out;
-
- /* verify that "ds_d_1" has only 1 scale at DIM0 */
- if((nscales = H5DSget_num_scales(did,DIM0)) < 0)
- goto out;
- if(nscales!=1)
- goto out;
-
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
-
- /* close dataset ID of "dset_d" */
- if(H5Dclose(did) < 0)
- goto out;
+herr_t create_DS2_short_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, short *s_wbuf, short *s1_wbuf, short *s2_wbuf)
+{
+ char name[32];
+
+ strcpy(name, DS_2_NAME);
+ strcat(name, dsidx);
+
+ /* make a DS dataset for the second dimension */
+ if(H5LTmake_dataset_short(fid, name, rankds, s_dim, s_wbuf) < 0)
+ return FAIL;
+
+ if(s1_wbuf!=NULL) {
+ strcpy(name, DS_21_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_short(fid, name, rankds, s_dim, s1_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s2_wbuf!=NULL) {
+ strcpy(name, DS_22_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_short(fid, name, rankds, s_dim, s2_wbuf) < 0)
+ return FAIL;
+ }
+
+ return SUCCEED;
+}
/*-------------------------------------------------------------------------
- * detach/detach
+ * create 1 dimension scales datasets for third dimension of dataset
*-------------------------------------------------------------------------
*/
-
- /* get the dataset id for "dset_d" */
- if((did = H5Dopen2(fid,"dset_d", H5P_DEFAULT)) < 0)
- goto out;
-
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,"ds_d_2", H5P_DEFAULT)) < 0)
- goto out;
-
- /* detach the "ds_d_2" dimension scale to "dset_d" in DIM 1 */
- if(H5DSdetach_scale(did,dsid,DIM1) < 0)
- goto out;
-
- /* detach again, it should fail */
- if(H5DSdetach_scale(did,dsid,DIM1)==SUCCEED)
- goto out;
-
- /* verify attach, it must return 0 for no attach */
- if(H5DSis_attached(did,dsid,DIM1)!=0)
- goto out;
-
- /* verify that "ds_d_1" has no scale at DIM1 */
- if((nscales = H5DSget_num_scales(did,DIM1)) < 0)
- goto out;
- if(nscales!=0)
- goto out;
-
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
-
- /* close dataset ID of "dset_d" */
- if(H5Dclose(did) < 0)
- goto out;
+herr_t create_DS3_short_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, short *s_wbuf, short *s1_wbuf, short *s2_wbuf, short *s3_wbuf)
+{
+ char name[32];
+
+ strcpy(name, DS_3_NAME);
+ strcat(name, dsidx);
+
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_short(fid, name, rankds, s_dim, s_wbuf) < 0)
+ return FAIL;
+
+ if(s1_wbuf!=NULL) {
+ strcpy(name, DS_31_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_short(fid, name, rankds, s_dim, s1_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s2_wbuf!=NULL) {
+ strcpy(name, DS_32_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_short(fid, name, rankds, s_dim, s2_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s3_wbuf!=NULL) {
+ strcpy(name, DS_33_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_short(fid, name, rankds, s_dim, s3_wbuf) < 0)
+ return FAIL;
+ }
+
+ return SUCCEED;
+}
/*-------------------------------------------------------------------------
- * attach twice
+ * create 2 dimension scales datasets for first dimension
*-------------------------------------------------------------------------
*/
+herr_t create_DS1_int_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, int *s_wbuf, int *s1_wbuf)
+{
+ char name[32];
- /* get the dataset id for "dset_d" */
- if((did = H5Dopen2(fid,"dset_d", H5P_DEFAULT)) < 0)
- goto out;
-
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,"ds_d_2", H5P_DEFAULT)) < 0)
- goto out;
-
- /* attach "ds_d_2" in DIM 1 */
- if(H5DSattach_scale(did,dsid,DIM1) < 0)
- goto out;
-
- /* verify attach, it must return 1 for attach */
- if(H5DSis_attached(did,dsid,DIM1)!=1)
- goto out;
-
- /* verify that "ds_d_2" has only 1 scale at DIM1 */
- if((nscales = H5DSget_num_scales(did,DIM0)) < 0)
- goto out;
- if(nscales!=1)
- goto out;
-
- /* attach "ds_d_2" again in DIM 1 */
- if(H5DSattach_scale(did,dsid,DIM1) < 0)
- goto out;
-
- /* verify attach, it must return 1 for attach */
- if(H5DSis_attached(did,dsid,DIM1)!=1)
- goto out;
+ strcpy(name, DS_1_NAME);
+ strcat(name, dsidx);
- /* verify that "ds_d_2" has only 1 scale at DIM1 */
- if((nscales = H5DSget_num_scales(did,DIM0)) < 0)
- goto out;
- if(nscales != 1)
- goto out;
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_int(fid, name, rankds, s_dim, s_wbuf) < 0)
+ return FAIL;
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
+ if(s1_wbuf!=NULL) {
+ strcpy(name, DS_11_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the first dimension */
+ if(H5LTmake_dataset_int(fid, name, rankds, s_dim, s1_wbuf) < 0)
+ return FAIL;
+ }
- /* close dataset ID of "dset_d" */
- if(H5Dclose(did) < 0)
- goto out;
+ return SUCCEED;
+}
/*-------------------------------------------------------------------------
- * create 10 datasets: 5 "data" dataset and 5 dimension scales
+ * create 3 dimension scales datasets for second dimension
*-------------------------------------------------------------------------
*/
-
- /* create a group */
- if((gid = H5Gcreate2(fid, "grp", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
-
- /* create the data space for the dataset */
- if((sid = H5Screate_simple(rank,dims,NULL)) < 0)
- goto out;
-
- for(i = 0; i < 5; i++) {
- sprintf(dname,"dset_%d",i);
- if((did = H5Dcreate2(gid, dname, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
- sprintf(sname,"ds_%d",i);
- if((dsid = H5Dcreate2(gid, sname, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSset_scale(dsid,"scale") < 0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
- if(H5Dclose(did) < 0)
- goto out;
- }
+herr_t create_DS2_int_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, int *s_wbuf, int *s1_wbuf, int *s2_wbuf)
+{
+ char name[32];
+
+ strcpy(name, DS_2_NAME);
+ strcat(name, dsidx);
+
+ /* make a DS dataset for the second dimension */
+ if(H5LTmake_dataset_int(fid, name, rankds, s_dim, s_wbuf) < 0)
+ return FAIL;
+
+ if(s1_wbuf!=NULL) {
+ strcpy(name, DS_21_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_int(fid, name, rankds, s_dim, s1_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s2_wbuf!=NULL) {
+ strcpy(name, DS_22_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_int(fid, name, rankds, s_dim, s2_wbuf) < 0)
+ return FAIL;
+ }
+
+ return SUCCEED;
+}
/*-------------------------------------------------------------------------
- * attach for DIM 0
+ * create 1 dimension scales datasets for third dimension of dataset
*-------------------------------------------------------------------------
*/
-
- for(i = 0; i < 5; i++) {
- sprintf(dname, "dset_%d", i);
- if((did = H5Dopen2(gid, dname, H5P_DEFAULT)) < 0)
- goto out;
- for(j = 0; j < 5; j++) {
- sprintf(sname, "ds_%d", j);
- if((dsid = H5Dopen2(gid, sname, H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSattach_scale(did, dsid, DIM0) < 0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
- }
- if(H5Dclose(did) < 0)
- goto out;
- }
+herr_t create_DS3_int_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, int *s_wbuf, int *s1_wbuf, int *s2_wbuf, int *s3_wbuf)
+{
+ char name[32];
+
+ strcpy(name, DS_3_NAME);
+ strcat(name, dsidx);
+
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_int(fid, name, rankds, s_dim, s_wbuf) < 0)
+ return FAIL;
+
+ if(s1_wbuf!=NULL) {
+ strcpy(name, DS_31_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the first dimension */
+ if(H5LTmake_dataset_int(fid, name, rankds, s_dim, s1_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s2_wbuf!=NULL) {
+ strcpy(name, DS_32_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the first dimension */
+ if(H5LTmake_dataset_int(fid, name, rankds, s_dim, s2_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s3_wbuf!=NULL) {
+ strcpy(name, DS_33_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the first dimension */
+ if(H5LTmake_dataset_int(fid, name, rankds, s_dim, s3_wbuf) < 0)
+ return FAIL;
+ }
+
+ return SUCCEED;
+}
/*-------------------------------------------------------------------------
- * dettach for DIM0
+ * create 2 dimension scales datasets for first dimension
*-------------------------------------------------------------------------
*/
+herr_t create_DS1_long_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, long *s_wbuf, long *s1_wbuf)
+{
+ char name[32];
- for(i = 0; i < 5; i++) {
- sprintf(dname, "dset_%d", i);
- if((did = H5Dopen2(gid, dname, H5P_DEFAULT)) < 0)
- goto out;
- for(j = 0; j < 5; j++) {
- sprintf(sname, "ds_%d", j);
- if((dsid = H5Dopen2(gid, sname, H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSdetach_scale(did, dsid, DIM0) < 0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
- }
- if(H5Dclose(did) < 0)
- goto out;
- }
-
+ strcpy(name, DS_1_NAME);
+ strcat(name, dsidx);
-/*-------------------------------------------------------------------------
- * attach again for DIM0
- *-------------------------------------------------------------------------
- */
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_long(fid, name, rankds, s_dim, s_wbuf) < 0)
+ return FAIL;
- for(i=0; i<5; i++)
- {
- sprintf(dname,"dset_%d",i);
- if((did = H5Dopen2(gid,dname, H5P_DEFAULT)) < 0)
- goto out;
- for(j=0; j<5; j++)
- {
- sprintf(sname,"ds_%d",j);
- if((dsid = H5Dopen2(gid,sname, H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSattach_scale(did,dsid,DIM0) < 0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
- }
- if(H5Dclose(did) < 0)
- goto out;
- }
-
- /* close */
- if(H5Sclose(sid) < 0)
- goto out;
- if(H5Gclose(gid) < 0)
- goto out;
-
-
- PASSED();
+ if(s1_wbuf!=NULL) {
+ strcpy(name, DS_11_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the first dimension */
+ if(H5LTmake_dataset_long(fid, name, rankds, s_dim, s1_wbuf) < 0)
+ return FAIL;
+ }
+ return SUCCEED;
+}
/*-------------------------------------------------------------------------
- * create a dataset and attach only to 1 dimension
+ * create 3 dimension scales datasets for second dimension
*-------------------------------------------------------------------------
*/
-
- TESTING2("attach only to 1 dimension");
-
- /* make a dataset */
- if(H5LTmake_dataset_int(fid,"dset_e",rank,dims,NULL) < 0)
- goto out;
-
- /* make a scale */
- if(H5LTmake_dataset_int(fid,"ds_e_1",rankds,s1_dim,NULL) < 0)
- goto out;
-
- /* attach the DS to dimension 1 */
- if((did = H5Dopen2(fid,"dset_e", H5P_DEFAULT)) < 0)
- goto out;
- if((dsid = H5Dopen2(fid,"ds_e_1", H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSattach_scale(did,dsid,DIM1) < 0)
- goto out;
- if(H5DSis_attached(did,dsid,DIM1)<=0)
- goto out;
-
-
- /* try to detach all dimensions. for dimensions 0 and 2, it is an error */
- for(i=0; i<rank; i++)
- {
- if( i==1 )
- {
- if(H5DSdetach_scale(did,dsid,(unsigned)i) < 0)
- goto out;
- }
- else
- {
- if(H5DSdetach_scale(did,dsid,(unsigned)i)!=FAIL)
- goto out;
- }
- }
-
- if(H5Dclose(dsid) < 0)
- goto out;
- if(H5Dclose(did) < 0)
- goto out;
-
- PASSED();
-
+herr_t create_DS2_long_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, long *s_wbuf, long *s1_wbuf, long *s2_wbuf)
+{
+ char name[32];
+
+ strcpy(name, DS_2_NAME);
+ strcat(name, dsidx);
+
+ /* make a DS dataset for the second dimension */
+ if(H5LTmake_dataset_long(fid, name, rankds, s_dim, s_wbuf) < 0)
+ return FAIL;
+
+ if(s1_wbuf!=NULL) {
+ strcpy(name, DS_21_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_long(fid, name, rankds, s_dim, s1_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s2_wbuf!=NULL) {
+ strcpy(name, DS_22_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_long(fid, name, rankds, s_dim, s2_wbuf) < 0)
+ return FAIL;
+ }
+
+ return SUCCEED;
+}
/*-------------------------------------------------------------------------
- * test 4: set/get label
+ * create 3 dimension scales datasets for third dimension of dataset
*-------------------------------------------------------------------------
*/
-
- TESTING2("set/get label");
-
- if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
- goto out;
+herr_t create_DS3_long_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, long *s_wbuf, long *s1_wbuf, long *s2_wbuf, long *s3_wbuf)
+{
+ char name[32];
+
+ strcpy(name, DS_3_NAME);
+ strcat(name, dsidx);
+
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_long(fid, name, rankds, s_dim, s_wbuf) < 0)
+ return FAIL;
+
+ if(s1_wbuf!=NULL) {
+ strcpy(name, DS_31_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_long(fid, name, rankds, s_dim, s1_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s2_wbuf!=NULL) {
+ strcpy(name, DS_32_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_long(fid, name, rankds, s_dim, s2_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s3_wbuf!=NULL) {
+ strcpy(name, DS_33_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_long(fid, name, rankds, s_dim, s3_wbuf) < 0)
+ return FAIL;
+ }
+
+ return SUCCEED;
+}
/*-------------------------------------------------------------------------
- * set label
+ * create 4 dimension scales datasets for third dimension of dataset
*-------------------------------------------------------------------------
*/
-
- if(H5DSset_label(did,DIM0,DIM0_LABEL) < 0)
- goto out;
- if(H5DSset_label(did,DIM1,DIM1_LABEL) < 0)
- goto out;
+herr_t create_DS4_long_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, long *s_wbuf, long *s1_wbuf, long *s2_wbuf, long *s3_wbuf, long *s4_wbuf)
+{
+ char name[32];
+
+ strcpy(name, DS_4_NAME);
+ strcat(name, dsidx);
+
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_long(fid, name, rankds, s_dim, s_wbuf) < 0)
+ return FAIL;
+
+ if(s1_wbuf!=NULL) {
+ strcpy(name, DS_41_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_long(fid, name, rankds, s_dim, s1_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s2_wbuf!=NULL) {
+ strcpy(name, DS_42_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_long(fid, name, rankds, s_dim, s2_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s3_wbuf!=NULL) {
+ strcpy(name, DS_43_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_long(fid, name, rankds, s_dim, s3_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s4_wbuf!=NULL) {
+ strcpy(name, DS_44_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_long(fid, name, rankds, s_dim, s4_wbuf) < 0)
+ return FAIL;
+ }
+
+ return SUCCEED;
+}
/*-------------------------------------------------------------------------
- * get the scale name using a static buffer
+ * create 2 dimension scales datasets for first dimension
*-------------------------------------------------------------------------
*/
+herr_t create_DS1_float_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, float *s_wbuf, float *s1_wbuf)
+{
+ char name[32];
- if(H5DSget_label(did,DIM0,dim0_label,sizeof(dim0_label)) < 0)
- goto out;
- if(H5DSget_label(did,DIM1,dim1_label,sizeof(dim1_label)) < 0)
- goto out;
-
- if(strcmp(DIM0_LABEL,dim0_label)!=0)
- goto out;
- if(strcmp(DIM1_LABEL,dim1_label)!=0)
- goto out;
+ strcpy(name, DS_1_NAME);
+ strcat(name, dsidx);
-/*-------------------------------------------------------------------------
- * get the scale name using a dynamic buffer
- *-------------------------------------------------------------------------
- */
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_float(fid, name, rankds, s_dim, s_wbuf) < 0)
+ return FAIL;
- if((dim0_label_size=H5DSget_label(did,DIM0,NULL,(size_t)0)) < 0)
- goto out;
- if((dim1_label_size=H5DSget_label(did,DIM1,NULL,(size_t)0)) < 0)
- goto out;
-
- /* allocate */
- dim0_labeld = (char*)malloc(dim0_label_size * sizeof(char));
- dim1_labeld = (char*)malloc(dim1_label_size * sizeof(char));
- if( dim0_labeld==NULL || dim1_labeld==NULL)
- goto out;
-
- if(H5DSget_label(did,DIM0,dim0_labeld,(size_t)dim0_label_size) < 0)
- goto out;
- if(H5DSget_label(did,DIM1,dim1_labeld,(size_t)dim1_label_size) < 0)
- goto out;
-
- if(strncmp(DIM0_LABEL,dim0_labeld,(size_t)(dim0_label_size-1))!=0)
- goto out;
- if(strncmp(DIM1_LABEL,dim1_labeld,(size_t)(dim1_label_size-1))!=0)
- goto out;
-
- if(dim0_labeld)
- {
- free(dim0_labeld);
- dim0_labeld=NULL;
- }
- if(dim1_labeld)
- {
- free(dim1_labeld);
- dim1_labeld=NULL;
- }
+ if(s1_wbuf!=NULL) {
+ strcpy(name, DS_11_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the first dimension */
+ if(H5LTmake_dataset_float(fid, name, rankds, s_dim, s1_wbuf) < 0)
+ return FAIL;
+ }
+ return SUCCEED;
+}
/*-------------------------------------------------------------------------
- * get the label using a static buffer smaller than the string lenght
+ * create 3 dimension scales datasets for second dimension
*-------------------------------------------------------------------------
*/
-
- if(H5DSget_label(did,DIM0,dim0_labels,sizeof(dim0_labels)) < 0)
- goto out;
- if(H5DSget_label(did,DIM1,dim1_labels,sizeof(dim1_labels)) < 0)
- goto out;
-
- if(strncmp(DIM0_LABEL,dim0_label,sizeof(dim0_labels)-1)!=0)
- goto out;
- if(strncmp(DIM1_LABEL,dim1_label,sizeof(dim1_labels)-1)!=0)
- goto out;
-
-
-
- if(H5Dclose(did))
- goto out;
-
- PASSED();
+herr_t create_DS2_float_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, float *s_wbuf, float *s1_wbuf, float *s2_wbuf)
+{
+ char name[32];
+
+ strcpy(name, DS_2_NAME);
+ strcat(name, dsidx);
+
+ /* make a DS dataset for the second dimension */
+ if(H5LTmake_dataset_float(fid, name, rankds, s_dim, s_wbuf) < 0)
+ return FAIL;
+
+ if(s1_wbuf!=NULL) {
+ strcpy(name, DS_21_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_float(fid, name, rankds, s_dim, s1_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s2_wbuf!=NULL) {
+ strcpy(name, DS_22_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_float(fid, name, rankds, s_dim, s2_wbuf) < 0)
+ return FAIL;
+ }
+
+ return SUCCEED;
+}
/*-------------------------------------------------------------------------
- * test 5: set scale/get scale name
+ * create 3 dimension scales datasets for third dimension of dataset
*-------------------------------------------------------------------------
*/
- TESTING2("set scale/get scale name");
-
- if((dsid = H5Dopen2(fid,DS_1_NAME, H5P_DEFAULT)) < 0)
- goto out;
+herr_t create_DS3_float_datasets(hid_t fid, const char *dsidx, int rankds, hsize_t *s_dim, float *s_wbuf, float *s1_wbuf, float *s2_wbuf, float *s3_wbuf)
+{
+ char name[32];
+
+ strcpy(name, DS_3_NAME);
+ strcat(name, dsidx);
+
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_float(fid, name, rankds, s_dim, s_wbuf) < 0)
+ return FAIL;
+
+ if(s1_wbuf!=NULL) {
+ strcpy(name, DS_31_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_float(fid, name, rankds, s_dim, s1_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s2_wbuf!=NULL) {
+ strcpy(name, DS_32_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_float(fid, name, rankds, s_dim, s2_wbuf) < 0)
+ return FAIL;
+ }
+
+ if(s3_wbuf!=NULL) {
+ strcpy(name, DS_33_NAME);
+ strcat(name, dsidx);
+ /* make a DS dataset with an alternate scale for the second dimension */
+ if(H5LTmake_dataset_float(fid, name, rankds, s_dim, s3_wbuf) < 0)
+ return FAIL;
+ }
+
+ return SUCCEED;
+}
- if(H5DSset_scale(dsid,SCALE_1_NAME) < 0)
- goto out;
+herr_t test_attach_scale(hid_t fid, hid_t did, const char *name, unsigned int idx)
+{
+ herr_t ret_value = FAIL;
+ hid_t dsid = -1;
+
+ if((dsid = H5Dopen2(fid, name, H5P_DEFAULT)) >= 0) {
+ if(H5DSis_attached(did, dsid, idx) == 0) {
+ if(H5DSattach_scale(did, dsid, idx) >= 0) {
+ if(H5DSis_attached(did, dsid, idx) > 0) {
+ /* printf(" scale attached "); */
+ ret_value = SUCCEED;
+ }
+ else if(H5DSis_attached(did, dsid, idx) == 0) {
+ printf(" scale not attached ");
+ }
+ }
+ }
+ if(H5Dclose(dsid) < 0)
+ ret_value = FAIL;
+ }
+
+ return ret_value;
+}
- /* verify that DS_1_NAME is a dimension scale dataset */
- if((H5DSis_scale(dsid))==0)
- goto out;
+herr_t test_detach_scale(hid_t fid, hid_t did, const char *name, unsigned int idx)
+{
+ herr_t ret_value = FAIL;
+ hid_t dsid = -1;
+
+ if((dsid = H5Dopen2(fid, name, H5P_DEFAULT)) >= 0) {
+ if(H5DSis_attached(did, dsid, idx) == 1) {
+ if(H5DSdetach_scale(did, dsid, idx) >= 0) {
+ if(H5DSis_attached(did, dsid, idx) == 0) {
+ ret_value = SUCCEED;
+ }
+ }
+ }
+ if(H5Dclose(dsid) < 0)
+ ret_value = FAIL;
+ }
+
+ return ret_value;
+}
-/*-------------------------------------------------------------------------
- * get the scale name using a dynamic buffer
- *-------------------------------------------------------------------------
- */
+herr_t test_set_scalename(hid_t fid, hid_t did, const char *name, const char *scalename, unsigned int idx)
+{
+ herr_t ret_value = FAIL;
+ hid_t dsid = -1;
+
+ if((dsid = H5Dopen2(fid, name, H5P_DEFAULT)) >= 0) {
+ if(H5DSis_attached(did, dsid, idx) == 1) {
+ if(H5DSset_scale(dsid, scalename) >= 0) {
+ if(H5DSis_attached(did, dsid, idx) == 1) {
+ ret_value = SUCCEED;
+ }
+ }
+ }
+ if(H5Dclose(dsid) < 0)
+ ret_value = FAIL;
+ }
+
+ return ret_value;
+}
- /* get the lenght of the scale name (pass NULL in name) */
- if((name_len=H5DSget_scale_name(dsid,NULL,(size_t)0)) < 0)
- goto out;
+herr_t test_cmp_scalename(hid_t fid, hid_t did, const char *name, const char *scalename, unsigned int idx)
+{
+ herr_t ret_value = FAIL;
+ hid_t dsid = -1;
+ ssize_t name_len;
+ char *name_out=NULL;
+
+ if((dsid = H5Dopen2(fid, name, H5P_DEFAULT)) >= 0) {
+ if(H5DSis_attached(did, dsid, idx) == 1) {
+ if((name_len=H5DSget_scale_name(dsid,NULL,(size_t)0)) > 0) {
+ name_out = (char*)malloc(name_len * sizeof (char));
+ if(name_out != NULL) {
+ if(H5DSget_scale_name(dsid, name_out, (size_t)name_len) >= 0) {
+ if(strcmp(scalename,name_out)==0) {
+ ret_value = SUCCEED;
+ }
+ free(name_out);
+ name_out=NULL;
+ }
+ }
+ }
+ }
+ if(H5Dclose(dsid) < 0)
+ ret_value = FAIL;
+ }
+
+ return ret_value;
+}
- /* allocate a buffer */
- name_out = (char*)malloc(name_len * sizeof(char));
- if(name_out == NULL)
- goto out;
+static int test_char_attachscales(const char *fileext)
+{
+ hid_t fid = -1;
+ hid_t did = -1;
+ char dsname[32];
+ char scalename[32];
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "ac");
+
+ TESTING2("test_char_attachscales");
+
+ if((fid = open_test_file(fileext)) < 0)
+ goto out;
+
+ /* make a dataset */
+ if(create_char_dataset(fid, "ac", 0) < 0)
+ goto out;
+
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ strcpy(scalename, DS_1_NAME);
+ strcat(scalename, "ac");
+ if(test_attach_scale(fid, did, scalename, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_2_NAME);
+ strcat(scalename, "ac");
+ if(test_attach_scale(fid, did, scalename, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_3_NAME);
+ strcat(scalename, "ac");
+ if(test_attach_scale(fid, did, scalename, DIM2) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return SUCCEED;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
- /* get the scale name using this buffer */
- if(H5DSget_scale_name(dsid,name_out,(size_t)name_len) < 0)
- goto out;
+static int test_short_attachscales(const char *fileext)
+{
+ hid_t fid = -1;
+ hid_t did = -1;
+ char dsname[32];
+ char scalename[32];
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "as");
+
+ TESTING2("test_short_attachscales");
+
+ if((fid = open_test_file(fileext)) < 0)
+ goto out;
+
+ /* make a dataset */
+ if(create_short_dataset(fid, "as", 1) < 0)
+ goto out;
+
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ strcpy(scalename, DS_1_NAME);
+ strcat(scalename, "as");
+ if(test_attach_scale(fid, did, scalename, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_11_NAME);
+ strcat(scalename, "as");
+ if(test_attach_scale(fid, did, scalename, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_2_NAME);
+ strcat(scalename, "as");
+ if(test_attach_scale(fid, did, scalename, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_21_NAME);
+ strcat(scalename, "as");
+ if(test_attach_scale(fid, did, scalename, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_22_NAME);
+ strcat(scalename, "as");
+ if(test_attach_scale(fid, did, scalename, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_3_NAME);
+ strcat(scalename, "as");
+ if(test_attach_scale(fid, did, scalename, DIM2) < 0)
+ goto out;
+
+ strcpy(scalename, DS_31_NAME);
+ strcat(scalename, "as");
+ if(test_attach_scale(fid, did, scalename, DIM2) < 0)
+ goto out;
+
+ strcpy(scalename, DS_32_NAME);
+ strcat(scalename, "as");
+ if(test_attach_scale(fid, did, scalename, DIM2) < 0)
+ goto out;
+
+ strcpy(scalename, DS_33_NAME);
+ strcat(scalename, "as");
+ if(test_attach_scale(fid, did, scalename, DIM2) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return SUCCEED;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
- if(strcmp(SCALE_1_NAME,name_out)!=0)
- goto out;
+static int test_int_attachscales(const char *fileext)
+{
+ hid_t fid = -1;
+ hid_t did = -1;
+ char dsname[32];
+ char scalename[32];
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "a");
+
+ TESTING2("test_int_attachscales");
+
+ if((fid = open_test_file(fileext)) < 0)
+ goto out;
+
+ /* make a dataset */
+ if(create_int_dataset(fid, "a", 1) < 0)
+ goto out;
+
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ strcpy(scalename, DS_1_NAME);
+ strcat(scalename, "a");
+ if(test_attach_scale(fid, did, scalename, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_11_NAME);
+ strcat(scalename, "a");
+ if(test_attach_scale(fid, did, scalename, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_2_NAME);
+ strcat(scalename, "a");
+ if(test_attach_scale(fid, did, scalename, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_21_NAME);
+ strcat(scalename, "a");
+ if(test_attach_scale(fid, did, scalename, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_22_NAME);
+ strcat(scalename, "a");
+ if(test_attach_scale(fid, did, scalename, DIM1) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return SUCCEED;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
- if(name_out)
- {
- free(name_out);
- name_out=NULL;
- }
+static int test_long_attachscales(const char *fileext)
+{
+ hid_t fid = -1;
+ hid_t did = -1;
+ char dsname[32];
+ char scalename[32];
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "al");
+
+ TESTING2("test_long_attachscales");
+
+ if((fid = open_test_file(fileext)) < 0)
+ goto out;
+
+ /* make a dataset */
+ if(create_long_dataset(fid, dsname, "al", 0) < 0)
+ goto out;
+
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ strcpy(scalename, DS_1_NAME);
+ strcat(scalename, "al");
+ if(test_attach_scale(fid, did, scalename, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_2_NAME);
+ strcat(scalename, "al");
+ if(test_attach_scale(fid, did, scalename, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_3_NAME);
+ strcat(scalename, "al");
+ if(test_attach_scale(fid, did, scalename, DIM2) < 0)
+ goto out;
+
+ strcpy(scalename, DS_4_NAME);
+ strcat(scalename, "al");
+ if(test_attach_scale(fid, did, scalename, DIM3) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return SUCCEED;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
-/*-------------------------------------------------------------------------
- * get the scale name using a static buffer
- *-------------------------------------------------------------------------
- */
+static int test_duplicatelong_attachscales(const char *fileext)
+{
+ hid_t fid = -1;
+ hid_t did = -1;
+ char dsname[32];
+ char scalename[32];
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "al2");
+
+ TESTING2("test_duplicatelong_attachscales");
+
+ if((fid = open_test_file(fileext)) < 0)
+ goto out;
+
+ /* make a dataset 2 */
+ if(create_long_dataset(fid, dsname, "al2", 0) < 0)
+ goto out;
+
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ strcpy(scalename, DS_1_NAME);
+ strcat(scalename, "al");
+ if(test_attach_scale(fid, did, scalename, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_2_NAME);
+ strcat(scalename, "al");
+ if(test_attach_scale(fid, did, scalename, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_3_NAME);
+ strcat(scalename, "al");
+ if(test_attach_scale(fid, did, scalename, DIM2) < 0)
+ goto out;
+
+ strcpy(scalename, DS_4_NAME);
+ strcat(scalename, "al");
+ if(test_attach_scale(fid, did, scalename, DIM3) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return SUCCEED;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
- /* get the scale name using this buffer */
- if(H5DSget_scale_name(dsid,sname,sizeof(sname)) < 0)
- goto out;
+static int test_float_attachscales(const char *fileext)
+{
+ hid_t fid = -1;
+ hid_t did = -1;
+ char dsname[32];
+ char scalename[32];
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "af");
+
+ TESTING2("test_float_attachscales");
+
+ if((fid = open_test_file(fileext)) < 0)
+ goto out;
+
+ /* make a dataset */
+ if(create_float_dataset(fid, "af", 1) < 0)
+ goto out;
+
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ strcpy(scalename, DS_1_NAME);
+ strcat(scalename, "af");
+ if(test_attach_scale(fid, did, scalename, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_11_NAME);
+ strcat(scalename, "af");
+ if(test_attach_scale(fid, did, scalename, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_2_NAME);
+ strcat(scalename, "af");
+ if(test_attach_scale(fid, did, scalename, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_21_NAME);
+ strcat(scalename, "af");
+ if(test_attach_scale(fid, did, scalename, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_22_NAME);
+ strcat(scalename, "af");
+ if(test_attach_scale(fid, did, scalename, DIM1) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return SUCCEED;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
- if(strcmp(SCALE_1_NAME,sname)!=0)
- goto out;
+static int test_numberofscales(const char *fileext)
+{
+ hid_t fid = -1;
+ hid_t did = -1;
+ int nscales; /* number of scales in DIM */
+ char dsname[32];
+ char scalename[32];
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "a");
+
+ TESTING2("test_numberofscales");
+
+ if((fid = open_test_file(fileext)) < 0)
+ goto out;
+
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ if((nscales = H5DSget_num_scales(did, 0)) < 0)
+ goto out;
+
+ if(nscales != 2)
+ goto out;
+
+ if((nscales = H5DSget_num_scales(did, 1)) < 0)
+ goto out;
+
+ if(nscales != 3)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "b");
+
+ /* make a dataset */
+ if(create_int_dataset(fid, "b", 1) < 0)
+ goto out;
+
+ /* make a DS dataset for the first dimension */
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ strcpy(scalename, DS_1_NAME);
+ strcat(scalename, "b");
+ if(test_attach_scale(fid, did, scalename, DIM0) < 0)
+ goto out;
+
+ if((nscales = H5DSget_num_scales(did, 0)) < 0)
+ goto out;
+
+ if(nscales != 1)
+ goto out;
+
+ if((nscales = H5DSget_num_scales(did, 1)) < 0)
+ goto out;
+
+ if(nscales != 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return SUCCEED;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
-/*-------------------------------------------------------------------------
- * get the scale name using a static buffer smaller than the string lenght
- *-------------------------------------------------------------------------
- */
+static int test_char_scalenames(const char *fileext) {
+ hid_t fid = -1;
+ hid_t did = -1;
+ char dsname[32];
+ char scalename[32];
+ char name[32];
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "ac");
+
+ if((fid = open_test_file(fileext)) < 0)
+ goto out;
+
+ TESTING2("set char scale/cmp scale name");
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ strcpy(scalename, DS_1_NAME);
+ strcat(scalename, "ac");
+ strcpy(name, SCALE_1_NAME);
+ strcat(name, "ac");
+ if(test_set_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_2_NAME);
+ strcat(scalename, "ac");
+ strcpy(name, SCALE_2_NAME);
+ strcat(name, "ac");
+ if(test_set_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_3_NAME);
+ strcat(scalename, "ac");
+ strcpy(name, SCALE_3_NAME);
+ strcat(name, "ac");
+ if(test_set_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return SUCCEED;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
- /* get the scale name using this buffer */
- if(H5DSget_scale_name(dsid,snames,sizeof(snames)) < 0)
- goto out;
+static int test_short_scalenames(const char *fileext) {
+ hid_t fid = -1;
+ hid_t did = -1;
+ char dsname[32];
+ char scalename[32];
+ char name[32];
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "as");
+
+ if((fid = open_test_file(fileext)) < 0)
+ goto out;
+
+ TESTING2("set short scale/cmp scale name");
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ strcpy(scalename, DS_1_NAME);
+ strcat(scalename, "as");
+ strcpy(name, SCALE_1_NAME);
+ strcat(name, "as");
+ if(test_set_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_11_NAME);
+ strcat(scalename, "as");
+ strcpy(name, SCALE_11_NAME);
+ strcat(name, "as");
+ if(test_set_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_2_NAME);
+ strcat(scalename, "as");
+ strcpy(name, SCALE_2_NAME);
+ strcat(name, "as");
+ if(test_set_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_21_NAME);
+ strcat(scalename, "as");
+ strcpy(name, SCALE_21_NAME);
+ strcat(name, "as");
+ if(test_set_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_22_NAME);
+ strcat(scalename, "as");
+ strcpy(name, SCALE_22_NAME);
+ strcat(name, "as");
+ if(test_set_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_3_NAME);
+ strcat(scalename, "as");
+ strcpy(name, SCALE_3_NAME);
+ strcat(name, "as");
+ if(test_set_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ strcpy(scalename, DS_31_NAME);
+ strcat(scalename, "as");
+ strcpy(name, SCALE_31_NAME);
+ strcat(name, "as");
+ if(test_set_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ strcpy(scalename, DS_32_NAME);
+ strcat(scalename, "as");
+ strcpy(name, SCALE_32_NAME);
+ strcat(name, "as");
+ if(test_set_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ strcpy(scalename, DS_33_NAME);
+ strcat(scalename, "as");
+ strcpy(name, SCALE_33_NAME);
+ strcat(name, "as");
+ if(test_set_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return SUCCEED;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
- if(strncmp(SCALE_1_NAME,snames,sizeof(snames)-1)!=0)
- goto out;
+static int test_int_scalenames(const char *fileext) {
+ hid_t fid = -1;
+ hid_t did = -1;
+ char dsname[32];
+ char scalename[32];
+ char name[32];
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "a");
+
+ if((fid = open_test_file(fileext)) < 0)
+ goto out;
+
+ TESTING2("set int scale/cmp scale name");
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ strcpy(scalename, DS_1_NAME);
+ strcat(scalename, "a");
+ strcpy(name, SCALE_1_NAME);
+ strcat(name, "a");
+ if(test_set_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_11_NAME);
+ strcat(scalename, "a");
+ strcpy(name, SCALE_11_NAME);
+ strcat(name, "a");
+ if(test_set_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_2_NAME);
+ strcat(scalename, "a");
+ strcpy(name, SCALE_2_NAME);
+ strcat(name, "a");
+ if(test_set_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_21_NAME);
+ strcat(scalename, "a");
+ strcpy(name, SCALE_21_NAME);
+ strcat(name, "a");
+ if(test_set_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_22_NAME);
+ strcat(scalename, "a");
+ strcpy(name, SCALE_22_NAME);
+ strcat(name, "a");
+ if(test_set_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return 0;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
- if(H5Dclose(dsid))
- goto out;
+static int test_long_scalenames(const char *fileext) {
+ hid_t fid = -1;
+ hid_t did = -1;
+ char dsname[32];
+ char scalename[32];
+ char name[32];
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "al");
+
+ if((fid = open_test_file(fileext)) < 0)
+ goto out;
+
+ TESTING2("set long scale/cmp scale name");
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ strcpy(scalename, DS_1_NAME);
+ strcat(scalename, "al");
+ strcpy(name, SCALE_1_NAME);
+ strcat(name, "al");
+ if(test_set_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_2_NAME);
+ strcat(scalename, "al");
+ strcpy(name, SCALE_2_NAME);
+ strcat(name, "al");
+ if(test_set_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_3_NAME);
+ strcat(scalename, "al");
+ strcpy(name, SCALE_3_NAME);
+ strcat(name, "al");
+ if(test_set_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ strcpy(scalename, DS_4_NAME);
+ strcat(scalename, "al");
+ strcpy(name, SCALE_4_NAME);
+ strcat(name, "al");
+ if(test_set_scalename(fid, did, scalename, name, DIM3) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM3) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return SUCCEED;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
-/*-------------------------------------------------------------------------
- * add scale names
- *-------------------------------------------------------------------------
- */
+static int test_samelong_scalenames(const char *fileext) {
+ hid_t fid = -1;
+ hid_t did = -1;
+ char dsname[32];
+ char scalename[32];
+ char name[32];
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "al2");
+
+ if((fid = open_test_file(fileext)) < 0)
+ goto out;
+
+ TESTING2("set same long scale/cmp scale name");
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ strcpy(scalename, DS_1_NAME);
+ strcat(scalename, "al");
+ strcpy(name, DS_1_NAME);
+ strcat(name, "al");
+ if(test_set_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_2_NAME);
+ strcat(scalename, "al");
+ strcpy(name, DS_2_NAME);
+ strcat(name, "al");
+ if(test_set_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_3_NAME);
+ strcat(scalename, "al");
+ strcpy(name, DS_3_NAME);
+ strcat(name, "al");
+ if(test_set_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM2) < 0)
+ goto out;
+
+ strcpy(scalename, DS_4_NAME);
+ strcat(scalename, "al");
+ strcpy(name, DS_4_NAME);
+ strcat(name, "al");
+ if(test_set_scalename(fid, did, scalename, name, DIM3) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM3) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return SUCCEED;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
- if((dsid = H5Dopen2(fid,DS_11_NAME, H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSset_scale(dsid,SCALE_11_NAME) < 0)
- goto out;
- if(H5Dclose(dsid))
- goto out;
-
- if((dsid = H5Dopen2(fid,DS_2_NAME, H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSset_scale(dsid,SCALE_2_NAME) < 0)
- goto out;
- if(H5Dclose(dsid))
- goto out;
-
- if((dsid = H5Dopen2(fid,DS_21_NAME, H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSset_scale(dsid,SCALE_21_NAME) < 0)
- goto out;
- if(H5Dclose(dsid))
- goto out;
-
- if((dsid = H5Dopen2(fid,DS_22_NAME, H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSset_scale(dsid,SCALE_22_NAME) < 0)
- goto out;
- if(H5Dclose(dsid))
- goto out;
-
-
- PASSED();
+static int test_float_scalenames(const char *fileext) {
+ hid_t fid = -1;
+ hid_t did = -1;
+ char dsname[32];
+ char scalename[32];
+ char name[32];
+ strcpy(dsname, DATASET_NAME);
+ strcat(dsname, "af");
+
+ if((fid = open_test_file(fileext)) < 0)
+ goto out;
+
+ TESTING2("set float scale/cmp scale name");
+ if((did = H5Dopen2(fid, dsname, H5P_DEFAULT)) >= 0) {
+ strcpy(scalename, DS_1_NAME);
+ strcat(scalename, "af");
+ strcpy(name, SCALE_1_NAME);
+ strcat(name, "af");
+ if(test_set_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_11_NAME);
+ strcat(scalename, "af");
+ strcpy(name, SCALE_11_NAME);
+ strcat(name, "af");
+ if(test_set_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM0) < 0)
+ goto out;
+
+ strcpy(scalename, DS_2_NAME);
+ strcat(scalename, "af");
+ strcpy(name, SCALE_2_NAME);
+ strcat(name, "af");
+ if(test_set_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_21_NAME);
+ strcat(scalename, "af");
+ strcpy(name, SCALE_21_NAME);
+ strcat(name, "af");
+ if(test_set_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ strcpy(scalename, DS_22_NAME);
+ strcat(scalename, "af");
+ strcpy(name, SCALE_22_NAME);
+ strcat(name, "af");
+ if(test_set_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ if(test_cmp_scalename(fid, did, scalename, name, DIM1) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return 0;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
-/*-------------------------------------------------------------------------
- * test 6: test iterate scales with a function verify_scale
- *-------------------------------------------------------------------------
- */
- TESTING2("iterate scales (verify scale)");
+static int test_foreign_scaleattached(const char *fileforeign)
+{
+ herr_t ret_value = FAIL;
+ hid_t fid = -1;
+ hid_t did = -1;
+ hid_t dsid = -1;
+ char *srcdir = getenv("srcdir"); /* the source directory */
+ char filename[512]=""; /* buffer to hold name of existing file */
+
+ /* compose the name of the file to open, using the srcdir, if appropriate */
+ if (srcdir) {
+ strcpy(filename,srcdir);
+ strcat(filename,"/");
+ }
+ strcat(filename, fileforeign);
+
+ TESTING2("test_foreign_scaleattached");
+
+ if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+ goto out;
+
+ if((did = H5Dopen2(fid, "/dset_al", H5P_DEFAULT)) >= 0) {
+ if((dsid = H5Dopen2(fid, "/ds_4_al", H5P_DEFAULT)) >= 0) {
+ if(H5DSis_attached(did, dsid, 3) == 1) {
+ ret_value = SUCCEED;
+ }
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ }
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+ else
+ goto out;
+
+ if(ret_value == FAIL)
+ goto out;
+
+ PASSED();
+
+ H5Fclose(fid);
+ return 0;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+
+ H5_FAILED();
+
+ return FAIL;
+}
- /* get the dataset id for "dset_a" */
- if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
- goto out;
+static int test_simple(void)
+{
+ hid_t fid = -1;
+ hid_t did = -1;
+ hid_t dsid = -1;
+ hid_t sid = -1;
+ hid_t gid = -1;
+ int rank = RANK;
+ int rankds = 1;
+ hsize_t dims[RANK] = {DIM1_SIZE,DIM2_SIZE};
+ int buf[DIM_DATA] = {1,2,3,4,5,6,7,8,9,10,11,12};
+ hsize_t s1_dim[1] = {DIM1_SIZE};
+ hsize_t s2_dim[1] = {DIM2_SIZE};
+ char sname[30];
+ char dname[30];
+ int s1_wbuf[DIM1_SIZE] = {10,20,30};
+ int s11_wbuf[DIM1_SIZE] = {10,100,300};
+ int s2_wbuf[DIM2_SIZE] = {100,200,300,400};
+ int s21_wbuf[DIM2_SIZE] = {10,20,30,40};
+ int s22_wbuf[DIM2_SIZE] = {5,10,50,300};
+ char dim0_label[16];
+ char dim1_label[16];
+ char *dim0_labeld;
+ char *dim1_labeld;
+ char dim0_labels[3];
+ char dim1_labels[3];
+ ssize_t dim0_label_size;
+ ssize_t dim1_label_size;
+ unsigned int dim;
+ int scale_idx;
+ int nscales;
+ ssize_t name_len;
+ char *name_out=NULL;
+ char snames[3];
+ int i, j;
+
+ printf("Testing API functions\n");
+
+ /*-------------------------------------------------------------------------
+ * create a file for the test
+ *-------------------------------------------------------------------------
+ */
+
+ /* create a file using default properties */
+ if((fid=H5Fcreate(FILE1,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * create datasets: 1 "data" dataset and 4 dimension scales
+ *-------------------------------------------------------------------------
+ */
+
+ /* make a dataset */
+ if(H5LTmake_dataset_int(fid,"dset_a",rank,dims,buf) < 0)
+ goto out;
+
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_int(fid,"ds_a_1",rankds,s1_dim,s1_wbuf) < 0)
+ goto out;
+
+ /* make a DS dataset with an alternate scale for the 2nd dimension */
+ if(H5LTmake_dataset_int(fid,"ds_a_11",rankds,s1_dim,s11_wbuf) < 0)
+ goto out;
+
+ /* make a DS dataset for the second dimension */
+ if(H5LTmake_dataset_int(fid,"ds_a_2",rankds,s2_dim,s2_wbuf) < 0)
+ goto out;
+
+ /* make a DS dataset with an alternate scale for the 2nd dimension */
+ if(H5LTmake_dataset_int(fid,"ds_a_21",rankds,s2_dim,s21_wbuf) < 0)
+ goto out;
+
+ /* make a DS dataset with an alternate scale for the 2nd dimension */
+ if(H5LTmake_dataset_int(fid,"ds_a_22",rankds,s2_dim,s22_wbuf) < 0)
+ goto out;
+
+ /* get the dataset id for "dset_a" */
+ if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * attach the DS_1_NAME dimension scale to "dset_a"
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,"ds_a_1", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* attach the DS_1_NAME dimension scale to "dset_a" at dimension 0 */
+ if(H5DSattach_scale(did,dsid,DIM0) < 0)
+ goto out;
+
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * attach the DS_11_NAME dimension scale to "dset_a"
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,"ds_a_11", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* attach the DS_11_NAME dimension scale to "dset_a" at dimension 0 */
+ if(H5DSattach_scale(did,dsid,DIM0) < 0)
+ goto out;
+
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * attach the DS_2_NAME dimension scale to "dset_a"
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,"ds_a_2", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* attach the "ds2" dimension scale to "dset_a" as the 2nd dimension */
+ if(H5DSattach_scale(did,dsid,DIM1) < 0)
+ goto out;
+
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * attach the DS_21_NAME dimension scale to "dset_a"
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,"ds_a_21", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* attach the DS_21_NAME dimension scale to "dset_a" as the 2nd dimension */
+ if(H5DSattach_scale(did,dsid,DIM1) < 0)
+ goto out;
+
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * attach the DS_22_NAME dimension scale to "dset_a"
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,"ds_a_22", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* attach the "ds22" dimension scale to "dset_a" as the 2nd dimension */
+ if(H5DSattach_scale(did,dsid,DIM1) < 0)
+ goto out;
+
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ /* close dataset ID of "dset_a" */
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * create datasets: 1 "data" dataset and 1 dimension scale
+ *-------------------------------------------------------------------------
+ */
+
+ /* make a dataset */
+ if(H5LTmake_dataset_int(fid,"dset_b",rank,dims,buf) < 0)
+ goto out;
+
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_int(fid,"ds_b_1",rankds,s1_dim,s1_wbuf) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * attach the scale to "dset_b"
+ *-------------------------------------------------------------------------
+ */
+
+ if((did = H5Dopen2(fid,"dset_b", H5P_DEFAULT)) < 0)
+ goto out;
+ if((dsid = H5Dopen2(fid,"ds_b_1", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSattach_scale(did,dsid,0) < 0)
+ goto out;
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ /* close dataset ID of "dset_b" */
+ if(H5Dclose(did) < 0)
+ goto out;
+
+
+
+ /*-------------------------------------------------------------------------
+ * H5DSdetach_scale
+ *-------------------------------------------------------------------------
+ */
+
+ TESTING2("detach scales ");
+
+
+ /*-------------------------------------------------------------------------
+ * create datasets: one "data" dataset and 4 dimension scales
+ *-------------------------------------------------------------------------
+ */
+
+ /* make a dataset */
+ if(H5LTmake_dataset_int(fid, "dset_c", rank, dims, buf) < 0)
+ goto out;
+
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_int(fid, "ds_c_1", rankds, s1_dim, s1_wbuf) < 0)
+ goto out;
+
+ /* make a DS dataset for the second dimension */
+ if(H5LTmake_dataset_int(fid, "ds_c_2", rankds, s2_dim, s2_wbuf) < 0)
+ goto out;
+
+ /* make a DS dataset with an alternate scale for the 2nd dimension */
+ if(H5LTmake_dataset_int(fid, "ds_c_21", rankds, s2_dim, s2_wbuf) < 0)
+ goto out;
+
+ /* make a DS dataset with an alternate scale for the 2nd dimension */
+ if(H5LTmake_dataset_int(fid, "ds_c_22", rankds, s2_dim, s2_wbuf) < 0)
+ goto out;
+
+
+ /*-------------------------------------------------------------------------
+ * attach the scales to "dset_c"
+ *-------------------------------------------------------------------------
+ */
+
+ if((did = H5Dopen2(fid,"dset_c", H5P_DEFAULT)) < 0)
+ goto out;
+ if((dsid = H5Dopen2(fid,"ds_c_1", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSattach_scale(did, dsid, 0) < 0)
+ goto out;
+
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ if((dsid = H5Dopen2(fid,"ds_c_2", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSattach_scale(did, dsid, 1) < 0)
+ goto out;
+
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ if((dsid = H5Dopen2(fid,"ds_c_21", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSattach_scale(did, dsid, 1) < 0)
+ goto out;
+
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ if((dsid = H5Dopen2(fid,"ds_c_22", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSattach_scale(did, dsid, 1) < 0)
+ goto out;
+
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * verify if "dset_c" has dimension scales
+ *-------------------------------------------------------------------------
+ */
+
+ if((did = H5Dopen2(fid,"dset_c", H5P_DEFAULT)) < 0)
+ goto out;
+ /* verify that "dset_c" has 1 dimension scale at DIM 0 */
+ if((nscales = H5DSget_num_scales(did, 0)) < 0)
+ goto out;
+
+ if(nscales != 1)
+ goto out;
+ /* verify that "dset_c" has 3 dimension scales at DIM 1 */
+ if((nscales = H5DSget_num_scales(did, 1)) < 0)
+ goto out;
- dim = 0;
+ if(nscales != 3)
+ goto out;
- /* iterate trough the 1st dimension of "dset_a" and verify that its DS is valid */
- if(H5DSiterate_scales(did,dim,NULL,verify_scale,NULL) < 0)
- goto out;
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * detach the "ds_c_21" dimension scale to "dset_c"
+ *-------------------------------------------------------------------------
+ */
- /* iterate trough the 2nd dimension of "dset_a" and verify that its DS is valid
+ /* get the dataset id for "dset_c" */
+ if((did = H5Dopen2(fid,"dset_c", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,"ds_c_21", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* detach the "ds_c_21" dimension scale to "dset_c" in DIM 1 */
+ if(H5DSdetach_scale(did, dsid, 1) < 0)
+ goto out;
+
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ /* close dataset ID of "dset_c" */
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * "dset_c" must have now 2 dimension scales at DIM 1
+ *-------------------------------------------------------------------------
+ */
+
+ if((did = H5Dopen2(fid,"dset_c", H5P_DEFAULT)) < 0)
+ goto out;
+ /* verify that "dset_c" has 2 dimension scales at DIM 1 */
+ if((nscales = H5DSget_num_scales(did, 1)) < 0)
+ goto out;
+
+ if(nscales != 2)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * detach the "ds_c_22" dimension scale to "dset_c"
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the dataset id for "dset_c" */
+ if((did = H5Dopen2(fid,"dset_c", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,"ds_c_22", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* detach the "ds_c_22" dimension scale to "dset_c" in DIM 1 */
+ if(H5DSdetach_scale(did, dsid, 1) < 0)
+ goto out;
+
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ /* close dataset ID of "dset_c" */
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * "dset_c" must have now 1 dimension scale at DIM 1
+ *-------------------------------------------------------------------------
+ */
+
+ if((did = H5Dopen2(fid,"dset_c", H5P_DEFAULT)) < 0)
+ goto out;
+ /* verify that "dset_c" has 1 dimension scale at DIM 1 */
+ if((nscales = H5DSget_num_scales(did, 1)) < 0)
+ goto out;
+
+ if(nscales != 1)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * detach the "ds_c_2" dimension scale to "dset_c"
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the dataset id for "dset_c" */
+ if((did = H5Dopen2(fid,"dset_c", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,"ds_c_2", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* detach the "ds_c_2" dimension scale to "dset_c" in DIM 1 */
+ if(H5DSdetach_scale(did, dsid, 1) < 0)
+ goto out;
+
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ /* close dataset ID of "dset_c" */
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * "dset_c" must have now 0 dimension scales at DIM 1
+ *-------------------------------------------------------------------------
+ */
+
+ if((did = H5Dopen2(fid,"dset_c", H5P_DEFAULT)) < 0)
+ goto out;
+ /* verify that "dset_c" has 1 dimension scale at DIM 1 */
+ if((nscales = H5DSget_num_scales(did, 1)) < 0)
+ goto out;
+
+ if(nscales != 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+
+
+ /*-------------------------------------------------------------------------
+ * create 3 datasets: 1 "data" dataset and 2 dimension scales
+ *-------------------------------------------------------------------------
+ */
+ if(H5LTmake_dataset_int(fid,"dset_d",rank,dims,NULL) < 0)
+ goto out;
+ if(H5LTmake_dataset_int(fid,"ds_d_1",rankds,s1_dim,NULL) < 0)
+ goto out;
+ if(H5LTmake_dataset_int(fid,"ds_d_2",rankds,s2_dim,NULL) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * attach them
+ *-------------------------------------------------------------------------
+ */
+ if((did = H5Dopen2(fid,"dset_d", H5P_DEFAULT)) < 0)
+ goto out;
+ if((dsid = H5Dopen2(fid,"ds_d_1", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSattach_scale(did, dsid, 0) < 0)
+ goto out;
+
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ if((dsid = H5Dopen2(fid,"ds_d_2", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSattach_scale(did, dsid, 1) < 0)
+ goto out;
+
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * verify
+ *-------------------------------------------------------------------------
+ */
+
+ if((did = H5Dopen2(fid,"dset_d", H5P_DEFAULT)) < 0)
+ goto out;
+ if((dsid = H5Dopen2(fid,"ds_d_1", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSis_attached(did,dsid,DIM0)<=0)
+ goto out;
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ if((dsid = H5Dopen2(fid,"ds_d_2", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSis_attached(did,dsid,DIM1)<=0)
+ goto out;
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+
+
+ /*-------------------------------------------------------------------------
+ * detach
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the dataset id for "dset_d" */
+ if((did = H5Dopen2(fid,"dset_d", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,"ds_d_1", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* detach the dimension scale to "dset_d" in DIM 0 */
+ if(H5DSdetach_scale(did,dsid,DIM0) < 0)
+ goto out;
+
+ /* verify attach, it must return 0 for no attach */
+ if(H5DSis_attached(did,dsid,DIM0)!=0)
+ goto out;
+
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ /* close dataset ID of "dset_d" */
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * attach again
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the dataset id for "dset_d" */
+ if((did = H5Dopen2(fid,"dset_d", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,"ds_d_1", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* attach "ds_d_1" again in DIM 0 */
+ if(H5DSattach_scale(did,dsid,DIM0) < 0)
+ goto out;
+
+ /* verify attach, it must return 1 for attach */
+ if(H5DSis_attached(did,dsid,DIM0)!=1)
+ goto out;
+
+ /* verify that "ds_d_1" has only 1 scale at DIM0 */
+ if((nscales = H5DSget_num_scales(did,DIM0)) < 0)
+ goto out;
+ if(nscales != 1)
+ goto out;
+
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ /* close dataset ID of "dset_d" */
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * detach/detach
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the dataset id for "dset_d" */
+ if((did = H5Dopen2(fid,"dset_d", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,"ds_d_2", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* detach the "ds_d_2" dimension scale to "dset_d" in DIM 1 */
+ if(H5DSdetach_scale(did,dsid,DIM1) < 0)
+ goto out;
+
+ /* detach again, it should fail */
+ if(H5DSdetach_scale(did,dsid,DIM1)==SUCCEED)
+ goto out;
+
+ /* verify attach, it must return 0 for no attach */
+ if(H5DSis_attached(did,dsid,DIM1)!=0)
+ goto out;
+
+ /* verify that "ds_d_1" has no scale at DIM1 */
+ if((nscales = H5DSget_num_scales(did,DIM1)) < 0)
+ goto out;
+ if(nscales != 0)
+ goto out;
+
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ /* close dataset ID of "dset_d" */
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * attach twice
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the dataset id for "dset_d" */
+ if((did = H5Dopen2(fid,"dset_d", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,"ds_d_2", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* attach "ds_d_2" in DIM 1 */
+ if(H5DSattach_scale(did,dsid,DIM1) < 0)
+ goto out;
+
+ /* verify attach, it must return 1 for attach */
+ if(H5DSis_attached(did,dsid,DIM1)!=1)
+ goto out;
+
+ /* verify that "ds_d_2" has only 1 scale at DIM1 */
+ if((nscales = H5DSget_num_scales(did,DIM0)) < 0)
+ goto out;
+ if(nscales != 1)
+ goto out;
+
+ /* attach "ds_d_2" again in DIM 1 */
+ if(H5DSattach_scale(did,dsid,DIM1) < 0)
+ goto out;
+
+ /* verify attach, it must return 1 for attach */
+ if(H5DSis_attached(did,dsid,DIM1)!=1)
+ goto out;
+
+ /* verify that "ds_d_2" has only 1 scale at DIM1 */
+ if((nscales = H5DSget_num_scales(did,DIM0)) < 0)
+ goto out;
+ if(nscales != 1)
+ goto out;
+
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ /* close dataset ID of "dset_d" */
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * create 10 datasets: 5 "data" dataset and 5 dimension scales
+ *-------------------------------------------------------------------------
+ */
+
+ /* create a group */
+ if((gid = H5Gcreate2(fid, "grp", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* create the data space for the dataset */
+ if((sid = H5Screate_simple(rank,dims,NULL)) < 0)
+ goto out;
+ for(i = 0; i < 5; i++) {
+ sprintf(dname,"dset_%d",i);
+ if((did = H5Dcreate2(gid, dname, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+ sprintf(sname,"ds_%d",i);
+ if((dsid = H5Dcreate2(gid, sname, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSset_scale(dsid,"scale") < 0)
+ goto out;
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+
+ /*-------------------------------------------------------------------------
+ * attach for DIM 0
+ *-------------------------------------------------------------------------
+ */
+
+ for(i = 0; i < 5; i++) {
+ sprintf(dname, "dset_%d", i);
+ if((did = H5Dopen2(gid, dname, H5P_DEFAULT)) < 0)
+ goto out;
+ for(j = 0; j < 5; j++) {
+ sprintf(sname, "ds_%d", j);
+ if((dsid = H5Dopen2(gid, sname, H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSattach_scale(did, dsid, DIM0) < 0)
+ goto out;
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ }
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+
+ /*-------------------------------------------------------------------------
+ * dettach for DIM0
+ *-------------------------------------------------------------------------
+ */
+
+ for(i = 0; i < 5; i++) {
+ sprintf(dname, "dset_%d", i);
+ if((did = H5Dopen2(gid, dname, H5P_DEFAULT)) < 0)
+ goto out;
+ for(j = 0; j < 5; j++) {
+ sprintf(sname, "ds_%d", j);
+ if((dsid = H5Dopen2(gid, sname, H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSdetach_scale(did, dsid, DIM0) < 0)
+ goto out;
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ }
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+
+
+ /*-------------------------------------------------------------------------
+ * attach again for DIM0
+ *-------------------------------------------------------------------------
+ */
+
+ for(i=0; i<5; i++)
+ {
+ sprintf(dname,"dset_%d",i);
+ if((did = H5Dopen2(gid,dname, H5P_DEFAULT)) < 0)
+ goto out;
+ for(j=0; j<5; j++)
+ {
+ sprintf(sname,"ds_%d",j);
+ if((dsid = H5Dopen2(gid,sname, H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSattach_scale(did,dsid,DIM0) < 0)
+ goto out;
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ }
+ if(H5Dclose(did) < 0)
+ goto out;
+ }
+
+ /* close */
+ if(H5Sclose(sid) < 0)
+ goto out;
+
+ if(H5Gclose(gid) < 0)
+ goto out;
+
+
+
+ /*-------------------------------------------------------------------------
+ * create a dataset and attach only to 1 dimension
+ *-------------------------------------------------------------------------
+ */
+
+ /* make a dataset */
+ if(H5LTmake_dataset_int(fid,"dset_e",rank,dims,NULL) < 0)
+ goto out;
+
+ /* make a scale */
+ if(H5LTmake_dataset_int(fid,"ds_e_1",rankds,s1_dim,NULL) < 0)
+ goto out;
+
+ /* attach the DS to dimension 1 */
+ if((did = H5Dopen2(fid,"dset_e", H5P_DEFAULT)) < 0)
+ goto out;
+ if((dsid = H5Dopen2(fid,"ds_e_1", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSattach_scale(did,dsid,DIM1) < 0)
+ goto out;
+ if(H5DSis_attached(did,dsid,DIM1)<=0)
+ goto out;
+
+
+ /* try to detach all dimensions. for dimensions 0 and 2, it is an error */
+ for(i=0; i<rank; i++)
+ {
+ if( i==1 )
+ {
+ if(H5DSdetach_scale(did,dsid,(unsigned)i) < 0)
+ goto out;
+ }
+ else
+ {
+ if(H5DSdetach_scale(did,dsid,(unsigned)i)!=FAIL)
+ goto out;
+ }
+ }
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ PASSED();
+
+
+
+ /*-------------------------------------------------------------------------
+ * H5DSset_label, H5DSget_label
+ *-------------------------------------------------------------------------
+ */
+
+ TESTING2("set/get label");
+ if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * set label
+ *-------------------------------------------------------------------------
+ */
+
+ if(H5DSset_label(did,DIM0,DIM0_LABEL) < 0)
+ goto out;
+ if(H5DSset_label(did,DIM1,DIM1_LABEL) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * get the scale name using a static buffer
+ *-------------------------------------------------------------------------
+ */
+
+ if(H5DSget_label(did,DIM0,dim0_label,sizeof(dim0_label)) < 0)
+ goto out;
+ if(H5DSget_label(did,DIM1,dim1_label,sizeof(dim1_label)) < 0)
+ goto out;
+ if(strcmp(DIM0_LABEL,dim0_label)!=0)
+ goto out;
+ if(strcmp(DIM1_LABEL,dim1_label)!=0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * get the scale name using a dynamic buffer
+ *-------------------------------------------------------------------------
+ */
+
+ if((dim0_label_size=H5DSget_label(did,DIM0,NULL,(size_t)0)) < 0)
+ goto out;
+ if((dim1_label_size=H5DSget_label(did,DIM1,NULL,(size_t)0)) < 0)
+ goto out;
+
+ /* allocate */
+ dim0_labeld = (char*)malloc(dim0_label_size * sizeof (char));
+ dim1_labeld = (char*)malloc(dim1_label_size * sizeof (char));
+ if( dim0_labeld==NULL || dim1_labeld==NULL)
+ goto out;
+ if(H5DSget_label(did,DIM0,dim0_labeld,(size_t)dim0_label_size) < 0)
+ goto out;
+ if(H5DSget_label(did,DIM1,dim1_labeld,(size_t)dim1_label_size) < 0)
+ goto out;
+ if(strncmp(DIM0_LABEL,dim0_labeld,(size_t)(dim0_label_size-1))!=0)
+ goto out;
+ if(strncmp(DIM1_LABEL,dim1_labeld,(size_t)(dim1_label_size-1))!=0)
+ goto out;
+ if(dim0_labeld)
+ {
+ free(dim0_labeld);
+ dim0_labeld=NULL;
+ }
+ if(dim1_labeld)
+ {
+ free(dim1_labeld);
+ dim1_labeld=NULL;
+ }
+
+
+ /*-------------------------------------------------------------------------
+ * get the label using a static buffer smaller than the string lenght
+ *-------------------------------------------------------------------------
+ */
+
+ if(H5DSget_label(did,DIM0,dim0_labels,sizeof(dim0_labels)) < 0)
+ goto out;
+ if(H5DSget_label(did,DIM1,dim1_labels,sizeof(dim1_labels)) < 0)
+ goto out;
+ if(strncmp(DIM0_LABEL,dim0_label,sizeof(dim0_labels)-1)!=0)
+ goto out;
+ if(strncmp(DIM1_LABEL,dim1_label,sizeof(dim1_labels)-1)!=0)
+ goto out;
+ if(H5Dclose(did))
+ goto out;
+
+ PASSED();
+
+ /*-------------------------------------------------------------------------
+ * H5DSget_scale_name, H5DSget_scale_name
+ *-------------------------------------------------------------------------
+ */
+
+
+ TESTING2("set scale/get scale name");
+ if((dsid = H5Dopen2(fid,"ds_a_1", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSset_scale(dsid,"Latitude set 0") < 0)
+ goto out;
+
+ /* verify that DS_1_NAME is a dimension scale dataset */
+ if((H5DSis_scale(dsid)) == 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * get the scale name using a dynamic buffer
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the lenght of the scale name (pass NULL in name) */
+ if((name_len=H5DSget_scale_name(dsid,NULL,(size_t)0)) < 0)
+ goto out;
+
+ /* allocate a buffer */
+ name_out = (char*)malloc(name_len * sizeof (char));
+ if(name_out == NULL)
+ goto out;
+
+ /* get the scale name using this buffer */
+ if(H5DSget_scale_name(dsid, name_out, (size_t)name_len) < 0)
+ goto out;
+
+ if(strcmp("Latitude set 0",name_out)!=0)
+ goto out;
+ if(name_out)
+ {
+ free(name_out);
+ name_out=NULL;
+ }
+
+ /*-------------------------------------------------------------------------
+ * get the scale name using a static buffer
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the scale name using this buffer */
+ if(H5DSget_scale_name(dsid, sname, sizeof (sname)) < 0)
+ goto out;
+
+ if(strcmp("Latitude set 0",sname)!=0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * get the scale name using a static buffer smaller than the string lenght
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the scale name using this buffer */
+ if(H5DSget_scale_name(dsid, snames, sizeof (snames)) < 0)
+ goto out;
+
+ if(strncmp("Latitude set 0",snames,sizeof(snames)-1)!=0)
+ goto out;
+ if(H5Dclose(dsid))
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * add scale names
+ *-------------------------------------------------------------------------
+ */
+
+ if((dsid = H5Dopen2(fid,"ds_a_11", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSset_scale(dsid,"Latitude set 1") < 0)
+ goto out;
+ if(H5Dclose(dsid))
+ goto out;
+
+ if((dsid = H5Dopen2(fid,"ds_a_2", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSset_scale(dsid,"Longitude set 0") < 0)
+ goto out;
+ if(H5Dclose(dsid))
+ goto out;
+
+ if((dsid = H5Dopen2(fid,"ds_a_21", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSset_scale(dsid,"Longitude set 1") < 0)
+ goto out;
+ if(H5Dclose(dsid))
+ goto out;
+
+ if((dsid = H5Dopen2(fid,"ds_a_22", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSset_scale(dsid,"Longitude set 2") < 0)
+ goto out;
+ if(H5Dclose(dsid))
+ goto out;
+
+ PASSED();
+
+ /*-------------------------------------------------------------------------
+ * H5DSiterate_scales
+ *-------------------------------------------------------------------------
+ */
+
+
+ TESTING2("iterate scales");
+
+
+ /*-------------------------------------------------------------------------
+ * test 6: test iterate scales with a function verify_scale
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the dataset id for "dset_a" */
+ if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
+ goto out;
+ dim = 0;
+
+ /* iterate trough the 1st dimension of "dset_a" and verify that its DS is valid */
+ if(H5DSiterate_scales(did,dim,NULL,verify_scale,NULL) < 0)
+ goto out;
+
+ /* iterate trough the 2nd dimension of "dset_a" and verify that its DS is valid
start at DS index 2 */
- dim = 1;
- scale_idx = 2;
-
- if(H5DSiterate_scales(did,dim,&scale_idx,verify_scale,NULL) < 0)
- goto out;
-
- /* close dataset ID of "dset_a" */
- if(H5Dclose(did) < 0)
- goto out;
-
- PASSED();
+ dim = 1;
+ scale_idx = 2;
+ if(H5DSiterate_scales(did,dim,&scale_idx,verify_scale,NULL) < 0)
+ goto out;
+ /* close dataset ID of "dset_a" */
+ if(H5Dclose(did) < 0)
+ goto out;
-/*-------------------------------------------------------------------------
- * test 7: test iterate scales with a function read_scale
- *-------------------------------------------------------------------------
- */
- TESTING2("iterate scales (read scale values)");
+ /*-------------------------------------------------------------------------
+ * test iterate scales with a function read_scale
+ *-------------------------------------------------------------------------
+ */
- /* get the dataset id for "dset_a" */
- if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
- goto out;
- dim = 0;
+ /* get the dataset id for "dset_a" */
+ if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
+ goto out;
+ dim = 0;
- /* iterate trough the 1st dimension of "dset_a" and read the DS */
- if(H5DSiterate_scales(did,dim,NULL,read_scale,s1_wbuf) < 0)
- goto out;
+ /* iterate trough the 1st dimension of "dset_a" and read the DS */
+ if(H5DSiterate_scales(did,dim,NULL,read_scale,s1_wbuf) < 0)
+ goto out;
- /* iterate trough the 2nd dimension of "dset_a" and read the DS
+ /* iterate trough the 2nd dimension of "dset_a" and read the DS
start at DS index 2 */
- dim = 1;
- scale_idx = 2;
-
- if(H5DSiterate_scales(did,dim,&scale_idx,read_scale,s22_wbuf) < 0)
- goto out;
-
- /* close dataset ID of "dset_a" */
- if(H5Dclose(did) < 0)
- goto out;
-
- PASSED();
-
-/*-------------------------------------------------------------------------
- * test 8: test iterate scales with a function match_dim_scale
- *-------------------------------------------------------------------------
- */
- TESTING2("iterate scales (verify the scale sizes match)");
-
- /* get the dataset id for "dset_a" */
- if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
- goto out;
-
- /* get dataset space */
- if((sid = H5Dget_space(did)) < 0)
- goto out;
-
- /* get rank */
- if((rank=H5Sget_simple_extent_ndims(sid)) < 0)
- goto out;
-
- /* get dimensions of dataset */
- if(H5Sget_simple_extent_dims(sid,dims,NULL) < 0)
- goto out;
-
- {
- int match_size; /* does this scale size matches the dataset DIM size */
- int idx=0; /* scale index to start iterating, on return, index where iterator stoped */
-
- /* iterate trough all the dimensions */
- for(dim=0; dim<(unsigned)rank; dim++)
- {
- if((match_size=H5DSiterate_scales(did,dim,&idx,match_dim_scale,NULL)) < 0)
- goto out;
-
- /* "dset_a" was defined with all dimension scales size matching the size of its dimensions */
- if(match_size==0)
- goto out;
-
- /* both DS_1_NAME and DS_2_NAME are the on the first index */
- if(idx!=0)
- goto out;
- }
- }
-
-
- /* close */
- if(H5Dclose(did) < 0)
- goto out;
- if(H5Sclose(sid) < 0)
- goto out;
-
- PASSED();
-
-/*-------------------------------------------------------------------------
- * test 9: test iterate scales with a function match_dim_scale
- *-------------------------------------------------------------------------
- */
- TESTING2("iterate scales (verify the scale sizes do not match)");
-
-/*-------------------------------------------------------------------------
- * create 3 datasets: 1 "data" dataset and dimension scales (some are empty)
- *-------------------------------------------------------------------------
- */
- if(H5LTmake_dataset_int(fid,"dset_f",rank,dims,buf) < 0)
- goto out;
- if(H5LTmake_dataset_int(fid,"ds_f_1",rankds,s1_dim,NULL) < 0)
- goto out;
- if(H5LTmake_dataset_int(fid,"ds_f_11",rankds,s1_dim,s1_wbuf) < 0)
- goto out;
- if(H5LTmake_dataset_int(fid,"ds_f_2",rankds,s2_dim,NULL) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * attach them
- *-------------------------------------------------------------------------
- */
- if((did = H5Dopen2(fid,"dset_f", H5P_DEFAULT)) < 0)
- goto out;
-
- if((dsid = H5Dopen2(fid,"ds_f_1", H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSattach_scale(did,dsid,DIM0) < 0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
- if((dsid = H5Dopen2(fid,"ds_f_11", H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSattach_scale(did,dsid,DIM0) < 0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
- if((dsid = H5Dopen2(fid,"ds_f_2", H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSattach_scale(did,dsid,DIM1) < 0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
-
- if(H5Dclose(did) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * verify match
- *-------------------------------------------------------------------------
- */
- /* get the dataset id for "dset_f" */
- if((did = H5Dopen2(fid,"dset_f", H5P_DEFAULT)) < 0)
- goto out;
-
- /* get dataset space */
- if((sid = H5Dget_space(did)) < 0)
- goto out;
-
- /* get rank */
- if((rank=H5Sget_simple_extent_ndims(sid)) < 0)
- goto out;
-
- /* get dimensions of dataset */
- if(H5Sget_simple_extent_dims(sid,dims,NULL) < 0)
- goto out;
-
- {
- int match_size; /* does this scale size matches the dataset DIM size */
- int idx; /* scale index to start iterating, on return, index where iterator stoped */
-
- /* iterate trough all the dimensions */
- for(dim=0; dim<(unsigned)rank; dim++)
- {
- /* always start at 1st scale */
- idx=0;
-
- if((match_size=H5DSiterate_scales(did,dim,&idx,match_dim_scale,NULL)) < 0)
- goto out;
-
- /* "dset_e" was defined with :
- dim 0: 2 scales, first is empty
- dim 1: 1 scale, empty */
- switch(dim)
- {
- case 0: /* for DIM 0, we get a valid scale at IDX 1 */
- if(match_size!=1 && idx!=1)
- goto out;
- break;
- case 1: /* for DIM 1, we get no valid scales */
- if(match_size!=0 && idx!=0)
- goto out;
- }/*switch*/
- }/*for*/
- }
-
- /* close */
- if(H5Dclose(did) < 0)
- goto out;
- if(H5Sclose(sid) < 0)
- goto out;
-
- PASSED();
-
-
-/*-------------------------------------------------------------------------
- * end
- *-------------------------------------------------------------------------
- */
-
- /* close */
- H5Fclose(fid);
-
- return 0;
-
- /* error zone, gracefully close */
-out:
- H5E_BEGIN_TRY {
- H5Dclose(did);
- H5Fclose(fid);
- } H5E_END_TRY;
- H5_FAILED();
- return FAIL;
+ dim = 1;
+ scale_idx = 2;
+ if(H5DSiterate_scales(did, dim, &scale_idx, read_scale, s22_wbuf) < 0)
+ goto out;
+
+ /* close dataset ID of "dset_a" */
+ if(H5Dclose(did) < 0)
+ goto out;
+
+
+ /*-------------------------------------------------------------------------
+ * test iterate scales with a function match_dim_scale
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the dataset id for "dset_a" */
+ if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get dataset space */
+ if((sid = H5Dget_space(did)) < 0)
+ goto out;
+
+ /* get rank */
+ if((rank = H5Sget_simple_extent_ndims(sid)) < 0)
+ goto out;
+
+ /* get dimensions of dataset */
+ if(H5Sget_simple_extent_dims(sid,dims,NULL) < 0)
+ goto out;
+ {
+ int match_size; /* does this scale size matches the dataset DIM size */
+ int idx = 0; /* scale index to start iterating, on return, index where iterator stoped */
+
+ /* iterate trough all the dimensions */
+ for(dim=0; dim<(unsigned)rank; dim++)
+ {
+ if((match_size=H5DSiterate_scales(did,dim,&idx,match_dim_scale,NULL)) < 0)
+ goto out;
+
+ /* "dset_a" was defined with all dimension scales size matching the size of its dimensions */
+ if(match_size==0)
+ goto out;
+
+ /* both DS_1_NAME and DS_2_NAME are the on the first index */
+ if(idx!=0)
+ goto out;
+ }
+ }
+
+
+ /* close */
+ if(H5Dclose(did) < 0)
+ goto out;
+ if(H5Sclose(sid) < 0)
+ goto out;
+
+
+ /*-------------------------------------------------------------------------
+ * test iterate scales with a function match_dim_scale
+ *-------------------------------------------------------------------------
+ */
+
+ /*-------------------------------------------------------------------------
+ * create 3 datasets: 1 "data" dataset and dimension scales (some are empty)
+ *-------------------------------------------------------------------------
+ */
+ if(H5LTmake_dataset_int(fid, "dset_f", rank, dims, buf) < 0)
+ goto out;
+
+ if(H5LTmake_dataset_int(fid,"ds_f_1",rankds,s1_dim,NULL) < 0)
+ goto out;
+ if(H5LTmake_dataset_int(fid, "ds_f_11", rankds, s1_dim, s1_wbuf) < 0)
+ goto out;
+
+ if(H5LTmake_dataset_int(fid,"ds_f_2",rankds,s2_dim,NULL) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * attach them
+ *-------------------------------------------------------------------------
+ */
+ if((did = H5Dopen2(fid,"dset_f", H5P_DEFAULT)) < 0)
+ goto out;
+ if((dsid = H5Dopen2(fid,"ds_f_1", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSattach_scale(did,dsid,DIM0) < 0)
+ goto out;
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ if((dsid = H5Dopen2(fid,"ds_f_11", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSattach_scale(did,dsid,DIM0) < 0)
+ goto out;
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ if((dsid = H5Dopen2(fid,"ds_f_2", H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSattach_scale(did,dsid,DIM1) < 0)
+ goto out;
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * verify match
+ *-------------------------------------------------------------------------
+ */
+ /* get the dataset id for "dset_f" */
+ if((did = H5Dopen2(fid,"dset_f", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get dataset space */
+ if((sid = H5Dget_space(did)) < 0)
+ goto out;
+
+ /* get rank */
+ if((rank = H5Sget_simple_extent_ndims(sid)) < 0)
+ goto out;
+
+ /* get dimensions of dataset */
+ if(H5Sget_simple_extent_dims(sid,dims,NULL) < 0)
+ goto out;
+ {
+ int match_size; /* does this scale size matches the dataset DIM size */
+ int idx; /* scale index to start iterating, on return, index where iterator stoped */
+
+ /* iterate trough all the dimensions */
+ for(dim=0; dim<(unsigned)rank; dim++)
+ {
+ /* always start at 1st scale */
+ idx=0;
+
+ if((match_size=H5DSiterate_scales(did,dim,&idx,match_dim_scale,NULL)) < 0)
+ goto out;
+
+ /* "dset_e" was defined with :
+ dim 0: 2 scales, first is empty
+ dim 1: 1 scale, empty */
+ switch(dim)
+ {
+ case 0: /* for DIM 0, we get a valid scale at IDX 1 */
+ if(match_size!=1 && idx!=1)
+ goto out;
+ break;
+ case 1: /* for DIM 1, we get no valid scales */
+ if(match_size!=0 && idx!=0)
+ goto out;
+ break;
+ default:
+ assert(0);
+ break;
+ }/*switch*/
+ }/*for*/
+ }
+
+ /* close */
+ if(H5Dclose(did) < 0)
+ goto out;
+ if(H5Sclose(sid) < 0)
+ goto out;
+
+ PASSED();
+
+
+ /*-------------------------------------------------------------------------
+ * end
+ *-------------------------------------------------------------------------
+ */
+
+ /* close */
+ H5Fclose(fid);
+ return 0;
+
+ /* error zone */
+ out:
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did);
+ H5Dclose(dsid);
+ H5Fclose(fid);
+ H5Sclose(sid);
+ H5Gclose(gid);
+ } H5E_END_TRY;
+ H5_FAILED();
+ return FAIL;
}
@@ -1465,25 +3439,25 @@ out:
static herr_t verify_scale(hid_t dset, unsigned dim, hid_t scale_id, void *visitor_data)
{
- /* define a default zero value for return. This will cause the iterator to continue */
- int ret = 0;
+ /* define a default zero value for return. This will cause the iterator to continue */
+ int ret = 0;
- /* unused */
- dset=dset;
- dim=dim;
- visitor_data=visitor_data;
+ /* unused */
+ dset=dset;
+ dim=dim;
+ visitor_data=visitor_data;
- /* define a positive value for return value. This will cause the iterator to
+ /* define a positive value for return value. This will cause the iterator to
immediately return that positive value, indicating short-circuit success
- */
+ */
- /* the parameter DS dataset must be a valid DS dataset */
- if((H5DSis_scale(scale_id))==1)
- {
- ret = 1;
- }
+ /* the parameter DS dataset must be a valid DS dataset */
+ if((H5DSis_scale(scale_id))==1)
+ {
+ ret = 1;
+ }
- return ret;
+ return ret;
}
@@ -1507,78 +3481,81 @@ static herr_t verify_scale(hid_t dset, unsigned dim, hid_t scale_id, void *visit
static herr_t read_scale(hid_t dset, unsigned dim, hid_t scale_id, void *visitor_data)
{
- int ret = 0; /* define a default zero value for return. This will cause the iterator to continue */
- hid_t sid; /* space ID */
- hid_t tid = -1; /* file type ID */
- hid_t mtid = -1; /* memory type ID */
- hssize_t nelmts; /* number of data elements */
- char *buf=NULL; /* data buffer */
- size_t size;
- int i;
- char *data=visitor_data;
-
- /* unused */
- dset=dset;
- dim=dim;
-
- /* get space */
- if((sid = H5Dget_space(scale_id)) < 0)
- goto out;
- /* get type */
- if((tid = H5Dget_type(scale_id)) < 0)
- goto out;
- /* get size of the DS array */
- if((nelmts = H5Sget_simple_extent_npoints(sid)) < 0)
- goto out;
- /* get type */
- if((mtid=H5Tget_native_type(tid,H5T_DIR_DEFAULT)) < 0)
- goto out;
- /* get type size */
- if((size=H5Tget_size(mtid))==0)
- goto out;
-
- if(nelmts)
- {
- buf=(char *) malloc((size_t)(nelmts*size));
- if( buf==NULL)
- goto out;
- if(H5Dread(scale_id,mtid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf) < 0)
- goto out;
-
- for(i=0; i<nelmts; i++)
- {
- if(buf[i] != data[i])
- {
- printf("read and write buffers differ\n");
- goto out;
- }
- }
-
- } /* if */
-
- if(H5Sclose(sid) < 0)
- goto out;
- if(H5Tclose(tid) < 0)
- goto out;
- if(H5Tclose(mtid) < 0)
- goto out;
- if(buf)
- free(buf);
-
-
- return ret;
-
- /* error zone, gracefully close */
- out:
- H5E_BEGIN_TRY {
- H5Sclose(sid);
- H5Tclose(tid);
- H5Tclose(mtid);
- if(buf)
- free(buf);
- } H5E_END_TRY;
-
- return FAIL;
+ int ret = 0; /* define a default zero value for return. This will cause the iterator to continue */
+ hid_t sid = -1; /* space ID */
+ hid_t tid = -1; /* file type ID */
+ hid_t mtid = -1; /* memory type ID */
+ hssize_t nelmts; /* number of data elements */
+ char *buf=NULL; /* data buffer */
+ size_t size;
+ int i;
+ char *data = (char*) visitor_data;
+
+ /* unused */
+ dset=dset;
+ dim=dim;
+
+ /* get space */
+ if((sid = H5Dget_space(scale_id)) < 0)
+ goto out;
+ /* get type */
+ if((tid = H5Dget_type(scale_id)) < 0)
+ goto out;
+ /* get size of the DS array */
+ if((nelmts = H5Sget_simple_extent_npoints(sid)) < 0)
+ goto out;
+ /* get type */
+ if((mtid=H5Tget_native_type(tid,H5T_DIR_DEFAULT)) < 0)
+ goto out;
+ /* get type size */
+ if((size=H5Tget_size(mtid))==0)
+ goto out;
+
+ if(nelmts)
+ {
+ buf=(char *) malloc((size_t)(nelmts*size));
+ if( buf==NULL)
+ goto out;
+ if(H5Dread(scale_id,mtid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf) < 0)
+ goto out;
+
+ for(i=0; i<nelmts; i++)
+ {
+ if(buf[i] != data[i])
+ {
+ printf("read and write buffers differ\n");
+ goto out;
+ }
+ }
+
+ } /* if */
+
+ if(H5Sclose(sid) < 0)
+ goto out;
+ if(H5Tclose(tid) < 0)
+ goto out;
+ if(H5Tclose(mtid) < 0)
+ goto out;
+ if(buf)
+ free(buf);
+
+
+ return ret;
+
+ /* error zone */
+out:
+ H5E_BEGIN_TRY
+ {
+ H5Sclose(sid);
+ H5Tclose(tid);
+ H5Tclose(mtid);
+ if(buf)
+ {
+ free(buf);
+ }
+ } H5E_END_TRY;
+
+ return FAIL;
}
@@ -1601,73 +3578,75 @@ static herr_t read_scale(hid_t dset, unsigned dim, hid_t scale_id, void *visitor
static herr_t match_dim_scale(hid_t did, unsigned dim, hid_t dsid, void *visitor_data)
{
- int ret = 0; /* define a default zero value for return. This will cause the iterator to continue */
- hid_t sid; /* space ID */
- hssize_t nelmts; /* size of a dimension scale array */
- hsize_t dims[H5S_MAX_RANK]; /* dimensions of dataset */
- hsize_t storage_size;
+ int ret = 0; /* define a default zero value for return. This will cause the iterator to continue */
+ hid_t sid; /* space ID */
+ hssize_t nelmts; /* size of a dimension scale array */
+ hsize_t dims[H5S_MAX_RANK]; /* dimensions of dataset */
+ hsize_t storage_size;
/* Stop compiler from whining about "unused parameters" */
visitor_data = visitor_data;
-/*-------------------------------------------------------------------------
- * get DID (dataset) space info
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * get DID (dataset) space info
+ *-------------------------------------------------------------------------
+ */
- /* get dataset space */
- if((sid = H5Dget_space(did)) < 0)
- goto out;
+ /* get dataset space */
+ if((sid = H5Dget_space(did)) < 0)
+ goto out;
- /* get dimensions of dataset */
- if(H5Sget_simple_extent_dims(sid,dims,NULL) < 0)
- goto out;
+ /* get dimensions of dataset */
+ if(H5Sget_simple_extent_dims(sid,dims,NULL) < 0)
+ goto out;
- /* close the dataspace id */
- if(H5Sclose(sid) < 0)
- goto out;
+ /* close the dataspace id */
+ if(H5Sclose(sid) < 0)
+ goto out;
-/*-------------------------------------------------------------------------
- * get DSID (scale) space info
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * get DSID (scale) space info
+ *-------------------------------------------------------------------------
+ */
- /* get the space for the scale */
- if((sid = H5Dget_space(dsid)) < 0)
- goto out;
+ /* get the space for the scale */
+ if((sid = H5Dget_space(dsid)) < 0)
+ goto out;
- /* get size of the DS array */
- if((nelmts = H5Sget_simple_extent_npoints(sid)) < 0)
- goto out;
+ /* get size of the DS array */
+ if((nelmts = H5Sget_simple_extent_npoints(sid)) < 0)
+ goto out;
- /* close */
- if(H5Sclose(sid) < 0)
- goto out;
+ /* close */
+ if(H5Sclose(sid) < 0)
+ goto out;
- /* the size of the DS array must match the dimension of the dataset */
- if(nelmts == (hssize_t)dims[dim])
- ret = 1;
+ /* the size of the DS array must match the dimension of the dataset */
+ if(nelmts == (hssize_t)dims[dim])
+ ret = 1;
- /* if the scale is empty assume it cannot be used */
- storage_size=H5Dget_storage_size(dsid);
+ /* if the scale is empty assume it cannot be used */
+ storage_size=H5Dget_storage_size(dsid);
- if(storage_size==0)
- ret = 0;
+ if(storage_size==0)
+ ret = 0;
- return ret;
+ return ret;
out:
- H5E_BEGIN_TRY {
- H5Sclose(sid);
- } H5E_END_TRY;
- return FAIL;
+ H5E_BEGIN_TRY
+ {
+ H5Sclose(sid);
+ } H5E_END_TRY;
+ return FAIL;
}
/*-------------------------------------------------------------------------
- * Function: op_bogus
+ * Function: op_continue
*
- * Purpose: example operator function used by H5DSiterate_scales, that does nothing
+ * Purpose: example operator function used by H5DSiterate_scales that continues
+ * iteration and increments visitor_data (Note: int*)
*
* Return:
* The return values from an operator are:
@@ -1680,399 +3659,431 @@ out:
*-------------------------------------------------------------------------
*/
-static herr_t op_bogus(hid_t dset, unsigned dim, hid_t scale_id, void *visitor_data)
+static herr_t op_continue(hid_t dset, unsigned dim, hid_t scale_id, void *visitor_data)
{
/* Stop compiler from whining about "unused parameters" */
dset = dset;
dim = dim;
scale_id = scale_id;
- visitor_data = visitor_data;
-
- /* define a default zero value for return. This will cause the iterator to continue */
- return 0;
-}
-
-
-
-
+ if ( visitor_data != NULL )
+ {
+ (*(int *)visitor_data)++;
+ }
+ /* define a default zero value for return. This will cause the iterator to continue */
+ return 0;
+}
/*-------------------------------------------------------------------------
- * test error conditions
+ * Function: op_stop
+ *
+ * Purpose: example operator function used by H5DSiterate_scales that stops
+ * iteration and increments visitor_data (Note: int*)
+ *
+ * Return:
+ * The return values from an operator are:
+ * Zero causes the iterator to continue, returning zero when all group members have been processed.
+ * Positive causes the iterator to immediately return that positive value, indicating
+ * short-circuit success. The iterator can be restarted at the next group member.
+ * Negative causes the iterator to immediately return that value, indicating failure.
+ * The iterator can be restarted at the next group member.
+ *
*-------------------------------------------------------------------------
*/
-static int test_errors(void)
+static herr_t op_stop(hid_t dset, unsigned dim, hid_t scale_id, void *visitor_data)
{
- hid_t fid; /* file ID */
- int rank = RANK; /* rank of data dataset */
- int rankds = 1; /* rank of DS dataset */
- hsize_t dims[RANK] = {DIM1_SIZE,DIM2_SIZE}; /* size of data dataset */
- hsize_t s1_dim[1] = {DIM1_SIZE}; /* size of DS 1 dataset */
- hid_t did = -1; /* dataset ID */
- hid_t dsid = -1; /* scale ID */
- hid_t gid = -1; /* group ID */
- hid_t sid = -1; /* space ID */
- hid_t sidds = -1; /* space ID */
- hsize_t pal_dims[] = {9,3};
-
- printf("Testing error conditions\n");
-
-/*-------------------------------------------------------------------------
- * create a file, spaces, dataset and group ids
- *-------------------------------------------------------------------------
- */
-
- /* create a file using default properties */
- if((fid = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
- /* create a group */
- if((gid = H5Gcreate2(fid, "grp", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
- /* create the data space for the dataset */
- if((sid = H5Screate_simple(rank, dims, NULL)) < 0)
- goto out;
- /* create the data space for the scale */
- if((sidds = H5Screate_simple(rankds, s1_dim, NULL)) < 0)
- goto out;
- /* create a dataset */
- if((did = H5Dcreate2(fid, "dset_a", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
- /* create a dataset for the scale */
- if((dsid = H5Dcreate2(fid, "ds_a", H5T_NATIVE_INT, sidds, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * attempt to attach a dataset to itself, it should fail
- *-------------------------------------------------------------------------
- */
-
- TESTING2("attach a dataset to itself");
-
- if(H5DSattach_scale(did, did, 0) == SUCCEED)
- goto out;
-
- PASSED();
-
-/*-------------------------------------------------------------------------
- * attempt to attach a group with a dataset, it should fail
- *-------------------------------------------------------------------------
- */
- TESTING2("attach a group with a dataset");
-
- if(H5DSattach_scale(gid,dsid,0)==SUCCEED)
- goto out;
-
- PASSED();
-
-/*-------------------------------------------------------------------------
- * attempt to attach a dataset with a group, it should fail
- *-------------------------------------------------------------------------
- */
- TESTING2("attach a dataset with a group");
-
- if(H5DSattach_scale(did,gid,0)==SUCCEED)
- goto out;
-
- PASSED();
-
-/*-------------------------------------------------------------------------
- * attempt to set scale for a group, it should fail
- *-------------------------------------------------------------------------
- */
- TESTING2("set scale for a group");
-
- if(H5DSset_scale(gid,"scale 1")==SUCCEED)
- goto out;
-
- PASSED();
-
-/*-------------------------------------------------------------------------
- * close IDs for this set
- *-------------------------------------------------------------------------
- */
-
- /* close */
- if(H5Dclose(dsid) < 0)
- goto out;
- if(H5Dclose(did) < 0)
- goto out;
- if(H5Sclose(sid) < 0)
- goto out;
- if(H5Sclose(sidds) < 0)
- goto out;
- if(H5Gclose(gid) < 0)
- goto out;
-
+ /* Stop compiler from whining about "unused parameters" */
+ dset = dset;
+ dim = dim;
+ scale_id = scale_id;
+
+ if ( visitor_data != NULL )
+ {
+ (*(int *)visitor_data)++;
+ }
+
+ /* define a default 1 value for return. This will cause the iterator to stop */
+ return 1;
+}
/*-------------------------------------------------------------------------
- * try to attach a scale that has scales
+ * test error conditions
*-------------------------------------------------------------------------
*/
- TESTING2("attach a scale that has scales");
-
- /* create the data space for the scale */
- if((sidds = H5Screate_simple(rankds, s1_dim, NULL)) < 0)
- goto out;
-
- /* create a dataset "ds_b" for the scale */
- if((dsid = H5Dcreate2(fid, "ds_b", H5T_NATIVE_INT, sidds, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
-
- /* open the previous written "ds_a" */
- if((did = H5Dopen2(fid,"ds_a", H5P_DEFAULT)) < 0)
- goto out;
-
- /* attach "ds_b" to "ds_a", valid */
- if(H5DSattach_scale(did, dsid, 0) < 0)
- goto out;
-
- /* close */
- if(H5Dclose(dsid) < 0)
- goto out;
- if(H5Dclose(did) < 0)
- goto out;
- if(H5Sclose(sidds) < 0)
- goto out;
+static int test_errors(void)
+{
+ hid_t fid; /* file ID */
+ int rank = RANK; /* rank of data dataset */
+ int rankds = 1; /* rank of DS dataset */
+ hsize_t dims[RANK] = {DIM1_SIZE,DIM2_SIZE}; /* size of data dataset */
+ hsize_t s1_dim[1] = {DIM1_SIZE}; /* size of DS 1 dataset */
+ hid_t did = -1; /* dataset ID */
+ hid_t dsid = -1; /* scale ID */
+ hid_t gid = -1; /* group ID */
+ hid_t sid = -1; /* space ID */
+ hid_t sidds = -1; /* space ID */
+ hsize_t pal_dims[] = {9,3};
+
+ printf("Testing error conditions\n");
+
+ /*-------------------------------------------------------------------------
+ * create a file, spaces, dataset and group ids
+ *-------------------------------------------------------------------------
+ */
+
+ /* create a file using default properties */
+ if((fid = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+ /* create a group */
+ if((gid = H5Gcreate2(fid, "grp", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+ /* create the data space for the dataset */
+ if((sid = H5Screate_simple(rank, dims, NULL)) < 0)
+ goto out;
+ /* create the data space for the scale */
+ if((sidds = H5Screate_simple(rankds, s1_dim, NULL)) < 0)
+ goto out;
+ /* create a dataset */
+ if((did = H5Dcreate2(fid, "dset_a", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+ /* create a dataset for the scale */
+ if((dsid = H5Dcreate2(fid, "ds_a", H5T_NATIVE_INT, sidds, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * attempt to attach a dataset to itself, it should fail
+ *-------------------------------------------------------------------------
+ */
+
+ TESTING2("attach a dataset to itself");
+
+ if(H5DSattach_scale(did, did, 0) == SUCCEED)
+ goto out;
+
+ PASSED();
+
+ /*-------------------------------------------------------------------------
+ * attempt to attach a group with a dataset, it should fail
+ *-------------------------------------------------------------------------
+ */
+ TESTING2("attach a group with a dataset");
+
+ if(H5DSattach_scale(gid,dsid,0)==SUCCEED)
+ goto out;
+
+ PASSED();
+
+ /*-------------------------------------------------------------------------
+ * attempt to attach a dataset with a group, it should fail
+ *-------------------------------------------------------------------------
+ */
+ TESTING2("attach a dataset with a group");
+
+ if(H5DSattach_scale(did,gid,0)==SUCCEED)
+ goto out;
+
+ PASSED();
+
+ /*-------------------------------------------------------------------------
+ * attempt to set scale for a group, it should fail
+ *-------------------------------------------------------------------------
+ */
+ TESTING2("set scale for a group");
+
+ if(H5DSset_scale(gid,"scale 1")==SUCCEED)
+ goto out;
+
+ PASSED();
+
+ /*-------------------------------------------------------------------------
+ * close IDs for this set
+ *-------------------------------------------------------------------------
+ */
+
+ /* close */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ if(H5Dclose(did) < 0)
+ goto out;
+ if(H5Sclose(sid) < 0)
+ goto out;
+ if(H5Sclose(sidds) < 0)
+ goto out;
+ if(H5Gclose(gid) < 0)
+ goto out;
+
+
+ /*-------------------------------------------------------------------------
+ * try to attach a scale that has scales
+ *-------------------------------------------------------------------------
+ */
+
+ TESTING2("attach a scale that has scales");
+
+ /* create the data space for the scale */
+ if((sidds = H5Screate_simple(rankds, s1_dim, NULL)) < 0)
+ goto out;
+
+ /* create a dataset "ds_b" for the scale */
+ if((dsid = H5Dcreate2(fid, "ds_b", H5T_NATIVE_INT, sidds, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* open the previous written "ds_a" */
+ if((did = H5Dopen2(fid,"ds_a", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* attach "ds_b" to "ds_a", valid */
+ if(H5DSattach_scale(did, dsid, 0) < 0)
+ goto out;
+
+ /* close */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ if(H5Dclose(did) < 0)
+ goto out;
+ if(H5Sclose(sidds) < 0)
+ goto out;
+
+ /* open the previous written "dset_a" */
+ if((did = H5Dopen2(fid, "dset_a", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* open the previous written "ds_a" */
+ if((dsid = H5Dopen2(fid, "ds_a", H5P_DEFAULT)) < 0)
+ goto out;
- /* open the previous written "dset_a" */
- if((did = H5Dopen2(fid, "dset_a", H5P_DEFAULT)) < 0)
- goto out;
+ /* try to attach "ds_a" to "dset_a", not valid */
+ if(H5DSattach_scale(did,dsid,0)==SUCCEED)
+ goto out;
- /* open the previous written "ds_a" */
- if((dsid = H5Dopen2(fid, "ds_a", H5P_DEFAULT)) < 0)
- goto out;
+ /* close */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ /* open the previous written "ds_a" */
+ if((did = H5Dopen2(fid,"ds_a", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* open the previous written "ds_b" */
+ if((dsid = H5Dopen2(fid,"ds_b", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* detach "ds_b" to "ds_a" */
+ if(H5DSdetach_scale(did,dsid,0) < 0)
+ goto out;
+
+ /* close */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ if(H5Dclose(did) < 0)
+ goto out;
- /* try to attach "ds_a" to "dset_a", not valid */
- if(H5DSattach_scale(did,dsid,0)==SUCCEED)
- goto out;
+ PASSED();
- /* close */
- if(H5Dclose(dsid) < 0)
- goto out;
- if(H5Dclose(did) < 0)
- goto out;
+ /*-------------------------------------------------------------------------
+ * try to attach a dataset that is a scale
+ *-------------------------------------------------------------------------
+ */
- /* open the previous written "ds_a" */
- if((did = H5Dopen2(fid,"ds_a", H5P_DEFAULT)) < 0)
- goto out;
+ TESTING2("attach to a dataset that is a scale");
- /* open the previous written "ds_b" */
- if((dsid = H5Dopen2(fid,"ds_b", H5P_DEFAULT)) < 0)
- goto out;
+ /* open the previous written "ds_b", that is a scale */
+ if((dsid = H5Dopen2(fid,"ds_b", H5P_DEFAULT)) < 0)
+ goto out;
- /* detach "ds_b" to "ds_a" */
- if(H5DSdetach_scale(did,dsid,0) < 0)
- goto out;
+ /* open the previous written "ds_a" */
+ if((did = H5Dopen2(fid,"ds_a", H5P_DEFAULT)) < 0)
+ goto out;
- /* close */
- if(H5Dclose(dsid) < 0)
- goto out;
- if(H5Dclose(did) < 0)
- goto out;
+ /* try to attach "ds_a" to "ds_b", not valid */
+ if(H5DSattach_scale(dsid,did,0)==SUCCEED)
+ goto out;
+
+ /* close */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ if(H5Dclose(did) < 0)
+ goto out;
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * try to attach a dataset that is a scale
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * try to attach a scale to an image, pallete or table
+ *-------------------------------------------------------------------------
+ */
- TESTING2("attach to a dataset that is a scale");
+ TESTING2("attach to a dataset that is a reserved class dataset");
- /* open the previous written "ds_b", that is a scale */
- if((dsid = H5Dopen2(fid,"ds_b", H5P_DEFAULT)) < 0)
- goto out;
+ /* make an image */
+ if(H5IMmake_image_8bit(fid,"image",(hsize_t)100,(hsize_t)50,NULL) < 0)
+ goto out;
- /* open the previous written "ds_a" */
- if((did = H5Dopen2(fid,"ds_a", H5P_DEFAULT)) < 0)
- goto out;
+ /* make a palette */
+ if(H5IMmake_palette(fid,"pallete",pal_dims,NULL) < 0)
+ goto out;
- /* try to attach "ds_a" to "ds_b", not valid */
- if(H5DSattach_scale(dsid,did,0)==SUCCEED)
- goto out;
+ /* open the previous written "ds_b" */
+ if((dsid = H5Dopen2(fid,"ds_b", H5P_DEFAULT)) < 0)
+ goto out;
- /* close */
- if(H5Dclose(dsid) < 0)
- goto out;
- if(H5Dclose(did) < 0)
- goto out;
+ /* open the image dataset */
+ if((did = H5Dopen2(fid,"image", H5P_DEFAULT)) < 0)
+ goto out;
- PASSED();
+ /* try to attach "ds_a" to the image, not valid */
+ if(H5DSattach_scale(did,dsid,0)==SUCCEED)
+ goto out;
-/*-------------------------------------------------------------------------
- * try to attach a scale to an image, pallete or table
- *-------------------------------------------------------------------------
- */
+ /* close */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ if(H5Dclose(did) < 0)
+ goto out;
- TESTING2("attach to a dataset that is a reserved class dataset");
+ PASSED();
- /* make an image */
- if(H5IMmake_image_8bit(fid,"image",(hsize_t)100,(hsize_t)50,NULL) < 0)
- goto out;
+ /*-------------------------------------------------------------------------
+ * is scale
+ *-------------------------------------------------------------------------
+ */
- /* make a palette */
- if(H5IMmake_palette(fid,"pallete",pal_dims,NULL) < 0)
- goto out;
+ TESTING2("is scale");
- /* open the previous written "ds_b" */
- if((dsid = H5Dopen2(fid,"ds_b", H5P_DEFAULT)) < 0)
- goto out;
+ /* open a non scale dataset */
+ if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
+ goto out;
- /* open the image dataset */
- if((did = H5Dopen2(fid,"image", H5P_DEFAULT)) < 0)
- goto out;
+ /* verify that it is not a dimension scale dataset */
+ if((H5DSis_scale(did))==1)
+ goto out;
- /* try to attach "ds_a" to the image, not valid */
- if(H5DSattach_scale(did,dsid,0)==SUCCEED)
- goto out;
+ /* close */
+ if(H5Dclose(did) < 0)
+ goto out;
- /* close */
- if(H5Dclose(dsid) < 0)
- goto out;
- if(H5Dclose(did) < 0)
- goto out;
+ /* open the group. */
+ if((gid = H5Gopen2(fid, "grp", H5P_DEFAULT)) < 0)
+ goto out;
- PASSED();
+ /* verify that it is not a dimension scale dataset */
+ if((H5DSis_scale(gid))==1)
+ goto out;
-/*-------------------------------------------------------------------------
- * is scale
- *-------------------------------------------------------------------------
- */
-
- TESTING2("is scale");
-
- /* open a non scale dataset */
- if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
- goto out;
-
- /* verify that it is not a dimension scale dataset */
- if((H5DSis_scale(did))==1)
- goto out;
-
- /* close */
- if(H5Dclose(did) < 0)
- goto out;
+ /* close */
+ if(H5Gclose(gid) < 0)
+ goto out;
- /* open the group. */
- if((gid = H5Gopen2(fid, "grp", H5P_DEFAULT)) < 0)
- goto out;
+ PASSED();
- /* verify that it is not a dimension scale dataset */
- if((H5DSis_scale(gid))==1)
- goto out;
- /* close */
- if(H5Gclose(gid) < 0)
- goto out;
-
- PASSED();
-
-
-/*-------------------------------------------------------------------------
- * detach
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * detach
+ *-------------------------------------------------------------------------
+ */
- TESTING2("detach scale from dataset it is not attached to");
+ TESTING2("detach scale from dataset it is not attached to");
- /* open the previous written "ds_a" */
- if((dsid = H5Dopen2(fid,"ds_a", H5P_DEFAULT)) < 0)
- goto out;
+ /* open the previous written "ds_a" */
+ if((dsid = H5Dopen2(fid,"ds_a", H5P_DEFAULT)) < 0)
+ goto out;
- /* open the previous written "dset_a" */
- if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
- goto out;
+ /* open the previous written "dset_a" */
+ if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
+ goto out;
- /* try to detach "ds_a" from "dset_a" */
- if(H5DSdetach_scale(did,dsid,0)==SUCCEED)
- goto out;
+ /* try to detach "ds_a" from "dset_a" */
+ if(H5DSdetach_scale(did,dsid,0)==SUCCEED)
+ goto out;
- /* close */
- if(H5Dclose(dsid) < 0)
- goto out;
- if(H5Dclose(did) < 0)
- goto out;
+ /* close */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ if(H5Dclose(did) < 0)
+ goto out;
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * detach
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * detach
+ *-------------------------------------------------------------------------
+ */
- TESTING2("detach scale from group");
+ TESTING2("detach scale from group");
- /* open the previous written "ds_a" */
- if((dsid = H5Dopen2(fid,"ds_a", H5P_DEFAULT)) < 0)
- goto out;
+ /* open the previous written "ds_a" */
+ if((dsid = H5Dopen2(fid,"ds_a", H5P_DEFAULT)) < 0)
+ goto out;
- /* open the group. */
- if((gid = H5Gopen2(fid, "grp", H5P_DEFAULT)) < 0)
- goto out;
+ /* open the group. */
+ if((gid = H5Gopen2(fid, "grp", H5P_DEFAULT)) < 0)
+ goto out;
- /* try to detach "ds_a" from "grp" */
- if(H5DSdetach_scale(gid,dsid,0)==SUCCEED)
- goto out;
+ /* try to detach "ds_a" from "grp" */
+ if(H5DSdetach_scale(gid,dsid,0)==SUCCEED)
+ goto out;
- /* close */
- if(H5Dclose(dsid) < 0)
- goto out;
- if(H5Gclose(gid) < 0)
- goto out;
+ /* close */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ if(H5Gclose(gid) < 0)
+ goto out;
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * detach
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * detach
+ *-------------------------------------------------------------------------
+ */
- TESTING2("detach scale when scale is group");
+ TESTING2("detach scale when scale is group");
- /* open the previous written "dset_a" */
- if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
- goto out;
+ /* open the previous written "dset_a" */
+ if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
+ goto out;
- /* open the group. */
- if((gid = H5Gopen2(fid, "grp", H5P_DEFAULT)) < 0)
- goto out;
+ /* open the group. */
+ if((gid = H5Gopen2(fid, "grp", H5P_DEFAULT)) < 0)
+ goto out;
- /* try to detach "grp" from "dset_a" */
- if(H5DSdetach_scale(did,gid,0)==SUCCEED)
- goto out;
+ /* try to detach "grp" from "dset_a" */
+ if(H5DSdetach_scale(did,gid,0)==SUCCEED)
+ goto out;
- /* close */
- if(H5Dclose(did) < 0)
- goto out;
- if(H5Gclose(gid) < 0)
- goto out;
+ /* close */
+ if(H5Dclose(did) < 0)
+ goto out;
+ if(H5Gclose(gid) < 0)
+ goto out;
- PASSED();
+ PASSED();
- /* close */
- if(H5Fclose(fid) < 0)
- goto out;
+ /* close */
+ if(H5Fclose(fid) < 0)
+ goto out;
- return 0;
+ return 0;
- /* error zone, gracefully close */
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Sclose(sid);
- H5Sclose(sidds);
- H5Dclose(did);
- H5Dclose(dsid);
- H5Gclose(gid);
- H5Fclose(fid);
- } H5E_END_TRY;
- H5_FAILED();
- return FAIL;
+ H5E_BEGIN_TRY
+ {
+ H5Sclose(sid);
+ H5Sclose(sidds);
+ H5Dclose(did);
+ H5Dclose(dsid);
+ H5Gclose(gid);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+ H5_FAILED();
+ return FAIL;
}
@@ -2084,182 +4095,184 @@ out:
static int test_iterators(void)
{
- hid_t fid; /* file ID */
- int rank = RANK; /* rank of data dataset */
- int rankds = 1; /* rank of DS dataset */
- hsize_t dims[RANK] = {DIM1_SIZE,DIM2_SIZE}; /* size of data dataset */
- hsize_t s1_dim[1] = {DIM1_SIZE}; /* size of DS 1 dataset */
- hid_t gid = -1; /* group ID */
- hid_t did; /* dataset ID */
- hid_t dsid; /* scale ID */
- char dname[30]; /* dataset name */
- int i;
-
- printf("Testing iterators\n");
-
-/*-------------------------------------------------------------------------
- * create a file, spaces, dataset and group ids
- *-------------------------------------------------------------------------
- */
-
- /* create a file using default properties */
- if((fid=H5Fcreate(FILE3,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
- goto out;
- /* create a group */
- if((gid = H5Gcreate2(fid, "grp", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
- /* close */
- if(H5Gclose(gid) < 0)
- goto out;
- /* make a dataset */
- if(H5LTmake_dataset_int(fid,"dset_a",rank,dims,NULL) < 0)
- goto out;
- /* make a DS dataset */
- if(H5LTmake_dataset_int(fid,"ds_a",rankds,s1_dim,NULL) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * iterate when the dataset has no scales
- *-------------------------------------------------------------------------
- */
-
- TESTING2("iterate when the dataset has no scales ");
-
- /* get the dataset id for "dset_a" */
- if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
- goto out;
-
- /* try to iterate trough the 1st dimension of "dset_a", return error */
- if(H5DSiterate_scales(did,0,NULL,verify_scale,NULL) < 0)
- goto out;
+ hid_t fid; /* file ID */
+ int rank = RANK; /* rank of data dataset */
+ int rankds = 1; /* rank of DS dataset */
+ hsize_t dims[RANK] = {DIM1_SIZE,DIM2_SIZE}; /* size of data dataset */
+ hsize_t s1_dim[1] = {DIM1_SIZE}; /* size of DS 1 dataset */
+ hid_t gid = -1; /* group ID */
+ hid_t did = -1; /* dataset ID */
+ hid_t dsid = -1; /* scale ID */
+ char dname[30]; /* dataset name */
+ int i;
+
+ printf("Testing iterators\n");
+
+ /*-------------------------------------------------------------------------
+ * create a file, spaces, dataset and group ids
+ *-------------------------------------------------------------------------
+ */
+
+ /* create a file using default properties */
+ if((fid=H5Fcreate(FILE3,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+ goto out;
+ /* create a group */
+ if((gid = H5Gcreate2(fid, "grp", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+ /* close */
+ if(H5Gclose(gid) < 0)
+ goto out;
+ /* make a dataset */
+ if(H5LTmake_dataset_int(fid,"dset_a",rank,dims,NULL) < 0)
+ goto out;
+ /* make a DS dataset */
+ if(H5LTmake_dataset_int(fid,"ds_a",rankds,s1_dim,NULL) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * iterate when the dataset has no scales
+ *-------------------------------------------------------------------------
+ */
+
+ TESTING2("iterate when the dataset has no scales ");
+
+ /* get the dataset id for "dset_a" */
+ if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* try to iterate trough the 1st dimension of "dset_a", return error */
+ if(H5DSiterate_scales(did,0,NULL,verify_scale,NULL) < 0)
+ goto out;
+
+ /* close */
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ PASSED();
+
+
+ /*-------------------------------------------------------------------------
+ * iterate on dimension that is outside the rank
+ *-------------------------------------------------------------------------
+ */
+
+ TESTING2("iterate on dimension that is outside the rank ");
+
+ /* get the dataset id for "dset_a" */
+ if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* try to iterate trough the 3rd dimension of "dset_a", return error */
+ if(H5DSiterate_scales(did,3,NULL,verify_scale,NULL)==SUCCEED)
+ goto out;
+
+ /* close */
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ PASSED();
+
+ /*-------------------------------------------------------------------------
+ * iterate for dimension with many scales
+ *-------------------------------------------------------------------------
+ */
+
+ TESTING2("iterate for dimension with many scales ");
+
+ /* open the previously written "dset_a" */
+ if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
+ goto out;
+
+ for(i=0; i<100; i++)
+ {
+ /* make a DS */
+ sprintf(dname,"ds_%d",i);
+ if(H5LTmake_dataset_int(fid,dname,rankds,s1_dim,NULL) < 0)
+ goto out;
+ /* open */
+ if((dsid = H5Dopen2(fid,dname, H5P_DEFAULT)) < 0)
+ goto out;
+ /* attach */
+ if(H5DSattach_scale(did,dsid,0) < 0)
+ goto out;
+ /* close */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ }
- /* close */
- if(H5Dclose(did) < 0)
- goto out;
+ /* iterate trough the 1st dimension of "dset_a" */
+ if(H5DSiterate_scales(did,0,NULL,op_continue,NULL) < 0)
+ goto out;
- PASSED();
+ /* close */
+ if(H5Dclose(did) < 0)
+ goto out;
+ PASSED();
-/*-------------------------------------------------------------------------
- * iterate on dimension that is outside the rank
- *-------------------------------------------------------------------------
- */
-
- TESTING2("iterate on dimension that is outside the rank ");
-
- /* get the dataset id for "dset_a" */
- if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
- goto out;
-
- /* try to iterate trough the 3rd dimension of "dset_a", return error */
- if(H5DSiterate_scales(did,3,NULL,verify_scale,NULL)==SUCCEED)
- goto out;
-
- /* close */
- if(H5Dclose(did) < 0)
- goto out;
-
- PASSED();
-
-/*-------------------------------------------------------------------------
- * iterate for dimension with many scales
- *-------------------------------------------------------------------------
- */
-
- TESTING2("iterate for dimension with many scales ");
-
- /* open the previously written "dset_a" */
- if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
- goto out;
-
- for(i=0; i<100; i++)
- {
- /* make a DS */
- sprintf(dname,"ds_%d",i);
- if(H5LTmake_dataset_int(fid,dname,rankds,s1_dim,NULL) < 0)
- goto out;
- /* open */
- if((dsid = H5Dopen2(fid,dname, H5P_DEFAULT)) < 0)
- goto out;
- /* attach */
- if(H5DSattach_scale(did,dsid,0) < 0)
- goto out;
- /* close */
- if(H5Dclose(dsid) < 0)
- goto out;
- }
-
- /* iterate trough the 1st dimension of "dset_a" */
- if(H5DSiterate_scales(did,0,NULL,op_bogus,NULL) < 0)
- goto out;
-
- /* close */
- if(H5Dclose(did) < 0)
- goto out;
-
- PASSED();
-
-/*-------------------------------------------------------------------------
- * iterate on group
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * iterate on group
+ *-------------------------------------------------------------------------
+ */
- TESTING2("iterate on group ");
+ TESTING2("iterate on group ");
- /* open */
- if((gid = H5Gopen2(fid, "grp", H5P_DEFAULT)) < 0)
- goto out;
+ /* open */
+ if((gid = H5Gopen2(fid, "grp", H5P_DEFAULT)) < 0)
+ goto out;
- /* try to iterate, return error */
- if(H5DSiterate_scales(gid,0,NULL,verify_scale,NULL)==SUCCEED)
- goto out;
+ /* try to iterate, return error */
+ if(H5DSiterate_scales(gid,0,NULL,verify_scale,NULL)==SUCCEED)
+ goto out;
- /* close */
- if(H5Gclose(gid) < 0)
- goto out;
+ /* close */
+ if(H5Gclose(gid) < 0)
+ goto out;
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * iterate in deleted scales
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * iterate in deleted scales
+ *-------------------------------------------------------------------------
+ */
- TESTING2("iterate in deleted scales ");
+ TESTING2("iterate in deleted scales ");
- if(H5Ldelete(fid, "ds_0", H5P_DEFAULT) < 0)
- goto out;
+ if(H5Ldelete(fid, "ds_0", H5P_DEFAULT) < 0)
+ goto out;
- /* open the previously written "dset_a" */
- if((did = H5Dopen2(fid, "dset_a", H5P_DEFAULT)) < 0)
- goto out;
+ /* open the previously written "dset_a" */
+ if((did = H5Dopen2(fid, "dset_a", H5P_DEFAULT)) < 0)
+ goto out;
- /* iterate */
- if(H5DSiterate_scales(did, 0, NULL, op_bogus, NULL) == SUCCEED)
- goto out;
+ /* iterate */
+ if(H5DSiterate_scales(did, 0, NULL, op_continue, NULL) == SUCCEED)
+ goto out;
- /* close */
- if(H5Dclose(did) < 0)
- goto out;
+ /* close */
+ if(H5Dclose(did) < 0)
+ goto out;
- PASSED();
+ PASSED();
- /* close */
- if(H5Fclose(fid) < 0)
- goto out;
+ /* close */
+ if(H5Fclose(fid) < 0)
+ goto out;
- return 0;
+ return 0;
- /* error zone, gracefully close */
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Gclose(gid);
- H5Fclose(fid);
- } H5E_END_TRY;
- H5_FAILED();
- return FAIL;
+ H5E_BEGIN_TRY
+ {
+ H5Gclose(gid);
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+ H5_FAILED();
+ return FAIL;
}
@@ -2270,204 +4283,207 @@ out:
static int test_rank(void)
{
- hid_t fid; /* file ID */
- hid_t did = -1; /* dataset ID */
- hid_t dsid = -1; /* scale ID */
- hid_t sid; /* space ID */
- hid_t sidds; /* space ID */
- hsize_t dims1[1] = {DIM1_SIZE}; /* size of data dataset */
- hsize_t dims2[2] = {DIM1_SIZE,DIM2_SIZE}; /* size of data dataset */
- hsize_t dims3[3] = {DIM1_SIZE,DIM2_SIZE,DIM3_SIZE}; /* size of data dataset */
- hsize_t dimss[2] = {1,1}; /* size of data dataset */
- char name[30]; /* dataset name buffer */
- char names[30]; /* dataset scale name buffer */
- char namel[30]; /* dataset label name buffer */
- int bufi[1]={2};
- float buff[1]={1};
- int i;
-
- printf("Testing ranks\n");
-
-/*-------------------------------------------------------------------------
- * create a file, a dataset, scales
- *-------------------------------------------------------------------------
- */
-
- /* create a file using default properties */
- if((fid=H5Fcreate(FILE4,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
- goto out;
-
- /* make a dataset a 3D data dataset */
- if(H5LTmake_dataset_int(fid,"dset_a",3,dims3,NULL) < 0)
- goto out;
-
- /* make a 1D scale dataset */
- if(H5LTmake_dataset_int(fid,"ds_a_0",1,dims1,NULL) < 0)
- goto out;
-
- /* make a 2D scale dataset */
- if(H5LTmake_dataset_int(fid,"ds_a_1",2,dims2,NULL) < 0)
- goto out;
-
- /* make a 3D scale dataset */
- if(H5LTmake_dataset_int(fid,"ds_a_2",3,dims3,NULL) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * attach
- *-------------------------------------------------------------------------
- */
-
- TESTING2("attach");
-
- if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
- goto out;
-
- for(i=0; i<3; i++)
- {
- sprintf(name,"ds_a_%d",i);
- if((dsid = H5Dopen2(fid,name, H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSattach_scale(did,dsid,(unsigned)i) < 0)
- goto out;
- if(H5DSis_attached(did,dsid,(unsigned)i)<=0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
- }
-
- if(H5Dclose(did) < 0)
- goto out;
-
- PASSED();
-
-
-/*-------------------------------------------------------------------------
- * detach
- *-------------------------------------------------------------------------
- */
-
- TESTING2("detach");
-
- if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
- goto out;
-
- for(i=0; i<3; i++)
- {
- sprintf(name,"ds_a_%d",i);
- if((dsid = H5Dopen2(fid,name, H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSdetach_scale(did,dsid,(unsigned)i) < 0)
- goto out;
- if(H5DSis_attached(did,dsid,(unsigned)i)!=0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
- }
- if(H5Dclose(did) < 0)
- goto out;
-
- PASSED();
-
-/*-------------------------------------------------------------------------
- * attach, set, get names, labels
- *-------------------------------------------------------------------------
- */
-
- TESTING2("attach, set, get names, labels");
-
- if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
- goto out;
-
- for(i=0; i<3; i++)
- {
- sprintf(name,"ds_a_%d",i);
- if((dsid = H5Dopen2(fid,name, H5P_DEFAULT)) < 0)
- goto out;
- if(H5DSset_scale(dsid,name) < 0)
- goto out;
- if(H5DSattach_scale(did,dsid,(unsigned)i) < 0)
- goto out;
- if(H5DSis_attached(did,dsid,(unsigned)i)<=0)
- goto out;
- if(H5DSget_scale_name(dsid,names,sizeof(names)) < 0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
- if(H5DSset_label(did,(unsigned)i,name) < 0)
- goto out;
- if(H5DSget_label(did,(unsigned)i,namel,sizeof(namel)) < 0)
- goto out;
- if(strcmp(name,names)!=0)
- goto out;
- if(strcmp(name,namel)!=0)
- goto out;
- }
-
- if(H5Dclose(did) < 0)
- goto out;
-
- PASSED();
-
-/*-------------------------------------------------------------------------
- * attach a scalar scale
- *-------------------------------------------------------------------------
- */
-
- TESTING2("attach a scalar scale");
-
- /* create the data space for the dataset */
- if((sid = H5Screate_simple(2, dimss, NULL)) < 0)
- goto out;
- /* create a dataset of rank 2 */
- if((did = H5Dcreate2(fid, "dset_b", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
- /* create a scalar space */
- if((sidds = H5Screate(H5S_SCALAR)) < 0)
- goto out;
- /* create a dataset of scalar rank for the scale */
- if((dsid = H5Dcreate2(fid, "ds_b_1", H5T_NATIVE_FLOAT, sidds, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- goto out;
- /* write */
- if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, bufi) < 0)
- goto out;
- if(H5Dwrite(dsid, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buff) < 0)
- goto out;
- /* attach */
- if(H5DSattach_scale(did, dsid, 0) < 0)
- goto out;
- if(H5DSattach_scale(did, dsid, 1) < 0)
- goto out;
- /* close */
- if(H5Sclose(sid) < 0)
- goto out;
- if(H5Sclose(sidds) < 0)
- goto out;
- if(H5Dclose(did) < 0)
- goto out;
- if(H5Dclose(dsid) < 0)
- goto out;
-
- PASSED();
-
-/*-------------------------------------------------------------------------
- * close
- *-------------------------------------------------------------------------
- */
- if(H5Fclose(fid) < 0)
- goto out;
-
- return 0;
-
- /* error zone, gracefully close */
+ hid_t fid; /* file ID */
+ hid_t did = -1; /* dataset ID */
+ hid_t dsid = -1; /* scale ID */
+ hid_t sid = -1; /* space ID */
+ hid_t sidds = -1; /* space ID */
+ hsize_t dims1[1] = {DIM1_SIZE}; /* size of data dataset */
+ hsize_t dims2[2] = {DIM1_SIZE,DIM2_SIZE}; /* size of data dataset */
+ hsize_t dims3[3] = {DIM1_SIZE,DIM2_SIZE,DIM3_SIZE}; /* size of data dataset */
+ hsize_t dimss[2] = {1,1}; /* size of data dataset */
+ char name[30]; /* dataset name buffer */
+ char names[30]; /* dataset scale name buffer */
+ char namel[30]; /* dataset label name buffer */
+ int bufi[1]={2};
+ float buff[1]={1};
+ int i;
+
+ printf("Testing ranks\n");
+
+ /*-------------------------------------------------------------------------
+ * create a file, a dataset, scales
+ *-------------------------------------------------------------------------
+ */
+
+ /* create a file using default properties */
+ if((fid=H5Fcreate(FILE4,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* make a dataset a 3D data dataset */
+ if(H5LTmake_dataset_int(fid,"dset_a",3,dims3,NULL) < 0)
+ goto out;
+
+ /* make a 1D scale dataset */
+ if(H5LTmake_dataset_int(fid,"ds_a_0",1,dims1,NULL) < 0)
+ goto out;
+
+ /* make a 2D scale dataset */
+ if(H5LTmake_dataset_int(fid,"ds_a_1",2,dims2,NULL) < 0)
+ goto out;
+
+ /* make a 3D scale dataset */
+ if(H5LTmake_dataset_int(fid,"ds_a_2",3,dims3,NULL) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * attach
+ *-------------------------------------------------------------------------
+ */
+
+ TESTING2("attach");
+
+ if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
+ goto out;
+
+ for(i=0; i<3; i++)
+ {
+ sprintf(name,"ds_a_%d",i);
+ if((dsid = H5Dopen2(fid,name, H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSattach_scale(did,dsid,(unsigned)i) < 0)
+ goto out;
+ if(H5DSis_attached(did,dsid,(unsigned)i)<=0)
+ goto out;
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ }
+
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ PASSED();
+
+
+ /*-------------------------------------------------------------------------
+ * detach
+ *-------------------------------------------------------------------------
+ */
+
+ TESTING2("detach");
+
+ if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
+ goto out;
+
+ for(i=0; i<3; i++)
+ {
+ sprintf(name,"ds_a_%d",i);
+ if((dsid = H5Dopen2(fid,name, H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSdetach_scale(did,dsid,(unsigned)i) < 0)
+ goto out;
+ if(H5DSis_attached(did,dsid,(unsigned)i)!=0)
+ goto out;
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ }
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ PASSED();
+
+ /*-------------------------------------------------------------------------
+ * attach, set, get names, labels
+ *-------------------------------------------------------------------------
+ */
+
+ TESTING2("attach, set, get names, labels");
+
+ if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
+ goto out;
+
+ for(i=0; i<3; i++)
+ {
+ sprintf(name,"ds_a_%d",i);
+ if((dsid = H5Dopen2(fid,name, H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5DSset_scale(dsid,name) < 0)
+ goto out;
+ if(H5DSattach_scale(did,dsid,(unsigned)i) < 0)
+ goto out;
+ if(H5DSis_attached(did,dsid,(unsigned)i)<=0)
+ goto out;
+ if(H5DSget_scale_name(dsid,names,sizeof(names)) < 0)
+ goto out;
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ if(H5DSset_label(did,(unsigned)i,name) < 0)
+ goto out;
+ if(H5DSget_label(did,(unsigned)i,namel,sizeof(namel)) < 0)
+ goto out;
+ if(strcmp(name,names)!=0)
+ goto out;
+ if(strcmp(name,namel)!=0)
+ goto out;
+ }
+
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ PASSED();
+
+ /*-------------------------------------------------------------------------
+ * attach a scalar scale
+ *-------------------------------------------------------------------------
+ */
+
+ TESTING2("attach a scalar scale");
+
+ /* create the data space for the dataset */
+ if((sid = H5Screate_simple(2, dimss, NULL)) < 0)
+ goto out;
+ /* create a dataset of rank 2 */
+ if((did = H5Dcreate2(fid, "dset_b", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+ /* create a scalar space */
+ if((sidds = H5Screate(H5S_SCALAR)) < 0)
+ goto out;
+ /* create a dataset of scalar rank for the scale */
+ if((dsid = H5Dcreate2(fid, "ds_b_1", H5T_NATIVE_FLOAT, sidds, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto out;
+ /* write */
+ if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, bufi) < 0)
+ goto out;
+ if(H5Dwrite(dsid, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buff) < 0)
+ goto out;
+ /* attach */
+ if(H5DSattach_scale(did, dsid, 0) < 0)
+ goto out;
+ if(H5DSattach_scale(did, dsid, 1) < 0)
+ goto out;
+ /* close */
+ if(H5Sclose(sid) < 0)
+ goto out;
+ if(H5Sclose(sidds) < 0)
+ goto out;
+ if(H5Dclose(did) < 0)
+ goto out;
+ if(H5Dclose(dsid) < 0)
+ goto out;
+
+ PASSED();
+
+ /*-------------------------------------------------------------------------
+ * close
+ *-------------------------------------------------------------------------
+ */
+ if(H5Fclose(fid) < 0)
+ goto out;
+
+ return 0;
+
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Dclose(did);
- H5Dclose(dsid);
- H5Fclose(fid);
- } H5E_END_TRY;
- H5_FAILED();
- return FAIL;
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did);
+ H5Dclose(dsid);
+ H5Sclose(sidds);
+ H5Sclose(sid);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+ H5_FAILED();
+ return FAIL;
}
@@ -2478,173 +4494,174 @@ out:
static int test_types(void)
{
- hid_t fid; /* file ID */
- hid_t did = -1; /* dataset ID */
- hid_t dsid = -1; /* DS dataset ID */
- int rank = RANK; /* rank of data dataset */
- int rankds = 1; /* rank of DS dataset */
- hsize_t dims[RANK] = {DIM1_SIZE,DIM2_SIZE}; /* size of data dataset */
- int buf[DIM_DATA] = {1,2,3,4,5,6,7,8,9,10,11,12}; /* data of data dataset */
- hsize_t s1_dim[1] = {DIM1_SIZE}; /* size of DS 1 dataset */
- hsize_t s2_dim[1] = {DIM2_SIZE}; /* size of DS 2 dataset */
- float s1_float[DIM1_SIZE] = {10,20,30}; /* data of DS 1 dataset */
- unsigned short s2_ushort[DIM2_SIZE] = {10,20,30,40}; /* data of DS 2 dataset */
- const char *s1_str = "ABC";
- const char *s2_str = "ABCD";
-
- printf("Testing scales with several datatypes\n");
-
-/*-------------------------------------------------------------------------
- * create a file for the test
- *-------------------------------------------------------------------------
- */
- /* create a file using default properties */
- if((fid=H5Fcreate(FILE5,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * create datasets: 1 "data" dataset and 2 dimension scales
- *-------------------------------------------------------------------------
- */
-
- /* make a dataset */
- if(H5LTmake_dataset_int(fid,"dset_a",rank,dims,buf) < 0)
- goto out;
-
- /* make a DS dataset for the first dimension */
- if(H5LTmake_dataset_float(fid,DS_1_NAME,rankds,s1_dim,s1_float) < 0)
- goto out;
-
- /* make a DS dataset for the second dimension */
- if(H5LTmake_dataset(fid,DS_2_NAME,rankds,s2_dim,H5T_NATIVE_USHORT,s2_ushort) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * floating point and short scales
- *-------------------------------------------------------------------------
- */
-
- TESTING2("floating point and short scales");
-
- /* get the dataset id for "dset_a" */
- if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
- goto out;
-
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,DS_1_NAME, H5P_DEFAULT)) < 0)
- goto out;
- /* attach the DS_1_NAME dimension scale to "dset_a" at dimension 0 */
- if(H5DSattach_scale(did,dsid,DIM0) < 0)
- goto out;
- /* set name */
- if(H5DSset_scale(dsid,SCALE_1_NAME) < 0)
- goto out;
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,DS_2_NAME, H5P_DEFAULT)) < 0)
- goto out;
- /* attach the DS_2_NAME dimension scale to "dset_a" at dimension 1 */
- if(H5DSattach_scale(did,dsid,DIM1) < 0)
- goto out;
- /* set name */
- if(H5DSset_scale(dsid,SCALE_2_NAME) < 0)
- goto out;
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
- /* set a label */
- if(H5DSset_label(did,DIM0,DIM0_LABEL) < 0)
- goto out;
- if(H5DSset_label(did,DIM1,DIM1_LABEL) < 0)
- goto out;
- /* close */
- if(H5Dclose(did) < 0)
- goto out;
-
- PASSED();
-
-/*-------------------------------------------------------------------------
- * create datasets: 1 "data" dataset and 2 dimension scales
- *-------------------------------------------------------------------------
- */
-
- /* make a dataset */
- if(H5LTmake_dataset_int(fid,"dset_b",rank,dims,buf) < 0)
- goto out;
-
- /* make a DS dataset for the first dimension */
- if(H5LTmake_dataset_string(fid,"ds_b_1",s1_str) < 0)
- goto out;
-
- /* make a DS dataset for the second dimension */
- if(H5LTmake_dataset_string(fid,"ds_b_2",s2_str) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * floating point and short scales
- *-------------------------------------------------------------------------
- */
-
- TESTING2("string scales");
-
- /* get the dataset id for "dset_b" */
- if((did = H5Dopen2(fid,"dset_b", H5P_DEFAULT)) < 0)
- goto out;
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,"ds_b_1", H5P_DEFAULT)) < 0)
- goto out;
- /* attach the DS_1_NAME dimension scale to "dset_b" at dimension 0 */
- if(H5DSattach_scale(did,dsid,DIM0) < 0)
- goto out;
- /* set name */
- if(H5DSset_scale(dsid,SCALE_1_NAME) < 0)
- goto out;
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,"ds_b_2", H5P_DEFAULT)) < 0)
- goto out;
- /* attach the DS_2_NAME dimension scale to "dset_b" at dimension 1 */
- if(H5DSattach_scale(did,dsid,DIM1) < 0)
- goto out;
- /* set name */
- if(H5DSset_scale(dsid,SCALE_2_NAME) < 0)
- goto out;
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
- /* set a label */
- if(H5DSset_label(did,DIM0,DIM0_LABEL) < 0)
- goto out;
- if(H5DSset_label(did,DIM1,DIM1_LABEL) < 0)
- goto out;
- /* close */
- if(H5Dclose(did) < 0)
- goto out;
-
- PASSED();
-
-/*-------------------------------------------------------------------------
- * close
- *-------------------------------------------------------------------------
- */
- if(H5Fclose(fid) < 0)
- goto out;
-
- return 0;
-
- /* error zone, gracefully close */
+ hid_t fid; /* file ID */
+ hid_t did = -1; /* dataset ID */
+ hid_t dsid = -1; /* DS dataset ID */
+ int rank = RANK; /* rank of data dataset */
+ int rankds = 1; /* rank of DS dataset */
+ hsize_t dims[RANK] = {DIM1_SIZE,DIM2_SIZE}; /* size of data dataset */
+ int buf[DIM_DATA] = {1,2,3,4,5,6,7,8,9,10,11,12}; /* data of data dataset */
+ hsize_t s1_dim[1] = {DIM1_SIZE}; /* size of DS 1 dataset */
+ hsize_t s2_dim[1] = {DIM2_SIZE}; /* size of DS 2 dataset */
+ float s1_float[DIM1_SIZE] = {10,20,30}; /* data of DS 1 dataset */
+ unsigned short s2_ushort[DIM2_SIZE] = {10,20,30,40}; /* data of DS 2 dataset */
+ const char *s1_str = "ABC";
+ const char *s2_str = "ABCD";
+
+ printf("Testing scales with several datatypes\n");
+
+ /*-------------------------------------------------------------------------
+ * create a file for the test
+ *-------------------------------------------------------------------------
+ */
+ /* create a file using default properties */
+ if((fid=H5Fcreate(FILE5,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * create datasets: 1 "data" dataset and 2 dimension scales
+ *-------------------------------------------------------------------------
+ */
+
+ /* make a dataset */
+ if(H5LTmake_dataset_int(fid,"dset_a",rank,dims,buf) < 0)
+ goto out;
+
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_float(fid,DS_1_NAME,rankds,s1_dim,s1_float) < 0)
+ goto out;
+
+ /* make a DS dataset for the second dimension */
+ if(H5LTmake_dataset(fid,DS_2_NAME,rankds,s2_dim,H5T_NATIVE_USHORT,s2_ushort) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * floating point and short scales
+ *-------------------------------------------------------------------------
+ */
+
+ TESTING2("floating point and short scales");
+
+ /* get the dataset id for "dset_a" */
+ if((did = H5Dopen2(fid,"dset_a", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,DS_1_NAME, H5P_DEFAULT)) < 0)
+ goto out;
+ /* attach the DS_1_NAME dimension scale to "dset_a" at dimension 0 */
+ if(H5DSattach_scale(did,dsid,DIM0) < 0)
+ goto out;
+ /* set name */
+ if(H5DSset_scale(dsid,SCALE_1_NAME) < 0)
+ goto out;
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,DS_2_NAME, H5P_DEFAULT)) < 0)
+ goto out;
+ /* attach the DS_2_NAME dimension scale to "dset_a" at dimension 1 */
+ if(H5DSattach_scale(did,dsid,DIM1) < 0)
+ goto out;
+ /* set name */
+ if(H5DSset_scale(dsid,SCALE_2_NAME) < 0)
+ goto out;
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ /* set a label */
+ if(H5DSset_label(did,DIM0,DIM0_LABEL) < 0)
+ goto out;
+ if(H5DSset_label(did,DIM1,DIM1_LABEL) < 0)
+ goto out;
+ /* close */
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ PASSED();
+
+ /*-------------------------------------------------------------------------
+ * create datasets: 1 "data" dataset and 2 dimension scales
+ *-------------------------------------------------------------------------
+ */
+
+ /* make a dataset */
+ if(H5LTmake_dataset_int(fid,"dset_b",rank,dims,buf) < 0)
+ goto out;
+
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_string(fid,"ds_b_1",s1_str) < 0)
+ goto out;
+
+ /* make a DS dataset for the second dimension */
+ if(H5LTmake_dataset_string(fid,"ds_b_2",s2_str) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * floating point and short scales
+ *-------------------------------------------------------------------------
+ */
+
+ TESTING2("string scales");
+
+ /* get the dataset id for "dset_b" */
+ if((did = H5Dopen2(fid,"dset_b", H5P_DEFAULT)) < 0)
+ goto out;
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,"ds_b_1", H5P_DEFAULT)) < 0)
+ goto out;
+ /* attach the DS_1_NAME dimension scale to "dset_b" at dimension 0 */
+ if(H5DSattach_scale(did,dsid,DIM0) < 0)
+ goto out;
+ /* set name */
+ if(H5DSset_scale(dsid,SCALE_1_NAME) < 0)
+ goto out;
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,"ds_b_2", H5P_DEFAULT)) < 0)
+ goto out;
+ /* attach the DS_2_NAME dimension scale to "dset_b" at dimension 1 */
+ if(H5DSattach_scale(did,dsid,DIM1) < 0)
+ goto out;
+ /* set name */
+ if(H5DSset_scale(dsid,SCALE_2_NAME) < 0)
+ goto out;
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ /* set a label */
+ if(H5DSset_label(did,DIM0,DIM0_LABEL) < 0)
+ goto out;
+ if(H5DSset_label(did,DIM1,DIM1_LABEL) < 0)
+ goto out;
+ /* close */
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ PASSED();
+
+ /*-------------------------------------------------------------------------
+ * close
+ *-------------------------------------------------------------------------
+ */
+ if(H5Fclose(fid) < 0)
+ goto out;
+
+ return 0;
+
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Dclose(did);
- H5Dclose(dsid);
- H5Fclose(fid);
- } H5E_END_TRY;
- H5_FAILED();
- return FAIL;
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did);
+ H5Dclose(dsid);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+ H5_FAILED();
+ return FAIL;
}
/*-------------------------------------------------------------------------
@@ -2654,149 +4671,163 @@ out:
static int test_data(void)
{
- hid_t fid; /* file ID */
- hid_t did = -1; /* dataset ID */
- hid_t dsid = -1; /* DS dataset ID */
- hid_t dcpl; /* dataset creation property list */
- hid_t sid; /* dataspace ID */
- float *vals=NULL; /* array to hold data values */
- float *latbuf=NULL; /* array to hold the latitude values */
- float *lonbuf=NULL; /* array to hold the longitude values */
- hsize_t dims[2]; /* array to hold dimensions */
- hsize_t latdims[1]; /* array to hold dimensions */
- hsize_t londims[1]; /* array to hold dimensions */
- float fill=-99; /* fill value */
-
-
- printf("Testing reading ASCII data and generate HDF5 data with scales\n");
-
-/*-------------------------------------------------------------------------
- * create a file for the test
- *-------------------------------------------------------------------------
- */
- /* create a file using default properties */
- if((fid=H5Fcreate(FILE6,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * read data
- *-------------------------------------------------------------------------
- */
-
- /* read ASCII bathymetry data */
- if(read_data("dsdata.txt",2,dims,&vals) < 0)
- goto out;
-
- /* read the latitude */
- if(read_data("dslat.txt",1,latdims,&latbuf) < 0)
- goto out;
-
- /* read the longitude */
- if(read_data("dslon.txt",1,londims,&lonbuf) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * generating scales
- *-------------------------------------------------------------------------
- */
-
- TESTING2("generating scales");
-
-/*-------------------------------------------------------------------------
- * create datasets: 1 "data" dataset and 2 dimension scales
- *-------------------------------------------------------------------------
- */
-
- /* make a DS dataset for the first dimension */
- if(H5LTmake_dataset_float(fid, "lat", 1, latdims, latbuf) < 0)
- goto out;
-
- /* make a DS dataset for the second dimension */
- if(H5LTmake_dataset_float(fid, "lon", 1, londims, lonbuf) < 0)
- goto out;
-
- /* make a dataset for the data. a fill value is set */
- if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
- goto out;
- if(H5Pset_fill_value(dcpl, H5T_NATIVE_FLOAT, &fill) < 0)
- goto out;
- if((sid = H5Screate_simple(2, dims, NULL)) < 0)
- goto out;
- if((did = H5Dcreate2(fid, "data", H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
- goto out;
- if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, vals) < 0)
- goto out;
- if(H5Dclose(did) < 0)
- goto out;
- if(H5Pclose(dcpl) < 0)
- goto out;
- if(H5Sclose(sid) < 0)
- goto out;
-
-/*-------------------------------------------------------------------------
- * attach
- *-------------------------------------------------------------------------
- */
-
- /* get the dataset id for "data" */
- if((did = H5Dopen2(fid,"data", H5P_DEFAULT)) < 0)
- goto out;
-
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,"lat", H5P_DEFAULT)) < 0)
- goto out;
- /* attach the DS_1_NAME dimension scale to "data" at dimension 0 */
- if(H5DSattach_scale(did,dsid,DIM0) < 0)
- goto out;
- /* set name */
- if(H5DSset_scale(dsid,SCALE_1_NAME) < 0)
- goto out;
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
- /* get the DS dataset id */
- if((dsid = H5Dopen2(fid,"lon", H5P_DEFAULT)) < 0)
- goto out;
- /* attach the DS_2_NAME dimension scale to "data" at dimension 1 */
- if(H5DSattach_scale(did,dsid,DIM1) < 0)
- goto out;
- /* set name */
- if(H5DSset_scale(dsid,SCALE_2_NAME) < 0)
- goto out;
- /* close DS id */
- if(H5Dclose(dsid) < 0)
- goto out;
- /* set a label */
- if(H5DSset_label(did,DIM0,DIM0_LABEL) < 0)
- goto out;
- if(H5DSset_label(did,DIM1,DIM1_LABEL) < 0)
- goto out;
- /* close */
- if(H5Dclose(did) < 0)
- goto out;
-
- PASSED();
-
-
-
-/*-------------------------------------------------------------------------
- * close
- *-------------------------------------------------------------------------
- */
- if(H5Fclose(fid) < 0)
- goto out;
-
- return 0;
-
- /* error zone, gracefully close */
+ hid_t fid; /* file ID */
+ hid_t did = -1; /* dataset ID */
+ hid_t dsid = -1; /* DS dataset ID */
+ hid_t dcpl; /* dataset creation property list */
+ hid_t sid; /* dataspace ID */
+ float *vals=NULL; /* array to hold data values */
+ float *latbuf=NULL; /* array to hold the latitude values */
+ float *lonbuf=NULL; /* array to hold the longitude values */
+ hsize_t dims[2]; /* array to hold dimensions */
+ hsize_t latdims[1]; /* array to hold dimensions */
+ hsize_t londims[1]; /* array to hold dimensions */
+ float fill=-99; /* fill value */
+
+
+ printf("Testing reading ASCII data and generate HDF5 data with scales\n");
+
+ /*-------------------------------------------------------------------------
+ * create a file for the test
+ *-------------------------------------------------------------------------
+ */
+ /* create a file using default properties */
+ if((fid=H5Fcreate(FILE6,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * generating scales
+ *-------------------------------------------------------------------------
+ */
+
+ TESTING2("generating scales");
+
+ /*-------------------------------------------------------------------------
+ * create datasets: 1 "data" dataset and 2 dimension scales
+ *-------------------------------------------------------------------------
+ */
+
+ /* read the latitude */
+ if(read_data("dslat.txt",1,latdims,&latbuf) < 0)
+ goto out;
+
+ /* make a DS dataset for the first dimension */
+ if(H5LTmake_dataset_float(fid, "lat", 1, latdims, latbuf) < 0)
+ goto out;
+
+ free( latbuf );
+ latbuf = NULL;
+
+ /* read the longitude */
+ if(read_data("dslon.txt",1,londims,&lonbuf) < 0)
+ goto out;
+
+ /* make a DS dataset for the second dimension */
+ if(H5LTmake_dataset_float(fid, "lon", 1, londims, lonbuf) < 0)
+ goto out;
+
+ free( lonbuf );
+ lonbuf = NULL;
+
+ /* make a dataset for the data. a fill value is set */
+ if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+ goto out;
+ if(H5Pset_fill_value(dcpl, H5T_NATIVE_FLOAT, &fill) < 0)
+ goto out;
+
+ /* read ASCII bathymetry data and dimensions to create dataset */
+ if(read_data("dsdata.txt",2,dims,&vals) < 0)
+ goto out;
+
+ if((sid = H5Screate_simple(2, dims, NULL)) < 0)
+ goto out;
+ if((did = H5Dcreate2(fid, "data", H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+ goto out;
+ if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, vals) < 0)
+ goto out;
+
+ free ( vals );
+ vals = NULL;
+
+ if(H5Dclose(did) < 0)
+ goto out;
+ if(H5Pclose(dcpl) < 0)
+ goto out;
+ if(H5Sclose(sid) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * attach
+ *-------------------------------------------------------------------------
+ */
+
+ /* get the dataset id for "data" */
+ if((did = H5Dopen2(fid,"data", H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,"lat", H5P_DEFAULT)) < 0)
+ goto out;
+ /* attach the DS_1_NAME dimension scale to "data" at dimension 0 */
+ if(H5DSattach_scale(did,dsid,DIM0) < 0)
+ goto out;
+ /* set name */
+ if(H5DSset_scale(dsid,SCALE_1_NAME) < 0)
+ goto out;
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ /* get the DS dataset id */
+ if((dsid = H5Dopen2(fid,"lon", H5P_DEFAULT)) < 0)
+ goto out;
+ /* attach the DS_2_NAME dimension scale to "data" at dimension 1 */
+ if(H5DSattach_scale(did,dsid,DIM1) < 0)
+ goto out;
+ /* set name */
+ if(H5DSset_scale(dsid,SCALE_2_NAME) < 0)
+ goto out;
+ /* close DS id */
+ if(H5Dclose(dsid) < 0)
+ goto out;
+ /* set a label */
+ if(H5DSset_label(did,DIM0,DIM0_LABEL) < 0)
+ goto out;
+ if(H5DSset_label(did,DIM1,DIM1_LABEL) < 0)
+ goto out;
+ /* close */
+ if(H5Dclose(did) < 0)
+ goto out;
+
+ PASSED();
+
+
+
+ /*-------------------------------------------------------------------------
+ * close
+ *-------------------------------------------------------------------------
+ */
+ if(H5Fclose(fid) < 0)
+ goto out;
+
+ return 0;
+
+ /* error zone */
out:
- H5E_BEGIN_TRY {
- H5Dclose(did);
- H5Dclose(dsid);
- H5Fclose(fid);
- } H5E_END_TRY;
- H5_FAILED();
- return FAIL;
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did);
+ H5Dclose(dsid);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+ H5_FAILED();
+
+ if (latbuf)
+ free( latbuf );
+ if (lonbuf)
+ free( lonbuf );
+ if (vals)
+ free( vals );
+ return FAIL;
}
@@ -2814,53 +4845,260 @@ out:
*-------------------------------------------------------------------------
*/
-static int read_data( const char* fname, int ndims, hsize_t *dims, float **buf )
+static int read_data( const char* fname,
+ int ndims,
+ hsize_t *dims,
+ float **buf )
{
- int i, n;
- unsigned j;
- char str[20];
- size_t nelms;
- FILE *f;
- float val;
- char *srcdir = getenv("srcdir"); /* the source directory */
- char data_file[512]; /* buffer to hold name of existing data file */
-
- strcpy(data_file, "");
- /* compose the name of the file to open, using the srcdir, if appropriate */
- if(srcdir)
- {
- strcpy(data_file, srcdir);
- strcat(data_file, "/");
- }
- /* read first data file */
- strcat(data_file,fname);
-
- f = fopen(data_file, "r");
- if( f == NULL )
- {
- printf( "Could not open file %s\n", data_file );
- return -1;
- }
-
- for(i=0, nelms=1; i < ndims; i++)
- {
- fscanf( f, "%s %u", str, &j);
- fscanf( f, "%d",&n );
- dims[i] = n;
- nelms *= n;
- }
-
- *buf = (float*) malloc (nelms * sizeof( float ));
-
- for(j = 0; j < nelms; j++)
- {
- fscanf( f, "%f",&val );
- (*buf)[j] = val;
- }
- fclose(f);
-
- return 1;
+ int i, n;
+ unsigned j;
+ char str[20];
+ size_t nelms;
+ FILE *f;
+ float val;
+ char *srcdir = getenv("srcdir"); /* the source directory */
+ char data_file[512]; /* buffer to hold name of existing data file */
+
+ strcpy(data_file, "");
+ /* compose the name of the file to open, using the srcdir, if appropriate */
+ if(srcdir)
+ {
+ strcpy(data_file, srcdir);
+ strcat(data_file, "/");
+ }
+ /* read first data file */
+ strcat(data_file,fname);
+
+ f = fopen(data_file, "r");
+ if( f == NULL )
+ {
+ printf( "Could not open file %s\n", data_file );
+ return -1;
+ }
+
+ for(i=0, nelms=1; i < ndims; i++)
+ {
+ fscanf( f, "%s %u", str, &j);
+ fscanf( f, "%d",&n );
+ dims[i] = n;
+ nelms *= n;
+ }
+
+ *buf = (float*) malloc (nelms * sizeof( float ));
+
+ if ( *buf == NULL )
+ {
+ printf( "memory allocation failed\n" );
+ fclose(f);
+ return -1;
+ }
+
+ for(j = 0; j < nelms; j++)
+ {
+ fscanf( f, "%f",&val );
+ (*buf)[j] = val;
+ }
+ fclose(f);
+
+ return 1;
}
+/*-------------------------------------------------------------------------
+ * test parameter errors
+ *-------------------------------------------------------------------------
+ */
+
+static int test_errors2(void)
+{
+ hid_t fid; /* file ID */
+ hid_t did = -1; /* dataset ID */
+ hid_t dsid = -1; /* scale ID */
+ hsize_t dimd[2] = {3,3}; /* size of data dataset */
+ hsize_t dims[1] = {3}; /* size of scale dataset */
+ char lbuf[255]; /* label buffer */
+ ssize_t label_len; /* label lenght */
+ int scale_idx; /* scale index */
+ int nscales; /* number of scales in DIM */
+ int count; /* visitor data */
+
+ printf("Testing parameter errors\n");
+
+ /*-------------------------------------------------------------------------
+ * create a file, a dataset, scales
+ *-------------------------------------------------------------------------
+ */
+
+ /* create a file using default properties */
+ if ((fid=H5Fcreate(FILE7,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT)) < 0)
+ goto out;
+
+ /* make a dataset */
+ if (H5LTmake_dataset_int(fid,"dset",2,dimd,NULL) < 0)
+ goto out;
+
+ /* make a scale dataset */
+ if(H5LTmake_dataset_int(fid,"ds1",1,dims,NULL) < 0)
+ goto out;
+
+ /* make a scale dataset */
+ if(H5LTmake_dataset_int(fid,"ds2",1,dims,NULL) < 0)
+ goto out;
+
+
+ TESTING2("attach scales");
+
+
+ /*-------------------------------------------------------------------------
+ * attach with invalid indices
+ *-------------------------------------------------------------------------
+ */
+
+ if ((did = H5Dopen2(fid,"dset", H5P_DEFAULT)) < 0)
+ goto out;
+ if ((dsid = H5Dopen2(fid,"ds1", H5P_DEFAULT)) < 0)
+ goto out;
+ if (H5DSattach_scale(did,dsid,2) == SUCCEED)
+ goto out;
+ if (H5DSattach_scale(did,dsid,0) < 0)
+ goto out;
+ if (H5Dclose(dsid) < 0)
+ goto out;
+ if (H5Dclose(did) < 0)
+ goto out;
+
+ PASSED();
+
+ TESTING2("detach scales");
+
+ /*-------------------------------------------------------------------------
+ * detach with invalid indices
+ *-------------------------------------------------------------------------
+ */
+ if ((did = H5Dopen2(fid,"dset", H5P_DEFAULT)) < 0)
+ goto out;
+ if ((dsid = H5Dopen2(fid,"ds1", H5P_DEFAULT)) < 0)
+ goto out;
+ if (H5DSdetach_scale(did,dsid,2) == SUCCEED)
+ goto out;
+ if (H5DSdetach_scale(did,dsid,0) < 0)
+ goto out;
+ if (H5Dclose(dsid) < 0)
+ goto out;
+ if (H5Dclose(did) < 0)
+ goto out;
+
+ PASSED();
+
+ TESTING2("set/get label");
+
+ /*-------------------------------------------------------------------------
+ * set/get label invalid indices
+ *-------------------------------------------------------------------------
+ */
+ if ((did = H5Dopen2(fid,"dset", H5P_DEFAULT)) < 0)
+ goto out;
+ if (H5DSset_label(did,2,"label")== SUCCEED)
+ goto out;
+ if (H5DSset_label(did,0,"label") < 0)
+ goto out;
+ if (H5DSget_label(did,2,lbuf,sizeof(lbuf)) == SUCCEED)
+ goto out;
+ if ((label_len=H5DSget_label(did,0,NULL,0)) < 0)
+ goto out;
+ if ( label_len != strlen("label") )
+ goto out;
+ if (H5DSget_label(did,0,lbuf,sizeof(lbuf)) < 0)
+ goto out;
+ if (H5Dclose(did) < 0)
+ goto out;
+
+ PASSED();
+
+ TESTING2("iterate scales");
+
+
+ /*-------------------------------------------------------------------------
+ * iterate_scales invalid indices and return DS_IDX and visitor data
+ *-------------------------------------------------------------------------
+ */
+ if ((did = H5Dopen2(fid,"dset", H5P_DEFAULT)) < 0)
+ goto out;
+
+ if ((dsid = H5Dopen2(fid,"ds1", H5P_DEFAULT)) < 0)
+ goto out;
+ if (H5DSattach_scale(did,dsid,0) < 0)
+ goto out;
+ if (H5Dclose(dsid) < 0)
+ goto out;
+
+ if ((dsid = H5Dopen2(fid,"ds2", H5P_DEFAULT)) < 0)
+ goto out;
+ if (H5DSattach_scale(did,dsid,0) < 0)
+ goto out;
+ if (H5Dclose(dsid) < 0)
+ goto out;
+
+ if((nscales = H5DSget_num_scales(did,0)) < 0)
+ goto out;
+ if(nscales!=2)
+ goto out;
+
+ /* invalid DIM */
+ if (H5DSiterate_scales(did,2,NULL,op_continue,NULL)== SUCCEED)
+ goto out;
+ /* invalid DS_IDX */
+ scale_idx = 2;
+ if (H5DSiterate_scales(did,0,&scale_idx,op_continue,NULL)== SUCCEED)
+ goto out;
+
+ /* continue iteration */
+ scale_idx = 0;
+ count = 0;
+ if (H5DSiterate_scales(did,0,&scale_idx,op_continue,(void *)&count) < 0)
+ goto out;
+
+ if ( scale_idx != 1 && count != nscales )
+ {
+ goto out;
+ }
+
+ /* stop iteration */
+ scale_idx = 0;
+ count = 0;
+ if (H5DSiterate_scales(did,0,&scale_idx,op_stop,(void *)&count) < 0)
+ goto out;
+
+ if ( scale_idx != 0 && count != 1 )
+ {
+ goto out;
+ }
+
+
+ if (H5Dclose(did) < 0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * close
+ *-------------------------------------------------------------------------
+ */
+ if(H5Fclose(fid) < 0)
+ goto out;
+
+ PASSED();
+
+ return 0;
+
+ /* error zone */
+out:
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did);
+ H5Dclose(dsid);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+ H5_FAILED();
+ return FAIL;
+}
+
diff --git a/hl/test/test_ds_be.h5 b/hl/test/test_ds_be.h5
new file mode 100644
index 0000000..3da54f9
--- /dev/null
+++ b/hl/test/test_ds_be.h5
Binary files differ
diff --git a/hl/test/test_ds_le.h5 b/hl/test/test_ds_le.h5
new file mode 100644
index 0000000..1fcbe99
--- /dev/null
+++ b/hl/test/test_ds_le.h5
Binary files differ
diff --git a/hl/test/test_image.c b/hl/test/test_image.c
index 9645bad..426ae1d 100644
--- a/hl/test/test_image.c
+++ b/hl/test/test_image.c
@@ -1,17 +1,17 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
- * terms governing use, modification, and redistribution, is contained in *
- * the files COPYING and Copyright.html. COPYING can be found at the root *
- * of the source code distribution tree; Copyright.html can be found at the *
- * root level of an installed copy of the electronic HDF5 document set and *
- * is linked from the top-level documents page. It can also be found at *
- * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+* Copyright by The HDF Group. *
+* Copyright by the Board of Trustees of the University of Illinois. *
+* All rights reserved. *
+* *
+* This file is part of HDF5. The full HDF5 copyright notice, including *
+* terms governing use, modification, and redistribution, is contained in *
+* the files COPYING and Copyright.html. COPYING can be found at the root *
+* of the source code distribution tree; Copyright.html can be found at the *
+* root level of an installed copy of the electronic HDF5 document set and *
+* is linked from the top-level documents page. It can also be found at *
+* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
+* access to either file, you may request a copy from help@hdfgroup.org. *
+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <stdlib.h>
#include <string.h>
@@ -61,31 +61,31 @@ static int read_palette(const char* file_name, rgb_t *palette, size_t palette_si
unsigned char *image_data = NULL;
/*-------------------------------------------------------------------------
- * the main program
- *-------------------------------------------------------------------------
- */
+* the main program
+*-------------------------------------------------------------------------
+*/
int main(void)
{
int nerrors=0;
-
+
nerrors += test_simple()<0 ?1:0;
nerrors += test_data()<0 ?1:0;
nerrors += test_generate()<0 ?1:0;
-
+
if (nerrors) goto error;
printf("All image tests passed.\n");
return 0;
-
+
error:
printf("***** %d IMAGE TEST%s FAILED! *****\n",nerrors, 1 == nerrors ? "" : "S");
return 1;
}
/*-------------------------------------------------------------------------
- * a simple test that generates images and palettes
- *-------------------------------------------------------------------------
- */
+* a simple test that generates images and palettes
+*-------------------------------------------------------------------------
+*/
static int test_simple(void)
{
@@ -94,23 +94,24 @@ static int test_simple(void)
hsize_t planes;
hid_t fid;
int i, j, n, space;
+ hsize_t u;
char interlace[20];
hssize_t npals;
-
+
/* 8-bit image */
unsigned char buf1 [ WIDTH*HEIGHT ];
unsigned char pal[ PAL_ENTRIES * 3 ]; /* palette array */
hsize_t pal_dims[2] = {PAL_ENTRIES,3}; /* palette dimensions */
-
+
/* 24-bit image */
unsigned char buf2 [ WIDTH*HEIGHT*3 ];
-
+
/* read data */
unsigned char buf1_out [ WIDTH*HEIGHT ];
unsigned char buf2_out [ WIDTH*HEIGHT*3 ];
unsigned char pal_out[ PAL_ENTRIES * 3 ]; /* palette array */
hsize_t pal_dims_out[2]; /* palette dimensions */
-
+
/* create an image */
space = WIDTH*HEIGHT / PAL_ENTRIES;
for (i=0, j=0, n=0; i < WIDTH*HEIGHT; i++, j++ )
@@ -121,10 +122,10 @@ static int test_simple(void)
n++;
j=0;
}
-
+
}
-
-
+
+
/* create an image */
space = WIDTH*HEIGHT / 256;
for (i=0, j=0, n=0; i < WIDTH*HEIGHT*3; i+=3, j++ )
@@ -141,9 +142,9 @@ static int test_simple(void)
j=0;
}
}
-
- /*-------------------------------------------------------------------------
- * define a palette, blue to red tones
+
+ /*-------------------------------------------------------------------------
+ * define a palette, blue to red tones
*-------------------------------------------------------------------------
*/
for ( i=0, n=0; i<PAL_ENTRIES*3; i+=3, n++)
@@ -152,140 +153,140 @@ static int test_simple(void)
pal[i+1]=0; /* green */
pal[i+2]=255-n; /* blue */
}
-
+
/* Create a new HDF5 file using default properties. */
fid = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT );
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* Indexed image test
*-------------------------------------------------------------------------
*/
-
+
TESTING("indexed image");
-
+
/* Write image */
if ( H5IMmake_image_8bit( fid, IMAGE1_NAME, width, height, buf1 ) < 0 )
goto out;
-
+
/* Make a palette */
if ( H5IMmake_palette( fid, PAL_NAME, pal_dims, pal ) < 0 )
goto out;
-
+
/* Attach a palette to the image dataset */
if ( H5IMlink_palette( fid, IMAGE1_NAME, PAL_NAME ) < 0 )
goto out;
-
+
/* Read image */
if ( H5IMget_image_info( fid, IMAGE1_NAME, &width, &height, &planes, interlace, &npals ) < 0 )
goto out;
-
+
if ( H5IMread_image( fid, IMAGE1_NAME, buf1_out ) < 0 )
goto out;
-
- for (i = 0; i < height*width*planes; i++)
+
+ for (u = 0; u < height*width*planes; u++)
{
- if ( buf1[i] != buf1_out[i] )
+ if ( buf1[u] != buf1_out[u] )
goto out;
-
+
}
-
-
+
+
PASSED();
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* True color image test
*-------------------------------------------------------------------------
*/
-
+
TESTING("true color image");
-
+
/* Write image */
if ( H5IMmake_image_24bit( fid, IMAGE2_NAME, width, height, "INTERLACE_PIXEL", buf2 ) )
goto out;
-
+
/* Read image */
if ( H5IMget_image_info( fid, IMAGE2_NAME, &width, &height, &planes, interlace, &npals ) < 0 )
goto out;
-
+
if ( H5IMread_image( fid, IMAGE2_NAME, buf2_out ) < 0 )
goto out;
-
- for (i = 0; i < height*width*planes; i++)
+
+ for (u = 0; u < height*width*planes; u++)
{
- if ( buf2[i] != buf2_out[i] )
+ if ( buf2[u] != buf2_out[u] )
goto out;
}
-
-
+
+
PASSED();
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* H5IMget_npalettes test
*-------------------------------------------------------------------------
*/
-
+
TESTING("pallete functions");
-
+
if ( H5IMget_npalettes( fid, IMAGE1_NAME, &npals ) < 0 )
goto out;
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* H5IMget_palette_info test
*-------------------------------------------------------------------------
*/
-
+
if ( H5IMget_palette_info( fid, IMAGE1_NAME, 0, pal_dims_out ) < 0 )
goto out;
-
- for (i = 0; i < 2; i++)
+
+ for (i = 0; i < 2; i++)
{
- if ( pal_dims[i] != pal_dims_out[i] )
+ if ( pal_dims[i] != pal_dims_out[i] )
goto out;
}
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* H5IMget_palette test
*-------------------------------------------------------------------------
*/
-
+
if ( H5IMget_palette( fid, IMAGE1_NAME, 0, pal_out ) < 0 )
goto out;
-
- for (i = 0; i < PAL_ENTRIES * 3; i++)
+
+ for (i = 0; i < PAL_ENTRIES * 3; i++)
{
- if ( pal[i] != pal_out[i] )
+ if ( pal[i] != pal_out[i] )
goto out;
}
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* H5IMis_image test
*-------------------------------------------------------------------------
*/
-
+
if ( H5IMis_image( fid, IMAGE1_NAME ) < 0 )
goto out;
-
+
if ( H5IMis_image( fid, IMAGE2_NAME ) < 0 )
goto out;
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* H5IMis_palette test
*-------------------------------------------------------------------------
*/
-
+
if ( H5IMis_palette( fid, PAL_NAME ) < 0 )
goto out;
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* end tests
*-------------------------------------------------------------------------
*/
-
+
/* Close the file. */
- if(H5Fclose( fid ) < 0)
+ if(H5Fclose( fid ) < 0)
goto out;
-
-
+
+
PASSED();
return 0;
@@ -301,9 +302,9 @@ out:
/*-------------------------------------------------------------------------
- * read sample realistic image data from ASCII files
- *-------------------------------------------------------------------------
- */
+* read sample realistic image data from ASCII files
+*-------------------------------------------------------------------------
+*/
static int test_data(void)
{
@@ -314,60 +315,60 @@ static int test_data(void)
unsigned char pal[256*3]; /* buffer to hold an HDF5 palette */
rgb_t rgb[256]; /* buffer to hold a .pal file palette */
int i, n;
-
+
/* create a file using default properties */
if ((fid=H5Fcreate(FILE2,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT))<0)
goto out;
-
+
printf("Testing read ascii image data and generate images\n");
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* read 8bit image data
*-------------------------------------------------------------------------
*/
-
+
TESTING2("make indexed image");
-
+
/* read first data file */
if (read_data(DATA_FILE1,&width,&height)<0)
goto out;
-
+
/* make an image */
if (H5IMmake_image_8bit(fid,IMAGE1_NAME,width,height,image_data)<0)
goto out;
-
+
PASSED();
-
-
+
+
TESTING2("attaching palettes");
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* palette #1. rainbow palette. data is contained in "pal_rgb.h"
*-------------------------------------------------------------------------
*/
-
+
/* initialize the palette data */
pal_dims[0] = 256;
pal_dims[1] = 3;
-
+
/* make a palette */
if (H5IMmake_palette(fid,PAL1_NAME,pal_dims,pal_rgb)<0)
goto out;
-
+
/* attach a palette to the image dataset */
if (H5IMlink_palette(fid,IMAGE1_NAME,PAL1_NAME)<0)
goto out;
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* palette #2. sepia palette.
* read a PAL file and attach the palette to the HDF5 file
*-------------------------------------------------------------------------
*/
-
+
/* read a PAL file */
if (read_palette(PAL2_FILE, rgb, sizeof(rgb))<0)
goto out;
-
+
/* transfer to the HDF5 buffer */
for ( i=0, n=0; i<256*3; i+=3, n++)
{
@@ -375,25 +376,25 @@ static int test_data(void)
pal[i+1]=rgb[n].g;
pal[i+2]=rgb[n].b;
}
-
+
/* make a palette */
if (H5IMmake_palette(fid,PAL2_NAME,pal_dims,pal)<0)
goto out;
-
+
/* attach the palette to the image dataset */
if (H5IMlink_palette(fid,IMAGE1_NAME,PAL2_NAME)<0)
goto out;
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* palette #3. earth palette.
* read a PAL file and attach the palette to the HDF5 file
*-------------------------------------------------------------------------
*/
-
+
/* read a PAL file */
if (read_palette(PAL3_FILE, rgb, sizeof(rgb))<0)
goto out;
-
+
/* transfer to the HDF5 buffer */
for ( i=0, n=0; i<256*3; i+=3, n++)
{
@@ -401,19 +402,19 @@ static int test_data(void)
pal[i+1]=rgb[n].g;
pal[i+2]=rgb[n].b;
}
-
+
/* make a palette */
if (H5IMmake_palette(fid,PAL3_NAME,pal_dims,pal)<0)
goto out;
-
+
/* attach the palette to the image dataset */
if (H5IMlink_palette(fid,IMAGE1_NAME,PAL3_NAME)<0)
goto out;
-
+
PASSED();
-
-
- /*-------------------------------------------------------------------------
+
+
+ /*-------------------------------------------------------------------------
* palette #4. blue-red
* make a palette whith blue to red colors
*-------------------------------------------------------------------------
@@ -424,60 +425,60 @@ static int test_data(void)
pal[i+1]=0;
pal[i+2]=255-n;
}
-
+
/* make a palette */
if (H5IMmake_palette(fid,PAL4_NAME,pal_dims,pal)<0)
goto out;
-
+
/* attach the palette to the image dataset */
if (H5IMlink_palette(fid,IMAGE1_NAME,PAL4_NAME)<0)
goto out;
-
-
- /*-------------------------------------------------------------------------
+
+
+ /*-------------------------------------------------------------------------
* true color image example with pixel interlace
*-------------------------------------------------------------------------
*/
-
+
TESTING2("make true color image with pixel interlace");
-
+
/* read second data file */
if ((read_data(DATA_FILE2,&width,&height))<0)
goto out;
-
+
/* make image */
if ((H5IMmake_image_24bit(fid,IMAGE2_NAME,width,height,"INTERLACE_PIXEL",image_data))<0)
goto out;
-
+
PASSED();
-
+
/*-------------------------------------------------------------------------
* True color image example with plane interlace
*-------------------------------------------------------------------------
*/
-
+
TESTING2("make true color image with plane interlace");
-
+
/* read third data file */
if ((read_data(DATA_FILE3,&width,&height))<0)
goto out;
-
+
/* make image */
if ((H5IMmake_image_24bit(fid,IMAGE3_NAME,width,height,"INTERLACE_PLANE",image_data))<0)
goto out;
-
+
PASSED();
-
-
- /*-------------------------------------------------------------------------
+
+
+ /*-------------------------------------------------------------------------
* close
*-------------------------------------------------------------------------
*/
if (H5Fclose(fid)<0)
goto out;
-
+
return 0;
-
+
/* error zone, gracefully close */
out:
H5E_BEGIN_TRY {
@@ -488,16 +489,16 @@ out:
}
- /*
- The following test provides an examples of how to generate HDF5 image data from
- floating point data. In the example we use real life topographic data
- (from the North American hemisphere). In the dataset sea values are represented
- as negative numbers and land values are represented as positive numbers.
- The example generates 3 HDF5 images, one that generates an image from all the values,
- another that generates an image from the land values and another that generates an
- image from the sea values.
- For the example we used data from MODB, the Mediterranean Oceanic Data Base
- http://modb.oce.ulg.ac.be/
+/*
+The following test provides an examples of how to generate HDF5 image data from
+floating point data. In the example we use real life topographic data
+(from the North American hemisphere). In the dataset sea values are represented
+as negative numbers and land values are represented as positive numbers.
+The example generates 3 HDF5 images, one that generates an image from all the values,
+another that generates an image from the land values and another that generates an
+image from the sea values.
+For the example we used data from MODB, the Mediterranean Oceanic Data Base
+http://modb.oce.ulg.ac.be/
*/
@@ -512,14 +513,14 @@ static int test_generate(void)
char *srcdir = getenv("srcdir"); /* the source directory */
char data_file[512]=""; /* buffer to hold name of existing data file */
int i;
-
+
/* create a file using default properties */
if ((fid=H5Fcreate(FILE3,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT))<0)
goto out;
-
+
printf("Testing read and process data and make indexed images\n");
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* compose the name of the file to open, using the srcdir, if appropriate
*-------------------------------------------------------------------------
*/
@@ -529,12 +530,12 @@ static int test_generate(void)
strcat(data_file, "/");
}
strcat(data_file,DATA_FILE4);
-
+
/*-------------------------------------------------------------------------
* read data; the file data format is described below
*-------------------------------------------------------------------------
*/
-
+
f = fopen( data_file, "r" ) ;
if ( f == NULL )
{
@@ -543,82 +544,82 @@ static int test_generate(void)
return -1;
}
-/*
-!The first line of the ASCII file contains the dimension of the array :
-! IMAX, JMAX, KMAX. The integers are stored with the FORTRAN format I5.
-!The second line contains the exclusion value, the minimum and the maximum value of this
-! file. These numbers are stored with the FORTRAN format E12.5.
-! The remaining lines contains the data of the array, with 5 numbers per line
-! (except the last line for each I-line).
-! The array is stored in horizontal slices from sea surface to sea bottom and from
-! north to south. So the indexes go from :
-!
-! DO K = KMAX to 1
-! DO J = JMAX to 1
-! DO I = 1 to IMAX
-! read
-! OD
-! OD
-! OD
-!
-! ____________________________
-! / /| (imax,jmax,kmax)
-! / sea surface / |
-! / / |
-! /__________________________ / |
-! | | |
-! | | | (imax,jmax,1) n
-! | | / /
-! | | / /
-! ^ j | | / w <-----o-----> e
-! k | / |__________________________|/ /
-! | / (imax,1,1) /
-! |----------> s
-! i
-!
-*/
+ /*
+ !The first line of the ASCII file contains the dimension of the array :
+ ! IMAX, JMAX, KMAX. The integers are stored with the FORTRAN format I5.
+ !The second line contains the exclusion value, the minimum and the maximum value of this
+ ! file. These numbers are stored with the FORTRAN format E12.5.
+ ! The remaining lines contains the data of the array, with 5 numbers per line
+ ! (except the last line for each I-line).
+ ! The array is stored in horizontal slices from sea surface to sea bottom and from
+ ! north to south. So the indexes go from :
+ !
+ ! DO K = KMAX to 1
+ ! DO J = JMAX to 1
+ ! DO I = 1 to IMAX
+ ! read
+ ! OD
+ ! OD
+ ! OD
+ !
+ ! ____________________________
+ ! / /| (imax,jmax,kmax)
+ ! / sea surface / |
+ ! / / |
+ ! /__________________________ / |
+ ! | | |
+ ! | | | (imax,jmax,1) n
+ ! | | / /
+ ! | | / /
+ ! ^ j | | / w <-----o-----> e
+ ! k | / |__________________________|/ /
+ ! | / (imax,1,1) /
+ ! |----------> s
+ ! i
+ !
+ */
fscanf( f, "%d %d %d", &imax, &jmax, &kmax );
fscanf( f, "%f %f %f", &valex, &xmin, &xmax );
-
+
data = (float*) malloc ( imax * jmax * kmax * sizeof( float ));
image_data = (unsigned char*) malloc ( imax * jmax * kmax * sizeof( unsigned char ));
-
+
for ( i = 0; i < imax * jmax * kmax; i++ )
{
fscanf( f, "%f ", &value );
data[i] = value;
}
fclose( f );
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* transform the data from floating point to unsigned char
* we are processing all the data here
*-------------------------------------------------------------------------
*/
-
+
TESTING2("make indexed image from all the data");
-
+
for ( i = 0; i < imax * jmax * kmax; i++ )
{
image_data[i] = (unsigned char)(( 255 * (data[i] - xmin ) ) / (xmax - xmin ));
}
-
+
/* Make the image */
if ((H5IMmake_image_8bit(fid,"All data",(hsize_t)imax,(hsize_t)jmax,image_data))<0)
goto out;
-
+
PASSED();
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* transform the data from floating point to unsigned char
* here we just process the land data
*-------------------------------------------------------------------------
*/
-
+
TESTING2("make indexed image from land data");
-
+
for ( i = 0; i < imax * jmax * kmax; i++ )
{
if ( data[i] < 0 )
@@ -626,21 +627,21 @@ static int test_generate(void)
else
image_data[i] = (unsigned char)(( 255 * (data[i] ) ) / xmax );
}
-
+
/* make the image */
if ((H5IMmake_image_8bit(fid,"Land data",(hsize_t)imax,(hsize_t)jmax,image_data))<0)
goto out;
-
+
PASSED();
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* transform the data from floating point to unsigned char
* here we just process the sea data
*-------------------------------------------------------------------------
*/
-
+
TESTING2("make indexed image from sea data");
-
+
for ( i = 0; i < imax * jmax * kmax; i++ )
{
if ( data[i] > 0 )
@@ -648,24 +649,24 @@ static int test_generate(void)
else
image_data[i] = (unsigned char)(( 255 * (data[i] - xmin ) ) / xmin );
}
-
+
/* make the image */
if ((H5IMmake_image_8bit(fid,"Sea data",(hsize_t)imax,(hsize_t)jmax,image_data))<0)
goto out;
-
+
PASSED();
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* make a palette and attach it to the datasets
*-------------------------------------------------------------------------
*/
-
+
TESTING2("attaching palettes");
-
+
/* make a palette */
if ((H5IMmake_palette(fid,PAL1_NAME,pal_dims,pal_rgb))<0)
goto out;
-
+
/* attach the palette to the image datasets */
if ((H5IMlink_palette(fid,"All data",PAL1_NAME))<0)
goto out;
@@ -673,19 +674,19 @@ static int test_generate(void)
goto out;
if ((H5IMlink_palette(fid,"Sea data",PAL1_NAME))<0)
goto out;
-
+
PASSED();
-
-
- /*-------------------------------------------------------------------------
+
+
+ /*-------------------------------------------------------------------------
* close
*-------------------------------------------------------------------------
*/
if (H5Fclose(fid)<0)
goto out;
-
+
return 0;
-
+
/* error zone, gracefully close */
out:
H5E_BEGIN_TRY {
@@ -697,25 +698,25 @@ out:
/*-------------------------------------------------------------------------
- * read_data
- * utility function to read ASCII image data
- * the files have a header of the type
- *
- * components
- * n
- * height
- * n
- * width
- * n
- *
- * followed by the image data
- *
- *-------------------------------------------------------------------------
- */
+* read_data
+* utility function to read ASCII image data
+* the files have a header of the type
+*
+* components
+* n
+* height
+* n
+* width
+* n
+*
+* followed by the image data
+*
+*-------------------------------------------------------------------------
+*/
static int read_data( const char* fname, /*IN*/
- hsize_t *width, /*OUT*/
- hsize_t *height /*OUT*/ )
+ hsize_t *width, /*OUT*/
+ hsize_t *height /*OUT*/ )
{
int i, n;
int color_planes;
@@ -724,8 +725,8 @@ static int read_data( const char* fname, /*IN*/
int w, h;
char *srcdir = getenv("srcdir"); /* the source directory */
char data_file[512]=""; /* buffer to hold name of existing data file */
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* compose the name of the file to open, using "srcdir", if appropriate
*-------------------------------------------------------------------------
*/
@@ -736,62 +737,62 @@ static int read_data( const char* fname, /*IN*/
strcat(data_file, "/");
}
strcat(data_file,fname);
-
- /*-------------------------------------------------------------------------
+
+ /*-------------------------------------------------------------------------
* read
*-------------------------------------------------------------------------
*/
-
+
f = fopen(data_file, "r");
if ( f == NULL )
{
printf( "Could not open file %s. Try set $srcdir \n", data_file );
return -1;
}
-
+
fscanf( f, "%s", str );
fscanf( f, "%d", &color_planes );
fscanf( f, "%s", str );
fscanf( f, "%d", &h);
fscanf( f, "%s", str );
fscanf( f, "%d", &w);
-
+
*width = (hsize_t)w;
*height = (hsize_t)h;
-
+
if ( image_data )
{
free( image_data );
image_data=NULL;
}
-
+
image_data = (unsigned char*) malloc (w * h * color_planes * sizeof( unsigned char ));
-
+
for (i = 0; i < h * w * color_planes ; i++)
{
fscanf( f, "%d",&n );
image_data[i] = (unsigned char)n;
}
fclose(f);
-
+
return 1;
-
+
}
/*-------------------------------------------------------------------------
- * read_palette
- * Read an ASCII palette file .PAL into an array
- * the files have a header of the type
- *
- * Parameters:
- * fname - name of file to read.
- * palette - array of rgb_t to store the read palette.
- * palette_size - number of elements in 'palette' array
- *
- *-------------------------------------------------------------------------
- */
+* read_palette
+* Read an ASCII palette file .PAL into an array
+* the files have a header of the type
+*
+* Parameters:
+* fname - name of file to read.
+* palette - array of rgb_t to store the read palette.
+* palette_size - number of elements in 'palette' array
+*
+*-------------------------------------------------------------------------
+*/
#define STRING_JASC "JASC-PAL"
@@ -803,118 +804,118 @@ static int read_palette(const char* fname,
rgb_t *palette,
size_t palette_size)
{
- FILE *file;
- char buffer[80];
- unsigned u;
- unsigned int red;
- unsigned int green;
- unsigned int blue;
- unsigned nentries;
- char *srcdir = getenv("srcdir"); /* the source directory */
- char data_file[512]; /* buffer to hold name of existing data file */
+ FILE *file;
+ char buffer[80];
+ unsigned u;
+ unsigned int red;
+ unsigned int green;
+ unsigned int blue;
+ unsigned nentries;
+ char *srcdir = getenv("srcdir"); /* the source directory */
+ char data_file[512]; /* buffer to hold name of existing data file */
-/*-------------------------------------------------------------------------
- * compose the name of the file to open, using "srcdir", if appropriate
- *-------------------------------------------------------------------------
- */
- strcpy(data_file, "");
- if (srcdir)
- {
- strcpy(data_file, srcdir);
- strcat(data_file, "/");
- }
- strcat(data_file,fname);
-
- /* ensure the given palette is valid */
- if (!palette)
- return -1;
-
- /* open the input file */
- if (!(file = fopen(data_file, "r")))
- {
- printf( "Could not open file %s. Try set $srcdir \n", data_file );
- return -1;
- }
-
- /* read the file ident string */
- if (fgets(buffer, sizeof(buffer), file) == NULL)
- {
- fclose(file);
- return -1;
- }
-
- /* ensure it matches the palette file ident string */
- if ( strncmp(buffer, STRING_JASC, sizeof(STRING_JASC) - 1) != 0 &&
- strncmp(buffer, STRING_CWPAL, sizeof(STRING_CWPAL) - 1) != 0 )
- {
- fclose(file);
- return -1;
- }
-
- /* read the version string */
- if (fgets(buffer, sizeof(buffer), file) == NULL)
- {
- fclose(file);
- return -1;
- }
-
- /* ensure it matches the palette file version string */
- if ( strncmp(buffer, VERSION_JASC, sizeof(VERSION_JASC) - 1) != 0 &&
- strncmp(buffer, VERSION_CWPAL, sizeof(VERSION_CWPAL) - 1) != 0 )
- {
- fclose(file);
- return -1;
- }
-
- /* read the number of colors */
- if (fgets(buffer, sizeof(buffer), file) == NULL)
- {
- fclose(file);
- return -1;
- }
-
-
- /* extract the number of colors.
+ /*-------------------------------------------------------------------------
+ * compose the name of the file to open, using "srcdir", if appropriate
+ *-------------------------------------------------------------------------
+ */
+ strcpy(data_file, "");
+ if (srcdir)
+ {
+ strcpy(data_file, srcdir);
+ strcat(data_file, "/");
+ }
+ strcat(data_file,fname);
+
+ /* ensure the given palette is valid */
+ if (!palette)
+ return -1;
+
+ /* open the input file */
+ if (!(file = fopen(data_file, "r")))
+ {
+ printf( "Could not open file %s. Try set $srcdir \n", data_file );
+ return -1;
+ }
+
+ /* read the file ident string */
+ if (fgets(buffer, sizeof(buffer), file) == NULL)
+ {
+ fclose(file);
+ return -1;
+ }
+
+ /* ensure it matches the palette file ident string */
+ if ( strncmp(buffer, STRING_JASC, sizeof(STRING_JASC) - 1) != 0 &&
+ strncmp(buffer, STRING_CWPAL, sizeof(STRING_CWPAL) - 1) != 0 )
+ {
+ fclose(file);
+ return -1;
+ }
+
+ /* read the version string */
+ if (fgets(buffer, sizeof(buffer), file) == NULL)
+ {
+ fclose(file);
+ return -1;
+ }
+
+ /* ensure it matches the palette file version string */
+ if ( strncmp(buffer, VERSION_JASC, sizeof(VERSION_JASC) - 1) != 0 &&
+ strncmp(buffer, VERSION_CWPAL, sizeof(VERSION_CWPAL) - 1) != 0 )
+ {
+ fclose(file);
+ return -1;
+ }
+
+ /* read the number of colors */
+ if (fgets(buffer, sizeof(buffer), file) == NULL)
+ {
+ fclose(file);
+ return -1;
+ }
+
+
+ /* extract the number of colors.
check for missing version or number of colors
in this case it reads the first entry
*/
- if ( strlen( buffer ) > 4 )
- {
- fclose(file);
- return -1;
- }
-
- if (sscanf(buffer, "%u", &nentries) != 1)
- {
- fclose(file);
- return -1;
- }
-
- /* ensure there are a sensible number of colors in the palette */
- if ((nentries > 256) || (nentries > palette_size))
- {
- fclose(file);
- return(-1);
- }
-
- /* read the palette entries */
- for (u = 0; u < nentries; u++)
- {
- /* extract the red, green and blue color components. */
- if (fscanf(file, "%u %u %u", &red, &green, &blue) != 3)
- {
- fclose(file);
- return -1;
- }
- /* store this palette entry */
- palette[u].r = (unsigned char)red;
- palette[u].g = (unsigned char)green;
- palette[u].b = (unsigned char)blue;
- }
-
- /* close file */
- fclose(file);
-
- return nentries;
+ if ( strlen( buffer ) > 4 )
+ {
+ fclose(file);
+ return -1;
+ }
+
+ if (sscanf(buffer, "%u", &nentries) != 1)
+ {
+ fclose(file);
+ return -1;
+ }
+
+ /* ensure there are a sensible number of colors in the palette */
+ if ((nentries > 256) || (nentries > palette_size))
+ {
+ fclose(file);
+ return(-1);
+ }
+
+ /* read the palette entries */
+ for (u = 0; u < nentries; u++)
+ {
+ /* extract the red, green and blue color components. */
+ if (fscanf(file, "%u %u %u", &red, &green, &blue) != 3)
+ {
+ fclose(file);
+ return -1;
+ }
+ /* store this palette entry */
+ palette[u].r = (unsigned char)red;
+ palette[u].g = (unsigned char)green;
+ palette[u].b = (unsigned char)blue;
+ }
+
+ /* close file */
+ fclose(file);
+
+ return nentries;
}
diff --git a/hl/test/test_lite.c b/hl/test/test_lite.c
index 239ad60..ad12fb2 100644
--- a/hl/test/test_lite.c
+++ b/hl/test/test_lite.c
@@ -1,17 +1,17 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
- * terms governing use, modification, and redistribution, is contained in *
- * the files COPYING and Copyright.html. COPYING can be found at the root *
- * of the source code distribution tree; Copyright.html can be found at the *
- * root level of an installed copy of the electronic HDF5 document set and *
- * is linked from the top-level documents page. It can also be found at *
- * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+* Copyright by The HDF Group. *
+* Copyright by the Board of Trustees of the University of Illinois. *
+* All rights reserved. *
+* *
+* This file is part of HDF5. The full HDF5 copyright notice, including *
+* terms governing use, modification, and redistribution, is contained in *
+* the files COPYING and Copyright.html. COPYING can be found at the root *
+* of the source code distribution tree; Copyright.html can be found at the *
+* root level of an installed copy of the electronic HDF5 document set and *
+* is linked from the top-level documents page. It can also be found at *
+* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
+* access to either file, you may request a copy from help@hdfgroup.org. *
+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <stdlib.h>
#include <string.h>
@@ -45,358 +45,355 @@
#define ATTR10_NAME "attr float"
#define ATTR11_NAME "attr double"
-/*Initial input buffer size for testing H5LTtext_to_dtype()*/
-#define BUF_SIZE 1024
-
static herr_t make_attributes( hid_t loc_id, const char* obj_name );
/*-------------------------------------------------------------------------
- * test dataset functions
- *-------------------------------------------------------------------------
- */
+* test dataset functions
+*-------------------------------------------------------------------------
+*/
static int test_dsets( void )
{
- int rank = 2;
- hsize_t dims[2] = {2,3};
- hid_t file_id;
- hid_t dataset_id;
- char data_char_in[DIM] = {1,2,3,4,5,6};
- char data_char_out[DIM];
- short data_short_in[DIM] = {1,2,3,4,5,6};
- short data_short_out[DIM];
- int data_int_in[DIM] = {1,2,3,4,5,6};
- int data_int_out[DIM];
- long data_long_in[DIM] = {1,2,3,4,5,6};
- long data_long_out[DIM];
- float data_float_in[DIM] = {1,2,3,4,5,6};
- float data_float_out[DIM];
- double data_double_in[DIM] = {1,2,3,4,5,6};
- double data_double_out[DIM];
- const char *data_string_in = "This is a string";
- char data_string_out[20];
- int i;
-
-
- /* Create a new file using default properties. */
- file_id = H5Fcreate( FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT );
+ int rank = 2;
+ hsize_t dims[2] = {2,3};
+ hid_t file_id;
+ hid_t dataset_id;
+ char data_char_in[DIM] = {1,2,3,4,5,6};
+ char data_char_out[DIM];
+ short data_short_in[DIM] = {1,2,3,4,5,6};
+ short data_short_out[DIM];
+ int data_int_in[DIM] = {1,2,3,4,5,6};
+ int data_int_out[DIM];
+ long data_long_in[DIM] = {1,2,3,4,5,6};
+ long data_long_out[DIM];
+ float data_float_in[DIM] = {1,2,3,4,5,6};
+ float data_float_out[DIM];
+ double data_double_in[DIM] = {1,2,3,4,5,6};
+ double data_double_out[DIM];
+ const char *data_string_in = "This is a string";
+ char data_string_out[20];
+ int i;
-/*-------------------------------------------------------------------------
- * H5LTmake_dataset test
- *-------------------------------------------------------------------------
- */
- TESTING("H5LTmake_dataset");
+ /* Create a new file using default properties. */
+ file_id = H5Fcreate( FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT );
- /* Make dataset */
- if ( H5LTmake_dataset( file_id, DSET0_NAME, rank, dims, H5T_NATIVE_INT, data_int_in ) < 0 )
- goto out;
+ /*-------------------------------------------------------------------------
+ * H5LTmake_dataset test
+ *-------------------------------------------------------------------------
+ */
- /* Read dataset using the basic HDF5 API */
+ TESTING("H5LTmake_dataset");
- if ( ( dataset_id = H5Dopen2(file_id, DSET0_NAME, H5P_DEFAULT) ) < 0 )
- goto out;
+ /* Make dataset */
+ if ( H5LTmake_dataset( file_id, DSET0_NAME, rank, dims, H5T_NATIVE_INT, data_int_in ) < 0 )
+ goto out;
- if ( H5Dread ( dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data_int_out ) < 0 )
- goto out;
+ /* Read dataset using the basic HDF5 API */
- if ( H5Dclose( dataset_id ) < 0 )
- goto out;
+ if ( ( dataset_id = H5Dopen2(file_id, DSET0_NAME, H5P_DEFAULT) ) < 0 )
+ goto out;
- for (i = 0; i < DIM; i++)
- {
- if ( data_int_in[i] != data_int_out[i] ) {
- goto out;
- }
- }
+ if ( H5Dread ( dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data_int_out ) < 0 )
+ goto out;
- PASSED();
+ if ( H5Dclose( dataset_id ) < 0 )
+ goto out;
-/*-------------------------------------------------------------------------
- * read using the LT function H5LTread_dataset
- *-------------------------------------------------------------------------
- */
+ for (i = 0; i < DIM; i++)
+ {
+ if ( data_int_in[i] != data_int_out[i] ) {
+ goto out;
+ }
+ }
+
+ PASSED();
+
+ /*-------------------------------------------------------------------------
+ * read using the LT function H5LTread_dataset
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTread_dataset");
+ TESTING("H5LTread_dataset");
- if ( H5LTread_dataset( file_id, DSET0_NAME, H5T_NATIVE_INT, data_int_out ) < 0 )
- goto out;
+ if ( H5LTread_dataset( file_id, DSET0_NAME, H5T_NATIVE_INT, data_int_out ) < 0 )
+ goto out;
- for (i = 0; i < DIM; i++)
- {
- if ( data_int_in[i] != data_int_out[i] ) {
- goto out;
- }
- }
+ for (i = 0; i < DIM; i++)
+ {
+ if ( data_int_in[i] != data_int_out[i] ) {
+ goto out;
+ }
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * test the H5LTmake_dataset_ functions
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * test the H5LTmake_dataset_ functions
+ *-------------------------------------------------------------------------
+ */
-/*-------------------------------------------------------------------------
- * H5LTmake_dataset_char
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTmake_dataset_char
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTmake_dataset_char");
+ TESTING("H5LTmake_dataset_char");
- /* Make dataset char */
- if ( H5LTmake_dataset_char( file_id, DSET1_NAME, rank, dims, data_char_in ) < 0 )
- goto out;
+ /* Make dataset char */
+ if ( H5LTmake_dataset_char( file_id, DSET1_NAME, rank, dims, data_char_in ) < 0 )
+ goto out;
- /* Read dataset */
- if ( H5LTread_dataset( file_id, DSET1_NAME, H5T_NATIVE_CHAR, data_char_out ) < 0 )
- goto out;
+ /* Read dataset */
+ if ( H5LTread_dataset( file_id, DSET1_NAME, H5T_NATIVE_CHAR, data_char_out ) < 0 )
+ goto out;
- for (i = 0; i < DIM; i++)
- {
- if ( data_char_in[i] != data_char_out[i] ) {
- goto out;
- }
- }
+ for (i = 0; i < DIM; i++)
+ {
+ if ( data_char_in[i] != data_char_out[i] ) {
+ goto out;
+ }
+ }
- /* Read dataset */
- if ( H5LTread_dataset_char( file_id, DSET1_NAME, data_char_out ) < 0 )
- goto out;
+ /* Read dataset */
+ if ( H5LTread_dataset_char( file_id, DSET1_NAME, data_char_out ) < 0 )
+ goto out;
- for (i = 0; i < DIM; i++)
- {
- if ( data_char_in[i] != data_char_out[i] ) {
- goto out;
- }
- }
+ for (i = 0; i < DIM; i++)
+ {
+ if ( data_char_in[i] != data_char_out[i] ) {
+ goto out;
+ }
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTmake_dataset_short
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTmake_dataset_short
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTmake_dataset_short");
+ TESTING("H5LTmake_dataset_short");
- /* Make dataset short */
- if ( H5LTmake_dataset_short( file_id, DSET2_NAME, rank, dims, data_short_in ) < 0 )
- goto out;
+ /* Make dataset short */
+ if ( H5LTmake_dataset_short( file_id, DSET2_NAME, rank, dims, data_short_in ) < 0 )
+ goto out;
- /* Read dataset */
- if ( H5LTread_dataset( file_id, DSET2_NAME, H5T_NATIVE_SHORT, data_short_out ) < 0 )
- goto out;
+ /* Read dataset */
+ if ( H5LTread_dataset( file_id, DSET2_NAME, H5T_NATIVE_SHORT, data_short_out ) < 0 )
+ goto out;
- for (i = 0; i < DIM; i++)
- {
- if ( data_short_in[i] != data_short_out[i] ) {
- goto out;
- }
- }
+ for (i = 0; i < DIM; i++)
+ {
+ if ( data_short_in[i] != data_short_out[i] ) {
+ goto out;
+ }
+ }
- /* Read dataset */
- if ( H5LTread_dataset_short( file_id, DSET2_NAME, data_short_out ) < 0 )
- goto out;
+ /* Read dataset */
+ if ( H5LTread_dataset_short( file_id, DSET2_NAME, data_short_out ) < 0 )
+ goto out;
- for (i = 0; i < DIM; i++)
- {
- if ( data_short_in[i] != data_short_out[i] ) {
- goto out;
- }
- }
+ for (i = 0; i < DIM; i++)
+ {
+ if ( data_short_in[i] != data_short_out[i] ) {
+ goto out;
+ }
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTmake_dataset_int
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTmake_dataset_int
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTmake_dataset_int");
+ TESTING("H5LTmake_dataset_int");
- /* Make dataset int */
- if ( H5LTmake_dataset_int( file_id, DSET3_NAME, rank, dims, data_int_in ) < 0 )
- goto out;
+ /* Make dataset int */
+ if ( H5LTmake_dataset_int( file_id, DSET3_NAME, rank, dims, data_int_in ) < 0 )
+ goto out;
- /* Read dataset */
- if ( H5LTread_dataset( file_id, DSET3_NAME, H5T_NATIVE_INT, data_int_out ) < 0 )
- goto out;
+ /* Read dataset */
+ if ( H5LTread_dataset( file_id, DSET3_NAME, H5T_NATIVE_INT, data_int_out ) < 0 )
+ goto out;
- for (i = 0; i < DIM; i++)
- {
- if ( data_int_in[i] != data_int_out[i] ) {
- goto out;
- }
- }
+ for (i = 0; i < DIM; i++)
+ {
+ if ( data_int_in[i] != data_int_out[i] ) {
+ goto out;
+ }
+ }
- /* Read dataset */
- if ( H5LTread_dataset_int( file_id, DSET3_NAME, data_int_out ) < 0 )
- goto out;
+ /* Read dataset */
+ if ( H5LTread_dataset_int( file_id, DSET3_NAME, data_int_out ) < 0 )
+ goto out;
- for (i = 0; i < DIM; i++)
- {
- if ( data_int_in[i] != data_int_out[i] ) {
- goto out;
- }
- }
+ for (i = 0; i < DIM; i++)
+ {
+ if ( data_int_in[i] != data_int_out[i] ) {
+ goto out;
+ }
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTmake_dataset_long
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTmake_dataset_long
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTmake_dataset_long");
+ TESTING("H5LTmake_dataset_long");
- /* Make dataset long */
- if ( H5LTmake_dataset_long( file_id, DSET4_NAME, rank, dims, data_long_in ) < 0 )
- goto out;
+ /* Make dataset long */
+ if ( H5LTmake_dataset_long( file_id, DSET4_NAME, rank, dims, data_long_in ) < 0 )
+ goto out;
- /* Read dataset */
- if ( H5LTread_dataset( file_id, DSET4_NAME, H5T_NATIVE_LONG, data_long_out ) < 0 )
- goto out;
+ /* Read dataset */
+ if ( H5LTread_dataset( file_id, DSET4_NAME, H5T_NATIVE_LONG, data_long_out ) < 0 )
+ goto out;
- for (i = 0; i < DIM; i++)
- {
- if ( data_long_in[i] != data_long_out[i] ) {
- goto out;
- }
- }
+ for (i = 0; i < DIM; i++)
+ {
+ if ( data_long_in[i] != data_long_out[i] ) {
+ goto out;
+ }
+ }
- /* Read dataset */
- if ( H5LTread_dataset_long( file_id, DSET4_NAME, data_long_out ) < 0 )
- goto out;
+ /* Read dataset */
+ if ( H5LTread_dataset_long( file_id, DSET4_NAME, data_long_out ) < 0 )
+ goto out;
- for (i = 0; i < DIM; i++)
- {
- if ( data_long_in[i] != data_long_out[i] ) {
- goto out;
- }
- }
+ for (i = 0; i < DIM; i++)
+ {
+ if ( data_long_in[i] != data_long_out[i] ) {
+ goto out;
+ }
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTmake_dataset_float
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTmake_dataset_float
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTmake_dataset_float");
+ TESTING("H5LTmake_dataset_float");
- /* Make dataset float */
- if ( H5LTmake_dataset_float( file_id, DSET5_NAME, rank, dims, data_float_in ) < 0 )
- goto out;
+ /* Make dataset float */
+ if ( H5LTmake_dataset_float( file_id, DSET5_NAME, rank, dims, data_float_in ) < 0 )
+ goto out;
- /* Read dataset */
- if ( H5LTread_dataset( file_id, DSET5_NAME, H5T_NATIVE_FLOAT, data_float_out ) < 0 )
- goto out;
+ /* Read dataset */
+ if ( H5LTread_dataset( file_id, DSET5_NAME, H5T_NATIVE_FLOAT, data_float_out ) < 0 )
+ goto out;
- for (i = 0; i < DIM; i++)
- {
- if ( data_float_in[i] != data_float_out[i] ) {
- goto out;
- }
- }
+ for (i = 0; i < DIM; i++)
+ {
+ if ( data_float_in[i] != data_float_out[i] ) {
+ goto out;
+ }
+ }
- /* Read dataset */
- if ( H5LTread_dataset_float( file_id, DSET5_NAME, data_float_out ) < 0 )
- goto out;
+ /* Read dataset */
+ if ( H5LTread_dataset_float( file_id, DSET5_NAME, data_float_out ) < 0 )
+ goto out;
- for (i = 0; i < DIM; i++)
- {
- if ( data_float_in[i] != data_float_out[i] ) {
- goto out;
- }
- }
+ for (i = 0; i < DIM; i++)
+ {
+ if ( data_float_in[i] != data_float_out[i] ) {
+ goto out;
+ }
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTmake_dataset_double
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTmake_dataset_double
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTmake_dataset_double");
+ TESTING("H5LTmake_dataset_double");
- /* Make dataset double */
- if ( H5LTmake_dataset_double( file_id, DSET6_NAME, rank, dims, data_double_in ) < 0 )
- goto out;
+ /* Make dataset double */
+ if ( H5LTmake_dataset_double( file_id, DSET6_NAME, rank, dims, data_double_in ) < 0 )
+ goto out;
- /* Read dataset */
- if ( H5LTread_dataset( file_id, DSET6_NAME, H5T_NATIVE_DOUBLE, data_double_out ) < 0 )
- goto out;
+ /* Read dataset */
+ if ( H5LTread_dataset( file_id, DSET6_NAME, H5T_NATIVE_DOUBLE, data_double_out ) < 0 )
+ goto out;
- for (i = 0; i < DIM; i++)
- {
- if ( data_double_in[i] != data_double_out[i] ) {
- goto out;
- }
- }
+ for (i = 0; i < DIM; i++)
+ {
+ if ( data_double_in[i] != data_double_out[i] ) {
+ goto out;
+ }
+ }
- /* Read dataset */
- if ( H5LTread_dataset_double( file_id, DSET6_NAME, data_double_out ) < 0 )
- goto out;
+ /* Read dataset */
+ if ( H5LTread_dataset_double( file_id, DSET6_NAME, data_double_out ) < 0 )
+ goto out;
- for (i = 0; i < DIM; i++)
- {
- if ( data_double_in[i] != data_double_out[i] ) {
- goto out;
- }
- }
+ for (i = 0; i < DIM; i++)
+ {
+ if ( data_double_in[i] != data_double_out[i] ) {
+ goto out;
+ }
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTmake_dataset_string
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTmake_dataset_string
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTmake_dataset_string");
+ TESTING("H5LTmake_dataset_string");
- /* Make dataset string */
- if ( H5LTmake_dataset_string(file_id,DSET7_NAME,data_string_in) < 0 )
- goto out;
+ /* Make dataset string */
+ if ( H5LTmake_dataset_string(file_id,DSET7_NAME,data_string_in) < 0 )
+ goto out;
- /* Read dataset */
- if ( H5LTread_dataset_string(file_id,DSET7_NAME,data_string_out) < 0 )
- goto out;
+ /* Read dataset */
+ if ( H5LTread_dataset_string(file_id,DSET7_NAME,data_string_out) < 0 )
+ goto out;
- if ( strcmp(data_string_in,data_string_out) != 0 )
- goto out;
+ if ( strcmp(data_string_in,data_string_out) != 0 )
+ goto out;
-/*-------------------------------------------------------------------------
- * end tests
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * end tests
+ *-------------------------------------------------------------------------
+ */
- /* Close the file. */
- H5Fclose( file_id );
+ /* Close the file. */
+ H5Fclose( file_id );
- PASSED();
+ PASSED();
- return 0;
+ return 0;
out:
- /* Close the file. */
- H5_FAILED();
- return -1;
+ /* Close the file. */
+ H5_FAILED();
+ return -1;
}
/*-------------------------------------------------------------------------
- * test attribute functions
- *-------------------------------------------------------------------------
- */
+* test attribute functions
+*-------------------------------------------------------------------------
+*/
static int test_attr(void)
{
@@ -477,575 +474,575 @@ out:
}
/*-------------------------------------------------------------------------
- * make_attributes
- *-------------------------------------------------------------------------
- */
+* make_attributes
+*-------------------------------------------------------------------------
+*/
static herr_t make_attributes( hid_t loc_id, const char* obj_name )
{
- int rank_out;
- hsize_t *dims_out = 0;
- H5T_class_t type_class;
- size_t type_size;
- int i;
-
- char attr_str_in[] = {"My attribute"};
- char attr_str_out[20];
- char attr_char_in[5] = {1,2,3,4,5};
- char attr_char_out[5];
- short attr_short_in[5] = {1,2,3,4,5};
- short attr_short_out[5];
- int attr_int_in[5] = {1,2,3,4,5};
- int attr_int_out[5];
- long attr_long_in[5] = {1,2,3,4,5};
- long attr_long_out[5];
- float attr_float_in[5] = {1,2,3,4,5};
- float attr_float_out[5];
- double attr_double_in[5] = {1,2,3,4,5};
- double attr_double_out[5];
- unsigned char attr_uchar_in[5] = {1,2,3,4,5};
- unsigned char attr_uchar_out[5];
- unsigned short attr_ushort_in[5] = {1,2,3,4,5};
- unsigned short attr_ushort_out[5];
- unsigned int attr_uint_in[5] = {1,2,3,4,5};
- unsigned int attr_uint_out[5];
- unsigned long attr_ulong_in[5] = {1,2,3,4,5};
- unsigned long attr_ulong_out[5];
+ int rank_out;
+ hsize_t *dims_out = 0;
+ H5T_class_t type_class;
+ size_t type_size;
+ int i;
+
+ char attr_str_in[] = {"My attribute"};
+ char attr_str_out[20];
+ char attr_char_in[5] = {1,2,3,4,5};
+ char attr_char_out[5];
+ short attr_short_in[5] = {1,2,3,4,5};
+ short attr_short_out[5];
+ int attr_int_in[5] = {1,2,3,4,5};
+ int attr_int_out[5];
+ long attr_long_in[5] = {1,2,3,4,5};
+ long attr_long_out[5];
+ float attr_float_in[5] = {1,2,3,4,5};
+ float attr_float_out[5];
+ double attr_double_in[5] = {1,2,3,4,5};
+ double attr_double_out[5];
+ unsigned char attr_uchar_in[5] = {1,2,3,4,5};
+ unsigned char attr_uchar_out[5];
+ unsigned short attr_ushort_in[5] = {1,2,3,4,5};
+ unsigned short attr_ushort_out[5];
+ unsigned int attr_uint_in[5] = {1,2,3,4,5};
+ unsigned int attr_uint_out[5];
+ unsigned long attr_ulong_in[5] = {1,2,3,4,5};
+ unsigned long attr_ulong_out[5];
-/*-------------------------------------------------------------------------
- * H5LTset_attribute_string test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTset_attribute_string test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTset_attribute_string");
+ TESTING("H5LTset_attribute_string");
- /* Set the attribute */
- if ( H5LTset_attribute_string( loc_id, obj_name, ATTR1_NAME, attr_str_in ) < 0 )
- return -1;
+ /* Set the attribute */
+ if ( H5LTset_attribute_string( loc_id, obj_name, ATTR1_NAME, attr_str_in ) < 0 )
+ return -1;
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTset_attribute_string test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTset_attribute_string test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTget_attribute_string");
+ TESTING("H5LTget_attribute_string");
- /* Get the attribute */
- if ( H5LTget_attribute_string( loc_id, obj_name, ATTR1_NAME, attr_str_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute_string( loc_id, obj_name, ATTR1_NAME, attr_str_out ) < 0 )
+ return -1;
- if ( strcmp( attr_str_in, attr_str_out ) != 0 )
- {
- return -1;
- }
+ if ( strcmp( attr_str_in, attr_str_out ) != 0 )
+ {
+ return -1;
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTset_attribute_char test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTset_attribute_char test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTset_attribute_char");
+ TESTING("H5LTset_attribute_char");
- /* Set the attribute */
- if ( H5LTset_attribute_char( loc_id, obj_name, ATTR2_NAME, attr_char_in, (size_t)5 ) < 0 )
- return -1;
+ /* Set the attribute */
+ if ( H5LTset_attribute_char( loc_id, obj_name, ATTR2_NAME, attr_char_in, (size_t)5 ) < 0 )
+ return -1;
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTget_attribute_char test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTget_attribute_char test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTget_attribute_char");
+ TESTING("H5LTget_attribute_char");
- /* Get the attribute */
- if ( H5LTget_attribute_char( loc_id, obj_name, ATTR2_NAME, attr_char_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute_char( loc_id, obj_name, ATTR2_NAME, attr_char_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_char_in[i] != attr_char_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_char_in[i] != attr_char_out[i] ) {
+ return -1;
+ }
+ }
- /* Get the attribute */
- if ( H5LTget_attribute( loc_id, obj_name, ATTR2_NAME, H5T_NATIVE_CHAR, attr_char_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute( loc_id, obj_name, ATTR2_NAME, H5T_NATIVE_CHAR, attr_char_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_char_in[i] != attr_char_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_char_in[i] != attr_char_out[i] ) {
+ return -1;
+ }
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTset_attribute_short test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTset_attribute_short test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTset_attribute_short");
+ TESTING("H5LTset_attribute_short");
- /* Set the attribute */
- if ( H5LTset_attribute_short( loc_id, obj_name, ATTR3_NAME, attr_short_in, (size_t)5 ) < 0 )
- return -1;
+ /* Set the attribute */
+ if ( H5LTset_attribute_short( loc_id, obj_name, ATTR3_NAME, attr_short_in, (size_t)5 ) < 0 )
+ return -1;
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTget_attribute_short test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTget_attribute_short test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTget_attribute_short");
+ TESTING("H5LTget_attribute_short");
- /* Get the attribute */
- if ( H5LTget_attribute_short( loc_id, obj_name, ATTR3_NAME, attr_short_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute_short( loc_id, obj_name, ATTR3_NAME, attr_short_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_short_in[i] != attr_short_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_short_in[i] != attr_short_out[i] ) {
+ return -1;
+ }
+ }
- /* Get the attribute */
- if ( H5LTget_attribute( loc_id, obj_name, ATTR3_NAME, H5T_NATIVE_SHORT, attr_short_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute( loc_id, obj_name, ATTR3_NAME, H5T_NATIVE_SHORT, attr_short_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_short_in[i] != attr_short_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_short_in[i] != attr_short_out[i] ) {
+ return -1;
+ }
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTset_attribute_int test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTset_attribute_int test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTset_attribute_int");
+ TESTING("H5LTset_attribute_int");
- /* Set the attribute */
- if ( H5LTset_attribute_int( loc_id, obj_name, ATTR4_NAME, attr_int_in, (size_t)5 ) < 0 )
- return -1;
+ /* Set the attribute */
+ if ( H5LTset_attribute_int( loc_id, obj_name, ATTR4_NAME, attr_int_in, (size_t)5 ) < 0 )
+ return -1;
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTget_attribute_int test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTget_attribute_int test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTget_attribute_int");
+ TESTING("H5LTget_attribute_int");
- /* Get the attribute */
- if ( H5LTget_attribute_int( loc_id, obj_name, ATTR4_NAME, attr_int_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute_int( loc_id, obj_name, ATTR4_NAME, attr_int_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_int_in[i] != attr_int_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_int_in[i] != attr_int_out[i] ) {
+ return -1;
+ }
+ }
- /* Get the attribute */
- if ( H5LTget_attribute( loc_id, obj_name, ATTR4_NAME, H5T_NATIVE_INT, attr_int_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute( loc_id, obj_name, ATTR4_NAME, H5T_NATIVE_INT, attr_int_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_int_in[i] != attr_int_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_int_in[i] != attr_int_out[i] ) {
+ return -1;
+ }
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTset_attribute_long test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTset_attribute_long test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTset_attribute_long");
+ TESTING("H5LTset_attribute_long");
- /* Set the attribute */
- if ( H5LTset_attribute_long( loc_id, obj_name, ATTR5_NAME, attr_long_in, (size_t)5 ) < 0 )
- return -1;
+ /* Set the attribute */
+ if ( H5LTset_attribute_long( loc_id, obj_name, ATTR5_NAME, attr_long_in, (size_t)5 ) < 0 )
+ return -1;
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTget_attribute_long test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTget_attribute_long test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTget_attribute_long");
+ TESTING("H5LTget_attribute_long");
- /* Get the attribute */
- if ( H5LTget_attribute_long( loc_id, obj_name, ATTR5_NAME, attr_long_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute_long( loc_id, obj_name, ATTR5_NAME, attr_long_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_long_in[i] != attr_long_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_long_in[i] != attr_long_out[i] ) {
+ return -1;
+ }
+ }
- /* Get the attribute */
- if ( H5LTget_attribute( loc_id, obj_name, ATTR5_NAME, H5T_NATIVE_LONG, attr_long_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute( loc_id, obj_name, ATTR5_NAME, H5T_NATIVE_LONG, attr_long_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_long_in[i] != attr_long_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_long_in[i] != attr_long_out[i] ) {
+ return -1;
+ }
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTset_attribute_uchar test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTset_attribute_uchar test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTset_attribute_uchar");
+ TESTING("H5LTset_attribute_uchar");
- /* Set the attribute */
- if ( H5LTset_attribute_uchar( loc_id, obj_name, ATTR6_NAME, attr_uchar_in, (size_t)5 ) < 0 )
- return -1;
+ /* Set the attribute */
+ if ( H5LTset_attribute_uchar( loc_id, obj_name, ATTR6_NAME, attr_uchar_in, (size_t)5 ) < 0 )
+ return -1;
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTget_attribute_uchar test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTget_attribute_uchar test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTget_attribute_uchar");
+ TESTING("H5LTget_attribute_uchar");
- /* Get the attribute */
- if ( H5LTget_attribute_uchar( loc_id, obj_name, ATTR6_NAME, attr_uchar_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute_uchar( loc_id, obj_name, ATTR6_NAME, attr_uchar_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_uchar_in[i] != attr_uchar_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_uchar_in[i] != attr_uchar_out[i] ) {
+ return -1;
+ }
+ }
- /* Get the attribute */
- if ( H5LTget_attribute( loc_id, obj_name, ATTR6_NAME, H5T_NATIVE_UCHAR, attr_uchar_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute( loc_id, obj_name, ATTR6_NAME, H5T_NATIVE_UCHAR, attr_uchar_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_uchar_in[i] != attr_uchar_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_uchar_in[i] != attr_uchar_out[i] ) {
+ return -1;
+ }
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTset_attribute_ushort test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTset_attribute_ushort test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTset_attribute_ushort");
+ TESTING("H5LTset_attribute_ushort");
- /* Set the attribute */
- if ( H5LTset_attribute_ushort( loc_id, obj_name, ATTR7_NAME, attr_ushort_in, (size_t)5 ) < 0 )
- return -1;
+ /* Set the attribute */
+ if ( H5LTset_attribute_ushort( loc_id, obj_name, ATTR7_NAME, attr_ushort_in, (size_t)5 ) < 0 )
+ return -1;
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTget_attribute_ushort test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTget_attribute_ushort test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTget_attribute_ushort");
+ TESTING("H5LTget_attribute_ushort");
- /* Get the attribute */
- if ( H5LTget_attribute_ushort( loc_id, obj_name, ATTR7_NAME, attr_ushort_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute_ushort( loc_id, obj_name, ATTR7_NAME, attr_ushort_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_ushort_in[i] != attr_ushort_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_ushort_in[i] != attr_ushort_out[i] ) {
+ return -1;
+ }
+ }
- /* Get the attribute */
- if ( H5LTget_attribute( loc_id, obj_name, ATTR7_NAME, H5T_NATIVE_USHORT, attr_ushort_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute( loc_id, obj_name, ATTR7_NAME, H5T_NATIVE_USHORT, attr_ushort_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_ushort_in[i] != attr_ushort_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_ushort_in[i] != attr_ushort_out[i] ) {
+ return -1;
+ }
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTset_attribute_int test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTset_attribute_int test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTset_attribute_uint");
+ TESTING("H5LTset_attribute_uint");
- /* Set the attribute */
- if ( H5LTset_attribute_uint( loc_id, obj_name, ATTR8_NAME, attr_uint_in, (size_t)5 ) < 0 )
- return -1;
+ /* Set the attribute */
+ if ( H5LTset_attribute_uint( loc_id, obj_name, ATTR8_NAME, attr_uint_in, (size_t)5 ) < 0 )
+ return -1;
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTget_attribute_int test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTget_attribute_int test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTget_attribute_uint");
+ TESTING("H5LTget_attribute_uint");
- /* Get the attribute */
- if ( H5LTget_attribute_uint( loc_id, obj_name, ATTR8_NAME, attr_uint_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute_uint( loc_id, obj_name, ATTR8_NAME, attr_uint_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_uint_in[i] != attr_uint_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_uint_in[i] != attr_uint_out[i] ) {
+ return -1;
+ }
+ }
- /* Get the attribute */
- if ( H5LTget_attribute( loc_id, obj_name, ATTR8_NAME, H5T_NATIVE_UINT, attr_uint_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute( loc_id, obj_name, ATTR8_NAME, H5T_NATIVE_UINT, attr_uint_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_uint_in[i] != attr_uint_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_uint_in[i] != attr_uint_out[i] ) {
+ return -1;
+ }
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTset_attribute_ulong test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTset_attribute_ulong test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTset_attribute_ulong");
+ TESTING("H5LTset_attribute_ulong");
- /* Set the attribute */
- if ( H5LTset_attribute_ulong( loc_id, obj_name, ATTR9_NAME, attr_ulong_in, (size_t)5 ) < 0 )
- return -1;
+ /* Set the attribute */
+ if ( H5LTset_attribute_ulong( loc_id, obj_name, ATTR9_NAME, attr_ulong_in, (size_t)5 ) < 0 )
+ return -1;
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTget_attribute_long test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTget_attribute_long test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTget_attribute_ulong");
+ TESTING("H5LTget_attribute_ulong");
- /* Get the attribute */
- if ( H5LTget_attribute_ulong( loc_id, obj_name, ATTR9_NAME, attr_ulong_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute_ulong( loc_id, obj_name, ATTR9_NAME, attr_ulong_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_ulong_in[i] != attr_ulong_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_ulong_in[i] != attr_ulong_out[i] ) {
+ return -1;
+ }
+ }
- /* Get the attribute */
- if ( H5LTget_attribute( loc_id, obj_name, ATTR9_NAME, H5T_NATIVE_ULONG, attr_ulong_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute( loc_id, obj_name, ATTR9_NAME, H5T_NATIVE_ULONG, attr_ulong_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_ulong_in[i] != attr_ulong_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_ulong_in[i] != attr_ulong_out[i] ) {
+ return -1;
+ }
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTset_attribute_float test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTset_attribute_float test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTset_attribute_float");
+ TESTING("H5LTset_attribute_float");
- /* Set the attribute */
- if ( H5LTset_attribute_float( loc_id, obj_name, ATTR10_NAME, attr_float_in, (size_t)5 ) < 0 )
- return -1;
+ /* Set the attribute */
+ if ( H5LTset_attribute_float( loc_id, obj_name, ATTR10_NAME, attr_float_in, (size_t)5 ) < 0 )
+ return -1;
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTget_attribute_float test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTget_attribute_float test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTget_attribute_float");
+ TESTING("H5LTget_attribute_float");
- /* Get the attribute */
- if ( H5LTget_attribute_float( loc_id, obj_name, ATTR10_NAME, attr_float_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute_float( loc_id, obj_name, ATTR10_NAME, attr_float_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_float_in[i] != attr_float_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_float_in[i] != attr_float_out[i] ) {
+ return -1;
+ }
+ }
- /* Get the attribute */
- if ( H5LTget_attribute( loc_id, obj_name, ATTR10_NAME, H5T_NATIVE_FLOAT, attr_float_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute( loc_id, obj_name, ATTR10_NAME, H5T_NATIVE_FLOAT, attr_float_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_float_in[i] != attr_float_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_float_in[i] != attr_float_out[i] ) {
+ return -1;
+ }
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTset_attribute_double test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTset_attribute_double test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTset_attribute_double");
+ TESTING("H5LTset_attribute_double");
- /* Set the attribute */
- if ( H5LTset_attribute_double( loc_id, obj_name, ATTR11_NAME, attr_double_in, (size_t)5 ) < 0 )
- return -1;
+ /* Set the attribute */
+ if ( H5LTset_attribute_double( loc_id, obj_name, ATTR11_NAME, attr_double_in, (size_t)5 ) < 0 )
+ return -1;
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTget_attribute_double test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTget_attribute_double test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTget_attribute_double");
+ TESTING("H5LTget_attribute_double");
- /* Get the attribute */
- if ( H5LTget_attribute_double( loc_id, obj_name, ATTR11_NAME, attr_double_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute_double( loc_id, obj_name, ATTR11_NAME, attr_double_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_double_in[i] != attr_double_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_double_in[i] != attr_double_out[i] ) {
+ return -1;
+ }
+ }
- /* Get the attribute */
- if ( H5LTget_attribute( loc_id, obj_name, ATTR11_NAME, H5T_NATIVE_DOUBLE, attr_double_out ) < 0 )
- return -1;
+ /* Get the attribute */
+ if ( H5LTget_attribute( loc_id, obj_name, ATTR11_NAME, H5T_NATIVE_DOUBLE, attr_double_out ) < 0 )
+ return -1;
- for (i = 0; i < 5; i++)
- {
- if ( attr_double_in[i] != attr_double_out[i] ) {
- return -1;
- }
- }
+ for (i = 0; i < 5; i++)
+ {
+ if ( attr_double_in[i] != attr_double_out[i] ) {
+ return -1;
+ }
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTget_attribute_ndims test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTget_attribute_ndims test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTget_attribute_ndims");
+ TESTING("H5LTget_attribute_ndims");
- if ( H5LTget_attribute_ndims( loc_id, obj_name, ATTR2_NAME, &rank_out ) < 0 )
- return -1;
+ if ( H5LTget_attribute_ndims( loc_id, obj_name, ATTR2_NAME, &rank_out ) < 0 )
+ return -1;
- if ( rank_out != 1 ) {
- return -1;
- }
+ if ( rank_out != 1 ) {
+ return -1;
+ }
- PASSED();
+ PASSED();
-/*-------------------------------------------------------------------------
- * H5LTget_attribute_info test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * H5LTget_attribute_info test
+ *-------------------------------------------------------------------------
+ */
- TESTING("H5LTget_attribute_info");
+ TESTING("H5LTget_attribute_info");
- dims_out = malloc( sizeof(hsize_t) * rank_out );
+ dims_out = (hsize_t*) malloc( sizeof(hsize_t) * rank_out );
- if ( H5LTget_attribute_info( loc_id, obj_name, ATTR2_NAME, dims_out, &type_class,
- &type_size) < 0 )
- return -1;
+ if ( H5LTget_attribute_info( loc_id, obj_name, ATTR2_NAME, dims_out, &type_class,
+ &type_size) < 0 )
+ return -1;
- for (i = 0; i < rank_out; i++)
- {
- if ( dims_out[i] != 5 ) {
- return -1;
- }
- }
+ for (i = 0; i < rank_out; i++)
+ {
+ if ( dims_out[i] != 5 ) {
+ return -1;
+ }
+ }
- if ( type_class != H5T_INTEGER ) {
- return -1;
- }
+ if ( type_class != H5T_INTEGER ) {
+ return -1;
+ }
- if ( dims_out )
- free( dims_out );
+ if ( dims_out )
+ free( dims_out );
- PASSED();
+ PASSED();
- return 0;
+ return 0;
}
/*-------------------------------------------------------------------------
- * subroutine for test_text_dtype(): test_integers().
- *-------------------------------------------------------------------------
- */
+* subroutine for test_text_dtype(): test_integers().
+*-------------------------------------------------------------------------
+*/
static int test_integers(void)
{
hid_t dtype;
@@ -1094,9 +1091,9 @@ out:
}
/*-------------------------------------------------------------------------
- * subroutine for test_text_dtype(): test_fps().
- *-------------------------------------------------------------------------
- */
+* subroutine for test_text_dtype(): test_fps().
+*-------------------------------------------------------------------------
+*/
static int test_fps(void)
{
hid_t dtype;
@@ -1145,9 +1142,9 @@ out:
}
/*-------------------------------------------------------------------------
- * subroutine for test_text_dtype(): test_strings().
- *-------------------------------------------------------------------------
- */
+* subroutine for test_text_dtype(): test_strings().
+*-------------------------------------------------------------------------
+*/
static int test_strings(void)
{
hid_t dtype;
@@ -1231,9 +1228,9 @@ out:
}
/*-------------------------------------------------------------------------
- * subroutine for test_text_dtype(): test_opaques().
- *-------------------------------------------------------------------------
- */
+* subroutine for test_text_dtype(): test_opaques().
+*-------------------------------------------------------------------------
+*/
static int test_opaques(void)
{
hid_t dtype;
@@ -1280,9 +1277,9 @@ out:
}
/*-------------------------------------------------------------------------
- * subroutine for test_text_dtype(): test_enums().
- *-------------------------------------------------------------------------
- */
+* subroutine for test_text_dtype(): test_enums().
+*-------------------------------------------------------------------------
+*/
static int test_enums(void)
{
hid_t dtype;
@@ -1294,6 +1291,7 @@ static int test_enums(void)
H5T_class_t type_class;
char* dt_str;
size_t str_len;
+ H5T_order_t native_order = H5Tget_order(H5T_NATIVE_INT);
TESTING3(" text for enum types");
@@ -1305,6 +1303,12 @@ static int test_enums(void)
if(type_class != H5T_ENUM)
goto out;
+ /* Convert the variable before using it */
+ if(!H5Tequal(H5T_STD_I32LE, H5T_NATIVE_INT)) {
+ if(H5Tconvert(H5T_NATIVE_INT, H5T_STD_I32LE, 1, &value1, NULL, H5P_DEFAULT) < 0)
+ goto out;
+ }
+
if(H5Tenum_nameof(dtype, &value1, name1, size)<0)
goto out;
if(strcmp(name1, "BLUE"))
@@ -1312,6 +1316,13 @@ static int test_enums(void)
if(H5Tenum_valueof(dtype, name2, &value2)<0)
goto out;
+
+ /* Convert the variable before comparing it */
+ if(!H5Tequal(H5T_STD_I32LE, H5T_NATIVE_INT)) {
+ if(H5Tconvert(H5T_NATIVE_INT, H5T_STD_I32LE, 1, &value2, NULL, H5P_DEFAULT) < 0)
+ goto out;
+ }
+
if(value2 != 8)
goto out;
@@ -1320,10 +1331,12 @@ static int test_enums(void)
dt_str = (char*)calloc(str_len, sizeof(char));
if(H5LTdtype_to_text(dtype, dt_str, H5LT_DDL, &str_len)<0)
goto out;
- /*if(strcmp(dt_str, "H5T_ENUM {\n H5T_STD_I32LE;\n \"RED\" 5;\n \"GREEN\" 6;\n \"BLUE\" 7;\n \"WHITE\" 8;\n }")) {
+ if(strcmp(dt_str, "H5T_ENUM {\n H5T_STD_I32LE;\n \"RED\" 5;\n \"GREEN\" 6;\n \"BLUE\" 7;\n \"WHITE\" 8;\n }")) {
+
printf("dt=\n%s\n", dt_str);
goto out;
- }*/
+ }
+
free(dt_str);
if(H5Tclose(dtype)<0)
@@ -1338,9 +1351,9 @@ out:
}
/*-------------------------------------------------------------------------
- * subroutine for test_text_dtype(): test_variables().
- *-------------------------------------------------------------------------
- */
+* subroutine for test_text_dtype(): test_variables().
+*-------------------------------------------------------------------------
+*/
static int test_variables(void)
{
hid_t dtype;
@@ -1393,9 +1406,9 @@ out:
}
/*-------------------------------------------------------------------------
- * subroutine for test_text_dtype(): test_arrays().
- *-------------------------------------------------------------------------
- */
+* subroutine for test_text_dtype(): test_arrays().
+*-------------------------------------------------------------------------
+*/
static int test_arrays(void)
{
hid_t dtype;
@@ -1430,10 +1443,11 @@ static int test_arrays(void)
dt_str = (char*)calloc(str_len, sizeof(char));
if(H5LTdtype_to_text(dtype, dt_str, H5LT_DDL, &str_len)<0)
goto out;
- /*if(strcmp(dt_str, "H5T_ARRAY { [5][7][13] H5T_ARRAY { [17][19] H5T_COMPOUND { H5T_STD_I8BE \"arr_compound_1\"; H5T_STD_I32BE \"arr_compound_2\"; } } }")) {
+ if(strcmp(dt_str, "H5T_ARRAY {\n [5][7][13] H5T_ARRAY {\n [17][19] H5T_COMPOUND {\n H5T_STD_I8BE \"arr_compound_1\" : 0;\n H5T_STD_I32BE \"arr_compound_2\" : 1;\n }\n }\n }")) {
printf("dt=\n%s\n", dt_str);
goto out;
- }*/
+ }
+
free(dt_str);
if(H5Tclose(dtype)<0)
@@ -1448,9 +1462,9 @@ out:
}
/*-------------------------------------------------------------------------
- * subroutine for test_text_dtype(): test_compounds().
- *-------------------------------------------------------------------------
- */
+* subroutine for test_text_dtype(): test_compounds().
+*-------------------------------------------------------------------------
+*/
static int test_compounds(void)
{
hid_t dtype;
@@ -1513,9 +1527,9 @@ out:
}
/*-------------------------------------------------------------------------
- * subroutine for test_text_dtype(): test_complicated_compound().
- *-------------------------------------------------------------------------
- */
+* subroutine for test_text_dtype(): test_complicated_compound().
+*-------------------------------------------------------------------------
+*/
static int test_complicated_compound(void)
{
hid_t dtype;
@@ -1532,8 +1546,8 @@ static int test_complicated_compound(void)
/* compose the name of the file to open, using the srcdir, if appropriate */
if(srcdir)
{
- strcpy(filename, srcdir);
- strcat(filename, "/");
+ strcpy(filename, srcdir);
+ strcat(filename, "/");
}
strcat(filename, INPUT_FILE);
@@ -1541,14 +1555,14 @@ static int test_complicated_compound(void)
fp = fopen(filename, "r");
if(fp == NULL)
{
- printf( "Could not find file %s. Try set $srcdir \n", filename);
- goto out;
+ printf( "Could not find file %s. Try set $srcdir \n", filename);
+ goto out;
}
/* This part reads in the input as a string in a slow manner. GNU C
- * Library has convenient function getline() but isn't available on
- * all machines.
- */
+ * Library has convenient function getline() but isn't available on
+ * all machines.
+ */
if((line = (char*)calloc(size, sizeof(char)))==NULL)
goto out;
if(fgets(line, (int)size, fp)==NULL)
@@ -1593,9 +1607,9 @@ out:
}
/*-------------------------------------------------------------------------
- * test H5LTtext_to_dtype function
- *-------------------------------------------------------------------------
- */
+* test H5LTtext_to_dtype function
+*-------------------------------------------------------------------------
+*/
static int test_text_dtype(void)
{
TESTING("H5LTtext_to_dtype");
@@ -1634,30 +1648,30 @@ out:
}
/*-------------------------------------------------------------------------
- * the main program
- *-------------------------------------------------------------------------
- */
+* the main program
+*-------------------------------------------------------------------------
+*/
int main( void )
{
- int nerrors=0;
+ int nerrors=0;
- /* test dataset functions */
- nerrors += test_dsets();
+ /* test dataset functions */
+ nerrors += test_dsets();
- /* test attribute functions */
- nerrors += test_attr();
+ /* test attribute functions */
+ nerrors += test_attr();
- /* test text-dtype functions */
- nerrors += test_text_dtype();
+ /* test text-dtype functions */
+ nerrors += test_text_dtype();
- /* check for errors */
- if (nerrors)
- goto error;
+ /* check for errors */
+ if (nerrors)
+ goto error;
- return 0;
+ return 0;
error:
- return 1;
+ return 1;
}
diff --git a/hl/test/test_packet.c b/hl/test/test_packet.c
index 7b594ca..7a612a8 100644
--- a/hl/test/test_packet.c
+++ b/hl/test/test_packet.c
@@ -820,7 +820,7 @@ test_compress(void)
err = H5PTclose(table);
if( err < 0) TEST_ERROR;
- /* Open the packet table as a regular dataset and make sure that the
+ /* Open the packet table as a regular dataset and make sure that the
* compression filter is set.
*/
dset_id = H5Dopen2(fid1, "Compressed Test Dataset", H5P_DEFAULT);
@@ -850,7 +850,7 @@ test_compress(void)
err = H5PTclose(table);
if( err < 0) TEST_ERROR;
- /* Open the packet table as a regular dataset and make sure that the
+ /* Open the packet table as a regular dataset and make sure that the
* compression filter is not set.
*/
dset_id = H5Dopen2(fid1, "Uncompressed Dataset", H5P_DEFAULT);
@@ -887,7 +887,7 @@ error:
H5Tclose(part_t);
H5PTclose(table);
H5Fclose(fid1);
- } H5E_END_TRY
+ } H5E_END_TRY
H5_FAILED();
return -1;
}
diff --git a/hl/test/test_table.c b/hl/test/test_table.c
index 16172c4..433d49f 100644
--- a/hl/test/test_table.c
+++ b/hl/test/test_table.c
@@ -1,17 +1,17 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
- * terms governing use, modification, and redistribution, is contained in *
- * the files COPYING and Copyright.html. COPYING can be found at the root *
- * of the source code distribution tree; Copyright.html can be found at the *
- * root level of an installed copy of the electronic HDF5 document set and *
- * is linked from the top-level documents page. It can also be found at *
- * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+* Copyright by The HDF Group. *
+* Copyright by the Board of Trustees of the University of Illinois. *
+* All rights reserved. *
+* *
+* This file is part of HDF5. The full HDF5 copyright notice, including *
+* terms governing use, modification, and redistribution, is contained in *
+* the files COPYING and Copyright.html. COPYING can be found at the root *
+* of the source code distribution tree; Copyright.html can be found at the *
+* root level of an installed copy of the electronic HDF5 document set and *
+* is linked from the top-level documents page. It can also be found at *
+* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
+* access to either file, you may request a copy from help@hdfgroup.org. *
+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <stdlib.h>
#include <string.h>
@@ -24,28 +24,28 @@
/*-------------------------------------------------------------------------
- * Table API test
- *
- * Functions tested:
- *
- * H5TBmake_table
- * H5TBread_table
- * H5TBwrite_records
- * H5TBread_records
- * H5TBappend_records
- * H5TBinsert_record
- * H5TBdelete_record
- * H5TBcombine_tables
- * H5TBwrite_fields_name
- * H5TBread_fields_name
- * H5TBwrite_fields_index
- * H5TBinsert_field
- * H5TBdelete_field
- * H5TBget_table_info
- * H5TBget_field_info
- *
- *-------------------------------------------------------------------------
- */
+* Table API test
+*
+* Functions tested:
+*
+* H5TBmake_table
+* H5TBread_table
+* H5TBwrite_records
+* H5TBread_records
+* H5TBappend_records
+* H5TBinsert_record
+* H5TBdelete_record
+* H5TBcombine_tables
+* H5TBwrite_fields_name
+* H5TBread_fields_name
+* H5TBwrite_fields_index
+* H5TBinsert_field
+* H5TBdelete_field
+* H5TBget_table_info
+* H5TBget_field_info
+*
+*-------------------------------------------------------------------------
+*/
#define TITLE "Title"
#define NFIELDS 5
@@ -55,1565 +55,1581 @@
#define TESTING2(WHAT) {printf("%-70s", "Testing " WHAT); fflush(stdout);}
/*-------------------------------------------------------------------------
- * structure used for all tests, a particle with properties
- *-------------------------------------------------------------------------
- */
+* structure used for all tests, a particle with properties
+*-------------------------------------------------------------------------
+*/
typedef struct particle_t
{
- char name[16];
- long longi;
- float pressure;
- double temperature;
- int lati;
+ char name[16];
+ long longi;
+ float pressure;
+ double temperature;
+ int lati;
} particle_t;
/*-------------------------------------------------------------------------
- * local auxiliary functions
- *-------------------------------------------------------------------------
- */
-
-static hid_t h5file_open(const char *fname, unsigned flags);
-static int cmp_par(hsize_t i, hsize_t j, particle_t *rbuf, particle_t *wbuf );
-static int compare_deleted(hsize_t rrecords, hsize_t dstart, hsize_t drecords,
- particle_t *rbuf, particle_t *wbuf);
-
-/*-------------------------------------------------------------------------
- * a subset of particle_t, with latitude and longitude fields
- *-------------------------------------------------------------------------
- */
- typedef struct position_t
- {
- long longi;
- int lati;
- } position_t;
+* a subset of particle_t, with latitude and longitude fields
+*-------------------------------------------------------------------------
+*/
+typedef struct position_t
+{
+ long longi;
+ int lati;
+} position_t;
/*-------------------------------------------------------------------------
- * a subset of particle_t, with name and pressure fields
- *-------------------------------------------------------------------------
- */
- typedef struct namepressure_t
- {
- char name[16];
- float pressure;
- } namepressure_t;
+* a subset of particle_t, with name and pressure fields
+*-------------------------------------------------------------------------
+*/
+typedef struct namepressure_t
+{
+ char name[16];
+ float pressure;
+} namepressure_t;
/*-------------------------------------------------------------------------
- * an extended particle, used in the insert field test
- *-------------------------------------------------------------------------
- */
- typedef struct particle2_t
- {
- char name[16];
- long longi;
- float pressure;
- double temperature;
- int lati;
- int new_field;
- } particle2_t;
+* an extended particle, used in the insert field test
+*-------------------------------------------------------------------------
+*/
+typedef struct particle2_t
+{
+ char name[16];
+ long longi;
+ float pressure;
+ double temperature;
+ int lati;
+ int new_field;
+} particle2_t;
+
+/*-------------------------------------------------------------------------
+* a particle with one field less, used in the delete field test
+*-------------------------------------------------------------------------
+*/
+typedef struct particle3_t
+{
+ char name[16];
+ long longi;
+ double temperature;
+ int lati;
+} particle3_t;
-/*-------------------------------------------------------------------------
- * a particle with one field less, used in the delete field test
- *-------------------------------------------------------------------------
- */
- typedef struct particle3_t
- {
- char name[16];
- long longi;
- double temperature;
- int lati;
- } particle3_t;
/*-------------------------------------------------------------------------
- * the test program
- *-------------------------------------------------------------------------
- */
-
-int test_table(hid_t fid, int write)
+* function to open an HDF5 file and return its file identifier
+*-------------------------------------------------------------------------
+*/
+static hid_t h5file_open(const char *fname, unsigned flags)
{
- /* identifiers */
- hid_t fid1;
- hid_t fid2;
- hsize_t chunk_size=10;
- int compress=0;
- int *fill=NULL;
- particle_t fill1[1] = { {"no data",-1, -99.0f, -99.0, -1} };
- int fill1_new[1] = { -100 };
- hsize_t position;
- char tname[20];
-
- /* indices */
- int i, j;
-
- /* write, read, append, delete, insert some records and fields */
- hsize_t FIELDS = NFIELDS;
- hsize_t RECORDS = NRECORDS;
- hsize_t start;
- hsize_t wstart;
- hsize_t rstart;
- hsize_t istart;
- hsize_t dstart;
- hsize_t nrecords;
- hsize_t rrecords;
- hsize_t wrecords;
- hsize_t arecords;
- hsize_t irecords;
- hsize_t drecords;
- hsize_t nfields;
- hsize_t rfields;
- hsize_t start1; /* record to start reading from 1st table */
- hsize_t start2; /* record to start writing in 2nd table */
-/*-------------------------------------------------------------------------
- * read, write, insert, append buffers
- *-------------------------------------------------------------------------
- */
- particle_t rbuf[NRECORDS+4];
- particle2_t rbuf2[NRECORDS];
- particle3_t rbuf3[NRECORDS];
- particle_t rbufc[NRECORDS*2];
- particle_t abuf[2]={{"eight",80,8.0f,80.0,80},{"nine",90,9.0f,90.0,90}};
- particle_t ibuf[2]={{"zero", 0, 0.0f, 0.0, 0},{"zero", 0, 0.0f, 0.0, 0}};
- particle_t wbufd[NRECORDS];
- particle_t wbuf[NRECORDS] = {
- {"zero", 0, 0.0f, 0.0, 0,},
- {"one", 10, 1.0f, 10.0, 10},
- {"two", 20, 2.0f, 20.0, 20},
- {"three",30, 3.0f, 30.0, 30},
- {"four", 40, 4.0f, 40.0, 40},
- {"five", 50, 5.0f, 50.0, 50},
- {"six", 60, 6.0f, 60.0, 60},
- {"seven",70, 7.0f, 70.0, 70}
- };
- /* buffers for the field "Pressure" and "New_field" */
- float pressure_in [NRECORDS] = { 0.0f,1.0f,2.0f,3.0f,4.0f,5.0f,6.0f,7.0f };
- float pressure_out [NRECORDS];
- int buf_new[NRECORDS] = { 0,1,2,3,4,5,6,7 };
- /* buffers for the fields "Latitude,Longitude" */
- position_t position_out[NRECORDS_ADD];
- position_t position_in[NRECORDS_ADD] = { {0,0},
- {10,10},
- {20,20}};
- /* buffers for the fields "Name,Pressure" */
- namepressure_t namepre_out[NRECORDS];
- namepressure_t namepre_in[NRECORDS] =
- { {"zero",0.0f},
- {"one", 1.0f},
- {"two", 2.0f},
- {"three", 3.0f},
- {"four", 4.0f},
- {"five", 5.0f},
- {"six", 6.0f},
- {"seven", 7.0f},
- };
+ hid_t fid; /* identifier for the file */
+ char *srcdir = getenv("srcdir"); /* the source directory */
+ char data_file[512]=""; /* buffer to hold name of existing file */
+ /* compose the name of the file to open, using the srcdir, if appropriate */
+ if (srcdir)
+ {
+ strcpy(data_file,srcdir);
+ strcat(data_file,"/");
+ }
+ strcat(data_file,fname);
-/*-------------------------------------------------------------------------
- * initialize table parameters
- * field offsets and sizes used in the fields functions
- *-------------------------------------------------------------------------
- */
-
- size_t field_offset_pos[2]=
- {
- HOFFSET( position_t, longi ),
- HOFFSET( position_t, lati )
- };
- size_t field_offset_namepre[2]=
- {
- HOFFSET( namepressure_t, name ),
- HOFFSET( namepressure_t, pressure )
- };
- size_t field_sizes_pos[2]=
- {
- sizeof(position_in[0].longi),
- sizeof(position_in[0].lati)
- };
- size_t field_sizes_namepre[2]=
- {
- sizeof(namepre_in[0].name),
- sizeof(namepre_in[0].pressure)
- };
- size_t field_sizes_pre[1]=
- {
- sizeof(namepre_in[0].pressure)
- };
+ /* open */
+ if ((fid = H5Fopen(data_file,flags,H5P_DEFAULT))<0)
+ {
+ fprintf(stderr,"Error: Cannot open file <%s>\n",data_file );
+ exit(1);
+ }
-/*-------------------------------------------------------------------------
- * query table test
- *-------------------------------------------------------------------------
- */
- char **names_out;
- size_t sizes_out[NFIELDS];
- size_t offset_out[NFIELDS];
- size_t size_out;
+ return fid;
+}
/*-------------------------------------------------------------------------
- * initialize table parameters
- * field indexes (zero based) used in the fields functions
- * "Name 0","Longitude 1","Pressure 2","Temperature 3","Latitude 4"
- *-------------------------------------------------------------------------
- */
- int field_index_pre[1] = { 2 };
- int field_index_pos[2] = { 1,4 };
- int field_index_namepre[2] = { 0,2 };
- int field_index[NFIELDS] = { 0,1,2,3,4 };
+* function that compares one particle
+*-------------------------------------------------------------------------
+*/
+static int cmp_par(hsize_t i, hsize_t j, particle_t *rbuf, particle_t *wbuf )
+{
+ if ( ( strcmp( rbuf[i].name, wbuf[j].name ) != 0 ) ||
+ rbuf[i].lati != wbuf[j].lati ||
+ rbuf[i].longi != wbuf[j].longi ||
+ rbuf[i].pressure != wbuf[j].pressure ||
+ rbuf[i].temperature != wbuf[j].temperature )
+ {
+ fprintf(stderr,"read and write buffers have differences\n");
+ fprintf(stderr,"%s %ld %f %f %d\n",
+ rbuf[i].name,rbuf[i].longi,rbuf[i].pressure,rbuf[i].temperature,rbuf[i].lati);
+ fprintf(stderr,"%s %ld %f %f %d\n",
+ wbuf[j].name,wbuf[j].longi,wbuf[j].pressure,wbuf[j].temperature,wbuf[j].lati);
+ return -1;
+ }
+ return 0;
+}
/*-------------------------------------------------------------------------
- * initialize table parameters
- * size and the offsets of struct members in memory
- * define the inserted field HDF5 type and buffers
- * these are used for the insert field test
- *-------------------------------------------------------------------------
- */
- hid_t field_type_new = H5T_NATIVE_INT;
- size_t dst_size2 = sizeof( particle2_t );
- size_t dst_offset2[NFIELDS+1] = { HOFFSET( particle2_t, name ),
- HOFFSET( particle2_t, longi ),
- HOFFSET( particle2_t, pressure ),
- HOFFSET( particle2_t, temperature ),
- HOFFSET( particle2_t, lati ),
- HOFFSET( particle2_t, new_field )};
- size_t dst_sizes2[NFIELDS+1] = { sizeof( rbuf2[0].name),
- sizeof( rbuf2[0].longi),
- sizeof( rbuf2[0].pressure),
- sizeof( rbuf2[0].temperature),
- sizeof( rbuf2[0].lati),
- sizeof( rbuf2[0].new_field)};
-/*-------------------------------------------------------------------------
- * initialize table parameters
- * size and the offsets of struct members in memory
- * these are used for the delete field test
- *-------------------------------------------------------------------------
- */
- size_t dst_size3 = sizeof( particle3_t );
- size_t dst_offset3[NFIELDS-1] = { HOFFSET( particle3_t, name ),
- HOFFSET( particle3_t, longi ),
- HOFFSET( particle3_t, temperature ),
- HOFFSET( particle3_t, lati )};
-
- size_t dst_sizes3[NFIELDS-1] = { sizeof( rbuf3[0].name),
- sizeof( rbuf3[0].longi),
- sizeof( rbuf3[0].temperature),
- sizeof( rbuf3[0].lati)};
+* function to compare deleted records
+*-------------------------------------------------------------------------
+*/
+static int compare_deleted(hsize_t rrecords, hsize_t dstart, hsize_t drecords,
+ particle_t *rbuf, particle_t *wbuf)
+{
+ hsize_t i,j;
+ for( i=0; i<rrecords; i++)
+ {
+ if (i<dstart)
+ {
+ if (cmp_par(i,i,rbuf,wbuf)<0)
+ return -1;
+ }
+ else
+ {
+ j=i+drecords;
+ if (cmp_par(i,j,rbuf,wbuf)<0)
+ return -1;
+ }
+ }
+ return 0;
+}
-/*-------------------------------------------------------------------------
- * initialize table parameters
- * 1) size and the offsets of struct members in memory
- * 2) field names
- * 3) define a HDF5 type for the fields
- *-------------------------------------------------------------------------
- */
-
- size_t type_size_mem = sizeof( particle_t );
- size_t field_offset[NFIELDS]=
- {
- HOFFSET( particle_t, name ),
- HOFFSET( particle_t, longi ),
- HOFFSET( particle_t, pressure ),
- HOFFSET( particle_t, temperature ),
- HOFFSET( particle_t, lati )
- };
- size_t field_size[NFIELDS] =
- {
- sizeof( rbuf[0].name),
- sizeof( rbuf[0].longi),
- sizeof( rbuf[0].pressure),
- sizeof( rbuf[0].temperature),
- sizeof( rbuf[0].lati)
- };
- const char *field_names[NFIELDS] =
- { "Name","Longitude","Pressure","Temperature","Latitude" };
- hid_t field_type[NFIELDS];
- hid_t string_type = H5Tcopy( H5T_C_S1 );
- H5Tset_size( string_type, 16 );
- field_type[0] = string_type;
- field_type[1] = H5T_NATIVE_LONG;
- field_type[2] = H5T_NATIVE_FLOAT;
- field_type[3] = H5T_NATIVE_DOUBLE;
- field_type[4] = H5T_NATIVE_INT;
/*-------------------------------------------------------------------------
- *
- * Functions tested:
- *
- * H5TBmake_table
- * H5TBread_table
- *
- *-------------------------------------------------------------------------
- */
- if (write)
- {
- TESTING2("making table");
-
- if (H5TBmake_table(TITLE,fid,"table1",FIELDS,RECORDS,type_size_mem,
- field_names,field_offset,field_type,
- chunk_size,fill,compress,wbuf)<0)
- goto out;
- PASSED();
- }
-
- TESTING2("reading table");
+* the test program
+*-------------------------------------------------------------------------
+*/
-/*-------------------------------------------------------------------------
- * read the table
- *-------------------------------------------------------------------------
- */
+static int test_table(hid_t fid, int do_write)
+{
+ hid_t fid1;
+ hid_t fid2;
+ hsize_t chunk_size=10;
+ int compress=0;
+ int *fill=NULL;
+ particle_t fill1[1] = { {"no data",-1, -99.0f, -99.0, -1} };
+ int fill1_new[1] = { -100 };
+ hsize_t position;
+ char tname[20];
+ hsize_t i, j;
+ /* write, read, append, delete, insert some records and fields */
+ hsize_t FIELDS = NFIELDS;
+ hsize_t RECORDS = NRECORDS;
+ hsize_t start;
+ hsize_t wstart;
+ hsize_t rstart;
+ hsize_t istart;
+ hsize_t dstart;
+ hsize_t nrecords;
+ hsize_t rrecords;
+ hsize_t wrecords;
+ hsize_t arecords;
+ hsize_t irecords;
+ hsize_t drecords;
+ hsize_t nfields;
+ hsize_t rfields;
+ hsize_t start1; /* record to start reading from 1st table */
+ hsize_t start2; /* record to start writing in 2nd table */
+ /* read, write, insert, append buffers */
+ particle_t rbuf[NRECORDS+4];
+ particle2_t rbuf2[NRECORDS];
+ particle3_t rbuf3[NRECORDS];
+ particle_t rbufc[NRECORDS*2];
+ particle_t abuf[2]={{"eight",80,8.0f,80.0,80},{"nine",90,9.0f,90.0,90}};
+ particle_t ibuf[2]={{"zero", 0, 0.0f, 0.0, 0},{"zero", 0, 0.0f, 0.0, 0}};
+ particle_t wbufd[NRECORDS];
+ particle_t wbuf[NRECORDS] = {
+ {"zero", 0, 0.0f, 0.0, 0,},
+ {"one", 10, 1.0f, 10.0, 10},
+ {"two", 20, 2.0f, 20.0, 20},
+ {"three",30, 3.0f, 30.0, 30},
+ {"four", 40, 4.0f, 40.0, 40},
+ {"five", 50, 5.0f, 50.0, 50},
+ {"six", 60, 6.0f, 60.0, 60},
+ {"seven",70, 7.0f, 70.0, 70}
+ };
+ /* buffers for the field "Pressure" and "New_field" */
+ float pressure_in [NRECORDS] = { 0.0f,1.0f,2.0f,3.0f,4.0f,5.0f,6.0f,7.0f };
+ float pressure_out [NRECORDS];
+ int buf_new[NRECORDS] = { 0,1,2,3,4,5,6,7 };
+ /* buffers for the fields "Latitude,Longitude" */
+ position_t position_out[NRECORDS_ADD];
+ position_t position_in[NRECORDS_ADD] = { {0,0},
+ {10,10},
+ {20,20}};
+ /* buffers for the fields "Name,Pressure" */
+ namepressure_t namepre_out[NRECORDS];
+ namepressure_t namepre_in[NRECORDS] =
+ { {"zero",0.0f},
+ {"one", 1.0f},
+ {"two", 2.0f},
+ {"three", 3.0f},
+ {"four", 4.0f},
+ {"five", 5.0f},
+ {"six", 6.0f},
+ {"seven", 7.0f},
+ };
+
+
+ /*-------------------------------------------------------------------------
+ * initialize table parameters
+ * field offsets and sizes used in the fields functions
+ *-------------------------------------------------------------------------
+ */
+
+ size_t field_offset_pos[2]=
+ {
+ HOFFSET( position_t, longi ),
+ HOFFSET( position_t, lati )
+ };
+ size_t field_offset_namepre[2]=
+ {
+ HOFFSET( namepressure_t, name ),
+ HOFFSET( namepressure_t, pressure )
+ };
+ size_t field_sizes_pos[2]=
+ {
+ sizeof(position_in[0].longi),
+ sizeof(position_in[0].lati)
+ };
+ size_t field_sizes_namepre[2]=
+ {
+ sizeof(namepre_in[0].name),
+ sizeof(namepre_in[0].pressure)
+ };
+ size_t field_sizes_pre[1]=
+ {
+ sizeof(namepre_in[0].pressure)
+ };
+
+ /*-------------------------------------------------------------------------
+ * query table test
+ *-------------------------------------------------------------------------
+ */
+ char **names_out;
+ size_t sizes_out[NFIELDS];
+ size_t offset_out[NFIELDS];
+ size_t size_out;
+
+ /*-------------------------------------------------------------------------
+ * initialize table parameters
+ * field indexes (zero based) used in the fields functions
+ * "Name 0","Longitude 1","Pressure 2","Temperature 3","Latitude 4"
+ *-------------------------------------------------------------------------
+ */
+ int field_index_pre[1] = { 2 };
+ int field_index_pos[2] = { 1,4 };
+ int field_index_namepre[2] = { 0,2 };
+ int field_index[NFIELDS] = { 0,1,2,3,4 };
+
+ /*-------------------------------------------------------------------------
+ * initialize table parameters
+ * size and the offsets of struct members in memory
+ * define the inserted field HDF5 type and buffers
+ * these are used for the insert field test
+ *-------------------------------------------------------------------------
+ */
+ hid_t field_type_new = H5T_NATIVE_INT;
+ size_t dst_size2 = sizeof( particle2_t );
+ size_t dst_offset2[NFIELDS+1] = { HOFFSET( particle2_t, name ),
+ HOFFSET( particle2_t, longi ),
+ HOFFSET( particle2_t, pressure ),
+ HOFFSET( particle2_t, temperature ),
+ HOFFSET( particle2_t, lati ),
+ HOFFSET( particle2_t, new_field )};
+ size_t dst_sizes2[NFIELDS+1] = { sizeof( rbuf2[0].name),
+ sizeof( rbuf2[0].longi),
+ sizeof( rbuf2[0].pressure),
+ sizeof( rbuf2[0].temperature),
+ sizeof( rbuf2[0].lati),
+ sizeof( rbuf2[0].new_field)};
+ /*-------------------------------------------------------------------------
+ * initialize table parameters
+ * size and the offsets of struct members in memory
+ * these are used for the delete field test
+ *-------------------------------------------------------------------------
+ */
+ size_t dst_size3 = sizeof( particle3_t );
+ size_t dst_offset3[NFIELDS-1] = { HOFFSET( particle3_t, name ),
+ HOFFSET( particle3_t, longi ),
+ HOFFSET( particle3_t, temperature ),
+ HOFFSET( particle3_t, lati )};
+
+ size_t dst_sizes3[NFIELDS-1] = { sizeof( rbuf3[0].name),
+ sizeof( rbuf3[0].longi),
+ sizeof( rbuf3[0].temperature),
+ sizeof( rbuf3[0].lati)};
+
+
+ /*-------------------------------------------------------------------------
+ * initialize table parameters
+ * 1) size and the offsets of struct members in memory
+ * 2) field names
+ * 3) define a HDF5 type for the fields
+ *-------------------------------------------------------------------------
+ */
+
+ size_t type_size_mem = sizeof( particle_t );
+ size_t field_offset[NFIELDS]=
+ {
+ HOFFSET( particle_t, name ),
+ HOFFSET( particle_t, longi ),
+ HOFFSET( particle_t, pressure ),
+ HOFFSET( particle_t, temperature ),
+ HOFFSET( particle_t, lati )
+ };
+ size_t field_size[NFIELDS] =
+ {
+ sizeof( rbuf[0].name),
+ sizeof( rbuf[0].longi),
+ sizeof( rbuf[0].pressure),
+ sizeof( rbuf[0].temperature),
+ sizeof( rbuf[0].lati)
+ };
+ const char *field_names[NFIELDS] =
+ { "Name","Longitude","Pressure","Temperature","Latitude" };
+ hid_t field_type[NFIELDS];
+ hid_t string_type = H5Tcopy( H5T_C_S1 );
+ H5Tset_size( string_type, 16 );
+ field_type[0] = string_type;
+ field_type[1] = H5T_NATIVE_LONG;
+ field_type[2] = H5T_NATIVE_FLOAT;
+ field_type[3] = H5T_NATIVE_DOUBLE;
+ field_type[4] = H5T_NATIVE_INT;
+
+ /*-------------------------------------------------------------------------
+ *
+ * Functions tested:
+ *
+ * H5TBmake_table
+ * H5TBread_table
+ *
+ *-------------------------------------------------------------------------
+ */
+ if (do_write)
+ {
+ TESTING2("making table");
- if (H5TBread_table(fid,"table1",type_size_mem,field_offset,field_size,rbuf)<0)
- goto out;
+ if (H5TBmake_table(TITLE,fid,"table1",FIELDS,RECORDS,type_size_mem,
+ field_names,field_offset,field_type,
+ chunk_size,fill,compress,wbuf)<0)
+ goto out;
+ PASSED();
+ }
- /* compare the extracted table with the original array */
- for( i = 0; i < NRECORDS; i++ )
- {
- if (cmp_par(i,i,rbuf,wbuf)<0)
- goto out;
- }
+ TESTING2("reading table");
- PASSED();
+ /*-------------------------------------------------------------------------
+ * read the table
+ *-------------------------------------------------------------------------
+ */
+ if (H5TBread_table(fid,"table1",type_size_mem,field_offset,field_size,rbuf)<0)
+ goto out;
-/*-------------------------------------------------------------------------
- *
- * Functions tested:
- *
- * H5TBwrite_records
- *
- *-------------------------------------------------------------------------
- */
- if (write)
- {
- TESTING2("writing records");
-
- /* create an empty table */
- if (H5TBmake_table(TITLE,fid,"table2",FIELDS,RECORDS,type_size_mem,
- field_names,field_offset,field_type,
- chunk_size,fill,compress,0)<0)
- goto out;
+ /* compare the extracted table with the original array */
+ for( i = 0; i < NRECORDS; i++ )
+ {
+ if (cmp_par(i,i,rbuf,wbuf)<0)
+ goto out;
+ }
-/*-------------------------------------------------------------------------
- * write records, start at 0, write 8
- * pos = 0 1 2 3 4 5 6 7
- * data= 0 1 2 3 4 5 6 7
- *-------------------------------------------------------------------------
- */
- wstart=0; wrecords=8;
- if (H5TBwrite_records(fid,"table2",wstart,wrecords,type_size_mem,field_offset,
- field_size,wbuf)<0)
- goto out;
-
- /* read it back */
- if (H5TBread_table(fid,"table2",type_size_mem,field_offset,field_size,rbuf)<0)
- goto out;
-
- /* compare */
- for( i = 0; i < NRECORDS; i++ )
- {
- if (cmp_par(i,i,rbuf,wbuf)<0)
- goto out;
- }
-
- PASSED();
- }
+ PASSED();
-/*-------------------------------------------------------------------------
- *
- * Functions tested:
- *
- * H5TBread_records
- *
- *-------------------------------------------------------------------------
- */
- TESTING2("reading records");
+ /*-------------------------------------------------------------------------
+ *
+ * Functions tested:
+ *
+ * H5TBwrite_records
+ *
+ *-------------------------------------------------------------------------
+ */
+ if (do_write)
+ {
+ TESTING2("writing records");
+
+ /* create an empty table */
+ if (H5TBmake_table(TITLE,fid,"table2",FIELDS,RECORDS,type_size_mem,
+ field_names,field_offset,field_type,
+ chunk_size,fill,compress,0)<0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * write records, start at 0, write 8
+ * pos = 0 1 2 3 4 5 6 7
+ * data= 0 1 2 3 4 5 6 7
+ *-------------------------------------------------------------------------
+ */
+ wstart=0;
+ wrecords=8;
+ if (H5TBwrite_records(fid,"table2",wstart,wrecords,type_size_mem,field_offset,
+ field_size,wbuf)<0)
+ goto out;
+
+ /* read it back */
+ if (H5TBread_table(fid,"table2",type_size_mem,field_offset,field_size,rbuf)<0)
+ goto out;
+
+ /* compare */
+ for( i = 0; i < NRECORDS; i++ )
+ {
+ if (cmp_par(i,i,rbuf,wbuf)<0)
+ goto out;
+ }
+
+ PASSED();
+ }
-/*-------------------------------------------------------------------------
- * read records, start at 0, read 8
- * pos = 0 1 2 3 4 5 6 7
- * data= 0 1 2 3 4 5 6 7
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ *
+ * Functions tested:
+ *
+ * H5TBread_records
+ *
+ *-------------------------------------------------------------------------
+ */
+
+ TESTING2("reading records");
+
+ /*-------------------------------------------------------------------------
+ * read records, start at 0, read 8
+ * pos = 0 1 2 3 4 5 6 7
+ * data= 0 1 2 3 4 5 6 7
+ *-------------------------------------------------------------------------
+ */
+
+ /*-------------------------------------------------------------------------
+ * for the read test we cannot use "table2" because it has been appended
+ * we use the original "table1" instead
+ *-------------------------------------------------------------------------
+ */
+ if(do_write)
+ strcpy(tname,"table2");
+ else
+ strcpy(tname,"table1");
+
+ rstart=0;
+ rrecords=8;
+ if (H5TBread_records(fid,tname,rstart,rrecords,type_size_mem,field_offset,
+ field_size,rbuf)<0)
+ goto out;
+
+ /* compare */
+ for( i = rstart; i < rrecords; i++)
+ {
+ if (cmp_par(i,i,rbuf,wbuf)<0)
+ goto out;
+ }
+ PASSED();
+
+ /*-------------------------------------------------------------------------
+ *
+ * Functions tested:
+ *
+ * H5TBappend_records
+ * H5TBread_records
+ *
+ *-------------------------------------------------------------------------
+ */
+ if (do_write)
+ {
+ TESTING2("appending records");
+
+ /*-------------------------------------------------------------------------
+ * append 2 records
+ * pos = 0 1 2 3 4 5 6 7 8 9
+ * data= 0 1 2 3 4 5 6 7 8 9
+ *-------------------------------------------------------------------------
+ */
+ arecords=2;
+ if (H5TBappend_records(fid,"table2",arecords,type_size_mem,field_offset,field_size,abuf)<0)
+ return 1;
+
+ if (H5TBget_table_info(fid,"table2",&rfields,&rrecords)<0)
+ return 1;
+
+ rstart=0; rrecords=NRECORDS+arecords;
+ if (H5TBread_records(fid,"table2",rstart,rrecords,type_size_mem,field_offset,
+ field_size,rbuf)<0)
+ return 1;
+
+ /* compare */
+ wrecords=8;
+ for( i = rstart; i< wrecords; i++)
+ {
+ if (cmp_par(i,i,rbuf,wbuf)<0)
+ goto out;
+ }
+ for( i = wrecords, j = 0; i < rrecords; i++,j++)
+ {
+ if (cmp_par(i,j,rbuf,abuf)<0)
+ goto out;
+ }
+ PASSED();
+ }
-/*-------------------------------------------------------------------------
- * for the read test we cannot use "table2" because it has been appended
- * we use the original "table1" instead
- *-------------------------------------------------------------------------
- */
- if(write)
- strcpy(tname,"table2");
- else
- strcpy(tname,"table1");
-
- rstart=0; rrecords=8;
- if (H5TBread_records(fid,tname,rstart,rrecords,type_size_mem,field_offset,
- field_size,rbuf)<0)
- goto out;
-
- /* compare */
- for( i=(int)rstart; i<(int)rrecords; i++)
- {
- if (cmp_par(i,i,rbuf,wbuf)<0)
- goto out;
- }
- PASSED();
+ /*-------------------------------------------------------------------------
+ *
+ * Functions tested:
+ *
+ * H5TBinsert_record
+ * H5TBread_records
+ *
+ *-------------------------------------------------------------------------
+ */
+ if (do_write)
+ {
+ TESTING2("inserting records");
+
+ /*-------------------------------------------------------------------------
+ * insert 2 records
+ * pos = 0 1 2 3 4 5 6 7 8 9 10 11
+ * data= 0 0 0 1 2 3 4 5 6 7 8 9
+ *-------------------------------------------------------------------------
+ */
+ istart=1; irecords=2;
+ if (H5TBinsert_record(fid,"table2",istart,irecords,type_size_mem,field_offset,field_size,ibuf)<0)
+ return 1;
+
+ if (H5TBget_table_info(fid,"table2",&rfields,&rrecords)<0)
+ return 1;
+
+ if (H5TBread_records(fid,"table2",rstart,rrecords,type_size_mem,field_offset,
+ field_size,rbuf)<0)
+ return 1;
+
+ /* compare */
+ for( i = 0; i < 12; i++)
+ {
+ if (i < istart)
+ {
+ if (cmp_par(i,i,rbuf,wbuf)<0)
+ goto out;
+ }
+ else if (i >= istart && i < istart + irecords)
+ {
+ j = i - istart;
+ if (cmp_par(i,j,rbuf,ibuf)<0)
+ goto out;
+ }
+ else if ( i >= istart + irecords && i < 10 )
+ {
+ j = i - irecords;
+ if (cmp_par(i,j,rbuf,wbuf)<0)
+ goto out;
+ }
+ else
+ {
+ j = i - 10;
+ if (cmp_par(i,j,rbuf,abuf)<0)
+ goto out;
+ }
+ }
+ PASSED();
+ }
-/*-------------------------------------------------------------------------
- *
- * Functions tested:
- *
- * H5TBappend_records
- * H5TBread_records
- *
- *-------------------------------------------------------------------------
- */
- if (write)
- {
- TESTING2("appending records");
+ /*-------------------------------------------------------------------------
+ *
+ * Functions tested:
+ *
+ * H5TBdelete_record
+ * H5TBread_records
+ *
+ *-------------------------------------------------------------------------
+ */
+ if (do_write)
+ {
+ TESTING2("deleting records");
+
+ /*-------------------------------------------------------------------------
+ * Create a table
+ * pos = 0 1 2 3 4 5 6 7
+ * data= 0 1 2 3 4 5 6 7
+ *-------------------------------------------------------------------------
+ */
+
+ for( i=0; i<NRECORDS; i++)
+ {
+ wbufd[i].lati = wbuf[i].lati;
+ wbufd[i].longi = wbuf[i].longi;
+ wbufd[i].pressure = wbuf[i].pressure;
+ wbufd[i].temperature = wbuf[i].temperature;
+ strcpy(wbufd[i].name, wbuf[i].name );
+
+ }
+
+
+ if (H5TBmake_table(TITLE,fid,"table3",FIELDS,RECORDS,type_size_mem,
+ field_names,field_offset,field_type,
+ chunk_size,fill,compress,wbufd)<0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * Delete records, start at 2, delete 3
+ * pos = 0 1 2 3 4
+ * data= 0 1 5 6 7
+ *-------------------------------------------------------------------------
+ */
+ dstart=2; drecords=3;
+ if (H5TBdelete_record(fid,"table3",dstart,drecords)<0)
+ goto out;
+
+ if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0)
+ goto out;
+
+ rstart=0;
+ if (H5TBread_records(fid,"table3",rstart,rrecords,type_size_mem,field_offset,
+ field_size,rbuf)<0)
+ goto out;
+
+ /* compare */
+ nrecords=NRECORDS;
+ assert(rrecords == nrecords-drecords);
+ if (compare_deleted(rrecords,dstart,drecords,rbuf,wbufd)<0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * reset compare buffer
+ *-------------------------------------------------------------------------
+ */
+ nrecords=rrecords;
+ for( i=0; i<nrecords; i++)
+ {
+ wbufd[i] = rbuf[i];
+ }
+
+ /*-------------------------------------------------------------------------
+ * Delete records, start at 0, delete 2
+ * pos = 0 1 2
+ * data= 5 6 7
+ *-------------------------------------------------------------------------
+ */
+ dstart=0; drecords=2;
+ if (H5TBdelete_record(fid,"table3",dstart,drecords)<0)
+ goto out;
+
+ if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0)
+ goto out;
+
+ rstart=0;
+ if (H5TBread_records(fid,"table3",rstart,rrecords,type_size_mem,field_offset,
+ field_size,rbuf)<0)
+ goto out;
+
+ /* Compare */
+ assert(rrecords == nrecords-drecords);
+ if (compare_deleted(rrecords,dstart,drecords,rbuf,wbufd)<0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * reset compare buffer
+ *-------------------------------------------------------------------------
+ */
+ nrecords=rrecords;
+ for( i=0; i<nrecords; i++)
+ {
+ wbufd[i] = rbuf[i];
+ }
+
+ /*-------------------------------------------------------------------------
+ * Delete records, start at 1, delete 1
+ * pos = 0 1
+ * data= 5 7
+ *-------------------------------------------------------------------------
+ */
+ dstart=1; drecords=1;
+ if (H5TBdelete_record(fid,"table3",dstart,drecords)<0)
+ goto out;
+
+ if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0)
+ goto out;
+
+ rstart=0;
+ if (H5TBread_records(fid,"table3",rstart,rrecords,type_size_mem,field_offset,
+ field_size,rbuf)<0)
+ goto out;
+
+ /* Compare */
+ assert(rrecords == nrecords-drecords);
+ if (compare_deleted(rrecords,dstart,drecords,rbuf,wbufd)<0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * reset compare buffer
+ *-------------------------------------------------------------------------
+ */
+ nrecords=rrecords;
+ for( i=0; i<nrecords; i++)
+ {
+ wbufd[i] = rbuf[i];
+ }
+
+ /*-------------------------------------------------------------------------
+ * Delete records, start at 0, delete 1
+ * pos = 0
+ * data= 7
+ *-------------------------------------------------------------------------
+ */
+ dstart=0; drecords=1;
+ if (H5TBdelete_record(fid,"table3",dstart,drecords)<0)
+ goto out;
+
+ if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0)
+ goto out;
+
+ rstart=0;
+ if (H5TBread_records(fid,"table3",rstart,rrecords,type_size_mem,field_offset,
+ field_size,rbuf)<0)
+ goto out;
+
+ /* Compare */
+ assert(rrecords == nrecords-drecords);
+ if (compare_deleted(rrecords,dstart,drecords,rbuf,wbufd)<0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * reset compare buffer
+ *-------------------------------------------------------------------------
+ */
+ nrecords=rrecords;
+ for( i=0; i<nrecords; i++)
+ {
+ wbufd[i] = rbuf[i];
+ }
+
+ /* Read complete table */
+ if (H5TBread_table(fid,"table3",type_size_mem,field_offset,field_size,rbuf)<0)
+ goto out;
+
+ /* Compare */
+ for( i=0; i<rrecords; i++)
+ {
+ if (cmp_par(i,i,rbuf,wbufd)<0)
+ {
+ goto out;
+ }
+ }
+
+ /*-------------------------------------------------------------------------
+ * Delete records, start at 0, delete 1
+ * pos = 0
+ * data= empty
+ *-------------------------------------------------------------------------
+ */
+ dstart=0; drecords=1;
+ if (H5TBdelete_record(fid,"table3",dstart,drecords)<0)
+ goto out;
+
+ if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0)
+ goto out;
+
+ if (rrecords)
+ goto out;
+
+ PASSED();
+ }
-/*-------------------------------------------------------------------------
- * append 2 records
- * pos = 0 1 2 3 4 5 6 7 8 9
- * data= 0 1 2 3 4 5 6 7 8 9
- *-------------------------------------------------------------------------
- */
- arecords=2;
- if (H5TBappend_records(fid,"table2",arecords,type_size_mem,field_offset,field_size,abuf)<0)
- return 1;
-
- if (H5TBget_table_info(fid,"table2",&rfields,&rrecords)<0)
- return 1;
-
- rstart=0; rrecords=NRECORDS+arecords;
- if (H5TBread_records(fid,"table2",rstart,rrecords,type_size_mem,field_offset,
- field_size,rbuf)<0)
- return 1;
-
- /* compare */
- wrecords=8;
- for( i=(int)rstart; i<(int)wrecords; i++)
- {
- if (cmp_par(i,i,rbuf,wbuf)<0)
- goto out;
- }
- for( i=(int)wrecords, j=0; i<(int)rrecords; i++,j++)
- {
- if (cmp_par(i,j,rbuf,abuf)<0)
- goto out;
- }
- PASSED();
- }
+ /*-------------------------------------------------------------------------
+ *
+ * Functions tested:
+ *
+ * H5TBadd_records_from
+ * H5TBread_records
+ *
+ *-------------------------------------------------------------------------
+ */
+
+ if (do_write)
+ {
+ TESTING2("adding records");
+
+ /* create 2 tables */
+ if (H5TBmake_table(TITLE,fid,"table4",FIELDS,RECORDS,type_size_mem,
+ field_names,field_offset,field_type,
+ chunk_size,fill,compress,wbuf)<0)
+ goto out;
+ if (H5TBmake_table(TITLE,fid,"table5",FIELDS,RECORDS,type_size_mem,
+ field_names,field_offset,field_type,
+ chunk_size,fill,compress,wbuf)<0)
+ goto out;
+
+ /* add the records from "table4" to "table5" */
+ start1 = 3;
+ nrecords = 2;
+ start2 = 6;
+ if ( H5TBadd_records_from(fid,"table4",start1,nrecords,"table5",start2)<0)
+ goto out;
+
+ /* read final table */
+ if (H5TBread_table(fid,"table5",type_size_mem,field_offset,field_size,rbuf)<0)
+ goto out;
+
+ /* compare */
+ for( i = 0; i < NRECORDS+2; i++ )
+ {
+ if ( i < start2 )
+ {
+ if (cmp_par(i,i,rbuf,wbuf)<0)
+ goto out;
+ }
+ else if ( i < start2 + nrecords )
+ {
+ j = i - start1;
+ if (cmp_par(i,j,rbuf,wbuf)<0)
+ goto out;
+ }
+ else
+ {
+ j = i - nrecords;
+ if (cmp_par(i,j,rbuf,wbuf)<0)
+ goto out;
+ }
+ }
-/*-------------------------------------------------------------------------
- *
- * Functions tested:
- *
- * H5TBinsert_record
- * H5TBread_records
- *
- *-------------------------------------------------------------------------
- */
- if (write)
- {
- TESTING2("inserting records");
+ PASSED();
+ }
-/*-------------------------------------------------------------------------
- * insert 2 records
- * pos = 0 1 2 3 4 5 6 7 8 9 10 11
- * data= 0 0 0 1 2 3 4 5 6 7 8 9
- *-------------------------------------------------------------------------
- */
- istart=1; irecords=2;
- if (H5TBinsert_record(fid,"table2",istart,irecords,type_size_mem,field_offset,field_size,ibuf)<0)
- return 1;
-
- if (H5TBget_table_info(fid,"table2",&rfields,&rrecords)<0)
- return 1;
-
- if (H5TBread_records(fid,"table2",rstart,rrecords,type_size_mem,field_offset,
- field_size,rbuf)<0)
- return 1;
-
- /* compare */
- for( i=0; i<12; i++)
- {
- if (i<istart)
- {
- if (cmp_par(i,i,rbuf,wbuf)<0)
- goto out;
- }
- else if (i>=(int)istart && i<(int)istart+(int)irecords)
- {
- j=i-(int)istart;
- if (cmp_par(i,j,rbuf,ibuf)<0)
- goto out;
- }
- else if (i>=(int)istart+(int)irecords && i<10)
- {
- j=i-(int)irecords;
- if (cmp_par(i,j,rbuf,wbuf)<0)
- goto out;
- }
- else
- {
- j=i-10;
- if (cmp_par(i,j,rbuf,abuf)<0)
- goto out;
- }
- }
- PASSED();
- }
+ /*-------------------------------------------------------------------------
+ *
+ * Functions tested:
+ *
+ * H5TBcombine_tables
+ * H5TBread_table
+ *
+ *-------------------------------------------------------------------------
+ */
+
+ if (do_write)
+ {
+ TESTING2("combining tables");
+
+ /* create 2 tables */
+ if (H5TBmake_table(TITLE,fid,"table6",FIELDS,RECORDS,type_size_mem,
+ field_names,field_offset,field_type,
+ chunk_size,fill,compress,wbuf)<0)
+ goto out;
+ if (H5TBmake_table(TITLE,fid,"table7",FIELDS,RECORDS,type_size_mem,
+ field_names,field_offset,field_type,
+ chunk_size,fill,compress,wbuf)<0)
+ goto out;
+
+ /* combine the two tables into a third */
+ if ( H5TBcombine_tables(fid,"table6",fid,"table7","table8")<0)
+ goto out;
+
+ /* read merged table */
+ if (H5TBread_table(fid,"table8",type_size_mem,field_offset,field_size,rbufc)<0)
+ goto out;
+
+ /* compare */
+ for( i = 0; i < NRECORDS*2; i++ )
+ {
+ if ( i < NRECORDS )
+ {
+ if (cmp_par(i,i,rbufc,wbuf)<0)
+ goto out;
+ }
+ else
+ {
+ if (cmp_par(i,i-NRECORDS,rbufc,wbuf)<0)
+ goto out;
+ }
+ }
+
+ /*-------------------------------------------------------------------------
+ * multi file test
+ *-------------------------------------------------------------------------
+ */
+
+ /* create 2 files using default properties. */
+ fid1 = H5Fcreate("combine_tables1.h5",H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT);
+ fid2 = H5Fcreate("combine_tables2.h5",H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT);
+
+ /* create 2 tables, one in each file */
+ if (H5TBmake_table(TITLE,fid1,"table1",FIELDS,RECORDS,type_size_mem,
+ field_names,field_offset,field_type,
+ chunk_size,fill,compress,wbuf)<0)
+ goto out;
+ if (H5TBmake_table(TITLE,fid2,"table2",FIELDS,RECORDS,type_size_mem,
+ field_names,field_offset,field_type,
+ chunk_size,fill,compress,wbuf)<0)
+ goto out;
+
+ /* combine the two tables into a third */
+ if ( H5TBcombine_tables(fid1,"table1",fid2,"table2","table3")<0)
+ goto out;
+
+ /* read merged table */
+ if (H5TBread_table(fid1,"table3",type_size_mem,field_offset,field_size,rbufc)<0)
+ goto out;
+
+ /* compare */
+ for( i = 0; i < NRECORDS*2; i++ )
+ {
+ if ( i < NRECORDS )
+ {
+ if (cmp_par(i,i,rbufc,wbuf)<0)
+ goto out;
+ }
+ else
+ {
+ if (cmp_par(i,i-NRECORDS,rbufc,wbuf)<0)
+ goto out;
+ }
+ }
-/*-------------------------------------------------------------------------
- *
- * Functions tested:
- *
- * H5TBdelete_record
- * H5TBread_records
- *
- *-------------------------------------------------------------------------
- */
- if (write)
- {
- TESTING2("deleting records");
+ /* close files */
+ H5Fclose(fid1);
+ H5Fclose(fid2);
-/*-------------------------------------------------------------------------
- * Create a table
- * pos = 0 1 2 3 4 5 6 7
- * data= 0 1 2 3 4 5 6 7
- *-------------------------------------------------------------------------
- */
-
- for( i=0; i<NRECORDS; i++)
- {
- wbufd[i].lati = wbuf[i].lati;
- wbufd[i].longi = wbuf[i].longi;
- wbufd[i].pressure = wbuf[i].pressure;
- wbufd[i].temperature = wbuf[i].temperature;
- strcpy(wbufd[i].name, wbuf[i].name );
-
- }
-
-
- if (H5TBmake_table(TITLE,fid,"table3",FIELDS,RECORDS,type_size_mem,
- field_names,field_offset,field_type,
- chunk_size,fill,compress,wbufd)<0)
- goto out;
+ PASSED();
+ }
-/*-------------------------------------------------------------------------
- * Delete records, start at 2, delete 3
- * pos = 0 1 2 3 4
- * data= 0 1 5 6 7
- *-------------------------------------------------------------------------
- */
- dstart=2; drecords=3;
- if (H5TBdelete_record(fid,"table3",dstart,drecords)<0)
- goto out;
-
- if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0)
- goto out;
-
- rstart=0;
- if (H5TBread_records(fid,"table3",rstart,rrecords,type_size_mem,field_offset,
- field_size,rbuf)<0)
- goto out;
-
- /* Compare */
- nrecords=NRECORDS;
- assert(rrecords == nrecords-drecords);
- if (compare_deleted(rrecords,dstart,drecords,rbuf,wbufd)<0)
- goto out;
-/*-------------------------------------------------------------------------
- * reset compare buffer
- *-------------------------------------------------------------------------
- */
- nrecords=rrecords;
- for( i=0; i<nrecords; i++)
- wbufd[i] = rbuf[i];
+ /*-------------------------------------------------------------------------
+ *
+ * Functions tested:
+ *
+ * H5TBwrite_fields_name
+ *
+ *-------------------------------------------------------------------------
+ */
+ if (do_write)
+ {
+ TESTING2("writing fields by name");
+
+ /* make an empty table with fill values */
+ if (H5TBmake_table(TITLE,fid,"table9",FIELDS,RECORDS,type_size_mem,
+ field_names,field_offset,field_type,
+ chunk_size,fill1,compress,0)<0)
+ goto out;
+
+ /* write the pressure field starting at record 2 */
+ start = 2;
+ nrecords = NRECORDS_ADD;
+ if (H5TBwrite_fields_name(fid,"table9","Pressure",start,nrecords,sizeof(float),
+ 0,field_sizes_pre,pressure_in)<0)
+ goto out;
+
+ /* write the new longitude and latitude information starting at record 2 */
+ start = 2;
+ nrecords = 3;
+ if (H5TBwrite_fields_name(fid,"table9","Latitude,Longitude",start,nrecords,sizeof(position_t),
+ field_offset_pos,field_sizes_pos,position_in)<0)
+ goto out;
+
+ /* read back the all table */
+ start = 0;
+ nrecords = NRECORDS;
+ if (H5TBread_table(fid,"table9",type_size_mem,field_offset,field_size,rbuf)<0)
+ goto out;
+
+ {
+
+
+ /* compare the read values with the initial values */
+ for( i = 0; i < NRECORDS; i++ )
+ {
+ if ( i >= 2 && i <= 4 )
+ {
+ if ( rbuf[i].lati != position_in[i-NRECORDS_ADD+1].lati ||
+ rbuf[i].longi != position_in[i-NRECORDS_ADD+1].longi ||
+ rbuf[i].pressure != pressure_in[i-NRECORDS_ADD+1] )
+ {
+ fprintf(stderr,"%ld %f %d\n",
+ rbuf[i].longi,rbuf[i].pressure,rbuf[i].lati);
+ fprintf(stderr,"%ld %f %d\n",
+ position_in[i].longi,pressure_in[i],position_in[i].lati);
+ goto out;
+ }
+ }
+ }
+ }
+
+
+
+ PASSED();
+ } /*write*/
+
+ /*-------------------------------------------------------------------------
+ *
+ * Functions tested:
+ *
+ * H5TBread_fields_name
+ *
+ *-------------------------------------------------------------------------
+ */
+ TESTING2("reading fields by name");
+
+ /*-------------------------------------------------------------------------
+ * write and read the "Pressure" field
+ *-------------------------------------------------------------------------
+ */
+ if (do_write)
+ {
+ if (H5TBmake_table(TITLE,fid,"table10",FIELDS,RECORDS,type_size_mem,
+ field_names,field_offset,field_type,
+ chunk_size,fill1,compress,0)<0)
+ goto out;
+
+ /* write the pressure field to all the records */
+ start = 0;
+ nrecords = NRECORDS;
+ if ( H5TBwrite_fields_name(fid,"table10","Pressure",start,nrecords,
+ sizeof( float ),0,field_sizes_pre,pressure_in)<0)
+ goto out;
+ }
-/*-------------------------------------------------------------------------
- * Delete records, start at 0, delete 2
- * pos = 0 1 2
- * data= 5 6 7
- *-------------------------------------------------------------------------
- */
- dstart=0; drecords=2;
- if (H5TBdelete_record(fid,"table3",dstart,drecords)<0)
- goto out;
-
- if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0)
- goto out;
-
- rstart=0;
- if (H5TBread_records(fid,"table3",rstart,rrecords,type_size_mem,field_offset,
- field_size,rbuf)<0)
- goto out;
-
- /* Compare */
- assert(rrecords == nrecords-drecords);
- if (compare_deleted(rrecords,dstart,drecords,rbuf,wbufd)<0)
- goto out;
+ /* read the "Pressure" field */
+ start = 0;
+ nrecords = NRECORDS;
+ if ( H5TBread_fields_name(fid,"table10","Pressure",start,nrecords,
+ sizeof(float),0,field_sizes_pre,pressure_out)<0)
+ goto out;
-/*-------------------------------------------------------------------------
- * reset compare buffer
- *-------------------------------------------------------------------------
- */
- nrecords=rrecords;
- for( i=0; i<nrecords; i++)
- wbufd[i] = rbuf[i];
-/*-------------------------------------------------------------------------
- * Delete records, start at 1, delete 1
- * pos = 0 1
- * data= 5 7
- *-------------------------------------------------------------------------
- */
- dstart=1; drecords=1;
- if (H5TBdelete_record(fid,"table3",dstart,drecords)<0)
- goto out;
-
- if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0)
- goto out;
-
- rstart=0;
- if (H5TBread_records(fid,"table3",rstart,rrecords,type_size_mem,field_offset,
- field_size,rbuf)<0)
- goto out;
-
- /* Compare */
- assert(rrecords == nrecords-drecords);
- if (compare_deleted(rrecords,dstart,drecords,rbuf,wbufd)<0)
- goto out;
+ /* Compare the extracted table with the initial values */
+ for( i = 0; i < NRECORDS; i++ )
+ {
+ if ( pressure_out[i] != pressure_in[i] ) {
+ goto out;
+ }
+ }
-/*-------------------------------------------------------------------------
- * reset compare buffer
- *-------------------------------------------------------------------------
- */
- nrecords=rrecords;
- for( i=0; i<nrecords; i++)
- wbufd[i] = rbuf[i];
+ /*-------------------------------------------------------------------------
+ * Write and read the "Latitude,Longitude" fields
+ *-------------------------------------------------------------------------
+ */
+ if (do_write)
+ {
+ /* Write the new longitude and latitude information to all the records */
+ start = 0;
+ nrecords = NRECORDS_ADD;
+ if ( H5TBwrite_fields_name(fid,"table10", "Latitude,Longitude", start, nrecords,
+ sizeof( position_t ), field_offset_pos, field_sizes_pos, position_in ) < 0 )
+ goto out;
+ }/*write*/
+
+ /* Read the "Latitude,Longitude" fields */
+ start = 0;
+ nrecords = NRECORDS_ADD;
+ if ( H5TBread_fields_name( fid, "table10", "Latitude,Longitude",
+ start, nrecords, sizeof(position_t), field_offset_pos, field_sizes_pos, position_out ) < 0 )
+ goto out;
+
+
+ /* Compare the extracted table with the initial values */
+ for( i = 0; i < NRECORDS_ADD; i++ )
+ {
+ if ( position_out[i].lati != position_in[i].lati ||
+ position_out[i].longi != position_in[i].longi )
+ goto out;
+ }
-/*-------------------------------------------------------------------------
- * Delete records, start at 0, delete 1
- * pos = 0
- * data= 7
- *-------------------------------------------------------------------------
- */
- dstart=0; drecords=1;
- if (H5TBdelete_record(fid,"table3",dstart,drecords)<0)
- goto out;
-
- if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0)
- goto out;
-
- rstart=0;
- if (H5TBread_records(fid,"table3",rstart,rrecords,type_size_mem,field_offset,
- field_size,rbuf)<0)
- goto out;
-
- /* Compare */
- assert(rrecords == nrecords-drecords);
- if (compare_deleted(rrecords,dstart,drecords,rbuf,wbufd)<0)
- goto out;
-/*-------------------------------------------------------------------------
- * reset compare buffer
- *-------------------------------------------------------------------------
- */
- nrecords=rrecords;
- for( i=0; i<nrecords; i++)
- wbufd[i] = rbuf[i];
-
- /* Read complete table */
- if (H5TBread_table(fid,"table3",type_size_mem,field_offset,field_size,rbuf)<0)
- goto out;
-
- /* Compare */
- for( i=0; i<rrecords; i++)
- {
- if (cmp_par(i,i,rbuf,wbufd)<0)
- goto out;
- }
-
- PASSED();
- }
+ /*-------------------------------------------------------------------------
+ * Write and read the "Name,Pressure" fields
+ *-------------------------------------------------------------------------
+ */
+ if (do_write)
+ {
+ /* Write the new name and pressure information to all the records */
+ start = 0;
+ nrecords = NRECORDS;
+ if ( H5TBwrite_fields_name( fid, "table10", "Name,Pressure", start, nrecords,
+ sizeof( namepressure_t ), field_offset_namepre, field_sizes_namepre, namepre_in ) < 0 )
+ goto out;
+ }/*write*/
+
+ /* Read the "Name,Pressure" fields */
+ start = 0;
+ nrecords = NRECORDS;
+ if ( H5TBread_fields_name( fid, "table10", "Name,Pressure",
+ start, nrecords, sizeof(namepressure_t), field_offset_namepre, field_sizes_namepre,
+ namepre_out ) < 0 )
+ goto out;
+
+
+ /* Compare the extracted table with the initial values */
+ for( i = 0; i < NRECORDS; i++ )
+ {
+ if ( ( strcmp( namepre_out[i].name, namepre_in[i].name ) != 0 ) ||
+ namepre_out[i].pressure != namepre_in[i].pressure ) {
+ goto out;
+ }
+ }
-/*-------------------------------------------------------------------------
- *
- * Functions tested:
- *
- * H5TBadd_records_from
- * H5TBread_records
- *
- *-------------------------------------------------------------------------
- */
-
- if (write)
- {
- TESTING2("adding records");
-
- /* create 2 tables */
- if (H5TBmake_table(TITLE,fid,"table4",FIELDS,RECORDS,type_size_mem,
- field_names,field_offset,field_type,
- chunk_size,fill,compress,wbuf)<0)
- goto out;
- if (H5TBmake_table(TITLE,fid,"table5",FIELDS,RECORDS,type_size_mem,
- field_names,field_offset,field_type,
- chunk_size,fill,compress,wbuf)<0)
- goto out;
+ /* reset buffer */
+ for( i = 0; i < NRECORDS; i++ )
+ {
+ strcpy( namepre_out[i].name, "\0" );
+ namepre_out[i].pressure = -1;
+ }
- /* add the records from "table4" to "table5" */
- start1 = 3;
- nrecords = 2;
- start2 = 6;
- if ( H5TBadd_records_from(fid,"table4",start1,nrecords,"table5",start2)<0)
- goto out;
-
- /* read final table */
- if (H5TBread_table(fid,"table5",type_size_mem,field_offset,field_size,rbuf)<0)
- goto out;
-
- /* compare */
- for( i = 0; i < NRECORDS+2; i++ )
- {
- if ( i < start2 )
- {
- if (cmp_par(i,i,rbuf,wbuf)<0)
- goto out;
- }
- else if ( i < (int)start2+(int)nrecords )
- {
- j = i-(int)start1;
- if (cmp_par(i,j,rbuf,wbuf)<0)
- goto out;
- }
- else
- {
- j = i-(int)nrecords;
- if (cmp_par(i,j,rbuf,wbuf)<0)
- goto out;
- }
- }
-
- PASSED();
- }
+ /*-------------------------------------------------------------------------
+ * read only 3 records of the "Name,Pressure" fields, starting at record 2
+ *-------------------------------------------------------------------------
+ */
+ start = 2;
+ nrecords = 3;
+ if ( H5TBread_fields_name( fid, "table10", "Name,Pressure",
+ start, nrecords, sizeof(namepressure_t), field_offset_namepre,
+ field_sizes_namepre, namepre_out ) < 0 )
+ goto out;
-/*-------------------------------------------------------------------------
- *
- * Functions tested:
- *
- * H5TBcombine_tables
- * H5TBread_table
- *
- *-------------------------------------------------------------------------
- */
-
- if (write)
- {
- TESTING2("combining tables");
-
- /* create 2 tables */
- if (H5TBmake_table(TITLE,fid,"table6",FIELDS,RECORDS,type_size_mem,
- field_names,field_offset,field_type,
- chunk_size,fill,compress,wbuf)<0)
- goto out;
- if (H5TBmake_table(TITLE,fid,"table7",FIELDS,RECORDS,type_size_mem,
- field_names,field_offset,field_type,
- chunk_size,fill,compress,wbuf)<0)
- goto out;
- /* combine the two tables into a third */
- if ( H5TBcombine_tables(fid,"table6",fid,"table7","table8")<0)
- goto out;
-
- /* read merged table */
- if (H5TBread_table(fid,"table8",type_size_mem,field_offset,field_size,rbufc)<0)
- goto out;
-
- /* compare */
- for( i = 0; i < NRECORDS*2; i++ )
- {
- if ( i < NRECORDS )
- {
- if (cmp_par(i,i,rbufc,wbuf)<0)
- goto out;
- }
- else
- {
- if (cmp_par(i,i-NRECORDS,rbufc,wbuf)<0)
- goto out;
- }
- }
+ /* Compare the extracted table with the initial values */
+ for( i = 0; i < 3; i++ )
+ {
+ hsize_t iistart = start;
+ if ( ( strcmp( namepre_out[i].name, namepre_in[iistart+i].name ) != 0 ) ||
+ namepre_out[i].pressure != namepre_in[iistart+i].pressure ) {
+ goto out;
+ }
+ }
-/*-------------------------------------------------------------------------
- * multi file test
- *-------------------------------------------------------------------------
- */
-
- /* create 2 files using default properties. */
- fid1 = H5Fcreate("combine_tables1.h5",H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT);
- fid2 = H5Fcreate("combine_tables2.h5",H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT);
-
- /* create 2 tables, one in each file */
- if (H5TBmake_table(TITLE,fid1,"table1",FIELDS,RECORDS,type_size_mem,
- field_names,field_offset,field_type,
- chunk_size,fill,compress,wbuf)<0)
- goto out;
- if (H5TBmake_table(TITLE,fid2,"table2",FIELDS,RECORDS,type_size_mem,
- field_names,field_offset,field_type,
- chunk_size,fill,compress,wbuf)<0)
- goto out;
- /* combine the two tables into a third */
- if ( H5TBcombine_tables(fid1,"table1",fid2,"table2","table3")<0)
- goto out;
-
- /* read merged table */
- if (H5TBread_table(fid1,"table3",type_size_mem,field_offset,field_size,rbufc)<0)
- goto out;
-
- /* compare */
- for( i = 0; i < NRECORDS*2; i++ )
- {
- if ( i < NRECORDS )
- {
- if (cmp_par(i,i,rbufc,wbuf)<0)
- goto out;
- }
- else
- {
- if (cmp_par(i,i-NRECORDS,rbufc,wbuf)<0)
- goto out;
- }
- }
-
- /* close files */
- H5Fclose(fid1);
- H5Fclose(fid2);
-
- PASSED();
- }
+ PASSED();
-/*-------------------------------------------------------------------------
- *
- * Functions tested:
- *
- * H5TBwrite_fields_name
- *
- *-------------------------------------------------------------------------
- */
- if (write)
- {
- TESTING2("writing fields by name");
-
- /* make an empty table with fill values */
- if (H5TBmake_table(TITLE,fid,"table9",FIELDS,RECORDS,type_size_mem,
- field_names,field_offset,field_type,
- chunk_size,fill1,compress,0)<0)
+ /*-------------------------------------------------------------------------
+ *
+ * Functions tested:
+ *
+ * H5TBwrite_fields_index
+ *
+ *-------------------------------------------------------------------------
+ */
+ if (do_write)
+ {
+ TESTING2("writing fields by index");
+
+ /* make an empty table */
+ if (H5TBmake_table(TITLE,fid,"table11",FIELDS,RECORDS,type_size_mem,
+ field_names,field_offset,field_type,
+ chunk_size,fill,compress,NULL)<0)
+ goto out;
+
+ /* write the pressure field starting at record 2 */
+ nfields = 1;
+ start = 2;
+ nrecords = NRECORDS_ADD;
+ if ( H5TBwrite_fields_index(fid, "table11", nfields, field_index_pre, start, nrecords,
+ sizeof( float ), 0, field_sizes_pre, pressure_in ) < 0 )
+ goto out;
+
+
+ /* write the new longitude and latitude information starting at record 2 */
+ nfields = 2;
+ start = 2;
+ nrecords = NRECORDS_ADD;
+ if ( H5TBwrite_fields_index(fid, "table11", nfields, field_index_pos, start, nrecords,
+ sizeof( position_t ), field_offset_pos, field_sizes_pos, position_in ) < 0 )
+ goto out;
+
+ /* read back the all table */
+ nfields = 5;
+ start = 0;
+ nrecords = NRECORDS;
+ if ( H5TBread_fields_index(fid, "table11", nfields, field_index,
+ start, nrecords, type_size_mem, field_offset, field_size, rbuf ) < 0 )
+ goto out;
+
+ /* Compare the extracted table with the initial values */
+ for( i = 0; i < NRECORDS; i++ )
+ {
+ if ( i >= 2 && i <= 4 )
+ {
+ if ( rbuf[i].lati != position_in[i-NRECORDS_ADD+1].lati ||
+ rbuf[i].longi != position_in[i-NRECORDS_ADD+1].longi ||
+ rbuf[i].pressure != pressure_in[i-NRECORDS_ADD+1] )
goto out;
+ }
+ }
- /* write the pressure field starting at record 2 */
- start = 2;
- nrecords = NRECORDS_ADD;
- if (H5TBwrite_fields_name(fid,"table9","Pressure",start,nrecords,sizeof(float),
- 0,field_sizes_pre,pressure_in)<0)
- goto out;
-
- /* write the new longitude and latitude information starting at record 2 */
- start = 2;
- nrecords = 3;
- if (H5TBwrite_fields_name(fid,"table9","Latitude,Longitude",start,nrecords,sizeof(position_t),
- field_offset_pos,field_sizes_pos,position_in)<0)
- goto out;
-
- /* read back the all table */
- start = 0;
- nrecords = NRECORDS;
- if (H5TBread_table(fid,"table9",type_size_mem,field_offset,field_size,rbuf)<0)
- goto out;
-
- {
-
-
- /* compare the read values with the initial values */
- for( i = 0; i < NRECORDS; i++ )
- {
- if ( i >= 2 && i <= 4 )
- {
- if ( rbuf[i].lati != position_in[i-NRECORDS_ADD+1].lati ||
- rbuf[i].longi != position_in[i-NRECORDS_ADD+1].longi ||
- rbuf[i].pressure != pressure_in[i-NRECORDS_ADD+1] )
- {
- fprintf(stderr,"%ld %f %d\n",
- rbuf[i].longi,rbuf[i].pressure,rbuf[i].lati);
- fprintf(stderr,"%ld %f %d\n",
- position_in[i].longi,pressure_in[i],position_in[i].lati);
- goto out;
- }
+ PASSED();
}
- }
- }
+ /*-------------------------------------------------------------------------
+ *
+ * Functions tested:
+ *
+ * H5TBread_fields_index
+ *
+ *-------------------------------------------------------------------------
+ */
- PASSED();
- } /*write*/
+ TESTING2("reading fields by index");
-/*-------------------------------------------------------------------------
- *
- * Functions tested:
- *
- * H5TBread_fields_name
- *
- *-------------------------------------------------------------------------
- */
- TESTING2("reading fields by name");
-
-/*-------------------------------------------------------------------------
- * write and read the "Pressure" field
- *-------------------------------------------------------------------------
- */
- if (write)
- {
- if (H5TBmake_table(TITLE,fid,"table10",FIELDS,RECORDS,type_size_mem,
- field_names,field_offset,field_type,
- chunk_size,fill1,compress,0)<0)
- goto out;
-
- /* write the pressure field to all the records */
- start = 0;
- nrecords = NRECORDS;
- if ( H5TBwrite_fields_name(fid,"table10","Pressure",start,nrecords,
- sizeof( float ),0,field_sizes_pre,pressure_in)<0)
- goto out;
- }
-
- /* read the "Pressure" field */
- start = 0;
- nrecords = NRECORDS;
- if ( H5TBread_fields_name(fid,"table10","Pressure",start,nrecords,
- sizeof(float),0,field_sizes_pre,pressure_out)<0)
- goto out;
-
-
- /* Compare the extracted table with the initial values */
- for( i = 0; i < NRECORDS; i++ )
- {
- if ( pressure_out[i] != pressure_in[i] ) {
- goto out;
- }
- }
-
-/*-------------------------------------------------------------------------
- * Write and read the "Latitude,Longitude" fields
- *-------------------------------------------------------------------------
- */
- if (write)
- {
- /* Write the new longitude and latitude information to all the records */
- start = 0;
- nrecords = NRECORDS_ADD;
- if ( H5TBwrite_fields_name(fid,"table10", "Latitude,Longitude", start, nrecords,
- sizeof( position_t ), field_offset_pos, field_sizes_pos, position_in ) < 0 )
- goto out;
- }/*write*/
-
- /* Read the "Latitude,Longitude" fields */
- start = 0;
- nrecords = NRECORDS_ADD;
- if ( H5TBread_fields_name( fid, "table10", "Latitude,Longitude",
- start, nrecords, sizeof(position_t), field_offset_pos, field_sizes_pos, position_out ) < 0 )
- goto out;
-
-
- /* Compare the extracted table with the initial values */
- for( i = 0; i < NRECORDS_ADD; i++ )
- {
- if ( position_out[i].lati != position_in[i].lati ||
- position_out[i].longi != position_in[i].longi )
- goto out;
- }
+ if (do_write)
+ {
+ /* make an empty table */
+ if (H5TBmake_table(TITLE,fid,"table12",FIELDS,RECORDS,type_size_mem,
+ field_names,field_offset,field_type,
+ chunk_size,fill,compress,NULL)<0)
+ goto out;
+
+ /*-------------------------------------------------------------------------
+ * write and read the "Pressure" field
+ *-------------------------------------------------------------------------
+ */
+
+ /* write the pressure field to all the records */
+ nfields = 1;
+ start = 0;
+ nrecords = NRECORDS;
+ if ( H5TBwrite_fields_index(fid, "table12", nfields, field_index_pre, start, nrecords,
+ sizeof( float ), 0, field_sizes_pre, pressure_in ) < 0 )
+ goto out;
+ }
+ /* read the "Pressure" field */
+ nfields = 1;
+ start = 0;
+ nrecords = NRECORDS;
+ if ( H5TBread_fields_index(fid, "table12", nfields, field_index_pre,
+ start, nrecords, sizeof(float), 0, field_sizes_pre, pressure_out ) < 0 )
+ goto out;
-/*-------------------------------------------------------------------------
- * Write and read the "Name,Pressure" fields
- *-------------------------------------------------------------------------
- */
- if (write)
- {
- /* Write the new name and pressure information to all the records */
- start = 0;
- nrecords = NRECORDS;
- if ( H5TBwrite_fields_name( fid, "table10", "Name,Pressure", start, nrecords,
- sizeof( namepressure_t ), field_offset_namepre, field_sizes_namepre, namepre_in ) < 0 )
- goto out;
- }/*write*/
-
- /* Read the "Name,Pressure" fields */
- start = 0;
- nrecords = NRECORDS;
- if ( H5TBread_fields_name( fid, "table10", "Name,Pressure",
- start, nrecords, sizeof(namepressure_t), field_offset_namepre, field_sizes_namepre,
- namepre_out ) < 0 )
- goto out;
-
-
- /* Compare the extracted table with the initial values */
- for( i = 0; i < NRECORDS; i++ )
- {
- if ( ( strcmp( namepre_out[i].name, namepre_in[i].name ) != 0 ) ||
- namepre_out[i].pressure != namepre_in[i].pressure ) {
- goto out;
- }
- }
-
- /* reset buffer */
- for( i = 0; i < NRECORDS; i++ )
- {
- strcpy( namepre_out[i].name, "\0" );
- namepre_out[i].pressure = -1;
- }
+ /* compare the extracted table with the initial values */
+ for( i = 0; i < NRECORDS; i++ )
+ {
+ if ( pressure_out[i] != pressure_in[i] ) {
+ goto out;
+ }
+ }
-/*-------------------------------------------------------------------------
- * read only 3 records of the "Name,Pressure" fields, starting at record 2
- *-------------------------------------------------------------------------
- */
- start = 2;
- nrecords = 3;
- if ( H5TBread_fields_name( fid, "table10", "Name,Pressure",
- start, nrecords, sizeof(namepressure_t), field_offset_namepre,
- field_sizes_namepre, namepre_out ) < 0 )
- goto out;
-
-
- /* Compare the extracted table with the initial values */
- for( i = 0; i < 3; i++ )
- {
- int iistart = (int) start;
- if ( ( strcmp( namepre_out[i].name, namepre_in[iistart+i].name ) != 0 ) ||
- namepre_out[i].pressure != namepre_in[iistart+i].pressure ) {
- goto out;
- }
- }
-
-
-
- PASSED();
+ /*-------------------------------------------------------------------------
+ * write and read the "Latitude,Longitude" fields
+ *-------------------------------------------------------------------------
+ */
+ if (do_write)
+ {
+ /* write the new longitude and latitude information to all the records */
+ nfields = 2;
+ start = 0;
+ nrecords = NRECORDS;
+ if ( H5TBwrite_fields_index(fid, "table12", nfields, field_index_pos, start, nrecords,
+ sizeof( position_t ), field_offset_pos, field_sizes_pos, position_in ) < 0 )
+ goto out;
+ } /*write*/
+
+ /* read the "Latitude,Longitude" fields */
+ nfields = 2;
+ start = 0;
+ nrecords = NRECORDS_ADD;
+ if ( H5TBread_fields_index(fid, "table12", nfields, field_index_pos,
+ start, nrecords, sizeof(position_t), field_offset_pos, field_sizes_pos, position_out ) < 0 )
+ goto out;
+
+ /* compare the extracted table with the initial values */
+ for( i = 0; i < NRECORDS_ADD; i++ )
+ {
+ if ( position_out[i].lati != position_in[i].lati ||
+ position_out[i].longi != position_in[i].longi ) {
+ goto out;
+ }
+ }
-/*-------------------------------------------------------------------------
- *
- * Functions tested:
- *
- * H5TBwrite_fields_index
- *
- *-------------------------------------------------------------------------
- */
- if (write)
- {
- TESTING2("writing fields by index");
-
- /* make an empty table */
- if (H5TBmake_table(TITLE,fid,"table11",FIELDS,RECORDS,type_size_mem,
- field_names,field_offset,field_type,
- chunk_size,fill,compress,NULL)<0)
- goto out;
+ /*-------------------------------------------------------------------------
+ * write and read the "Name,Pressure" fields
+ *-------------------------------------------------------------------------
+ */
- /* write the pressure field starting at record 2 */
- nfields = 1;
- start = 2;
- nrecords = NRECORDS_ADD;
- if ( H5TBwrite_fields_index(fid, "table11", nfields, field_index_pre, start, nrecords,
- sizeof( float ), 0, field_sizes_pre, pressure_in ) < 0 )
- goto out;
-
-
- /* write the new longitude and latitude information starting at record 2 */
- nfields = 2;
- start = 2;
- nrecords = NRECORDS_ADD;
- if ( H5TBwrite_fields_index(fid, "table11", nfields, field_index_pos, start, nrecords,
- sizeof( position_t ), field_offset_pos, field_sizes_pos, position_in ) < 0 )
- goto out;
-
- /* read back the all table */
- nfields = 5;
- start = 0;
- nrecords = NRECORDS;
- if ( H5TBread_fields_index(fid, "table11", nfields, field_index,
- start, nrecords, type_size_mem, field_offset, field_size, rbuf ) < 0 )
- goto out;
-
- /* Compare the extracted table with the initial values */
- for( i = 0; i < NRECORDS; i++ )
- {
- if ( i >= 2 && i <= 4 )
- {
- if ( rbuf[i].lati != position_in[i-NRECORDS_ADD+1].lati ||
- rbuf[i].longi != position_in[i-NRECORDS_ADD+1].longi ||
- rbuf[i].pressure != pressure_in[i-NRECORDS_ADD+1] )
- goto out;
- }
- }
-
- PASSED();
- }
+ if (do_write)
+ {
+ /* write the new name and pressure information to all the records */
+ nfields = 2;
+ start = 0;
+ nrecords = NRECORDS;
+ if ( H5TBwrite_fields_index(fid, "table12", nfields, field_index_namepre, start, nrecords,
+ sizeof( namepressure_t ), field_offset_namepre, field_sizes_namepre, namepre_in ) < 0 )
+ goto out;
+ }
+ /* read the "Name,Pressure" fields */
+ nfields = 2;
+ start = 0;
+ nrecords = NRECORDS;
+ if ( H5TBread_fields_index(fid, "table12", nfields, field_index_namepre,
+ start, nrecords, sizeof(namepressure_t), field_offset_namepre,
+ field_sizes_namepre, namepre_out ) < 0 )
+ goto out;
+
+ /* compare the extracted table with the initial values */
+ for( i = 0; i < NRECORDS; i++ )
+ {
+ if ( ( strcmp( namepre_out[i].name, namepre_in[i].name ) != 0 ) ||
+ namepre_out[i].pressure != namepre_in[i].pressure ) {
+ goto out;
+ }
+ }
-/*-------------------------------------------------------------------------
- *
- * Functions tested:
- *
- * H5TBread_fields_index
- *
- *-------------------------------------------------------------------------
- */
-
- TESTING2("reading fields by index");
-
- if (write)
- {
- /* make an empty table */
- if (H5TBmake_table(TITLE,fid,"table12",FIELDS,RECORDS,type_size_mem,
- field_names,field_offset,field_type,
- chunk_size,fill,compress,NULL)<0)
- goto out;
+ /* reset buffer */
+ for( i = 0; i < NRECORDS; i++ )
+ {
+ strcpy( namepre_out[i].name, "\0" );
+ namepre_out[i].pressure = -1;
+ }
-/*-------------------------------------------------------------------------
- * write and read the "Pressure" field
- *-------------------------------------------------------------------------
- */
-
- /* write the pressure field to all the records */
- nfields = 1;
- start = 0;
- nrecords = NRECORDS;
- if ( H5TBwrite_fields_index(fid, "table12", nfields, field_index_pre, start, nrecords,
- sizeof( float ), 0, field_sizes_pre, pressure_in ) < 0 )
- goto out;
- }
-
- /* read the "Pressure" field */
- nfields = 1;
- start = 0;
- nrecords = NRECORDS;
- if ( H5TBread_fields_index(fid, "table12", nfields, field_index_pre,
- start, nrecords, sizeof(float), 0, field_sizes_pre, pressure_out ) < 0 )
- goto out;
-
- /* compare the extracted table with the initial values */
- for( i = 0; i < NRECORDS; i++ )
- {
- if ( pressure_out[i] != pressure_in[i] ) {
- goto out;
- }
- }
+ /*-------------------------------------------------------------------------
+ * read only 3 records of the "Name,Pressure" fields, starting at record 2
+ *-------------------------------------------------------------------------
+ */
+
+ /* write the new name and pressure information to all the records */
+ nfields = 2;
+ start = 2;
+ nrecords = 3;
+ if ( H5TBread_fields_index(fid, "table12", nfields, field_index_namepre,
+ start, nrecords, sizeof(namepressure_t), field_offset_namepre,
+ field_sizes_namepre, namepre_out ) < 0 )
+ goto out;
+
+ /* compare the extracted table with the initial values */
+ for( i = 0; i < 3; i++ )
+ {
+ int iistart = (int) start;
+ if ( ( strcmp( namepre_out[i].name, wbuf[iistart+i].name ) != 0 ) ||
+ namepre_out[i].pressure != wbuf[iistart+i].pressure ) {
+ goto out;
+ }
+ }
-/*-------------------------------------------------------------------------
- * write and read the "Latitude,Longitude" fields
- *-------------------------------------------------------------------------
- */
- if (write)
- {
- /* write the new longitude and latitude information to all the records */
- nfields = 2;
- start = 0;
- nrecords = NRECORDS;
- if ( H5TBwrite_fields_index(fid, "table12", nfields, field_index_pos, start, nrecords,
- sizeof( position_t ), field_offset_pos, field_sizes_pos, position_in ) < 0 )
- goto out;
- } /*write*/
-
- /* read the "Latitude,Longitude" fields */
- nfields = 2;
- start = 0;
- nrecords = NRECORDS_ADD;
- if ( H5TBread_fields_index(fid, "table12", nfields, field_index_pos,
- start, nrecords, sizeof(position_t), field_offset_pos, field_sizes_pos, position_out ) < 0 )
- goto out;
-
- /* compare the extracted table with the initial values */
- for( i = 0; i < NRECORDS_ADD; i++ )
- {
- if ( position_out[i].lati != position_in[i].lati ||
- position_out[i].longi != position_in[i].longi ) {
- goto out;
- }
- }
+ PASSED();
-/*-------------------------------------------------------------------------
- * write and read the "Name,Pressure" fields
- *-------------------------------------------------------------------------
- */
-
- if (write)
- {
- /* write the new name and pressure information to all the records */
- nfields = 2;
- start = 0;
- nrecords = NRECORDS;
- if ( H5TBwrite_fields_index(fid, "table12", nfields, field_index_namepre, start, nrecords,
- sizeof( namepressure_t ), field_offset_namepre, field_sizes_namepre, namepre_in ) < 0 )
- goto out;
- }
-
- /* read the "Name,Pressure" fields */
- nfields = 2;
- start = 0;
- nrecords = NRECORDS;
- if ( H5TBread_fields_index(fid, "table12", nfields, field_index_namepre,
- start, nrecords, sizeof(namepressure_t), field_offset_namepre,
- field_sizes_namepre, namepre_out ) < 0 )
- goto out;
-
- /* compare the extracted table with the initial values */
- for( i = 0; i < NRECORDS; i++ )
- {
- if ( ( strcmp( namepre_out[i].name, namepre_in[i].name ) != 0 ) ||
- namepre_out[i].pressure != namepre_in[i].pressure ) {
- goto out;
- }
- }
-
- /* reset buffer */
- for( i = 0; i < NRECORDS; i++ )
- {
- strcpy( namepre_out[i].name, "\0" );
- namepre_out[i].pressure = -1;
- }
-/*-------------------------------------------------------------------------
- * read only 3 records of the "Name,Pressure" fields, starting at record 2
- *-------------------------------------------------------------------------
- */
-
- /* write the new name and pressure information to all the records */
- nfields = 2;
- start = 2;
- nrecords = 3;
- if ( H5TBread_fields_index(fid, "table12", nfields, field_index_namepre,
- start, nrecords, sizeof(namepressure_t), field_offset_namepre,
- field_sizes_namepre, namepre_out ) < 0 )
- goto out;
-
- /* compare the extracted table with the initial values */
- for( i = 0; i < 3; i++ )
- {
- int iistart = (int) start;
- if ( ( strcmp( namepre_out[i].name, wbuf[iistart+i].name ) != 0 ) ||
- namepre_out[i].pressure != wbuf[iistart+i].pressure ) {
- goto out;
- }
- }
-
- PASSED();
+ /*-------------------------------------------------------------------------
+ *
+ * Functions tested:
+ *
+ * H5TBinsert_field
+ *
+ *-------------------------------------------------------------------------
+ */
+ if (do_write)
+ {
+ TESTING2("inserting fields");
+
+ /* make a table */
+ if (H5TBmake_table(TITLE,fid,"table13",FIELDS,RECORDS,type_size_mem,
+ field_names,field_offset,field_type,
+ chunk_size,fill1,compress,wbuf)<0)
+ goto out;
+
+ /* insert the new field at the end of the field list */
+ position = NFIELDS;
+ if ( H5TBinsert_field( fid, "table13", "New Field", field_type_new, position,
+ fill1_new, buf_new ) < 0 )
+ goto out;
+
+ /* read the table */
+ if ( H5TBread_table( fid, "table13", dst_size2, dst_offset2, dst_sizes2, rbuf2 ) < 0 )
+ goto out;
+
+ /* compare the extracted table with the original array */
+ for( i = 0; i < NRECORDS; i++ )
+ {
+ if ( ( strcmp( rbuf2[i].name, wbuf[i].name ) != 0 ) ||
+ rbuf2[i].lati != wbuf[i].lati ||
+ rbuf2[i].longi != wbuf[i].longi ||
+ rbuf2[i].pressure != wbuf[i].pressure ||
+ rbuf2[i].temperature != wbuf[i].temperature ||
+ rbuf2[i].new_field != buf_new[i] ) {
+ goto out;
+ }
+ }
+ PASSED();
+ }
-/*-------------------------------------------------------------------------
- *
- * Functions tested:
- *
- * H5TBinsert_field
- *
- *-------------------------------------------------------------------------
- */
-
- if (write)
- {
- TESTING2("inserting fields");
-
- /* make a table */
- if (H5TBmake_table(TITLE,fid,"table13",FIELDS,RECORDS,type_size_mem,
- field_names,field_offset,field_type,
- chunk_size,fill1,compress,wbuf)<0)
+ /*-------------------------------------------------------------------------
+ *
+ * Functions tested:
+ *
+ * H5TBdelete_field
+ *
+ *-------------------------------------------------------------------------
+ */
+ if (do_write)
+ {
+ TESTING2("deleting fields");
+
+ /* make a table */
+ if (H5TBmake_table(TITLE,fid,"table14",FIELDS,RECORDS,type_size_mem,
+ field_names,field_offset,field_type,
+ chunk_size,fill,compress,wbuf)<0)
+ goto out;
+
+ /* delete the field */
+ if ( H5TBdelete_field(fid, "table14", "Pressure" ) < 0 )
+ goto out;
+
+ /* read the table */
+ if ( H5TBread_table(fid, "table14", dst_size3, dst_offset3, dst_sizes3, rbuf3 ) < 0 )
+ goto out;
+
+ /* compare the extracted table with the original array */
+ for( i = 0; i < NRECORDS; i++ )
+ {
+ if ( ( strcmp( rbuf3[i].name, wbuf[i].name ) != 0 ) ||
+ rbuf3[i].lati != wbuf[i].lati ||
+ rbuf3[i].longi != wbuf[i].longi ||
+ rbuf3[i].temperature != wbuf[i].temperature ) {
goto out;
+ }
+ }
- /* insert the new field at the end of the field list */
- position = NFIELDS;
- if ( H5TBinsert_field( fid, "table13", "New Field", field_type_new, position,
- fill1_new, buf_new ) < 0 )
- goto out;
-
- /* read the table */
- if ( H5TBread_table( fid, "table13", dst_size2, dst_offset2, dst_sizes2, rbuf2 ) < 0 )
- goto out;
-
- /* compare the extracted table with the original array */
- for( i = 0; i < NRECORDS; i++ )
- {
- if ( ( strcmp( rbuf2[i].name, wbuf[i].name ) != 0 ) ||
- rbuf2[i].lati != wbuf[i].lati ||
- rbuf2[i].longi != wbuf[i].longi ||
- rbuf2[i].pressure != wbuf[i].pressure ||
- rbuf2[i].temperature != wbuf[i].temperature ||
- rbuf2[i].new_field != buf_new[i] ) {
- goto out;
- }
- }
- PASSED();
- }
+ PASSED();
+ }
-/*-------------------------------------------------------------------------
- *
- * Functions tested:
- *
- * H5TBdelete_field
- *
- *-------------------------------------------------------------------------
- */
- if (write)
- {
- TESTING2("deleting fields");
-
- /* make a table */
- if (H5TBmake_table(TITLE,fid,"table14",FIELDS,RECORDS,type_size_mem,
- field_names,field_offset,field_type,
- chunk_size,fill,compress,wbuf)<0)
- goto out;
+ /*-------------------------------------------------------------------------
+ *
+ * Functions tested:
+ *
+ * H5TBget_table_info
+ * H5TBget_field_info
+ *
+ *-------------------------------------------------------------------------
+ */
- /* delete the field */
- if ( H5TBdelete_field(fid, "table14", "Pressure" ) < 0 )
- goto out;
+ TESTING2("getting table info");
- /* read the table */
- if ( H5TBread_table(fid, "table14", dst_size3, dst_offset3, dst_sizes3, rbuf3 ) < 0 )
- goto out;
+ /* get table info */
+ if ( H5TBget_table_info (fid, "table1", &rfields, &rrecords ) < 0 )
+ goto out;
- /* compare the extracted table with the original array */
- for( i = 0; i < NRECORDS; i++ )
- {
- if ( ( strcmp( rbuf3[i].name, wbuf[i].name ) != 0 ) ||
- rbuf3[i].lati != wbuf[i].lati ||
- rbuf3[i].longi != wbuf[i].longi ||
- rbuf3[i].temperature != wbuf[i].temperature ) {
- goto out;
- }
- }
+ if ( NFIELDS != rfields || rrecords != NRECORDS ) {
+ goto out;
+ }
- PASSED();
- }
+ PASSED();
-/*-------------------------------------------------------------------------
- *
- * Functions tested:
- *
- * H5TBget_table_info
- * H5TBget_field_info
- *
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ *
+ * Functions tested:
+ *
+ * H5TBget_field_info
+ *
+ *-------------------------------------------------------------------------
+ */
- TESTING2("getting table info");
+ TESTING2("getting field info");
- /* get table info */
- if ( H5TBget_table_info (fid, "table1", &rfields, &rrecords ) < 0 )
- goto out;
+ /* alocate */
+ names_out = (char**) malloc( sizeof(char*) * (size_t)NFIELDS );
+ for ( i = 0; i < NFIELDS; i++)
+ {
+ names_out[i] = (char*) malloc( sizeof(char) * 255 );
+ }
- if ( NFIELDS != rfields || rrecords != NRECORDS ) {
- goto out;
- }
+ /* Get field info */
+ if ( H5TBget_field_info(fid, "table1", names_out, sizes_out, offset_out, &size_out ) < 0 )
+ goto out;
- PASSED();
+ for ( i = 0; i < NFIELDS; i++)
+ {
+ if ( (strcmp( field_names[i], names_out[i] ) != 0)) {
+ goto out;
+ }
+ }
-/*-------------------------------------------------------------------------
- *
- * Functions tested:
- *
- * H5TBget_field_info
- *
- *-------------------------------------------------------------------------
- */
-
- TESTING2("getting field info");
-
- /* alocate */
- names_out = malloc( sizeof(char*) * (size_t)NFIELDS );
- for ( i = 0; i < NFIELDS; i++)
- {
- names_out[i] = malloc( sizeof(char) * 255 );
- }
-
- /* Get field info */
- if ( H5TBget_field_info(fid, "table1", names_out, sizes_out, offset_out, &size_out ) < 0 )
- goto out;
-
- for ( i = 0; i < NFIELDS; i++)
- {
- if ( (strcmp( field_names[i], names_out[i] ) != 0)) {
- goto out;
- }
- }
-
- /* release */
- for ( i = 0; i < NFIELDS; i++)
- {
- free ( names_out[i] );
- }
- free ( names_out );
-
- PASSED();
+ /* release */
+ for ( i = 0; i < NFIELDS; i++)
+ {
+ free ( names_out[i] );
+ }
+ free ( names_out );
-/*-------------------------------------------------------------------------
- * end
- *-------------------------------------------------------------------------
- */
- return 0;
+ PASSED();
+
+ /*-------------------------------------------------------------------------
+ * end
+ *-------------------------------------------------------------------------
+ */
+ return 0;
out:
- H5_FAILED();
- return -1;
+ H5_FAILED();
+ return -1;
}
/*-------------------------------------------------------------------------
- * the main program
- *-------------------------------------------------------------------------
- */
+* the main program
+*-------------------------------------------------------------------------
+*/
int main(void)
{
- hid_t fid; /* identifier for the file */
- unsigned flags=H5F_ACC_RDONLY;
+ hid_t fid; /* identifier for the file */
+ unsigned flags=H5F_ACC_RDONLY;
-/*-------------------------------------------------------------------------
- * test1: create a file for the write/read test
- *-------------------------------------------------------------------------
- */
+ /*-------------------------------------------------------------------------
+ * test1: create a file for the write/read test
+ *-------------------------------------------------------------------------
+ */
- /* create a file using default properties */
- fid=H5Fcreate("test_table.h5",H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT);
+ /* create a file using default properties */
+ fid=H5Fcreate("test_table.h5",H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT);
- puts("Testing table with file creation mode (read/write in native architecture):");
+ puts("Testing table with file creation mode (read/write in native architecture):");
- /* test, do write */
- if (test_table(fid,1)<0)
- goto out;
+ /* test, do write */
+ if (test_table(fid,1)<0)
+ goto out;
- /* close */
- H5Fclose(fid);
+ /* close */
+ H5Fclose(fid);
-/*-------------------------------------------------------------------------
- * test2: open a file written in test1 on a big-endian machine
- *-------------------------------------------------------------------------
- */
- puts("Testing table with file open mode (read big-endian data):");
+ /*-------------------------------------------------------------------------
+ * test2: open a file written in test1 on a big-endian machine
+ *-------------------------------------------------------------------------
+ */
+ puts("Testing table with file open mode (read big-endian data):");
- fid=h5file_open(TEST_FILE_BE,flags);
+ fid=h5file_open(TEST_FILE_BE,flags);
- /* test, do not write */
- if (test_table(fid,0)<0)
- goto out;
+ /* test, do not write */
+ if (test_table(fid,0)<0)
+ goto out;
- /* close */
- H5Fclose(fid);
+ /* close */
+ H5Fclose(fid);
-/*-------------------------------------------------------------------------
- * test3: open a file written in test1 on a little-endian machine
- *-------------------------------------------------------------------------
- */
- puts("Testing table with file open mode (read little-endian data):");
+ /*-------------------------------------------------------------------------
+ * test3: open a file written in test1 on a little-endian machine
+ *-------------------------------------------------------------------------
+ */
+ puts("Testing table with file open mode (read little-endian data):");
- fid=h5file_open(TEST_FILE_LE,flags);
+ fid=h5file_open(TEST_FILE_LE,flags);
- /* test, do not write */
- if (test_table(fid,0)<0)
- goto out;
+ /* test, do not write */
+ if (test_table(fid,0)<0)
+ goto out;
- /* close */
- H5Fclose(fid);
+ /* close */
+ H5Fclose(fid);
-/*-------------------------------------------------------------------------
- * test4: open a file written in test1 on the Cray T3 machine
- *-------------------------------------------------------------------------
- */
- puts("Testing table with file open mode (read Cray data):");
+ /*-------------------------------------------------------------------------
+ * test4: open a file written in test1 on the Cray T3 machine
+ *-------------------------------------------------------------------------
+ */
+ puts("Testing table with file open mode (read Cray data):");
- fid=h5file_open(TEST_FILE_CRAY,flags);
+ fid=h5file_open(TEST_FILE_CRAY,flags);
- /* test, do not write */
- if (test_table(fid,0)<0)
- goto out;
+ /* test, do not write */
+ if (test_table(fid,0)<0)
+ goto out;
- /* close */
- H5Fclose(fid);
+ /* close */
+ H5Fclose(fid);
- return 0;
+ return 0;
out:
- H5Fclose(fid);
- return 1;
-}
-
-
-/*-------------------------------------------------------------------------
- * function to open an HDF5 file and return its file identifier
- *-------------------------------------------------------------------------
- */
-static hid_t h5file_open(const char *fname, unsigned flags)
-{
-
- hid_t fid; /* identifier for the file */
- char *srcdir = getenv("srcdir"); /* the source directory */
- char data_file[512]=""; /* buffer to hold name of existing file */
-
- /* compose the name of the file to open, using the srcdir, if appropriate */
- if (srcdir){
- strcpy(data_file,srcdir);
- strcat(data_file,"/");
- }
- strcat(data_file,fname);
-
- /* open */
- if((fid=H5Fopen(data_file,flags,H5P_DEFAULT))<0) {
- fprintf(stderr,"Error: Cannot open file <%s>\n",data_file );
- exit(1);
- }
-
- return fid;
+ H5Fclose(fid);
+ return 1;
}
-/*-------------------------------------------------------------------------
- * function that compares one particle
- *-------------------------------------------------------------------------
- */
-static int cmp_par(hsize_t i, hsize_t j, particle_t *rbuf, particle_t *wbuf )
-{
- if ( ( strcmp( rbuf[i].name, wbuf[j].name ) != 0 ) ||
- rbuf[i].lati != wbuf[j].lati ||
- rbuf[i].longi != wbuf[j].longi ||
- rbuf[i].pressure != wbuf[j].pressure ||
- rbuf[i].temperature != wbuf[j].temperature ) {
- fprintf(stderr,"read and write buffers have differences\n");
- fprintf(stderr,"%s %ld %f %f %d\n",
- rbuf[i].name,rbuf[i].longi,rbuf[i].pressure,rbuf[i].temperature,rbuf[i].lati);
- fprintf(stderr,"%s %ld %f %f %d\n",
- wbuf[j].name,wbuf[j].longi,wbuf[j].pressure,wbuf[j].temperature,wbuf[j].lati);
- return -1;
- }
- return 0;
-}
-
-/*-------------------------------------------------------------------------
- * function to compare deleted records
- *-------------------------------------------------------------------------
- */
-static int compare_deleted(hsize_t rrecords, hsize_t dstart, hsize_t drecords,
- particle_t *rbuf, particle_t *wbuf)
-{
- hsize_t i,j;
- for( i=0; i<rrecords; i++)
- {
- if (i<dstart)
- {
- if (cmp_par(i,i,rbuf,wbuf)<0)
- return -1;
- }
- else
- {
- j=i+drecords;
- if (cmp_par(i,j,rbuf,wbuf)<0)
- return -1;
- }
- }
- return 0;
-}
diff --git a/hl/tools/COPYING b/hl/tools/COPYING
index ef0cbaf..6903daf 100755
--- a/hl/tools/COPYING
+++ b/hl/tools/COPYING
@@ -1,5 +1,5 @@
- Copyright by The HDF Group (THG) and
+ Copyright by The HDF Group and
The Board of Trustees of the University of Illinois.
All rights reserved.
diff --git a/hl/tools/Makefile.in b/hl/tools/Makefile.in
index 6d486ec..2738d84 100644
--- a/hl/tools/Makefile.in
+++ b/hl/tools/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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.
@@ -32,8 +33,9 @@
#
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@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
@@ -60,6 +62,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/src/H5config.h
CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
SOURCES =
DIST_SOURCES =
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -71,13 +74,53 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
ps-recursive uninstall-recursive
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
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
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 = /home1/packages/automake/automake-1.9.6/bin/aclocal-1.9 -I /afs/ncsa/projects/hdf/packages/libtool_1.5.14/Linux_2.4/share/aclocal
ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
AMTAR = @AMTAR@
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+AM_CFLAGS = @AM_CFLAGS@ @H5_CFLAGS@
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@
AM_MAKEFLAGS = @AM_MAKEFLAGS@
AR = @AR@
@@ -91,21 +134,18 @@ BYTESEX = @BYTESEX@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_VERSION = @CC_VERSION@
-
-# H5_CFLAGS holds flags that should be used as CFLAGS when building hdf5,
-# but which shouldn't be exported to h5cc for building other programs.
-CFLAGS = @CFLAGS@ @H5_CFLAGS@
+CFLAGS = @CFLAGS@
CLEARFILEBUF = @CLEARFILEBUF@
CODESTACK = @CODESTACK@
CONFIG_DATE = @CONFIG_DATE@
CONFIG_MODE = @CONFIG_MODE@
CONFIG_USER = @CONFIG_USER@
CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@ @H5_CPPFLAGS@
+CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@ @H5_CXXFLAGS@
+CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEBUG_PKG = @DEBUG_PKG@
DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
@@ -128,7 +168,7 @@ F9XMODEXT = @F9XMODEXT@
F9XMODFLAG = @F9XMODFLAG@
F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
FC = @FC@
-FCFLAGS = @FCFLAGS@ @H5_FCFLAGS@
+FCFLAGS = @FCFLAGS@
FCFLAGS_f90 = @FCFLAGS_f90@
FCLIBS = @FCLIBS@
FGREP = @FGREP@
@@ -166,6 +206,8 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LINUX_LFS = @LINUX_LFS@
+LIPO = @LIPO@
+LL_PATH = @LL_PATH@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_STATIC_EXEC = @LT_STATIC_EXEC@
@@ -176,13 +218,17 @@ MPE = @MPE@
MPI_GET_SIZE = @MPI_GET_SIZE@
NM = @NM@
NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
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@
PARALLEL = @PARALLEL@
PATH_SEPARATOR = @PATH_SEPARATOR@
@@ -198,12 +244,7 @@ SEARCH = @SEARCH@
SED = @SED@
SETX = @SETX@
SET_MAKE = @SET_MAKE@
-
-# Hardcode SHELL to be /bin/sh. Most machines have this shell, and
-# on at least one machine configure fails to detect its existence (janus).
-# Also, when HDF5 is configured on one machine but run on another,
-# configure's automatic SHELL detection may not work on the build machine.
-SHELL = /bin/sh
+SHELL = @SHELL@
SIZE_T = @SIZE_T@
STATIC_EXEC = @STATIC_EXEC@
STATIC_SHARED = @STATIC_SHARED@
@@ -223,6 +264,7 @@ USE_FILTER_SHUFFLE = @USE_FILTER_SHUFFLE@
USE_FILTER_SZIP = @USE_FILTER_SZIP@
USINGMEMCHECKER = @USINGMEMCHECKER@
VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -245,6 +287,8 @@ build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
+
+# Install directories that automake doesn't know about
docdir = $(exec_prefix)/doc
dvidir = @dvidir@
enable_shared = @enable_shared@
@@ -256,9 +300,7 @@ host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
-
-# Install directories that automake doesn't know about
-includedir = $(exec_prefix)/include
+includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
@@ -278,6 +320,7 @@ sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -348,14 +391,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
- && exit 0; \
+ ( 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) --foreign hl/tools/Makefile'; \
- cd $(top_srcdir) && \
- $(AUTOMAKE) --foreign hl/tools/Makefile
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/tools/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign hl/tools/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -373,6 +416,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
mostlyclean-libtool:
-rm -f *.lo
@@ -404,7 +448,7 @@ $(RECURSIVE_TARGETS):
else \
local_target="$$target"; \
fi; \
- (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| eval $$failcom; \
done; \
if test "$$dot_seen" = "no"; then \
@@ -438,16 +482,16 @@ $(RECURSIVE_CLEAN_TARGETS):
else \
local_target="$$target"; \
fi; \
- (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ ($(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" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
done
ctags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -455,14 +499,14 @@ ID: $(HEADERS) $(SOURCES) $(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; nonemtpy = 1; } \
+ $(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)
- tags=; \
+ set x; \
here=`pwd`; \
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
include_option=--etags-include; \
@@ -474,7 +518,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
list='$(SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test ! -f $$subdir/TAGS || \
- tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
fi; \
done; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -483,29 +527,34 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique; \
+ 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)
- tags=; \
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)$$tags$$unique" \
+ test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$tags $$unique
+ $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -526,29 +575,44 @@ distdir: $(DISTFILES)
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 -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
- list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test -d "$(distdir)/$$subdir" \
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|| exit 1; \
- distdir=`$(am__cd) $(distdir) && pwd`; \
- top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
- (cd $$subdir && \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ 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="$$top_distdir" \
- distdir="$$distdir/$$subdir" \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
am__remove_distdir=: \
am__skip_length_check=: \
+ am__skip_mode_fix=: \
distdir) \
|| exit 1; \
fi; \
@@ -579,6 +643,7 @@ 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"
@@ -597,6 +662,8 @@ dvi-am:
html: html-recursive
+html-am:
+
info: info-recursive
info-am:
@@ -605,18 +672,28 @@ 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
@@ -638,8 +715,8 @@ ps-am:
uninstall-am:
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
- install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \
+ ctags-recursive install-am install-strip tags-recursive
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
all all-am all-local check check-TESTS check-am clean \
@@ -861,6 +938,7 @@ check-vfd: $(LIB) $(PROGS) $(TESTS)
HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1; \
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:
diff --git a/hl/tools/gif2h5/Makefile.am b/hl/tools/gif2h5/Makefile.am
index 076b915..895c75f 100644
--- a/hl/tools/gif2h5/Makefile.am
+++ b/hl/tools/gif2h5/Makefile.am
@@ -31,6 +31,10 @@ check_SCRIPTS=$(TEST_SCRIPT)
bin_PROGRAMS=gif2h5 h52gif
noinst_PROGRAMS=h52gifgentst
+# Add h52gif and gif2h5 specific linker flags here
+h52gif_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+gif2h5_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
gif2h5_SOURCES=gif2hdf.c gif2mem.c decompress.c gifread.c writehdf.c
h52gif_SOURCES=hdf2gif.c hdfgifwr.c
diff --git a/hl/tools/gif2h5/Makefile.in b/hl/tools/gif2h5/Makefile.in
index 99e7a1b..e43dd07 100644
--- a/hl/tools/gif2h5/Makefile.in
+++ b/hl/tools/gif2h5/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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.
@@ -33,8 +34,9 @@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@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
@@ -63,18 +65,24 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/src/H5config.h
CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
am__installdirs = "$(DESTDIR)$(bindir)"
-binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
am_gif2h5_OBJECTS = gif2hdf.$(OBJEXT) gif2mem.$(OBJEXT) \
decompress.$(OBJEXT) gifread.$(OBJEXT) writehdf.$(OBJEXT)
gif2h5_OBJECTS = $(am_gif2h5_OBJECTS)
gif2h5_LDADD = $(LDADD)
gif2h5_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5)
+gif2h5_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(gif2h5_LDFLAGS) \
+ $(LDFLAGS) -o $@
am_h52gif_OBJECTS = hdf2gif.$(OBJEXT) hdfgifwr.$(OBJEXT)
h52gif_OBJECTS = $(am_h52gif_OBJECTS)
h52gif_LDADD = $(LDADD)
h52gif_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5)
+h52gif_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(h52gif_LDFLAGS) \
+ $(LDFLAGS) -o $@
am_h52gifgentst_OBJECTS = h52gifgentst.$(OBJEXT)
h52gifgentst_OBJECTS = $(am_h52gifgentst_OBJECTS)
h52gifgentst_LDADD = $(LDADD)
@@ -82,6 +90,7 @@ h52gifgentst_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5)
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
am__depfiles_maybe = depfiles
+am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
@@ -96,10 +105,22 @@ DIST_SOURCES = $(gif2h5_SOURCES) $(h52gif_SOURCES) \
$(h52gifgentst_SOURCES)
ETAGS = etags
CTAGS = ctags
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = /home1/packages/automake/automake-1.9.6/bin/aclocal-1.9 -I /afs/ncsa/projects/hdf/packages/libtool_1.5.14/Linux_2.4/share/aclocal
ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
AMTAR = @AMTAR@
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+AM_CFLAGS = @AM_CFLAGS@ @H5_CFLAGS@
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@
AM_MAKEFLAGS = @AM_MAKEFLAGS@
AR = @AR@
@@ -113,21 +134,18 @@ BYTESEX = @BYTESEX@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_VERSION = @CC_VERSION@
-
-# H5_CFLAGS holds flags that should be used as CFLAGS when building hdf5,
-# but which shouldn't be exported to h5cc for building other programs.
-CFLAGS = @CFLAGS@ @H5_CFLAGS@
+CFLAGS = @CFLAGS@
CLEARFILEBUF = @CLEARFILEBUF@
CODESTACK = @CODESTACK@
CONFIG_DATE = @CONFIG_DATE@
CONFIG_MODE = @CONFIG_MODE@
CONFIG_USER = @CONFIG_USER@
CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@ @H5_CPPFLAGS@
+CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@ @H5_CXXFLAGS@
+CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEBUG_PKG = @DEBUG_PKG@
DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
@@ -150,7 +168,7 @@ F9XMODEXT = @F9XMODEXT@
F9XMODFLAG = @F9XMODFLAG@
F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
FC = @FC@
-FCFLAGS = @FCFLAGS@ @H5_FCFLAGS@
+FCFLAGS = @FCFLAGS@
FCFLAGS_f90 = @FCFLAGS_f90@
FCLIBS = @FCLIBS@
FGREP = @FGREP@
@@ -188,6 +206,8 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LINUX_LFS = @LINUX_LFS@
+LIPO = @LIPO@
+LL_PATH = @LL_PATH@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_STATIC_EXEC = @LT_STATIC_EXEC@
@@ -198,13 +218,17 @@ MPE = @MPE@
MPI_GET_SIZE = @MPI_GET_SIZE@
NM = @NM@
NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
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@
PARALLEL = @PARALLEL@
PATH_SEPARATOR = @PATH_SEPARATOR@
@@ -220,12 +244,7 @@ SEARCH = @SEARCH@
SED = @SED@
SETX = @SETX@
SET_MAKE = @SET_MAKE@
-
-# Hardcode SHELL to be /bin/sh. Most machines have this shell, and
-# on at least one machine configure fails to detect its existence (janus).
-# Also, when HDF5 is configured on one machine but run on another,
-# configure's automatic SHELL detection may not work on the build machine.
-SHELL = /bin/sh
+SHELL = @SHELL@
SIZE_T = @SIZE_T@
STATIC_EXEC = @STATIC_EXEC@
STATIC_SHARED = @STATIC_SHARED@
@@ -245,6 +264,7 @@ USE_FILTER_SHUFFLE = @USE_FILTER_SHUFFLE@
USE_FILTER_SZIP = @USE_FILTER_SZIP@
USINGMEMCHECKER = @USINGMEMCHECKER@
VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -267,6 +287,8 @@ build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
+
+# Install directories that automake doesn't know about
docdir = $(exec_prefix)/doc
dvidir = @dvidir@
enable_shared = @enable_shared@
@@ -278,9 +300,7 @@ host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
-
-# Install directories that automake doesn't know about
-includedir = $(exec_prefix)/include
+includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
@@ -300,6 +320,7 @@ sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -351,6 +372,10 @@ INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/tools/lib -I$(top_srcdir)/hl/src
# These are our main targets, the tools
TEST_SCRIPT = $(srcdir)/h52giftest.sh
check_SCRIPTS = $(TEST_SCRIPT)
+
+# Add h52gif and gif2h5 specific linker flags here
+h52gif_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+gif2h5_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
gif2h5_SOURCES = gif2hdf.c gif2mem.c decompress.c gifread.c writehdf.c
h52gif_SOURCES = hdf2gif.c hdfgifwr.c
h52gifgentst_SOURCES = h52gifgentst.c
@@ -382,14 +407,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
- && exit 0; \
+ ( 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) --foreign hl/tools/gif2h5/Makefile'; \
- cd $(top_srcdir) && \
- $(AUTOMAKE) --foreign hl/tools/gif2h5/Makefile
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/tools/gif2h5/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign hl/tools/gif2h5/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -407,47 +432,65 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
install-binPROGRAMS: $(bin_PROGRAMS)
@$(NORMAL_INSTALL)
test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
- @list='$(bin_PROGRAMS)'; for p in $$list; do \
- p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- if test -f $$p \
- || test -f $$p1 \
- ; then \
- f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
- echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
- $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
- else :; fi; \
- done
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ 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)'; for p in $$list; do \
- f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
- echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
- rm -f "$(DESTDIR)$(bindir)/$$f"; \
- done
+ @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)'; for p in $$list; do \
- f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f $$p $$f"; \
- rm -f $$p $$f ; \
- done
+ @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
clean-noinstPROGRAMS:
- @list='$(noinst_PROGRAMS)'; for p in $$list; do \
- f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f $$p $$f"; \
- rm -f $$p $$f ; \
- done
+ @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
gif2h5$(EXEEXT): $(gif2h5_OBJECTS) $(gif2h5_DEPENDENCIES)
@rm -f gif2h5$(EXEEXT)
- $(LINK) $(gif2h5_OBJECTS) $(gif2h5_LDADD) $(LIBS)
+ $(gif2h5_LINK) $(gif2h5_OBJECTS) $(gif2h5_LDADD) $(LIBS)
h52gif$(EXEEXT): $(h52gif_OBJECTS) $(h52gif_DEPENDENCIES)
@rm -f h52gif$(EXEEXT)
- $(LINK) $(h52gif_OBJECTS) $(h52gif_LDADD) $(LIBS)
+ $(h52gif_LINK) $(h52gif_OBJECTS) $(h52gif_LDADD) $(LIBS)
h52gifgentst$(EXEEXT): $(h52gifgentst_OBJECTS) $(h52gifgentst_DEPENDENCIES)
@rm -f h52gifgentst$(EXEEXT)
$(LINK) $(h52gifgentst_OBJECTS) $(h52gifgentst_LDADD) $(LIBS)
@@ -469,21 +512,21 @@ distclean-compile:
.c.o:
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
.c.obj:
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
@@ -499,14 +542,14 @@ ID: $(HEADERS) $(SOURCES) $(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; nonemtpy = 1; } \
+ $(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)
- tags=; \
+ set x; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
@@ -514,29 +557,34 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique; \
+ 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)
- tags=; \
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)$$tags$$unique" \
+ test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$tags $$unique
+ $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -557,13 +605,17 @@ distdir: $(DISTFILES)
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 -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
@@ -596,6 +648,7 @@ 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"
@@ -617,6 +670,8 @@ dvi-am:
html: html-am
+html-am:
+
info: info-am
info-am:
@@ -625,18 +680,28 @@ install-data-am:
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-pdf: install-pdf-am
+install-pdf-am:
+
install-ps: install-ps-am
+install-ps-am:
+
installcheck-am:
maintainer-clean: maintainer-clean-am
@@ -659,7 +724,7 @@ ps-am:
uninstall-am: uninstall-binPROGRAMS
-.MAKE: install-am install-strip
+.MAKE: check-am install-am install-strip
.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \
clean clean-binPROGRAMS clean-generic clean-libtool \
@@ -882,6 +947,7 @@ check-vfd: $(LIB) $(PROGS) $(TESTS)
HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1; \
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:
diff --git a/hl/tools/gif2h5/gif2hdf.c b/hl/tools/gif2h5/gif2hdf.c
index 24aaf31..c7e4ab6 100644
--- a/hl/tools/gif2h5/gif2hdf.c
+++ b/hl/tools/gif2h5/gif2hdf.c
@@ -53,7 +53,7 @@ main(int argv , char *argc[])
{
print_version("gif2h5");
exit(EXIT_SUCCESS);
-
+
}
if (argv < 3) {
@@ -120,7 +120,7 @@ main(int argv , char *argc[])
if (gifImageDesc.Image != NULL)
free(gifImageDesc.Image);
-
+
if (GifMemoryStruct.GifImageDesc[i] != NULL)
{
free(GifMemoryStruct.GifImageDesc[i]);
diff --git a/hl/tools/gif2h5/h52gifgentst.c b/hl/tools/gif2h5/h52gifgentst.c
index e0a50a1..eb83335 100644
--- a/hl/tools/gif2h5/h52gifgentst.c
+++ b/hl/tools/gif2h5/h52gifgentst.c
@@ -45,7 +45,7 @@
*-------------------------------------------------------------------------
*/
-int main(void)
+int main(void)
{
hid_t fid;
int i, j, n, space;
@@ -55,7 +55,7 @@ int main(void)
hsize_t width = WIDTH;
hsize_t height = HEIGHT;
-
+
/* create a file */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0)
return 1;
@@ -70,7 +70,7 @@ int main(void)
n++;
j=0;
}
-
+
}
/* make the image */
@@ -78,7 +78,7 @@ int main(void)
return 1;
/*-------------------------------------------------------------------------
- * define a palette, blue to red tones
+ * define a palette, blue to red tones
*-------------------------------------------------------------------------
*/
for ( i=0, n=0; i<PAL_ENTRIES*3; i+=3, n++)
@@ -87,18 +87,18 @@ int main(void)
pal[i+1]=0; /* green */
pal[i+2]=255-n; /* blue */
}
-
+
/* make a palette */
if (H5IMmake_palette( fid, PAL_NAME, pal_dims, pal )<0)
return 1;
-
+
/* attach the palette to the image */
if (H5IMlink_palette( fid, IMAGE1_NAME, PAL_NAME )<0)
return 1;
-
+
if(H5Fclose(fid)<0)
return 1;
-
+
return 0;
}
diff --git a/hl/tools/gif2h5/hdf2gif.c b/hl/tools/gif2h5/hdf2gif.c
index 7def4f0..9c252e1 100644
--- a/hl/tools/gif2h5/hdf2gif.c
+++ b/hl/tools/gif2h5/hdf2gif.c
@@ -38,7 +38,7 @@ usage(void)
fprintf(stdout, " h52gif -V \n");
fprintf(stdout, " Print HDF5 library version and exit\n");
printf("h52gif expects *at least* one h5_image.\n");
-
+
}
FILE *fpGif = NULL;
@@ -69,16 +69,16 @@ int main(int argc , char **argv)
int bool_is_image = 0; /* 0 = false , 1 = true */
char *image_name = NULL;
int idx;
-
+
if ( argv[1] && (strcmp("-V",argv[1])==0) )
{
print_version("gif2h5");
exit(EXIT_SUCCESS);
-
+
}
- if (argc < 4)
+ if (argc < 4)
{
/* they didn't supply at least one image -- bail */
usage();
@@ -89,14 +89,14 @@ int main(int argc , char **argv)
GIFName = argv[2];
/* get the options */
- while (arg_index++ < argc - 1)
+ while (arg_index++ < argc - 1)
{
if (!strcmp(argv[arg_index] , "-i")) {
bool_is_image = 1;
continue;
}
- if (bool_is_image)
+ if (bool_is_image)
{
/* allocate space to store the image name */
size_t len = strlen(argv[arg_index]);
@@ -118,7 +118,7 @@ int main(int argc , char **argv)
b = (BYTE *) &idx;
EndianOrder = (b[0] ? 1:0);
- if (!(fpGif = fopen(GIFName , "wb")))
+ if (!(fpGif = fopen(GIFName , "wb")))
{
printf("Error opening gif file for output. Aborting.\n");
goto out;
@@ -132,19 +132,19 @@ int main(int argc , char **argv)
hssize_t npals;
hsize_t pal_dims[2];
unsigned char *pal;
-
- if ((fid = H5Fopen(HDFName , H5F_ACC_RDONLY , H5P_DEFAULT)) < 0)
+
+ if ((fid = H5Fopen(HDFName , H5F_ACC_RDONLY , H5P_DEFAULT)) < 0)
{
fprintf(stderr , "Unable to open HDF file for input. Aborting.\n");
goto out;
}
-
+
/* read image */
if ( H5IMget_image_info( fid, image_name, &width, &height, &planes, interlace, &npals ) < 0 )
goto out;
Image = (BYTE*) malloc( (size_t) width * (size_t) height );
-
+
if ( H5IMread_image( fid, image_name, Image ) < 0 )
goto out;
@@ -154,7 +154,7 @@ int main(int argc , char **argv)
goto out;
pal = (BYTE*) malloc( (size_t) pal_dims[0] * (size_t) pal_dims[1] );
-
+
if ( H5IMget_palette( fid, image_name, 0, pal ) < 0 )
goto out;
@@ -169,9 +169,9 @@ int main(int argc , char **argv)
free(pal);
}
-
+
H5Fclose(fid);
-
+
RWidth = (int)width;
RHeight = (int)height;
@@ -185,17 +185,17 @@ int main(int argc , char **argv)
* palette
* 2. Check for palettes in any of the other images.
*/
- if (!npals)
+ if (!npals)
{
numcols = 256;
- for (i = 0 ; i < numcols ; i++)
+ for (i = 0 ; i < numcols ; i++)
{
Red[i] = 255 - i;
Green[i] = 255 - i;
Blue[i] = 255 - i;
}
- }
- else
+ }
+ else
{
for (i = 0 ; i < numcols ; i++)
{
@@ -205,7 +205,7 @@ int main(int argc , char **argv)
}
}
- for (i = 0; i < numcols; i++)
+ for (i = 0; i < numcols; i++)
{
pc2nc[i] = r1[i] = g1[i] = b1[i] = 0;
}
@@ -213,16 +213,16 @@ int main(int argc , char **argv)
/* compute number of unique colors */
nc = 0;
- for (i = 0; i < numcols; i++)
+ for (i = 0; i < numcols; i++)
{
/* see if color #i is already used */
- for (j = 0; j < i; j++)
+ for (j = 0; j < i; j++)
{
if (Red[i] == Red[j] && Green[i] == Green[j] && Blue[i] == Blue[j])
break;
}
-
- if (j==i)
+
+ if (j==i)
{
/* wasn't found */
pc2nc[i] = nc;
@@ -230,15 +230,15 @@ int main(int argc , char **argv)
g1[nc] = Green[i];
b1[nc] = Blue[i];
nc++;
- }
- else
+ }
+ else
{
pc2nc[i] = pc2nc[j];
}
}
/* figure out 'BitsPerPixel' */
- for (i = 1; i < 8; i++)
+ for (i = 1; i < 8; i++)
{
if ((1<<i) >= nc)
break;
@@ -252,23 +252,23 @@ int main(int argc , char **argv)
else
InitCodeSize = BitsPerPixel;
- if (!fpGif)
+ if (!fpGif)
{
fprintf(stderr, "WriteGIF: file not open for writing\n" );
goto out;
}
-
+
fwrite("GIF87a", sizeof( char ), 6, fpGif); /* the GIF magic number */
-
+
putword(RWidth, fpGif); /* screen descriptor */
putword(RHeight, fpGif);
-
+
i = 0x00; /* No, there is no color map */
i |= (8-1)<<4; /* OR in the color resolution (hardwired 8) */
i |= (BitsPerPixel - 1); /* OR in the # of bits per pixel */
fputc(i,fpGif);
-
+
fputc(Background,fpGif); /* background color */
fputc(0, fpGif); /* future expansion byte */
@@ -286,7 +286,7 @@ int main(int argc , char **argv)
/* since we always have a local color palette ... */
fputc((0x80 | (BitsPerPixel - 1)) , fpGif);
- for (i = 0; i < ColorMapSize; i++)
+ for (i = 0; i < ColorMapSize; i++)
{
/* write out Global colormap */
fputc(r1[i], fpGif);
@@ -301,7 +301,7 @@ int main(int argc , char **argv)
free(Image);
}
- if (fputc(';',fpGif) == EOF)
+ if (fputc(';',fpGif) == EOF)
{
/* Write GIF file terminator */
fprintf(stderr , "Error!");
diff --git a/hl/tools/gif2h5/writehdf.c b/hl/tools/gif2h5/writehdf.c
index 7c2b063..a150b3c 100644
--- a/hl/tools/gif2h5/writehdf.c
+++ b/hl/tools/gif2h5/writehdf.c
@@ -83,7 +83,7 @@ WriteHDF(GIFTOMEM GifMemoryStruct, char *HDFName , char *GIFFileName)
/* size of the palette is tablesize (rows) X 3 (columns) */
dims[0] = gifHead.TableSize;
dims[1] = 3;
-
+
/* make a palette */
if (H5IMmake_palette(file_id,PAL_NAME,dims,(unsigned char *)gifHead.HDFPalette)<0)
return -1;
@@ -102,11 +102,11 @@ WriteHDF(GIFTOMEM GifMemoryStruct, char *HDFName , char *GIFFileName)
/* create the image name */
sprintf(ImageName , "Image%d" , i);
-
+
/* write image */
if (H5IMmake_image_8bit(file_id,ImageName,dims[1],dims[0],(gifImageDesc->Image))<0)
return -1;
-
+
/* attach the palette to the image dataset */
if (has_pal)
{
diff --git a/hl/tools/h52jpeg/Makefile.am b/hl/tools/h52jpeg/Makefile.am
deleted file mode 100644
index 05ea153..0000000
--- a/hl/tools/h52jpeg/Makefile.am
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# Copyright by The HDF Group.
-# Copyright by the Board of Trustees of the University of Illinois.
-# All rights reserved.
-#
-# This file is part of HDF5. The full HDF5 copyright notice, including
-# terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html. COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page. It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have
-# access to either file, you may request a copy from help@hdfgroup.org.
-##
-## Makefile.am
-## Run automake to generate a Makefile.in from this file.
-#
-# HDF5 Library Makefile(.in)
-#
-
-include $(top_srcdir)/config/commence.am
-
-# Include src and tools/lib directories
-INCLUDES=-I$(top_srcdir)/src -I$(top_srcdir)/tools/lib -I$(top_srcdir)/hl/src
-
-# These are our main targets
-TEST_PROG=h52jpegtst
-TEST_SCRIPT=$(srcdir)/h52jpeg.sh
-
-check_SCRIPTS=$(TEST_SCRIPT)
-check_PROGRAMS=$(TEST_PROG)
-
-bin_PROGRAMS=h52jpeg
-noinst_PROGRAMS=h52jpegtst
-
-h52jpeg_SOURCES=h52jpeg.c
-h52jpegtst_SOURCES=h52jpegtst.c
-
-# Programs all depend on the hdf5 library, the tools library, and the HL
-# library.
-LDADD=$(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5) -ljpeg
-
-CHECK_CLEANFILES+=*.h5
-CHECK_CLEANFILES+=*.jpeg
-
-include $(top_srcdir)/config/conclude.am
diff --git a/hl/tools/h52jpeg/Makefile.in b/hl/tools/h52jpeg/Makefile.in
deleted file mode 100644
index f6b2328..0000000
--- a/hl/tools/h52jpeg/Makefile.in
+++ /dev/null
@@ -1,882 +0,0 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008 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 by The HDF Group.
-# Copyright by the Board of Trustees of the University of Illinois.
-# All rights reserved.
-#
-# This file is part of HDF5. The full HDF5 copyright notice, including
-# terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html. COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page. It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have
-# access to either file, you may request a copy from help@hdfgroup.org.
-#
-# HDF5 Library Makefile(.in)
-#
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@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 \
- $(top_srcdir)/config/commence.am \
- $(top_srcdir)/config/conclude.am
-check_PROGRAMS = $(am__EXEEXT_1)
-bin_PROGRAMS = h52jpeg$(EXEEXT)
-noinst_PROGRAMS = h52jpegtst$(EXEEXT)
-TESTS = $(check_PROGRAMS) $(check_SCRIPTS)
-subdir = hl/tools/h52jpeg
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
-CONFIG_CLEAN_FILES =
-am__installdirs = "$(DESTDIR)$(bindir)"
-binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
-am__EXEEXT_1 = h52jpegtst$(EXEEXT)
-PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
-am_h52jpeg_OBJECTS = h52jpeg.$(OBJEXT)
-h52jpeg_OBJECTS = $(am_h52jpeg_OBJECTS)
-h52jpeg_LDADD = $(LDADD)
-h52jpeg_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5)
-am_h52jpegtst_OBJECTS = h52jpegtst.$(OBJEXT)
-h52jpegtst_OBJECTS = $(am_h52jpegtst_OBJECTS)
-h52jpegtst_LDADD = $(LDADD)
-h52jpegtst_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5)
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
-depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
-am__depfiles_maybe = depfiles
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
- $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
-SOURCES = $(h52jpeg_SOURCES) $(h52jpegtst_SOURCES)
-DIST_SOURCES = $(h52jpeg_SOURCES) $(h52jpegtst_SOURCES)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = /home1/packages/automake/automake-1.9.6/bin/aclocal-1.9 -I /afs/ncsa/projects/hdf/packages/libtool_1.5.14/Linux_2.4/share/aclocal
-ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
-AMTAR = @AMTAR@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
-AR = @AR@
-
-# Set the paths for AFS installs of autotools for Linux machines
-# Ideally, these tools should never be needed during the build.
-AUTOCONF = /home1/packages/autoconf/autoconf-2.60/bin/autoconf
-AUTOHEADER = /home1/packages/autoconf/autoconf-2.60/bin/autoheader
-AUTOMAKE = /home1/packages/automake/automake-1.9.6/bin/automake-1.9
-AWK = @AWK@
-BYTESEX = @BYTESEX@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CC_VERSION = @CC_VERSION@
-
-# H5_CFLAGS holds flags that should be used as CFLAGS when building hdf5,
-# but which shouldn't be exported to h5cc for building other programs.
-CFLAGS = @CFLAGS@ @H5_CFLAGS@
-CLEARFILEBUF = @CLEARFILEBUF@
-CODESTACK = @CODESTACK@
-CONFIG_DATE = @CONFIG_DATE@
-CONFIG_MODE = @CONFIG_MODE@
-CONFIG_USER = @CONFIG_USER@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@ @H5_CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@ @H5_CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEBUG_PKG = @DEBUG_PKG@
-DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
-DIRECT_VFD = @DIRECT_VFD@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-DYNAMIC_DIRS = @DYNAMIC_DIRS@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXTERNAL_FILTERS = @EXTERNAL_FILTERS@
-
-# Make sure that these variables are exported to the Makefiles
-F9XMODEXT = @F9XMODEXT@
-F9XMODFLAG = @F9XMODFLAG@
-F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
-FC = @FC@
-FCFLAGS = @FCFLAGS@ @H5_FCFLAGS@
-FCFLAGS_f90 = @FCFLAGS_f90@
-FCLIBS = @FCLIBS@
-FGREP = @FGREP@
-FILTERS = @FILTERS@
-FSEARCH_DIRS = @FSEARCH_DIRS@
-GPFS = @GPFS@
-GREP = @GREP@
-H5_CFLAGS = @H5_CFLAGS@
-H5_CPPFLAGS = @H5_CPPFLAGS@
-H5_CXXFLAGS = @H5_CXXFLAGS@
-H5_FCFLAGS = @H5_FCFLAGS@
-H5_LONE_COLON = @H5_LONE_COLON@
-H5_VERSION = @H5_VERSION@
-HADDR_T = @HADDR_T@
-HAVE_DMALLOC = @HAVE_DMALLOC@
-HDF5_HL = @HDF5_HL@
-HDF5_INTERFACES = @HDF5_INTERFACES@
-HDF_CXX = @HDF_CXX@
-HDF_FORTRAN = @HDF_FORTRAN@
-HID_T = @HID_T@
-HL = @HL@
-HL_FOR = @HL_FOR@
-HSIZE_T = @HSIZE_T@
-HSSIZE_T = @HSSIZE_T@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INSTRUMENT = @INSTRUMENT@
-INSTRUMENT_LIBRARY = @INSTRUMENT_LIBRARY@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LINUX_LFS = @LINUX_LFS@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_STATIC_EXEC = @LT_STATIC_EXEC@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-MPE = @MPE@
-MPI_GET_SIZE = @MPI_GET_SIZE@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PARALLEL = @PARALLEL@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
-PTHREAD = @PTHREAD@
-RANLIB = @RANLIB@
-ROOT = @ROOT@
-RUNPARALLEL = @RUNPARALLEL@
-RUNSERIAL = @RUNSERIAL@
-R_INTEGER = @R_INTEGER@
-R_LARGE = @R_LARGE@
-SEARCH = @SEARCH@
-SED = @SED@
-SETX = @SETX@
-SET_MAKE = @SET_MAKE@
-
-# Hardcode SHELL to be /bin/sh. Most machines have this shell, and
-# on at least one machine configure fails to detect its existence (janus).
-# Also, when HDF5 is configured on one machine but run on another,
-# configure's automatic SHELL detection may not work on the build machine.
-SHELL = /bin/sh
-SIZE_T = @SIZE_T@
-STATIC_EXEC = @STATIC_EXEC@
-STATIC_SHARED = @STATIC_SHARED@
-STRICT_FORMAT_CHECKS = @STRICT_FORMAT_CHECKS@
-STRIP = @STRIP@
-TESTPARALLEL = @TESTPARALLEL@
-THREADSAFE = @THREADSAFE@
-TIME = @TIME@
-TR = @TR@
-TRACE_API = @TRACE_API@
-UNAME_INFO = @UNAME_INFO@
-USE_FILTER_DEFLATE = @USE_FILTER_DEFLATE@
-USE_FILTER_FLETCHER32 = @USE_FILTER_FLETCHER32@
-USE_FILTER_NBIT = @USE_FILTER_NBIT@
-USE_FILTER_SCALEOFFSET = @USE_FILTER_SCALEOFFSET@
-USE_FILTER_SHUFFLE = @USE_FILTER_SHUFFLE@
-USE_FILTER_SZIP = @USE_FILTER_SZIP@
-USINGMEMCHECKER = @USINGMEMCHECKER@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-ac_ct_FC = @ac_ct_FC@
-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 = $(exec_prefix)/doc
-dvidir = @dvidir@
-enable_shared = @enable_shared@
-enable_static = @enable_static@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-
-# Install directories that automake doesn't know about
-includedir = $(exec_prefix)/include
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
-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_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-
-# Shell commands used in Makefiles
-RM = rm -f
-CP = cp
-
-# Some machines need a command to run executables; this is that command
-# so that our tests will run.
-# We use RUNTESTS instead of RUNSERIAL directly because it may be that
-# some tests need to be run with a different command. Older versions
-# of the makefiles used the command
-# $(LIBTOOL) --mode=execute
-# in some directories, for instance.
-RUNTESTS = $(RUNSERIAL)
-
-# Libraries to link to while building
-LIBHDF5 = $(top_builddir)/src/libhdf5.la
-LIBH5TEST = $(top_builddir)/test/libh5test.la
-LIBH5F = $(top_builddir)/fortran/src/libhdf5_fortran.la
-LIBH5FTEST = $(top_builddir)/fortran/test/libh5test_fortran.la
-LIBH5CPP = $(top_builddir)/c++/src/libhdf5_cpp.la
-LIBH5TOOLS = $(top_builddir)/tools/lib/libh5tools.la
-LIBH5_HL = $(top_builddir)/hl/src/libhdf5_hl.la
-LIBH5F_HL = $(top_builddir)/hl/fortran/src/libhdf5hl_fortran.la
-LIBH5CPP_HL = $(top_builddir)/hl/c++/src/libhdf5_hl_cpp.la
-
-# Scripts used to build examples
-# If only shared libraries have been installed, have h5cc build examples with
-# shared libraries instead of static libraries
-H5CC = $(bindir)/h5cc
-H5CC_PP = $(bindir)/h5pcc
-H5FC = $(bindir)/h5fc
-H5FC_PP = $(bindir)/h5pfc
-H5CPP = $(bindir)/h5c++
-
-# The trace script; this is used on source files from the C library to
-# insert tracing macros.
-TRACE = perl $(top_srcdir)/bin/trace
-
-# .chkexe files are used to mark tests that have run successfully.
-# .chklog files are output from those tests.
-# *.clog are from the MPE option.
-CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.h5 *.jpeg
-
-# Include src and tools/lib directories
-INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/tools/lib -I$(top_srcdir)/hl/src
-
-# These are our main targets
-TEST_PROG = h52jpegtst
-TEST_SCRIPT = $(srcdir)/h52jpeg.sh
-check_SCRIPTS = $(TEST_SCRIPT)
-h52jpeg_SOURCES = h52jpeg.c
-h52jpegtst_SOURCES = h52jpegtst.c
-
-# Programs all depend on the hdf5 library, the tools library, and the HL
-# library.
-LDADD = $(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5) -ljpeg
-
-# Automake needs to be taught how to build lib, progs, and tests targets.
-# These will be filled in automatically for the most part (e.g.,
-# lib_LIBRARIES are built for lib target), but EXTRA_LIB, EXTRA_PROG, and
-# EXTRA_TEST variables are supplied to allow the user to force targets to
-# be built at certain times.
-LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES) \
- $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
-
-PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS) \
- $(EXTRA_PROG)
-
-TEST_PROG_CHKEXE = $(TEST_PROG:=.chkexe_)
-TEST_PROG_PARA_CHKEXE = $(TEST_PROG_PARA:=.chkexe_)
-TEST_SCRIPT_CHKSH = $(TEST_SCRIPT:=.chkexe_)
-TEST_SCRIPT_PARA_CHKSH = $(TEST_SCRIPT_PARA:=.chkexe_)
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
- && exit 0; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/tools/h52jpeg/Makefile'; \
- cd $(top_srcdir) && \
- $(AUTOMAKE) --foreign hl/tools/h52jpeg/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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-install-binPROGRAMS: $(bin_PROGRAMS)
- @$(NORMAL_INSTALL)
- test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
- @list='$(bin_PROGRAMS)'; for p in $$list; do \
- p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- if test -f $$p \
- || test -f $$p1 \
- ; then \
- f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
- echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
- $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
- else :; fi; \
- done
-
-uninstall-binPROGRAMS:
- @$(NORMAL_UNINSTALL)
- @list='$(bin_PROGRAMS)'; for p in $$list; do \
- f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
- echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
- rm -f "$(DESTDIR)$(bindir)/$$f"; \
- done
-
-clean-binPROGRAMS:
- @list='$(bin_PROGRAMS)'; for p in $$list; do \
- f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f $$p $$f"; \
- rm -f $$p $$f ; \
- done
-
-clean-checkPROGRAMS:
- @list='$(check_PROGRAMS)'; for p in $$list; do \
- f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f $$p $$f"; \
- rm -f $$p $$f ; \
- done
-
-clean-noinstPROGRAMS:
- @list='$(noinst_PROGRAMS)'; for p in $$list; do \
- f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f $$p $$f"; \
- rm -f $$p $$f ; \
- done
-h52jpeg$(EXEEXT): $(h52jpeg_OBJECTS) $(h52jpeg_DEPENDENCIES)
- @rm -f h52jpeg$(EXEEXT)
- $(LINK) $(h52jpeg_OBJECTS) $(h52jpeg_LDADD) $(LIBS)
-h52jpegtst$(EXEEXT): $(h52jpegtst_OBJECTS) $(h52jpegtst_DEPENDENCIES)
- @rm -f h52jpegtst$(EXEEXT)
- $(LINK) $(h52jpegtst_OBJECTS) $(h52jpegtst_LDADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/h52jpeg.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/h52jpegtst.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(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; nonemtpy = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- tags=; \
- 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; }; }'`; \
- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- tags=; \
- 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)$$tags$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$tags $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && 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 $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
- fi; \
- cp -pR $$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) $(check_SCRIPTS)
- $(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: check-am
-all-am: Makefile $(PROGRAMS) all-local
-installdirs:
- for dir in "$(DESTDIR)$(bindir)"; 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:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-checkPROGRAMS 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
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-exec-am: install-binPROGRAMS
-
-install-html: install-html-am
-
-install-info: install-info-am
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-ps: 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: uninstall-binPROGRAMS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \
- clean clean-binPROGRAMS clean-checkPROGRAMS 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-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-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 \
- uninstall-binPROGRAMS
-
-
-# List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
-# This tells the Makefiles that these targets are not files to be built but
-# commands that should be executed even if a file with the same name already
-# exists.
-.PHONY: build-check-clean build-check-p build-check-s build-lib build-progs \
- build-tests check-clean check-install check-p check-s check-vfd \
- install-doc lib progs tests uninstall-doc _exec_check-s _test help
-
-help:
- @$(top_srcdir)/bin/makehelp
-
-# lib/progs/tests targets recurse into subdirectories. build-* targets
-# build files in this directory.
-build-lib: $(LIB)
-build-progs: $(LIB) $(PROGS)
-build-tests: $(LIB) $(PROGS) $(TESTS)
-
-# General rule for recursive building targets.
-# BUILT_SOURCES contain targets that need to be built before anything else
-# in the directory (e.g., for Fortran type detection)
-lib progs tests check-s check-p :: $(BUILT_SOURCES)
- @$(MAKE) $(AM_MAKEFLAGS) build-$@ || exit 1;
- @for d in X $(SUBDIRS); do \
- if test $$d != X && test $$d != .; then \
- (set -x; cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1; \
- fi; \
- done
-
-# General rule for recursive cleaning targets. Like the rule above,
-# but doesn't require building BUILT_SOURCES.
-check-clean ::
- @$(MAKE) $(AM_MAKEFLAGS) build-$@ || exit 1;
- @for d in X $(SUBDIRS); do \
- if test $$d != X && test $$d != .; then \
- (set -x; cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1; \
- fi; \
- done
-
-# Tell Automake to build tests when the user types `make all' (this is
-# not its default behavior). Also build EXTRA_LIB and EXTRA_PROG since
-# Automake won't build them automatically, either.
-all-local: $(EXTRA_LIB) $(EXTRA_PROG) $(TESTS)
-
-# make install-doc doesn't do anything outside of doc directory, but
-# Makefiles should recognize it.
-# UPDATE: docs no longer reside in this build tree, so this target
-# is depreciated.
-install-doc uninstall-doc:
- @echo "Nothing to be done."
-
-# clean up files generated by tests so they can be re-run.
-build-check-clean:
- $(RM) -rf $(CHECK_CLEANFILES)
-
-# run check-clean whenever mostlyclean is run
-mostlyclean-local: build-check-clean
-
-# check-install is just a synonym for installcheck
-check-install: installcheck
-
-# Run each test in order, passing $(TEST_FLAGS) to the program.
-# Since tests are done in a shell loop, "make -i" does apply inside it.
-# Set HDF5_Make_Ignore to a non-blank string to ignore errors inside the loop.
-# The timestamps give a rough idea how much time the tests use.
-#
-# Note that targets in TESTS (defined above) will be built when the user
-# types 'make tests' or 'make check', but only programs in TEST_PROG,
-# TEST_PROG_PARA, or TEST_SCRIPT will actually be executed.
-check-TESTS: test
-
-test _test:
- @$(MAKE) build-check-s
- @$(MAKE) build-check-p
-
-# Actual execution of check-s.
-build-check-s: $(LIB) $(PROGS) $(TESTS)
- @if test -n "$(TEST_PROG)$(TEST_SCRIPT)"; then \
- echo "===Serial tests in `echo ${PWD} | sed -e s:.*/::` begin `date`==="; \
- fi
- @$(MAKE) $(AM_MAKEFLAGS) _exec_check-s
- @if test -n "$(TEST_PROG)$(TEST_SCRIPT)"; then \
- echo "===Serial tests in `echo ${PWD} | sed -e s:.*/::` ended `date`===";\
- fi
-
-_exec_check-s: $(TEST_PROG_CHKEXE) $(TEST_SCRIPT_CHKSH)
-
-# The dummy.chkexe here prevents the target from being
-# empty if there are no tests in the current directory.
-# $${log} is the log file.
-# $${tname} is the name of test.
-$(TEST_PROG_CHKEXE) $(TEST_PROG_PARA_CHKEXE) dummy.chkexe_:
- @if test "X$@" != "X.chkexe_" && test "X$@" != "Xdummy.chkexe_"; then \
- tname=$(@:.chkexe_=)$(EXEEXT);\
- log=$(@:.chkexe_=.chklog); \
- echo "============================"; \
- if $(top_srcdir)/bin/newer $(@:.chkexe_=.chkexe) $${tname}; then \
- echo "No need to test $${tname} again."; \
- else \
- echo "============================" > $${log}; \
- if test "X$(FORTRAN_API)" = "Xyes"; then \
- echo "Fortran API: Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \
- echo "Fortran API: $(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
- elif test "X$(CXX_API)" = "Xyes"; then \
- echo "C++ API: Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \
- echo "C++ API: $(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log};\
- else \
- echo "Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \
- echo "$(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
- fi; \
- echo "============================" >> $${log}; \
- srcdir="$(srcdir)" \
- $(TIME) $(RUNTESTS) ./$${tname} $(TEST_FLAGS) >> $${log} 2>&1 \
- && touch $(@:.chkexe_=.chkexe) || \
- (test $$HDF5_Make_Ignore && echo "*** Error ignored") || \
- (cat $${log} && false) || exit 1; \
- echo "" >> $${log}; \
- echo "Finished testing $${tname} $(TEST_FLAGS)" >> $${log}; \
- echo "============================" >> $${log}; \
- echo "Finished testing $${tname} $(TEST_FLAGS)"; \
- cat $${log}; \
- fi; \
- fi
-
-# The dummysh.chkexe here prevents the target from being
-# empty if there are no tests in the current directory.
-# $${log} is the log file.
-# $${tname} is the name of test.
-$(TEST_SCRIPT_CHKSH) $(TEST_SCRIPT_PARA_CHKSH) dummysh.chkexe_:
- @if test "X$@" != "X.chkexe_" && test "X$@" != "Xdummysh.chkexe_"; then \
- cmd=$(@:.chkexe_=);\
- tname=`basename $$cmd`;\
- chkname=`basename $(@:.chkexe_=.chkexe)`;\
- log=`basename $(@:.chkexe_=.chklog)`; \
- echo "============================"; \
- if $(top_srcdir)/bin/newer $${chkname} $$cmd $(SCRIPT_DEPEND); then \
- echo "No need to test $${tname} again."; \
- else \
- echo "============================" > $${log}; \
- if test "X$(FORTRAN_API)" = "Xyes"; then \
- echo "Fortran API: Testing $${tname} $(TEST_FLAGS)"; \
- echo "Fortran API: $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
- elif test "X$(CXX_API)" = "Xyes"; then \
- echo "C++ API: Testing $${tname} $(TEST_FLAGS)"; \
- echo "C++ API: $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
- else \
- echo "Testing $${tname} $(TEST_FLAGS)"; \
- echo "$${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
- fi; \
- echo "============================" >> $${log}; \
- RUNSERIAL="$(RUNSERIAL)" RUNPARALLEL="$(RUNPARALLEL)" \
- srcdir="$(srcdir)" \
- $(TIME) $(SHELL) $$cmd $(TEST_FLAGS) >> $${log} 2>&1 \
- && touch $${chkname} || \
- (test $$HDF5_Make_Ignore && echo "*** Error ignored") || \
- (cat $${log} && false) || exit 1; \
- echo "" >> $${log}; \
- echo "Finished testing $${tname} $(TEST_FLAGS)" >> $${log}; \
- echo "============================" >> $${log}; \
- echo "Finished testing $${tname} $(TEST_FLAGS)"; \
- cat $${log}; \
- fi; \
- echo "============================"; \
- fi
-
-# Actual execution of check-p.
-build-check-p: $(LIB) $(PROGS) $(TESTS)
- @if test -n "$(TEST_PROG_PARA)$(TEST_SCRIPT_PARA)"; then \
- echo "===Parallel tests in `echo ${PWD} | sed -e s:.*/::` begin `date`==="; \
- fi
- @if test -n "$(TEST_PROG_PARA)"; then \
- echo "**** Hint ****"; \
- echo "Parallel test files reside in the current directory" \
- "by default."; \
- echo "Set HDF5_PARAPREFIX to use another directory. E.g.,"; \
- echo " HDF5_PARAPREFIX=/PFS/user/me"; \
- echo " export HDF5_PARAPREFIX"; \
- echo " make check"; \
- echo "**** end of Hint ****"; \
- fi
- @for test in $(TEST_PROG_PARA) dummy; do \
- if test $$test != dummy; then \
- $(MAKE) $(AM_MAKEFLAGS) $$test.chkexe_ \
- RUNTESTS="$(RUNPARALLEL)" || exit 1; \
- fi; \
- done
- @for test in $(TEST_SCRIPT_PARA) dummy; do \
- if test $$test != dummy; then \
- $(MAKE) $(AM_MAKEFLAGS) $$test.chkexe_ || exit 1; \
- fi; \
- done
- @if test -n "$(TEST_PROG_PARA)$(TEST_SCRIPT_PARA)"; then \
- echo "===Parallel tests in `echo ${PWD} | sed -e s:.*/::` ended `date`===";\
- fi
-
-# Run test with different Virtual File Driver
-check-vfd: $(LIB) $(PROGS) $(TESTS)
- @for vfd in $(VFD_LIST) dummy; do \
- if test $$vfd != dummy; then \
- echo "============================"; \
- echo "Testing Virtual File Driver $$vfd"; \
- echo "============================"; \
- $(MAKE) $(AM_MAKEFLAGS) check-clean || exit 1; \
- HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1; \
- 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:
diff --git a/hl/tools/h52jpeg/h52jpeg.c b/hl/tools/h52jpeg/h52jpeg.c
deleted file mode 100644
index c4dacd1..0000000
--- a/hl/tools/h52jpeg/h52jpeg.c
+++ /dev/null
@@ -1,753 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
- * terms governing use, modification, and redistribution, is contained in *
- * the files COPYING and Copyright.html. COPYING can be found at the root *
- * of the source code distribution tree; Copyright.html can be found at the *
- * root level of an installed copy of the electronic HDF5 document set and *
- * is linked from the top-level documents page. It can also be found at *
- * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-
-
-#include <stdio.h>
-#include <stdlib.h>
-
-/*
- * Include file for users of JPEG library.
- * system headers that define at least the typedefs FILE and size_t are needed before
- */
-
-#include "jpeglib.h"
-#include "jerror.h"
-
-/* Tools library and HDF5 Image headers */
-
-#include "H5private.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-#include "h5trav.h"
-#include "H5IMpublic.h"
-
-
-const char *progname = "h52jpeg";
-int d_status = EXIT_SUCCESS;
-
-/* command-line options: The user can specify short or long-named parameters */
-static const char *s_opts = "hVvi:cp:";
-static struct long_options l_opts[] = {
- { "help", no_arg, 'h' },
- { "version", no_arg, 'V' },
- { "verbose", no_arg, 'v' },
- { "image", require_arg, 'i' },
- { "convert", no_arg, 'c' },
- { "palette", require_arg, 'p' },
- { NULL, 0, '\0' }
-};
-
-
-/* a structure that contains h52jpeg options */
-typedef struct
-{
- const char *file_name;
- const char *template_name;
- const char *image_name;
- int convert_true;
- int idx_palette;
- int verbose;
-} h52jpeg_opt_t;
-
-
-/* prototypes */
-static void usage(const char *prog);
-static int h52jpeg(h52jpeg_opt_t opt);
-static void make_jpeg_name( const char* template_name, const char* image_name, char* jpeg_name);
-static int do_object(hid_t fid, h52jpeg_opt_t opt, const char* image_name);
-static int do_image(hid_t fid, h52jpeg_opt_t opt, const char* image_name, char* jpeg_name);
-static void write_JPEG_file(char *filename, JSAMPLE *image_buffer, int image_height, int image_width, int planes);
-static void convert_to_true( hsize_t width, hsize_t height, unsigned char* ibuf, unsigned char* pbuf, unsigned char* tbuf);
-
-/*-------------------------------------------------------------------------
- * Function: main
- *
- * Purpose: h52jpeg main program
- *
- * main reads command line options and calls h52jpeg
- *
- * Programmer: Pedro Vicente, pvn@hdfgroup.org
- *
- * Return: 1, error, 0 success
- *
- * Date: May 30, 2008
- *
- *-------------------------------------------------------------------------
- */
-int main(int argc, const char *argv[])
-{
- h52jpeg_opt_t opt; /* command line options for h52jpeg */
- int op; /* option got from command line */
-
- /* initialze options to 0 */
- memset(&opt,0,sizeof(h52jpeg_opt_t));
-
- /* parse command line options */
- while ((op = get_option(argc, argv, s_opts, l_opts)) != EOF)
- {
- switch ((char)op)
- {
-
- case 'h':
- usage(progname);
- exit(EXIT_SUCCESS);
-
- case 'V':
- print_version(progname);
- exit(EXIT_SUCCESS);
-
- case 'v':
- opt.verbose = 1;
- break;
-
- case 'i':
- opt.image_name = opt_arg;
- break;
-
- case 'c':
- opt.convert_true = 1;
-
- break;
- case 'p':
- opt.idx_palette = atoi(opt_arg);
- break;
-
- } /* switch */
-
-
- } /* while */
-
- /* check for file names to be processed */
- if ( argv[ opt_ind ] != NULL && argv[ opt_ind + 1 ] != NULL )
- {
- opt.file_name = argv[ opt_ind ];
- opt.template_name = argv[ opt_ind + 1 ];
- }
-
- else
- {
- usage(progname);
- exit(EXIT_FAILURE);
- }
-
- if ( h52jpeg(opt) < 0 )
- return 1;
-
-
- return 0;
-}
-
-
-
-/*-------------------------------------------------------------------------
- * Function: usage
- *
- * Purpose: print usage
- *
- * Return: void
- *
- *-------------------------------------------------------------------------
- */
-static void usage(const char *prog)
-{
- printf("usage: %s [OPTIONS] file template\n", prog);
- printf(" file HDF5 file name\n");
- printf(" template Name template for jpeg images\n");
- printf(" OPTIONS\n");
- printf(" -h, --help Print a usage message and exit\n");
- printf(" -v, --verbose Verbose mode, print object information\n");
- printf(" -V, --version Print HDF5 version number and exit\n");
- printf(" -i, --image Image name (full path in HDF5 file)\n");
- printf(" -c, --convert Convert image from graycolor to truecolor\n");
- printf(" -p P, --palette=P Use HDF5 palette index P in conversion -c\n");
-
- printf("\n");
-
- printf(" P - is an integer, the palette index in the HDF5 image. Default is 0\n");
- printf(" template - is a string used to name the jpeg file name; this name is made\n");
- printf(" by concatenating this template with the HDF5 image name\n");
-
- printf("\n");
-
- printf("Examples of use:\n");
- printf("\n");
- printf("1) h52jpeg -v file.h5 myjpeg\n");
- printf("\n");
- printf(" Exports all images found on file.h5 to jpeg images, giving output information\n");
-
- printf("\n");
- printf("2) h52jpeg -v -i image file.h5 myjpeg\n");
- printf("\n");
- printf(" Exports the HDF5 image named <image> to a jpeg file\n");
-
- printf("\n");
- printf("2) h52jpeg -v -c p 1 -i image file.h5 myjpeg\n");
- printf("\n");
- printf(" Exports the HDF5 image named <image> to a true color jpeg image, using\n");
- printf(" the palette of index 1 in that image to do the conversion\n");
-
-
-}
-
-/*-------------------------------------------------------------------------
- * Function: h52jpeg
- *
- * Parameters: OPT, options at command line
- *
- * Purpose: traverse the HDF5 file, save HDF5 images to jpeg files
- *
- * Return: 0, success, -1 error
- *
- *-------------------------------------------------------------------------
- */
-static int h52jpeg(h52jpeg_opt_t opt)
-{
- hid_t fid;
- trav_table_t *travt = NULL;
- size_t i;
-
-
- /* open the HDF5 file */
- if (( fid = h5tools_fopen(opt.file_name, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, (size_t)0)) < 0)
- {
- error_msg(progname, "cannot open file <%s>\n", opt.file_name );
- return -1;
- }
-
- /*-------------------------------------------------------------------------
- * object name was specified at command line
- *-------------------------------------------------------------------------
- */
-
- if ( opt.image_name )
- {
- /* read object, save jpeg image */
- do_object(fid, opt, opt.image_name);
-
- }
-
- /*-------------------------------------------------------------------------
- * object name was not specified; traverse the file
- *-------------------------------------------------------------------------
- */
-
- else
-
- {
-
- /* initialize traversal table */
- trav_table_init(&travt);
-
- /* get the list of objects in the file */
- if ( h5trav_gettable(fid, travt) < 0 )
- goto out;
-
- /* search for images/datasets in file */
- for ( i = 0; i < travt->nobjs; i++)
- {
-
- switch ( travt->objs[i].type )
- {
- default:
- printf( "unknown object. Exiting ...\n" );
- goto out;
-
- case H5TRAV_TYPE_GROUP:
- case H5TRAV_TYPE_NAMED_DATATYPE:
- case H5TRAV_TYPE_LINK:
- case H5TRAV_TYPE_UDLINK:
-
- break;
-
- case H5TRAV_TYPE_DATASET:
-
- /* read object, save jpeg image */
- do_object(fid, opt, travt->objs[i].name);
-
- break; /* H5TRAV_TYPE_DATASET */
-
- } /* switch */
-
- } /* i */
-
-
- /* HDfree table */
- trav_table_free(travt);
-
- } /* opt.image_name */
-
-
- /* close */
- if ( H5Fclose(fid) < 0 )
- return -1;
-
- return 0;
-
-out:
- H5E_BEGIN_TRY
- {
- H5Fclose(fid);
-
- } H5E_END_TRY;
-
- trav_table_free(travt);
-
-
- return -1;
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: do_object
- *
- * Parameters: FID: HDF5 file id
- * OPT: command line options
- * OBJECT_NAME: the name of the object (type H5TRAV_TYPE_DATASET)
- *
- * Purpose: make the jpeg file name, read HDF5 image, save the jpeg image
- *
- *
- * Return: 0, success, -1 error
- *
- *-------------------------------------------------------------------------
- */
-static
-int do_object(hid_t fid, h52jpeg_opt_t opt, const char* object_name)
-{
- int done=0; /* return value from do_image */
- char jpeg_name[1024];
-
- /* build the jpeg file name */
- make_jpeg_name( opt.template_name, object_name, jpeg_name);
-
- if ( opt.verbose)
- {
- printf("%s ...", object_name );
- }
-
- /*-------------------------------------------------------------------------
- * HDF5 Image
- *-------------------------------------------------------------------------
- */
-
- if ( H5IMis_image( fid, object_name ) )
- {
- /* read image, save jpeg image */
- done = do_image(fid, opt, object_name, jpeg_name);
- }
-
-
- if ( opt.verbose)
- {
- if ( done )
- {
- printf("saved to %s\n", jpeg_name );
- }
- else
- {
- printf("\n");
- }
-
- }
-
- return 0;
-
-
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: do_image
- *
- * Parameters: FID: HDF5 file id
- * OPT: command line options
- * OBJECT_NAME: the name of the HDF5 image
- * JPEG_NAME: the name of the jpeg image
- *
- * Purpose: read HDF5 image, save jpeg image
- *
- * Return: 0, success, -1 error
- *
- *-------------------------------------------------------------------------
- */
-static
-int do_image(hid_t fid, h52jpeg_opt_t opt, const char* image_name, char* jpeg_name)
-{
- hsize_t width;
- hsize_t height;
- hsize_t planes;
- char interlace[20];
- hssize_t npals;
- const char* name;
- int done;
- unsigned char* ibuf=NULL;
-
- name = image_name;
-
- done = 0;
-
- if ( H5IMget_image_info( fid, name, &width, &height, &planes, interlace, &npals ) < 0 )
- goto out;
-
- if (NULL == (ibuf = HDmalloc( (int)width * (int)height * (int)planes )))
- goto out;
-
- if ( H5IMread_image( fid, name, ibuf ) < 0 )
- {
- goto out;
- }
-
- /*-------------------------------------------------------------------------
- * no conversion to true color requested or true color image, just save what we found
- * this will result either in
- *
- * 24bit HDF5 ---> true color jpeg
- * 8bit HDF5 ---> grey color jpeg
- *
- *-------------------------------------------------------------------------
- */
- if ( planes == 3 || !opt.convert_true )
- {
- /* write the jpeg file */
- write_JPEG_file (jpeg_name,
- ibuf,
- (int) height,
- (int) width,
- (int) planes);
-
- done = 1;
- }
- /*-------------------------------------------------------------------------
- * conversion to truecolor
- * this will result in
- *
- * 8bit HDF5 ---> true color jpeg
- *
- *-------------------------------------------------------------------------
- */
- else if (opt.convert_true && planes == 1 )
- {
- hsize_t pdims[2]; /* palette dimensions */
- unsigned char *pbuf=NULL;/* palette array */
- unsigned char *tbuf=NULL;/* true color array */
- int ipal; /* palette to use */
-
- if ( H5IMget_npalettes( fid, name, &npals ) < 0 )
- {
- goto out;
- }
-
- /*-------------------------------------------------------------------------
- * there are palettes
- *-------------------------------------------------------------------------
- */
- if ( npals > 0 )
- {
- /* use either the default (0) palette or a requested one */
- ipal = ( opt.idx_palette > 0 ) ? opt.idx_palette : 0;
-
- /* the requested palette may not exist . use the default */
- if ( opt.idx_palette >= npals )
- {
- ipal = 0;
-
- if ( opt.verbose )
- {
- printf("palette index <%d> does not exist. Using default...",
- opt.idx_palette );
- }
- }
-
-
- if ( H5IMget_palette_info( fid, name, ipal, pdims ) < 0 )
- goto out;
-
- if (NULL == (pbuf = HDmalloc( (size_t)pdims[0] * (size_t)pdims[1] )))
- goto out;
-
- if (NULL == (tbuf = HDmalloc( (int)width * (int)height * 3 )))
- goto out;
-
- if ( H5IMget_palette( fid, name, ipal, pbuf ) < 0 )
- goto out;
-
- /* convert indexed image to true color image */
- convert_to_true(width, height, ibuf, pbuf, tbuf);
-
- /* write the jpeg file */
- write_JPEG_file (jpeg_name,
- tbuf,
- (int) height,
- (int) width,
- 3);
-
- done = 1;
-
- HDfree( pbuf );
- HDfree( tbuf );
- pbuf = NULL;
- tbuf = NULL;
- }
- /*-------------------------------------------------------------------------
- * there are no palettes
- *-------------------------------------------------------------------------
- */
- else
- {
- done = 0;
- if ( opt.verbose )
- {
- printf("image <%s> has no palette...", name );
- }
- } /* no palettes */
-
- } /* conversion to truecolor */
-
- HDfree( ibuf );
- ibuf = NULL;
-
- return done;
-
-out:
-
- return -1;
-
-}
-
-/*-------------------------------------------------------------------------
- * Function: make_jpeg_name
- *
- * Parameters: template name (IN), image name (IN), jpeg name (IN/OUT)
- *
- * Purpose: build a name for the jpeg image file upon a template name
- * and the HDF5 image name. Replace the special characters
- * '%', '@', '$', '/', ':', '&', ' ', and '*' with '_'
- *
- * Return: void
- *
- *-------------------------------------------------------------------------
- */
-static
-void make_jpeg_name( const char* template_name, const char* image_name, char* jpeg_name)
-{
- int j;
- int len;
-
- HDstrcpy( jpeg_name, template_name );
- HDstrcat( jpeg_name, image_name );
- HDstrcat( jpeg_name, ".jpeg" );
- len = HDstrlen( jpeg_name);
-
- /* HDF5 path names might contain '/', replace with '_' */
- for (j = 0; j < len; j++)
- {
- if ( (jpeg_name[j] == '/') ||
- (jpeg_name[j] == '%') ||
- (jpeg_name[j] == '@') ||
- (jpeg_name[j] == '$') ||
- (jpeg_name[j] == '/') ||
- (jpeg_name[j] == ':') ||
- (jpeg_name[j] == '&') ||
- (jpeg_name[j] == ' ') ||
- (jpeg_name[j] == '*') )
- {
- jpeg_name[j] = '_';
- }
- }
-
-}
-
-/*-------------------------------------------------------------------------
- * Function: convert_to_true
- *
- * Parameters: WIDTH (IN): width of image
- * HEIGHT (IN): height of image
- * IBUF (IN): indexed image buffer
- * PBUF (IN): palette buffer
- * TBUF (IN/OUT): true color image buffer
- *
- * Purpose: convert a greycolor buffer to a true color buffer using a palette buffer
- *
- * Return: void
- *
- *-------------------------------------------------------------------------
- */
-static
-void convert_to_true( hsize_t width, hsize_t height, unsigned char* ibuf, unsigned char* pbuf, unsigned char* tbuf)
-{
- hsize_t i, j;
-
- for ( i = 0, j = 0; i < width * height; i++, j += 3)
- {
- unsigned char idx;
- unsigned char r;
- unsigned char g;
- unsigned char b;
-
- /* get the index from the grey image */
- idx = ibuf[i];
-
- /* get the RGB color */
- r = pbuf[3*idx];
- g = pbuf[3*idx+1];
- b = pbuf[3*idx+2];
-
- /* define the color buffer */
- tbuf[j] = r;
- tbuf[j+1] = g;
- tbuf[j+2] = b;
-
- }
-
-
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: write_JPEG_file (adapted from example.c of jpeg distribution)
- *
- * Purpose: save a jpeg file named FILENAME, using the image buffer IMAGE_BUFFER
- *
- * The standard input image format is a rectangular array of pixels, with
- * each pixel having the same number of "component" values (color channels).
- * Each pixel row is an array of JSAMPLEs (which typically are unsigned chars).
- * If you are working with color data, then the color values for each pixel
- * must be adjacent in the row; for example, R,G,B,R,G,B,R,G,B,... for 24-bit
- * RGB color.
- *
- * Return: void, exits on error
- *
- *-------------------------------------------------------------------------
- */
-
-static
-void write_JPEG_file(char *filename, /* JPEG file name */
- JSAMPLE *image_buffer, /* Points to large array of R,G,B-order data */
- int image_height, /* Number of rows in image */
- int image_width, /* Number of columns in image */
- int planes) /* # of color components per pixel */
-{
- /* This struct contains the JPEG compression parameters and pointers to
- * working space (which is allocated as needed by the JPEG library).
- * It is possible to have several such structures, representing multiple
- * compression/decompression processes, in existence at once. We refer
- * to any one struct (and its associated working data) as a "JPEG object".
- */
- struct jpeg_compress_struct cinfo;
- /* This struct represents a JPEG error handler. It is declared separately
- * because applications often want to supply a specialized error handler
- * (see the second half of this file for an example). But here we just
- * take the easy way out and use the standard error handler, which will
- * print a message on stderr and call exit() if compression fails.
- * Note that this struct must live as long as the main JPEG parameter
- * struct, to avoid dangling-pointer problems.
- */
- struct jpeg_error_mgr jerr;
- /* More stuff */
- FILE * outfile; /* target file */
- JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */
- int row_stride; /* physical row width in image buffer */
-
- /* Step 1: allocate and initialize JPEG compression object */
-
- /* We have to set up the error handler first, in case the initialization
- * step fails. (Unlikely, but it could happen if you are out of memory.)
- * This routine fills in the contents of struct jerr, and returns jerr's
- * address which we place into the link field in cinfo.
- */
- cinfo.err = jpeg_std_error(&jerr);
- /* Now we can initialize the JPEG compression object. */
- jpeg_create_compress(&cinfo);
-
- /* Step 2: specify data destination (eg, a file) */
- /* Note: steps 2 and 3 can be done in either order. */
-
- /* Here we use the library-supplied code to send compressed data to a
- * stdio stream. You can also write your own code to do something else.
- * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that
- * requires it in order to write binary files.
- */
- if ((outfile = fopen(filename, "wb")) == NULL) {
- fprintf(stderr, "can't open %s\n", filename);
- exit(1);
- }
- jpeg_stdio_dest(&cinfo, outfile);
-
- /* Step 3: set parameters for compression */
-
- /* First we supply a description of the input image.
- * Four fields of the cinfo struct must be filled in:
- */
- cinfo.image_width = image_width; /* image width and height, in pixels */
- cinfo.image_height = image_height;
- cinfo.input_components = planes; /* # of color components per pixel */
-
- /* colorspace of input image */
- if (planes == 3)
- cinfo.in_color_space = JCS_RGB;
- else if (planes == 1)
- cinfo.in_color_space = JCS_GRAYSCALE;
-
- /* Now use the library's routine to set default compression parameters.
- * (You must set at least cinfo.in_color_space before calling this,
- * since the defaults depend on the source color space.)
- */
- jpeg_set_defaults(&cinfo);
- /* Now you can set any non-default parameters you wish to.
- * Here we just illustrate the use of quality (quantization table) scaling:
- */
- jpeg_set_quality(&cinfo, 100, TRUE /* limit to baseline-JPEG values */);
-
- /* Step 4: Start compressor */
-
- /* TRUE ensures that we will write a complete interchange-JPEG file.
- * Pass TRUE unless you are very sure of what you're doing.
- */
- jpeg_start_compress(&cinfo, TRUE);
-
- /* Step 5: while (scan lines remain to be written) */
- /* jpeg_write_scanlines(...); */
-
- /* Here we use the library's state variable cinfo.next_scanline as the
- * loop counter, so that we don't have to keep track ourselves.
- * To keep things simple, we pass one scanline per call; you can pass
- * more if you wish, though.
- */
- row_stride = image_width * planes; /* JSAMPLEs per row in image_buffer */
-
- while (cinfo.next_scanline < cinfo.image_height) {
- /* jpeg_write_scanlines expects an array of pointers to scanlines.
- * Here the array is only one element long, but you could pass
- * more than one scanline at a time if that's more convenient.
- */
- row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride];
- (void) jpeg_write_scanlines(&cinfo, row_pointer, 1);
- }
-
- /* Step 6: Finish compression */
-
- jpeg_finish_compress(&cinfo);
- /* After finish_compress, we can close the output file. */
- fclose(outfile);
-
- /* Step 7: release JPEG compression object */
-
- /* This is an important step since it will release a good deal of memory. */
- jpeg_destroy_compress(&cinfo);
-
- /* And we're done! */
-}
-
diff --git a/hl/tools/h52jpeg/h52jpeg.sh b/hl/tools/h52jpeg/h52jpeg.sh
deleted file mode 100644
index f9b1e2c..0000000
--- a/hl/tools/h52jpeg/h52jpeg.sh
+++ /dev/null
@@ -1,96 +0,0 @@
-#! /bin/sh
-#
-# Copyright by The HDF Group.
-# Copyright by the Board of Trustees of the University of Illinois.
-# All rights reserved.
-#
-# This file is part of HDF5. The full HDF5 copyright notice, including
-# terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html. COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page. It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have
-# access to either file, you may request a copy from help@hdfgroup.org.
-#
-# Tests for the h52jpeg tool
-# Pedro Vicente Nunes (THG), 6/16/2008
-
-TOOL=h52jpeg # The tool name
-TOOL_BIN=`pwd`/$TOOL # The path of the tool binary
-
-SRCFILE=h52jpegtst.h5
-INDIR=$srcdir/testfiles
-TESTFILE="$INDIR/$SRCFILE"
-
-nerrors=0
-
-
-# Print a line-line message left justified in a field of 70 characters
-# beginning with the word "Testing".
-#
-TESTING() {
- SPACES=" "
- echo "Testing $* $SPACES" | cut -c1-70 | tr -d '\012'
-}
-
-# Just call the tool binary with the command line parameters
-# and use the return value of main to print FAILED or PASSED
-#
-TOOLTEST()
-{
- # Run test.
- # Tflops interprets "$@" as "" when no parameter is given (e.g., the
- # case of missing file name). Changed it to use $@ till Tflops fixes it.
-
- if [ "`uname -s`" = "TFLOPS O/S" ]; then
- $RUNSERIAL $TOOL_BIN $@
- else
- $RUNSERIAL $TOOL_BIN "$@"
- fi
-
- RET=$?
- if [ $RET != 0 ] ; then
- echo "*FAILED*"
- nerrors="`expr $nerrors + 1`"
- else
- echo " PASSED"
- fi
-}
-
-
-
-##############################################################################
-# The tests
-# To avoid the printing of the complete full path of the test file, that hides
-# all the other parameters for long paths, the printing of the command line
-# is done first in
-# TESTING with the name only of the test file $TOOL, not its full path $TESTFILE
-##############################################################################
-
-
-
-# Test for traversing the file and export all images using defaults
-TESTING $TOOL $SRCFILE myjpeg1
-TOOLTEST $TESTFILE myjpeg1
-
-# Test for reading an image path
-TESTING $TOOL -i im8_1pal $SRCFILE myjpeg2
-TOOLTEST -i im8_1pal $TESTFILE myjpeg2
-
-# Test for conversion HDF5 8bit ---> jpeg true, use the default palette
-TESTING $TOOL -c $SRCFILE myjpeg3
-TOOLTEST -c $TESTFILE myjpeg3
-
-# Test for conversion HDF5 8bit ---> jpeg true, use a palette
-TESTING $TOOL -c -p 1 $SRCFILE myjpeg4
-TOOLTEST -c -p 1 $TESTFILE myjpeg4
-
-
-
-if test $nerrors -eq 0 ; then
- echo "All $TOOL tests passed."
-fi
-
-exit $nerrors
-
diff --git a/hl/tools/h52jpeg/h52jpegtst.c b/hl/tools/h52jpeg/h52jpegtst.c
deleted file mode 100644
index 08ad7d4..0000000
--- a/hl/tools/h52jpeg/h52jpegtst.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
- * terms governing use, modification, and redistribution, is contained in *
- * the files COPYING and Copyright.html. COPYING can be found at the root *
- * of the source code distribution tree; Copyright.html can be found at the *
- * root level of an installed copy of the electronic HDF5 document set and *
- * is linked from the top-level documents page. It can also be found at *
- * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#include "hdf5.h"
-#include "hdf5_hl.h"
-#include "H5private.h"
-#include "h52jpegtst.h"
-#include <stdlib.h>
-#include <string.h>
-
-#define IM_1PAL "im8_1pal"
-#define IM_2PAL "im8_2pal"
-#define PAL1 "pal1"
-#define PAL2 "pal2"
-
-static int make_images( hid_t fid );
-static int read_data(const char* fname, hsize_t *width, hsize_t *height );
-unsigned char *gbuf = NULL; /* global buffer for image data */
-
-
-/*-------------------------------------------------------------------------
- * Function: main
- *
- * Purpose: h52jpegtst main program. Generate images to be used
- * by h52jpeg tests
- *
- * Programmer: Pedro Vicente, pvn@hdfgroup.org
- *
- * Date: May 30, 2008
- *
- *-------------------------------------------------------------------------
- */
-int main( void )
-{
- hid_t fid; /* HDF5 file identifier */
-
- /* create a new HDF5 file using default properties. */
- if (( fid = H5Fcreate( "h52jpegtst.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT )) < 0 )
- return 1;
-
- /* make images */
- if ( make_images( fid ) < 0 )
- goto out;
-
- /* close the file. */
- H5Fclose( fid );
-
- return 0;
-
-out:
- printf("Error on return function...Exiting\n");
- H5Fclose( fid );
- return 1;
-}
-
-/*-------------------------------------------------------------------------
- * Function: make_images
- *
- * Purpose: generate images
- *
- *-------------------------------------------------------------------------
- */
-
-static int make_images( hid_t fid )
-{
- hid_t gid;
- hsize_t width; /* width of image */
- hsize_t height; /* height of image */
- hsize_t pal_dims[2] = {PAL_ENTRIES,3}; /* palette dimensions */
- unsigned char pal[ PAL_ENTRIES * 3 ]; /* palette array */
- int i, n;
-
- /*-------------------------------------------------------------------------
- * indexed image with 1 palette
- *-------------------------------------------------------------------------
- */
-
- /* read first data file */
- if ( read_data( "image8.txt", &width, &height ) < 0 )
- goto out;
-
- /* make the image */
- if ( H5IMmake_image_8bit( fid, IM_1PAL, width, height, gbuf ) < 0 )
- goto out;
-
- /* make a palette */
- if ( H5IMmake_palette( fid, PAL1, pal_dims, pal_rgb ) < 0 )
- goto out;
-
- /* attach the 1st palette to the image */
- if ( H5IMlink_palette( fid, IM_1PAL, PAL1 ) < 0 )
- {
- goto out;
- }
-
- /*-------------------------------------------------------------------------
- * indexed image with 2 palettes
- *-------------------------------------------------------------------------
- */
-
- /* make the image */
- if ( H5IMmake_image_8bit( fid, IM_2PAL, width, height, gbuf ) < 0 )
- goto out;
-
- /* attach the 1st palette to the image */
- if ( H5IMlink_palette( fid, IM_2PAL, PAL1 ) < 0 )
- {
- goto out;
- }
-
- /*-------------------------------------------------------------------------
- * define another palette, green tones
- *-------------------------------------------------------------------------
- */
- for ( i = 0, n = 0; i < PAL_ENTRIES*3; i+=3, n++)
- {
- pal[i] =0; /* red */
- pal[i+1]=n; /* green */
- pal[i+2]=0; /* blue */
- }
-
- /* save the palette */
- if ( H5IMmake_palette( fid, PAL2, pal_dims, pal ) < 0 )
- goto out;
-
- /* attach the palette to the image */
- if ( H5IMlink_palette( fid, IM_2PAL, PAL2 ) < 0 )
- {
- goto out;
- }
-
- /*-------------------------------------------------------------------------
- * make another image, in a group and no palette
- *-------------------------------------------------------------------------
- */
-
- if (( gid = H5Gcreate2(fid, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 )
- goto out;
-
- /* make the image with a name with "%", "@", "$", "/", ":", "&", and "*" */
- if ( H5IMmake_image_8bit( gid, "1%2@3$45:6&7*", width, height, gbuf ) < 0 )
- goto out;
-
- H5Gclose(gid);
-
-
- /*-------------------------------------------------------------------------
- * true color image with pixel interlace in RGB type
- *-------------------------------------------------------------------------
- */
-
- /* read second data file */
- if ( read_data( "image24pixel.txt", &width, &height ) < 0 )
- goto out;
-
- /* make dataset */
- if ( H5IMmake_image_24bit( fid, "img24", width, height, "INTERLACE_PIXEL", gbuf ) < 0 )
- goto out;
-
- return 0;
-
-out:
- printf("Error on return function...Exiting\n");
- return -1;
-}
-
-
-
-
-
-/*-------------------------------------------------------------------------
- * read_data
- * utility function to read ASCII image data
- * the files have a header of the type
- *
- * components
- * n
- * height
- * n
- * width
- * n
- *
- * followed by the image data
- *
- *-------------------------------------------------------------------------
- */
-
-static int read_data( const char* fname, /*IN*/
- hsize_t *width, /*OUT*/
- hsize_t *height /*OUT*/ )
-{
- int i, n;
- int color_planes;
- char str[20];
- FILE *f;
- int w, h;
- char *srcdir = getenv("srcdir"); /* the source directory */
- char data_file[512]=""; /* buffer to hold name of existing data file */
-
- /*-------------------------------------------------------------------------
- * compose the name of the file to open, using "srcdir", if appropriate
- *-------------------------------------------------------------------------
- */
- strcpy(data_file, "");
- if (srcdir)
- {
- strcpy(data_file, srcdir);
- strcat(data_file, "/");
- }
- strcat(data_file,fname);
-
- /*-------------------------------------------------------------------------
- * read
- *-------------------------------------------------------------------------
- */
-
- f = fopen(data_file, "r");
- if ( f == NULL )
- {
- printf( "Could not open file %s. Try set $srcdir \n", data_file );
- return -1;
- }
-
- fscanf( f, "%s", str );
- fscanf( f, "%d", &color_planes );
- fscanf( f, "%s", str );
- fscanf( f, "%d", &h);
- fscanf( f, "%s", str );
- fscanf( f, "%d", &w);
-
- *width = (hsize_t)w;
- *height = (hsize_t)h;
-
- if ( gbuf )
- {
- free( gbuf );
- gbuf=NULL;
- }
-
- gbuf = (unsigned char*) malloc (w * h * color_planes * sizeof( unsigned char ));
-
- for (i = 0; i < h * w * color_planes ; i++)
- {
- fscanf( f, "%d",&n );
- gbuf[i] = (unsigned char)n;
- }
- fclose(f);
-
- return 1;
-
-}
-
-
-
-
-
diff --git a/hl/tools/h52jpeg/h52jpegtst.h b/hl/tools/h52jpeg/h52jpegtst.h
deleted file mode 100644
index 749e571..0000000
--- a/hl/tools/h52jpeg/h52jpegtst.h
+++ /dev/null
@@ -1,286 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
- * terms governing use, modification, and redistribution, is contained in *
- * the files COPYING and Copyright.html. COPYING can be found at the root *
- * of the source code distribution tree; Copyright.html can be found at the *
- * root level of an installed copy of the electronic HDF5 document set and *
- * is linked from the top-level documents page. It can also be found at *
- * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-
-#ifndef _PAL_RGB_H
-#define _PAL_RGB_H
-
-#define PAL_ENTRIES 256
-
-const unsigned char pal_rgb[PAL_ENTRIES*3] = {0,0,0,
-0,0,131,
-0,0,135,
-0,0,139,
-0,0,143,
-0,0,147,
-0,0,151,
-0,0,155,
-0,0,159,
-0,0,163,
-0,0,167,
-0,0,171,
-0,0,175,
-0,0,179,
-0,0,183,
-0,0,187,
-0,0,191,
-0,0,195,
-0,0,199,
-0,0,203,
-0,0,207,
-0,0,211,
-0,0,215,
-0,0,219,
-0,0,223,
-0,0,227,
-0,0,231,
-0,0,235,
-0,0,239,
-0,0,243,
-0,0,247,
-0,0,251,
-0,0,255,
-0,0,255,
-0,3,255,
-0,7,255,
-0,11,255,
-0,15,255,
-0,19,255,
-0,23,255,
-0,27,255,
-0,31,255,
-0,35,255,
-0,39,255,
-0,43,255,
-0,47,255,
-0,51,255,
-0,55,255,
-0,59,255,
-0,63,255,
-0,67,255,
-0,71,255,
-0,75,255,
-0,79,255,
-0,83,255,
-0,87,255,
-0,91,255,
-0,95,255,
-0,99,255,
-0,103,255,
-0,107,255,
-0,111,255,
-0,115,255,
-0,119,255,
-0,123,255,
-0,127,255,
-0,131,255,
-0,135,255,
-0,139,255,
-0,143,255,
-0,147,255,
-0,151,255,
-0,155,255,
-0,159,255,
-0,163,255,
-0,167,255,
-0,171,255,
-0,175,255,
-0,179,255,
-0,183,255,
-0,187,255,
-0,191,255,
-0,195,255,
-0,199,255,
-0,203,255,
-0,207,255,
-0,211,255,
-0,215,255,
-0,219,255,
-0,223,255,
-0,227,255,
-0,231,255,
-0,235,255,
-0,239,255,
-0,243,255,
-0,247,255,
-0,251,255,
-0,255,255,
-0,255,255,
-3,255,251,
-7,255,247,
-11,255,243,
-15,255,239,
-19,255,235,
-23,255,231,
-27,255,227,
-31,255,223,
-35,255,219,
-39,255,215,
-43,255,211,
-47,255,207,
-51,255,203,
-55,255,199,
-59,255,195,
-63,255,191,
-67,255,187,
-71,255,183,
-75,255,179,
-79,255,175,
-83,255,171,
-87,255,167,
-91,255,163,
-95,255,159,
-99,255,155,
-103,255,151,
-107,255,147,
-111,255,143,
-115,255,139,
-119,255,135,
-123,255,131,
-127,255,127,
-131,255,123,
-135,255,119,
-139,255,115,
-143,255,111,
-147,255,107,
-151,255,103,
-155,255,99,
-159,255,95,
-163,255,91,
-167,255,87,
-171,255,83,
-175,255,79,
-179,255,75,
-183,255,71,
-187,255,67,
-191,255,63,
-195,255,59,
-199,255,55,
-203,255,51,
-207,255,47,
-211,255,43,
-215,255,39,
-219,255,35,
-223,255,31,
-227,255,27,
-231,255,23,
-235,255,19,
-239,255,15,
-243,255,11,
-247,255,7,
-251,255,3,
-255,255,0,
-255,251,0,
-255,247,0,
-255,243,0,
-255,239,0,
-255,235,0,
-255,231,0,
-255,227,0,
-255,223,0,
-255,219,0,
-255,215,0,
-255,211,0,
-255,207,0,
-255,203,0,
-255,199,0,
-255,195,0,
-255,191,0,
-255,187,0,
-255,183,0,
-255,179,0,
-255,175,0,
-255,171,0,
-255,167,0,
-255,163,0,
-255,159,0,
-255,155,0,
-255,151,0,
-255,147,0,
-255,143,0,
-255,139,0,
-255,135,0,
-255,131,0,
-255,127,0,
-255,123,0,
-255,119,0,
-255,115,0,
-255,111,0,
-255,107,0,
-255,103,0,
-255,99,0,
-255,95,0,
-255,91,0,
-255,87,0,
-255,83,0,
-255,79,0,
-255,75,0,
-255,71,0,
-255,67,0,
-255,63,0,
-255,59,0,
-255,55,0,
-255,51,0,
-255,47,0,
-255,43,0,
-255,39,0,
-255,35,0,
-255,31,0,
-255,27,0,
-255,23,0,
-255,19,0,
-255,15,0,
-255,11,0,
-255,7,0,
-255,3,0,
-255,0,0,
-250,0,0,
-246,0,0,
-241,0,0,
-237,0,0,
-233,0,0,
-228,0,0,
-224,0,0,
-219,0,0,
-215,0,0,
-211,0,0,
-206,0,0,
-202,0,0,
-197,0,0,
-193,0,0,
-189,0,0,
-184,0,0,
-180,0,0,
-175,0,0,
-171,0,0,
-167,0,0,
-162,0,0,
-158,0,0,
-153,0,0,
-149,0,0,
-145,0,0,
-140,0,0,
-136,0,0,
-131,0,0,
-127,0,0
-};
-
-
-
-#endif /* _PAL_RGB_H */
-
-
-
-
diff --git a/hl/tools/h52jpeg/image24pixel.txt b/hl/tools/h52jpeg/image24pixel.txt
deleted file mode 100644
index 8af73f2..0000000
--- a/hl/tools/h52jpeg/image24pixel.txt
+++ /dev/null
@@ -1,101475 +0,0 @@
-components
-3
-height
-149
-width
-227
-48
-47
-45
-48
-47
-45
-49
-48
-46
-50
-49
-47
-53
-49
-46
-53
-49
-46
-54
-50
-47
-54
-50
-47
-56
-51
-47
-56
-51
-47
-58
-51
-45
-58
-51
-45
-58
-51
-45
-58
-51
-45
-58
-51
-45
-58
-51
-45
-58
-50
-47
-57
-49
-46
-57
-49
-46
-56
-48
-45
-56
-48
-45
-57
-49
-46
-57
-49
-46
-58
-50
-47
-56
-48
-45
-56
-48
-45
-56
-48
-45
-56
-48
-45
-56
-48
-45
-56
-48
-45
-56
-48
-45
-56
-48
-45
-54
-46
-43
-54
-46
-43
-54
-46
-43
-53
-45
-42
-53
-45
-42
-52
-44
-41
-52
-44
-41
-52
-44
-41
-52
-44
-41
-52
-44
-41
-52
-44
-41
-52
-44
-41
-52
-44
-41
-52
-44
-41
-52
-44
-41
-50
-45
-41
-47
-42
-36
-47
-44
-37
-47
-44
-37
-48
-45
-38
-49
-46
-39
-50
-47
-40
-51
-48
-41
-51
-48
-41
-54
-51
-44
-54
-51
-44
-55
-52
-45
-56
-53
-46
-56
-53
-46
-57
-54
-47
-58
-55
-48
-58
-55
-46
-65
-58
-48
-66
-60
-48
-68
-62
-50
-70
-64
-52
-73
-65
-52
-74
-66
-53
-75
-67
-54
-75
-67
-54
-77
-68
-53
-77
-68
-53
-79
-67
-51
-78
-66
-50
-79
-67
-51
-79
-67
-51
-80
-68
-52
-82
-69
-53
-82
-63
-49
-89
-63
-50
-98
-64
-52
-110
-66
-53
-125
-69
-54
-139
-72
-56
-153
-71
-57
-163
-70
-55
-175
-71
-58
-184
-71
-57
-190
-69
-58
-197
-71
-59
-199
-71
-62
-202
-71
-63
-203
-72
-64
-208
-69
-64
-231
-70
-76
-237
-67
-76
-235
-68
-75
-235
-69
-73
-238
-67
-73
-239
-66
-68
-241
-62
-66
-244
-61
-65
-248
-59
-65
-247
-58
-64
-244
-58
-63
-240
-60
-63
-233
-63
-64
-226
-64
-62
-215
-63
-60
-203
-65
-55
-187
-61
-47
-181
-64
-46
-181
-64
-46
-180
-63
-45
-180
-63
-45
-179
-64
-45
-178
-63
-45
-175
-64
-45
-173
-64
-44
-170
-65
-44
-166
-65
-45
-162
-66
-44
-159
-64
-42
-155
-65
-41
-152
-64
-42
-150
-65
-44
-148
-62
-45
-146
-63
-47
-146
-63
-47
-145
-62
-46
-145
-62
-44
-144
-61
-43
-146
-60
-43
-146
-60
-43
-148
-63
-43
-148
-63
-43
-148
-61
-42
-148
-61
-42
-148
-61
-42
-149
-62
-43
-150
-63
-44
-150
-64
-47
-150
-63
-54
-149
-62
-53
-151
-61
-50
-159
-63
-49
-169
-66
-51
-179
-68
-51
-188
-68
-52
-191
-68
-52
-185
-63
-48
-181
-65
-50
-172
-70
-56
-158
-72
-59
-135
-72
-57
-111
-65
-50
-84
-56
-42
-67
-51
-38
-61
-53
-50
-57
-53
-52
-57
-53
-52
-55
-51
-50
-55
-49
-49
-54
-48
-48
-53
-48
-45
-53
-48
-45
-55
-50
-47
-55
-50
-47
-55
-50
-47
-54
-49
-46
-54
-49
-45
-53
-48
-44
-53
-48
-44
-52
-49
-44
-47
-47
-45
-46
-48
-45
-47
-47
-45
-47
-47
-45
-48
-47
-45
-48
-47
-45
-50
-46
-45
-50
-46
-45
-53
-44
-45
-52
-43
-44
-52
-42
-43
-51
-41
-42
-55
-40
-43
-61
-46
-49
-69
-54
-57
-80
-58
-60
-106
-66
-67
-124
-73
-72
-141
-77
-77
-149
-79
-79
-159
-87
-91
-170
-100
-110
-170
-111
-131
-159
-116
-144
-148
-123
-163
-135
-127
-174
-128
-134
-186
-126
-136
-189
-115
-121
-173
-96
-97
-145
-84
-75
-118
-80
-68
-104
-83
-74
-103
-79
-71
-94
-77
-72
-94
-84
-81
-98
-102
-100
-111
-124
-125
-130
-141
-145
-144
-153
-158
-152
-163
-169
-159
-162
-168
-154
-158
-160
-147
-143
-146
-129
-123
-124
-108
-102
-103
-85
-88
-87
-69
-81
-78
-69
-85
-82
-91
-85
-81
-98
-85
-81
-98
-48
-47
-45
-48
-47
-45
-49
-48
-46
-49
-48
-46
-52
-48
-45
-53
-49
-46
-54
-50
-47
-54
-50
-47
-56
-51
-47
-56
-51
-47
-58
-51
-45
-58
-51
-45
-58
-51
-45
-58
-51
-45
-58
-51
-45
-58
-51
-45
-57
-49
-46
-57
-49
-46
-56
-48
-45
-56
-48
-45
-56
-48
-45
-56
-48
-45
-57
-49
-46
-57
-49
-46
-56
-48
-45
-56
-48
-45
-56
-48
-45
-56
-48
-45
-56
-48
-45
-56
-48
-45
-56
-48
-45
-56
-48
-45
-54
-46
-43
-54
-46
-43
-53
-45
-42
-53
-45
-42
-53
-45
-42
-52
-44
-41
-52
-44
-41
-52
-44
-41
-53
-45
-42
-53
-45
-42
-53
-45
-42
-53
-45
-42
-53
-45
-42
-53
-45
-42
-53
-45
-42
-51
-46
-42
-48
-43
-37
-48
-45
-38
-48
-45
-38
-49
-46
-39
-50
-47
-40
-51
-48
-41
-52
-49
-42
-52
-49
-42
-54
-51
-44
-54
-51
-44
-55
-52
-45
-55
-52
-45
-56
-53
-46
-57
-54
-47
-58
-55
-48
-58
-55
-46
-64
-57
-47
-65
-59
-47
-67
-61
-49
-69
-63
-51
-72
-64
-51
-73
-65
-52
-74
-66
-53
-74
-66
-53
-76
-67
-52
-76
-67
-52
-77
-65
-49
-77
-65
-49
-77
-65
-49
-78
-66
-50
-79
-67
-51
-81
-68
-52
-80
-62
-48
-85
-63
-49
-94
-65
-51
-106
-67
-52
-120
-68
-54
-132
-69
-52
-146
-69
-53
-156
-67
-51
-167
-67
-52
-175
-65
-52
-181
-65
-52
-188
-66
-55
-192
-68
-58
-196
-69
-60
-197
-70
-61
-205
-67
-64
-225
-69
-73
-231
-66
-73
-232
-67
-73
-234
-68
-72
-237
-68
-71
-239
-66
-68
-243
-64
-67
-246
-63
-67
-248
-59
-65
-247
-58
-64
-244
-58
-63
-240
-60
-63
-233
-63
-64
-224
-65
-62
-213
-64
-60
-202
-64
-54
-185
-62
-47
-181
-64
-46
-180
-63
-45
-180
-63
-45
-180
-63
-45
-178
-63
-44
-176
-63
-45
-175
-64
-45
-173
-64
-44
-169
-64
-43
-166
-65
-45
-161
-65
-43
-159
-64
-42
-155
-65
-41
-152
-64
-42
-150
-65
-44
-148
-62
-45
-146
-63
-47
-145
-62
-46
-145
-62
-46
-145
-62
-44
-144
-61
-43
-146
-60
-43
-146
-60
-43
-148
-63
-43
-147
-62
-42
-148
-61
-42
-148
-61
-42
-148
-61
-42
-149
-62
-43
-150
-63
-44
-150
-64
-47
-148
-64
-53
-149
-62
-53
-152
-62
-51
-160
-62
-49
-171
-65
-51
-181
-68
-52
-189
-67
-52
-191
-68
-53
-187
-65
-50
-183
-67
-54
-172
-70
-56
-156
-73
-59
-133
-71
-58
-108
-64
-51
-83
-57
-42
-66
-52
-41
-62
-54
-51
-58
-54
-53
-57
-53
-52
-56
-52
-51
-56
-50
-50
-55
-49
-49
-54
-49
-46
-54
-49
-46
-55
-50
-47
-55
-50
-47
-55
-50
-47
-54
-49
-46
-54
-49
-45
-53
-48
-44
-53
-48
-44
-52
-49
-44
-47
-47
-45
-46
-48
-45
-47
-47
-45
-47
-47
-45
-48
-47
-45
-48
-47
-45
-50
-46
-45
-50
-46
-45
-51
-45
-45
-53
-44
-45
-52
-42
-43
-51
-41
-42
-53
-41
-43
-60
-45
-48
-67
-52
-55
-78
-56
-58
-100
-62
-61
-118
-69
-65
-134
-74
-73
-143
-78
-76
-154
-84
-86
-164
-97
-106
-165
-108
-125
-157
-114
-142
-145
-123
-162
-134
-128
-174
-127
-133
-185
-123
-132
-187
-111
-117
-169
-91
-91
-141
-81
-72
-117
-79
-67
-105
-79
-70
-101
-79
-71
-95
-80
-72
-95
-82
-78
-95
-91
-89
-102
-110
-111
-116
-131
-135
-136
-148
-153
-149
-153
-158
-151
-154
-160
-148
-153
-157
-143
-143
-145
-131
-126
-127
-111
-106
-107
-89
-93
-91
-76
-86
-83
-74
-88
-83
-90
-86
-82
-97
-88
-81
-97
-47
-46
-44
-47
-46
-44
-48
-47
-45
-49
-48
-46
-52
-48
-45
-52
-48
-45
-53
-49
-46
-53
-49
-46
-55
-50
-46
-55
-50
-46
-55
-50
-46
-55
-50
-46
-57
-50
-44
-57
-50
-44
-57
-50
-44
-57
-50
-44
-57
-49
-46
-56
-48
-46
-55
-47
-45
-55
-47
-45
-55
-47
-45
-55
-47
-45
-56
-48
-46
-57
-49
-47
-56
-48
-46
-56
-48
-46
-56
-48
-46
-56
-48
-46
-56
-48
-46
-56
-48
-46
-56
-48
-46
-56
-48
-46
-54
-46
-44
-53
-45
-43
-53
-45
-43
-53
-45
-43
-52
-44
-42
-52
-44
-42
-52
-44
-42
-52
-44
-42
-53
-45
-43
-53
-45
-43
-53
-45
-43
-53
-45
-43
-53
-45
-43
-53
-45
-43
-53
-45
-43
-51
-46
-42
-50
-45
-39
-49
-46
-39
-50
-47
-40
-51
-48
-41
-51
-48
-41
-52
-49
-42
-52
-49
-42
-53
-50
-43
-54
-51
-44
-54
-51
-44
-54
-51
-44
-55
-52
-45
-56
-53
-46
-57
-54
-47
-57
-54
-47
-58
-55
-46
-63
-56
-46
-64
-58
-46
-66
-60
-48
-68
-62
-50
-71
-63
-52
-72
-64
-53
-72
-64
-51
-72
-64
-51
-73
-64
-49
-73
-64
-49
-75
-63
-49
-75
-63
-49
-75
-63
-47
-76
-64
-48
-77
-65
-49
-78
-66
-50
-77
-65
-49
-81
-65
-49
-89
-66
-50
-100
-67
-50
-113
-67
-51
-124
-67
-50
-135
-66
-50
-146
-65
-48
-152
-60
-45
-160
-58
-43
-167
-59
-46
-175
-61
-50
-181
-64
-54
-186
-68
-58
-191
-70
-61
-197
-68
-62
-217
-67
-69
-225
-64
-70
-227
-66
-71
-231
-66
-70
-234
-68
-70
-240
-67
-69
-244
-65
-68
-248
-63
-68
-250
-59
-64
-249
-58
-63
-245
-59
-64
-240
-61
-64
-232
-64
-64
-220
-65
-61
-209
-64
-59
-198
-64
-53
-183
-61
-46
-179
-64
-45
-179
-64
-45
-178
-63
-44
-178
-63
-45
-176
-63
-45
-175
-62
-44
-173
-64
-44
-170
-63
-45
-167
-64
-45
-165
-64
-44
-161
-65
-43
-157
-65
-44
-154
-63
-42
-152
-64
-42
-149
-64
-43
-148
-62
-45
-145
-62
-46
-145
-62
-46
-145
-62
-46
-144
-61
-43
-144
-61
-43
-144
-61
-43
-144
-61
-43
-145
-62
-44
-145
-62
-44
-146
-60
-43
-146
-60
-43
-147
-61
-44
-147
-61
-44
-148
-63
-43
-149
-63
-46
-149
-65
-54
-150
-63
-53
-154
-62
-51
-163
-62
-50
-175
-65
-52
-185
-67
-53
-191
-68
-53
-193
-67
-53
-192
-68
-56
-184
-70
-59
-174
-73
-61
-153
-74
-61
-129
-71
-59
-104
-64
-52
-81
-58
-44
-66
-53
-44
-63
-55
-52
-61
-55
-55
-60
-54
-54
-58
-52
-52
-57
-52
-49
-56
-51
-48
-55
-50
-47
-55
-50
-47
-54
-50
-47
-54
-50
-47
-54
-50
-47
-53
-49
-46
-53
-50
-45
-52
-49
-44
-52
-49
-44
-50
-49
-44
-46
-48
-45
-44
-49
-45
-46
-48
-45
-46
-48
-45
-47
-47
-45
-47
-47
-45
-48
-47
-45
-50
-46
-45
-53
-47
-47
-52
-46
-46
-53
-44
-45
-52
-42
-43
-52
-42
-43
-57
-45
-47
-62
-50
-52
-73
-53
-54
-91
-57
-55
-108
-63
-57
-124
-69
-64
-134
-73
-68
-144
-79
-77
-152
-91
-96
-155
-102
-118
-148
-109
-136
-140
-119
-158
-131
-125
-173
-125
-130
-185
-117
-126
-183
-102
-109
-164
-84
-86
-137
-77
-69
-118
-76
-65
-107
-77
-65
-101
-79
-70
-99
-81
-72
-99
-77
-72
-94
-78
-75
-92
-91
-91
-101
-113
-116
-121
-133
-137
-136
-135
-140
-134
-138
-143
-136
-141
-144
-133
-134
-138
-124
-120
-122
-108
-102
-105
-88
-90
-91
-77
-86
-83
-76
-90
-85
-91
-90
-84
-96
-91
-83
-96
-46
-45
-43
-47
-46
-44
-47
-46
-44
-48
-47
-45
-51
-47
-44
-52
-48
-45
-52
-48
-45
-52
-48
-45
-54
-49
-45
-54
-49
-45
-54
-49
-45
-54
-49
-45
-56
-49
-43
-56
-49
-43
-56
-49
-43
-56
-49
-43
-55
-47
-45
-55
-47
-45
-54
-46
-44
-54
-46
-44
-54
-46
-44
-54
-46
-44
-55
-47
-45
-55
-47
-45
-56
-48
-46
-56
-48
-46
-56
-48
-46
-56
-48
-46
-56
-48
-46
-56
-48
-46
-56
-48
-46
-56
-48
-46
-53
-45
-43
-53
-45
-43
-53
-45
-43
-52
-44
-42
-52
-44
-42
-52
-44
-42
-51
-43
-41
-51
-43
-41
-54
-46
-44
-54
-46
-44
-54
-46
-44
-54
-46
-44
-54
-46
-44
-54
-46
-44
-54
-46
-44
-52
-47
-44
-51
-48
-43
-51
-48
-41
-51
-48
-41
-52
-49
-42
-52
-49
-42
-53
-50
-43
-53
-50
-43
-53
-50
-43
-53
-50
-43
-53
-50
-43
-54
-51
-44
-55
-52
-45
-56
-53
-46
-56
-53
-46
-57
-54
-47
-57
-54
-45
-62
-55
-45
-63
-57
-45
-64
-58
-46
-66
-60
-48
-69
-61
-50
-69
-61
-50
-70
-62
-49
-70
-62
-49
-71
-61
-49
-71
-62
-47
-72
-60
-46
-73
-61
-47
-73
-61
-47
-74
-62
-46
-76
-64
-48
-74
-65
-48
-75
-68
-50
-78
-69
-52
-85
-68
-52
-94
-68
-51
-105
-68
-50
-115
-66
-49
-126
-65
-47
-134
-63
-45
-140
-57
-41
-148
-57
-39
-157
-57
-42
-163
-60
-45
-172
-64
-51
-179
-69
-56
-184
-72
-60
-193
-70
-62
-210
-68
-67
-218
-65
-67
-222
-66
-67
-226
-68
-67
-231
-67
-68
-236
-66
-67
-243
-64
-67
-247
-63
-65
-250
-59
-64
-249
-58
-63
-245
-59
-64
-238
-62
-64
-229
-65
-64
-218
-66
-61
-205
-64
-57
-194
-64
-51
-181
-61
-45
-176
-64
-44
-176
-64
-44
-176
-64
-44
-175
-62
-44
-174
-63
-44
-174
-63
-44
-172
-63
-43
-169
-64
-45
-166
-63
-44
-163
-64
-43
-160
-64
-42
-156
-64
-43
-152
-64
-42
-150
-64
-41
-148
-63
-42
-145
-62
-44
-145
-62
-46
-145
-62
-46
-144
-61
-45
-144
-61
-43
-144
-61
-43
-143
-60
-42
-143
-60
-42
-144
-61
-43
-144
-61
-43
-143
-60
-42
-143
-60
-42
-146
-60
-43
-145
-62
-44
-148
-62
-45
-146
-63
-45
-149
-65
-54
-150
-63
-53
-156
-62
-50
-166
-64
-52
-178
-66
-54
-188
-67
-56
-193
-67
-55
-194
-66
-55
-194
-70
-60
-186
-74
-63
-172
-76
-64
-151
-75
-62
-124
-70
-58
-98
-64
-52
-76
-58
-46
-65
-55
-45
-64
-56
-53
-62
-57
-54
-61
-55
-55
-60
-55
-52
-58
-53
-50
-57
-52
-49
-56
-51
-48
-56
-51
-48
-54
-50
-47
-54
-50
-47
-54
-50
-47
-51
-50
-46
-53
-50
-45
-50
-49
-44
-50
-49
-44
-49
-50
-45
-45
-50
-46
-45
-50
-46
-47
-49
-46
-47
-49
-46
-48
-48
-46
-48
-48
-46
-49
-48
-46
-49
-48
-46
-53
-49
-48
-54
-48
-48
-53
-47
-47
-53
-44
-45
-52
-43
-44
-54
-44
-45
-58
-48
-49
-68
-50
-50
-84
-55
-49
-99
-59
-51
-113
-65
-55
-123
-69
-59
-130
-72
-68
-137
-82
-85
-141
-95
-108
-139
-105
-130
-131
-115
-152
-125
-121
-171
-120
-125
-181
-111
-119
-181
-96
-102
-162
-81
-82
-139
-76
-69
-121
-76
-64
-112
-76
-64
-104
-80
-69
-103
-81
-70
-102
-76
-67
-94
-71
-66
-86
-77
-76
-90
-94
-94
-102
-106
-110
-113
-117
-121
-120
-120
-125
-119
-122
-128
-118
-119
-122
-111
-107
-111
-97
-96
-98
-84
-87
-89
-76
-84
-84
-76
-93
-87
-89
-93
-86
-93
-93
-86
-94
-45
-45
-45
-45
-45
-45
-46
-45
-43
-47
-46
-44
-48
-47
-45
-49
-48
-46
-51
-47
-44
-52
-48
-45
-51
-47
-44
-51
-47
-44
-52
-47
-43
-52
-47
-43
-52
-47
-43
-52
-47
-43
-54
-47
-41
-54
-47
-41
-52
-47
-44
-52
-47
-44
-51
-46
-43
-51
-46
-43
-51
-46
-43
-51
-46
-43
-52
-47
-44
-52
-47
-44
-53
-48
-45
-53
-48
-45
-53
-48
-45
-53
-48
-45
-53
-48
-45
-53
-48
-45
-53
-48
-45
-53
-48
-45
-51
-46
-43
-51
-46
-43
-50
-45
-42
-50
-45
-42
-50
-45
-42
-49
-44
-41
-49
-44
-41
-49
-44
-41
-52
-47
-44
-52
-47
-44
-52
-47
-44
-52
-47
-44
-52
-47
-44
-52
-47
-44
-52
-47
-44
-52
-47
-44
-52
-49
-44
-52
-49
-44
-52
-49
-44
-52
-49
-44
-52
-49
-44
-53
-50
-45
-53
-50
-45
-53
-50
-45
-53
-50
-45
-53
-50
-45
-54
-51
-46
-54
-51
-46
-55
-52
-47
-56
-53
-48
-57
-54
-49
-57
-54
-47
-60
-53
-45
-61
-54
-44
-63
-56
-46
-64
-57
-47
-66
-58
-47
-67
-59
-48
-67
-59
-48
-67
-59
-46
-68
-58
-46
-68
-58
-46
-70
-58
-46
-71
-59
-45
-72
-60
-46
-73
-61
-47
-74
-62
-48
-73
-64
-49
-74
-71
-54
-77
-72
-53
-82
-71
-53
-89
-70
-53
-98
-69
-51
-106
-68
-49
-117
-66
-47
-125
-62
-44
-130
-59
-41
-139
-58
-41
-147
-58
-42
-154
-61
-44
-163
-66
-50
-172
-70
-56
-178
-74
-61
-187
-73
-63
-204
-71
-66
-212
-68
-67
-216
-68
-66
-221
-69
-66
-226
-66
-66
-233
-65
-65
-240
-61
-64
-244
-60
-62
-249
-58
-63
-248
-58
-60
-244
-60
-62
-237
-63
-62
-225
-66
-62
-211
-67
-58
-197
-65
-53
-185
-63
-48
-178
-63
-45
-174
-63
-44
-174
-63
-44
-174
-63
-44
-173
-62
-45
-172
-62
-45
-172
-62
-45
-170
-63
-45
-168
-62
-46
-164
-63
-45
-160
-63
-44
-158
-63
-43
-154
-63
-44
-151
-63
-43
-149
-62
-42
-147
-62
-42
-145
-62
-44
-144
-63
-46
-143
-62
-45
-143
-62
-45
-143
-62
-45
-142
-61
-44
-142
-61
-44
-142
-61
-44
-142
-61
-44
-142
-61
-44
-142
-61
-44
-142
-61
-44
-143
-60
-44
-143
-62
-45
-145
-62
-46
-144
-63
-46
-148
-66
-52
-151
-65
-52
-157
-64
-49
-168
-64
-51
-182
-65
-55
-191
-67
-57
-197
-66
-56
-196
-65
-55
-190
-67
-59
-183
-72
-63
-166
-76
-67
-144
-74
-64
-116
-69
-59
-90
-62
-50
-69
-57
-45
-60
-53
-43
-64
-57
-51
-64
-56
-53
-63
-55
-53
-62
-54
-51
-61
-53
-50
-60
-52
-49
-57
-52
-48
-56
-51
-47
-54
-50
-47
-52
-51
-47
-52
-51
-47
-50
-51
-46
-51
-50
-46
-49
-50
-45
-49
-50
-45
-48
-50
-45
-45
-50
-46
-44
-50
-46
-45
-50
-46
-45
-50
-46
-47
-49
-46
-47
-49
-46
-48
-48
-46
-49
-48
-46
-51
-50
-48
-53
-49
-48
-53
-49
-48
-52
-46
-46
-50
-44
-44
-52
-43
-44
-55
-46
-47
-61
-47
-46
-78
-53
-46
-89
-57
-46
-101
-61
-49
-110
-64
-51
-115
-66
-59
-121
-75
-75
-128
-90
-101
-131
-103
-128
-127
-112
-151
-122
-120
-170
-117
-123
-183
-107
-115
-180
-95
-100
-166
-84
-84
-148
-79
-71
-131
-76
-66
-119
-78
-65
-109
-78
-66
-104
-77
-65
-101
-74
-65
-96
-71
-66
-89
-71
-70
-88
-75
-75
-87
-77
-80
-85
-93
-99
-99
-96
-102
-98
-98
-105
-97
-96
-102
-92
-90
-96
-84
-87
-91
-77
-85
-88
-77
-88
-88
-80
-94
-89
-86
-96
-87
-88
-96
-87
-90
-44
-44
-44
-44
-44
-44
-46
-45
-43
-46
-45
-43
-47
-46
-44
-48
-47
-45
-51
-47
-44
-51
-47
-44
-50
-46
-43
-50
-46
-43
-51
-46
-42
-51
-46
-42
-51
-46
-42
-51
-46
-42
-53
-46
-40
-53
-45
-42
-51
-46
-43
-51
-46
-43
-50
-45
-42
-49
-44
-41
-49
-44
-41
-50
-45
-42
-51
-46
-43
-51
-46
-43
-51
-46
-43
-51
-46
-43
-51
-46
-43
-51
-46
-43
-51
-46
-43
-51
-46
-43
-51
-46
-43
-51
-46
-43
-50
-45
-42
-50
-45
-42
-50
-45
-42
-50
-45
-42
-49
-44
-41
-49
-44
-41
-49
-44
-41
-48
-43
-40
-51
-46
-43
-51
-46
-43
-51
-46
-43
-51
-46
-43
-51
-46
-43
-51
-46
-43
-51
-46
-43
-51
-46
-43
-52
-49
-44
-52
-49
-44
-52
-49
-44
-52
-49
-44
-52
-49
-44
-52
-49
-44
-52
-49
-44
-52
-49
-44
-52
-49
-44
-53
-50
-45
-53
-50
-45
-54
-51
-46
-55
-52
-47
-56
-53
-48
-56
-53
-48
-56
-53
-46
-59
-52
-44
-60
-53
-43
-61
-54
-44
-62
-55
-45
-64
-55
-46
-65
-57
-46
-65
-57
-46
-65
-57
-46
-67
-57
-47
-67
-57
-45
-69
-57
-45
-70
-58
-46
-71
-59
-47
-72
-60
-46
-74
-62
-48
-72
-65
-49
-74
-71
-54
-73
-72
-54
-78
-71
-53
-86
-70
-54
-92
-69
-51
-100
-67
-50
-110
-64
-48
-118
-62
-45
-123
-60
-43
-130
-59
-41
-140
-59
-42
-148
-61
-44
-156
-64
-49
-163
-70
-53
-170
-74
-58
-180
-74
-61
-196
-72
-64
-204
-69
-65
-209
-70
-65
-214
-69
-64
-222
-67
-65
-228
-64
-62
-236
-62
-63
-241
-58
-60
-247
-59
-60
-244
-58
-59
-240
-60
-61
-233
-64
-61
-220
-67
-61
-205
-67
-56
-190
-64
-50
-177
-62
-44
-174
-63
-44
-171
-64
-44
-170
-63
-43
-170
-63
-43
-170
-63
-45
-169
-62
-44
-169
-62
-44
-168
-63
-44
-165
-62
-45
-162
-63
-44
-160
-63
-44
-155
-62
-44
-151
-63
-43
-149
-62
-42
-147
-62
-41
-145
-63
-42
-143
-62
-43
-143
-62
-45
-143
-62
-45
-143
-62
-45
-142
-61
-44
-142
-61
-44
-142
-61
-44
-141
-60
-43
-142
-61
-44
-139
-60
-43
-141
-60
-43
-139
-60
-43
-139
-60
-45
-140
-61
-44
-141
-62
-47
-142
-63
-46
-148
-66
-52
-151
-65
-50
-160
-64
-50
-172
-66
-53
-185
-67
-57
-194
-67
-58
-197
-66
-58
-194
-65
-59
-186
-65
-57
-177
-73
-64
-163
-78
-71
-141
-78
-69
-111
-71
-61
-83
-63
-52
-65
-59
-47
-57
-54
-45
-64
-57
-51
-65
-55
-53
-63
-55
-52
-62
-54
-51
-60
-52
-49
-57
-52
-48
-56
-51
-47
-55
-52
-47
-52
-51
-47
-52
-51
-47
-51
-52
-47
-50
-51
-46
-50
-51
-46
-48
-50
-45
-48
-50
-45
-46
-51
-45
-45
-51
-47
-45
-51
-47
-46
-51
-47
-46
-51
-47
-48
-50
-47
-48
-50
-47
-49
-49
-47
-49
-49
-47
-50
-49
-47
-51
-50
-48
-51
-50
-48
-52
-48
-47
-50
-46
-45
-49
-45
-44
-52
-46
-46
-56
-46
-44
-71
-52
-45
-79
-52
-41
-88
-56
-43
-96
-60
-48
-101
-63
-54
-109
-71
-70
-121
-89
-100
-130
-107
-133
-128
-117
-159
-124
-124
-178
-119
-124
-188
-110
-117
-187
-100
-104
-175
-91
-91
-161
-82
-77
-143
-76
-66
-126
-79
-65
-114
-76
-64
-104
-73
-61
-99
-72
-62
-96
-72
-66
-94
-69
-67
-88
-64
-66
-79
-59
-64
-70
-66
-71
-74
-68
-77
-74
-74
-81
-74
-74
-81
-73
-73
-81
-70
-75
-81
-69
-79
-85
-73
-86
-87
-79
-94
-89
-83
-96
-89
-83
-96
-88
-85
-43
-43
-43
-43
-43
-43
-44
-44
-44
-45
-45
-45
-47
-46
-44
-47
-46
-44
-48
-47
-45
-48
-47
-45
-49
-45
-42
-49
-45
-42
-49
-45
-42
-49
-45
-42
-50
-45
-41
-50
-45
-41
-50
-45
-41
-50
-45
-41
-50
-45
-42
-50
-44
-44
-49
-43
-43
-49
-43
-43
-49
-43
-43
-49
-43
-43
-50
-44
-44
-50
-44
-44
-49
-43
-43
-49
-43
-43
-49
-43
-43
-49
-43
-43
-49
-43
-43
-49
-43
-43
-49
-43
-43
-49
-43
-43
-50
-44
-44
-50
-44
-44
-50
-44
-44
-49
-43
-43
-49
-43
-43
-49
-43
-43
-48
-42
-42
-48
-42
-42
-51
-45
-45
-51
-45
-45
-51
-45
-45
-51
-45
-45
-51
-45
-45
-51
-45
-45
-51
-45
-45
-51
-46
-43
-52
-49
-44
-52
-49
-44
-52
-49
-44
-51
-48
-43
-51
-48
-43
-51
-48
-43
-51
-48
-43
-51
-48
-43
-52
-49
-44
-52
-49
-44
-53
-50
-45
-54
-51
-46
-55
-52
-47
-55
-52
-47
-56
-53
-48
-56
-53
-46
-58
-51
-43
-59
-52
-44
-60
-53
-45
-61
-54
-46
-63
-54
-47
-63
-54
-45
-63
-54
-45
-63
-55
-44
-66
-56
-46
-66
-56
-46
-69
-56
-47
-69
-57
-45
-71
-59
-47
-72
-60
-48
-74
-62
-50
-72
-64
-51
-72
-69
-54
-71
-70
-52
-75
-69
-53
-81
-68
-52
-88
-67
-50
-95
-66
-50
-102
-63
-46
-110
-61
-44
-118
-61
-44
-124
-58
-42
-133
-57
-41
-140
-59
-42
-147
-61
-46
-155
-66
-50
-162
-70
-55
-172
-70
-56
-187
-70
-60
-194
-70
-62
-201
-70
-62
-208
-69
-62
-217
-68
-64
-226
-67
-63
-234
-64
-64
-240
-62
-62
-242
-58
-58
-241
-59
-58
-236
-60
-60
-228
-65
-60
-214
-67
-59
-198
-68
-54
-181
-64
-47
-170
-61
-41
-170
-63
-45
-169
-64
-45
-169
-64
-45
-168
-63
-44
-168
-62
-46
-168
-62
-46
-167
-61
-45
-165
-62
-45
-163
-61
-46
-160
-63
-46
-158
-63
-45
-154
-63
-45
-150
-63
-44
-147
-62
-42
-145
-63
-42
-143
-62
-41
-143
-62
-43
-141
-62
-45
-141
-62
-45
-140
-61
-44
-140
-61
-46
-140
-61
-46
-139
-60
-45
-139
-60
-45
-139
-60
-45
-138
-61
-45
-138
-59
-44
-137
-60
-44
-138
-60
-47
-139
-62
-46
-139
-61
-48
-140
-63
-47
-146
-67
-50
-152
-66
-49
-161
-65
-49
-174
-66
-54
-188
-67
-58
-194
-67
-60
-196
-67
-61
-192
-67
-61
-185
-70
-65
-178
-81
-74
-165
-88
-82
-143
-88
-81
-115
-82
-73
-87
-73
-62
-67
-67
-55
-60
-63
-54
-62
-57
-51
-64
-55
-50
-62
-55
-49
-61
-54
-48
-58
-53
-47
-57
-52
-46
-56
-51
-47
-54
-51
-46
-52
-51
-46
-52
-51
-46
-51
-52
-47
-49
-51
-46
-49
-51
-46
-46
-51
-45
-46
-51
-45
-46
-51
-45
-45
-51
-47
-45
-51
-47
-45
-51
-47
-45
-51
-47
-46
-51
-47
-46
-51
-47
-48
-50
-47
-48
-50
-47
-48
-48
-46
-49
-49
-47
-50
-50
-48
-50
-49
-47
-48
-47
-45
-47
-46
-44
-50
-46
-45
-52
-47
-44
-63
-48
-43
-68
-48
-41
-75
-51
-41
-84
-56
-45
-90
-60
-52
-100
-70
-70
-117
-93
-106
-131
-115
-141
-137
-128
-171
-133
-132
-190
-126
-131
-199
-116
-122
-198
-109
-112
-189
-99
-101
-175
-86
-83
-154
-76
-67
-130
-75
-63
-113
-73
-60
-103
-71
-59
-99
-69
-62
-95
-70
-66
-93
-68
-66
-87
-63
-65
-78
-59
-63
-72
-58
-66
-69
-62
-72
-71
-68
-77
-72
-71
-81
-73
-71
-81
-72
-74
-82
-71
-78
-86
-75
-85
-88
-77
-94
-90
-79
-97
-89
-78
-97
-88
-79
-43
-43
-43
-43
-43
-43
-44
-44
-44
-44
-44
-44
-46
-44
-45
-47
-46
-44
-48
-47
-45
-48
-47
-45
-49
-45
-42
-49
-45
-42
-49
-45
-42
-49
-45
-42
-50
-45
-41
-50
-45
-41
-50
-45
-41
-50
-45
-42
-50
-44
-44
-49
-43
-43
-49
-43
-43
-48
-42
-42
-48
-42
-42
-49
-43
-43
-49
-43
-43
-50
-44
-44
-48
-42
-42
-48
-42
-42
-48
-42
-42
-48
-42
-42
-48
-42
-42
-48
-42
-42
-48
-42
-42
-48
-42
-42
-50
-44
-44
-50
-44
-44
-50
-44
-44
-49
-43
-43
-49
-43
-43
-48
-42
-42
-48
-42
-42
-48
-42
-42
-50
-44
-44
-50
-44
-44
-50
-44
-44
-50
-44
-44
-50
-44
-44
-50
-44
-44
-50
-44
-44
-50
-44
-44
-51
-47
-44
-51
-48
-43
-51
-48
-43
-51
-48
-43
-51
-48
-43
-51
-48
-43
-51
-48
-43
-51
-48
-43
-52
-49
-44
-52
-49
-44
-53
-50
-45
-54
-51
-46
-54
-51
-46
-55
-52
-47
-56
-53
-48
-56
-53
-48
-57
-50
-44
-58
-51
-43
-59
-52
-44
-60
-53
-45
-62
-53
-46
-62
-53
-46
-62
-53
-46
-62
-53
-44
-66
-56
-47
-66
-56
-46
-69
-56
-47
-69
-56
-47
-71
-58
-49
-73
-61
-49
-74
-62
-50
-73
-63
-51
-70
-67
-52
-70
-67
-52
-74
-66
-53
-79
-65
-52
-84
-65
-50
-92
-64
-50
-98
-62
-48
-106
-60
-45
-113
-60
-46
-119
-57
-42
-125
-56
-41
-133
-56
-40
-140
-58
-44
-149
-61
-47
-155
-66
-52
-164
-66
-53
-178
-70
-58
-186
-69
-59
-193
-70
-62
-202
-71
-63
-212
-71
-64
-222
-70
-65
-231
-67
-65
-238
-66
-64
-237
-59
-59
-235
-59
-59
-231
-62
-59
-223
-66
-59
-209
-68
-58
-191
-68
-52
-175
-64
-45
-164
-62
-40
-166
-65
-45
-166
-65
-45
-165
-64
-44
-165
-64
-46
-165
-64
-46
-164
-63
-45
-164
-63
-45
-164
-62
-47
-162
-62
-46
-159
-64
-46
-156
-63
-46
-152
-63
-45
-149
-62
-43
-145
-63
-42
-143
-62
-41
-143
-62
-43
-141
-62
-45
-141
-62
-45
-141
-62
-45
-140
-61
-44
-140
-61
-46
-139
-60
-45
-139
-60
-45
-138
-61
-45
-138
-61
-45
-136
-60
-46
-136
-60
-46
-136
-60
-46
-136
-60
-47
-135
-62
-47
-136
-62
-49
-139
-63
-49
-145
-68
-50
-150
-67
-49
-162
-66
-52
-173
-67
-54
-186
-67
-59
-193
-68
-62
-193
-68
-62
-187
-69
-65
-185
-80
-76
-178
-91
-84
-165
-101
-92
-145
-102
-93
-117
-95
-84
-91
-85
-73
-71
-77
-65
-67
-73
-63
-60
-57
-50
-63
-56
-50
-62
-55
-49
-59
-54
-48
-57
-52
-46
-55
-52
-45
-54
-51
-46
-52
-51
-46
-52
-51
-46
-51
-52
-46
-50
-52
-47
-49
-51
-46
-47
-52
-46
-46
-51
-45
-46
-51
-45
-46
-51
-45
-45
-51
-47
-45
-51
-47
-45
-51
-47
-45
-51
-47
-46
-51
-47
-46
-51
-47
-48
-50
-47
-48
-50
-47
-47
-47
-45
-48
-48
-46
-50
-50
-48
-50
-50
-48
-49
-48
-46
-48
-47
-45
-48
-47
-45
-51
-47
-44
-56
-44
-44
-59
-44
-41
-67
-48
-42
-75
-55
-48
-83
-60
-54
-94
-73
-72
-116
-98
-110
-135
-122
-148
-144
-138
-182
-140
-141
-198
-132
-136
-207
-122
-128
-204
-114
-120
-198
-105
-107
-182
-87
-87
-159
-73
-68
-132
-69
-61
-110
-71
-60
-100
-68
-60
-97
-67
-62
-94
-67
-65
-89
-64
-67
-86
-64
-68
-80
-62
-69
-75
-71
-81
-82
-75
-87
-85
-81
-94
-87
-85
-96
-88
-83
-95
-85
-82
-94
-84
-84
-94
-83
-89
-95
-83
-94
-91
-76
-97
-90
-74
-97
-90
-74
-44
-45
-47
-44
-45
-47
-44
-45
-47
-44
-46
-45
-45
-45
-45
-45
-45
-45
-46
-45
-43
-46
-45
-43
-47
-46
-44
-47
-46
-44
-49
-45
-42
-48
-44
-41
-48
-44
-41
-48
-44
-41
-47
-43
-40
-47
-43
-40
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-48
-44
-43
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-48
-44
-43
-48
-44
-43
-49
-45
-44
-49
-45
-44
-50
-46
-45
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-48
-44
-41
-49
-45
-42
-50
-46
-43
-51
-47
-44
-51
-47
-44
-51
-47
-44
-51
-47
-44
-51
-47
-44
-51
-47
-44
-51
-47
-44
-51
-47
-44
-51
-47
-44
-52
-48
-45
-53
-49
-46
-54
-50
-47
-55
-52
-47
-56
-48
-45
-57
-50
-44
-58
-51
-45
-59
-52
-46
-61
-52
-47
-62
-53
-46
-62
-53
-46
-62
-53
-46
-63
-52
-46
-63
-53
-44
-66
-53
-45
-67
-54
-46
-68
-55
-47
-70
-57
-48
-71
-58
-49
-70
-60
-50
-71
-63
-52
-72
-64
-53
-74
-64
-54
-80
-63
-53
-84
-62
-51
-88
-60
-49
-94
-57
-48
-98
-54
-43
-109
-57
-46
-116
-56
-45
-124
-56
-43
-131
-57
-44
-141
-59
-47
-147
-61
-48
-152
-63
-49
-158
-62
-48
-167
-65
-51
-173
-65
-52
-181
-67
-56
-190
-69
-58
-202
-71
-61
-212
-71
-62
-222
-69
-63
-229
-67
-64
-232
-64
-63
-234
-66
-65
-230
-68
-65
-218
-69
-62
-200
-68
-56
-183
-66
-49
-170
-65
-46
-162
-66
-44
-162
-65
-46
-161
-64
-45
-162
-63
-44
-162
-62
-46
-161
-61
-45
-161
-61
-45
-162
-62
-46
-160
-63
-47
-156
-60
-44
-154
-61
-44
-152
-60
-45
-149
-62
-45
-147
-61
-44
-144
-61
-43
-142
-61
-42
-140
-62
-42
-139
-60
-43
-139
-60
-43
-138
-61
-45
-137
-60
-44
-137
-60
-44
-137
-60
-44
-136
-58
-45
-135
-59
-45
-137
-61
-47
-134
-60
-47
-134
-60
-47
-135
-61
-48
-136
-62
-51
-136
-64
-50
-137
-65
-53
-139
-65
-52
-145
-69
-53
-151
-68
-52
-163
-69
-57
-177
-73
-62
-186
-71
-64
-187
-68
-62
-187
-69
-65
-184
-77
-71
-180
-90
-82
-175
-102
-95
-163
-113
-102
-145
-115
-104
-126
-114
-100
-106
-106
-94
-86
-94
-83
-73
-81
-70
-76
-76
-66
-74
-70
-61
-66
-62
-53
-60
-56
-47
-57
-53
-44
-55
-52
-43
-54
-51
-44
-51
-51
-43
-52
-51
-46
-51
-52
-46
-49
-52
-45
-49
-52
-45
-48
-50
-45
-47
-49
-44
-44
-49
-43
-44
-49
-43
-45
-50
-46
-45
-50
-46
-45
-50
-46
-45
-50
-46
-47
-49
-46
-47
-49
-46
-47
-49
-46
-47
-49
-46
-48
-50
-47
-48
-50
-47
-49
-49
-47
-49
-49
-47
-49
-49
-47
-49
-49
-47
-49
-49
-47
-52
-48
-47
-52
-43
-48
-59
-47
-51
-65
-51
-50
-67
-52
-47
-74
-59
-54
-93
-79
-79
-121
-109
-121
-139
-133
-159
-147
-144
-187
-148
-150
-207
-144
-149
-217
-131
-137
-211
-116
-122
-198
-106
-110
-183
-95
-98
-167
-90
-91
-148
-76
-73
-116
-72
-66
-100
-65
-62
-93
-62
-62
-88
-63
-66
-85
-65
-73
-86
-76
-85
-92
-85
-96
-98
-98
-113
-110
-110
-125
-120
-118
-134
-124
-114
-127
-117
-108
-121
-111
-103
-117
-104
-95
-107
-95
-87
-95
-80
-91
-90
-70
-96
-90
-68
-99
-93
-71
-44
-45
-47
-44
-45
-47
-44
-45
-47
-44
-45
-47
-45
-45
-45
-45
-45
-45
-46
-44
-45
-46
-45
-43
-47
-46
-44
-46
-45
-43
-48
-44
-41
-48
-44
-41
-47
-43
-40
-47
-43
-40
-47
-43
-40
-47
-43
-40
-46
-42
-41
-46
-42
-41
-46
-42
-41
-46
-42
-41
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-48
-44
-43
-48
-44
-43
-48
-44
-43
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-48
-44
-43
-48
-44
-41
-49
-45
-42
-50
-46
-43
-51
-47
-44
-51
-47
-44
-50
-46
-43
-50
-46
-43
-50
-46
-43
-50
-46
-43
-50
-46
-43
-50
-46
-43
-51
-47
-44
-52
-48
-45
-53
-49
-46
-54
-50
-47
-56
-48
-46
-57
-49
-46
-58
-50
-47
-59
-52
-46
-61
-52
-47
-62
-53
-48
-62
-53
-48
-61
-52
-45
-63
-52
-46
-63
-52
-46
-65
-52
-46
-66
-53
-45
-67
-54
-46
-69
-56
-48
-71
-58
-50
-72
-59
-51
-72
-62
-53
-72
-62
-53
-76
-61
-54
-79
-62
-54
-81
-61
-52
-86
-59
-50
-90
-57
-48
-95
-55
-47
-104
-55
-48
-112
-55
-46
-119
-55
-45
-129
-57
-45
-137
-57
-46
-144
-60
-49
-150
-60
-49
-155
-61
-49
-162
-64
-51
-167
-65
-51
-172
-66
-53
-180
-68
-56
-190
-69
-58
-201
-70
-60
-212
-69
-61
-219
-68
-61
-223
-68
-64
-224
-69
-64
-222
-70
-65
-212
-71
-62
-196
-70
-56
-178
-67
-50
-165
-66
-45
-158
-66
-45
-159
-67
-46
-158
-66
-45
-159
-64
-46
-158
-63
-45
-158
-63
-45
-158
-63
-45
-158
-62
-46
-158
-62
-46
-154
-61
-44
-153
-62
-44
-150
-61
-45
-148
-61
-44
-144
-61
-43
-143
-62
-43
-140
-62
-42
-140
-61
-44
-139
-60
-43
-138
-61
-43
-137
-60
-44
-137
-60
-44
-137
-60
-44
-135
-59
-43
-135
-59
-45
-133
-60
-45
-134
-60
-47
-133
-61
-47
-133
-61
-49
-131
-61
-49
-132
-62
-50
-134
-64
-54
-135
-65
-55
-136
-66
-54
-147
-71
-57
-151
-69
-55
-163
-71
-60
-175
-74
-64
-184
-73
-66
-184
-71
-65
-183
-76
-70
-179
-84
-78
-177
-100
-92
-170
-113
-102
-159
-126
-111
-144
-127
-111
-127
-124
-109
-109
-115
-101
-90
-102
-90
-78
-88
-77
-76
-78
-65
-75
-73
-61
-69
-67
-55
-64
-61
-52
-61
-58
-49
-56
-56
-46
-52
-52
-44
-49
-49
-41
-50
-51
-45
-50
-51
-45
-48
-51
-44
-47
-50
-43
-47
-49
-44
-46
-48
-43
-46
-48
-43
-46
-48
-43
-47
-49
-46
-45
-50
-46
-47
-49
-46
-47
-49
-46
-47
-49
-46
-47
-49
-46
-47
-49
-46
-47
-49
-46
-48
-50
-47
-48
-50
-47
-49
-49
-47
-49
-49
-47
-49
-49
-47
-49
-49
-47
-49
-49
-47
-50
-48
-49
-53
-43
-52
-57
-45
-55
-60
-50
-51
-63
-53
-51
-72
-63
-58
-94
-86
-84
-120
-114
-124
-138
-136
-158
-147
-147
-185
-148
-151
-202
-144
-150
-212
-132
-139
-207
-121
-129
-194
-113
-121
-184
-107
-116
-173
-104
-110
-158
-92
-95
-128
-88
-90
-113
-83
-85
-106
-82
-87
-106
-84
-94
-104
-90
-103
-109
-102
-118
-118
-114
-130
-127
-116
-136
-127
-126
-146
-135
-131
-149
-137
-126
-142
-129
-118
-134
-121
-114
-128
-113
-102
-116
-101
-90
-101
-84
-89
-88
-67
-94
-88
-62
-97
-91
-67
-44
-45
-47
-44
-45
-47
-44
-45
-47
-44
-45
-47
-44
-45
-47
-44
-46
-45
-45
-45
-45
-45
-45
-45
-46
-45
-43
-46
-45
-43
-46
-45
-43
-45
-44
-42
-47
-43
-40
-46
-42
-39
-46
-42
-39
-46
-42
-39
-44
-43
-41
-44
-42
-43
-44
-42
-43
-44
-42
-43
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-45
-43
-44
-45
-43
-44
-45
-43
-44
-45
-43
-44
-45
-43
-44
-45
-43
-44
-45
-43
-44
-45
-43
-44
-44
-42
-43
-44
-42
-43
-45
-43
-44
-45
-43
-44
-45
-43
-44
-46
-44
-45
-46
-44
-45
-46
-44
-45
-46
-44
-45
-46
-44
-45
-46
-44
-45
-47
-45
-46
-47
-45
-46
-47
-45
-46
-47
-45
-46
-47
-46
-44
-48
-44
-43
-48
-44
-43
-49
-45
-44
-50
-46
-45
-50
-46
-45
-50
-46
-45
-50
-46
-45
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-50
-46
-45
-51
-47
-46
-52
-48
-47
-53
-49
-46
-56
-48
-46
-57
-49
-46
-58
-50
-47
-59
-51
-48
-61
-51
-49
-61
-52
-47
-61
-52
-47
-61
-52
-47
-63
-52
-48
-63
-52
-46
-65
-52
-46
-65
-52
-46
-67
-54
-48
-68
-55
-49
-70
-57
-51
-71
-58
-52
-72
-59
-53
-74
-59
-54
-75
-60
-55
-78
-61
-54
-80
-59
-54
-83
-58
-53
-86
-55
-50
-91
-54
-46
-99
-54
-48
-107
-54
-46
-116
-53
-44
-125
-55
-47
-135
-57
-47
-141
-59
-48
-148
-60
-48
-150
-60
-49
-157
-63
-51
-160
-64
-52
-162
-64
-51
-168
-64
-51
-177
-67
-54
-186
-68
-56
-197
-69
-58
-205
-68
-58
-213
-70
-64
-215
-72
-64
-212
-73
-66
-204
-73
-63
-190
-69
-58
-174
-67
-51
-161
-66
-46
-156
-65
-46
-157
-66
-47
-156
-65
-46
-156
-63
-46
-155
-62
-45
-155
-62
-45
-155
-62
-45
-155
-62
-47
-155
-63
-48
-152
-60
-45
-150
-61
-45
-148
-60
-46
-147
-61
-46
-143
-62
-45
-140
-61
-44
-139
-60
-43
-138
-61
-43
-137
-60
-42
-137
-60
-42
-137
-60
-44
-135
-59
-43
-135
-59
-45
-133
-60
-45
-132
-58
-45
-131
-59
-45
-132
-60
-48
-130
-60
-48
-130
-60
-50
-130
-62
-51
-131
-63
-52
-133
-65
-56
-135
-67
-58
-136
-68
-57
-148
-74
-61
-151
-72
-59
-160
-72
-62
-172
-75
-68
-178
-75
-70
-179
-76
-71
-178
-83
-77
-174
-96
-86
-173
-115
-103
-166
-129
-113
-157
-140
-122
-145
-142
-123
-130
-137
-119
-115
-128
-111
-99
-113
-98
-88
-99
-85
-78
-82
-68
-77
-78
-64
-72
-73
-59
-68
-68
-56
-64
-64
-52
-57
-59
-46
-52
-54
-43
-47
-49
-38
-48
-49
-41
-48
-49
-41
-47
-48
-42
-47
-48
-42
-46
-47
-42
-46
-47
-42
-47
-47
-45
-47
-47
-45
-47
-47
-45
-46
-48
-45
-47
-47
-45
-47
-47
-45
-47
-47
-45
-47
-47
-45
-47
-47
-45
-47
-47
-45
-48
-48
-46
-48
-48
-46
-48
-48
-46
-48
-48
-46
-48
-48
-46
-48
-48
-46
-48
-48
-46
-49
-47
-50
-54
-43
-57
-55
-43
-57
-56
-47
-52
-59
-54
-51
-72
-69
-62
-95
-94
-89
-122
-122
-124
-139
-141
-154
-144
-148
-177
-146
-151
-191
-143
-149
-199
-132
-142
-195
-125
-137
-187
-123
-137
-182
-124
-139
-178
-125
-140
-171
-125
-136
-154
-119
-131
-143
-113
-126
-135
-110
-125
-130
-110
-126
-126
-111
-130
-126
-121
-142
-133
-131
-153
-141
-139
-161
-148
-145
-168
-152
-144
-165
-148
-136
-157
-138
-131
-150
-131
-124
-141
-123
-106
-123
-105
-92
-104
-84
-86
-86
-62
-91
-87
-58
-93
-89
-62
-45
-46
-48
-45
-46
-48
-45
-46
-48
-45
-46
-48
-45
-46
-48
-45
-46
-48
-46
-46
-46
-46
-46
-46
-46
-45
-43
-46
-45
-43
-45
-44
-42
-45
-44
-42
-46
-42
-39
-46
-42
-39
-46
-42
-39
-46
-42
-41
-44
-42
-43
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-42
-40
-41
-42
-40
-41
-42
-40
-41
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-45
-43
-44
-45
-43
-44
-45
-43
-44
-45
-43
-44
-46
-44
-45
-46
-44
-45
-46
-44
-45
-46
-44
-45
-47
-45
-46
-47
-45
-46
-47
-45
-46
-47
-43
-42
-48
-44
-43
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-48
-44
-43
-48
-44
-43
-48
-44
-43
-48
-44
-43
-48
-44
-43
-48
-44
-43
-49
-45
-44
-50
-46
-45
-51
-47
-46
-52
-48
-47
-57
-49
-47
-58
-50
-48
-59
-51
-49
-60
-52
-49
-61
-51
-49
-61
-51
-49
-61
-51
-49
-61
-52
-47
-62
-51
-47
-62
-51
-47
-64
-50
-47
-64
-51
-45
-65
-52
-46
-67
-54
-48
-68
-55
-49
-69
-56
-50
-70
-57
-51
-72
-57
-52
-73
-58
-53
-74
-59
-54
-76
-58
-54
-78
-57
-52
-81
-56
-51
-84
-53
-48
-94
-55
-50
-101
-54
-48
-111
-54
-47
-120
-56
-47
-130
-57
-48
-138
-58
-47
-144
-60
-49
-148
-62
-49
-153
-63
-52
-155
-63
-52
-155
-63
-50
-159
-63
-49
-165
-65
-50
-174
-66
-53
-184
-68
-55
-191
-69
-58
-199
-71
-62
-203
-72
-64
-202
-74
-65
-195
-73
-62
-182
-70
-58
-170
-66
-53
-158
-65
-48
-153
-64
-46
-153
-65
-45
-153
-65
-45
-152
-63
-45
-151
-62
-44
-151
-62
-44
-153
-62
-44
-153
-61
-46
-151
-62
-46
-149
-60
-44
-148
-61
-44
-147
-61
-46
-144
-61
-45
-142
-61
-44
-138
-61
-43
-138
-61
-45
-137
-60
-44
-136
-59
-41
-136
-59
-41
-135
-59
-43
-135
-59
-43
-132
-59
-44
-132
-59
-44
-131
-59
-45
-128
-59
-44
-129
-59
-47
-128
-60
-49
-128
-60
-49
-129
-62
-53
-131
-64
-55
-131
-67
-58
-135
-68
-60
-136
-69
-60
-148
-76
-64
-150
-72
-60
-158
-71
-62
-167
-74
-67
-174
-76
-73
-174
-81
-76
-173
-93
-86
-170
-106
-94
-167
-128
-111
-161
-143
-121
-154
-154
-130
-143
-155
-131
-134
-149
-128
-122
-139
-120
-109
-123
-106
-98
-109
-93
-83
-90
-74
-81
-85
-70
-75
-79
-64
-69
-73
-58
-64
-68
-54
-59
-61
-48
-53
-55
-44
-49
-51
-40
-48
-49
-41
-47
-48
-40
-46
-47
-41
-46
-45
-40
-46
-45
-41
-46
-45
-41
-47
-46
-44
-48
-47
-45
-47
-46
-44
-47
-46
-44
-47
-46
-44
-47
-46
-44
-47
-46
-44
-46
-46
-44
-47
-46
-44
-46
-46
-44
-48
-47
-45
-47
-47
-45
-48
-47
-45
-47
-47
-45
-47
-47
-45
-47
-47
-45
-47
-47
-45
-50
-45
-49
-55
-44
-58
-54
-42
-56
-51
-45
-49
-57
-54
-49
-72
-74
-63
-98
-102
-88
-123
-128
-122
-139
-144
-147
-141
-147
-163
-143
-150
-176
-140
-149
-182
-131
-144
-178
-129
-144
-175
-133
-153
-178
-141
-164
-182
-146
-168
-179
-147
-168
-171
-144
-164
-163
-140
-160
-158
-135
-158
-152
-130
-153
-143
-125
-152
-137
-129
-156
-139
-136
-163
-144
-148
-176
-154
-152
-177
-155
-148
-173
-151
-139
-163
-141
-133
-155
-132
-127
-146
-124
-107
-124
-105
-88
-102
-79
-83
-86
-59
-89
-85
-56
-90
-86
-57
-43
-47
-50
-43
-47
-50
-43
-47
-50
-43
-47
-50
-45
-46
-48
-45
-46
-48
-46
-46
-46
-46
-46
-46
-45
-45
-45
-45
-45
-45
-46
-45
-43
-45
-44
-42
-45
-44
-42
-44
-43
-41
-44
-43
-41
-44
-43
-41
-44
-42
-43
-44
-42
-43
-44
-42
-43
-43
-41
-42
-43
-41
-42
-42
-40
-41
-42
-40
-41
-42
-40
-41
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-44
-42
-43
-43
-41
-42
-43
-41
-42
-43
-41
-42
-44
-42
-43
-45
-43
-44
-45
-43
-44
-46
-44
-45
-46
-44
-45
-47
-45
-46
-47
-45
-46
-47
-45
-46
-47
-43
-42
-48
-44
-43
-48
-44
-43
-48
-44
-43
-48
-44
-43
-48
-44
-43
-47
-43
-42
-46
-42
-41
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-48
-44
-43
-49
-45
-44
-51
-47
-46
-52
-48
-47
-57
-48
-49
-58
-50
-48
-59
-51
-49
-60
-52
-50
-61
-51
-50
-61
-51
-49
-60
-50
-48
-60
-50
-48
-61
-50
-48
-61
-50
-46
-63
-49
-46
-63
-49
-46
-64
-50
-47
-65
-51
-48
-66
-53
-47
-67
-54
-48
-68
-54
-51
-67
-56
-52
-68
-57
-53
-69
-58
-54
-71
-57
-54
-72
-57
-52
-75
-56
-52
-78
-53
-48
-88
-55
-50
-95
-54
-48
-105
-55
-48
-114
-55
-47
-125
-58
-49
-134
-60
-49
-140
-62
-50
-144
-62
-50
-151
-64
-54
-151
-63
-53
-151
-63
-53
-151
-63
-51
-156
-64
-51
-163
-67
-53
-171
-67
-54
-179
-69
-56
-186
-69
-59
-189
-71
-61
-190
-72
-62
-185
-71
-61
-176
-68
-56
-166
-65
-53
-155
-63
-48
-151
-64
-47
-151
-64
-45
-151
-64
-45
-150
-63
-46
-149
-62
-45
-148
-61
-44
-149
-60
-44
-150
-61
-47
-150
-61
-47
-149
-60
-46
-147
-59
-45
-146
-60
-47
-142
-60
-46
-139
-60
-45
-137
-60
-44
-137
-60
-44
-136
-60
-44
-135
-59
-43
-134
-58
-42
-134
-58
-42
-134
-58
-42
-131
-58
-43
-131
-58
-43
-130
-58
-44
-128
-58
-46
-128
-58
-48
-128
-60
-49
-128
-61
-52
-127
-63
-54
-130
-66
-57
-131
-68
-61
-135
-70
-64
-136
-72
-63
-145
-75
-65
-146
-72
-61
-154
-71
-63
-163
-76
-69
-168
-80
-76
-168
-88
-81
-169
-102
-93
-166
-118
-104
-162
-140
-119
-155
-153
-128
-149
-164
-135
-140
-163
-135
-134
-157
-131
-126
-145
-125
-116
-130
-113
-106
-117
-101
-92
-101
-82
-86
-95
-76
-78
-85
-67
-69
-76
-58
-63
-70
-54
-60
-64
-50
-55
-58
-47
-54
-56
-45
-48
-49
-41
-48
-48
-40
-46
-45
-40
-47
-44
-39
-47
-43
-40
-47
-43
-42
-49
-45
-44
-50
-46
-45
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-47
-46
-44
-49
-45
-44
-47
-46
-44
-50
-46
-45
-48
-47
-45
-50
-46
-45
-48
-47
-45
-48
-47
-45
-48
-47
-45
-48
-47
-45
-50
-45
-49
-56
-44
-58
-53
-41
-53
-49
-43
-43
-54
-54
-44
-71
-76
-56
-96
-104
-81
-122
-131
-112
-136
-146
-135
-141
-151
-150
-143
-154
-160
-141
-153
-165
-134
-150
-163
-135
-155
-162
-144
-170
-169
-155
-185
-177
-160
-192
-179
-152
-183
-168
-154
-182
-167
-155
-183
-168
-152
-183
-165
-145
-177
-156
-137
-171
-146
-137
-171
-144
-144
-177
-148
-146
-179
-150
-149
-180
-149
-144
-173
-143
-136
-162
-133
-132
-155
-129
-123
-146
-120
-103
-122
-100
-84
-98
-73
-81
-84
-57
-85
-84
-56
-86
-85
-57
-44
-48
-51
-44
-48
-51
-44
-48
-51
-44
-48
-51
-46
-47
-49
-46
-47
-49
-47
-47
-47
-47
-47
-47
-46
-46
-46
-46
-46
-46
-47
-46
-44
-46
-45
-43
-46
-45
-43
-46
-45
-43
-45
-44
-42
-45
-44
-42
-45
-43
-44
-45
-43
-44
-45
-43
-44
-44
-42
-43
-43
-41
-42
-42
-40
-41
-42
-40
-41
-42
-40
-41
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-44
-42
-43
-44
-42
-43
-43
-41
-42
-43
-41
-42
-43
-41
-42
-42
-40
-41
-42
-40
-41
-42
-40
-41
-44
-42
-43
-44
-42
-43
-44
-42
-43
-45
-43
-44
-46
-44
-45
-46
-44
-45
-47
-45
-46
-47
-45
-46
-47
-43
-42
-47
-43
-42
-48
-44
-43
-48
-44
-43
-47
-43
-42
-47
-43
-42
-46
-42
-41
-45
-41
-40
-48
-44
-43
-48
-44
-43
-47
-43
-42
-48
-44
-43
-49
-45
-44
-50
-46
-45
-51
-47
-46
-52
-48
-47
-58
-49
-50
-58
-49
-50
-59
-51
-49
-60
-52
-50
-61
-51
-50
-60
-50
-49
-60
-50
-48
-59
-49
-47
-61
-50
-48
-60
-49
-47
-62
-48
-45
-62
-48
-45
-63
-49
-46
-64
-50
-47
-65
-52
-46
-63
-52
-46
-64
-53
-49
-64
-55
-50
-64
-57
-51
-65
-58
-52
-66
-57
-52
-67
-56
-52
-70
-55
-52
-72
-53
-47
-81
-53
-49
-88
-53
-47
-97
-54
-47
-108
-56
-45
-117
-57
-46
-128
-60
-47
-134
-62
-48
-139
-61
-49
-147
-63
-53
-149
-62
-53
-147
-63
-53
-147
-63
-52
-149
-66
-52
-154
-66
-52
-160
-67
-52
-165
-68
-52
-172
-66
-53
-176
-68
-56
-180
-69
-58
-177
-69
-59
-170
-66
-55
-161
-63
-52
-154
-62
-49
-150
-62
-48
-149
-63
-46
-148
-63
-43
-147
-61
-44
-147
-61
-44
-147
-60
-43
-147
-60
-43
-148
-60
-46
-148
-60
-46
-147
-59
-45
-146
-60
-45
-143
-60
-46
-141
-59
-45
-138
-59
-44
-137
-60
-44
-135
-59
-43
-135
-59
-43
-134
-58
-42
-134
-58
-42
-133
-57
-41
-131
-58
-41
-131
-58
-43
-129
-57
-42
-127
-57
-45
-127
-57
-45
-128
-60
-49
-127
-60
-51
-127
-63
-54
-128
-65
-56
-130
-67
-60
-133
-70
-63
-136
-73
-66
-138
-73
-67
-142
-74
-65
-144
-71
-62
-151
-72
-67
-159
-78
-74
-167
-86
-82
-167
-96
-90
-169
-112
-101
-164
-131
-114
-156
-148
-125
-150
-161
-131
-143
-168
-138
-136
-167
-136
-131
-160
-132
-126
-150
-126
-121
-136
-117
-112
-123
-106
-100
-112
-92
-93
-105
-83
-82
-94
-74
-74
-83
-64
-66
-75
-58
-62
-69
-53
-58
-64
-50
-57
-60
-49
-51
-52
-44
-50
-50
-42
-49
-46
-41
-47
-44
-39
-47
-41
-41
-48
-42
-42
-49
-43
-43
-50
-44
-44
-49
-43
-43
-49
-43
-43
-49
-43
-43
-49
-43
-43
-49
-43
-43
-48
-44
-43
-48
-44
-43
-48
-44
-43
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-47
-46
-44
-47
-46
-44
-47
-46
-44
-50
-44
-46
-56
-42
-55
-53
-40
-49
-51
-43
-40
-53
-54
-38
-69
-75
-49
-92
-103
-71
-117
-130
-100
-134
-147
-121
-142
-155
-138
-145
-158
-148
-144
-159
-154
-139
-158
-152
-141
-165
-151
-151
-180
-158
-162
-197
-165
-169
-206
-173
-165
-201
-173
-166
-202
-176
-167
-203
-177
-164
-200
-172
-151
-190
-159
-139
-179
-145
-136
-176
-141
-141
-178
-144
-142
-178
-142
-144
-178
-143
-141
-172
-138
-132
-161
-130
-128
-153
-123
-119
-142
-114
-100
-120
-93
-81
-95
-69
-77
-81
-54
-81
-81
-53
-82
-81
-53
-44
-48
-51
-44
-48
-51
-44
-48
-51
-44
-48
-51
-46
-47
-49
-46
-47
-49
-46
-47
-49
-46
-47
-49
-47
-47
-47
-47
-47
-47
-47
-47
-47
-47
-47
-47
-47
-46
-44
-47
-46
-44
-46
-45
-43
-46
-45
-43
-47
-45
-46
-46
-44
-45
-46
-44
-45
-45
-43
-44
-44
-42
-43
-43
-41
-42
-43
-41
-42
-42
-40
-41
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-42
-40
-41
-42
-40
-41
-42
-40
-41
-41
-39
-40
-41
-39
-40
-43
-41
-42
-43
-41
-42
-44
-42
-43
-45
-43
-44
-46
-44
-45
-46
-44
-45
-47
-45
-46
-47
-45
-46
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-47
-43
-42
-46
-42
-41
-45
-41
-40
-44
-40
-39
-48
-44
-43
-48
-44
-43
-48
-44
-43
-48
-44
-43
-49
-45
-44
-50
-46
-45
-52
-48
-47
-52
-48
-47
-58
-49
-50
-59
-50
-51
-59
-50
-51
-60
-51
-52
-61
-51
-50
-60
-50
-49
-60
-50
-49
-59
-49
-48
-60
-49
-47
-60
-49
-47
-62
-48
-47
-61
-47
-46
-62
-48
-45
-62
-48
-45
-63
-49
-46
-62
-51
-47
-61
-54
-48
-59
-54
-48
-59
-56
-51
-60
-57
-52
-61
-58
-53
-62
-57
-51
-64
-55
-50
-67
-54
-48
-71
-52
-46
-79
-52
-43
-89
-52
-43
-100
-53
-43
-110
-56
-44
-120
-58
-45
-127
-59
-46
-133
-59
-46
-143
-60
-52
-145
-60
-53
-144
-62
-51
-143
-64
-51
-144
-65
-50
-147
-66
-49
-151
-65
-50
-153
-64
-48
-160
-62
-49
-166
-64
-52
-170
-66
-55
-170
-66
-57
-165
-64
-54
-159
-62
-53
-151
-61
-50
-149
-63
-50
-146
-63
-45
-146
-63
-45
-145
-62
-44
-144
-61
-43
-145
-59
-42
-145
-59
-42
-146
-60
-45
-146
-60
-45
-145
-59
-46
-145
-59
-46
-142
-59
-45
-141
-59
-45
-138
-59
-46
-136
-58
-45
-134
-58
-44
-132
-59
-44
-133
-57
-41
-133
-57
-41
-131
-58
-41
-130
-57
-40
-130
-57
-42
-129
-57
-42
-126
-56
-44
-126
-56
-44
-128
-60
-49
-128
-61
-52
-128
-64
-55
-129
-66
-57
-132
-69
-62
-133
-73
-65
-136
-75
-70
-140
-77
-70
-140
-73
-65
-142
-72
-64
-152
-74
-70
-161
-83
-79
-168
-93
-88
-169
-104
-98
-169
-123
-110
-164
-142
-121
-153
-156
-129
-146
-167
-134
-137
-172
-139
-130
-170
-136
-128
-161
-132
-127
-153
-128
-126
-139
-119
-120
-129
-110
-106
-120
-97
-100
-114
-91
-90
-104
-81
-81
-93
-73
-73
-84
-67
-67
-76
-59
-62
-68
-54
-60
-63
-52
-54
-55
-47
-52
-52
-44
-51
-48
-43
-48
-43
-39
-49
-40
-41
-49
-40
-41
-50
-41
-42
-52
-43
-44
-50
-41
-42
-50
-41
-42
-50
-41
-42
-50
-41
-42
-50
-41
-42
-48
-42
-42
-48
-42
-42
-48
-42
-42
-49
-43
-43
-49
-43
-43
-48
-44
-43
-48
-44
-43
-48
-44
-43
-48
-44
-43
-48
-44
-43
-49
-43
-45
-54
-41
-50
-53
-41
-45
-52
-45
-37
-52
-54
-33
-65
-72
-38
-87
-99
-59
-113
-128
-87
-130
-146
-109
-141
-156
-125
-144
-160
-134
-144
-162
-140
-139
-161
-138
-141
-168
-137
-149
-184
-142
-160
-200
-148
-164
-208
-157
-169
-211
-171
-168
-210
-174
-167
-209
-173
-161
-203
-165
-147
-189
-151
-133
-175
-135
-130
-172
-132
-135
-176
-134
-136
-174
-133
-140
-177
-136
-139
-171
-134
-129
-159
-123
-123
-148
-116
-113
-136
-107
-95
-115
-87
-77
-93
-66
-73
-79
-51
-74
-77
-48
-76
-76
-48
-46
-47
-49
-44
-48
-49
-46
-47
-49
-46
-47
-49
-46
-48
-47
-46
-48
-47
-46
-48
-47
-47
-47
-47
-48
-48
-46
-48
-48
-46
-48
-48
-46
-48
-47
-45
-48
-47
-45
-48
-47
-43
-47
-46
-44
-49
-45
-44
-50
-46
-45
-49
-45
-44
-49
-45
-44
-48
-44
-43
-47
-43
-44
-44
-42
-43
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-42
-43
-41
-44
-43
-41
-42
-43
-41
-44
-43
-41
-42
-45
-40
-44
-42
-40
-41
-44
-40
-41
-41
-39
-40
-41
-39
-40
-40
-38
-39
-42
-40
-41
-43
-41
-42
-44
-42
-43
-44
-43
-41
-45
-43
-44
-46
-45
-43
-47
-46
-44
-47
-46
-44
-45
-44
-42
-45
-44
-42
-47
-43
-42
-47
-43
-42
-46
-42
-41
-45
-41
-40
-44
-40
-39
-44
-40
-39
-49
-45
-44
-50
-45
-42
-50
-45
-42
-50
-45
-42
-51
-46
-43
-52
-47
-44
-53
-48
-45
-54
-49
-46
-59
-51
-49
-59
-51
-49
-60
-52
-50
-60
-52
-50
-61
-51
-49
-60
-50
-48
-59
-49
-47
-59
-49
-47
-60
-49
-47
-60
-49
-47
-61
-47
-46
-61
-47
-46
-61
-47
-44
-62
-48
-45
-63
-49
-46
-61
-50
-46
-62
-51
-45
-61
-54
-46
-60
-55
-49
-57
-57
-49
-57
-58
-50
-58
-58
-50
-59
-56
-49
-63
-54
-47
-67
-50
-43
-74
-49
-44
-84
-50
-41
-94
-51
-42
-104
-54
-43
-111
-57
-45
-118
-60
-46
-123
-59
-47
-135
-61
-50
-139
-61
-51
-139
-63
-50
-140
-64
-50
-142
-64
-51
-143
-64
-49
-146
-63
-49
-149
-61
-47
-152
-60
-47
-156
-62
-50
-162
-66
-54
-161
-67
-55
-158
-66
-55
-153
-63
-52
-150
-62
-50
-148
-62
-49
-148
-62
-47
-147
-61
-46
-144
-61
-45
-142
-61
-44
-142
-61
-44
-140
-61
-44
-140
-61
-46
-141
-62
-47
-142
-60
-46
-142
-60
-46
-139
-60
-47
-138
-59
-46
-136
-58
-45
-135
-59
-45
-132
-59
-44
-132
-59
-44
-130
-58
-43
-128
-59
-43
-127
-58
-42
-126
-59
-42
-126
-59
-43
-124
-58
-42
-124
-58
-44
-124
-58
-46
-128
-62
-50
-129
-62
-53
-128
-64
-54
-130
-67
-58
-133
-70
-61
-133
-74
-66
-136
-77
-69
-139
-79
-71
-140
-73
-67
-142
-73
-68
-147
-80
-74
-152
-92
-84
-157
-104
-96
-157
-117
-105
-158
-135
-117
-157
-153
-128
-147
-162
-133
-143
-170
-137
-137
-172
-139
-129
-169
-135
-127
-162
-132
-125
-155
-127
-122
-144
-121
-116
-136
-111
-103
-126
-98
-98
-121
-93
-92
-112
-85
-85
-103
-79
-78
-93
-72
-71
-82
-65
-64
-73
-56
-61
-65
-51
-56
-56
-46
-56
-53
-46
-53
-48
-44
-51
-43
-41
-50
-40
-41
-50
-40
-41
-51
-41
-42
-52
-42
-43
-50
-41
-44
-48
-42
-42
-48
-42
-44
-50
-41
-42
-50
-41
-44
-50
-41
-44
-50
-41
-44
-50
-41
-44
-51
-42
-45
-51
-42
-45
-49
-43
-45
-49
-43
-45
-48
-44
-45
-48
-44
-45
-48
-44
-45
-49
-43
-47
-52
-41
-47
-52
-42
-43
-52
-45
-37
-52
-54
-33
-63
-70
-37
-84
-96
-56
-109
-124
-81
-129
-144
-103
-137
-153
-116
-141
-158
-122
-141
-161
-126
-136
-161
-122
-138
-167
-123
-145
-182
-130
-155
-196
-136
-159
-203
-144
-159
-201
-153
-158
-199
-157
-157
-198
-154
-152
-193
-149
-140
-183
-138
-130
-173
-128
-133
-174
-130
-140
-181
-137
-132
-171
-127
-137
-174
-133
-137
-169
-130
-126
-156
-120
-118
-143
-111
-108
-131
-102
-90
-110
-83
-74
-90
-63
-70
-76
-50
-70
-74
-47
-70
-72
-48
-47
-48
-43
-46
-48
-43
-47
-48
-43
-48
-49
-44
-48
-49
-44
-48
-49
-44
-49
-50
-45
-50
-49
-45
-51
-50
-46
-52
-51
-47
-52
-51
-47
-54
-50
-47
-53
-49
-46
-52
-49
-44
-51
-47
-44
-52
-47
-44
-53
-48
-45
-53
-48
-45
-52
-47
-44
-51
-46
-43
-50
-44
-44
-49
-45
-44
-48
-44
-43
-48
-44
-43
-46
-44
-45
-46
-44
-45
-45
-45
-47
-45
-45
-47
-44
-44
-46
-43
-43
-45
-42
-41
-46
-41
-41
-43
-46
-41
-47
-46
-41
-45
-47
-40
-47
-46
-41
-45
-47
-41
-45
-46
-41
-45
-46
-42
-43
-46
-42
-43
-47
-43
-42
-47
-43
-42
-45
-44
-42
-46
-45
-41
-45
-45
-43
-45
-46
-41
-46
-47
-42
-46
-47
-42
-45
-45
-45
-45
-45
-45
-46
-44
-45
-47
-45
-46
-47
-46
-44
-48
-47
-45
-50
-46
-43
-50
-46
-43
-50
-45
-42
-52
-44
-41
-53
-45
-42
-54
-46
-43
-56
-47
-42
-58
-49
-44
-58
-49
-42
-59
-50
-43
-61
-52
-45
-61
-52
-45
-62
-53
-48
-62
-53
-48
-62
-53
-48
-61
-52
-47
-60
-51
-46
-59
-50
-45
-61
-50
-46
-60
-49
-45
-60
-49
-47
-59
-48
-46
-61
-47
-46
-62
-48
-47
-62
-48
-47
-64
-49
-46
-66
-47
-41
-66
-49
-41
-60
-51
-42
-57
-54
-45
-53
-56
-45
-52
-55
-46
-54
-54
-46
-59
-50
-45
-64
-45
-41
-71
-41
-39
-79
-39
-39
-86
-41
-38
-91
-46
-40
-97
-53
-44
-102
-60
-48
-109
-63
-48
-121
-65
-48
-127
-64
-47
-134
-65
-49
-139
-66
-51
-143
-64
-51
-147
-61
-48
-147
-59
-47
-146
-56
-45
-147
-59
-47
-147
-61
-46
-148
-65
-49
-149
-66
-50
-148
-67
-50
-146
-65
-48
-145
-62
-46
-145
-59
-44
-151
-59
-48
-151
-58
-50
-146
-59
-49
-140
-61
-48
-136
-63
-48
-132
-63
-47
-130
-63
-46
-130
-63
-46
-136
-64
-49
-136
-63
-48
-138
-62
-49
-137
-61
-48
-136
-60
-47
-135
-59
-46
-132
-58
-45
-131
-59
-45
-123
-57
-43
-126
-64
-51
-118
-60
-46
-112
-56
-41
-118
-62
-45
-118
-62
-45
-118
-59
-45
-125
-63
-50
-125
-59
-47
-131
-63
-52
-136
-68
-57
-139
-72
-63
-138
-76
-65
-135
-77
-66
-133
-79
-67
-135
-78
-69
-144
-76
-73
-149
-84
-80
-147
-99
-89
-142
-113
-97
-138
-125
-106
-134
-138
-113
-135
-151
-124
-136
-159
-130
-139
-166
-135
-138
-167
-137
-139
-168
-138
-138
-168
-140
-132
-165
-136
-124
-161
-130
-114
-155
-123
-110
-151
-117
-104
-142
-105
-97
-133
-95
-91
-122
-88
-89
-116
-85
-90
-110
-83
-86
-101
-78
-79
-88
-69
-73
-75
-61
-66
-63
-54
-64
-57
-51
-58
-48
-46
-53
-43
-42
-51
-39
-41
-51
-39
-43
-51
-39
-43
-49
-38
-42
-47
-41
-45
-45
-41
-42
-45
-40
-44
-45
-39
-41
-47
-38
-43
-49
-38
-44
-51
-38
-45
-51
-38
-45
-52
-39
-46
-52
-39
-46
-51
-40
-48
-50
-40
-48
-48
-41
-49
-47
-42
-49
-47
-42
-49
-47
-42
-48
-47
-41
-45
-49
-43
-43
-48
-45
-40
-47
-47
-35
-60
-63
-42
-86
-92
-64
-112
-122
-88
-127
-139
-103
-141
-156
-117
-139
-157
-115
-140
-161
-118
-140
-166
-119
-138
-168
-118
-137
-170
-117
-142
-180
-123
-153
-191
-134
-159
-193
-143
-157
-190
-143
-150
-186
-138
-143
-179
-131
-136
-174
-125
-133
-171
-124
-131
-170
-123
-133
-170
-126
-131
-168
-125
-131
-166
-126
-128
-158
-124
-121
-148
-117
-114
-137
-109
-104
-124
-99
-89
-107
-85
-77
-90
-70
-74
-82
-61
-68
-73
-51
-62
-65
-46
-47
-48
-42
-48
-49
-43
-48
-49
-43
-48
-49
-43
-49
-50
-44
-49
-50
-44
-50
-49
-44
-51
-50
-45
-52
-51
-46
-52
-51
-46
-55
-52
-47
-55
-52
-47
-54
-51
-46
-53
-50
-45
-53
-48
-44
-53
-48
-44
-55
-47
-44
-55
-47
-44
-54
-46
-44
-54
-46
-44
-51
-46
-43
-50
-45
-42
-48
-44
-43
-48
-44
-43
-48
-44
-45
-47
-45
-46
-47
-45
-48
-45
-45
-47
-45
-44
-49
-43
-42
-47
-41
-42
-46
-41
-40
-45
-46
-41
-47
-47
-40
-47
-47
-40
-47
-47
-40
-47
-47
-41
-45
-47
-41
-45
-46
-42
-43
-46
-42
-43
-47
-43
-42
-47
-43
-42
-46
-45
-41
-46
-45
-41
-46
-47
-42
-46
-47
-42
-46
-47
-41
-46
-47
-42
-46
-46
-46
-46
-46
-48
-46
-46
-46
-46
-46
-46
-47
-46
-44
-47
-46
-44
-49
-45
-42
-51
-46
-43
-53
-45
-42
-53
-46
-40
-55
-46
-41
-56
-47
-40
-58
-47
-41
-59
-48
-42
-60
-50
-41
-61
-51
-42
-62
-53
-44
-62
-53
-44
-62
-53
-46
-62
-53
-46
-62
-53
-46
-61
-52
-45
-60
-51
-46
-60
-51
-46
-61
-50
-46
-60
-49
-45
-59
-48
-46
-59
-48
-46
-61
-47
-46
-61
-47
-46
-62
-48
-47
-64
-49
-46
-68
-47
-42
-70
-47
-41
-67
-50
-43
-64
-51
-43
-61
-52
-45
-60
-51
-44
-59
-50
-45
-62
-48
-45
-65
-44
-43
-70
-42
-41
-75
-41
-40
-80
-42
-39
-86
-45
-41
-92
-51
-45
-97
-57
-49
-103
-61
-47
-112
-65
-47
-120
-65
-45
-128
-65
-48
-136
-64
-50
-143
-63
-52
-145
-61
-51
-147
-58
-50
-147
-59
-49
-141
-57
-46
-139
-60
-47
-139
-62
-46
-140
-64
-48
-141
-65
-49
-141
-65
-49
-142
-65
-47
-145
-63
-49
-149
-59
-50
-149
-59
-50
-144
-60
-50
-139
-61
-48
-134
-62
-48
-131
-64
-47
-129
-63
-47
-129
-64
-46
-133
-64
-49
-134
-62
-47
-135
-61
-48
-136
-60
-46
-133
-59
-46
-132
-59
-44
-130
-58
-44
-127
-60
-44
-119
-57
-44
-119
-61
-49
-112
-59
-45
-109
-57
-43
-114
-63
-46
-114
-63
-46
-113
-57
-42
-117
-58
-44
-127
-61
-49
-132
-64
-53
-138
-68
-58
-140
-72
-61
-138
-74
-64
-135
-77
-65
-133
-79
-67
-136
-77
-69
-144
-74
-72
-149
-84
-82
-145
-102
-93
-138
-119
-102
-131
-135
-112
-127
-147
-119
-128
-159
-127
-131
-166
-134
-134
-167
-136
-139
-168
-138
-143
-167
-141
-143
-167
-141
-136
-165
-137
-127
-160
-131
-117
-156
-125
-109
-153
-118
-100
-147
-105
-94
-139
-96
-89
-130
-90
-89
-123
-88
-90
-119
-88
-88
-111
-83
-82
-97
-74
-77
-86
-67
-69
-73
-59
-65
-65
-55
-59
-56
-51
-53
-48
-45
-51
-42
-43
-50
-41
-42
-49
-40
-43
-46
-40
-42
-49
-40
-43
-48
-39
-44
-48
-39
-44
-48
-39
-44
-49
-38
-44
-51
-38
-45
-52
-39
-48
-52
-39
-48
-52
-39
-48
-51
-40
-48
-50
-40
-49
-48
-41
-49
-47
-42
-49
-45
-42
-51
-44
-43
-51
-44
-43
-49
-50
-45
-49
-50
-46
-45
-48
-44
-41
-45
-45
-37
-56
-58
-44
-83
-88
-66
-111
-120
-93
-128
-139
-105
-135
-150
-111
-134
-153
-108
-134
-158
-110
-136
-163
-112
-134
-164
-112
-132
-165
-112
-138
-173
-119
-147
-182
-128
-153
-185
-135
-150
-182
-132
-147
-179
-129
-140
-174
-123
-134
-171
-120
-130
-168
-119
-130
-168
-121
-131
-168
-124
-131
-166
-124
-130
-164
-127
-127
-157
-123
-120
-146
-117
-113
-136
-110
-104
-123
-101
-89
-106
-87
-77
-90
-72
-70
-77
-59
-64
-68
-51
-59
-62
-45
-49
-50
-44
-49
-50
-44
-49
-50
-44
-49
-50
-44
-50
-51
-45
-50
-51
-45
-52
-51
-46
-52
-51
-46
-53
-52
-47
-53
-52
-47
-56
-53
-48
-56
-53
-48
-56
-53
-48
-55
-52
-47
-55
-50
-46
-54
-49
-45
-56
-48
-45
-56
-48
-45
-55
-47
-44
-54
-46
-43
-52
-47
-44
-51
-46
-43
-50
-44
-44
-49
-45
-44
-49
-45
-46
-47
-45
-46
-48
-46
-49
-47
-45
-48
-45
-45
-47
-44
-44
-46
-43
-42
-47
-43
-41
-46
-47
-40
-47
-49
-39
-47
-47
-41
-45
-47
-41
-45
-47
-41
-45
-47
-41
-45
-46
-42
-43
-46
-42
-43
-48
-44
-43
-48
-44
-43
-47
-46
-42
-47
-46
-42
-47
-46
-41
-48
-47
-42
-48
-47
-42
-48
-47
-43
-47
-47
-45
-47
-47
-47
-48
-46
-47
-48
-46
-47
-48
-47
-45
-47
-46
-44
-49
-45
-42
-50
-45
-42
-54
-46
-43
-55
-48
-42
-57
-48
-43
-58
-49
-42
-60
-49
-43
-61
-51
-42
-62
-52
-43
-63
-53
-44
-63
-54
-45
-63
-54
-45
-64
-55
-46
-64
-55
-46
-63
-54
-47
-62
-53
-46
-61
-52
-45
-61
-52
-45
-61
-50
-46
-60
-49
-45
-59
-48
-46
-59
-48
-46
-59
-48
-46
-59
-48
-46
-60
-49
-47
-63
-49
-46
-68
-49
-43
-71
-47
-43
-74
-46
-43
-76
-44
-45
-79
-43
-47
-78
-42
-46
-74
-42
-47
-71
-42
-46
-68
-44
-44
-65
-46
-42
-66
-45
-40
-70
-45
-40
-79
-46
-41
-89
-48
-42
-99
-50
-45
-105
-52
-44
-107
-58
-44
-111
-59
-45
-119
-59
-48
-129
-61
-52
-135
-60
-54
-140
-60
-53
-141
-58
-52
-141
-58
-52
-138
-60
-50
-135
-61
-50
-134
-62
-50
-133
-63
-51
-134
-65
-50
-137
-65
-51
-140
-66
-53
-143
-67
-53
-142
-63
-50
-143
-61
-47
-140
-62
-49
-138
-62
-46
-135
-62
-47
-133
-62
-44
-134
-61
-46
-134
-61
-44
-137
-59
-46
-137
-60
-44
-136
-58
-45
-134
-58
-42
-132
-59
-44
-128
-60
-41
-126
-61
-43
-122
-61
-43
-124
-62
-49
-120
-60
-49
-117
-59
-47
-116
-60
-47
-118
-65
-49
-118
-65
-49
-117
-61
-46
-118
-59
-45
-127
-63
-53
-132
-65
-56
-138
-70
-61
-140
-72
-63
-138
-74
-65
-137
-74
-65
-136
-78
-67
-140
-77
-70
-147
-73
-72
-153
-83
-81
-151
-101
-92
-146
-117
-101
-138
-132
-110
-131
-144
-116
-129
-156
-123
-130
-164
-131
-134
-168
-135
-138
-169
-137
-143
-169
-140
-145
-168
-140
-144
-164
-137
-138
-158
-131
-130
-153
-125
-122
-151
-120
-107
-149
-109
-97
-146
-101
-92
-139
-97
-92
-134
-96
-93
-130
-96
-91
-124
-93
-85
-114
-86
-80
-104
-80
-70
-89
-69
-66
-80
-63
-58
-68
-57
-51
-58
-50
-46
-51
-44
-42
-47
-41
-40
-45
-41
-43
-42
-40
-50
-38
-40
-53
-36
-42
-53
-36
-42
-53
-36
-42
-52
-37
-42
-53
-38
-43
-51
-40
-46
-51
-42
-47
-48
-42
-46
-47
-42
-46
-44
-43
-48
-43
-44
-48
-41
-45
-48
-40
-45
-49
-38
-46
-49
-40
-45
-48
-49
-47
-50
-51
-47
-46
-46
-42
-39
-42
-42
-34
-53
-55
-42
-80
-85
-65
-109
-118
-91
-124
-138
-105
-128
-144
-107
-126
-147
-106
-127
-153
-106
-131
-159
-110
-128
-160
-110
-126
-160
-109
-128
-165
-113
-135
-172
-120
-141
-175
-124
-139
-173
-122
-136
-170
-120
-132
-169
-118
-129
-167
-118
-127
-167
-117
-127
-166
-119
-127
-166
-121
-127
-164
-121
-128
-162
-125
-125
-155
-121
-119
-145
-116
-112
-135
-109
-104
-124
-99
-89
-107
-85
-77
-90
-70
-69
-73
-58
-62
-64
-50
-57
-58
-44
-50
-51
-45
-50
-51
-45
-51
-52
-46
-51
-52
-46
-51
-52
-46
-52
-53
-47
-53
-52
-47
-53
-52
-47
-54
-53
-48
-55
-54
-49
-57
-54
-49
-58
-55
-50
-58
-55
-50
-57
-54
-49
-57
-52
-48
-57
-52
-48
-58
-50
-47
-57
-49
-46
-57
-49
-46
-56
-48
-45
-53
-48
-45
-52
-47
-44
-52
-46
-46
-52
-46
-46
-51
-47
-48
-51
-47
-48
-49
-47
-48
-49
-47
-50
-48
-46
-49
-46
-46
-48
-45
-45
-47
-45
-43
-46
-48
-41
-48
-50
-41
-46
-48
-42
-46
-48
-42
-46
-48
-42
-46
-48
-42
-44
-47
-43
-44
-47
-43
-42
-49
-45
-44
-49
-45
-44
-48
-47
-43
-48
-47
-43
-49
-48
-43
-49
-48
-43
-49
-48
-43
-49
-48
-44
-49
-49
-47
-49
-49
-49
-49
-47
-48
-49
-48
-46
-49
-48
-46
-50
-46
-43
-51
-46
-43
-51
-46
-42
-57
-50
-44
-57
-50
-44
-59
-50
-43
-60
-51
-44
-62
-52
-43
-64
-54
-45
-64
-54
-45
-65
-55
-46
-66
-56
-47
-65
-56
-47
-66
-57
-48
-65
-56
-47
-65
-56
-49
-64
-55
-48
-62
-53
-46
-62
-53
-46
-61
-50
-46
-61
-50
-46
-60
-49
-47
-59
-48
-46
-59
-48
-46
-60
-49
-47
-61
-50
-48
-63
-49
-46
-66
-51
-46
-70
-49
-46
-77
-45
-46
-84
-41
-48
-88
-38
-47
-87
-37
-46
-81
-38
-47
-75
-40
-46
-68
-47
-46
-62
-49
-43
-60
-50
-41
-64
-50
-41
-72
-47
-40
-84
-47
-41
-96
-45
-42
-101
-46
-41
-105
-57
-47
-107
-59
-47
-117
-60
-51
-125
-60
-54
-133
-59
-56
-137
-59
-57
-138
-59
-55
-136
-58
-54
-137
-62
-56
-134
-64
-56
-134
-66
-57
-133
-66
-57
-133
-67
-55
-134
-66
-55
-135
-65
-55
-137
-65
-53
-137
-64
-49
-137
-64
-47
-136
-63
-46
-136
-63
-46
-135
-62
-45
-136
-60
-44
-136
-59
-43
-137
-58
-43
-138
-56
-42
-138
-56
-42
-136
-57
-42
-133
-57
-41
-130
-59
-41
-125
-60
-40
-122
-61
-40
-120
-62
-42
-127
-64
-49
-122
-55
-46
-120
-56
-46
-120
-60
-49
-117
-59
-45
-118
-62
-47
-123
-65
-51
-123
-64
-50
-128
-66
-55
-132
-68
-58
-135
-71
-61
-137
-73
-63
-136
-73
-64
-138
-75
-66
-138
-78
-68
-140
-80
-72
-144
-81
-74
-147
-90
-81
-148
-101
-91
-143
-114
-98
-137
-125
-103
-132
-136
-109
-131
-147
-118
-131
-156
-124
-135
-165
-131
-136
-167
-135
-139
-168
-137
-143
-168
-138
-143
-163
-135
-139
-158
-130
-136
-152
-126
-127
-150
-121
-114
-148
-111
-108
-146
-105
-104
-142
-103
-102
-140
-101
-103
-139
-103
-100
-134
-101
-96
-125
-95
-92
-118
-91
-81
-103
-80
-76
-93
-74
-66
-80
-63
-57
-68
-54
-50
-58
-47
-46
-52
-42
-44
-47
-40
-45
-42
-37
-53
-37
-38
-56
-35
-40
-56
-35
-40
-55
-36
-40
-52
-37
-40
-51
-39
-43
-50
-41
-44
-48
-44
-45
-44
-42
-43
-43
-43
-45
-42
-43
-45
-40
-44
-45
-39
-44
-47
-39
-44
-47
-37
-45
-47
-40
-44
-45
-46
-42
-43
-49
-43
-43
-48
-43
-39
-46
-43
-34
-56
-56
-44
-80
-85
-65
-105
-113
-89
-118
-132
-99
-123
-140
-104
-121
-143
-104
-124
-150
-105
-127
-156
-108
-125
-159
-109
-121
-158
-107
-122
-160
-109
-127
-165
-114
-130
-167
-116
-128
-165
-113
-125
-163
-112
-125
-163
-112
-125
-165
-115
-126
-165
-118
-126
-165
-120
-125
-164
-120
-124
-161
-120
-125
-159
-122
-122
-153
-119
-117
-144
-113
-110
-135
-106
-101
-124
-98
-87
-107
-82
-78
-91
-71
-69
-71
-57
-63
-61
-48
-57
-55
-42
-52
-53
-47
-52
-53
-47
-52
-53
-47
-53
-54
-48
-53
-54
-48
-53
-54
-48
-55
-54
-49
-55
-54
-49
-56
-55
-50
-56
-55
-50
-59
-56
-51
-60
-57
-52
-60
-57
-52
-60
-57
-52
-60
-55
-51
-60
-55
-51
-60
-52
-49
-60
-52
-49
-59
-51
-48
-59
-51
-48
-56
-51
-48
-55
-50
-47
-54
-49
-46
-54
-49
-46
-53
-49
-48
-54
-50
-49
-54
-50
-49
-51
-49
-50
-50
-48
-49
-49
-47
-48
-48
-46
-47
-49
-45
-46
-50
-44
-48
-52
-43
-46
-52
-43
-46
-52
-43
-46
-50
-44
-46
-50
-44
-44
-50
-44
-44
-50
-44
-44
-51
-47
-46
-51
-47
-44
-51
-47
-44
-51
-47
-44
-50
-49
-44
-50
-49
-44
-51
-50
-45
-51
-50
-46
-51
-50
-48
-51
-50
-48
-51
-50
-48
-51
-50
-48
-53
-49
-48
-53
-49
-46
-54
-49
-46
-54
-49
-45
-59
-52
-46
-60
-53
-47
-61
-52
-45
-63
-54
-45
-65
-55
-46
-66
-56
-47
-69
-56
-47
-67
-57
-47
-68
-58
-49
-68
-58
-49
-69
-59
-50
-68
-58
-49
-67
-57
-48
-66
-56
-47
-64
-53
-47
-64
-53
-47
-62
-51
-47
-62
-51
-47
-61
-50
-46
-61
-50
-46
-61
-50
-48
-61
-50
-48
-62
-51
-49
-62
-51
-49
-66
-52
-49
-70
-50
-49
-78
-48
-50
-85
-44
-52
-90
-40
-51
-89
-39
-50
-83
-40
-49
-76
-44
-49
-68
-50
-48
-60
-53
-45
-57
-55
-43
-60
-54
-42
-68
-51
-41
-78
-49
-41
-90
-47
-41
-94
-47
-41
-102
-58
-49
-106
-59
-51
-115
-60
-55
-122
-61
-58
-130
-60
-58
-134
-60
-59
-135
-59
-59
-134
-58
-58
-130
-59
-55
-129
-62
-56
-129
-65
-56
-129
-66
-57
-131
-67
-58
-131
-67
-58
-133
-64
-57
-132
-64
-55
-132
-66
-50
-132
-67
-49
-133
-64
-48
-134
-62
-47
-136
-60
-46
-137
-59
-46
-139
-57
-45
-140
-56
-45
-138
-54
-43
-137
-55
-43
-135
-56
-43
-131
-58
-43
-127
-60
-43
-122
-61
-42
-119
-62
-42
-120
-62
-42
-127
-57
-45
-122
-48
-39
-129
-56
-47
-131
-63
-52
-117
-53
-43
-113
-53
-42
-124
-66
-54
-125
-67
-55
-127
-69
-58
-129
-71
-60
-131
-73
-62
-132
-74
-63
-133
-74
-66
-135
-76
-68
-138
-79
-71
-137
-85
-74
-130
-94
-78
-129
-102
-81
-134
-109
-89
-135
-114
-93
-136
-121
-98
-137
-131
-105
-141
-144
-117
-141
-154
-124
-138
-159
-126
-136
-163
-130
-136
-167
-133
-137
-168
-134
-135
-166
-132
-132
-162
-128
-129
-156
-125
-127
-151
-119
-125
-144
-112
-125
-142
-108
-123
-140
-108
-120
-139
-107
-120
-139
-109
-117
-136
-108
-112
-131
-103
-108
-126
-100
-99
-113
-88
-92
-104
-82
-83
-90
-72
-73
-75
-61
-66
-64
-52
-61
-54
-44
-57
-47
-38
-55
-42
-36
-57
-39
-39
-57
-37
-39
-54
-38
-39
-52
-38
-38
-49
-39
-38
-46
-40
-40
-44
-43
-41
-44
-44
-42
-41
-43
-40
-41
-43
-42
-41
-43
-42
-41
-43
-42
-42
-42
-44
-42
-42
-44
-43
-41
-44
-45
-41
-42
-44
-35
-36
-50
-42
-39
-53
-48
-42
-56
-54
-42
-66
-67
-53
-85
-90
-70
-102
-112
-87
-110
-125
-94
-116
-136
-101
-113
-138
-98
-117
-144
-101
-120
-152
-105
-119
-155
-107
-115
-153
-104
-116
-154
-105
-119
-159
-107
-122
-162
-110
-120
-160
-108
-119
-159
-109
-120
-160
-110
-121
-163
-115
-123
-165
-117
-123
-165
-119
-124
-163
-119
-121
-158
-117
-122
-156
-119
-119
-150
-116
-115
-142
-111
-109
-134
-104
-100
-123
-95
-87
-107
-80
-78
-92
-69
-68
-69
-55
-62
-58
-47
-56
-52
-41
-53
-54
-48
-53
-54
-48
-54
-55
-49
-54
-55
-49
-55
-56
-50
-55
-56
-50
-56
-55
-50
-56
-55
-50
-57
-56
-51
-58
-57
-52
-61
-58
-53
-62
-59
-54
-62
-59
-54
-62
-59
-54
-62
-57
-53
-62
-57
-53
-63
-55
-52
-63
-55
-52
-62
-54
-51
-61
-53
-50
-59
-54
-51
-58
-53
-50
-57
-52
-49
-57
-52
-49
-56
-52
-49
-56
-52
-51
-57
-53
-52
-56
-52
-51
-55
-51
-50
-52
-51
-49
-53
-49
-50
-52
-48
-47
-54
-45
-48
-54
-45
-46
-54
-45
-48
-54
-45
-46
-52
-46
-46
-52
-46
-46
-52
-46
-46
-52
-47
-44
-52
-48
-45
-52
-48
-45
-52
-48
-45
-53
-49
-46
-51
-50
-45
-51
-50
-45
-52
-51
-46
-52
-51
-46
-52
-51
-47
-52
-51
-49
-53
-52
-50
-53
-52
-48
-56
-52
-49
-56
-53
-48
-57
-52
-48
-58
-53
-47
-61
-54
-48
-62
-55
-47
-64
-55
-46
-65
-56
-47
-67
-57
-48
-68
-58
-48
-71
-58
-49
-72
-59
-50
-70
-60
-51
-70
-60
-51
-70
-60
-51
-70
-60
-51
-69
-59
-50
-67
-57
-48
-66
-55
-49
-65
-54
-48
-64
-53
-49
-64
-53
-49
-63
-52
-48
-62
-51
-47
-62
-51
-49
-63
-52
-50
-64
-53
-51
-64
-53
-51
-65
-54
-50
-68
-53
-50
-75
-50
-53
-81
-49
-54
-86
-46
-54
-85
-45
-53
-82
-47
-53
-75
-49
-50
-68
-53
-50
-63
-56
-48
-61
-57
-45
-63
-57
-43
-67
-55
-41
-73
-54
-40
-83
-50
-41
-88
-50
-41
-93
-50
-43
-100
-51
-44
-108
-53
-48
-118
-54
-52
-125
-55
-55
-130
-56
-55
-131
-55
-55
-130
-54
-54
-126
-55
-53
-125
-58
-52
-125
-60
-54
-125
-62
-53
-128
-63
-57
-131
-64
-56
-134
-63
-57
-133
-65
-56
-131
-65
-51
-131
-65
-49
-132
-65
-49
-132
-63
-48
-136
-60
-47
-136
-58
-46
-137
-57
-46
-138
-56
-45
-135
-55
-44
-134
-56
-44
-131
-57
-44
-128
-59
-44
-126
-60
-44
-124
-61
-44
-121
-62
-44
-126
-60
-44
-133
-53
-42
-138
-51
-44
-160
-77
-69
-166
-89
-81
-138
-65
-56
-124
-57
-48
-130
-70
-59
-128
-75
-61
-123
-71
-58
-122
-74
-60
-124
-76
-62
-125
-77
-63
-127
-77
-66
-130
-80
-69
-137
-85
-74
-134
-92
-76
-119
-105
-79
-117
-112
-82
-130
-114
-88
-141
-117
-93
-150
-117
-98
-159
-124
-105
-166
-135
-115
-167
-145
-122
-157
-147
-122
-150
-153
-124
-146
-160
-127
-143
-165
-129
-139
-165
-130
-134
-161
-126
-130
-156
-121
-131
-150
-118
-134
-143
-112
-136
-141
-111
-134
-140
-112
-131
-142
-112
-129
-142
-112
-126
-141
-112
-122
-138
-109
-118
-134
-107
-109
-125
-98
-104
-116
-92
-96
-104
-83
-87
-90
-71
-80
-77
-62
-72
-64
-51
-66
-54
-42
-64
-47
-39
-61
-43
-39
-60
-42
-40
-56
-42
-39
-53
-42
-40
-50
-42
-39
-47
-44
-39
-44
-45
-39
-43
-45
-40
-43
-45
-40
-44
-45
-40
-45
-44
-42
-47
-43
-42
-51
-41
-42
-52
-40
-42
-54
-39
-42
-54
-40
-40
-51
-40
-36
-60
-51
-44
-69
-62
-52
-73
-71
-56
-81
-82
-64
-93
-98
-75
-103
-113
-86
-106
-121
-90
-110
-130
-93
-107
-132
-92
-108
-137
-93
-112
-145
-98
-113
-149
-101
-111
-149
-100
-111
-151
-101
-114
-154
-102
-117
-159
-109
-114
-156
-106
-113
-155
-105
-116
-158
-110
-120
-162
-114
-122
-164
-118
-121
-162
-118
-121
-159
-118
-118
-154
-116
-119
-153
-118
-117
-148
-114
-111
-141
-107
-106
-133
-102
-99
-124
-94
-85
-108
-79
-78
-92
-69
-67
-68
-54
-64
-57
-47
-58
-51
-41
-54
-55
-49
-55
-56
-50
-55
-56
-50
-55
-56
-50
-56
-57
-51
-56
-57
-51
-57
-56
-51
-58
-57
-52
-58
-57
-52
-59
-58
-53
-62
-59
-54
-63
-60
-55
-63
-60
-55
-63
-60
-55
-64
-59
-55
-64
-59
-55
-66
-58
-55
-66
-58
-55
-65
-57
-54
-64
-56
-53
-61
-56
-52
-61
-56
-52
-60
-55
-51
-60
-55
-51
-60
-55
-51
-60
-55
-52
-60
-55
-52
-60
-55
-52
-59
-54
-51
-57
-53
-50
-57
-51
-51
-56
-51
-48
-56
-47
-48
-57
-47
-46
-56
-47
-48
-56
-48
-46
-56
-48
-46
-56
-48
-46
-54
-49
-46
-54
-49
-45
-54
-49
-45
-54
-49
-45
-53
-50
-45
-53
-50
-45
-54
-51
-46
-54
-51
-46
-55
-52
-47
-55
-52
-47
-53
-52
-48
-53
-52
-48
-56
-52
-49
-57
-53
-50
-58
-54
-51
-60
-57
-52
-61
-56
-52
-64
-57
-51
-64
-55
-48
-65
-56
-47
-67
-57
-48
-68
-58
-48
-71
-58
-49
-72
-60
-48
-73
-61
-49
-73
-61
-49
-74
-61
-52
-74
-61
-52
-74
-61
-52
-73
-60
-51
-70
-60
-51
-68
-58
-49
-66
-56
-47
-65
-55
-46
-65
-56
-49
-64
-55
-48
-64
-55
-50
-63
-54
-49
-63
-54
-49
-64
-55
-50
-64
-55
-50
-65
-56
-51
-64
-54
-52
-65
-55
-53
-67
-56
-54
-70
-56
-55
-72
-57
-54
-74
-56
-54
-74
-56
-54
-72
-57
-52
-69
-56
-48
-69
-56
-47
-69
-57
-45
-70
-56
-43
-73
-57
-44
-73
-57
-42
-76
-57
-43
-82
-54
-42
-90
-47
-38
-100
-47
-39
-110
-51
-45
-122
-54
-51
-131
-57
-56
-137
-59
-57
-139
-59
-58
-139
-61
-59
-139
-65
-62
-135
-64
-58
-130
-61
-54
-127
-60
-51
-127
-58
-51
-130
-60
-52
-136
-61
-55
-138
-64
-55
-133
-63
-53
-132
-64
-51
-132
-62
-50
-134
-62
-50
-134
-60
-49
-133
-59
-48
-132
-58
-47
-131
-59
-47
-128
-58
-46
-127
-59
-46
-126
-60
-46
-127
-61
-47
-127
-61
-47
-128
-60
-47
-129
-59
-47
-135
-57
-47
-144
-49
-43
-160
-61
-56
-203
-108
-102
-216
-127
-121
-171
-91
-84
-138
-68
-60
-136
-76
-65
-127
-78
-64
-117
-73
-60
-114
-77
-61
-113
-80
-63
-114
-81
-64
-118
-83
-64
-124
-85
-68
-132
-90
-74
-128
-100
-79
-113
-113
-79
-116
-120
-85
-138
-118
-91
-156
-115
-95
-173
-109
-99
-186
-107
-102
-194
-111
-107
-195
-116
-111
-191
-128
-119
-183
-137
-122
-173
-148
-126
-163
-156
-128
-154
-159
-129
-145
-159
-126
-139
-154
-121
-137
-151
-118
-140
-143
-114
-142
-142
-114
-139
-144
-114
-135
-146
-114
-132
-147
-114
-128
-147
-115
-122
-146
-112
-119
-144
-112
-112
-137
-105
-107
-130
-101
-103
-119
-92
-94
-107
-81
-88
-93
-71
-80
-79
-59
-72
-67
-48
-67
-58
-43
-65
-50
-43
-64
-49
-44
-59
-48
-42
-56
-47
-42
-52
-47
-41
-50
-47
-40
-46
-47
-39
-46
-47
-41
-48
-47
-42
-51
-46
-42
-54
-44
-43
-58
-42
-43
-62
-40
-43
-65
-38
-43
-69
-36
-43
-67
-38
-40
-70
-53
-45
-76
-67
-52
-86
-81
-62
-91
-89
-68
-96
-98
-74
-103
-109
-81
-105
-119
-86
-106
-123
-87
-108
-130
-91
-103
-130
-87
-102
-134
-87
-108
-142
-92
-111
-148
-97
-110
-148
-97
-110
-150
-98
-114
-154
-102
-115
-157
-107
-111
-155
-106
-111
-153
-105
-114
-156
-110
-119
-160
-116
-121
-162
-120
-120
-158
-119
-117
-155
-118
-115
-151
-115
-117
-151
-118
-115
-146
-114
-110
-139
-108
-105
-132
-99
-98
-123
-91
-84
-109
-77
-77
-93
-67
-72
-73
-59
-69
-60
-51
-63
-54
-45
-55
-56
-50
-55
-56
-50
-56
-57
-51
-56
-57
-51
-56
-57
-51
-57
-58
-52
-58
-57
-52
-58
-57
-52
-59
-58
-53
-60
-59
-54
-63
-60
-55
-64
-61
-56
-64
-61
-56
-64
-61
-56
-65
-60
-56
-65
-60
-56
-67
-59
-56
-67
-59
-56
-67
-59
-56
-66
-58
-55
-63
-58
-54
-62
-57
-53
-62
-57
-53
-61
-56
-52
-62
-57
-53
-62
-57
-53
-62
-57
-53
-62
-57
-53
-61
-56
-53
-60
-55
-51
-58
-53
-49
-59
-51
-48
-58
-48
-46
-58
-48
-46
-57
-49
-46
-57
-49
-46
-57
-49
-47
-57
-49
-46
-57
-49
-46
-55
-50
-46
-54
-49
-45
-54
-49
-45
-54
-51
-46
-54
-51
-46
-54
-51
-46
-55
-52
-47
-55
-52
-47
-55
-52
-47
-53
-52
-48
-54
-53
-49
-57
-53
-50
-59
-56
-51
-60
-57
-52
-63
-58
-52
-66
-59
-53
-66
-59
-51
-65
-56
-47
-66
-58
-47
-67
-57
-47
-69
-59
-47
-72
-60
-48
-73
-61
-49
-74
-62
-50
-74
-62
-50
-75
-62
-53
-75
-62
-53
-74
-61
-52
-74
-61
-52
-70
-60
-51
-69
-59
-50
-67
-57
-48
-66
-56
-47
-66
-57
-50
-66
-57
-50
-65
-56
-51
-64
-55
-50
-64
-55
-50
-65
-56
-51
-66
-57
-52
-66
-57
-52
-63
-56
-50
-64
-57
-51
-66
-59
-53
-69
-60
-55
-71
-60
-54
-73
-60
-54
-77
-60
-53
-78
-59
-52
-77
-54
-46
-78
-54
-44
-81
-54
-43
-81
-54
-43
-81
-55
-42
-82
-56
-43
-80
-57
-41
-86
-54
-39
-103
-53
-42
-114
-54
-44
-126
-59
-51
-137
-64
-57
-149
-68
-64
-155
-72
-68
-159
-74
-71
-159
-76
-70
-160
-81
-74
-153
-76
-68
-142
-68
-59
-133
-59
-48
-132
-55
-45
-133
-55
-45
-140
-57
-49
-143
-60
-52
-139
-60
-53
-138
-61
-55
-137
-60
-54
-136
-59
-53
-136
-59
-53
-132
-59
-52
-128
-60
-51
-125
-61
-51
-122
-62
-51
-122
-62
-51
-122
-62
-51
-125
-61
-51
-129
-59
-51
-134
-57
-51
-139
-54
-51
-146
-51
-49
-150
-41
-38
-176
-63
-59
-234
-125
-122
-252
-150
-146
-195
-104
-99
-149
-72
-64
-137
-75
-64
-120
-72
-58
-112
-76
-60
-106
-81
-61
-104
-83
-62
-106
-86
-62
-111
-86
-64
-118
-90
-69
-128
-95
-76
-130
-102
-80
-124
-113
-81
-134
-118
-85
-160
-115
-92
-183
-107
-94
-203
-95
-95
-214
-84
-92
-218
-81
-91
-218
-82
-92
-230
-111
-117
-219
-121
-120
-207
-133
-124
-195
-142
-126
-184
-147
-128
-174
-148
-125
-165
-145
-120
-162
-142
-118
-159
-137
-114
-159
-137
-116
-156
-140
-117
-152
-142
-117
-148
-144
-117
-141
-144
-115
-137
-143
-115
-133
-144
-114
-127
-137
-110
-124
-133
-106
-119
-121
-97
-112
-110
-87
-105
-97
-78
-98
-82
-66
-87
-68
-53
-83
-59
-47
-79
-52
-45
-77
-49
-45
-73
-48
-44
-68
-47
-42
-64
-47
-40
-59
-46
-38
-55
-46
-39
-54
-47
-39
-57
-48
-41
-58
-47
-41
-61
-46
-43
-65
-44
-43
-70
-41
-43
-72
-40
-43
-75
-39
-43
-72
-41
-39
-84
-66
-52
-89
-81
-60
-100
-94
-70
-103
-101
-76
-105
-108
-79
-110
-117
-86
-109
-123
-88
-108
-126
-88
-107
-132
-90
-103
-132
-86
-103
-135
-86
-109
-143
-93
-112
-149
-98
-113
-150
-98
-114
-153
-100
-117
-157
-105
-116
-155
-108
-111
-153
-107
-111
-150
-106
-114
-153
-109
-119
-157
-118
-121
-159
-120
-119
-154
-121
-116
-150
-117
-115
-148
-117
-117
-148
-117
-115
-144
-113
-111
-138
-107
-105
-132
-101
-97
-124
-91
-84
-109
-77
-77
-93
-66
-78
-79
-63
-76
-67
-58
-69
-60
-51
-57
-58
-52
-57
-58
-52
-57
-58
-52
-57
-58
-52
-57
-58
-52
-58
-59
-53
-61
-60
-55
-61
-60
-55
-61
-60
-55
-61
-60
-55
-64
-61
-56
-64
-61
-56
-65
-62
-57
-66
-63
-58
-68
-63
-59
-68
-63
-59
-69
-64
-60
-69
-64
-60
-69
-64
-58
-68
-63
-57
-68
-63
-57
-67
-62
-56
-69
-62
-56
-68
-61
-55
-66
-59
-53
-66
-59
-53
-66
-59
-53
-66
-59
-53
-66
-58
-55
-66
-59
-53
-65
-58
-52
-65
-58
-52
-65
-56
-51
-65
-56
-51
-65
-56
-51
-64
-55
-50
-64
-54
-52
-62
-55
-49
-62
-55
-49
-62
-55
-49
-60
-55
-49
-60
-55
-49
-59
-54
-48
-58
-53
-47
-56
-53
-46
-56
-53
-46
-55
-52
-47
-55
-52
-47
-57
-54
-49
-57
-54
-49
-57
-54
-49
-58
-55
-48
-60
-55
-49
-61
-56
-50
-65
-58
-50
-66
-59
-49
-67
-58
-49
-68
-60
-49
-70
-60
-50
-74
-62
-50
-75
-63
-51
-76
-64
-50
-78
-64
-51
-78
-64
-53
-78
-64
-55
-78
-64
-55
-76
-63
-54
-75
-62
-53
-73
-60
-51
-72
-59
-50
-69
-59
-50
-69
-59
-50
-66
-57
-48
-65
-56
-47
-64
-57
-49
-63
-56
-48
-63
-56
-48
-63
-56
-48
-64
-57
-51
-64
-57
-51
-60
-53
-47
-77
-68
-61
-77
-64
-58
-75
-58
-51
-84
-64
-57
-82
-54
-50
-81
-48
-43
-95
-60
-54
-91
-52
-45
-94
-54
-46
-95
-52
-43
-92
-48
-39
-94
-47
-37
-101
-54
-44
-109
-61
-49
-114
-60
-48
-137
-73
-61
-143
-71
-59
-151
-73
-63
-159
-75
-65
-159
-70
-62
-155
-62
-55
-154
-61
-54
-158
-68
-59
-166
-78
-68
-164
-80
-69
-168
-86
-74
-171
-89
-75
-165
-79
-66
-153
-65
-53
-151
-59
-48
-156
-62
-54
-148
-57
-56
-146
-56
-56
-143
-53
-53
-137
-51
-50
-136
-55
-52
-135
-62
-56
-127
-63
-54
-117
-60
-49
-117
-65
-52
-115
-63
-50
-116
-59
-48
-121
-57
-48
-133
-54
-50
-142
-50
-51
-149
-44
-49
-155
-38
-44
-198
-72
-73
-229
-99
-97
-194
-70
-68
-202
-89
-85
-224
-122
-118
-171
-86
-79
-134
-70
-60
-132
-86
-70
-109
-82
-61
-105
-91
-65
-105
-98
-70
-107
-100
-72
-107
-95
-69
-111
-94
-68
-125
-99
-76
-141
-106
-84
-145
-99
-76
-177
-110
-93
-208
-111
-104
-218
-89
-93
-222
-59
-76
-229
-45
-69
-241
-44
-72
-243
-49
-76
-243
-65
-89
-233
-74
-92
-227
-91
-101
-226
-111
-114
-224
-124
-124
-218
-129
-125
-216
-133
-127
-215
-138
-130
-196
-126
-118
-192
-128
-119
-189
-131
-120
-185
-133
-120
-181
-135
-120
-175
-136
-119
-171
-138
-121
-167
-138
-120
-157
-128
-112
-157
-125
-110
-154
-121
-106
-150
-110
-98
-145
-98
-90
-135
-85
-78
-127
-72
-67
-123
-65
-63
-117
-58
-60
-103
-47
-50
-100
-48
-50
-97
-49
-49
-79
-39
-39
-71
-37
-35
-76
-48
-45
-77
-53
-49
-72
-51
-46
-69
-50
-44
-68
-49
-45
-70
-49
-46
-70
-46
-44
-71
-43
-42
-75
-45
-45
-81
-54
-47
-89
-72
-52
-96
-87
-58
-102
-95
-66
-103
-100
-69
-107
-111
-78
-117
-124
-90
-117
-132
-93
-111
-129
-89
-108
-131
-87
-108
-135
-90
-112
-141
-93
-114
-146
-97
-115
-149
-98
-117
-151
-100
-119
-153
-102
-118
-155
-104
-114
-150
-106
-115
-152
-111
-115
-151
-113
-113
-149
-111
-115
-149
-116
-119
-153
-120
-122
-152
-124
-121
-150
-122
-120
-149
-121
-115
-141
-114
-109
-135
-106
-107
-132
-102
-105
-130
-100
-97
-122
-90
-84
-109
-77
-79
-95
-68
-79
-80
-64
-84
-75
-66
-82
-73
-64
-57
-58
-52
-57
-58
-52
-57
-58
-52
-57
-58
-52
-58
-59
-53
-59
-60
-54
-62
-61
-56
-63
-62
-57
-62
-61
-56
-62
-61
-56
-65
-62
-57
-65
-62
-57
-66
-63
-58
-67
-64
-59
-68
-63
-59
-68
-63
-59
-70
-65
-61
-69
-64
-60
-69
-64
-58
-69
-64
-58
-68
-63
-57
-68
-63
-57
-69
-62
-56
-69
-62
-56
-69
-62
-56
-69
-62
-56
-69
-62
-56
-68
-61
-53
-67
-60
-54
-67
-60
-52
-68
-59
-52
-67
-58
-49
-66
-57
-50
-66
-57
-50
-66
-57
-50
-66
-57
-50
-65
-56
-51
-65
-56
-51
-64
-57
-51
-64
-57
-51
-62
-55
-49
-60
-55
-49
-59
-54
-48
-59
-54
-48
-57
-54
-47
-56
-53
-46
-55
-52
-47
-55
-52
-47
-57
-54
-49
-57
-54
-47
-57
-54
-47
-58
-55
-48
-60
-55
-49
-62
-58
-49
-65
-58
-48
-66
-60
-48
-67
-59
-48
-69
-59
-47
-73
-61
-49
-74
-62
-48
-76
-64
-50
-76
-64
-50
-78
-64
-51
-78
-64
-51
-78
-64
-53
-78
-64
-55
-77
-63
-54
-74
-61
-52
-73
-60
-51
-72
-59
-50
-69
-59
-50
-69
-59
-50
-67
-58
-49
-66
-57
-48
-64
-57
-49
-64
-57
-49
-64
-57
-49
-64
-57
-49
-65
-58
-52
-65
-58
-50
-67
-58
-51
-73
-56
-49
-75
-47
-43
-86
-46
-44
-106
-55
-54
-116
-58
-57
-123
-59
-59
-133
-69
-67
-129
-68
-63
-131
-72
-64
-132
-73
-65
-132
-72
-62
-141
-74
-66
-152
-79
-72
-161
-80
-76
-162
-79
-71
-147
-68
-55
-148
-66
-52
-154
-66
-54
-159
-67
-56
-160
-62
-51
-156
-55
-45
-156
-55
-45
-159
-61
-48
-163
-67
-53
-155
-63
-48
-153
-64
-48
-160
-69
-51
-164
-71
-54
-167
-70
-54
-174
-72
-58
-182
-78
-69
-181
-75
-77
-176
-71
-76
-167
-64
-68
-155
-56
-59
-147
-55
-56
-142
-61
-58
-133
-62
-56
-121
-61
-51
-114
-60
-48
-124
-72
-59
-135
-75
-65
-133
-62
-56
-133
-43
-43
-149
-40
-46
-181
-57
-68
-211
-75
-87
-219
-76
-78
-221
-79
-77
-199
-64
-61
-190
-65
-63
-208
-96
-92
-179
-89
-81
-132
-64
-53
-130
-84
-68
-121
-97
-73
-101
-91
-64
-96
-92
-63
-107
-104
-73
-117
-108
-79
-119
-102
-74
-127
-99
-75
-150
-99
-78
-185
-102
-88
-210
-97
-91
-224
-88
-90
-231
-67
-78
-238
-46
-69
-249
-39
-68
-255
-40
-72
-255
-42
-73
-255
-48
-78
-243
-53
-78
-236
-63
-82
-234
-76
-90
-230
-82
-94
-224
-84
-93
-222
-85
-93
-221
-90
-98
-219
-98
-105
-216
-101
-108
-214
-105
-110
-213
-108
-113
-208
-112
-114
-206
-116
-116
-204
-118
-119
-201
-120
-119
-204
-124
-125
-203
-121
-123
-203
-118
-121
-202
-113
-117
-202
-107
-115
-201
-101
-111
-199
-97
-108
-197
-95
-108
-195
-97
-110
-177
-84
-95
-163
-76
-85
-153
-72
-81
-141
-68
-75
-132
-70
-73
-107
-55
-57
-72
-28
-27
-84
-49
-45
-77
-48
-42
-72
-49
-43
-74
-54
-47
-75
-56
-49
-75
-58
-50
-79
-62
-54
-85
-69
-56
-91
-79
-53
-99
-90
-57
-103
-97
-65
-105
-102
-69
-110
-114
-79
-122
-130
-93
-122
-137
-98
-116
-134
-94
-114
-137
-95
-112
-137
-95
-112
-139
-96
-113
-142
-96
-117
-146
-100
-119
-148
-100
-119
-148
-100
-119
-148
-102
-115
-146
-105
-120
-150
-114
-122
-151
-120
-121
-150
-120
-126
-152
-125
-131
-157
-132
-133
-157
-135
-131
-155
-133
-129
-153
-131
-122
-146
-122
-114
-137
-111
-109
-132
-104
-104
-129
-100
-96
-121
-91
-84
-109
-77
-78
-97
-69
-82
-83
-67
-86
-80
-68
-86
-79
-69
-56
-57
-51
-56
-57
-51
-56
-57
-51
-57
-58
-52
-59
-60
-54
-60
-61
-55
-63
-62
-57
-64
-63
-58
-64
-63
-58
-64
-63
-58
-67
-64
-59
-67
-64
-59
-67
-64
-59
-67
-64
-59
-68
-63
-59
-68
-63
-59
-70
-65
-59
-70
-65
-59
-70
-65
-59
-69
-64
-58
-69
-64
-58
-69
-64
-58
-71
-64
-56
-70
-63
-55
-74
-65
-58
-73
-64
-57
-72
-63
-56
-71
-62
-53
-70
-61
-54
-69
-60
-51
-70
-60
-51
-69
-59
-49
-68
-58
-49
-68
-58
-49
-68
-58
-49
-68
-58
-49
-68
-59
-52
-68
-59
-52
-68
-59
-52
-67
-60
-52
-63
-56
-48
-63
-56
-48
-60
-55
-49
-59
-54
-48
-58
-53
-47
-58
-53
-47
-57
-52
-46
-57
-52
-46
-57
-54
-47
-57
-54
-47
-58
-53
-47
-59
-55
-46
-62
-55
-47
-64
-57
-47
-66
-57
-48
-67
-59
-48
-69
-59
-49
-70
-60
-48
-73
-61
-49
-75
-63
-49
-77
-63
-50
-77
-64
-48
-78
-65
-49
-77
-64
-48
-80
-63
-53
-77
-63
-52
-76
-62
-51
-75
-61
-50
-73
-60
-51
-72
-59
-50
-69
-59
-49
-68
-58
-48
-67
-58
-49
-67
-58
-49
-65
-58
-48
-65
-58
-48
-63
-59
-50
-64
-60
-51
-64
-60
-51
-68
-59
-52
-83
-69
-60
-82
-51
-46
-105
-51
-51
-142
-65
-71
-173
-76
-87
-193
-86
-96
-203
-93
-102
-196
-96
-98
-154
-66
-62
-150
-73
-63
-149
-77
-65
-155
-79
-66
-171
-82
-74
-190
-85
-82
-203
-80
-83
-196
-76
-75
-163
-65
-52
-157
-66
-48
-160
-64
-48
-165
-63
-49
-165
-59
-46
-163
-55
-43
-164
-56
-43
-167
-61
-47
-171
-69
-54
-161
-62
-43
-152
-55
-36
-157
-58
-39
-165
-62
-45
-172
-65
-47
-178
-67
-50
-184
-67
-58
-167
-48
-50
-177
-57
-66
-185
-68
-76
-190
-75
-82
-186
-77
-82
-173
-75
-76
-150
-65
-62
-130
-55
-49
-123
-56
-47
-118
-54
-44
-122
-49
-42
-133
-48
-45
-156
-51
-55
-186
-60
-71
-215
-70
-87
-232
-77
-91
-225
-71
-73
-206
-54
-51
-205
-60
-57
-187
-52
-49
-198
-79
-75
-198
-99
-93
-148
-74
-63
-140
-91
-74
-125
-99
-76
-106
-95
-67
-104
-99
-69
-117
-111
-79
-128
-111
-81
-130
-103
-74
-143
-103
-78
-177
-104
-89
-224
-100
-98
-239
-84
-90
-238
-71
-81
-239
-58
-73
-248
-52
-74
-255
-52
-78
-255
-50
-77
-254
-46
-72
-255
-53
-79
-245
-51
-75
-240
-53
-74
-239
-56
-76
-237
-55
-77
-233
-54
-75
-236
-54
-76
-239
-57
-80
-241
-65
-88
-239
-67
-91
-239
-70
-93
-237
-73
-97
-236
-77
-99
-234
-81
-101
-233
-84
-104
-232
-86
-107
-228
-84
-107
-229
-83
-106
-228
-80
-106
-228
-78
-105
-233
-78
-109
-238
-81
-112
-242
-83
-115
-244
-87
-118
-252
-105
-133
-237
-99
-124
-225
-93
-116
-210
-87
-108
-203
-90
-108
-199
-101
-114
-166
-83
-93
-114
-45
-50
-93
-39
-39
-88
-49
-44
-87
-58
-52
-81
-63
-53
-66
-58
-45
-58
-56
-41
-63
-66
-49
-76
-78
-57
-86
-79
-51
-97
-86
-54
-101
-95
-63
-104
-101
-68
-113
-117
-84
-127
-134
-101
-126
-140
-105
-119
-136
-100
-120
-140
-105
-117
-139
-101
-114
-139
-100
-114
-139
-99
-118
-140
-101
-121
-143
-104
-122
-144
-105
-122
-144
-106
-128
-149
-118
-132
-155
-126
-138
-158
-133
-141
-160
-138
-146
-163
-144
-151
-168
-150
-152
-169
-153
-150
-166
-153
-145
-162
-146
-135
-152
-134
-122
-141
-121
-112
-131
-109
-103
-126
-98
-94
-119
-89
-84
-109
-77
-80
-99
-71
-82
-87
-67
-88
-85
-70
-89
-85
-73
-55
-56
-50
-55
-56
-50
-56
-57
-51
-57
-58
-52
-59
-60
-54
-61
-62
-56
-64
-63
-58
-65
-64
-59
-66
-65
-60
-66
-65
-60
-68
-65
-60
-68
-65
-60
-68
-65
-60
-68
-65
-60
-69
-64
-60
-69
-64
-60
-71
-66
-60
-71
-66
-60
-71
-66
-60
-70
-65
-59
-70
-65
-59
-70
-66
-57
-72
-65
-57
-72
-65
-57
-76
-67
-60
-75
-66
-57
-74
-65
-56
-73
-64
-55
-72
-62
-53
-71
-61
-51
-70
-60
-50
-69
-59
-49
-68
-58
-48
-68
-58
-48
-69
-59
-49
-69
-59
-50
-68
-59
-50
-69
-60
-51
-69
-60
-53
-69
-60
-53
-64
-57
-49
-63
-56
-48
-61
-56
-50
-60
-55
-49
-59
-54
-48
-58
-53
-47
-58
-53
-47
-58
-53
-47
-57
-54
-47
-57
-54
-45
-59
-55
-46
-59
-55
-44
-63
-56
-46
-64
-58
-46
-67
-59
-48
-68
-60
-47
-70
-60
-48
-70
-61
-46
-74
-62
-48
-75
-63
-47
-77
-64
-48
-77
-64
-48
-77
-64
-47
-77
-64
-48
-79
-63
-50
-79
-62
-52
-76
-62
-51
-75
-61
-50
-74
-60
-51
-71
-58
-49
-69
-59
-49
-68
-58
-48
-68
-59
-50
-68
-59
-50
-66
-59
-49
-64
-60
-49
-64
-60
-51
-65
-61
-52
-66
-62
-53
-70
-60
-51
-81
-56
-49
-88
-43
-38
-135
-59
-63
-189
-85
-96
-216
-85
-101
-228
-86
-102
-226
-86
-99
-201
-75
-79
-157
-52
-48
-148
-58
-47
-144
-62
-48
-152
-66
-51
-173
-70
-61
-196
-74
-71
-212
-67
-72
-203
-63
-64
-177
-66
-55
-167
-70
-53
-169
-66
-51
-172
-64
-51
-175
-63
-51
-176
-62
-51
-179
-66
-52
-180
-68
-54
-178
-71
-53
-169
-66
-47
-163
-60
-41
-164
-59
-40
-169
-60
-40
-171
-58
-40
-174
-54
-38
-173
-51
-40
-182
-57
-55
-186
-57
-61
-187
-56
-62
-186
-55
-60
-190
-61
-66
-197
-74
-76
-196
-84
-83
-190
-88
-83
-153
-63
-55
-139
-52
-42
-135
-45
-37
-157
-54
-49
-195
-72
-75
-219
-80
-87
-224
-66
-81
-218
-52
-64
-221
-59
-57
-204
-47
-42
-209
-57
-52
-198
-56
-52
-197
-70
-64
-200
-93
-85
-167
-88
-75
-144
-87
-70
-119
-87
-64
-120
-100
-73
-126
-112
-83
-130
-111
-81
-133
-102
-74
-145
-99
-75
-172
-109
-91
-213
-117
-105
-234
-85
-87
-246
-70
-80
-242
-62
-74
-242
-60
-73
-249
-64
-78
-253
-67
-81
-249
-61
-76
-243
-55
-72
-253
-66
-83
-248
-60
-77
-244
-55
-75
-246
-54
-75
-248
-52
-74
-249
-50
-73
-255
-51
-78
-255
-56
-83
-255
-51
-84
-252
-53
-86
-252
-54
-87
-249
-56
-87
-247
-58
-90
-248
-61
-92
-246
-63
-94
-245
-64
-97
-247
-67
-102
-245
-67
-103
-244
-64
-101
-245
-63
-103
-247
-65
-105
-252
-67
-109
-255
-71
-115
-255
-74
-115
-255
-81
-117
-253
-84
-117
-250
-87
-118
-239
-85
-113
-228
-86
-110
-226
-99
-120
-213
-102
-118
-180
-89
-98
-124
-49
-53
-104
-48
-47
-88
-49
-42
-80
-56
-44
-71
-62
-47
-63
-64
-46
-59
-68
-47
-65
-70
-47
-81
-74
-46
-95
-84
-56
-103
-96
-67
-111
-107
-78
-124
-124
-96
-136
-142
-114
-135
-145
-118
-125
-139
-113
-122
-141
-113
-124
-143
-115
-124
-143
-115
-122
-141
-111
-122
-138
-109
-125
-140
-111
-131
-146
-117
-136
-151
-122
-149
-163
-138
-156
-169
-149
-163
-174
-157
-166
-177
-161
-172
-180
-167
-177
-185
-174
-176
-183
-176
-171
-181
-173
-161
-171
-162
-148
-160
-148
-131
-145
-130
-115
-132
-113
-104
-124
-99
-93
-116
-88
-83
-108
-78
-80
-100
-72
-80
-88
-67
-86
-87
-69
-87
-88
-72
-54
-55
-49
-54
-55
-49
-55
-56
-50
-56
-57
-51
-58
-59
-53
-60
-61
-55
-63
-62
-57
-64
-63
-58
-66
-65
-60
-66
-65
-60
-68
-65
-60
-68
-65
-60
-68
-65
-60
-69
-66
-61
-70
-65
-61
-70
-65
-61
-70
-67
-60
-70
-67
-60
-71
-66
-60
-72
-67
-61
-72
-68
-59
-72
-68
-59
-74
-67
-59
-74
-67
-57
-76
-67
-58
-75
-66
-57
-75
-65
-56
-74
-64
-54
-74
-61
-52
-73
-61
-49
-72
-60
-48
-71
-59
-47
-69
-59
-47
-69
-59
-47
-69
-59
-47
-69
-59
-49
-69
-59
-49
-69
-59
-49
-68
-59
-50
-68
-59
-50
-64
-57
-47
-64
-57
-47
-64
-57
-49
-63
-56
-48
-60
-55
-49
-59
-54
-48
-59
-54
-48
-58
-53
-47
-59
-55
-46
-59
-55
-46
-59
-55
-46
-60
-56
-45
-63
-56
-46
-65
-59
-47
-67
-59
-48
-68
-60
-47
-71
-61
-49
-71
-62
-47
-75
-63
-49
-77
-64
-48
-77
-64
-48
-78
-65
-48
-79
-63
-47
-79
-63
-48
-79
-63
-50
-78
-61
-51
-78
-61
-51
-74
-60
-49
-73
-59
-48
-71
-59
-47
-68
-58
-48
-68
-58
-48
-68
-60
-49
-68
-60
-49
-66
-59
-49
-64
-60
-49
-65
-61
-50
-65
-63
-51
-66
-63
-54
-75
-61
-52
-91
-54
-46
-116
-52
-50
-172
-77
-83
-218
-94
-105
-229
-78
-95
-226
-65
-81
-213
-55
-69
-182
-39
-43
-167
-50
-41
-156
-56
-40
-145
-58
-38
-149
-61
-41
-171
-65
-51
-193
-69
-61
-211
-63
-63
-204
-60
-59
-177
-63
-53
-168
-66
-52
-170
-64
-50
-173
-63
-50
-178
-64
-53
-184
-67
-57
-188
-72
-59
-187
-74
-60
-172
-62
-47
-170
-63
-47
-168
-61
-43
-166
-59
-41
-170
-57
-41
-176
-58
-44
-183
-59
-47
-187
-61
-49
-200
-71
-65
-204
-69
-65
-206
-64
-63
-205
-57
-57
-211
-56
-60
-220
-67
-69
-223
-77
-78
-218
-83
-79
-193
-68
-62
-195
-77
-67
-203
-84
-76
-209
-85
-77
-215
-75
-74
-218
-64
-66
-223
-53
-62
-224
-51
-55
-217
-52
-46
-215
-57
-46
-205
-51
-43
-206
-59
-52
-190
-57
-52
-178
-65
-57
-181
-91
-80
-150
-85
-67
-123
-78
-57
-130
-98
-73
-136
-106
-80
-133
-96
-70
-147
-90
-70
-176
-100
-84
-206
-112
-100
-232
-109
-104
-231
-70
-75
-237
-60
-68
-230
-59
-67
-227
-62
-68
-227
-68
-72
-227
-73
-75
-228
-74
-76
-229
-73
-77
-240
-76
-83
-239
-68
-77
-239
-58
-73
-242
-55
-72
-245
-52
-71
-248
-49
-70
-254
-52
-76
-255
-58
-82
-255
-57
-86
-253
-58
-88
-252
-59
-88
-250
-59
-90
-251
-60
-93
-252
-63
-95
-253
-65
-98
-252
-67
-101
-253
-69
-105
-251
-69
-107
-250
-68
-108
-250
-68
-109
-250
-67
-111
-249
-68
-111
-249
-68
-113
-250
-67
-111
-255
-72
-112
-255
-66
-104
-255
-74
-109
-253
-79
-112
-238
-75
-104
-230
-80
-107
-226
-93
-114
-216
-99
-115
-186
-91
-99
-140
-64
-68
-96
-38
-36
-81
-43
-34
-86
-64
-51
-86
-79
-61
-74
-76
-55
-65
-67
-45
-82
-74
-51
-101
-89
-67
-117
-106
-86
-128
-123
-103
-142
-141
-121
-153
-156
-139
-149
-156
-140
-136
-147
-131
-130
-142
-128
-137
-151
-136
-143
-155
-141
-140
-153
-136
-135
-146
-130
-138
-147
-130
-151
-158
-142
-164
-168
-153
-178
-182
-167
-184
-188
-174
-191
-193
-182
-192
-193
-185
-194
-195
-189
-197
-198
-193
-195
-195
-195
-190
-190
-190
-176
-181
-177
-162
-169
-162
-141
-151
-140
-121
-135
-118
-105
-123
-101
-92
-115
-89
-84
-109
-79
-82
-102
-74
-80
-90
-66
-84
-89
-67
-86
-91
-71
-53
-54
-48
-53
-54
-48
-54
-55
-49
-55
-56
-50
-56
-57
-51
-58
-59
-53
-61
-60
-55
-62
-61
-56
-64
-63
-58
-64
-63
-58
-67
-64
-59
-68
-65
-60
-69
-66
-61
-69
-66
-61
-71
-66
-62
-71
-66
-62
-71
-68
-61
-71
-68
-61
-72
-67
-61
-73
-68
-62
-73
-69
-60
-73
-69
-60
-75
-68
-58
-76
-69
-59
-76
-67
-58
-75
-67
-56
-76
-66
-56
-75
-65
-53
-76
-64
-52
-75
-63
-51
-74
-62
-50
-73
-61
-49
-71
-61
-49
-71
-61
-49
-70
-60
-48
-70
-60
-48
-69
-59
-49
-69
-59
-49
-68
-59
-50
-67
-58
-49
-65
-58
-48
-65
-58
-48
-64
-57
-49
-64
-57
-49
-61
-56
-50
-60
-55
-49
-59
-54
-48
-59
-54
-48
-59
-55
-46
-59
-55
-46
-59
-55
-44
-60
-56
-45
-63
-57
-45
-65
-59
-47
-68
-60
-47
-69
-61
-48
-72
-63
-48
-74
-62
-48
-76
-63
-47
-77
-64
-48
-78
-65
-48
-78
-65
-48
-79
-63
-47
-79
-63
-47
-79
-63
-50
-78
-61
-51
-77
-60
-50
-76
-59
-49
-73
-59
-48
-71
-59
-47
-70
-57
-48
-67
-57
-47
-67
-59
-48
-66
-60
-48
-66
-59
-49
-64
-60
-49
-64
-62
-50
-65
-63
-51
-66
-63
-54
-78
-59
-52
-106
-57
-52
-149
-71
-69
-195
-90
-95
-218
-88
-98
-220
-68
-81
-219
-57
-70
-209
-52
-59
-188
-44
-43
-172
-50
-39
-159
-56
-37
-150
-58
-33
-148
-58
-32
-161
-61
-38
-179
-64
-46
-193
-59
-50
-189
-56
-49
-167
-55
-44
-162
-58
-45
-165
-57
-45
-167
-55
-44
-175
-58
-49
-184
-66
-56
-186
-69
-59
-183
-69
-58
-174
-62
-50
-173
-63
-48
-167
-60
-44
-164
-54
-39
-170
-54
-41
-182
-62
-48
-195
-68
-59
-202
-71
-61
-188
-58
-45
-203
-65
-54
-221
-70
-63
-232
-68
-66
-239
-63
-65
-239
-59
-62
-231
-52
-55
-218
-48
-48
-216
-57
-53
-222
-73
-66
-229
-85
-76
-224
-80
-71
-216
-63
-57
-214
-50
-48
-224
-48
-50
-231
-55
-55
-216
-49
-40
-221
-61
-47
-202
-46
-34
-205
-56
-49
-189
-52
-44
-174
-55
-47
-200
-104
-92
-184
-108
-92
-142
-87
-67
-135
-90
-67
-132
-86
-63
-139
-81
-61
-170
-91
-76
-209
-106
-97
-226
-103
-98
-229
-83
-84
-240
-69
-75
-239
-62
-70
-226
-60
-64
-216
-62
-62
-209
-66
-62
-209
-72
-66
-219
-80
-77
-233
-87
-87
-235
-79
-82
-238
-68
-77
-239
-59
-71
-245
-54
-70
-246
-50
-70
-246
-47
-68
-249
-50
-71
-253
-55
-78
-251
-57
-83
-248
-58
-84
-248
-58
-86
-249
-59
-87
-254
-61
-92
-255
-63
-97
-255
-67
-101
-255
-68
-107
-251
-60
-101
-251
-62
-104
-250
-63
-106
-247
-64
-108
-247
-64
-110
-244
-62
-110
-241
-61
-108
-241
-60
-105
-255
-74
-114
-251
-61
-97
-251
-66
-100
-255
-78
-110
-251
-77
-110
-243
-80
-109
-236
-86
-111
-224
-91
-110
-231
-114
-130
-194
-97
-106
-150
-74
-76
-116
-58
-56
-93
-53
-45
-82
-56
-43
-82
-66
-50
-87
-76
-58
-94
-81
-65
-114
-101
-85
-136
-124
-110
-149
-141
-130
-159
-157
-145
-166
-167
-159
-161
-166
-159
-150
-156
-152
-149
-158
-155
-158
-167
-164
-166
-175
-172
-166
-172
-168
-162
-167
-163
-166
-168
-163
-181
-180
-176
-194
-193
-188
-204
-201
-192
-209
-206
-197
-213
-208
-204
-213
-208
-205
-212
-206
-206
-213
-207
-209
-209
-203
-207
-203
-198
-202
-191
-189
-192
-176
-178
-175
-152
-159
-152
-128
-140
-126
-109
-126
-107
-96
-116
-91
-87
-110
-82
-86
-106
-78
-83
-95
-71
-86
-96
-72
-87
-95
-72
-53
-54
-48
-53
-54
-48
-53
-54
-48
-53
-54
-48
-54
-55
-49
-56
-57
-51
-58
-57
-52
-59
-58
-53
-61
-60
-55
-62
-61
-56
-65
-62
-57
-67
-64
-59
-68
-65
-60
-70
-67
-62
-72
-67
-63
-72
-67
-63
-71
-68
-61
-72
-69
-62
-73
-68
-62
-73
-68
-62
-74
-70
-61
-74
-70
-61
-77
-70
-60
-77
-70
-60
-77
-69
-58
-76
-68
-57
-77
-67
-57
-77
-67
-55
-78
-66
-54
-77
-65
-51
-78
-64
-51
-77
-65
-51
-74
-65
-50
-74
-65
-50
-73
-64
-49
-72
-63
-48
-71
-61
-49
-70
-60
-48
-68
-60
-49
-68
-60
-49
-67
-58
-49
-67
-58
-49
-65
-58
-50
-64
-57
-49
-63
-56
-50
-63
-56
-50
-60
-55
-49
-60
-55
-49
-60
-56
-47
-60
-56
-45
-60
-56
-45
-60
-56
-45
-64
-58
-46
-65
-59
-47
-68
-60
-47
-69
-61
-48
-72
-63
-48
-75
-63
-49
-77
-64
-48
-78
-65
-48
-80
-64
-48
-80
-64
-48
-79
-64
-45
-79
-63
-47
-79
-61
-49
-79
-61
-49
-77
-61
-48
-76
-60
-47
-73
-59
-48
-70
-58
-46
-69
-56
-47
-67
-57
-47
-66
-58
-47
-65
-59
-47
-65
-58
-48
-63
-59
-48
-63
-61
-49
-64
-62
-50
-64
-64
-52
-78
-58
-49
-111
-50
-47
-165
-75
-75
-190
-84
-86
-186
-63
-68
-188
-49
-54
-193
-48
-51
-191
-49
-47
-183
-50
-41
-167
-50
-33
-162
-57
-35
-155
-61
-33
-150
-61
-31
-152
-61
-32
-158
-63
-35
-164
-59
-37
-162
-55
-37
-158
-54
-41
-160
-56
-45
-162
-54
-44
-165
-52
-44
-173
-56
-49
-183
-64
-58
-184
-67
-60
-178
-64
-54
-177
-66
-55
-173
-65
-52
-168
-60
-47
-166
-56
-43
-175
-58
-48
-188
-67
-56
-195
-68
-61
-196
-65
-55
-193
-64
-45
-203
-64
-45
-213
-55
-43
-221
-44
-38
-232
-36
-37
-245
-39
-43
-253
-44
-49
-252
-49
-52
-233
-44
-42
-227
-48
-43
-220
-53
-44
-217
-55
-44
-220
-53
-44
-223
-52
-44
-229
-50
-45
-228
-51
-43
-215
-52
-37
-212
-55
-38
-207
-51
-38
-206
-55
-44
-196
-55
-46
-187
-63
-55
-199
-97
-85
-210
-127
-113
-166
-101
-83
-143
-86
-66
-139
-76
-58
-164
-86
-73
-203
-100
-91
-224
-99
-95
-232
-82
-84
-233
-66
-73
-246
-69
-77
-238
-63
-68
-225
-62
-63
-213
-64
-60
-202
-63
-56
-200
-63
-55
-211
-69
-65
-229
-77
-76
-240
-74
-78
-245
-63
-75
-251
-56
-72
-255
-54
-72
-254
-53
-72
-249
-50
-69
-249
-54
-71
-250
-59
-77
-247
-58
-80
-246
-58
-82
-246
-56
-82
-249
-56
-85
-251
-56
-88
-254
-59
-93
-255
-61
-97
-255
-63
-103
-255
-64
-106
-255
-64
-108
-255
-65
-112
-255
-67
-115
-251
-68
-116
-249
-67
-116
-247
-67
-115
-244
-67
-111
-251
-73
-109
-245
-68
-97
-249
-72
-101
-252
-77
-106
-250
-77
-107
-255
-88
-116
-255
-97
-122
-242
-94
-116
-240
-107
-126
-229
-113
-126
-211
-111
-119
-175
-93
-97
-132
-67
-65
-104
-54
-47
-105
-65
-55
-115
-85
-74
-121
-101
-92
-140
-125
-118
-163
-150
-144
-173
-163
-161
-178
-174
-171
-182
-182
-182
-178
-182
-185
-170
-175
-179
-176
-183
-189
-182
-189
-197
-189
-193
-202
-192
-195
-202
-195
-194
-202
-201
-198
-205
-213
-206
-214
-221
-215
-219
-226
-218
-216
-231
-221
-219
-233
-221
-221
-230
-218
-220
-229
-216
-223
-228
-215
-224
-224
-212
-222
-217
-207
-216
-202
-197
-203
-186
-186
-186
-162
-167
-163
-136
-146
-135
-116
-130
-113
-101
-120
-98
-92
-115
-87
-91
-111
-83
-92
-106
-80
-92
-105
-79
-94
-104
-79
-53
-54
-49
-53
-54
-49
-53
-54
-49
-53
-54
-48
-53
-54
-49
-54
-55
-49
-56
-55
-50
-57
-56
-51
-60
-59
-54
-61
-60
-55
-64
-61
-56
-66
-63
-58
-68
-65
-60
-70
-67
-60
-71
-68
-61
-72
-69
-62
-72
-69
-62
-72
-69
-62
-72
-69
-60
-74
-70
-61
-74
-70
-59
-75
-71
-59
-75
-71
-59
-78
-72
-58
-77
-71
-59
-77
-71
-59
-77
-69
-58
-77
-68
-59
-77
-68
-59
-77
-68
-61
-78
-67
-63
-78
-67
-61
-77
-67
-55
-77
-68
-53
-75
-66
-51
-74
-65
-50
-72
-62
-50
-71
-61
-49
-69
-61
-50
-68
-59
-50
-67
-58
-49
-67
-58
-51
-65
-58
-50
-65
-58
-52
-64
-57
-51
-63
-55
-52
-60
-55
-51
-60
-55
-49
-62
-55
-47
-62
-55
-47
-60
-56
-47
-61
-57
-48
-62
-58
-49
-65
-58
-50
-67
-60
-50
-68
-61
-51
-72
-64
-53
-73
-63
-51
-76
-64
-50
-77
-65
-49
-78
-65
-48
-80
-64
-48
-79
-64
-45
-79
-63
-47
-76
-62
-49
-76
-62
-51
-75
-61
-50
-76
-59
-51
-74
-57
-49
-73
-56
-49
-70
-55
-48
-67
-56
-50
-65
-56
-47
-62
-58
-47
-61
-59
-47
-60
-61
-47
-63
-61
-48
-64
-62
-47
-66
-63
-48
-83
-57
-44
-134
-61
-55
-193
-93
-91
-200
-90
-89
-174
-56
-54
-170
-47
-42
-177
-50
-43
-171
-47
-37
-171
-51
-35
-170
-58
-38
-171
-67
-42
-169
-71
-44
-163
-70
-39
-160
-66
-38
-161
-66
-38
-161
-61
-35
-158
-58
-35
-160
-57
-42
-163
-59
-48
-166
-58
-48
-166
-55
-46
-173
-60
-52
-182
-67
-60
-183
-69
-59
-176
-64
-53
-171
-61
-48
-168
-60
-47
-169
-59
-46
-172
-60
-48
-187
-69
-57
-198
-76
-65
-197
-69
-60
-188
-56
-44
-188
-55
-36
-201
-60
-40
-218
-61
-46
-227
-53
-44
-238
-44
-42
-246
-42
-43
-249
-40
-43
-247
-39
-39
-246
-44
-42
-241
-48
-43
-236
-52
-44
-232
-54
-44
-227
-53
-42
-226
-52
-41
-225
-51
-40
-222
-52
-37
-222
-59
-42
-207
-50
-31
-219
-63
-48
-205
-55
-41
-199
-57
-45
-194
-63
-53
-179
-65
-54
-209
-108
-96
-191
-103
-89
-165
-82
-66
-170
-78
-65
-205
-98
-90
-232
-103
-98
-231
-81
-82
-235
-64
-70
-246
-65
-74
-237
-60
-68
-227
-58
-61
-215
-59
-60
-207
-62
-57
-195
-61
-52
-185
-54
-44
-187
-52
-46
-199
-56
-52
-229
-71
-72
-234
-63
-69
-242
-58
-68
-249
-57
-72
-252
-57
-73
-250
-55
-71
-250
-58
-73
-251
-63
-78
-252
-67
-85
-251
-65
-86
-250
-63
-84
-249
-59
-84
-251
-58
-85
-253
-58
-90
-255
-59
-94
-255
-60
-99
-255
-64
-104
-255
-63
-107
-255
-63
-110
-251
-63
-111
-247
-64
-112
-245
-65
-113
-245
-64
-115
-243
-66
-112
-244
-68
-106
-252
-79
-109
-255
-86
-115
-243
-76
-104
-231
-66
-96
-249
-86
-115
-255
-105
-133
-255
-102
-130
-246
-94
-119
-238
-96
-120
-231
-104
-123
-220
-112
-125
-199
-112
-120
-170
-102
-103
-143
-92
-88
-126
-89
-81
-153
-126
-119
-171
-152
-146
-190
-176
-173
-197
-187
-186
-198
-194
-195
-200
-199
-204
-199
-199
-207
-195
-195
-207
-203
-202
-216
-204
-202
-216
-209
-202
-218
-215
-206
-223
-221
-213
-228
-230
-219
-233
-232
-224
-235
-237
-227
-235
-239
-229
-230
-242
-232
-230
-244
-232
-232
-240
-228
-230
-238
-225
-232
-237
-224
-233
-234
-221
-231
-228
-216
-226
-209
-202
-209
-193
-191
-194
-171
-171
-169
-145
-150
-143
-122
-134
-120
-108
-123
-104
-98
-117
-95
-96
-114
-90
-100
-114
-89
-100
-112
-88
-100
-110
-86
-50
-49
-47
-51
-50
-48
-52
-51
-49
-54
-53
-49
-56
-55
-53
-57
-56
-52
-57
-56
-52
-57
-56
-52
-59
-58
-53
-60
-59
-54
-61
-61
-53
-63
-63
-55
-65
-65
-57
-67
-67
-57
-69
-69
-59
-69
-69
-59
-72
-72
-64
-72
-72
-62
-72
-72
-60
-74
-72
-59
-75
-74
-56
-76
-75
-55
-77
-76
-56
-78
-75
-56
-77
-74
-57
-74
-70
-58
-71
-68
-59
-74
-70
-67
-78
-73
-77
-78
-73
-80
-71
-68
-79
-68
-63
-69
-78
-69
-62
-76
-67
-52
-74
-64
-52
-75
-65
-53
-77
-67
-57
-76
-66
-56
-70
-61
-52
-66
-57
-48
-69
-60
-53
-67
-58
-53
-64
-57
-51
-63
-55
-52
-64
-56
-53
-63
-55
-53
-60
-55
-52
-60
-52
-50
-67
-58
-53
-66
-57
-52
-65
-57
-54
-62
-57
-53
-63
-58
-55
-62
-58
-55
-63
-59
-56
-64
-60
-57
-66
-63
-58
-68
-64
-55
-71
-64
-54
-74
-64
-52
-76
-64
-48
-79
-64
-45
-79
-64
-43
-76
-63
-44
-70
-64
-50
-69
-62
-52
-72
-59
-51
-74
-56
-52
-75
-54
-53
-77
-52
-55
-75
-55
-57
-72
-58
-58
-67
-62
-58
-55
-56
-48
-55
-59
-45
-62
-66
-49
-62
-64
-43
-58
-56
-35
-67
-59
-36
-101
-66
-46
-189
-106
-92
-183
-75
-65
-166
-55
-44
-164
-54
-41
-167
-55
-43
-164
-54
-39
-163
-56
-38
-168
-61
-43
-162
-57
-36
-165
-60
-38
-169
-64
-42
-171
-65
-41
-172
-61
-41
-172
-57
-38
-174
-54
-37
-170
-55
-37
-164
-54
-39
-161
-55
-41
-162
-56
-42
-166
-60
-46
-170
-64
-50
-172
-66
-52
-172
-66
-50
-172
-65
-49
-169
-62
-44
-171
-61
-44
-173
-60
-44
-179
-61
-47
-189
-67
-52
-196
-70
-56
-192
-62
-49
-184
-50
-38
-199
-57
-43
-203
-57
-42
-207
-57
-43
-213
-57
-45
-219
-55
-45
-225
-54
-46
-231
-52
-47
-237
-50
-45
-240
-46
-44
-242
-47
-45
-242
-49
-44
-239
-50
-44
-234
-53
-42
-227
-55
-41
-221
-58
-41
-218
-59
-40
-219
-58
-38
-212
-51
-31
-207
-52
-32
-206
-56
-39
-197
-56
-39
-190
-54
-40
-194
-66
-53
-207
-83
-73
-200
-78
-67
-207
-83
-75
-225
-92
-87
-238
-93
-90
-240
-80
-82
-237
-62
-67
-243
-56
-63
-248
-63
-71
-235
-64
-70
-225
-67
-68
-214
-64
-65
-201
-62
-57
-187
-60
-51
-179
-58
-47
-177
-59
-47
-180
-59
-48
-202
-76
-64
-212
-75
-67
-222
-70
-67
-226
-62
-63
-235
-60
-65
-248
-63
-71
-254
-62
-73
-249
-59
-71
-253
-69
-81
-250
-68
-81
-253
-68
-82
-255
-68
-85
-253
-64
-86
-250
-60
-85
-254
-61
-90
-255
-66
-100
-255
-70
-107
-255
-65
-106
-249
-59
-103
-245
-58
-103
-244
-61
-109
-248
-68
-115
-253
-73
-121
-255
-75
-122
-255
-78
-121
-255
-78
-117
-249
-81
-116
-239
-82
-113
-229
-79
-106
-229
-79
-106
-247
-90
-119
-255
-103
-135
-255
-93
-128
-240
-69
-105
-245
-86
-118
-232
-94
-120
-198
-91
-109
-194
-117
-125
-140
-92
-92
-145
-114
-109
-171
-143
-132
-189
-167
-156
-212
-195
-187
-222
-213
-208
-221
-220
-218
-220
-219
-224
-222
-220
-231
-226
-219
-235
-231
-216
-237
-235
-216
-238
-241
-217
-241
-244
-220
-242
-245
-227
-243
-245
-231
-244
-243
-236
-244
-244
-239
-243
-248
-243
-240
-248
-243
-239
-248
-240
-238
-245
-236
-237
-242
-231
-235
-237
-226
-232
-232
-221
-227
-229
-220
-225
-214
-208
-212
-205
-201
-202
-187
-186
-184
-163
-165
-160
-139
-144
-137
-121
-131
-120
-114
-125
-111
-112
-123
-107
-123
-132
-115
-119
-128
-109
-118
-125
-107
-48
-46
-47
-49
-47
-48
-51
-50
-48
-53
-52
-50
-54
-53
-51
-55
-54
-50
-56
-55
-51
-56
-55
-50
-58
-57
-52
-59
-58
-53
-61
-61
-53
-63
-63
-55
-65
-65
-55
-67
-67
-57
-68
-68
-56
-69
-69
-59
-72
-72
-62
-72
-72
-62
-72
-72
-60
-74
-72
-57
-75
-74
-54
-76
-75
-54
-77
-77
-53
-78
-77
-56
-75
-74
-56
-75
-73
-61
-75
-74
-69
-80
-80
-82
-87
-85
-96
-89
-88
-106
-86
-84
-106
-82
-79
-96
-79
-73
-75
-77
-68
-63
-72
-63
-58
-70
-61
-56
-71
-62
-57
-72
-63
-58
-70
-61
-56
-66
-59
-53
-68
-58
-56
-65
-57
-54
-63
-55
-52
-63
-55
-52
-64
-56
-53
-64
-56
-53
-61
-56
-53
-59
-54
-50
-61
-52
-47
-61
-52
-47
-61
-53
-50
-60
-55
-52
-61
-57
-54
-62
-58
-57
-61
-60
-58
-62
-61
-57
-66
-63
-58
-68
-63
-57
-71
-64
-54
-74
-64
-52
-77
-64
-48
-79
-64
-45
-80
-63
-43
-76
-63
-44
-65
-64
-46
-63
-64
-50
-69
-60
-53
-72
-57
-54
-74
-54
-55
-74
-52
-55
-70
-51
-55
-67
-52
-55
-65
-60
-57
-60
-59
-54
-61
-61
-49
-69
-63
-49
-74
-58
-42
-80
-54
-37
-100
-65
-46
-133
-74
-58
-176
-80
-66
-171
-59
-45
-160
-50
-35
-161
-54
-38
-163
-58
-39
-158
-55
-36
-158
-57
-37
-163
-62
-42
-161
-59
-37
-167
-60
-40
-174
-63
-43
-179
-64
-45
-182
-61
-44
-183
-57
-42
-184
-54
-40
-181
-55
-41
-170
-57
-41
-165
-58
-42
-164
-57
-41
-165
-59
-43
-168
-62
-46
-171
-65
-49
-171
-66
-47
-171
-64
-46
-174
-63
-44
-171
-58
-40
-177
-60
-43
-191
-69
-54
-198
-72
-57
-193
-63
-49
-188
-56
-43
-192
-54
-41
-203
-55
-43
-207
-55
-44
-208
-57
-46
-209
-59
-45
-212
-60
-47
-216
-58
-46
-224
-56
-47
-231
-52
-45
-238
-49
-45
-244
-46
-43
-244
-46
-43
-241
-48
-43
-234
-52
-41
-225
-55
-40
-215
-58
-39
-213
-58
-36
-222
-60
-39
-217
-54
-35
-213
-56
-37
-212
-61
-42
-204
-59
-42
-193
-53
-38
-196
-58
-47
-207
-70
-60
-209
-70
-63
-218
-73
-68
-233
-79
-77
-243
-80
-81
-244
-71
-73
-240
-59
-64
-245
-58
-65
-248
-67
-72
-229
-66
-69
-218
-68
-67
-210
-66
-65
-197
-62
-56
-183
-59
-49
-174
-58
-45
-170
-60
-45
-171
-61
-46
-182
-69
-53
-198
-76
-63
-212
-78
-69
-220
-71
-67
-227
-63
-62
-239
-63
-66
-250
-63
-70
-254
-64
-74
-248
-67
-74
-247
-67
-76
-250
-68
-80
-255
-70
-84
-253
-66
-83
-249
-62
-83
-252
-62
-88
-255
-66
-97
-255
-70
-104
-255
-67
-105
-252
-63
-105
-249
-64
-106
-249
-66
-112
-252
-70
-118
-254
-74
-122
-255
-75
-123
-255
-72
-120
-255
-71
-115
-244
-74
-111
-242
-82
-116
-243
-93
-122
-246
-96
-123
-247
-88
-118
-247
-79
-112
-250
-70
-107
-248
-68
-107
-238
-68
-104
-220
-73
-102
-203
-92
-111
-182
-106
-116
-115
-71
-72
-150
-121
-115
-180
-148
-137
-206
-176
-165
-229
-209
-200
-239
-226
-220
-235
-231
-230
-233
-232
-237
-236
-230
-242
-237
-226
-243
-246
-227
-249
-251
-225
-250
-255
-227
-253
-255
-230
-253
-255
-236
-254
-255
-242
-253
-254
-247
-254
-252
-250
-251
-253
-249
-246
-252
-249
-244
-251
-246
-243
-249
-244
-241
-247
-238
-239
-243
-234
-237
-240
-231
-236
-238
-229
-234
-230
-221
-224
-220
-214
-216
-202
-198
-197
-179
-178
-174
-158
-161
-154
-142
-147
-140
-137
-143
-133
-136
-144
-131
-142
-148
-134
-137
-144
-128
-134
-140
-126
-47
-46
-44
-48
-47
-45
-49
-48
-46
-50
-49
-47
-52
-51
-47
-53
-52
-48
-55
-54
-50
-55
-54
-49
-58
-57
-52
-58
-58
-50
-60
-60
-52
-62
-62
-54
-64
-64
-54
-66
-66
-56
-67
-67
-57
-68
-68
-58
-73
-70
-61
-73
-71
-59
-74
-72
-59
-76
-73
-56
-77
-74
-55
-78
-76
-55
-78
-76
-55
-79
-76
-57
-75
-73
-58
-78
-75
-66
-84
-82
-83
-95
-94
-102
-105
-104
-120
-109
-109
-133
-108
-107
-138
-107
-104
-131
-96
-89
-105
-89
-81
-92
-79
-71
-82
-72
-64
-75
-72
-62
-71
-71
-61
-69
-69
-60
-65
-64
-58
-60
-67
-58
-59
-63
-58
-55
-60
-55
-52
-60
-55
-51
-61
-56
-50
-62
-57
-51
-62
-58
-49
-61
-57
-48
-56
-51
-45
-57
-52
-46
-59
-54
-48
-60
-57
-50
-61
-58
-51
-62
-59
-52
-63
-60
-53
-64
-60
-51
-69
-62
-52
-71
-63
-52
-73
-63
-51
-76
-64
-48
-79
-63
-48
-80
-63
-47
-80
-63
-45
-76
-63
-44
-60
-59
-39
-58
-61
-42
-62
-60
-47
-65
-58
-48
-66
-55
-51
-67
-53
-52
-63
-52
-50
-60
-50
-49
-63
-55
-52
-68
-57
-53
-75
-56
-50
-82
-49
-44
-92
-43
-39
-111
-46
-44
-139
-58
-57
-164
-69
-67
-165
-58
-48
-162
-50
-36
-159
-49
-32
-164
-57
-39
-165
-60
-41
-158
-55
-36
-158
-56
-34
-162
-60
-38
-164
-59
-38
-170
-61
-41
-177
-65
-45
-182
-65
-47
-185
-62
-46
-187
-60
-45
-190
-58
-45
-190
-60
-47
-178
-60
-46
-172
-60
-46
-169
-57
-43
-169
-57
-43
-171
-60
-43
-173
-62
-45
-173
-62
-45
-173
-60
-44
-178
-63
-45
-176
-56
-40
-185
-62
-46
-203
-76
-61
-203
-71
-58
-188
-54
-42
-186
-50
-38
-201
-57
-46
-208
-54
-44
-212
-54
-43
-212
-56
-44
-214
-58
-46
-216
-58
-47
-220
-56
-46
-227
-54
-47
-232
-51
-44
-240
-48
-45
-244
-46
-43
-244
-46
-43
-240
-49
-41
-231
-50
-39
-221
-54
-38
-212
-56
-34
-210
-55
-33
-221
-56
-36
-220
-53
-35
-218
-57
-39
-218
-62
-47
-211
-61
-46
-200
-54
-41
-197
-57
-44
-203
-65
-55
-201
-60
-53
-205
-62
-56
-217
-69
-65
-229
-75
-73
-234
-74
-74
-233
-67
-67
-236
-63
-65
-235
-67
-67
-222
-67
-65
-213
-68
-63
-205
-66
-61
-194
-61
-52
-182
-58
-46
-174
-56
-42
-171
-58
-42
-172
-59
-43
-172
-56
-41
-192
-68
-56
-212
-78
-69
-221
-73
-69
-224
-64
-64
-232
-62
-65
-247
-66
-73
-255
-72
-80
-244
-65
-71
-244
-64
-73
-249
-67
-79
-253
-71
-84
-254
-69
-85
-250
-64
-85
-251
-63
-88
-254
-65
-95
-255
-68
-102
-255
-67
-105
-255
-67
-107
-255
-70
-112
-255
-73
-119
-255
-75
-123
-255
-76
-124
-255
-74
-122
-255
-66
-116
-255
-68
-116
-254
-72
-113
-250
-78
-116
-252
-91
-124
-255
-98
-128
-250
-87
-118
-236
-69
-99
-248
-77
-109
-254
-86
-119
-218
-64
-92
-203
-71
-94
-218
-121
-132
-187
-121
-123
-103
-64
-59
-151
-123
-112
-178
-140
-129
-215
-177
-166
-245
-216
-208
-253
-234
-228
-250
-240
-239
-250
-245
-249
-249
-243
-253
-244
-236
-251
-251
-233
-255
-255
-233
-255
-255
-234
-255
-255
-237
-255
-255
-242
-255
-255
-246
-255
-255
-251
-255
-255
-254
-252
-255
-253
-250
-255
-252
-248
-255
-249
-247
-255
-247
-245
-254
-244
-245
-252
-242
-243
-250
-239
-243
-248
-239
-242
-240
-231
-234
-229
-223
-225
-211
-207
-206
-190
-189
-185
-173
-174
-168
-162
-165
-158
-157
-163
-153
-157
-163
-151
-163
-171
-158
-157
-165
-150
-153
-161
-148
-47
-46
-44
-47
-46
-44
-48
-47
-45
-49
-48
-44
-50
-49
-45
-51
-50
-46
-53
-52
-47
-54
-53
-48
-56
-56
-48
-57
-57
-49
-59
-59
-51
-61
-61
-53
-63
-63
-53
-65
-65
-55
-66
-66
-56
-67
-67
-57
-72
-69
-60
-74
-70
-59
-75
-72
-57
-77
-74
-57
-80
-75
-56
-79
-77
-56
-81
-76
-56
-79
-76
-59
-76
-74
-62
-81
-80
-76
-94
-93
-98
-109
-108
-122
-122
-122
-146
-129
-130
-161
-128
-130
-168
-128
-128
-166
-123
-117
-151
-114
-107
-138
-101
-95
-123
-89
-83
-109
-84
-76
-100
-77
-69
-90
-71
-64
-80
-66
-60
-72
-68
-63
-70
-64
-59
-63
-60
-56
-55
-59
-54
-51
-59
-54
-48
-60
-56
-47
-61
-57
-46
-59
-56
-47
-58
-55
-48
-57
-57
-49
-59
-59
-51
-62
-59
-50
-63
-61
-49
-64
-60
-49
-63
-59
-47
-65
-59
-45
-70
-63
-47
-72
-63
-46
-75
-63
-47
-77
-64
-47
-79
-63
-48
-79
-63
-47
-80
-62
-48
-76
-63
-47
-66
-61
-42
-63
-62
-44
-64
-61
-46
-65
-58
-48
-65
-58
-50
-64
-57
-51
-62
-57
-53
-60
-57
-52
-61
-56
-52
-70
-56
-53
-80
-52
-49
-88
-44
-43
-107
-41
-43
-135
-48
-54
-161
-55
-65
-174
-61
-65
-167
-54
-46
-165
-55
-40
-165
-58
-40
-170
-63
-45
-168
-63
-44
-160
-57
-38
-161
-56
-35
-164
-59
-38
-165
-58
-38
-171
-60
-41
-179
-62
-44
-185
-64
-47
-189
-62
-47
-193
-61
-48
-197
-61
-49
-196
-62
-50
-189
-63
-51
-182
-61
-50
-178
-57
-46
-174
-56
-42
-175
-57
-43
-176
-58
-44
-178
-58
-44
-179
-57
-42
-182
-59
-44
-185
-59
-45
-196
-66
-52
-203
-69
-57
-200
-62
-51
-190
-49
-39
-192
-50
-40
-205
-57
-47
-214
-53
-43
-216
-52
-42
-218
-54
-45
-219
-55
-45
-222
-55
-46
-225
-54
-44
-230
-51
-44
-236
-49
-42
-243
-48
-44
-244
-46
-43
-244
-47
-41
-239
-48
-40
-228
-50
-38
-219
-52
-36
-210
-54
-32
-208
-53
-31
-215
-50
-30
-218
-48
-31
-218
-52
-36
-220
-60
-46
-214
-61
-47
-208
-57
-46
-205
-61
-50
-210
-68
-58
-196
-53
-45
-197
-54
-48
-202
-59
-53
-216
-68
-64
-226
-77
-73
-229
-75
-73
-222
-67
-63
-214
-61
-56
-211
-64
-57
-206
-65
-56
-199
-62
-52
-190
-60
-47
-181
-58
-43
-176
-56
-42
-175
-57
-43
-177
-59
-45
-172
-52
-38
-189
-63
-51
-209
-72
-64
-217
-72
-67
-221
-66
-64
-229
-64
-68
-243
-70
-76
-253
-78
-85
-240
-63
-69
-240
-63
-69
-246
-66
-77
-254
-72
-85
-254
-72
-87
-252
-66
-87
-250
-64
-88
-252
-65
-94
-255
-65
-99
-255
-67
-102
-255
-70
-109
-255
-73
-114
-255
-77
-121
-255
-79
-124
-255
-76
-123
-255
-72
-121
-255
-63
-113
-255
-74
-122
-255
-79
-122
-252
-73
-112
-246
-77
-110
-252
-87
-117
-252
-87
-117
-243
-79
-106
-239
-75
-102
-236
-78
-103
-206
-62
-85
-220
-98
-113
-251
-156
-164
-211
-141
-141
-104
-57
-51
-113
-75
-64
-166
-119
-109
-210
-163
-155
-247
-210
-202
-255
-231
-226
-255
-242
-241
-255
-251
-254
-255
-250
-255
-249
-241
-254
-250
-237
-255
-252
-237
-255
-255
-237
-255
-255
-240
-255
-255
-242
-253
-255
-246
-254
-254
-250
-251
-255
-251
-250
-255
-252
-249
-255
-251
-247
-255
-249
-247
-255
-248
-246
-255
-245
-246
-254
-244
-245
-254
-243
-247
-253
-242
-246
-246
-235
-239
-236
-227
-228
-218
-213
-210
-201
-198
-193
-186
-185
-180
-179
-180
-172
-177
-180
-169
-176
-182
-170
-183
-191
-180
-175
-183
-172
-169
-177
-166
-49
-48
-44
-49
-48
-44
-48
-47
-43
-48
-47
-43
-49
-48
-44
-50
-49
-44
-52
-51
-46
-53
-52
-47
-55
-55
-47
-56
-56
-48
-57
-57
-49
-59
-59
-51
-61
-61
-51
-63
-63
-53
-65
-65
-55
-68
-65
-56
-73
-69
-58
-76
-70
-58
-78
-72
-58
-80
-74
-58
-82
-75
-57
-82
-77
-58
-83
-76
-58
-81
-75
-61
-79
-74
-68
-86
-84
-85
-102
-100
-113
-119
-120
-141
-134
-134
-168
-141
-144
-185
-143
-147
-195
-143
-144
-198
-142
-139
-192
-135
-131
-182
-123
-119
-169
-112
-109
-154
-105
-100
-141
-95
-91
-126
-85
-80
-110
-78
-74
-97
-75
-71
-88
-69
-66
-77
-63
-61
-66
-59
-55
-56
-57
-53
-50
-57
-54
-47
-56
-53
-44
-56
-53
-44
-54
-55
-49
-55
-56
-51
-56
-57
-49
-59
-59
-49
-62
-60
-47
-63
-60
-43
-66
-61
-42
-67
-60
-41
-71
-63
-44
-74
-63
-43
-75
-64
-44
-76
-65
-47
-77
-64
-48
-77
-63
-50
-76
-64
-52
-76
-62
-51
-77
-63
-52
-76
-62
-53
-73
-58
-51
-67
-56
-50
-63
-56
-50
-60
-57
-52
-56
-59
-52
-55
-60
-53
-57
-60
-51
-64
-57
-49
-72
-51
-46
-90
-49
-47
-119
-55
-56
-149
-62
-68
-167
-61
-71
-169
-56
-60
-170
-59
-48
-170
-60
-43
-171
-64
-46
-172
-65
-47
-169
-64
-45
-165
-60
-41
-166
-59
-39
-171
-62
-42
-167
-56
-36
-173
-58
-39
-181
-60
-43
-188
-61
-46
-193
-60
-45
-197
-59
-46
-202
-60
-48
-202
-61
-51
-197
-63
-54
-190
-62
-51
-186
-58
-47
-183
-55
-44
-183
-55
-44
-184
-56
-43
-186
-56
-43
-186
-56
-43
-187
-55
-43
-199
-65
-53
-205
-67
-56
-197
-56
-46
-193
-49
-38
-198
-51
-41
-203
-55
-45
-207
-53
-43
-219
-52
-43
-223
-51
-41
-225
-52
-45
-226
-54
-44
-227
-53
-44
-231
-53
-43
-236
-49
-42
-240
-47
-42
-245
-47
-44
-246
-47
-42
-242
-47
-41
-236
-48
-39
-226
-50
-35
-217
-52
-33
-208
-53
-31
-207
-52
-30
-214
-49
-30
-217
-47
-30
-216
-50
-34
-216
-54
-41
-215
-57
-45
-212
-58
-48
-214
-63
-54
-216
-69
-61
-214
-70
-62
-205
-64
-55
-201
-60
-53
-203
-64
-57
-214
-75
-68
-217
-78
-71
-210
-69
-62
-197
-59
-49
-197
-61
-49
-194
-60
-48
-192
-60
-47
-186
-59
-44
-183
-57
-42
-180
-58
-43
-182
-60
-45
-185
-63
-48
-181
-57
-45
-191
-60
-50
-201
-64
-58
-210
-67
-63
-219
-67
-66
-227
-68
-72
-237
-74
-79
-246
-79
-86
-236
-63
-69
-237
-62
-67
-242
-66
-76
-251
-73
-85
-255
-74
-89
-253
-70
-88
-250
-67
-89
-251
-67
-93
-251
-64
-95
-251
-66
-100
-255
-69
-108
-255
-74
-115
-255
-78
-122
-255
-79
-124
-255
-76
-121
-255
-72
-118
-255
-68
-114
-255
-78
-124
-255
-80
-122
-251
-72
-111
-245
-74
-108
-253
-86
-116
-254
-87
-115
-243
-81
-105
-231
-71
-95
-224
-72
-93
-226
-88
-104
-255
-147
-158
-255
-178
-184
-239
-155
-155
-140
-72
-69
-108
-47
-42
-166
-106
-98
-206
-149
-142
-243
-198
-192
-255
-225
-220
-255
-240
-239
-255
-251
-253
-255
-253
-255
-251
-246
-253
-252
-246
-255
-253
-245
-255
-255
-245
-255
-255
-246
-255
-255
-248
-255
-255
-250
-254
-255
-252
-251
-255
-252
-249
-255
-251
-247
-255
-250
-247
-255
-248
-247
-255
-247
-246
-255
-245
-247
-255
-244
-246
-255
-243
-247
-255
-243
-247
-253
-241
-243
-243
-233
-234
-228
-220
-218
-214
-209
-205
-205
-202
-195
-201
-201
-191
-202
-202
-192
-202
-205
-194
-201
-208
-200
-190
-200
-191
-182
-192
-183
-54
-53
-49
-52
-51
-46
-51
-50
-46
-49
-48
-43
-49
-48
-43
-50
-49
-44
-51
-50
-45
-52
-51
-46
-54
-54
-46
-55
-55
-47
-56
-56
-48
-58
-58
-50
-60
-60
-50
-62
-62
-52
-64
-64
-54
-66
-64
-52
-74
-68
-56
-77
-69
-56
-79
-72
-56
-82
-75
-59
-84
-75
-58
-84
-77
-59
-83
-76
-60
-82
-75
-65
-81
-76
-73
-90
-87
-94
-108
-105
-124
-127
-126
-157
-140
-143
-184
-150
-153
-204
-153
-158
-216
-154
-158
-222
-153
-152
-218
-148
-145
-212
-140
-138
-201
-134
-133
-191
-129
-126
-181
-120
-118
-167
-110
-107
-150
-102
-101
-135
-93
-90
-119
-86
-84
-105
-77
-75
-89
-68
-65
-74
-62
-60
-63
-59
-58
-56
-59
-55
-52
-55
-54
-50
-53
-53
-53
-52
-53
-55
-54
-54
-52
-56
-55
-50
-60
-58
-46
-63
-60
-43
-67
-62
-42
-70
-64
-42
-71
-63
-42
-72
-64
-43
-73
-65
-44
-73
-66
-48
-73
-65
-52
-72
-66
-54
-72
-65
-57
-72
-63
-58
-76
-61
-58
-76
-58
-58
-71
-55
-55
-64
-54
-53
-58
-54
-53
-53
-55
-52
-49
-56
-49
-47
-57
-48
-55
-60
-53
-55
-52
-43
-67
-48
-41
-93
-56
-50
-126
-66
-65
-149
-71
-71
-157
-63
-64
-158
-52
-52
-167
-59
-47
-170
-60
-43
-170
-63
-45
-170
-63
-45
-169
-62
-44
-169
-62
-42
-172
-63
-43
-176
-63
-45
-171
-56
-37
-178
-57
-40
-185
-58
-43
-191
-57
-45
-195
-57
-44
-200
-58
-46
-205
-58
-48
-207
-60
-52
-203
-62
-53
-198
-59
-52
-194
-57
-49
-193
-56
-46
-193
-56
-46
-194
-57
-47
-194
-56
-46
-195
-54
-44
-197
-55
-45
-209
-67
-57
-208
-64
-55
-195
-48
-38
-195
-44
-35
-208
-55
-47
-214
-60
-52
-211
-50
-42
-224
-51
-44
-228
-50
-40
-231
-50
-43
-232
-51
-42
-234
-51
-43
-237
-50
-43
-240
-47
-42
-243
-45
-42
-246
-47
-42
-245
-46
-41
-241
-48
-41
-236
-49
-40
-225
-52
-36
-218
-53
-34
-209
-54
-32
-208
-53
-31
-216
-55
-35
-217
-51
-35
-214
-51
-36
-213
-51
-38
-213
-53
-41
-212
-56
-44
-212
-60
-49
-214
-63
-54
-236
-89
-81
-225
-82
-74
-211
-72
-65
-204
-67
-59
-202
-69
-60
-204
-73
-63
-200
-69
-59
-192
-62
-49
-188
-58
-42
-188
-59
-40
-188
-58
-42
-185
-58
-41
-183
-58
-40
-184
-58
-43
-188
-62
-48
-191
-65
-51
-193
-65
-54
-193
-60
-51
-197
-60
-54
-207
-65
-61
-215
-69
-69
-221
-71
-72
-228
-73
-77
-235
-76
-80
-232
-66
-70
-234
-64
-67
-240
-67
-73
-249
-75
-84
-254
-78
-89
-252
-74
-90
-252
-70
-92
-252
-70
-95
-248
-65
-95
-249
-66
-97
-253
-69
-105
-255
-74
-112
-255
-78
-119
-255
-79
-122
-255
-78
-120
-255
-76
-118
-254
-77
-119
-255
-79
-118
-252
-77
-116
-250
-79
-115
-255
-87
-121
-255
-95
-123
-252
-85
-111
-233
-71
-94
-243
-86
-107
-231
-83
-99
-240
-100
-113
-255
-144
-154
-254
-137
-145
-236
-130
-134
-194
-95
-98
-165
-77
-76
-179
-104
-101
-206
-141
-137
-240
-187
-183
-255
-219
-215
-255
-238
-237
-255
-247
-247
-255
-250
-253
-251
-249
-254
-253
-250
-255
-252
-251
-255
-253
-250
-255
-255
-250
-255
-255
-250
-254
-255
-251
-252
-253
-252
-250
-255
-251
-248
-255
-251
-247
-255
-251
-248
-255
-250
-249
-255
-250
-249
-255
-247
-249
-255
-245
-247
-254
-242
-246
-252
-240
-242
-249
-237
-239
-242
-230
-230
-231
-221
-219
-223
-216
-210
-219
-215
-206
-221
-219
-207
-224
-222
-210
-223
-225
-214
-221
-228
-220
-207
-216
-211
-197
-206
-201
-60
-57
-52
-59
-56
-49
-56
-53
-48
-53
-50
-43
-52
-49
-42
-52
-49
-42
-53
-50
-43
-54
-51
-44
-55
-52
-45
-56
-53
-46
-57
-54
-47
-59
-56
-49
-61
-58
-49
-63
-60
-51
-65
-62
-53
-67
-63
-52
-74
-66
-55
-77
-67
-55
-80
-71
-56
-83
-74
-59
-87
-75
-59
-85
-76
-61
-85
-75
-63
-83
-74
-67
-83
-74
-75
-93
-87
-99
-110
-108
-130
-130
-130
-166
-145
-149
-197
-154
-160
-218
-159
-166
-234
-162
-169
-241
-161
-165
-239
-158
-160
-235
-153
-155
-229
-149
-152
-221
-148
-149
-214
-144
-145
-202
-137
-137
-189
-130
-131
-177
-122
-121
-161
-114
-113
-145
-102
-99
-126
-88
-86
-107
-80
-78
-92
-73
-71
-82
-70
-67
-76
-67
-66
-74
-63
-63
-75
-61
-61
-71
-59
-58
-64
-59
-57
-58
-60
-57
-52
-63
-59
-47
-67
-61
-45
-69
-64
-44
-70
-64
-42
-70
-65
-43
-69
-66
-47
-69
-67
-52
-67
-67
-55
-66
-67
-59
-65
-67
-62
-65
-65
-65
-69
-59
-67
-71
-61
-70
-71
-64
-72
-71
-68
-75
-70
-71
-76
-67
-72
-75
-63
-72
-71
-62
-71
-66
-67
-72
-65
-65
-61
-52
-75
-58
-48
-102
-70
-59
-128
-80
-70
-138
-74
-64
-140
-63
-53
-146
-56
-45
-164
-62
-47
-169
-62
-44
-171
-62
-42
-172
-63
-43
-173
-64
-44
-175
-64
-45
-176
-63
-45
-177
-60
-42
-177
-56
-39
-182
-56
-41
-189
-57
-42
-195
-57
-44
-200
-56
-45
-204
-56
-46
-210
-57
-49
-212
-59
-53
-207
-58
-52
-205
-58
-51
-203
-56
-49
-203
-56
-49
-204
-57
-50
-205
-58
-50
-204
-55
-48
-203
-54
-47
-211
-60
-53
-213
-62
-53
-210
-57
-49
-204
-50
-40
-206
-52
-42
-216
-59
-50
-218
-60
-51
-215
-51
-42
-228
-49
-42
-233
-49
-39
-236
-49
-42
-238
-50
-41
-240
-49
-41
-242
-47
-41
-244
-45
-40
-246
-44
-40
-247
-45
-41
-244
-47
-41
-240
-49
-41
-233
-51
-40
-226
-53
-39
-217
-54
-37
-210
-55
-33
-207
-55
-32
-212
-57
-37
-213
-56
-37
-211
-54
-37
-209
-52
-37
-210
-52
-40
-211
-55
-43
-210
-56
-46
-208
-55
-47
-227
-78
-71
-232
-88
-80
-231
-90
-83
-218
-81
-73
-204
-71
-62
-196
-68
-57
-191
-64
-55
-185
-62
-47
-185
-60
-42
-185
-60
-38
-185
-60
-40
-185
-58
-39
-184
-57
-40
-186
-59
-42
-192
-62
-48
-195
-65
-52
-201
-68
-59
-198
-64
-55
-201
-64
-58
-209
-70
-67
-213
-73
-72
-214
-72
-71
-216
-71
-74
-223
-73
-75
-230
-70
-72
-232
-66
-68
-237
-68
-73
-245
-76
-83
-252
-81
-90
-251
-79
-93
-251
-76
-93
-251
-75
-96
-246
-68
-94
-247
-68
-97
-249
-70
-102
-253
-73
-108
-255
-78
-117
-255
-79
-120
-255
-79
-120
-255
-80
-119
-246
-85
-119
-242
-84
-117
-244
-84
-118
-250
-89
-120
-255
-93
-123
-255
-92
-119
-247
-83
-107
-236
-74
-95
-246
-89
-106
-239
-87
-102
-227
-79
-93
-239
-94
-107
-218
-78
-89
-223
-86
-96
-222
-86
-96
-210
-89
-96
-191
-99
-100
-199
-128
-124
-230
-169
-166
-255
-208
-207
-255
-233
-231
-255
-241
-240
-255
-246
-247
-254
-252
-253
-251
-252
-255
-249
-253
-255
-248
-252
-255
-250
-251
-253
-250
-250
-252
-249
-249
-249
-250
-249
-247
-252
-248
-245
-255
-250
-246
-255
-250
-247
-255
-251
-250
-255
-250
-249
-255
-247
-247
-254
-242
-242
-252
-237
-240
-249
-234
-237
-240
-225
-228
-233
-221
-221
-228
-217
-213
-226
-217
-210
-230
-223
-213
-235
-231
-219
-241
-237
-225
-241
-241
-229
-236
-243
-236
-220
-231
-227
-208
-219
-215
-64
-61
-54
-61
-58
-51
-58
-55
-48
-55
-52
-45
-53
-50
-43
-53
-50
-43
-53
-50
-43
-54
-51
-44
-55
-52
-45
-55
-52
-45
-57
-54
-47
-59
-56
-49
-61
-58
-49
-63
-60
-51
-64
-61
-52
-66
-62
-51
-74
-66
-55
-77
-67
-55
-82
-70
-56
-86
-74
-58
-87
-75
-59
-88
-76
-60
-87
-75
-63
-84
-73
-67
-83
-74
-77
-94
-88
-102
-112
-109
-136
-130
-132
-171
-145
-151
-203
-156
-164
-227
-163
-173
-245
-167
-176
-253
-170
-177
-255
-166
-172
-250
-161
-167
-243
-160
-164
-238
-159
-163
-234
-157
-161
-225
-153
-155
-214
-149
-150
-204
-146
-146
-196
-137
-136
-180
-121
-121
-159
-106
-105
-139
-96
-93
-124
-88
-85
-112
-82
-80
-104
-79
-77
-101
-78
-74
-99
-75
-71
-94
-70
-66
-83
-64
-61
-72
-63
-58
-62
-63
-58
-54
-64
-60
-49
-65
-62
-47
-67
-64
-47
-67
-66
-48
-66
-67
-51
-66
-68
-55
-63
-68
-61
-62
-68
-64
-60
-69
-68
-59
-66
-72
-65
-67
-82
-71
-72
-92
-80
-81
-99
-89
-91
-106
-95
-97
-110
-99
-99
-109
-99
-98
-104
-101
-95
-97
-102
-88
-87
-95
-74
-69
-106
-72
-63
-130
-83
-73
-146
-88
-76
-143
-76
-60
-142
-65
-49
-150
-63
-46
-167
-66
-48
-174
-64
-47
-174
-65
-45
-175
-64
-45
-176
-65
-46
-180
-65
-47
-178
-61
-43
-176
-55
-38
-181
-55
-40
-188
-56
-43
-194
-56
-43
-200
-56
-45
-205
-54
-45
-209
-55
-47
-213
-56
-49
-216
-59
-52
-210
-55
-50
-208
-55
-50
-208
-55
-50
-209
-56
-50
-212
-57
-52
-212
-57
-52
-211
-56
-51
-211
-54
-47
-222
-65
-58
-213
-56
-47
-209
-51
-42
-214
-56
-47
-222
-61
-53
-222
-61
-53
-218
-57
-49
-220
-53
-44
-231
-50
-41
-235
-48
-39
-239
-48
-40
-241
-48
-41
-244
-47
-41
-247
-45
-41
-247
-44
-40
-247
-44
-40
-247
-45
-41
-244
-47
-41
-238
-50
-41
-233
-52
-41
-225
-53
-39
-218
-55
-38
-212
-55
-36
-207
-56
-35
-206
-55
-34
-207
-56
-37
-206
-55
-36
-207
-54
-38
-208
-55
-41
-210
-57
-43
-209
-55
-43
-206
-52
-42
-203
-52
-43
-227
-78
-71
-243
-100
-92
-235
-96
-89
-213
-79
-70
-196
-65
-55
-186
-59
-50
-181
-57
-45
-184
-62
-41
-184
-62
-39
-185
-60
-38
-185
-59
-37
-186
-57
-38
-189
-57
-42
-192
-60
-47
-196
-62
-50
-202
-68
-57
-202
-65
-57
-206
-69
-63
-213
-75
-72
-211
-76
-73
-206
-71
-68
-205
-69
-69
-214
-72
-71
-227
-73
-73
-230
-67
-68
-232
-69
-72
-242
-77
-83
-248
-83
-90
-249
-82
-92
-247
-79
-94
-250
-79
-97
-244
-72
-94
-245
-71
-96
-248
-71
-100
-251
-73
-105
-255
-78
-114
-255
-81
-120
-255
-82
-121
-255
-84
-122
-239
-84
-116
-239
-90
-119
-249
-96
-126
-253
-96
-125
-249
-86
-113
-242
-78
-103
-245
-81
-105
-253
-90
-109
-251
-93
-108
-255
-102
-116
-235
-80
-94
-243
-88
-102
-238
-83
-97
-246
-90
-104
-237
-79
-94
-223
-83
-94
-190
-92
-93
-188
-114
-111
-216
-152
-150
-249
-198
-195
-255
-226
-225
-255
-235
-233
-254
-242
-242
-255
-255
-253
-252
-255
-255
-251
-255
-255
-248
-255
-255
-249
-255
-253
-249
-253
-252
-250
-252
-249
-252
-251
-247
-253
-249
-246
-253
-248
-244
-255
-248
-245
-255
-249
-248
-255
-249
-248
-255
-245
-245
-251
-239
-239
-247
-232
-235
-243
-229
-229
-235
-221
-221
-232
-218
-217
-228
-217
-211
-232
-222
-213
-240
-232
-221
-249
-243
-229
-255
-250
-236
-254
-254
-242
-244
-250
-246
-227
-237
-236
-214
-224
-223
-66
-62
-53
-65
-61
-52
-64
-60
-51
-62
-58
-49
-60
-56
-47
-58
-54
-45
-56
-52
-43
-55
-51
-42
-54
-50
-41
-54
-50
-41
-55
-51
-42
-56
-52
-43
-59
-54
-48
-62
-57
-51
-65
-60
-54
-69
-62
-54
-73
-64
-55
-77
-67
-55
-82
-70
-56
-85
-73
-57
-87
-74
-58
-88
-75
-59
-90
-76
-65
-91
-78
-72
-84
-73
-77
-88
-82
-96
-103
-100
-129
-124
-126
-167
-141
-146
-202
-151
-160
-227
-158
-170
-246
-165
-176
-255
-170
-179
-255
-171
-178
-255
-172
-180
-255
-172
-178
-252
-170
-177
-249
-170
-175
-243
-168
-172
-236
-169
-171
-232
-159
-161
-218
-153
-154
-210
-141
-141
-193
-129
-127
-177
-116
-114
-161
-104
-101
-146
-93
-90
-135
-88
-82
-126
-88
-81
-122
-89
-81
-118
-86
-79
-110
-77
-72
-95
-67
-63
-77
-63
-58
-64
-63
-59
-58
-66
-63
-56
-62
-62
-52
-64
-66
-53
-66
-69
-58
-63
-68
-61
-60
-66
-62
-58
-67
-66
-62
-70
-72
-65
-75
-84
-70
-85
-106
-85
-101
-126
-101
-113
-137
-108
-114
-136
-119
-117
-139
-131
-119
-139
-132
-111
-126
-128
-95
-106
-137
-91
-101
-144
-88
-91
-157
-87
-87
-164
-87
-81
-162
-78
-68
-154
-65
-51
-151
-58
-40
-158
-59
-40
-167
-60
-42
-172
-61
-42
-174
-63
-44
-177
-64
-46
-179
-64
-45
-180
-63
-45
-182
-61
-44
-185
-59
-44
-186
-54
-39
-190
-54
-40
-196
-54
-42
-203
-55
-45
-209
-55
-45
-214
-56
-47
-218
-57
-49
-218
-56
-51
-215
-56
-52
-216
-57
-53
-217
-58
-54
-216
-57
-51
-216
-54
-49
-216
-54
-49
-218
-56
-51
-221
-58
-51
-230
-67
-60
-224
-61
-54
-218
-55
-48
-227
-64
-55
-254
-91
-82
-255
-108
-99
-255
-93
-84
-231
-63
-54
-229
-51
-41
-237
-50
-41
-241
-50
-42
-244
-47
-41
-244
-42
-38
-245
-40
-37
-248
-40
-38
-248
-43
-40
-247
-45
-43
-243
-48
-44
-237
-50
-43
-227
-49
-39
-218
-48
-35
-212
-49
-34
-212
-52
-36
-211
-58
-40
-204
-59
-38
-202
-60
-40
-205
-60
-41
-207
-60
-42
-210
-58
-44
-210
-57
-43
-210
-56
-44
-209
-55
-45
-218
-64
-56
-207
-56
-49
-220
-71
-65
-244
-99
-94
-229
-88
-81
-203
-66
-60
-197
-64
-59
-183
-52
-42
-183
-58
-38
-182
-60
-36
-185
-60
-38
-186
-60
-38
-189
-58
-40
-191
-58
-43
-196
-60
-48
-198
-62
-50
-199
-62
-52
-204
-67
-59
-217
-80
-74
-223
-88
-82
-212
-79
-74
-195
-63
-58
-192
-63
-58
-207
-72
-68
-222
-72
-71
-226
-71
-69
-230
-74
-75
-239
-80
-84
-241
-82
-87
-239
-78
-86
-237
-75
-88
-241
-76
-92
-249
-82
-102
-248
-79
-102
-247
-75
-101
-247
-74
-102
-252
-77
-108
-255
-81
-115
-255
-82
-118
-253
-82
-118
-245
-88
-119
-239
-89
-118
-243
-89
-117
-251
-92
-120
-255
-93
-120
-255
-91
-115
-254
-88
-110
-252
-86
-106
-255
-101
-117
-247
-89
-103
-253
-95
-109
-252
-94
-108
-234
-73
-88
-235
-73
-88
-251
-84
-101
-233
-88
-101
-198
-102
-103
-173
-103
-101
-203
-142
-139
-232
-181
-178
-249
-209
-207
-255
-234
-231
-254
-238
-238
-252
-248
-247
-246
-250
-249
-247
-255
-253
-247
-255
-254
-246
-255
-252
-248
-254
-252
-253
-255
-252
-253
-252
-248
-251
-247
-244
-255
-250
-246
-255
-250
-246
-255
-247
-244
-253
-243
-241
-255
-244
-244
-255
-243
-243
-246
-232
-232
-231
-217
-217
-228
-214
-213
-223
-209
-206
-225
-214
-208
-241
-231
-222
-252
-244
-231
-253
-247
-231
-255
-251
-232
-255
-255
-243
-249
-254
-248
-231
-240
-239
-218
-227
-226
-67
-63
-54
-66
-62
-51
-65
-61
-52
-63
-59
-50
-61
-57
-48
-59
-55
-46
-58
-54
-45
-57
-53
-44
-55
-51
-42
-55
-51
-42
-55
-51
-42
-56
-52
-43
-58
-53
-47
-61
-56
-50
-64
-59
-53
-68
-61
-53
-72
-63
-54
-76
-66
-54
-81
-69
-55
-84
-72
-56
-86
-73
-56
-87
-74
-57
-89
-75
-62
-90
-77
-69
-85
-74
-78
-87
-81
-95
-101
-98
-127
-121
-123
-164
-138
-143
-201
-148
-157
-226
-155
-166
-245
-163
-174
-254
-171
-180
-255
-172
-181
-255
-174
-182
-255
-175
-183
-255
-176
-183
-255
-175
-182
-252
-175
-180
-248
-175
-178
-245
-169
-170
-235
-162
-163
-227
-152
-152
-216
-140
-138
-201
-128
-127
-187
-117
-113
-174
-105
-101
-160
-99
-94
-152
-96
-87
-142
-96
-86
-136
-93
-84
-127
-86
-80
-116
-77
-73
-98
-70
-67
-84
-66
-65
-73
-65
-65
-67
-60
-60
-58
-65
-66
-61
-70
-69
-65
-67
-68
-63
-65
-63
-64
-68
-66
-69
-79
-77
-82
-88
-86
-99
-102
-103
-131
-116
-116
-150
-130
-125
-157
-138
-125
-155
-149
-124
-154
-160
-124
-150
-165
-113
-136
-164
-96
-117
-172
-89
-107
-180
-87
-98
-185
-81
-88
-181
-73
-71
-173
-64
-57
-168
-60
-47
-168
-61
-41
-169
-63
-41
-167
-56
-37
-168
-55
-37
-171
-56
-38
-174
-57
-40
-176
-56
-39
-178
-57
-40
-181
-55
-40
-184
-54
-40
-187
-51
-37
-194
-52
-40
-202
-55
-45
-211
-58
-50
-217
-60
-51
-222
-61
-53
-223
-60
-53
-223
-60
-53
-225
-62
-57
-223
-60
-55
-223
-60
-55
-225
-62
-57
-229
-66
-61
-232
-67
-61
-231
-66
-60
-230
-65
-59
-229
-64
-58
-230
-66
-57
-228
-64
-55
-220
-56
-47
-213
-49
-40
-216
-54
-43
-235
-73
-62
-255
-91
-79
-241
-64
-54
-238
-54
-44
-234
-43
-35
-238
-41
-35
-248
-45
-41
-255
-47
-45
-254
-44
-43
-246
-40
-40
-250
-48
-46
-245
-52
-47
-239
-54
-49
-231
-54
-46
-222
-51
-41
-214
-50
-38
-212
-50
-37
-207
-54
-38
-203
-58
-39
-200
-59
-39
-202
-60
-40
-205
-58
-40
-207
-57
-42
-208
-55
-41
-209
-53
-41
-208
-52
-40
-211
-57
-47
-207
-53
-45
-212
-61
-54
-229
-80
-74
-229
-84
-81
-219
-76
-72
-205
-66
-63
-183
-49
-40
-188
-59
-40
-187
-61
-38
-189
-60
-39
-190
-59
-39
-190
-57
-40
-192
-56
-40
-194
-58
-44
-196
-58
-47
-200
-62
-52
-203
-66
-56
-213
-79
-70
-220
-87
-80
-210
-82
-73
-195
-68
-61
-191
-67
-59
-204
-72
-67
-219
-76
-72
-223
-74
-70
-229
-77
-76
-235
-83
-82
-237
-84
-87
-235
-80
-86
-233
-78
-86
-236
-79
-90
-247
-86
-102
-248
-85
-104
-249
-83
-105
-250
-82
-107
-252
-82
-109
-255
-83
-113
-255
-83
-116
-254
-83
-117
-241
-76
-108
-245
-84
-115
-255
-92
-121
-255
-96
-123
-255
-91
-117
-253
-85
-110
-250
-82
-105
-249
-84
-101
-249
-87
-102
-242
-84
-98
-249
-93
-104
-249
-93
-104
-236
-82
-94
-241
-87
-99
-247
-93
-105
-217
-86
-94
-182
-96
-95
-153
-92
-87
-185
-127
-125
-218
-169
-165
-239
-199
-197
-254
-224
-222
-251
-233
-233
-253
-248
-245
-248
-250
-247
-247
-255
-253
-247
-255
-254
-245
-255
-252
-248
-254
-252
-253
-255
-252
-254
-253
-251
-252
-248
-245
-253
-250
-245
-254
-249
-245
-252
-247
-243
-252
-244
-241
-255
-245
-244
-255
-244
-244
-245
-233
-233
-234
-220
-219
-229
-215
-212
-222
-209
-203
-223
-213
-204
-239
-229
-219
-252
-245
-229
-255
-249
-231
-255
-252
-232
-255
-255
-239
-248
-253
-246
-232
-241
-238
-221
-227
-225
-69
-65
-54
-69
-65
-53
-67
-63
-52
-65
-61
-50
-63
-59
-48
-61
-57
-46
-60
-56
-45
-59
-55
-44
-56
-52
-43
-56
-52
-43
-55
-51
-42
-56
-52
-43
-58
-53
-47
-61
-56
-50
-63
-58
-52
-67
-60
-52
-71
-62
-53
-74
-66
-55
-78
-68
-56
-82
-70
-54
-84
-71
-54
-87
-71
-55
-89
-73
-60
-89
-74
-67
-87
-75
-75
-88
-80
-93
-98
-94
-121
-115
-117
-156
-133
-138
-194
-144
-153
-220
-152
-164
-240
-160
-171
-250
-170
-179
-254
-173
-181
-254
-175
-183
-255
-177
-185
-255
-179
-186
-255
-180
-187
-255
-181
-185
-255
-181
-185
-255
-175
-178
-249
-172
-172
-244
-163
-163
-235
-153
-151
-224
-142
-141
-211
-131
-128
-199
-120
-117
-188
-115
-109
-179
-107
-96
-162
-105
-93
-155
-99
-90
-145
-93
-87
-133
-86
-82
-119
-78
-75
-104
-69
-68
-86
-64
-64
-76
-56
-53
-60
-65
-60
-64
-75
-65
-66
-76
-64
-66
-81
-62
-66
-90
-69
-74
-112
-87
-93
-130
-99
-115
-152
-115
-149
-165
-122
-165
-175
-127
-167
-178
-123
-162
-184
-118
-154
-192
-112
-147
-194
-99
-131
-192
-84
-110
-193
-71
-94
-207
-76
-92
-207
-73
-82
-195
-61
-62
-183
-54
-48
-180
-58
-43
-178
-61
-41
-173
-61
-39
-175
-60
-41
-176
-59
-41
-178
-58
-41
-180
-59
-42
-183
-60
-44
-187
-60
-45
-192
-60
-45
-196
-60
-46
-196
-54
-42
-203
-56
-46
-211
-60
-49
-217
-63
-53
-223
-65
-56
-225
-62
-55
-224
-60
-51
-223
-58
-52
-220
-55
-49
-217
-52
-46
-216
-51
-45
-222
-57
-51
-230
-65
-59
-236
-69
-63
-233
-66
-60
-228
-61
-53
-227
-60
-52
-219
-52
-44
-216
-52
-43
-219
-55
-45
-212
-50
-39
-204
-44
-32
-214
-54
-42
-233
-71
-58
-245
-75
-62
-242
-64
-54
-239
-52
-45
-240
-45
-41
-246
-44
-42
-250
-44
-44
-252
-44
-44
-248
-42
-44
-240
-42
-41
-236
-47
-43
-232
-50
-46
-227
-53
-46
-220
-52
-43
-216
-49
-40
-213
-49
-39
-209
-51
-39
-205
-55
-40
-203
-58
-41
-205
-58
-40
-208
-58
-41
-210
-59
-42
-211
-58
-42
-212
-56
-43
-212
-56
-44
-209
-52
-43
-214
-60
-52
-213
-58
-53
-213
-60
-55
-229
-79
-78
-237
-89
-87
-217
-69
-69
-194
-51
-47
-192
-59
-44
-191
-60
-40
-192
-59
-42
-191
-58
-41
-193
-57
-41
-192
-56
-40
-192
-56
-42
-192
-56
-44
-198
-61
-51
-199
-65
-54
-207
-74
-65
-216
-85
-75
-210
-82
-71
-198
-71
-62
-192
-68
-58
-199
-71
-62
-214
-75
-68
-216
-73
-67
-221
-76
-73
-228
-83
-80
-229
-83
-84
-226
-80
-83
-226
-77
-83
-229
-78
-87
-242
-88
-100
-246
-90
-104
-253
-91
-112
-254
-90
-114
-252
-86
-110
-250
-82
-108
-251
-81
-108
-255
-81
-112
-248
-70
-106
-255
-79
-116
-255
-89
-123
-255
-90
-121
-255
-86
-113
-252
-84
-107
-254
-87
-107
-255
-92
-109
-250
-89
-104
-247
-91
-104
-248
-98
-109
-242
-98
-107
-231
-96
-103
-234
-105
-110
-229
-106
-109
-197
-94
-95
-160
-93
-87
-126
-77
-70
-155
-108
-102
-195
-151
-148
-223
-185
-182
-241
-211
-209
-244
-224
-223
-255
-245
-244
-249
-249
-247
-249
-255
-253
-247
-255
-255
-245
-255
-252
-248
-254
-252
-253
-255
-254
-255
-252
-253
-252
-248
-247
-252
-249
-244
-252
-249
-242
-250
-247
-242
-251
-246
-242
-255
-247
-244
-255
-246
-244
-249
-238
-236
-239
-228
-226
-230
-219
-215
-220
-209
-203
-221
-211
-201
-238
-228
-216
-253
-246
-228
-255
-251
-232
-255
-253
-231
-255
-255
-236
-248
-251
-242
-233
-239
-235
-224
-229
-225
-73
-69
-57
-72
-68
-56
-70
-66
-54
-68
-64
-52
-66
-62
-51
-64
-60
-49
-63
-59
-48
-62
-58
-47
-58
-54
-45
-57
-53
-44
-57
-53
-44
-57
-53
-44
-58
-53
-47
-60
-55
-49
-62
-57
-51
-64
-59
-53
-69
-62
-54
-73
-64
-55
-76
-68
-55
-79
-70
-53
-82
-69
-52
-85
-69
-53
-87
-71
-56
-87
-73
-62
-88
-77
-75
-88
-78
-87
-94
-90
-113
-112
-112
-150
-128
-134
-186
-140
-150
-212
-149
-161
-233
-157
-169
-245
-168
-176
-249
-169
-177
-249
-173
-179
-253
-176
-183
-255
-177
-183
-255
-178
-185
-255
-180
-184
-255
-180
-184
-255
-175
-177
-252
-171
-173
-248
-165
-167
-242
-159
-158
-234
-151
-150
-226
-140
-139
-215
-130
-129
-205
-125
-121
-197
-117
-109
-182
-112
-103
-170
-102
-96
-158
-95
-90
-144
-89
-88
-132
-81
-81
-117
-71
-71
-99
-65
-62
-81
-61
-53
-68
-72
-56
-66
-84
-61
-67
-96
-64
-69
-110
-67
-74
-128
-79
-85
-150
-93
-100
-170
-103
-120
-189
-108
-141
-201
-110
-153
-203
-111
-152
-201
-105
-143
-198
-97
-131
-199
-88
-120
-198
-73
-103
-196
-59
-85
-197
-51
-72
-216
-65
-80
-223
-69
-79
-208
-60
-60
-195
-56
-49
-194
-64
-50
-186
-65
-44
-175
-59
-36
-173
-54
-34
-173
-53
-36
-174
-53
-36
-179
-53
-38
-182
-55
-40
-188
-56
-43
-195
-59
-45
-200
-60
-47
-211
-64
-54
-215
-64
-55
-218
-64
-54
-220
-63
-54
-222
-61
-53
-222
-57
-51
-221
-54
-46
-219
-52
-44
-211
-46
-40
-210
-45
-39
-211
-46
-40
-216
-51
-45
-225
-58
-52
-227
-60
-52
-225
-56
-49
-220
-53
-45
-220
-53
-45
-208
-44
-34
-205
-41
-31
-217
-55
-44
-226
-66
-54
-220
-63
-48
-208
-52
-37
-203
-46
-31
-233
-70
-55
-243
-73
-60
-253
-72
-63
-252
-60
-55
-244
-45
-42
-241
-35
-37
-245
-39
-41
-251
-47
-50
-241
-45
-46
-235
-47
-46
-228
-50
-46
-222
-51
-44
-218
-49
-42
-215
-48
-42
-214
-47
-41
-211
-48
-39
-211
-55
-42
-210
-57
-43
-214
-58
-43
-216
-60
-45
-218
-62
-47
-219
-63
-48
-220
-64
-51
-220
-64
-51
-210
-54
-42
-230
-76
-66
-229
-74
-69
-206
-53
-48
-223
-71
-70
-243
-90
-92
-223
-73
-75
-213
-65
-63
-200
-60
-47
-196
-59
-43
-195
-58
-42
-195
-58
-42
-194
-58
-42
-194
-58
-42
-193
-57
-43
-190
-57
-42
-194
-60
-48
-194
-62
-50
-200
-70
-57
-207
-79
-66
-206
-80
-68
-198
-72
-60
-191
-67
-55
-193
-67
-55
-206
-72
-63
-209
-70
-63
-213
-74
-69
-219
-80
-75
-221
-82
-79
-217
-77
-76
-218
-75
-77
-220
-75
-80
-235
-88
-96
-243
-91
-103
-252
-97
-113
-255
-97
-117
-250
-88
-109
-245
-79
-103
-245
-77
-103
-253
-78
-107
-255
-76
-112
-255
-79
-116
-255
-83
-115
-255
-82
-110
-250
-84
-108
-252
-90
-111
-255
-99
-117
-255
-105
-120
-255
-102
-117
-250
-98
-111
-244
-98
-109
-236
-101
-108
-224
-103
-108
-212
-106
-106
-200
-106
-104
-177
-104
-97
-141
-94
-84
-104
-70
-60
-130
-93
-85
-172
-135
-129
-206
-171
-169
-229
-199
-197
-239
-218
-217
-255
-243
-243
-251
-247
-246
-249
-253
-252
-248
-255
-255
-245
-255
-254
-248
-254
-254
-255
-255
-255
-255
-251
-255
-254
-248
-248
-251
-250
-245
-250
-250
-242
-249
-248
-243
-253
-250
-245
-255
-251
-247
-255
-250
-247
-253
-243
-241
-247
-236
-232
-235
-224
-218
-223
-213
-204
-222
-212
-202
-237
-230
-214
-254
-247
-228
-255
-254
-232
-255
-254
-229
-255
-254
-233
-247
-249
-238
-234
-239
-232
-228
-231
-224
-78
-72
-58
-77
-71
-57
-76
-70
-56
-74
-68
-54
-72
-66
-54
-70
-64
-52
-68
-61
-51
-67
-60
-50
-63
-56
-48
-62
-55
-47
-61
-54
-46
-61
-54
-46
-61
-54
-48
-62
-55
-49
-64
-57
-51
-63
-58
-52
-67
-62
-56
-69
-65
-56
-75
-67
-56
-78
-69
-54
-81
-68
-51
-82
-69
-50
-86
-70
-54
-86
-72
-59
-90
-77
-71
-86
-77
-82
-91
-87
-104
-108
-107
-139
-126
-130
-177
-138
-147
-206
-146
-159
-227
-154
-166
-238
-166
-174
-247
-169
-175
-249
-173
-176
-253
-175
-179
-253
-176
-179
-255
-176
-180
-254
-176
-179
-255
-175
-179
-253
-171
-174
-251
-168
-171
-248
-164
-167
-244
-160
-162
-239
-154
-156
-233
-147
-149
-226
-138
-140
-217
-134
-133
-209
-131
-127
-201
-123
-117
-187
-109
-107
-172
-100
-101
-158
-95
-97
-146
-89
-91
-132
-82
-81
-115
-78
-72
-98
-87
-70
-89
-95
-67
-81
-109
-66
-76
-129
-69
-77
-152
-77
-84
-172
-85
-93
-188
-91
-98
-202
-90
-104
-214
-84
-112
-223
-83
-118
-222
-84
-117
-215
-80
-110
-208
-74
-99
-203
-67
-89
-198
-57
-74
-194
-47
-63
-211
-57
-69
-225
-68
-77
-228
-72
-75
-215
-63
-60
-205
-62
-54
-203
-71
-58
-194
-73
-52
-182
-63
-41
-183
-62
-43
-184
-61
-45
-186
-60
-45
-189
-62
-47
-195
-63
-48
-202
-66
-52
-208
-68
-55
-213
-69
-58
-217
-69
-57
-218
-66
-55
-219
-62
-53
-217
-59
-50
-217
-54
-45
-217
-53
-44
-218
-51
-43
-215
-51
-42
-212
-49
-42
-215
-52
-45
-218
-55
-46
-221
-57
-48
-223
-56
-48
-222
-55
-47
-221
-54
-46
-220
-53
-44
-214
-47
-38
-217
-53
-43
-215
-55
-43
-207
-50
-35
-205
-49
-34
-210
-57
-41
-213
-62
-45
-212
-59
-41
-216
-60
-45
-230
-68
-55
-248
-74
-65
-253
-68
-63
-249
-54
-52
-245
-42
-45
-246
-42
-45
-247
-47
-50
-247
-54
-55
-237
-53
-53
-226
-51
-48
-218
-49
-44
-215
-48
-42
-215
-47
-44
-217
-48
-45
-217
-48
-43
-227
-56
-49
-228
-57
-49
-226
-58
-49
-226
-59
-50
-224
-60
-48
-223
-61
-48
-220
-63
-48
-218
-62
-49
-209
-55
-43
-239
-87
-76
-248
-97
-90
-211
-59
-54
-209
-59
-58
-230
-80
-81
-220
-70
-72
-230
-80
-81
-207
-60
-52
-202
-58
-47
-198
-56
-44
-197
-57
-44
-196
-58
-45
-196
-60
-46
-195
-59
-45
-192
-59
-44
-190
-58
-45
-190
-60
-46
-195
-65
-51
-199
-72
-57
-199
-73
-59
-194
-68
-54
-190
-64
-50
-188
-62
-48
-201
-70
-60
-202
-69
-60
-206
-73
-66
-213
-80
-73
-215
-82
-77
-213
-78
-75
-211
-75
-75
-215
-76
-79
-233
-90
-96
-240
-94
-104
-252
-102
-114
-255
-104
-120
-252
-93
-113
-242
-80
-101
-243
-77
-101
-252
-79
-107
-255
-83
-117
-255
-82
-116
-254
-81
-111
-244
-82
-106
-243
-92
-111
-250
-103
-119
-253
-105
-119
-249
-101
-115
-253
-101
-116
-245
-94
-109
-239
-94
-107
-236
-106
-114
-221
-115
-117
-192
-107
-102
-168
-101
-92
-156
-110
-97
-127
-101
-86
-89
-71
-57
-110
-86
-74
-150
-123
-114
-190
-159
-156
-223
-193
-193
-238
-214
-214
-254
-238
-239
-254
-245
-246
-252
-252
-252
-249
-255
-255
-246
-255
-254
-249
-253
-254
-255
-255
-255
-255
-251
-255
-254
-248
-250
-253
-254
-248
-250
-253
-244
-250
-251
-245
-254
-253
-248
-255
-255
-250
-255
-253
-249
-255
-250
-244
-255
-246
-241
-242
-233
-226
-229
-221
-210
-225
-217
-204
-240
-233
-215
-255
-250
-228
-255
-255
-230
-255
-254
-229
-255
-254
-233
-246
-248
-234
-237
-240
-231
-232
-233
-225
-81
-75
-61
-80
-74
-60
-79
-73
-59
-77
-71
-57
-75
-69
-57
-73
-67
-55
-71
-64
-54
-71
-64
-54
-66
-59
-51
-65
-58
-50
-64
-57
-49
-63
-56
-48
-63
-56
-50
-63
-56
-50
-65
-58
-52
-64
-59
-53
-66
-63
-56
-69
-66
-57
-75
-69
-57
-77
-70
-54
-80
-69
-51
-82
-69
-50
-85
-70
-51
-85
-72
-55
-89
-76
-67
-85
-75
-76
-90
-83
-99
-105
-105
-133
-124
-129
-171
-137
-147
-200
-147
-158
-222
-154
-164
-235
-166
-172
-248
-169
-172
-251
-172
-173
-253
-173
-176
-255
-174
-177
-255
-174
-177
-254
-173
-176
-253
-173
-176
-253
-169
-172
-249
-167
-170
-247
-164
-168
-242
-162
-166
-240
-159
-163
-237
-154
-158
-232
-149
-153
-227
-146
-148
-222
-146
-146
-218
-137
-138
-205
-124
-128
-192
-115
-120
-178
-111
-117
-169
-109
-112
-157
-105
-103
-142
-106
-95
-125
-121
-95
-120
-130
-87
-106
-142
-80
-95
-163
-79
-92
-187
-83
-92
-205
-84
-93
-214
-80
-87
-218
-72
-83
-224
-65
-83
-228
-65
-84
-224
-69
-85
-217
-69
-81
-210
-69
-77
-204
-65
-70
-199
-59
-60
-198
-54
-54
-227
-74
-76
-229
-73
-74
-224
-66
-65
-211
-56
-52
-206
-57
-50
-206
-65
-55
-200
-68
-53
-190
-63
-46
-195
-69
-54
-195
-69
-54
-197
-70
-55
-201
-69
-56
-206
-70
-56
-209
-71
-58
-215
-71
-60
-218
-71
-61
-214
-62
-51
-213
-59
-49
-214
-56
-47
-213
-52
-44
-214
-51
-42
-216
-52
-43
-219
-52
-44
-218
-54
-45
-219
-56
-49
-221
-60
-52
-224
-61
-52
-223
-60
-51
-221
-57
-48
-220
-53
-45
-220
-53
-44
-219
-55
-45
-210
-46
-36
-221
-59
-48
-218
-61
-46
-205
-49
-34
-198
-45
-29
-206
-55
-38
-210
-61
-41
-205
-58
-38
-204
-57
-39
-212
-56
-41
-226
-58
-47
-243
-61
-57
-255
-64
-64
-255
-60
-62
-254
-51
-55
-243
-44
-47
-234
-44
-46
-225
-43
-42
-216
-42
-41
-212
-43
-40
-215
-47
-44
-222
-52
-52
-228
-56
-56
-233
-57
-57
-239
-55
-53
-240
-55
-52
-238
-55
-51
-232
-55
-49
-227
-55
-45
-220
-54
-42
-215
-53
-40
-209
-53
-38
-205
-53
-40
-231
-80
-69
-255
-109
-99
-219
-72
-65
-200
-52
-50
-215
-67
-67
-211
-62
-66
-234
-86
-86
-217
-65
-60
-210
-62
-52
-203
-56
-46
-198
-54
-43
-198
-58
-45
-198
-60
-47
-195
-62
-47
-193
-61
-46
-187
-57
-43
-187
-60
-45
-190
-63
-48
-192
-65
-50
-191
-65
-50
-189
-64
-46
-188
-61
-46
-187
-60
-45
-195
-67
-54
-196
-68
-57
-200
-72
-63
-208
-80
-71
-211
-82
-76
-208
-79
-73
-210
-78
-76
-213
-79
-78
-233
-94
-99
-238
-97
-103
-251
-105
-116
-255
-110
-122
-255
-100
-117
-245
-86
-106
-245
-81
-105
-254
-86
-111
-255
-86
-115
-255
-86
-113
-245
-87
-110
-238
-93
-110
-241
-109
-120
-247
-117
-127
-240
-106
-115
-227
-87
-98
-243
-95
-109
-245
-94
-109
-241
-96
-111
-241
-114
-125
-238
-135
-138
-206
-128
-124
-169
-117
-104
-151
-122
-106
-117
-106
-88
-82
-77
-58
-97
-85
-71
-132
-112
-103
-177
-149
-146
-221
-191
-191
-239
-213
-216
-253
-233
-235
-254
-244
-245
-252
-250
-251
-250
-254
-255
-248
-254
-254
-252
-253
-255
-255
-254
-255
-255
-250
-255
-255
-249
-253
-255
-255
-251
-248
-254
-244
-250
-253
-246
-255
-255
-250
-255
-255
-250
-255
-255
-248
-255
-252
-246
-255
-253
-245
-250
-241
-232
-238
-230
-219
-234
-226
-213
-245
-240
-221
-255
-251
-229
-255
-254
-229
-255
-254
-226
-255
-255
-231
-249
-250
-234
-242
-244
-231
-238
-240
-229
-83
-77
-61
-82
-76
-60
-81
-75
-61
-79
-73
-59
-77
-71
-57
-75
-69
-55
-74
-68
-56
-73
-67
-55
-69
-62
-52
-68
-61
-51
-66
-59
-51
-65
-58
-50
-64
-57
-51
-65
-58
-52
-65
-57
-54
-64
-59
-55
-65
-64
-59
-67
-67
-59
-73
-69
-57
-77
-71
-55
-79
-71
-50
-82
-70
-48
-85
-70
-49
-85
-72
-53
-87
-75
-63
-82
-72
-70
-88
-82
-94
-106
-103
-130
-125
-129
-167
-137
-147
-196
-146
-158
-218
-152
-162
-231
-164
-167
-246
-166
-167
-250
-171
-169
-252
-171
-172
-254
-172
-173
-255
-173
-174
-254
-172
-174
-251
-172
-174
-251
-168
-172
-246
-166
-170
-244
-164
-168
-241
-163
-167
-240
-161
-168
-238
-160
-167
-237
-157
-164
-232
-155
-162
-230
-153
-158
-226
-146
-154
-219
-139
-147
-210
-134
-143
-202
-131
-141
-194
-132
-136
-183
-131
-129
-168
-136
-121
-154
-143
-109
-136
-154
-99
-122
-169
-88
-105
-187
-81
-95
-207
-77
-89
-224
-73
-82
-232
-65
-73
-232
-62
-65
-228
-62
-62
-222
-65
-60
-216
-69
-61
-210
-74
-60
-202
-75
-60
-194
-71
-53
-191
-68
-50
-195
-65
-49
-226
-86
-73
-223
-72
-63
-217
-60
-55
-216
-54
-51
-218
-56
-53
-216
-59
-54
-210
-57
-52
-200
-56
-48
-192
-58
-46
-190
-60
-46
-191
-59
-46
-192
-58
-46
-194
-56
-43
-195
-55
-42
-198
-52
-39
-198
-50
-38
-206
-52
-42
-208
-51
-42
-209
-51
-40
-212
-51
-41
-214
-51
-42
-217
-53
-44
-221
-54
-46
-220
-56
-47
-222
-61
-51
-219
-61
-50
-220
-59
-49
-219
-56
-47
-219
-55
-45
-218
-54
-44
-216
-52
-42
-215
-51
-41
-213
-51
-38
-211
-51
-37
-208
-52
-37
-207
-54
-38
-210
-61
-41
-209
-62
-42
-202
-57
-36
-192
-50
-28
-200
-58
-38
-202
-52
-37
-213
-49
-39
-231
-53
-49
-250
-60
-60
-255
-61
-64
-255
-55
-61
-247
-51
-55
-234
-45
-49
-225
-45
-46
-217
-45
-45
-215
-47
-46
-220
-52
-51
-227
-57
-58
-233
-59
-61
-240
-57
-61
-246
-50
-54
-248
-48
-51
-244
-48
-49
-237
-49
-47
-228
-49
-42
-222
-50
-40
-213
-49
-37
-207
-51
-36
-201
-49
-36
-209
-61
-49
-250
-106
-95
-228
-84
-76
-200
-57
-53
-208
-64
-63
-203
-58
-61
-228
-82
-83
-228
-74
-72
-220
-67
-61
-209
-58
-51
-201
-54
-46
-198
-56
-46
-197
-59
-48
-194
-60
-48
-191
-61
-47
-186
-59
-42
-188
-63
-45
-189
-64
-46
-188
-63
-45
-186
-59
-42
-186
-59
-40
-189
-59
-43
-190
-60
-44
-188
-62
-48
-188
-62
-50
-192
-68
-56
-200
-76
-66
-204
-80
-72
-202
-78
-70
-204
-76
-73
-208
-78
-76
-232
-97
-101
-236
-97
-102
-248
-104
-114
-255
-111
-123
-255
-104
-120
-247
-90
-107
-247
-85
-106
-253
-91
-114
-249
-91
-114
-244
-95
-115
-233
-98
-113
-227
-107
-116
-234
-125
-128
-242
-133
-136
-234
-118
-121
-222
-92
-100
-246
-101
-116
-255
-107
-124
-247
-98
-117
-238
-106
-119
-249
-144
-149
-239
-161
-159
-196
-148
-138
-163
-140
-124
-106
-105
-85
-73
-81
-60
-88
-85
-70
-117
-103
-92
-165
-140
-136
-220
-190
-190
-242
-213
-217
-249
-227
-230
-255
-242
-245
-255
-249
-251
-252
-253
-255
-249
-253
-255
-252
-253
-255
-255
-253
-255
-255
-251
-255
-255
-248
-253
-254
-255
-251
-247
-253
-243
-247
-253
-243
-253
-255
-247
-255
-255
-248
-255
-253
-246
-255
-251
-245
-255
-255
-246
-255
-250
-240
-246
-240
-226
-242
-236
-220
-251
-246
-226
-255
-252
-230
-254
-252
-227
-254
-253
-225
-255
-255
-230
-253
-254
-236
-248
-249
-235
-246
-246
-234
-86
-79
-63
-84
-78
-62
-83
-75
-62
-80
-74
-60
-79
-71
-58
-76
-70
-56
-76
-68
-55
-74
-68
-56
-72
-64
-53
-70
-64
-52
-69
-60
-51
-66
-59
-49
-66
-57
-50
-65
-58
-50
-67
-58
-51
-65
-60
-54
-67
-64
-57
-68
-68
-58
-74
-70
-58
-77
-71
-55
-79
-71
-50
-81
-70
-48
-84
-72
-50
-85
-72
-53
-85
-73
-61
-81
-71
-69
-87
-81
-93
-106
-104
-128
-126
-130
-168
-140
-148
-197
-147
-157
-216
-153
-162
-231
-159
-160
-242
-164
-160
-247
-166
-163
-250
-169
-166
-253
-169
-169
-255
-169
-171
-254
-169
-172
-253
-169
-172
-251
-165
-171
-245
-163
-170
-242
-163
-167
-238
-162
-167
-235
-164
-169
-237
-165
-170
-238
-165
-168
-237
-163
-167
-238
-152
-161
-230
-150
-161
-227
-148
-159
-221
-148
-159
-213
-149
-155
-203
-152
-150
-190
-158
-141
-175
-168
-132
-160
-164
-102
-127
-178
-93
-114
-193
-82
-99
-206
-74
-88
-218
-66
-78
-228
-62
-72
-235
-60
-67
-235
-61
-62
-231
-64
-58
-223
-67
-55
-216
-70
-55
-209
-74
-55
-199
-74
-52
-191
-71
-47
-189
-67
-44
-193
-64
-45
-225
-83
-69
-221
-68
-60
-221
-57
-55
-230
-62
-61
-236
-68
-67
-230
-64
-64
-219
-56
-57
-207
-53
-51
-205
-67
-57
-200
-68
-56
-201
-67
-56
-199
-65
-53
-198
-62
-50
-195
-57
-44
-194
-54
-41
-194
-50
-39
-198
-50
-40
-203
-51
-40
-206
-52
-42
-211
-53
-44
-216
-53
-46
-217
-52
-46
-219
-52
-46
-219
-52
-44
-228
-66
-55
-222
-60
-49
-218
-54
-44
-218
-54
-44
-223
-57
-45
-223
-57
-45
-219
-53
-41
-213
-49
-37
-216
-56
-40
-206
-49
-32
-202
-49
-33
-208
-57
-40
-206
-56
-39
-199
-52
-34
-202
-55
-37
-212
-67
-48
-200
-55
-38
-206
-56
-42
-215
-54
-44
-222
-53
-46
-230
-51
-47
-238
-53
-51
-246
-58
-57
-251
-63
-62
-255
-76
-75
-250
-72
-70
-242
-66
-66
-236
-62
-61
-234
-60
-61
-231
-55
-58
-229
-50
-54
-230
-44
-49
-244
-43
-49
-248
-41
-47
-244
-44
-46
-239
-47
-46
-232
-49
-43
-224
-52
-42
-217
-53
-41
-211
-55
-40
-198
-48
-33
-192
-46
-31
-244
-100
-89
-235
-93
-83
-207
-64
-58
-212
-68
-67
-203
-59
-59
-223
-77
-77
-234
-82
-81
-224
-72
-69
-211
-59
-54
-201
-54
-47
-198
-56
-46
-198
-57
-47
-195
-59
-45
-190
-58
-43
-190
-60
-44
-193
-64
-45
-192
-65
-46
-187
-60
-41
-183
-56
-37
-184
-57
-38
-189
-60
-41
-190
-63
-46
-181
-55
-41
-179
-55
-43
-184
-62
-49
-193
-71
-58
-197
-75
-64
-197
-73
-65
-200
-73
-66
-203
-74
-69
-229
-97
-95
-230
-94
-96
-241
-100
-106
-254
-110
-119
-254
-107
-117
-243
-93
-105
-240
-88
-101
-246
-94
-109
-248
-97
-116
-241
-100
-116
-229
-104
-112
-223
-110
-114
-233
-127
-127
-249
-141
-139
-247
-131
-132
-239
-110
-115
-253
-112
-121
-255
-120
-134
-245
-97
-113
-223
-88
-102
-246
-136
-145
-255
-180
-180
-211
-173
-162
-164
-153
-135
-96
-104
-80
-69
-81
-57
-82
-84
-63
-107
-97
-85
-156
-136
-129
-220
-192
-191
-244
-215
-217
-246
-224
-227
-255
-241
-244
-255
-248
-251
-253
-253
-255
-251
-252
-255
-252
-253
-255
-255
-253
-255
-255
-252
-255
-254
-249
-253
-250
-255
-249
-242
-254
-240
-242
-252
-241
-249
-255
-244
-253
-255
-247
-250
-252
-241
-254
-251
-242
-255
-255
-244
-255
-255
-243
-252
-246
-232
-248
-242
-226
-254
-249
-229
-255
-253
-231
-253
-251
-226
-253
-252
-224
-255
-255
-233
-255
-255
-241
-252
-252
-240
-251
-251
-239
-88
-79
-64
-87
-80
-64
-87
-78
-63
-85
-78
-62
-84
-75
-60
-82
-75
-59
-82
-73
-58
-80
-72
-59
-77
-67
-55
-75
-67
-54
-75
-65
-53
-72
-64
-51
-72
-62
-50
-71
-63
-50
-72
-62
-50
-70
-64
-52
-71
-67
-58
-71
-69
-57
-74
-71
-56
-78
-73
-54
-82
-74
-53
-85
-74
-52
-85
-74
-52
-86
-75
-57
-88
-78
-68
-85
-76
-77
-90
-84
-98
-107
-104
-131
-123
-126
-167
-137
-143
-195
-145
-153
-215
-152
-159
-231
-166
-162
-246
-167
-161
-249
-165
-160
-252
-164
-161
-252
-162
-163
-255
-163
-167
-255
-164
-170
-255
-164
-173
-252
-161
-170
-245
-161
-169
-241
-161
-168
-236
-164
-169
-237
-167
-170
-239
-172
-170
-243
-174
-170
-246
-171
-170
-246
-161
-168
-246
-156
-166
-238
-149
-160
-222
-152
-159
-211
-166
-164
-203
-180
-160
-188
-180
-135
-155
-179
-105
-120
-186
-78
-93
-205
-70
-84
-219
-65
-77
-227
-61
-73
-228
-61
-71
-227
-62
-69
-223
-64
-69
-223
-64
-68
-226
-61
-65
-221
-61
-61
-219
-70
-66
-200
-59
-52
-202
-68
-59
-202
-69
-60
-186
-49
-41
-219
-74
-69
-230
-75
-73
-233
-67
-69
-235
-62
-66
-232
-59
-63
-230
-60
-63
-225
-61
-62
-219
-59
-59
-212
-60
-57
-207
-66
-59
-200
-63
-55
-202
-68
-59
-209
-77
-65
-205
-75
-62
-191
-61
-48
-184
-54
-41
-189
-57
-44
-191
-55
-43
-195
-54
-44
-200
-53
-45
-203
-50
-42
-209
-47
-42
-212
-47
-43
-219
-50
-47
-224
-53
-46
-231
-65
-53
-224
-56
-43
-219
-49
-36
-222
-50
-38
-230
-57
-43
-231
-59
-45
-225
-55
-38
-215
-50
-31
-209
-50
-31
-206
-51
-31
-203
-52
-33
-201
-51
-34
-201
-51
-34
-203
-51
-37
-206
-53
-39
-207
-53
-41
-202
-48
-38
-207
-50
-41
-209
-53
-41
-210
-54
-42
-210
-52
-40
-213
-51
-38
-215
-51
-39
-220
-52
-41
-224
-50
-41
-230
-51
-46
-235
-53
-50
-235
-51
-51
-233
-47
-50
-231
-45
-50
-232
-45
-52
-237
-46
-53
-246
-45
-51
-246
-43
-47
-239
-43
-44
-236
-47
-45
-234
-53
-46
-227
-57
-44
-217
-55
-40
-208
-52
-37
-195
-45
-28
-196
-51
-34
-231
-88
-72
-233
-89
-78
-203
-59
-51
-223
-78
-73
-197
-52
-49
-218
-72
-72
-225
-79
-80
-220
-74
-74
-212
-67
-64
-204
-59
-54
-200
-56
-48
-198
-56
-44
-199
-57
-43
-200
-60
-43
-197
-60
-42
-194
-59
-40
-190
-57
-38
-188
-59
-40
-187
-60
-41
-186
-61
-41
-186
-61
-43
-183
-60
-44
-180
-56
-44
-181
-59
-48
-185
-61
-49
-187
-63
-51
-187
-63
-51
-190
-64
-52
-192
-64
-53
-196
-65
-55
-239
-106
-97
-245
-112
-105
-234
-99
-95
-244
-109
-106
-251
-113
-113
-236
-97
-100
-244
-103
-109
-255
-112
-121
-255
-107
-122
-251
-104
-120
-234
-103
-111
-226
-101
-105
-229
-103
-106
-237
-109
-110
-243
-110
-111
-245
-109
-111
-255
-119
-123
-255
-126
-133
-241
-95
-108
-241
-105
-119
-214
-103
-112
-248
-174
-175
-189
-167
-154
-133
-141
-117
-97
-112
-81
-74
-89
-58
-77
-81
-56
-115
-110
-90
-165
-149
-136
-205
-182
-176
-237
-213
-211
-255
-238
-240
-255
-244
-245
-255
-245
-249
-252
-247
-251
-251
-251
-253
-253
-254
-255
-254
-255
-255
-255
-254
-255
-251
-255
-254
-239
-255
-243
-229
-252
-232
-231
-249
-233
-240
-254
-237
-248
-255
-245
-252
-255
-244
-253
-255
-242
-255
-253
-240
-255
-253
-241
-255
-251
-238
-255
-250
-234
-255
-250
-230
-254
-249
-227
-252
-250
-225
-252
-250
-225
-251
-250
-229
-253
-253
-241
-255
-255
-250
-255
-255
-250
-89
-80
-65
-88
-79
-64
-88
-79
-64
-86
-77
-62
-85
-76
-61
-84
-75
-60
-83
-74
-59
-82
-73
-58
-78
-69
-54
-77
-68
-53
-76
-67
-52
-75
-66
-51
-74
-65
-50
-74
-65
-50
-74
-65
-50
-73
-65
-52
-71
-67
-56
-72
-68
-57
-76
-70
-56
-79
-72
-54
-82
-74
-53
-83
-75
-52
-86
-75
-55
-84
-75
-58
-88
-78
-69
-85
-76
-77
-89
-85
-99
-107
-104
-131
-123
-125
-166
-134
-140
-192
-141
-149
-211
-150
-154
-225
-161
-156
-236
-163
-155
-241
-161
-157
-244
-161
-158
-249
-160
-161
-253
-160
-165
-255
-162
-170
-255
-161
-172
-251
-160
-172
-244
-160
-171
-237
-158
-167
-232
-161
-166
-232
-164
-164
-234
-166
-164
-237
-166
-162
-238
-163
-160
-237
-163
-166
-243
-160
-164
-235
-160
-160
-220
-165
-155
-205
-177
-153
-189
-188
-143
-166
-189
-115
-130
-191
-87
-98
-204
-70
-77
-220
-63
-70
-230
-59
-67
-233
-58
-65
-230
-59
-67
-225
-62
-67
-219
-64
-68
-218
-65
-70
-224
-60
-67
-218
-57
-63
-218
-65
-68
-203
-59
-59
-204
-66
-63
-202
-64
-61
-193
-51
-49
-229
-79
-80
-230
-67
-70
-232
-63
-68
-234
-59
-66
-231
-56
-63
-226
-56
-59
-219
-56
-57
-213
-58
-56
-207
-59
-55
-212
-69
-63
-198
-61
-53
-197
-60
-52
-204
-71
-62
-204
-76
-65
-193
-67
-53
-184
-58
-44
-183
-57
-43
-185
-55
-42
-191
-55
-43
-198
-54
-45
-203
-52
-45
-209
-50
-46
-216
-51
-47
-225
-53
-51
-228
-56
-52
-229
-61
-50
-226
-58
-45
-225
-53
-41
-225
-52
-38
-228
-52
-39
-226
-53
-39
-221
-51
-34
-213
-50
-31
-211
-56
-36
-205
-56
-34
-201
-56
-37
-200
-58
-38
-204
-58
-43
-206
-58
-44
-207
-55
-44
-208
-51
-42
-213
-51
-46
-214
-53
-45
-211
-55
-43
-207
-55
-41
-201
-54
-38
-199
-52
-34
-203
-52
-33
-207
-52
-34
-216
-50
-36
-222
-50
-38
-227
-48
-43
-230
-46
-44
-230
-44
-45
-230
-44
-47
-230
-45
-50
-232
-46
-51
-236
-43
-46
-237
-44
-45
-236
-48
-46
-232
-50
-46
-224
-52
-42
-219
-53
-39
-213
-56
-39
-210
-57
-39
-213
-63
-46
-187
-42
-25
-214
-68
-53
-208
-62
-49
-217
-70
-62
-235
-86
-80
-218
-66
-63
-216
-66
-65
-231
-85
-86
-226
-82
-82
-220
-75
-72
-212
-67
-62
-205
-61
-53
-201
-57
-46
-200
-57
-43
-199
-56
-40
-200
-59
-42
-196
-59
-40
-191
-58
-39
-189
-60
-41
-189
-62
-43
-186
-63
-45
-185
-64
-47
-182
-62
-46
-178
-58
-44
-180
-59
-48
-183
-61
-48
-184
-62
-49
-186
-63
-48
-189
-63
-49
-193
-66
-51
-197
-67
-53
-235
-105
-92
-242
-109
-100
-231
-98
-91
-240
-107
-102
-245
-111
-108
-232
-98
-97
-241
-107
-108
-254
-115
-120
-255
-111
-126
-255
-110
-124
-242
-107
-114
-228
-97
-102
-228
-92
-96
-239
-99
-102
-253
-110
-112
-255
-119
-120
-253
-117
-119
-255
-121
-126
-235
-89
-100
-237
-99
-112
-215
-99
-110
-242
-168
-169
-178
-162
-147
-118
-134
-107
-94
-114
-79
-78
-95
-59
-83
-90
-59
-117
-115
-92
-169
-157
-141
-214
-196
-184
-246
-225
-220
-255
-245
-241
-255
-248
-248
-255
-248
-249
-253
-249
-250
-251
-251
-251
-250
-254
-253
-251
-255
-254
-250
-254
-255
-246
-255
-250
-237
-255
-242
-227
-255
-232
-227
-251
-229
-235
-254
-234
-244
-255
-240
-249
-255
-241
-252
-255
-241
-255
-255
-240
-255
-253
-239
-255
-253
-237
-255
-251
-233
-254
-247
-229
-249
-244
-224
-248
-243
-221
-250
-245
-223
-250
-247
-228
-249
-249
-239
-251
-252
-246
-254
-253
-249
-92
-80
-66
-91
-79
-65
-91
-79
-65
-89
-77
-63
-88
-76
-62
-87
-75
-61
-86
-74
-60
-86
-74
-60
-83
-71
-57
-82
-70
-56
-81
-69
-55
-79
-67
-53
-79
-67
-53
-79
-67
-53
-79
-67
-53
-77
-67
-55
-74
-67
-57
-74
-70
-59
-77
-71
-57
-80
-73
-55
-83
-75
-54
-86
-75
-53
-86
-75
-55
-84
-75
-58
-87
-77
-67
-86
-77
-78
-90
-87
-98
-107
-105
-129
-121
-123
-161
-133
-137
-185
-139
-145
-203
-146
-150
-214
-153
-152
-222
-155
-151
-227
-155
-152
-233
-155
-156
-238
-157
-159
-244
-158
-163
-247
-160
-167
-248
-160
-169
-244
-160
-170
-239
-157
-168
-232
-155
-165
-227
-156
-162
-224
-156
-160
-224
-157
-158
-225
-156
-154
-227
-155
-153
-226
-153
-154
-221
-158
-152
-214
-168
-147
-204
-178
-140
-189
-191
-131
-169
-198
-115
-145
-197
-91
-111
-194
-70
-81
-209
-68
-76
-218
-65
-68
-223
-63
-65
-225
-62
-63
-225
-62
-65
-225
-62
-67
-223
-62
-68
-223
-62
-70
-224
-60
-67
-215
-56
-61
-213
-63
-65
-207
-65
-64
-202
-67
-63
-195
-60
-56
-196
-57
-54
-233
-87
-87
-224
-66
-67
-228
-62
-66
-232
-59
-63
-227
-57
-60
-220
-54
-56
-214
-54
-54
-209
-57
-54
-204
-59
-54
-213
-72
-65
-196
-59
-49
-190
-53
-43
-197
-65
-53
-205
-75
-62
-198
-72
-58
-187
-61
-47
-183
-56
-41
-186
-54
-41
-191
-55
-41
-199
-55
-44
-207
-54
-46
-215
-53
-48
-222
-55
-49
-230
-57
-53
-233
-61
-57
-217
-50
-42
-218
-51
-42
-221
-53
-42
-223
-52
-42
-223
-52
-42
-222
-54
-41
-220
-57
-42
-217
-62
-44
-198
-51
-33
-192
-51
-31
-187
-52
-33
-186
-53
-34
-191
-55
-41
-191
-55
-41
-191
-50
-40
-193
-44
-37
-227
-64
-59
-229
-62
-56
-222
-61
-51
-213
-60
-46
-204
-57
-41
-200
-55
-36
-200
-55
-34
-204
-55
-35
-210
-55
-37
-213
-51
-36
-215
-47
-38
-217
-46
-39
-219
-46
-42
-220
-46
-45
-219
-47
-47
-220
-46
-47
-219
-44
-41
-223
-48
-43
-224
-53
-45
-220
-53
-44
-213
-51
-38
-208
-52
-37
-208
-57
-38
-209
-62
-42
-212
-65
-47
-194
-49
-32
-231
-83
-69
-210
-59
-48
-218
-65
-59
-222
-67
-63
-232
-74
-73
-240
-84
-85
-237
-85
-84
-231
-83
-81
-227
-79
-77
-221
-74
-67
-214
-67
-59
-207
-60
-50
-202
-56
-43
-197
-54
-38
-196
-55
-38
-192
-55
-37
-188
-55
-38
-185
-58
-39
-185
-60
-42
-183
-62
-45
-181
-61
-44
-178
-61
-44
-176
-58
-44
-177
-59
-47
-180
-60
-46
-181
-61
-47
-183
-61
-46
-185
-63
-48
-190
-67
-52
-195
-69
-55
-220
-92
-81
-234
-103
-93
-228
-97
-89
-240
-108
-103
-246
-112
-109
-231
-97
-96
-236
-102
-103
-245
-106
-113
-228
-80
-94
-240
-94
-107
-240
-106
-113
-235
-104
-109
-235
-99
-103
-242
-102
-105
-254
-111
-113
-255
-117
-119
-253
-114
-117
-252
-111
-117
-231
-81
-93
-232
-90
-104
-217
-97
-109
-237
-158
-161
-170
-152
-138
-108
-122
-96
-89
-109
-72
-79
-100
-61
-87
-96
-65
-119
-119
-93
-173
-165
-146
-225
-209
-194
-255
-238
-230
-255
-248
-241
-255
-251
-247
-255
-252
-248
-252
-253
-248
-250
-255
-251
-251
-255
-253
-251
-255
-253
-249
-255
-251
-244
-255
-246
-233
-255
-237
-222
-252
-226
-220
-246
-221
-225
-247
-224
-233
-251
-229
-239
-251
-231
-245
-252
-234
-252
-255
-236
-253
-250
-233
-255
-250
-234
-255
-248
-230
-249
-242
-224
-241
-234
-216
-239
-232
-213
-243
-236
-217
-247
-242
-223
-251
-248
-239
-252
-252
-244
-255
-254
-249
-92
-80
-66
-92
-80
-66
-91
-79
-65
-90
-78
-64
-89
-77
-63
-89
-77
-63
-88
-76
-62
-88
-76
-62
-85
-73
-59
-84
-72
-58
-83
-71
-57
-82
-70
-56
-82
-70
-56
-82
-70
-56
-82
-70
-56
-80
-70
-58
-76
-69
-59
-75
-71
-60
-79
-73
-59
-82
-75
-57
-84
-76
-55
-87
-76
-54
-87
-76
-56
-87
-75
-59
-86
-76
-66
-85
-77
-75
-92
-86
-96
-106
-104
-126
-121
-121
-155
-130
-133
-178
-138
-141
-194
-143
-148
-206
-148
-148
-210
-149
-148
-214
-149
-149
-219
-150
-152
-227
-152
-155
-232
-152
-158
-236
-155
-161
-237
-155
-163
-235
-156
-165
-232
-152
-162
-223
-150
-159
-218
-149
-155
-213
-147
-153
-213
-147
-151
-214
-146
-147
-214
-145
-144
-210
-136
-131
-189
-148
-130
-182
-168
-124
-175
-184
-115
-162
-199
-102
-143
-207
-88
-120
-210
-72
-97
-208
-62
-75
-217
-68
-74
-218
-68
-67
-218
-69
-65
-220
-68
-65
-222
-66
-67
-225
-64
-69
-229
-62
-70
-229
-62
-70
-227
-63
-70
-214
-58
-62
-209
-63
-64
-209
-69
-68
-198
-65
-60
-186
-54
-49
-197
-62
-58
-234
-90
-89
-221
-65
-66
-227
-64
-67
-230
-61
-64
-227
-58
-61
-219
-56
-57
-211
-57
-55
-208
-60
-56
-206
-65
-56
-207
-69
-59
-194
-58
-46
-187
-50
-40
-192
-60
-47
-199
-69
-55
-196
-69
-54
-189
-62
-47
-184
-57
-40
-189
-56
-41
-194
-57
-41
-203
-56
-46
-210
-58
-47
-217
-56
-48
-224
-57
-49
-232
-59
-55
-235
-62
-56
-217
-48
-43
-218
-49
-42
-222
-51
-44
-224
-51
-44
-225
-52
-45
-225
-54
-46
-220
-56
-46
-217
-59
-47
-202
-54
-40
-199
-58
-41
-195
-59
-43
-192
-59
-44
-192
-58
-46
-195
-58
-48
-198
-59
-54
-208
-56
-53
-236
-67
-64
-237
-64
-60
-228
-64
-55
-217
-61
-49
-207
-57
-42
-199
-57
-37
-200
-58
-38
-201
-59
-37
-207
-60
-40
-208
-55
-39
-207
-49
-37
-209
-49
-37
-212
-49
-40
-214
-51
-44
-212
-49
-44
-209
-47
-42
-211
-50
-42
-211
-53
-44
-211
-55
-43
-208
-55
-41
-205
-53
-39
-202
-55
-37
-204
-59
-40
-204
-62
-42
-204
-59
-40
-207
-60
-44
-244
-94
-80
-224
-70
-60
-210
-51
-47
-210
-46
-44
-230
-64
-64
-251
-87
-88
-255
-117
-115
-255
-114
-111
-255
-106
-103
-246
-94
-89
-231
-80
-71
-213
-65
-55
-199
-53
-40
-189
-46
-32
-196
-56
-39
-192
-56
-40
-187
-56
-38
-184
-59
-41
-183
-60
-44
-181
-61
-45
-178
-61
-44
-176
-60
-45
-175
-59
-46
-173
-60
-46
-176
-60
-47
-176
-60
-45
-177
-59
-45
-182
-62
-46
-188
-66
-51
-192
-70
-55
-203
-77
-65
-223
-96
-87
-226
-97
-91
-244
-112
-108
-248
-116
-114
-230
-96
-97
-228
-93
-97
-232
-93
-100
-218
-70
-84
-234
-88
-101
-239
-105
-114
-236
-107
-111
-240
-104
-108
-249
-109
-112
-255
-113
-118
-255
-115
-118
-254
-111
-115
-248
-103
-110
-229
-74
-88
-229
-82
-98
-218
-93
-107
-230
-148
-150
-168
-145
-131
-106
-116
-89
-85
-106
-67
-83
-104
-63
-92
-103
-69
-121
-124
-95
-176
-170
-148
-231
-220
-202
-255
-245
-232
-255
-249
-240
-255
-249
-239
-252
-252
-242
-251
-254
-245
-250
-255
-249
-249
-255
-250
-246
-255
-248
-242
-252
-243
-234
-251
-235
-219
-247
-222
-208
-241
-210
-205
-234
-204
-209
-235
-206
-217
-237
-210
-223
-239
-213
-233
-243
-219
-242
-247
-225
-244
-246
-225
-249
-246
-227
-251
-246
-227
-244
-237
-219
-234
-227
-209
-231
-222
-205
-235
-226
-209
-240
-233
-217
-251
-244
-234
-251
-246
-240
-254
-249
-243
-92
-80
-66
-92
-80
-66
-91
-79
-65
-91
-79
-65
-90
-78
-64
-89
-77
-63
-89
-77
-63
-89
-77
-63
-87
-75
-61
-86
-74
-60
-85
-73
-59
-85
-73
-59
-84
-72
-58
-85
-73
-59
-85
-73
-59
-83
-73
-61
-79
-71
-60
-79
-73
-61
-81
-73
-60
-83
-76
-58
-85
-77
-56
-88
-77
-55
-89
-76
-57
-88
-76
-60
-85
-75
-65
-85
-75
-73
-92
-85
-93
-104
-101
-120
-117
-116
-147
-124
-126
-165
-133
-135
-183
-140
-143
-194
-141
-144
-195
-142
-145
-200
-142
-146
-207
-144
-148
-212
-146
-149
-220
-147
-151
-224
-148
-152
-223
-147
-154
-222
-149
-157
-220
-146
-155
-214
-142
-148
-206
-137
-144
-199
-133
-139
-197
-129
-135
-195
-126
-130
-193
-129
-125
-184
-128
-115
-159
-145
-110
-150
-170
-102
-143
-193
-92
-134
-214
-78
-118
-225
-65
-101
-229
-59
-85
-230
-59
-75
-226
-67
-71
-220
-71
-67
-216
-73
-65
-216
-73
-65
-220
-71
-67
-227
-66
-71
-236
-62
-72
-237
-61
-72
-230
-66
-73
-215
-62
-64
-208
-64
-63
-208
-73
-69
-191
-62
-56
-179
-50
-44
-200
-67
-60
-224
-85
-80
-220
-68
-67
-225
-65
-67
-227
-63
-64
-225
-62
-63
-218
-63
-61
-212
-64
-60
-209
-68
-59
-207
-70
-60
-199
-61
-50
-192
-56
-42
-189
-53
-41
-189
-57
-42
-191
-61
-45
-191
-61
-45
-189
-59
-43
-189
-60
-41
-194
-58
-42
-199
-59
-42
-207
-59
-47
-213
-59
-47
-219
-56
-47
-224
-56
-47
-231
-56
-51
-235
-57
-53
-231
-56
-53
-230
-52
-50
-229
-49
-48
-232
-50
-49
-233
-51
-50
-231
-52
-48
-222
-49
-43
-214
-47
-39
-205
-48
-39
-205
-54
-45
-201
-57
-48
-197
-54
-46
-194
-51
-45
-196
-51
-48
-206
-57
-59
-222
-62
-64
-235
-56
-59
-237
-55
-54
-228
-55
-49
-216
-53
-44
-204
-52
-38
-198
-53
-34
-196
-55
-35
-197
-58
-37
-203
-61
-41
-203
-56
-38
-204
-52
-38
-206
-53
-39
-212
-56
-44
-212
-58
-48
-211
-57
-47
-208
-56
-45
-208
-62
-49
-202
-59
-45
-197
-56
-39
-196
-55
-37
-198
-57
-39
-199
-60
-41
-199
-60
-41
-199
-58
-40
-205
-62
-45
-205
-58
-42
-216
-62
-50
-225
-67
-58
-212
-47
-45
-228
-58
-58
-224
-50
-52
-223
-53
-54
-215
-53
-51
-214
-59
-54
-222
-67
-62
-229
-75
-67
-234
-81
-73
-234
-83
-72
-232
-84
-72
-228
-85
-71
-203
-63
-48
-196
-63
-46
-190
-60
-44
-184
-61
-45
-183
-62
-45
-180
-63
-46
-176
-63
-47
-174
-62
-48
-172
-60
-46
-172
-60
-46
-172
-60
-46
-172
-61
-44
-173
-60
-44
-177
-61
-46
-183
-65
-51
-186
-68
-54
-198
-76
-65
-222
-98
-88
-226
-99
-93
-240
-110
-108
-244
-114
-114
-229
-96
-99
-229
-96
-101
-232
-95
-103
-251
-105
-118
-254
-109
-122
-241
-110
-118
-229
-100
-104
-234
-98
-102
-252
-109
-113
-255
-117
-123
-255
-118
-124
-254
-107
-115
-245
-95
-106
-232
-71
-87
-228
-75
-93
-221
-90
-104
-226
-137
-141
-172
-142
-131
-115
-121
-93
-93
-114
-73
-94
-117
-73
-104
-119
-80
-129
-136
-102
-179
-178
-150
-232
-226
-204
-255
-250
-233
-255
-253
-237
-254
-252
-237
-251
-255
-240
-249
-255
-242
-247
-255
-243
-244
-255
-241
-237
-251
-234
-227
-241
-224
-218
-237
-215
-201
-232
-200
-191
-227
-189
-187
-221
-186
-192
-222
-188
-200
-224
-192
-207
-226
-196
-217
-230
-204
-227
-235
-211
-235
-239
-216
-243
-242
-222
-247
-242
-223
-242
-235
-217
-234
-225
-210
-231
-219
-205
-233
-221
-207
-238
-226
-214
-241
-231
-222
-240
-231
-224
-242
-233
-226
-91
-79
-65
-91
-79
-65
-91
-79
-65
-90
-78
-64
-90
-78
-64
-89
-77
-63
-89
-77
-63
-89
-77
-63
-88
-76
-62
-88
-76
-62
-87
-75
-61
-86
-74
-60
-86
-74
-60
-87
-75
-61
-87
-75
-61
-88
-76
-62
-81
-73
-62
-81
-73
-62
-83
-75
-62
-85
-76
-59
-88
-77
-57
-88
-77
-55
-89
-76
-57
-88
-77
-59
-87
-75
-63
-85
-76
-71
-89
-83
-87
-101
-94
-110
-110
-106
-131
-117
-116
-150
-126
-125
-165
-131
-134
-177
-133
-138
-180
-132
-139
-185
-135
-141
-193
-137
-142
-200
-139
-143
-207
-140
-143
-212
-141
-144
-213
-141
-144
-211
-144
-148
-211
-139
-144
-202
-131
-136
-192
-126
-129
-184
-120
-123
-178
-114
-116
-173
-108
-110
-171
-111
-104
-156
-131
-105
-140
-148
-98
-123
-175
-88
-120
-203
-79
-113
-227
-65
-102
-239
-56
-87
-243
-53
-78
-244
-58
-72
-235
-66
-69
-225
-72
-66
-217
-76
-66
-215
-77
-66
-222
-73
-69
-229
-69
-71
-240
-63
-73
-240
-62
-74
-228
-67
-72
-215
-67
-67
-204
-65
-62
-206
-73
-68
-186
-59
-52
-176
-52
-44
-201
-73
-64
-213
-76
-70
-216
-66
-65
-218
-63
-61
-219
-59
-59
-218
-60
-59
-216
-64
-61
-212
-69
-63
-205
-71
-60
-203
-71
-58
-192
-56
-42
-193
-56
-40
-192
-56
-42
-190
-57
-40
-188
-57
-39
-187
-56
-38
-189
-58
-40
-192
-59
-40
-196
-59
-41
-202
-61
-44
-210
-60
-46
-215
-59
-46
-220
-56
-46
-225
-54
-46
-228
-54
-47
-232
-53
-48
-234
-50
-50
-234
-46
-47
-234
-43
-48
-240
-47
-50
-246
-51
-55
-247
-54
-55
-240
-52
-53
-230
-50
-49
-219
-46
-42
-216
-51
-47
-215
-53
-50
-210
-50
-50
-209
-46
-49
-211
-46
-52
-220
-53
-61
-235
-58
-68
-237
-48
-54
-238
-48
-50
-230
-51
-47
-220
-51
-44
-209
-53
-41
-202
-55
-39
-200
-57
-40
-201
-60
-40
-198
-56
-36
-201
-54
-36
-206
-54
-40
-211
-58
-44
-218
-62
-50
-221
-65
-53
-221
-65
-53
-216
-65
-54
-211
-71
-56
-201
-65
-49
-194
-59
-40
-192
-57
-38
-195
-60
-41
-198
-61
-42
-197
-60
-42
-197
-56
-38
-204
-58
-43
-205
-55
-41
-205
-48
-39
-230
-67
-60
-219
-50
-47
-239
-63
-65
-227
-47
-50
-218
-42
-44
-213
-49
-47
-210
-53
-46
-213
-56
-49
-214
-57
-48
-210
-56
-46
-204
-53
-42
-198
-50
-38
-192
-49
-35
-206
-69
-53
-198
-65
-50
-188
-61
-46
-181
-58
-42
-177
-57
-41
-175
-57
-43
-171
-58
-44
-170
-58
-44
-171
-59
-47
-171
-61
-48
-172
-62
-47
-172
-60
-46
-171
-60
-43
-173
-60
-44
-178
-62
-47
-181
-65
-50
-201
-83
-71
-224
-103
-94
-224
-99
-95
-234
-106
-105
-238
-110
-111
-230
-99
-104
-240
-106
-113
-246
-110
-120
-255
-110
-123
-255
-114
-126
-241
-112
-117
-231
-102
-107
-240
-103
-110
-255
-116
-122
-255
-117
-126
-255
-110
-117
-253
-103
-112
-244
-90
-102
-237
-72
-89
-229
-72
-91
-222
-87
-102
-220
-128
-131
-180
-146
-134
-133
-136
-107
-113
-134
-93
-111
-137
-90
-121
-138
-96
-141
-151
-114
-182
-183
-152
-223
-222
-194
-249
-244
-222
-252
-250
-229
-255
-255
-239
-250
-255
-238
-244
-255
-238
-238
-255
-234
-230
-249
-227
-220
-239
-217
-208
-227
-205
-197
-222
-193
-178
-213
-173
-172
-211
-167
-172
-209
-168
-178
-210
-171
-185
-213
-175
-190
-214
-178
-201
-218
-186
-210
-223
-193
-224
-230
-204
-232
-234
-212
-240
-237
-218
-241
-234
-216
-236
-227
-212
-233
-221
-209
-232
-218
-207
-234
-220
-211
-232
-219
-211
-230
-217
-211
-229
-216
-210
-91
-78
-62
-91
-78
-62
-91
-78
-62
-91
-78
-62
-90
-77
-61
-90
-77
-61
-90
-77
-61
-90
-77
-61
-89
-76
-60
-89
-76
-60
-88
-75
-59
-88
-75
-59
-88
-75
-59
-89
-76
-60
-89
-76
-60
-89
-77
-63
-83
-73
-63
-84
-74
-62
-85
-76
-61
-88
-76
-60
-89
-78
-58
-90
-77
-58
-90
-77
-58
-89
-78
-60
-89
-77
-63
-85
-76
-69
-88
-79
-82
-95
-87
-98
-100
-95
-115
-106
-102
-129
-115
-111
-144
-121
-121
-157
-122
-128
-164
-122
-130
-169
-127
-131
-178
-130
-133
-188
-133
-134
-198
-135
-136
-203
-136
-137
-204
-136
-137
-202
-136
-136
-200
-131
-131
-191
-125
-124
-181
-121
-118
-173
-115
-112
-167
-110
-107
-164
-105
-101
-160
-111
-95
-142
-132
-94
-117
-151
-85
-97
-179
-78
-96
-210
-74
-98
-236
-64
-90
-246
-54
-79
-251
-52
-71
-252
-58
-69
-240
-64
-64
-231
-70
-62
-222
-74
-64
-219
-75
-66
-224
-72
-69
-231
-68
-71
-240
-63
-73
-239
-63
-74
-221
-65
-68
-212
-70
-68
-200
-65
-61
-201
-72
-66
-180
-58
-47
-177
-55
-44
-206
-79
-70
-201
-66
-60
-206
-61
-56
-208
-54
-52
-207
-49
-48
-208
-53
-49
-211
-62
-56
-207
-69
-59
-200
-70
-57
-195
-68
-53
-190
-57
-40
-195
-58
-40
-194
-58
-42
-191
-58
-39
-189
-56
-37
-190
-57
-38
-191
-58
-39
-193
-58
-38
-196
-57
-38
-203
-58
-41
-211
-58
-44
-217
-57
-43
-221
-55
-43
-225
-53
-43
-228
-51
-43
-234
-51
-45
-235
-42
-43
-241
-42
-45
-248
-45
-51
-253
-46
-52
-255
-49
-55
-255
-50
-55
-255
-51
-56
-253
-53
-56
-250
-55
-59
-246
-55
-60
-243
-57
-62
-243
-56
-65
-246
-56
-68
-247
-55
-70
-252
-53
-72
-254
-53
-69
-246
-42
-53
-244
-45
-50
-237
-49
-50
-227
-52
-47
-217
-54
-45
-208
-56
-42
-206
-59
-43
-206
-61
-44
-203
-53
-38
-209
-56
-42
-217
-59
-47
-223
-61
-50
-226
-62
-52
-228
-61
-52
-229
-62
-53
-223
-65
-54
-217
-74
-60
-207
-71
-55
-201
-65
-49
-196
-60
-44
-194
-57
-41
-194
-57
-39
-198
-56
-42
-200
-57
-41
-201
-50
-39
-211
-57
-47
-225
-64
-56
-235
-68
-62
-222
-48
-47
-224
-46
-46
-235
-52
-54
-232
-54
-54
-216
-51
-45
-213
-55
-46
-215
-57
-48
-215
-58
-49
-213
-59
-49
-210
-59
-48
-205
-58
-48
-201
-59
-47
-214
-76
-63
-204
-70
-58
-191
-64
-49
-180
-57
-42
-176
-54
-41
-172
-54
-40
-171
-55
-42
-169
-56
-42
-172
-59
-45
-173
-61
-47
-174
-62
-48
-173
-61
-47
-171
-60
-43
-171
-60
-43
-173
-60
-46
-177
-61
-48
-192
-75
-65
-218
-100
-90
-222
-99
-94
-232
-107
-105
-240
-111
-115
-234
-105
-110
-245
-114
-122
-253
-117
-127
-241
-101
-112
-248
-111
-121
-245
-116
-121
-237
-111
-115
-248
-111
-118
-255
-120
-127
-255
-116
-125
-255
-101
-111
-252
-98
-110
-242
-84
-98
-241
-72
-91
-231
-68
-89
-222
-81
-97
-217
-118
-123
-189
-149
-137
-152
-153
-122
-129
-150
-107
-123
-151
-102
-130
-149
-104
-145
-157
-117
-172
-178
-142
-203
-204
-173
-224
-224
-196
-233
-236
-209
-236
-244
-220
-227
-241
-215
-215
-235
-207
-205
-228
-199
-196
-221
-191
-187
-212
-182
-180
-203
-174
-172
-199
-164
-156
-193
-149
-152
-194
-144
-156
-195
-148
-163
-201
-154
-170
-203
-158
-175
-203
-162
-184
-206
-168
-194
-211
-177
-206
-217
-187
-216
-222
-196
-228
-227
-206
-235
-229
-213
-236
-226
-214
-233
-219
-210
-229
-212
-205
-226
-209
-202
-223
-205
-201
-218
-203
-198
-213
-198
-193
-91
-78
-62
-90
-77
-61
-90
-77
-61
-90
-77
-61
-90
-77
-61
-90
-77
-61
-89
-76
-60
-89
-76
-60
-90
-77
-61
-89
-76
-60
-89
-76
-60
-88
-75
-59
-88
-75
-59
-89
-76
-60
-90
-77
-61
-90
-76
-63
-86
-74
-62
-86
-74
-62
-88
-76
-62
-89
-78
-60
-90
-77
-60
-90
-77
-58
-90
-77
-58
-90
-77
-60
-91
-79
-65
-87
-77
-68
-87
-77
-76
-92
-82
-90
-94
-88
-102
-98
-93
-113
-106
-102
-127
-113
-113
-141
-116
-119
-150
-116
-122
-156
-120
-125
-167
-125
-128
-181
-129
-129
-191
-132
-131
-197
-133
-132
-200
-135
-132
-199
-130
-125
-191
-127
-121
-183
-125
-116
-173
-122
-111
-167
-122
-109
-165
-120
-105
-162
-116
-101
-160
-124
-95
-141
-133
-79
-93
-152
-72
-75
-178
-69
-75
-211
-71
-82
-237
-66
-82
-246
-58
-73
-252
-54
-67
-253
-58
-64
-244
-62
-61
-235
-66
-59
-228
-69
-63
-225
-70
-65
-227
-69
-66
-230
-67
-70
-237
-63
-72
-234
-64
-73
-214
-64
-65
-209
-71
-68
-197
-65
-60
-195
-71
-63
-178
-57
-46
-179
-58
-47
-209
-85
-75
-195
-62
-53
-201
-56
-51
-199
-47
-44
-197
-42
-38
-200
-47
-42
-205
-58
-51
-204
-67
-57
-195
-67
-54
-188
-62
-47
-192
-59
-42
-196
-59
-41
-195
-60
-41
-193
-58
-39
-194
-59
-40
-195
-60
-41
-194
-59
-39
-195
-56
-37
-196
-53
-36
-202
-55
-37
-212
-56
-41
-217
-55
-42
-221
-53
-42
-225
-51
-42
-229
-51
-41
-234
-50
-42
-245
-51
-51
-254
-54
-56
-255
-56
-60
-255
-52
-58
-255
-45
-50
-255
-40
-45
-255
-40
-45
-254
-43
-49
-254
-45
-51
-246
-41
-48
-242
-38
-49
-247
-41
-54
-255
-44
-63
-255
-42
-65
-252
-32
-57
-244
-25
-47
-246
-34
-48
-243
-40
-46
-237
-44
-49
-230
-48
-47
-218
-49
-44
-212
-51
-43
-209
-53
-41
-208
-54
-42
-212
-54
-43
-221
-57
-48
-230
-61
-54
-235
-62
-55
-235
-58
-52
-232
-55
-49
-232
-53
-48
-226
-57
-50
-223
-72
-61
-215
-75
-60
-211
-69
-55
-203
-61
-47
-196
-54
-40
-194
-51
-37
-200
-54
-41
-207
-56
-45
-206
-52
-42
-212
-54
-45
-230
-67
-60
-223
-56
-50
-224
-50
-49
-210
-32
-32
-236
-56
-57
-229
-54
-51
-213
-49
-40
-210
-52
-41
-210
-52
-41
-207
-53
-41
-206
-54
-43
-202
-54
-42
-200
-53
-43
-197
-55
-43
-227
-89
-78
-216
-82
-70
-202
-72
-59
-190
-64
-50
-183
-59
-47
-181
-59
-46
-181
-60
-49
-181
-60
-49
-175
-57
-45
-177
-59
-47
-177
-61
-48
-177
-61
-46
-175
-59
-44
-173
-57
-42
-173
-57
-44
-174
-58
-45
-177
-60
-50
-208
-89
-81
-220
-98
-93
-236
-112
-112
-244
-118
-121
-238
-109
-114
-245
-113
-124
-248
-114
-125
-255
-121
-131
-255
-127
-137
-250
-124
-128
-235
-109
-113
-241
-104
-112
-255
-114
-124
-255
-115
-127
-255
-105
-116
-250
-92
-106
-243
-80
-97
-245
-71
-94
-232
-64
-87
-220
-78
-94
-215
-112
-116
-196
-152
-139
-164
-163
-132
-134
-156
-110
-126
-154
-103
-129
-151
-104
-141
-156
-113
-161
-169
-130
-180
-186
-150
-200
-205
-173
-213
-220
-189
-202
-215
-185
-191
-210
-178
-176
-202
-167
-166
-193
-158
-157
-187
-151
-154
-182
-144
-150
-178
-140
-145
-176
-134
-140
-180
-130
-138
-181
-127
-143
-186
-133
-152
-192
-140
-158
-195
-144
-162
-196
-146
-170
-197
-154
-179
-201
-162
-190
-206
-170
-201
-210
-181
-216
-218
-196
-227
-224
-205
-232
-222
-210
-230
-216
-207
-223
-205
-201
-218
-199
-195
-211
-193
-189
-206
-188
-184
-200
-182
-180
-90
-77
-61
-90
-77
-61
-90
-77
-61
-90
-77
-61
-90
-77
-61
-90
-77
-61
-90
-77
-61
-90
-77
-61
-88
-75
-59
-88
-75
-59
-88
-75
-59
-89
-76
-60
-89
-76
-60
-90
-77
-61
-90
-77
-61
-90
-77
-61
-90
-76
-63
-90
-76
-63
-90
-77
-61
-91
-78
-61
-93
-77
-61
-94
-79
-60
-92
-79
-60
-92
-79
-62
-89
-77
-61
-87
-77
-67
-87
-76
-72
-88
-78
-79
-90
-80
-88
-93
-85
-98
-96
-89
-105
-96
-93
-114
-103
-103
-129
-106
-109
-142
-112
-114
-155
-114
-116
-167
-120
-119
-179
-129
-126
-193
-137
-131
-201
-138
-131
-199
-137
-126
-192
-140
-126
-188
-138
-120
-178
-135
-112
-168
-139
-112
-167
-145
-114
-171
-139
-106
-163
-137
-90
-132
-143
-71
-82
-161
-66
-60
-179
-65
-64
-202
-68
-67
-220
-64
-67
-231
-58
-62
-243
-60
-62
-254
-68
-69
-246
-62
-60
-241
-62
-58
-236
-62
-61
-233
-65
-64
-233
-67
-67
-233
-68
-72
-233
-66
-73
-226
-67
-72
-207
-63
-62
-197
-64
-57
-190
-63
-54
-183
-62
-51
-176
-60
-47
-178
-60
-48
-192
-68
-56
-210
-77
-68
-199
-54
-49
-212
-59
-54
-205
-50
-46
-204
-51
-46
-214
-67
-59
-199
-63
-51
-181
-54
-39
-187
-62
-44
-186
-55
-37
-193
-58
-39
-195
-60
-41
-194
-59
-40
-192
-57
-37
-194
-57
-38
-197
-58
-39
-199
-58
-40
-203
-58
-39
-208
-57
-40
-214
-54
-40
-216
-50
-36
-218
-46
-34
-224
-47
-37
-236
-55
-46
-245
-61
-53
-246
-57
-51
-247
-54
-49
-248
-49
-46
-249
-43
-43
-250
-40
-41
-252
-38
-40
-252
-38
-40
-252
-38
-40
-251
-38
-42
-247
-33
-41
-248
-34
-46
-255
-39
-55
-255
-41
-62
-255
-33
-59
-255
-24
-54
-255
-23
-49
-254
-37
-54
-238
-34
-43
-229
-34
-42
-227
-43
-45
-221
-45
-45
-211
-42
-39
-209
-44
-40
-218
-50
-47
-226
-54
-50
-232
-54
-52
-238
-54
-54
-242
-54
-53
-242
-49
-50
-239
-46
-47
-238
-44
-44
-229
-47
-44
-220
-57
-50
-209
-58
-49
-210
-57
-49
-236
-83
-75
-187
-34
-26
-196
-43
-35
-223
-70
-62
-200
-46
-38
-205
-46
-40
-222
-60
-55
-232
-69
-64
-226
-58
-55
-216
-47
-42
-218
-46
-42
-226
-53
-49
-229
-60
-55
-223
-62
-52
-213
-60
-46
-207
-53
-41
-203
-51
-38
-204
-53
-42
-205
-59
-46
-203
-59
-48
-197
-56
-46
-236
-98
-88
-224
-90
-79
-200
-67
-58
-185
-54
-44
-186
-58
-47
-184
-56
-45
-177
-51
-39
-180
-54
-42
-176
-48
-37
-176
-50
-38
-174
-50
-38
-175
-52
-37
-176
-54
-39
-178
-58
-42
-180
-60
-46
-179
-61
-49
-176
-58
-48
-186
-67
-59
-214
-92
-87
-236
-112
-112
-241
-115
-118
-246
-120
-124
-251
-121
-131
-245
-113
-124
-255
-122
-132
-253
-119
-128
-242
-117
-123
-244
-118
-122
-253
-116
-124
-255
-114
-124
-255
-107
-120
-255
-100
-115
-255
-94
-110
-241
-74
-92
-245
-69
-92
-239
-70
-91
-217
-70
-86
-208
-103
-107
-190
-144
-128
-158
-155
-122
-134
-156
-109
-125
-153
-102
-126
-148
-99
-135
-151
-106
-148
-159
-119
-158
-166
-129
-160
-168
-131
-156
-168
-132
-146
-163
-127
-138
-163
-124
-128
-159
-118
-122
-154
-113
-121
-154
-111
-124
-157
-114
-129
-160
-118
-131
-164
-117
-132
-172
-119
-134
-177
-121
-140
-183
-127
-147
-188
-132
-149
-190
-134
-152
-189
-135
-157
-189
-140
-162
-189
-144
-167
-188
-147
-175
-189
-154
-189
-195
-167
-206
-205
-185
-220
-212
-199
-224
-211
-202
-218
-200
-196
-211
-192
-188
-203
-185
-183
-192
-177
-174
-184
-168
-168
-90
-77
-61
-90
-77
-61
-90
-77
-61
-90
-77
-61
-90
-77
-61
-90
-77
-61
-90
-77
-61
-90
-77
-61
-88
-75
-59
-88
-75
-59
-88
-75
-59
-89
-76
-60
-89
-76
-60
-90
-77
-61
-90
-77
-61
-90
-77
-61
-90
-76
-63
-90
-77
-61
-92
-76
-61
-93
-77
-61
-93
-78
-59
-94
-79
-60
-92
-79
-60
-92
-79
-62
-93
-80
-64
-91
-79
-67
-91
-78
-70
-89
-78
-74
-90
-80
-81
-92
-83
-88
-95
-85
-94
-94
-88
-102
-97
-93
-116
-101
-100
-131
-107
-105
-145
-110
-108
-157
-117
-113
-172
-127
-122
-188
-135
-128
-196
-139
-128
-196
-143
-128
-193
-145
-125
-186
-143
-116
-171
-143
-108
-162
-154
-111
-164
-165
-115
-168
-158
-103
-158
-154
-86
-125
-156
-61
-69
-166
-55
-46
-175
-54
-46
-192
-61
-53
-208
-65
-59
-218
-63
-58
-231
-64
-58
-243
-65
-61
-245
-61
-61
-245
-59
-60
-244
-60
-62
-241
-62
-65
-236
-66
-69
-231
-66
-70
-225
-66
-70
-216
-66
-67
-199
-60
-55
-189
-61
-52
-182
-60
-49
-177
-59
-47
-171
-58
-44
-174
-58
-43
-189
-65
-53
-208
-74
-65
-218
-71
-64
-220
-65
-61
-212
-54
-51
-208
-53
-49
-213
-64
-57
-205
-67
-56
-187
-57
-43
-178
-53
-35
-189
-56
-39
-194
-59
-40
-196
-61
-42
-196
-61
-42
-196
-59
-40
-198
-59
-40
-199
-58
-40
-202
-57
-40
-207
-57
-40
-207
-54
-38
-212
-50
-37
-218
-50
-37
-227
-53
-42
-234
-56
-46
-239
-56
-48
-240
-57
-49
-231
-50
-39
-231
-49
-38
-235
-47
-38
-240
-45
-39
-246
-44
-40
-250
-45
-42
-254
-46
-44
-255
-46
-47
-251
-42
-45
-248
-37
-43
-250
-36
-46
-255
-39
-55
-255
-37
-59
-255
-29
-55
-255
-20
-51
-252
-19
-48
-244
-29
-47
-245
-45
-56
-244
-50
-59
-228
-41
-48
-218
-39
-43
-219
-45
-47
-221
-47
-49
-218
-42
-45
-241
-58
-62
-244
-55
-61
-247
-52
-58
-246
-50
-54
-246
-47
-52
-248
-48
-51
-249
-50
-53
-244
-56
-55
-219
-50
-45
-218
-59
-53
-215
-56
-50
-228
-69
-63
-228
-69
-63
-206
-47
-43
-209
-50
-46
-193
-34
-30
-212
-53
-49
-225
-63
-58
-232
-69
-64
-224
-61
-56
-216
-51
-45
-217
-50
-44
-221
-54
-48
-221
-58
-49
-212
-58
-46
-207
-57
-42
-201
-53
-39
-199
-53
-40
-200
-57
-43
-202
-60
-48
-202
-60
-50
-198
-57
-47
-237
-99
-89
-225
-88
-78
-201
-64
-56
-186
-52
-43
-194
-57
-49
-195
-58
-48
-191
-54
-44
-194
-57
-47
-191
-53
-43
-190
-52
-42
-189
-52
-42
-187
-53
-41
-184
-54
-41
-181
-53
-40
-180
-54
-40
-176
-54
-41
-180
-59
-48
-187
-66
-57
-211
-89
-84
-232
-108
-106
-239
-113
-116
-246
-120
-124
-254
-124
-132
-249
-117
-128
-255
-122
-132
-253
-119
-128
-244
-119
-125
-245
-118
-125
-254
-117
-125
-255
-111
-123
-255
-104
-118
-255
-97
-113
-255
-93
-110
-242
-75
-93
-246
-68
-92
-242
-70
-92
-221
-73
-89
-208
-102
-104
-183
-138
-119
-149
-146
-111
-127
-147
-98
-117
-146
-92
-120
-142
-93
-127
-144
-99
-138
-149
-107
-141
-152
-112
-139
-149
-112
-133
-148
-109
-112
-135
-93
-108
-137
-93
-104
-137
-92
-103
-141
-94
-107
-143
-95
-113
-149
-101
-121
-155
-105
-124
-158
-107
-132
-171
-116
-133
-177
-118
-139
-183
-124
-142
-186
-125
-146
-187
-127
-148
-187
-130
-151
-188
-134
-155
-187
-137
-155
-181
-134
-161
-179
-139
-172
-183
-151
-188
-190
-168
-205
-199
-183
-213
-200
-191
-212
-195
-188
-206
-188
-186
-197
-181
-181
-186
-172
-172
-177
-163
-163
-92
-76
-60
-92
-76
-60
-92
-76
-60
-92
-76
-60
-92
-76
-60
-92
-76
-60
-92
-76
-60
-92
-76
-60
-90
-74
-58
-90
-74
-58
-90
-74
-58
-91
-75
-59
-91
-75
-59
-92
-76
-60
-92
-76
-60
-92
-76
-60
-92
-76
-61
-92
-76
-61
-93
-75
-61
-93
-77
-61
-93
-78
-59
-94
-79
-60
-94
-79
-60
-92
-79
-60
-95
-82
-65
-93
-81
-65
-92
-80
-68
-91
-78
-70
-90
-79
-75
-91
-80
-78
-93
-81
-83
-92
-82
-90
-93
-84
-103
-98
-89
-118
-101
-95
-133
-105
-99
-145
-113
-108
-164
-125
-119
-181
-132
-126
-190
-137
-125
-189
-152
-132
-193
-155
-128
-183
-156
-118
-169
-160
-111
-158
-177
-115
-162
-189
-117
-165
-183
-104
-152
-177
-81
-118
-181
-61
-70
-186
-54
-49
-182
-54
-45
-189
-61
-50
-200
-68
-56
-210
-69
-59
-219
-66
-58
-228
-63
-57
-241
-61
-62
-247
-58
-62
-249
-58
-63
-247
-61
-66
-239
-64
-69
-229
-66
-69
-215
-65
-66
-205
-66
-63
-192
-59
-52
-184
-57
-48
-177
-57
-43
-173
-57
-42
-169
-56
-40
-173
-57
-42
-187
-63
-51
-207
-70
-60
-217
-68
-62
-215
-57
-54
-217
-55
-52
-218
-59
-55
-220
-67
-61
-221
-79
-69
-206
-72
-60
-181
-51
-35
-190
-57
-40
-193
-58
-39
-196
-59
-41
-198
-61
-43
-201
-61
-44
-200
-60
-43
-201
-58
-41
-204
-57
-41
-207
-55
-41
-207
-50
-35
-211
-47
-35
-223
-52
-42
-238
-61
-51
-244
-63
-54
-241
-57
-49
-233
-52
-43
-224
-54
-39
-221
-54
-38
-226
-50
-37
-230
-48
-37
-234
-46
-37
-238
-45
-38
-239
-44
-40
-242
-44
-41
-242
-44
-45
-239
-40
-43
-240
-39
-47
-247
-41
-54
-253
-37
-58
-252
-30
-55
-251
-22
-51
-248
-24
-51
-244
-37
-55
-241
-47
-58
-242
-52
-64
-239
-53
-64
-238
-57
-66
-238
-58
-67
-233
-53
-62
-229
-45
-55
-240
-50
-60
-243
-47
-59
-246
-46
-57
-246
-45
-55
-245
-46
-51
-245
-46
-49
-243
-47
-49
-237
-52
-50
-220
-48
-44
-226
-61
-57
-218
-54
-52
-223
-59
-57
-255
-109
-106
-229
-67
-65
-209
-47
-45
-206
-47
-44
-217
-58
-55
-223
-64
-60
-224
-65
-59
-219
-60
-54
-213
-55
-46
-214
-53
-45
-214
-53
-43
-210
-54
-42
-200
-54
-39
-195
-54
-37
-194
-54
-39
-196
-56
-41
-197
-59
-46
-198
-60
-49
-198
-60
-49
-197
-59
-49
-235
-96
-89
-225
-84
-77
-201
-60
-51
-191
-48
-40
-203
-59
-51
-209
-62
-54
-206
-59
-51
-210
-61
-54
-216
-61
-56
-215
-60
-55
-212
-61
-54
-207
-60
-50
-201
-59
-49
-195
-57
-46
-188
-54
-42
-182
-54
-41
-185
-59
-47
-188
-64
-54
-207
-84
-77
-227
-103
-101
-237
-111
-114
-248
-122
-126
-255
-129
-136
-253
-123
-131
-255
-122
-131
-252
-121
-129
-245
-122
-127
-246
-121
-127
-254
-117
-127
-255
-110
-124
-255
-99
-117
-255
-92
-111
-255
-89
-109
-242
-73
-94
-245
-65
-90
-242
-70
-92
-224
-76
-90
-203
-97
-97
-167
-122
-101
-130
-128
-90
-110
-130
-81
-104
-133
-79
-109
-131
-82
-116
-133
-88
-123
-136
-93
-125
-136
-94
-120
-132
-92
-113
-130
-88
-96
-122
-77
-95
-127
-80
-97
-133
-85
-101
-141
-89
-110
-149
-96
-117
-156
-103
-125
-160
-106
-128
-163
-109
-132
-171
-114
-135
-176
-116
-139
-180
-120
-142
-184
-121
-140
-184
-121
-143
-185
-122
-146
-186
-126
-148
-186
-129
-147
-177
-127
-149
-172
-128
-154
-170
-134
-168
-174
-146
-184
-181
-162
-196
-186
-174
-200
-185
-178
-198
-183
-180
-183
-171
-173
-169
-160
-165
-159
-150
-155
-91
-75
-59
-91
-75
-59
-91
-75
-59
-91
-75
-59
-91
-75
-59
-91
-75
-59
-91
-75
-59
-91
-75
-59
-90
-74
-58
-90
-74
-58
-90
-74
-58
-91
-75
-59
-91
-75
-59
-92
-76
-60
-92
-76
-60
-92
-76
-60
-93
-75
-61
-93
-75
-61
-93
-76
-60
-94
-77
-61
-94
-77
-59
-94
-79
-60
-94
-79
-60
-94
-79
-60
-94
-81
-64
-94
-81
-64
-93
-79
-66
-91
-79
-67
-92
-78
-69
-91
-78
-70
-92
-79
-73
-91
-79
-79
-94
-80
-95
-98
-84
-109
-100
-89
-123
-103
-94
-137
-111
-104
-156
-122
-117
-173
-132
-124
-183
-136
-123
-179
-155
-132
-186
-166
-133
-180
-175
-128
-170
-184
-122
-161
-200
-120
-159
-211
-116
-156
-204
-99
-140
-198
-77
-108
-216
-72
-82
-217
-67
-66
-209
-67
-63
-203
-70
-61
-201
-73
-60
-204
-72
-59
-211
-69
-59
-222
-65
-60
-238
-64
-65
-245
-60
-65
-251
-60
-68
-249
-62
-69
-240
-65
-72
-226
-66
-68
-209
-65
-64
-197
-64
-59
-191
-63
-54
-182
-60
-49
-175
-57
-43
-171
-58
-42
-170
-57
-41
-174
-56
-42
-188
-62
-48
-206
-68
-58
-213
-60
-55
-213
-51
-49
-224
-59
-57
-229
-65
-63
-225
-68
-63
-232
-83
-76
-223
-85
-74
-191
-58
-43
-193
-57
-41
-190
-55
-36
-192
-55
-37
-196
-59
-41
-201
-61
-44
-202
-61
-44
-203
-57
-42
-206
-56
-41
-205
-52
-38
-210
-50
-38
-217
-50
-41
-229
-57
-47
-241
-62
-55
-245
-62
-54
-240
-53
-46
-228
-47
-38
-222
-54
-41
-221
-55
-41
-224
-52
-42
-228
-50
-40
-231
-46
-41
-233
-46
-41
-236
-44
-41
-236
-44
-43
-232
-42
-44
-230
-39
-44
-234
-40
-49
-240
-42
-57
-245
-39
-60
-246
-34
-59
-250
-31
-61
-251
-37
-65
-253
-56
-74
-228
-40
-54
-229
-44
-58
-255
-77
-89
-255
-93
-105
-255
-78
-90
-242
-60
-73
-244
-58
-72
-232
-41
-56
-237
-42
-56
-241
-45
-57
-244
-48
-58
-241
-50
-55
-234
-48
-49
-225
-43
-42
-215
-40
-37
-216
-48
-45
-218
-55
-50
-212
-50
-47
-229
-67
-64
-255
-115
-112
-245
-86
-83
-221
-62
-59
-229
-71
-68
-219
-61
-58
-218
-60
-57
-213
-58
-53
-210
-56
-48
-209
-55
-45
-208
-54
-42
-205
-52
-38
-198
-51
-35
-190
-53
-35
-185
-54
-36
-187
-56
-38
-191
-59
-44
-192
-60
-47
-191
-57
-45
-192
-58
-47
-197
-60
-50
-229
-88
-81
-220
-77
-71
-202
-55
-48
-199
-48
-41
-215
-60
-55
-222
-65
-58
-218
-59
-53
-223
-60
-53
-231
-62
-57
-233
-61
-57
-230
-63
-57
-225
-64
-56
-217
-63
-53
-208
-60
-50
-200
-58
-46
-193
-57
-45
-187
-57
-44
-187
-61
-49
-203
-78
-72
-224
-99
-95
-236
-110
-111
-250
-124
-127
-255
-132
-136
-255
-125
-133
-252
-118
-127
-250
-119
-127
-245
-122
-127
-247
-122
-128
-255
-118
-128
-255
-109
-123
-255
-98
-116
-254
-91
-110
-250
-84
-104
-240
-71
-92
-241
-61
-86
-240
-68
-90
-225
-79
-92
-195
-91
-90
-146
-104
-82
-111
-109
-71
-95
-115
-66
-92
-121
-67
-100
-122
-73
-108
-125
-80
-116
-129
-86
-118
-131
-88
-114
-129
-88
-111
-129
-87
-109
-135
-90
-108
-142
-92
-111
-149
-98
-117
-157
-104
-123
-164
-108
-129
-168
-111
-132
-170
-113
-135
-170
-112
-134
-172
-113
-136
-176
-116
-139
-179
-117
-140
-182
-118
-138
-183
-118
-138
-183
-118
-139
-184
-119
-144
-184
-122
-145
-180
-124
-143
-171
-123
-144
-165
-124
-154
-165
-133
-170
-172
-150
-187
-180
-164
-197
-184
-175
-198
-184
-181
-177
-171
-175
-161
-158
-165
-151
-146
-153
-91
-75
-59
-91
-75
-59
-91
-75
-59
-91
-75
-59
-91
-75
-59
-91
-75
-59
-91
-75
-59
-91
-75
-59
-90
-74
-58
-90
-74
-58
-90
-74
-58
-91
-75
-59
-91
-75
-59
-92
-76
-60
-92
-76
-60
-92
-76
-60
-93
-76
-60
-94
-75
-60
-94
-75
-60
-94
-77
-61
-94
-77
-59
-95
-78
-60
-94
-79
-60
-94
-79
-60
-94
-79
-60
-94
-78
-62
-94
-78
-62
-92
-79
-63
-94
-78
-65
-93
-79
-66
-94
-80
-69
-94
-79
-74
-98
-78
-89
-99
-80
-100
-99
-84
-113
-101
-89
-125
-108
-101
-145
-120
-114
-162
-127
-119
-168
-131
-118
-164
-148
-125
-167
-172
-134
-171
-194
-137
-169
-206
-130
-158
-218
-119
-148
-223
-108
-137
-218
-89
-119
-216
-69
-95
-236
-70
-84
-242
-73
-78
-233
-77
-78
-219
-76
-72
-205
-71
-62
-202
-69
-60
-210
-69
-62
-219
-67
-62
-234
-66
-66
-242
-63
-67
-248
-63
-71
-246
-65
-74
-237
-68
-73
-222
-68
-70
-205
-66
-63
-192
-63
-57
-189
-65
-55
-181
-61
-47
-174
-58
-43
-171
-58
-42
-170
-57
-41
-174
-56
-42
-187
-59
-46
-204
-63
-54
-225
-70
-65
-226
-61
-59
-238
-66
-66
-235
-65
-65
-222
-59
-54
-227
-74
-66
-230
-88
-76
-213
-75
-62
-200
-64
-50
-192
-56
-40
-188
-51
-35
-193
-56
-40
-200
-60
-45
-201
-58
-42
-203
-55
-41
-208
-56
-43
-206
-48
-37
-215
-51
-41
-224
-56
-47
-233
-59
-52
-237
-58
-53
-237
-54
-48
-235
-48
-43
-229
-44
-39
-223
-48
-43
-223
-50
-44
-229
-49
-48
-235
-50
-48
-241
-51
-53
-244
-51
-54
-246
-53
-56
-244
-53
-58
-235
-46
-53
-232
-45
-54
-235
-47
-61
-240
-49
-67
-242
-46
-70
-245
-42
-71
-252
-44
-78
-255
-52
-82
-245
-58
-77
-229
-51
-63
-238
-62
-75
-255
-92
-105
-255
-104
-118
-255
-85
-100
-245
-67
-83
-247
-64
-82
-238
-51
-68
-237
-51
-65
-237
-51
-62
-233
-54
-60
-227
-57
-57
-219
-56
-51
-206
-52
-42
-199
-47
-36
-203
-50
-42
-199
-46
-40
-208
-55
-50
-242
-89
-84
-246
-92
-90
-242
-88
-86
-219
-65
-63
-226
-72
-70
-220
-66
-64
-212
-60
-55
-206
-55
-48
-205
-54
-45
-207
-56
-45
-207
-57
-43
-202
-55
-39
-194
-53
-35
-185
-56
-35
-179
-57
-36
-181
-58
-40
-184
-61
-45
-185
-59
-44
-182
-54
-41
-188
-55
-46
-198
-61
-53
-219
-78
-71
-217
-69
-65
-206
-53
-48
-208
-49
-45
-225
-62
-57
-231
-64
-58
-227
-56
-49
-231
-53
-49
-235
-50
-48
-238
-50
-49
-235
-53
-50
-231
-56
-51
-225
-58
-50
-216
-58
-47
-208
-57
-46
-200
-58
-46
-190
-54
-42
-186
-56
-43
-200
-73
-66
-220
-95
-89
-235
-110
-108
-251
-125
-128
-255
-133
-137
-255
-126
-131
-247
-116
-124
-248
-118
-126
-245
-122
-127
-248
-123
-129
-254
-116
-129
-255
-108
-124
-255
-97
-117
-255
-90
-112
-247
-81
-101
-241
-72
-93
-240
-62
-86
-238
-69
-90
-227
-83
-93
-188
-86
-82
-131
-91
-66
-98
-98
-60
-92
-112
-63
-91
-118
-67
-102
-121
-75
-110
-126
-81
-116
-129
-86
-120
-133
-90
-121
-136
-95
-119
-140
-97
-121
-149
-101
-120
-154
-104
-122
-160
-109
-124
-167
-113
-129
-170
-114
-132
-171
-114
-133
-171
-112
-134
-169
-111
-137
-172
-114
-139
-174
-116
-138
-178
-116
-138
-180
-116
-136
-181
-116
-135
-182
-114
-137
-184
-116
-139
-184
-119
-143
-183
-123
-140
-173
-120
-141
-164
-120
-151
-165
-130
-170
-174
-149
-191
-186
-167
-203
-193
-181
-207
-198
-193
-188
-186
-191
-168
-170
-182
-156
-156
-168
-90
-74
-58
-90
-74
-58
-90
-74
-58
-90
-74
-58
-90
-74
-58
-90
-74
-58
-90
-74
-58
-90
-74
-58
-90
-74
-58
-90
-74
-58
-90
-74
-58
-91
-75
-59
-91
-75
-59
-92
-76
-60
-92
-76
-60
-93
-76
-60
-94
-75
-60
-94
-75
-60
-94
-75
-60
-95
-76
-61
-94
-77
-59
-95
-78
-60
-94
-79
-60
-94
-79
-60
-93
-78
-59
-93
-78
-59
-94
-79
-60
-95
-79
-63
-95
-79
-63
-96
-80
-64
-97
-81
-65
-98
-80
-70
-101
-76
-80
-101
-77
-93
-97
-79
-101
-98
-85
-115
-104
-96
-133
-116
-111
-151
-123
-116
-157
-125
-113
-151
-143
-118
-150
-174
-131
-159
-203
-140
-161
-218
-131
-150
-227
-116
-133
-232
-101
-117
-230
-81
-100
-228
-63
-80
-242
-55
-72
-252
-64
-78
-244
-73
-81
-227
-71
-74
-209
-65
-64
-203
-66
-60
-209
-67
-63
-217
-67
-66
-230
-67
-70
-235
-64
-70
-239
-64
-71
-239
-66
-72
-231
-68
-73
-218
-68
-69
-201
-66
-62
-190
-63
-54
-186
-64
-53
-177
-59
-45
-169
-56
-40
-168
-57
-40
-170
-57
-41
-176
-56
-42
-188
-58
-45
-202
-59
-51
-232
-73
-69
-233
-63
-63
-235
-61
-62
-229
-55
-56
-218
-50
-47
-222
-65
-58
-238
-90
-80
-244
-104
-91
-218
-80
-67
-201
-65
-51
-190
-53
-37
-194
-54
-39
-199
-57
-43
-200
-57
-43
-203
-55
-43
-210
-56
-44
-209
-48
-38
-218
-54
-45
-230
-59
-52
-233
-59
-52
-234
-52
-48
-232
-47
-44
-234
-45
-43
-235
-45
-45
-241
-52
-56
-243
-52
-59
-247
-51
-61
-250
-50
-60
-251
-49
-61
-253
-49
-61
-250
-48
-60
-247
-49
-62
-244
-49
-65
-241
-50
-66
-242
-53
-75
-243
-53
-78
-242
-49
-78
-244
-46
-79
-254
-49
-88
-255
-62
-95
-230
-51
-72
-248
-78
-91
-255
-95
-108
-255
-92
-107
-252
-84
-99
-250
-79
-95
-244
-68
-88
-233
-56
-74
-243
-65
-81
-234
-58
-71
-221
-50
-58
-210
-47
-50
-202
-50
-45
-194
-56
-45
-189
-59
-43
-188
-58
-42
-196
-58
-47
-192
-50
-40
-217
-74
-66
-250
-107
-99
-221
-76
-71
-225
-80
-75
-207
-59
-57
-207
-59
-57
-224
-76
-74
-212
-64
-60
-202
-55
-48
-202
-55
-45
-206
-60
-47
-205
-60
-43
-203
-58
-41
-196
-59
-40
-180
-59
-38
-173
-58
-37
-175
-60
-41
-179
-62
-45
-177
-57
-41
-175
-51
-39
-186
-58
-47
-202
-68
-59
-214
-71
-65
-216
-67
-61
-212
-55
-50
-215
-50
-46
-231
-59
-55
-236
-58
-54
-232
-50
-46
-237
-50
-45
-242
-44
-45
-244
-44
-44
-242
-46
-47
-239
-51
-49
-232
-55
-49
-226
-58
-49
-218
-60
-49
-210
-62
-50
-194
-54
-41
-186
-52
-41
-197
-66
-58
-215
-88
-82
-231
-106
-104
-250
-124
-125
-255
-134
-137
-255
-127
-132
-248
-117
-125
-249
-119
-127
-246
-123
-128
-247
-122
-128
-252
-114
-127
-253
-105
-121
-255
-94
-115
-255
-89
-111
-245
-79
-99
-244
-75
-96
-242
-64
-88
-239
-70
-91
-229
-85
-95
-182
-83
-78
-121
-84
-58
-94
-96
-56
-96
-115
-69
-97
-124
-73
-110
-129
-83
-118
-134
-89
-123
-136
-93
-126
-139
-96
-129
-144
-103
-130
-151
-108
-128
-156
-108
-125
-159
-109
-124
-164
-111
-125
-168
-112
-128
-169
-111
-130
-170
-110
-131
-169
-108
-133
-169
-108
-137
-170
-113
-139
-173
-113
-137
-175
-114
-136
-178
-114
-133
-178
-111
-133
-180
-112
-135
-182
-114
-137
-184
-116
-139
-181
-118
-135
-173
-116
-140
-166
-119
-153
-169
-132
-175
-181
-153
-198
-196
-175
-213
-206
-190
-217
-210
-204
-194
-194
-202
-172
-178
-192
-155
-161
-175
-90
-75
-56
-90
-75
-56
-90
-75
-56
-90
-75
-56
-90
-75
-56
-90
-75
-56
-90
-75
-56
-90
-75
-56
-90
-75
-56
-90
-75
-56
-90
-75
-56
-91
-76
-57
-91
-76
-57
-92
-77
-58
-92
-77
-58
-93
-76
-58
-94
-75
-60
-96
-74
-60
-94
-75
-60
-95
-76
-61
-94
-77
-59
-95
-78
-60
-94
-79
-60
-94
-79
-60
-94
-79
-58
-95
-80
-59
-96
-79
-59
-97
-80
-62
-97
-80
-62
-97
-80
-62
-97
-80
-60
-100
-78
-65
-104
-75
-77
-103
-75
-87
-99
-78
-95
-98
-84
-109
-106
-97
-128
-118
-112
-146
-124
-118
-152
-128
-115
-145
-143
-117
-142
-173
-128
-148
-205
-134
-148
-222
-127
-135
-237
-113
-121
-246
-101
-108
-246
-82
-91
-244
-62
-75
-248
-47
-66
-255
-55
-75
-251
-65
-79
-235
-64
-73
-219
-63
-67
-214
-66
-66
-213
-67
-67
-215
-65
-66
-224
-65
-69
-227
-64
-69
-230
-63
-70
-228
-65
-70
-223
-67
-70
-212
-66
-66
-199
-64
-60
-189
-62
-53
-184
-62
-51
-175
-57
-43
-168
-55
-39
-169
-58
-41
-173
-60
-42
-180
-60
-44
-193
-61
-49
-207
-63
-55
-223
-61
-58
-229
-57
-57
-227
-48
-51
-226
-47
-50
-224
-52
-50
-219
-57
-52
-230
-77
-69
-252
-108
-97
-242
-104
-91
-217
-81
-67
-198
-60
-47
-198
-58
-45
-200
-58
-46
-201
-55
-42
-205
-54
-43
-213
-56
-47
-213
-52
-44
-222
-55
-47
-230
-57
-51
-232
-54
-50
-233
-49
-47
-232
-47
-44
-238
-49
-47
-245
-49
-53
-255
-50
-66
-255
-48
-68
-255
-45
-69
-255
-43
-65
-255
-38
-63
-255
-35
-60
-250
-32
-56
-244
-32
-55
-246
-39
-65
-243
-43
-69
-242
-47
-77
-242
-49
-80
-240
-44
-80
-243
-42
-84
-254
-51
-96
-255
-66
-104
-240
-67
-87
-255
-95
-108
-255
-103
-116
-247
-85
-100
-236
-74
-89
-239
-74
-90
-234
-65
-84
-217
-49
-66
-235
-64
-82
-221
-55
-67
-201
-45
-49
-186
-40
-40
-177
-46
-36
-171
-56
-38
-165
-63
-38
-168
-64
-39
-184
-63
-46
-188
-58
-44
-221
-89
-77
-225
-93
-81
-205
-71
-62
-205
-68
-62
-193
-54
-51
-201
-59
-55
-228
-85
-81
-213
-70
-64
-201
-57
-49
-200
-56
-45
-201
-58
-44
-200
-57
-40
-200
-57
-40
-196
-61
-41
-177
-63
-39
-166
-60
-38
-168
-59
-38
-172
-61
-42
-171
-55
-40
-172
-51
-40
-188
-61
-52
-211
-76
-70
-214
-71
-65
-221
-69
-64
-219
-57
-54
-220
-51
-48
-233
-55
-51
-236
-53
-49
-235
-48
-43
-244
-49
-45
-253
-44
-47
-255
-43
-45
-250
-46
-47
-244
-49
-47
-237
-52
-47
-230
-56
-49
-223
-59
-49
-216
-62
-50
-201
-57
-46
-189
-51
-40
-192
-59
-50
-207
-78
-72
-225
-97
-94
-247
-121
-122
-255
-136
-138
-255
-131
-135
-252
-121
-129
-252
-122
-130
-248
-124
-132
-247
-122
-130
-249
-111
-124
-249
-101
-117
-252
-90
-111
-252
-86
-108
-238
-75
-96
-242
-74
-97
-240
-64
-87
-236
-69
-89
-225
-84
-93
-174
-77
-71
-112
-77
-49
-92
-94
-54
-95
-114
-68
-102
-126
-78
-117
-136
-91
-127
-142
-99
-132
-144
-104
-134
-146
-106
-136
-151
-110
-137
-158
-115
-136
-164
-116
-132
-166
-116
-127
-167
-114
-125
-168
-112
-127
-168
-110
-129
-169
-109
-131
-169
-108
-134
-168
-108
-136
-167
-110
-138
-169
-110
-136
-172
-111
-134
-174
-111
-130
-175
-108
-130
-177
-107
-131
-181
-110
-133
-183
-114
-135
-179
-116
-134
-173
-116
-140
-168
-119
-155
-173
-133
-176
-185
-154
-199
-199
-175
-214
-207
-189
-215
-210
-204
-188
-192
-201
-165
-174
-189
-147
-156
-171
-91
-74
-56
-90
-75
-56
-91
-74
-56
-90
-75
-56
-91
-74
-56
-90
-75
-56
-91
-74
-56
-90
-75
-56
-91
-74
-56
-90
-75
-56
-91
-74
-56
-91
-76
-57
-92
-75
-57
-92
-77
-58
-93
-76
-58
-93
-76
-58
-94
-75
-60
-94
-75
-60
-94
-75
-60
-94
-77
-61
-94
-77
-61
-94
-79
-60
-94
-79
-60
-92
-79
-60
-96
-81
-62
-97
-82
-61
-97
-82
-63
-98
-81
-63
-98
-81
-63
-97
-80
-62
-97
-79
-59
-98
-76
-63
-107
-77
-75
-106
-76
-84
-101
-79
-92
-100
-87
-107
-107
-101
-127
-120
-117
-148
-125
-124
-156
-127
-120
-151
-145
-122
-148
-171
-129
-149
-198
-132
-144
-217
-126
-133
-238
-117
-122
-252
-109
-111
-253
-90
-91
-249
-70
-76
-247
-52
-69
-255
-58
-78
-251
-64
-81
-238
-63
-76
-229
-65
-74
-225
-69
-73
-221
-66
-70
-215
-60
-64
-222
-63
-68
-223
-62
-67
-225
-62
-67
-222
-64
-65
-218
-66
-65
-208
-65
-61
-197
-62
-56
-188
-61
-52
-181
-63
-49
-172
-59
-43
-169
-56
-40
-173
-60
-44
-180
-63
-46
-187
-64
-49
-202
-65
-55
-216
-67
-61
-217
-55
-52
-225
-56
-53
-222
-46
-46
-226
-51
-48
-230
-58
-54
-211
-48
-39
-207
-53
-41
-235
-85
-71
-255
-119
-106
-235
-91
-80
-209
-67
-55
-202
-60
-48
-203
-59
-48
-201
-55
-42
-205
-54
-43
-212
-58
-48
-218
-55
-48
-223
-56
-50
-229
-54
-51
-231
-51
-50
-234
-48
-49
-237
-49
-50
-244
-51
-54
-252
-53
-60
-252
-37
-53
-255
-35
-56
-255
-34
-56
-255
-33
-56
-255
-32
-55
-255
-31
-53
-251
-29
-52
-246
-30
-53
-237
-28
-50
-236
-32
-57
-237
-39
-66
-238
-41
-71
-237
-39
-74
-239
-41
-77
-253
-53
-92
-255
-70
-104
-255
-96
-115
-254
-94
-106
-247
-85
-98
-242
-80
-93
-242
-80
-93
-240
-75
-89
-227
-62
-76
-210
-48
-59
-218
-61
-70
-205
-54
-59
-187
-47
-46
-175
-46
-40
-168
-52
-39
-162
-59
-40
-155
-63
-38
-157
-61
-37
-170
-57
-39
-178
-56
-43
-210
-86
-74
-187
-59
-50
-196
-63
-56
-190
-52
-49
-189
-50
-47
-206
-67
-64
-229
-87
-83
-213
-72
-65
-200
-57
-49
-196
-54
-42
-197
-54
-40
-196
-53
-37
-198
-53
-36
-195
-58
-40
-177
-60
-40
-167
-58
-38
-168
-55
-37
-173
-57
-42
-172
-52
-38
-175
-49
-37
-194
-63
-53
-219
-82
-74
-217
-73
-65
-225
-72
-66
-222
-59
-54
-222
-50
-46
-234
-52
-49
-237
-49
-47
-239
-45
-43
-252
-50
-50
-254
-44
-47
-253
-43
-46
-249
-43
-45
-243
-43
-43
-237
-45
-42
-230
-49
-42
-223
-52
-44
-214
-56
-44
-209
-61
-49
-191
-50
-40
-188
-55
-46
-200
-73
-66
-217
-92
-88
-243
-119
-119
-255
-137
-139
-255
-134
-138
-253
-126
-133
-255
-125
-133
-252
-125
-134
-253
-119
-130
-252
-107
-122
-249
-96
-114
-249
-87
-108
-249
-83
-105
-234
-68
-92
-240
-71
-94
-236
-59
-85
-228
-65
-86
-215
-81
-90
-162
-73
-67
-102
-70
-45
-88
-93
-53
-90
-109
-63
-98
-125
-74
-116
-140
-92
-128
-150
-103
-135
-152
-108
-136
-155
-110
-138
-160
-114
-139
-165
-118
-140
-172
-122
-134
-171
-119
-129
-170
-114
-126
-167
-109
-124
-165
-105
-125
-165
-103
-129
-165
-103
-131
-165
-105
-131
-164
-107
-133
-166
-109
-132
-170
-109
-130
-172
-108
-128
-173
-104
-128
-175
-105
-129
-179
-106
-132
-182
-111
-137
-182
-115
-136
-176
-114
-140
-173
-120
-153
-176
-132
-172
-188
-152
-189
-198
-169
-201
-203
-181
-203
-205
-194
-182
-191
-196
-159
-171
-183
-140
-152
-164
-93
-75
-55
-92
-75
-55
-93
-75
-55
-92
-75
-55
-93
-75
-55
-92
-75
-55
-93
-75
-55
-92
-75
-55
-94
-76
-56
-93
-76
-56
-94
-76
-56
-93
-76
-56
-94
-76
-56
-93
-76
-56
-94
-76
-56
-93
-76
-58
-93
-74
-60
-93
-75
-61
-94
-76
-62
-92
-76
-60
-92
-76
-60
-91
-78
-61
-93
-80
-63
-94
-83
-65
-96
-83
-66
-95
-82
-63
-96
-80
-64
-98
-81
-65
-99
-82
-66
-100
-81
-66
-100
-78
-65
-100
-76
-66
-107
-75
-76
-104
-75
-80
-101
-79
-91
-102
-91
-108
-110
-107
-134
-120
-123
-156
-129
-133
-170
-137
-137
-173
-143
-132
-166
-165
-136
-166
-190
-136
-159
-208
-130
-144
-225
-121
-128
-240
-114
-115
-249
-106
-102
-255
-97
-96
-244
-77
-87
-237
-65
-79
-231
-61
-74
-233
-66
-76
-235
-69
-79
-231
-65
-75
-228
-61
-69
-229
-62
-70
-226
-59
-66
-224
-59
-63
-221
-58
-61
-217
-59
-58
-212
-60
-57
-204
-59
-54
-196
-58
-48
-185
-57
-44
-167
-54
-38
-175
-65
-48
-173
-60
-44
-172
-54
-40
-191
-65
-53
-204
-70
-61
-204
-61
-53
-208
-55
-50
-218
-56
-53
-220
-55
-49
-222
-53
-46
-222
-54
-45
-222
-56
-42
-221
-60
-42
-215
-58
-39
-211
-54
-37
-217
-59
-48
-240
-83
-76
-242
-90
-79
-217
-69
-57
-199
-56
-42
-205
-62
-46
-212
-66
-51
-210
-58
-45
-211
-50
-42
-240
-71
-66
-225
-47
-47
-239
-54
-59
-244
-55
-62
-239
-45
-56
-255
-66
-77
-240
-40
-51
-250
-38
-50
-255
-41
-50
-255
-41
-50
-249
-29
-39
-253
-34
-42
-255
-39
-47
-254
-39
-47
-240
-29
-38
-238
-31
-41
-248
-44
-55
-233
-33
-46
-235
-38
-55
-240
-44
-64
-227
-33
-57
-255
-86
-112
-229
-43
-66
-255
-92
-108
-255
-94
-105
-255
-89
-99
-251
-84
-92
-246
-79
-87
-236
-71
-77
-222
-62
-64
-208
-54
-52
-204
-61
-55
-197
-64
-55
-184
-62
-49
-167
-54
-38
-156
-49
-33
-154
-53
-35
-157
-58
-39
-160
-59
-41
-167
-56
-45
-174
-55
-47
-194
-69
-63
-191
-59
-55
-189
-51
-49
-196
-54
-52
-197
-53
-52
-212
-68
-67
-219
-76
-72
-218
-75
-69
-209
-68
-59
-200
-58
-48
-196
-52
-41
-199
-53
-40
-203
-52
-41
-197
-53
-42
-188
-60
-47
-179
-57
-44
-173
-47
-35
-171
-40
-30
-179
-45
-36
-195
-57
-47
-210
-67
-59
-216
-72
-63
-228
-80
-70
-223
-69
-61
-218
-55
-48
-221
-48
-42
-231
-48
-44
-242
-50
-49
-249
-49
-51
-253
-49
-52
-247
-47
-49
-246
-48
-49
-246
-48
-49
-243
-48
-46
-242
-48
-46
-237
-50
-45
-230
-53
-45
-221
-57
-47
-213
-61
-48
-190
-50
-37
-192
-62
-49
-185
-61
-51
-214
-95
-89
-233
-115
-113
-255
-143
-143
-251
-132
-134
-255
-135
-140
-255
-132
-141
-255
-120
-135
-253
-104
-123
-252
-95
-116
-254
-92
-115
-250
-86
-110
-243
-77
-101
-242
-72
-99
-235
-60
-89
-237
-62
-91
-224
-66
-89
-216
-94
-105
-141
-63
-59
-92
-67
-45
-83
-91
-54
-92
-116
-66
-103
-134
-77
-119
-150
-93
-125
-156
-99
-127
-157
-103
-128
-161
-106
-131
-166
-110
-130
-168
-111
-128
-167
-110
-127
-166
-109
-126
-165
-108
-125
-165
-105
-124
-164
-104
-125
-163
-102
-127
-163
-101
-127
-163
-102
-127
-165
-108
-127
-166
-109
-129
-171
-108
-127
-172
-107
-126
-173
-103
-127
-174
-102
-129
-177
-103
-131
-179
-105
-135
-181
-109
-139
-180
-114
-139
-177
-118
-142
-174
-124
-153
-180
-137
-167
-189
-153
-175
-194
-164
-178
-193
-174
-163
-175
-173
-141
-152
-158
-124
-135
-141
-93
-75
-55
-93
-75
-55
-93
-75
-55
-93
-75
-55
-93
-75
-55
-93
-75
-55
-93
-75
-55
-93
-75
-55
-94
-76
-56
-94
-76
-56
-94
-76
-56
-94
-76
-56
-94
-76
-56
-94
-76
-56
-94
-76
-56
-94
-75
-58
-92
-75
-59
-94
-76
-62
-95
-77
-63
-94
-78
-62
-91
-78
-61
-91
-78
-61
-92
-81
-63
-94
-82
-66
-95
-83
-67
-93
-81
-65
-93
-79
-66
-95
-79
-66
-96
-78
-68
-98
-80
-70
-99
-79
-72
-101
-77
-73
-105
-76
-78
-103
-78
-84
-101
-83
-97
-103
-95
-116
-110
-111
-142
-121
-126
-166
-128
-136
-183
-135
-139
-187
-158
-150
-199
-163
-140
-182
-171
-127
-160
-185
-120
-142
-211
-121
-133
-234
-124
-125
-244
-117
-111
-244
-105
-100
-245
-94
-99
-238
-81
-90
-233
-71
-82
-238
-74
-83
-243
-76
-86
-242
-71
-80
-238
-64
-74
-234
-60
-69
-228
-57
-63
-224
-58
-60
-220
-57
-58
-215
-60
-56
-210
-61
-55
-203
-60
-52
-196
-58
-47
-186
-59
-44
-171
-60
-43
-170
-63
-45
-169
-56
-40
-178
-58
-44
-193
-65
-54
-197
-60
-52
-199
-54
-49
-212
-60
-55
-210
-53
-48
-214
-53
-45
-215
-53
-42
-216
-52
-40
-217
-56
-38
-219
-58
-38
-219
-59
-37
-218
-57
-39
-221
-54
-46
-230
-65
-59
-235
-77
-68
-225
-73
-60
-208
-62
-47
-199
-56
-40
-202
-56
-41
-211
-59
-46
-221
-58
-51
-245
-73
-69
-228
-48
-49
-241
-55
-60
-246
-54
-65
-241
-46
-60
-255
-63
-77
-237
-37
-50
-243
-36
-44
-247
-37
-40
-251
-41
-44
-253
-43
-44
-252
-42
-43
-248
-40
-40
-246
-40
-40
-247
-43
-44
-239
-36
-39
-237
-37
-40
-234
-37
-44
-253
-59
-68
-216
-26
-38
-238
-50
-65
-250
-63
-80
-213
-35
-51
-255
-104
-117
-255
-97
-106
-255
-90
-97
-253
-86
-93
-247
-78
-83
-231
-65
-67
-218
-59
-56
-210
-61
-54
-193
-55
-44
-194
-66
-53
-188
-71
-54
-172
-61
-44
-154
-47
-31
-147
-39
-26
-146
-38
-25
-147
-39
-27
-158
-45
-37
-176
-58
-54
-209
-84
-80
-206
-72
-71
-195
-53
-52
-198
-52
-53
-209
-61
-61
-235
-87
-85
-216
-71
-66
-214
-71
-63
-208
-65
-57
-199
-57
-47
-198
-51
-41
-202
-54
-44
-208
-55
-47
-206
-55
-48
-199
-61
-51
-194
-57
-49
-194
-53
-46
-195
-50
-45
-201
-52
-46
-209
-56
-51
-216
-63
-57
-222
-69
-61
-228
-74
-64
-222
-65
-56
-218
-54
-45
-221
-48
-42
-231
-48
-44
-242
-50
-49
-251
-48
-51
-251
-48
-51
-244
-48
-50
-243
-49
-50
-244
-48
-49
-243
-47
-48
-243
-48
-46
-238
-49
-45
-231
-52
-45
-223
-57
-45
-215
-61
-49
-191
-51
-36
-190
-60
-47
-183
-61
-50
-211
-94
-87
-233
-118
-115
-255
-144
-144
-249
-133
-136
-253
-134
-140
-255
-128
-138
-255
-115
-132
-255
-100
-121
-255
-92
-116
-255
-89
-114
-252
-84
-110
-246
-76
-103
-243
-68
-97
-236
-61
-90
-236
-66
-95
-223
-74
-96
-194
-83
-92
-128
-61
-55
-88
-67
-46
-82
-92
-57
-91
-118
-67
-101
-135
-75
-115
-149
-89
-120
-156
-95
-119
-157
-98
-123
-161
-102
-125
-165
-105
-125
-166
-106
-124
-165
-105
-124
-165
-105
-124
-164
-104
-123
-163
-101
-123
-161
-100
-123
-161
-100
-125
-161
-99
-126
-162
-101
-124
-163
-106
-125
-166
-108
-125
-169
-108
-125
-170
-105
-124
-171
-101
-125
-173
-99
-127
-175
-99
-130
-177
-99
-133
-176
-104
-135
-178
-107
-136
-175
-112
-136
-171
-115
-139
-171
-124
-144
-172
-132
-144
-170
-135
-140
-162
-139
-118
-133
-126
-99
-111
-111
-83
-95
-95
-93
-76
-56
-93
-76
-56
-93
-76
-56
-93
-76
-56
-93
-76
-56
-93
-76
-56
-93
-76
-56
-93
-76
-56
-93
-76
-56
-93
-76
-56
-93
-76
-56
-93
-76
-56
-93
-76
-56
-93
-76
-56
-93
-76
-56
-93
-76
-56
-94
-75
-58
-95
-78
-62
-97
-80
-64
-96
-80
-64
-93
-80
-63
-92
-79
-62
-91
-79
-63
-91
-82
-67
-91
-81
-69
-91
-81
-71
-92
-79
-71
-92
-79
-73
-95
-80
-77
-99
-81
-79
-102
-84
-84
-103
-84
-86
-103
-84
-88
-103
-86
-96
-104
-92
-112
-108
-105
-134
-115
-118
-161
-124
-131
-185
-130
-138
-201
-138
-142
-206
-152
-146
-210
-160
-139
-196
-170
-131
-178
-185
-125
-159
-207
-128
-147
-228
-131
-138
-238
-126
-122
-242
-115
-109
-248
-102
-105
-242
-85
-92
-234
-73
-81
-237
-72
-79
-243
-73
-82
-245
-71
-81
-242
-65
-75
-238
-61
-69
-228
-55
-61
-224
-55
-58
-219
-56
-57
-213
-60
-55
-207
-63
-55
-201
-63
-52
-193
-61
-48
-184
-61
-45
-174
-61
-45
-170
-60
-43
-171
-58
-44
-184
-66
-54
-199
-72
-63
-192
-59
-50
-187
-48
-41
-202
-58
-50
-205
-54
-47
-208
-54
-46
-213
-55
-44
-216
-56
-44
-217
-55
-40
-217
-56
-38
-220
-57
-38
-224
-58
-42
-221
-52
-45
-219
-52
-46
-226
-65
-57
-233
-79
-67
-222
-72
-58
-200
-53
-37
-200
-50
-35
-217
-64
-50
-226
-62
-53
-245
-72
-68
-231
-48
-50
-242
-53
-59
-248
-54
-63
-245
-49
-61
-255
-66
-80
-244
-46
-59
-240
-41
-48
-235
-35
-38
-236
-36
-39
-249
-49
-51
-245
-45
-47
-239
-39
-39
-236
-38
-37
-245
-49
-50
-234
-40
-41
-245
-55
-57
-231
-42
-48
-225
-40
-48
-234
-50
-60
-255
-81
-93
-237
-59
-73
-255
-89
-101
-255
-94
-102
-242
-85
-92
-239
-78
-84
-241
-76
-82
-235
-69
-73
-222
-58
-59
-214
-55
-52
-214
-62
-57
-194
-53
-44
-194
-62
-50
-189
-65
-53
-181
-60
-49
-173
-55
-45
-168
-49
-41
-162
-43
-35
-157
-38
-32
-155
-36
-30
-169
-47
-42
-199
-69
-67
-194
-58
-58
-188
-44
-44
-200
-51
-53
-215
-65
-66
-244
-94
-93
-208
-63
-58
-210
-67
-59
-208
-65
-57
-203
-61
-51
-204
-57
-47
-212
-61
-52
-218
-64
-56
-219
-64
-59
-219
-64
-60
-216
-61
-59
-221
-62
-59
-227
-65
-63
-228
-62
-62
-224
-58
-58
-227
-63
-61
-235
-73
-68
-224
-66
-57
-221
-60
-52
-217
-53
-44
-221
-50
-43
-231
-49
-45
-240
-51
-49
-245
-49
-50
-248
-48
-50
-244
-48
-50
-244
-48
-50
-244
-48
-49
-243
-47
-48
-243
-48
-46
-238
-49
-45
-231
-52
-45
-223
-57
-45
-216
-62
-50
-192
-52
-37
-186
-56
-43
-181
-59
-48
-208
-91
-84
-237
-122
-119
-255
-147
-146
-251
-135
-138
-253
-129
-137
-255
-124
-137
-255
-113
-129
-253
-100
-120
-254
-90
-114
-255
-85
-111
-252
-79
-107
-250
-73
-102
-244
-65
-95
-238
-63
-92
-234
-71
-98
-223
-84
-103
-165
-64
-72
-117
-56
-51
-88
-70
-50
-85
-95
-60
-95
-119
-69
-102
-135
-78
-114
-147
-90
-117
-152
-94
-116
-154
-95
-120
-158
-99
-123
-163
-103
-123
-163
-103
-121
-162
-102
-121
-162
-102
-121
-161
-99
-120
-160
-98
-121
-159
-98
-121
-160
-97
-124
-160
-98
-122
-160
-99
-122
-162
-102
-123
-164
-104
-123
-167
-104
-123
-168
-101
-123
-169
-97
-123
-169
-96
-125
-171
-96
-127
-174
-96
-135
-178
-106
-138
-181
-110
-139
-178
-115
-137
-172
-116
-134
-166
-119
-130
-158
-117
-121
-147
-110
-111
-134
-108
-81
-99
-87
-64
-79
-76
-50
-65
-62
-94
-77
-57
-94
-77
-57
-94
-77
-57
-94
-77
-57
-94
-77
-57
-94
-77
-57
-94
-77
-57
-94
-77
-57
-94
-77
-57
-94
-77
-57
-94
-77
-57
-94
-77
-57
-94
-77
-57
-94
-77
-57
-94
-77
-57
-94
-77
-57
-94
-76
-56
-96
-78
-58
-97
-80
-60
-96
-81
-62
-93
-80
-63
-90
-78
-62
-89
-79
-67
-88
-80
-69
-88
-79
-72
-91
-81
-79
-95
-85
-84
-98
-88
-89
-101
-88
-95
-105
-89
-99
-108
-92
-102
-107
-94
-104
-108
-96
-108
-108
-99
-116
-111
-107
-134
-114
-116
-155
-121
-126
-181
-127
-135
-200
-133
-141
-214
-140
-143
-220
-142
-135
-212
-159
-139
-208
-173
-138
-194
-179
-129
-167
-189
-121
-144
-204
-123
-130
-222
-129
-124
-241
-130
-123
-254
-116
-116
-253
-100
-103
-244
-88
-92
-242
-79
-84
-242
-73
-80
-242
-68
-77
-240
-63
-71
-239
-60
-66
-229
-54
-59
-225
-55
-56
-219
-57
-55
-213
-60
-55
-206
-64
-54
-198
-64
-52
-191
-64
-49
-184
-63
-46
-173
-57
-42
-173
-62
-45
-177
-61
-48
-188
-70
-58
-204
-82
-71
-199
-72
-63
-186
-53
-46
-186
-49
-41
-200
-57
-49
-205
-56
-49
-211
-59
-48
-217
-61
-49
-219
-59
-45
-217
-54
-39
-220
-54
-38
-224
-56
-43
-224
-53
-45
-219
-50
-43
-224
-61
-52
-236
-78
-66
-227
-75
-61
-210
-58
-44
-209
-56
-42
-224
-66
-54
-222
-54
-45
-240
-62
-58
-233
-47
-48
-239
-48
-53
-245
-50
-58
-248
-52
-62
-255
-74
-86
-255
-70
-79
-253
-62
-69
-242
-51
-56
-226
-36
-38
-237
-47
-49
-234
-44
-44
-240
-50
-50
-232
-42
-42
-235
-47
-46
-241
-57
-57
-209
-26
-28
-229
-50
-54
-220
-43
-49
-231
-56
-63
-239
-68
-76
-255
-87
-98
-241
-75
-85
-217
-60
-67
-219
-64
-68
-225
-66
-70
-225
-62
-65
-222
-57
-61
-220
-56
-57
-218
-55
-56
-212
-57
-55
-201
-56
-51
-195
-56
-49
-190
-57
-50
-193
-64
-58
-206
-77
-72
-215
-85
-83
-210
-77
-78
-196
-66
-64
-178
-55
-50
-182
-57
-53
-207
-75
-73
-217
-77
-76
-227
-81
-82
-239
-89
-90
-234
-82
-81
-241
-89
-86
-201
-53
-49
-206
-62
-54
-210
-66
-57
-208
-64
-55
-211
-63
-53
-217
-66
-57
-224
-67
-60
-226
-64
-59
-233
-63
-64
-231
-56
-61
-236
-57
-61
-242
-63
-67
-239
-58
-63
-232
-53
-56
-236
-62
-61
-246
-77
-74
-222
-57
-51
-219
-54
-48
-218
-51
-43
-222
-51
-44
-229
-52
-46
-236
-51
-48
-242
-50
-49
-244
-48
-49
-244
-48
-50
-246
-47
-50
-246
-48
-49
-245
-47
-48
-245
-47
-46
-240
-48
-45
-233
-52
-45
-224
-56
-45
-217
-63
-51
-194
-54
-39
-183
-53
-40
-179
-57
-46
-203
-86
-79
-239
-124
-121
-255
-147
-146
-254
-135
-139
-255
-128
-137
-255
-121
-135
-252
-110
-126
-250
-99
-118
-250
-88
-111
-252
-80
-106
-251
-72
-102
-250
-67
-98
-242
-61
-92
-239
-66
-94
-229
-77
-100
-215
-90
-104
-136
-50
-53
-107
-57
-48
-92
-77
-56
-91
-101
-67
-99
-123
-75
-106
-137
-80
-115
-146
-89
-116
-149
-92
-117
-152
-94
-119
-157
-98
-121
-161
-101
-122
-162
-102
-119
-160
-100
-118
-160
-97
-119
-159
-97
-118
-158
-96
-120
-159
-96
-120
-159
-96
-123
-159
-97
-122
-160
-99
-122
-162
-102
-122
-163
-103
-122
-167
-102
-122
-167
-98
-122
-168
-96
-122
-168
-93
-124
-171
-93
-126
-173
-95
-134
-178
-103
-139
-180
-110
-140
-179
-116
-138
-173
-115
-134
-166
-117
-128
-157
-113
-116
-142
-105
-105
-128
-100
-80
-98
-84
-67
-82
-75
-56
-71
-64
-94
-77
-59
-94
-77
-59
-94
-77
-59
-94
-77
-59
-94
-77
-59
-94
-77
-59
-94
-77
-59
-94
-77
-59
-94
-77
-59
-94
-77
-59
-94
-77
-59
-94
-77
-59
-94
-77
-59
-94
-77
-59
-94
-77
-59
-94
-77
-57
-93
-75
-53
-95
-77
-53
-96
-80
-57
-95
-80
-59
-92
-79
-62
-90
-78
-64
-88
-79
-70
-88
-81
-75
-89
-80
-81
-96
-87
-92
-103
-96
-104
-110
-102
-115
-115
-104
-121
-115
-103
-123
-115
-103
-125
-113
-103
-127
-111
-108
-129
-112
-112
-138
-114
-118
-153
-118
-124
-172
-122
-130
-193
-127
-135
-208
-132
-139
-220
-138
-140
-225
-147
-142
-224
-157
-141
-214
-160
-132
-190
-158
-117
-159
-160
-108
-130
-172
-110
-115
-188
-117
-111
-210
-118
-107
-240
-115
-109
-253
-109
-108
-254
-104
-105
-251
-95
-96
-249
-83
-87
-244
-71
-77
-237
-60
-66
-234
-55
-61
-232
-53
-59
-227
-54
-56
-221
-57
-56
-215
-60
-55
-208
-64
-55
-199
-65
-53
-192
-65
-48
-185
-64
-47
-173
-55
-41
-180
-64
-51
-175
-58
-48
-176
-59
-49
-200
-82
-72
-213
-92
-81
-201
-77
-67
-187
-59
-48
-190
-57
-48
-193
-55
-45
-204
-57
-47
-214
-62
-51
-219
-61
-49
-218
-54
-42
-220
-52
-39
-226
-54
-42
-224
-51
-44
-226
-55
-48
-228
-61
-53
-229
-69
-57
-226
-70
-57
-222
-66
-51
-222
-65
-50
-226
-62
-50
-219
-48
-38
-234
-55
-50
-236
-48
-47
-238
-45
-48
-239
-44
-50
-246
-51
-59
-255
-76
-84
-255
-87
-94
-255
-90
-95
-255
-79
-83
-225
-46
-49
-227
-48
-51
-224
-44
-45
-247
-69
-69
-232
-54
-54
-220
-44
-44
-218
-44
-45
-234
-61
-63
-219
-49
-52
-216
-50
-54
-255
-98
-104
-224
-61
-66
-202
-41
-49
-202
-45
-52
-193
-38
-42
-213
-59
-61
-224
-65
-69
-218
-55
-58
-217
-51
-55
-223
-57
-61
-220
-55
-59
-205
-47
-48
-204
-52
-51
-205
-59
-59
-211
-71
-70
-221
-83
-83
-235
-96
-99
-245
-105
-108
-244
-101
-107
-234
-94
-97
-196
-64
-62
-198
-69
-64
-229
-94
-91
-248
-104
-103
-255
-111
-112
-255
-106
-106
-229
-75
-75
-215
-61
-59
-201
-52
-48
-209
-62
-55
-215
-68
-60
-214
-67
-59
-213
-62
-53
-213
-60
-52
-216
-58
-49
-220
-52
-49
-238
-53
-59
-241
-45
-55
-240
-44
-54
-242
-46
-56
-239
-44
-52
-235
-44
-51
-243
-57
-60
-254
-74
-75
-223
-51
-47
-220
-51
-46
-218
-51
-43
-220
-51
-44
-227
-53
-46
-234
-52
-48
-239
-52
-47
-242
-50
-49
-244
-48
-50
-246
-47
-50
-247
-47
-49
-246
-46
-48
-245
-47
-46
-240
-48
-45
-234
-51
-45
-226
-55
-45
-217
-63
-51
-198
-56
-42
-180
-50
-37
-178
-56
-45
-195
-78
-71
-239
-124
-121
-255
-146
-145
-255
-135
-140
-255
-126
-137
-255
-117
-132
-249
-108
-124
-246
-97
-116
-245
-85
-109
-247
-74
-102
-249
-64
-96
-249
-59
-93
-243
-58
-92
-237
-68
-97
-219
-80
-101
-193
-87
-97
-114
-46
-43
-98
-62
-48
-96
-84
-62
-99
-106
-73
-102
-124
-77
-107
-137
-83
-116
-146
-92
-117
-150
-95
-118
-153
-95
-120
-158
-99
-121
-161
-99
-120
-160
-98
-117
-159
-96
-117
-159
-96
-117
-157
-95
-118
-158
-95
-119
-158
-95
-120
-159
-96
-123
-159
-97
-122
-161
-98
-122
-162
-100
-123
-165
-101
-124
-166
-100
-124
-167
-96
-121
-167
-94
-121
-168
-90
-123
-170
-92
-125
-172
-94
-128
-172
-97
-133
-175
-103
-135
-174
-109
-135
-170
-112
-133
-165
-115
-131
-160
-114
-123
-149
-110
-114
-138
-106
-100
-119
-100
-91
-107
-94
-81
-97
-84
-95
-78
-60
-95
-78
-60
-95
-78
-60
-95
-78
-60
-95
-78
-60
-95
-78
-60
-95
-78
-60
-95
-78
-60
-95
-78
-60
-95
-78
-60
-95
-78
-60
-95
-78
-60
-95
-78
-60
-95
-78
-60
-95
-78
-60
-95
-78
-58
-94
-76
-52
-95
-78
-52
-96
-78
-56
-94
-79
-58
-91
-78
-62
-89
-79
-69
-90
-83
-77
-90
-84
-84
-95
-90
-97
-104
-98
-112
-114
-109
-129
-122
-117
-140
-123
-117
-145
-123
-113
-147
-122
-112
-147
-118
-112
-148
-113
-116
-149
-114
-119
-157
-116
-124
-170
-119
-128
-183
-122
-131
-196
-126
-134
-207
-132
-138
-216
-139
-141
-218
-150
-144
-218
-153
-139
-201
-155
-133
-180
-162
-131
-162
-170
-132
-145
-171
-126
-123
-159
-107
-93
-153
-82
-64
-186
-78
-66
-210
-82
-73
-225
-88
-82
-233
-88
-85
-239
-84
-82
-241
-75
-77
-236
-63
-67
-229
-52
-58
-235
-56
-60
-231
-57
-59
-226
-58
-57
-218
-61
-56
-211
-64
-56
-203
-65
-54
-195
-63
-48
-188
-62
-47
-179
-57
-44
-186
-65
-54
-171
-53
-43
-163
-46
-36
-190
-73
-63
-217
-103
-92
-217
-100
-90
-203
-85
-73
-184
-60
-50
-184
-54
-41
-192
-51
-41
-206
-58
-48
-217
-59
-48
-218
-54
-44
-222
-51
-41
-228
-54
-45
-223
-49
-42
-228
-55
-49
-227
-59
-50
-221
-57
-47
-222
-62
-48
-227
-70
-53
-228
-66
-51
-223
-57
-43
-222
-48
-39
-233
-52
-45
-240
-51
-49
-239
-45
-46
-236
-41
-45
-242
-47
-53
-255
-66
-71
-255
-82
-87
-255
-93
-98
-255
-92
-97
-226
-57
-60
-227
-57
-60
-213
-43
-44
-244
-74
-75
-226
-56
-57
-215
-47
-47
-217
-51
-53
-203
-39
-40
-202
-37
-41
-247
-87
-89
-220
-61
-65
-213
-57
-61
-209
-54
-58
-186
-31
-35
-196
-40
-43
-219
-61
-62
-229
-66
-69
-219
-53
-57
-215
-44
-50
-220
-49
-55
-217
-48
-53
-204
-41
-46
-208
-52
-55
-226
-76
-78
-244
-98
-101
-250
-105
-110
-247
-100
-108
-246
-96
-105
-248
-96
-108
-248
-98
-107
-214
-76
-76
-213
-78
-74
-234
-92
-90
-234
-86
-84
-231
-77
-77
-227
-72
-70
-207
-52
-50
-206
-51
-47
-217
-65
-60
-224
-75
-68
-228
-79
-72
-223
-74
-67
-217
-64
-56
-215
-58
-51
-215
-54
-46
-220
-46
-45
-245
-50
-58
-251
-45
-58
-248
-42
-55
-245
-39
-52
-245
-41
-52
-248
-48
-58
-255
-62
-67
-255
-74
-74
-224
-49
-46
-222
-51
-44
-220
-51
-44
-221
-53
-44
-225
-52
-45
-231
-52
-47
-237
-52
-47
-240
-51
-47
-244
-48
-50
-247
-47
-50
-249
-46
-49
-248
-45
-48
-246
-46
-46
-241
-47
-45
-235
-50
-45
-226
-55
-45
-217
-61
-49
-201
-59
-45
-179
-49
-36
-177
-55
-44
-186
-67
-61
-236
-121
-118
-255
-141
-141
-255
-136
-141
-255
-123
-135
-255
-113
-129
-246
-104
-120
-243
-96
-114
-243
-83
-107
-244
-69
-98
-249
-58
-92
-249
-55
-90
-243
-58
-92
-235
-72
-99
-205
-80
-96
-160
-74
-77
-102
-52
-43
-89
-66
-48
-95
-87
-64
-99
-106
-73
-102
-124
-78
-107
-136
-82
-116
-145
-91
-119
-149
-95
-120
-153
-96
-123
-158
-100
-122
-160
-99
-118
-158
-96
-115
-155
-93
-114
-156
-92
-115
-155
-92
-116
-156
-93
-118
-157
-94
-119
-158
-95
-123
-159
-97
-122
-161
-98
-121
-161
-98
-122
-164
-98
-124
-167
-98
-123
-166
-95
-120
-166
-91
-120
-167
-89
-122
-169
-89
-123
-170
-90
-126
-170
-95
-131
-173
-101
-133
-172
-107
-135
-169
-109
-137
-167
-115
-137
-165
-117
-132
-157
-115
-124
-148
-114
-117
-137
-112
-111
-128
-109
-103
-120
-102
-95
-80
-61
-95
-80
-61
-95
-80
-61
-95
-80
-61
-95
-80
-61
-95
-80
-61
-95
-80
-61
-95
-80
-61
-94
-79
-60
-94
-79
-60
-94
-79
-60
-94
-79
-60
-94
-79
-60
-94
-79
-60
-94
-79
-60
-95
-78
-58
-97
-80
-54
-97
-80
-54
-97
-79
-57
-94
-79
-60
-91
-79
-65
-91
-82
-75
-92
-86
-86
-95
-90
-97
-107
-103
-118
-115
-111
-134
-125
-122
-151
-130
-126
-161
-129
-124
-165
-125
-119
-163
-123
-117
-165
-120
-118
-167
-115
-121
-171
-115
-125
-178
-120
-129
-184
-123
-132
-191
-126
-134
-196
-132
-138
-200
-141
-142
-206
-148
-147
-205
-154
-147
-198
-160
-150
-187
-171
-156
-179
-188
-167
-176
-201
-173
-169
-197
-166
-148
-170
-136
-109
-154
-103
-76
-155
-70
-50
-173
-65
-52
-181
-65
-52
-194
-66
-57
-214
-72
-68
-232
-78
-78
-238
-74
-75
-236
-63
-67
-235
-61
-63
-233
-59
-61
-229
-59
-59
-224
-60
-58
-217
-64
-56
-210
-63
-53
-202
-62
-49
-194
-60
-48
-189
-58
-48
-190
-63
-54
-175
-52
-44
-167
-49
-39
-187
-73
-63
-209
-99
-86
-214
-104
-91
-213
-101
-87
-195
-79
-66
-186
-62
-50
-186
-52
-41
-199
-55
-44
-214
-57
-48
-217
-53
-44
-223
-50
-43
-231
-54
-48
-226
-48
-44
-227
-52
-47
-226
-55
-47
-222
-55
-46
-224
-62
-49
-229
-67
-52
-228
-62
-48
-222
-52
-37
-229
-51
-41
-232
-47
-42
-240
-51
-47
-240
-46
-46
-239
-45
-46
-241
-48
-51
-242
-54
-55
-244
-64
-67
-246
-77
-82
-252
-89
-94
-233
-70
-75
-246
-81
-87
-216
-51
-55
-235
-70
-74
-221
-56
-60
-230
-65
-69
-216
-53
-56
-204
-44
-46
-207
-46
-51
-226
-70
-73
-210
-55
-59
-208
-55
-58
-185
-35
-37
-213
-59
-61
-217
-57
-59
-226
-60
-62
-232
-62
-65
-230
-55
-60
-223
-46
-54
-219
-42
-50
-224
-50
-59
-228
-61
-68
-238
-77
-83
-250
-95
-101
-255
-109
-115
-255
-106
-115
-248
-97
-106
-245
-91
-103
-246
-90
-104
-246
-92
-102
-244
-100
-100
-232
-90
-86
-232
-87
-84
-216
-64
-61
-207
-49
-48
-212
-52
-52
-211
-51
-51
-225
-67
-64
-227
-74
-69
-233
-82
-75
-234
-83
-76
-225
-74
-65
-217
-63
-55
-216
-57
-51
-219
-56
-49
-227
-51
-51
-243
-46
-55
-255
-48
-62
-255
-48
-61
-250
-42
-55
-252
-46
-58
-255
-59
-69
-255
-67
-72
-251
-65
-66
-227
-49
-47
-223
-52
-45
-221
-52
-45
-221
-53
-44
-226
-52
-45
-230
-51
-44
-237
-52
-47
-241
-52
-48
-244
-48
-50
-247
-47
-50
-249
-46
-49
-248
-45
-48
-246
-46
-46
-241
-47
-45
-235
-50
-45
-227
-55
-45
-216
-58
-47
-205
-62
-48
-181
-49
-37
-177
-55
-44
-178
-59
-53
-233
-115
-113
-255
-138
-138
-255
-135
-141
-255
-116
-132
-253
-104
-124
-243
-97
-116
-241
-92
-112
-244
-82
-106
-245
-68
-97
-251
-55
-93
-252
-56
-94
-245
-61
-95
-232
-78
-102
-188
-81
-91
-125
-57
-54
-94
-60
-48
-81
-68
-49
-91
-86
-64
-93
-100
-69
-101
-119
-77
-106
-133
-82
-114
-142
-91
-118
-148
-94
-121
-154
-97
-123
-158
-100
-120
-158
-97
-115
-155
-93
-112
-152
-89
-112
-153
-87
-113
-154
-88
-113
-154
-88
-116
-155
-92
-117
-156
-93
-121
-157
-95
-120
-159
-96
-120
-161
-95
-121
-162
-94
-122
-165
-94
-121
-164
-92
-120
-164
-89
-120
-164
-87
-121
-165
-86
-123
-167
-88
-127
-169
-95
-130
-172
-100
-132
-171
-104
-134
-168
-108
-135
-165
-111
-134
-162
-113
-128
-154
-109
-120
-145
-106
-112
-132
-104
-108
-128
-101
-101
-121
-96
-95
-80
-61
-95
-80
-61
-95
-80
-61
-95
-80
-61
-95
-80
-61
-95
-80
-61
-95
-80
-61
-95
-80
-61
-94
-79
-60
-94
-79
-60
-94
-79
-60
-94
-79
-60
-94
-79
-60
-94
-79
-60
-94
-79
-60
-95
-78
-58
-99
-81
-57
-99
-81
-57
-97
-80
-60
-93
-80
-64
-90
-80
-71
-92
-84
-82
-95
-90
-97
-97
-95
-109
-116
-114
-138
-121
-120
-152
-129
-128
-168
-131
-129
-176
-126
-126
-176
-121
-121
-175
-121
-117
-176
-119
-119
-181
-119
-124
-190
-120
-127
-195
-125
-133
-196
-130
-136
-196
-133
-138
-193
-141
-143
-191
-151
-150
-190
-160
-157
-188
-172
-167
-187
-182
-172
-180
-190
-179
-175
-200
-184
-169
-208
-190
-166
-214
-193
-162
-209
-187
-150
-208
-172
-136
-175
-111
-84
-174
-92
-71
-164
-71
-53
-168
-62
-48
-194
-71
-63
-224
-87
-81
-239
-87
-86
-241
-78
-79
-233
-64
-67
-234
-61
-63
-230
-60
-61
-226
-61
-59
-223
-61
-58
-215
-61
-53
-207
-59
-49
-201
-57
-48
-193
-56
-48
-193
-60
-53
-185
-58
-51
-184
-61
-53
-193
-79
-69
-199
-88
-77
-199
-93
-79
-209
-101
-88
-211
-99
-85
-194
-76
-62
-188
-58
-45
-197
-56
-46
-210
-57
-49
-215
-52
-45
-223
-50
-44
-231
-54
-48
-230
-52
-48
-225
-50
-45
-224
-53
-46
-227
-60
-51
-231
-67
-55
-230
-67
-52
-226
-58
-45
-223
-51
-37
-233
-52
-43
-229
-45
-37
-240
-48
-45
-240
-48
-45
-241
-52
-50
-242
-54
-53
-232
-46
-47
-226
-50
-52
-231
-66
-70
-247
-88
-93
-246
-87
-92
-255
-111
-117
-229
-68
-74
-235
-72
-77
-224
-60
-67
-254
-91
-96
-255
-109
-115
-220
-59
-64
-255
-123
-128
-255
-108
-112
-234
-81
-84
-211
-61
-63
-198
-48
-50
-215
-59
-62
-241
-72
-75
-235
-59
-62
-237
-56
-63
-246
-62
-70
-240
-56
-66
-230
-46
-56
-241
-64
-74
-255
-95
-103
-255
-110
-119
-255
-107
-114
-254
-100
-110
-245
-94
-103
-247
-95
-107
-253
-99
-111
-253
-95
-110
-246
-90
-101
-241
-93
-93
-227
-80
-73
-226
-74
-71
-213
-55
-52
-210
-47
-48
-217
-53
-52
-210
-48
-46
-216
-57
-53
-223
-68
-63
-227
-74
-68
-226
-73
-65
-217
-64
-56
-211
-54
-47
-214
-52
-47
-220
-55
-49
-232
-54
-54
-234
-39
-47
-252
-48
-60
-254
-50
-61
-247
-43
-54
-249
-48
-58
-255
-62
-69
-253
-63
-65
-236
-52
-52
-226
-51
-46
-224
-53
-46
-222
-54
-45
-223
-52
-44
-225
-51
-42
-232
-51
-44
-239
-52
-47
-244
-52
-49
-246
-48
-49
-247
-47
-50
-249
-46
-49
-248
-45
-48
-248
-46
-46
-242
-47
-45
-235
-50
-45
-227
-55
-45
-215
-57
-46
-209
-63
-50
-182
-48
-37
-178
-54
-44
-176
-54
-49
-232
-112
-111
-255
-135
-136
-255
-134
-142
-255
-110
-128
-252
-99
-120
-241
-94
-113
-242
-90
-111
-245
-81
-106
-246
-67
-97
-253
-57
-95
-253
-59
-96
-242
-67
-98
-225
-84
-103
-174
-82
-87
-98
-48
-39
-89
-68
-51
-74
-69
-47
-85
-83
-60
-88
-93
-63
-99
-115
-76
-105
-129
-81
-113
-139
-91
-118
-146
-95
-122
-152
-98
-124
-157
-100
-120
-156
-95
-114
-153
-90
-110
-151
-85
-110
-151
-85
-110
-151
-85
-111
-152
-86
-114
-153
-90
-116
-155
-92
-119
-155
-93
-119
-158
-93
-119
-158
-91
-120
-161
-91
-121
-163
-91
-119
-163
-88
-118
-162
-87
-118
-162
-85
-119
-163
-84
-121
-165
-88
-122
-164
-90
-126
-166
-95
-129
-166
-99
-127
-161
-100
-126
-156
-102
-123
-151
-102
-114
-140
-93
-105
-130
-88
-95
-117
-81
-92
-113
-82
-86
-107
-76
-92
-76
-60
-94
-78
-62
-96
-80
-64
-96
-80
-64
-95
-79
-63
-95
-79
-63
-95
-79
-63
-97
-81
-65
-98
-82
-66
-95
-79
-63
-93
-77
-61
-93
-77
-61
-97
-81
-65
-99
-83
-67
-98
-82
-66
-96
-81
-62
-100
-83
-63
-97
-80
-62
-93
-80
-64
-94
-81
-73
-91
-81
-80
-90
-83
-90
-101
-97
-112
-115
-113
-137
-121
-120
-154
-122
-124
-165
-126
-128
-177
-128
-129
-185
-125
-127
-186
-120
-122
-183
-114
-115
-180
-108
-111
-182
-116
-119
-198
-118
-124
-202
-128
-131
-202
-139
-141
-198
-150
-151
-195
-164
-164
-190
-178
-176
-187
-188
-185
-180
-203
-197
-181
-211
-204
-176
-217
-207
-172
-219
-207
-165
-220
-207
-163
-221
-209
-161
-217
-203
-156
-217
-194
-152
-209
-168
-136
-184
-128
-103
-161
-93
-70
-203
-122
-103
-216
-116
-101
-189
-72
-63
-216
-81
-78
-247
-99
-99
-233
-75
-76
-229
-63
-65
-225
-57
-57
-227
-59
-58
-226
-58
-57
-219
-55
-53
-216
-54
-49
-214
-59
-54
-203
-56
-49
-192
-53
-46
-199
-66
-59
-187
-60
-51
-191
-73
-63
-198
-88
-75
-185
-79
-65
-206
-100
-86
-209
-99
-84
-204
-88
-73
-197
-71
-57
-196
-58
-47
-205
-54
-45
-216
-55
-47
-225
-54
-47
-227
-52
-47
-223
-48
-45
-223
-50
-44
-224
-55
-48
-228
-61
-52
-224
-60
-48
-221
-55
-41
-223
-53
-40
-229
-55
-44
-228
-47
-36
-234
-47
-38
-236
-47
-41
-238
-49
-45
-238
-50
-48
-235
-52
-48
-232
-53
-49
-226
-54
-52
-215
-55
-57
-230
-74
-78
-245
-89
-93
-237
-78
-83
-215
-56
-61
-215
-54
-60
-249
-88
-96
-255
-126
-132
-255
-120
-128
-255
-107
-113
-255
-99
-107
-255
-102
-109
-255
-101
-107
-245
-92
-97
-242
-89
-92
-252
-91
-96
-255
-87
-90
-255
-70
-75
-249
-58
-66
-248
-57
-65
-243
-51
-62
-235
-45
-57
-234
-50
-62
-238
-62
-72
-252
-85
-95
-255
-97
-105
-255
-104
-114
-254
-103
-112
-251
-100
-109
-254
-100
-110
-255
-97
-111
-251
-94
-103
-237
-83
-83
-223
-70
-64
-214
-56
-53
-214
-52
-49
-215
-49
-49
-215
-47
-46
-216
-51
-49
-219
-57
-52
-225
-68
-61
-220
-66
-58
-217
-63
-55
-214
-60
-52
-215
-57
-48
-219
-56
-49
-224
-57
-51
-230
-54
-54
-240
-55
-60
-243
-52
-59
-243
-52
-59
-246
-52
-60
-245
-54
-59
-242
-53
-57
-235
-51
-51
-227
-49
-47
-222
-51
-44
-222
-53
-46
-223
-55
-46
-224
-53
-43
-228
-51
-43
-233
-50
-44
-239
-50
-44
-245
-50
-48
-247
-49
-50
-248
-48
-51
-250
-47
-50
-249
-46
-49
-249
-47
-47
-243
-48
-46
-236
-51
-46
-229
-55
-46
-224
-63
-53
-204
-56
-44
-191
-54
-44
-175
-47
-38
-184
-59
-55
-210
-88
-87
-255
-152
-154
-254
-123
-131
-255
-109
-128
-255
-102
-124
-246
-93
-114
-239
-81
-104
-241
-72
-101
-249
-68
-101
-253
-61
-100
-245
-59
-96
-242
-79
-108
-209
-84
-100
-137
-61
-63
-80
-44
-32
-69
-58
-38
-68
-70
-46
-77
-77
-53
-90
-94
-67
-91
-105
-69
-99
-120
-77
-113
-136
-90
-120
-146
-98
-120
-150
-96
-116
-149
-92
-114
-150
-89
-113
-152
-89
-108
-149
-83
-109
-150
-82
-110
-151
-83
-111
-152
-84
-114
-153
-88
-116
-155
-90
-117
-156
-93
-117
-156
-91
-116
-155
-88
-116
-157
-87
-118
-160
-88
-119
-161
-87
-118
-162
-87
-118
-162
-85
-117
-161
-84
-116
-160
-83
-123
-165
-91
-123
-163
-93
-122
-158
-94
-117
-151
-91
-109
-139
-85
-98
-126
-77
-88
-114
-67
-83
-106
-62
-63
-85
-46
-63
-85
-47
-62
-84
-46
-91
-75
-59
-94
-78
-62
-96
-80
-64
-96
-80
-64
-96
-80
-64
-95
-79
-63
-96
-80
-64
-97
-81
-65
-98
-82
-66
-96
-80
-64
-95
-79
-63
-96
-80
-64
-98
-82
-66
-99
-83
-67
-98
-82
-66
-96
-80
-64
-102
-86
-71
-95
-81
-70
-92
-79
-71
-94
-84
-83
-97
-90
-97
-100
-96
-111
-109
-107
-131
-118
-119
-150
-119
-121
-162
-123
-125
-174
-125
-127
-184
-120
-124
-185
-113
-117
-181
-107
-112
-180
-108
-111
-182
-110
-113
-190
-117
-119
-206
-124
-126
-211
-137
-137
-209
-152
-152
-206
-168
-167
-199
-184
-182
-193
-201
-197
-186
-211
-206
-177
-219
-214
-172
-226
-219
-167
-231
-222
-167
-230
-221
-164
-228
-219
-164
-226
-216
-163
-219
-209
-158
-212
-199
-154
-212
-188
-154
-189
-155
-128
-170
-124
-100
-199
-138
-119
-202
-125
-109
-182
-86
-74
-211
-96
-91
-246
-114
-112
-236
-90
-91
-231
-75
-76
-226
-63
-64
-228
-62
-62
-233
-63
-64
-229
-59
-59
-224
-54
-54
-219
-54
-52
-214
-61
-56
-201
-56
-51
-202
-63
-56
-185
-54
-46
-184
-62
-51
-189
-75
-64
-182
-72
-59
-200
-93
-77
-221
-111
-96
-212
-96
-81
-198
-72
-58
-189
-53
-41
-196
-48
-38
-212
-54
-45
-220
-53
-45
-219
-48
-41
-226
-53
-49
-229
-57
-53
-228
-61
-55
-224
-60
-51
-220
-56
-46
-219
-53
-41
-223
-52
-42
-227
-53
-42
-236
-55
-46
-237
-53
-43
-237
-50
-43
-235
-48
-43
-231
-48
-44
-227
-50
-44
-225
-52
-46
-221
-53
-50
-214
-56
-55
-216
-62
-64
-228
-74
-76
-243
-87
-91
-250
-94
-98
-252
-92
-100
-254
-93
-101
-255
-97
-105
-240
-79
-87
-235
-74
-82
-238
-78
-86
-252
-92
-100
-255
-104
-111
-255
-101
-107
-244
-89
-95
-242
-79
-84
-236
-53
-58
-239
-45
-53
-241
-44
-54
-244
-47
-57
-238
-40
-53
-228
-34
-45
-227
-41
-54
-234
-57
-67
-251
-81
-90
-253
-92
-100
-255
-100
-108
-255
-101
-109
-255
-102
-110
-255
-101
-109
-252
-92
-104
-242
-82
-90
-229
-69
-69
-222
-60
-55
-219
-54
-52
-222
-54
-51
-223
-53
-53
-220
-51
-48
-218
-50
-47
-219
-54
-50
-224
-62
-57
-219
-62
-55
-216
-59
-52
-215
-58
-51
-219
-56
-49
-223
-56
-50
-229
-57
-53
-231
-58
-54
-233
-57
-59
-234
-55
-58
-235
-55
-58
-238
-55
-57
-238
-55
-57
-236
-54
-53
-229
-51
-49
-223
-50
-44
-220
-51
-44
-221
-54
-45
-223
-55
-44
-226
-54
-44
-229
-50
-43
-234
-49
-44
-242
-49
-44
-245
-50
-48
-247
-49
-50
-247
-48
-51
-250
-47
-50
-249
-46
-49
-247
-47
-47
-243
-48
-46
-236
-51
-46
-229
-55
-46
-223
-60
-51
-212
-61
-50
-194
-56
-46
-182
-49
-42
-183
-55
-52
-216
-90
-91
-255
-144
-147
-251
-115
-125
-254
-103
-122
-254
-94
-118
-247
-87
-111
-244
-80
-105
-246
-71
-102
-246
-65
-98
-250
-61
-99
-241
-66
-99
-227
-81
-104
-183
-76
-86
-119
-60
-56
-76
-50
-35
-62
-57
-35
-61
-65
-40
-71
-71
-47
-80
-83
-56
-88
-99
-65
-96
-114
-74
-110
-131
-88
-117
-143
-95
-118
-147
-93
-116
-147
-88
-113
-147
-86
-112
-148
-84
-107
-146
-79
-107
-148
-80
-108
-149
-81
-109
-150
-82
-112
-151
-86
-114
-153
-88
-115
-154
-91
-115
-154
-89
-116
-155
-88
-117
-157
-87
-117
-159
-87
-117
-159
-87
-116
-158
-84
-114
-158
-81
-113
-157
-82
-112
-156
-81
-110
-152
-80
-108
-148
-78
-104
-140
-76
-98
-129
-70
-88
-117
-63
-78
-105
-54
-70
-93
-47
-64
-87
-43
-64
-87
-45
-64
-87
-45
-64
-87
-45
-89
-76
-60
-91
-78
-62
-94
-81
-65
-94
-81
-65
-94
-81
-65
-94
-81
-65
-95
-82
-66
-96
-83
-67
-97
-84
-68
-96
-83
-67
-95
-82
-66
-96
-83
-67
-97
-84
-68
-97
-84
-68
-96
-83
-67
-94
-80
-67
-98
-85
-77
-92
-81
-77
-91
-81
-82
-99
-89
-98
-107
-100
-116
-113
-109
-132
-118
-117
-149
-121
-123
-164
-121
-123
-172
-121
-126
-182
-120
-124
-187
-110
-115
-181
-101
-105
-176
-96
-103
-175
-106
-110
-184
-114
-117
-196
-125
-125
-213
-135
-133
-217
-151
-148
-217
-169
-167
-216
-187
-185
-209
-203
-201
-202
-220
-215
-193
-229
-224
-184
-233
-228
-173
-237
-231
-169
-240
-232
-167
-237
-229
-166
-231
-225
-167
-226
-219
-165
-215
-207
-160
-203
-196
-154
-185
-174
-144
-170
-154
-129
-156
-130
-107
-171
-130
-112
-168
-110
-96
-158
-81
-71
-187
-93
-85
-222
-109
-105
-247
-117
-117
-238
-96
-95
-227
-74
-76
-226
-66
-68
-234
-65
-68
-235
-62
-64
-231
-57
-58
-224
-54
-54
-223
-61
-58
-212
-59
-54
-212
-65
-58
-194
-55
-48
-183
-55
-44
-183
-62
-51
-174
-61
-47
-182
-70
-56
-219
-106
-92
-223
-105
-91
-217
-91
-77
-202
-66
-54
-197
-50
-40
-209
-52
-43
-217
-54
-45
-217
-50
-44
-222
-53
-50
-233
-65
-62
-236
-71
-67
-224
-61
-54
-213
-50
-41
-213
-49
-39
-218
-50
-39
-222
-48
-37
-230
-52
-42
-232
-49
-41
-231
-46
-41
-230
-47
-41
-227
-50
-44
-226
-55
-47
-225
-61
-52
-224
-66
-57
-198
-45
-40
-202
-52
-51
-220
-68
-67
-240
-86
-88
-250
-94
-98
-247
-90
-97
-243
-83
-91
-241
-81
-91
-231
-69
-80
-232
-70
-81
-237
-77
-87
-251
-91
-101
-255
-107
-116
-255
-109
-115
-242
-87
-93
-225
-60
-66
-232
-47
-53
-242
-45
-52
-250
-50
-60
-251
-51
-62
-244
-44
-57
-236
-40
-52
-243
-55
-69
-255
-76
-87
-245
-74
-83
-244
-80
-87
-247
-87
-95
-252
-95
-102
-255
-100
-107
-255
-97
-105
-246
-82
-89
-232
-67
-73
-222
-57
-55
-222
-55
-49
-227
-55
-53
-233
-60
-56
-235
-59
-59
-230
-57
-53
-225
-53
-49
-221
-54
-48
-221
-58
-51
-217
-59
-50
-215
-57
-48
-215
-57
-48
-220
-55
-49
-225
-56
-51
-231
-58
-54
-233
-60
-56
-227
-57
-57
-227
-57
-57
-229
-57
-55
-231
-57
-56
-232
-56
-56
-230
-55
-52
-225
-52
-48
-219
-50
-43
-218
-54
-45
-219
-55
-45
-222
-56
-44
-226
-54
-44
-231
-50
-41
-235
-48
-41
-243
-48
-44
-247
-49
-48
-245
-49
-50
-245
-49
-51
-248
-48
-50
-247
-47
-49
-247
-47
-47
-242
-48
-46
-238
-51
-46
-231
-54
-46
-221
-57
-48
-220
-68
-57
-199
-56
-48
-187
-52
-46
-181
-47
-46
-228
-95
-98
-255
-131
-136
-248
-108
-119
-252
-99
-120
-251
-88
-115
-248
-81
-109
-251
-78
-108
-250
-69
-102
-243
-59
-93
-239
-61
-95
-233
-74
-102
-210
-85
-103
-155
-68
-74
-107
-60
-52
-79
-62
-44
-62
-60
-39
-59
-63
-40
-70
-68
-47
-72
-72
-48
-81
-92
-60
-89
-107
-69
-103
-124
-81
-114
-137
-91
-116
-143
-90
-113
-144
-85
-109
-143
-82
-107
-143
-79
-105
-144
-77
-105
-145
-75
-105
-146
-76
-107
-148
-80
-109
-150
-84
-110
-151
-85
-112
-151
-88
-113
-152
-87
-117
-156
-89
-117
-157
-87
-116
-156
-85
-114
-156
-84
-112
-154
-82
-109
-151
-77
-107
-149
-77
-106
-148
-76
-101
-141
-71
-97
-136
-69
-91
-127
-65
-85
-116
-59
-76
-105
-51
-69
-96
-45
-65
-88
-42
-62
-85
-39
-67
-93
-48
-68
-94
-49
-69
-95
-50
-87
-74
-58
-90
-77
-61
-92
-79
-63
-94
-81
-65
-93
-80
-64
-94
-81
-65
-95
-82
-66
-97
-84
-68
-96
-83
-67
-96
-83
-67
-96
-83
-67
-97
-84
-68
-97
-84
-68
-96
-83
-67
-95
-82
-66
-92
-80
-68
-90
-79
-77
-90
-81
-86
-98
-88
-99
-106
-99
-115
-113
-109
-134
-118
-117
-149
-120
-122
-163
-122
-124
-173
-119
-124
-180
-115
-121
-183
-109
-114
-180
-98
-105
-175
-93
-100
-172
-97
-103
-177
-108
-114
-190
-120
-123
-202
-137
-138
-221
-149
-146
-225
-164
-162
-225
-182
-181
-225
-199
-196
-217
-213
-209
-208
-225
-220
-198
-231
-227
-189
-235
-229
-179
-238
-233
-175
-238
-232
-174
-233
-226
-171
-227
-219
-170
-218
-211
-167
-203
-195
-158
-188
-182
-150
-166
-164
-139
-157
-152
-132
-150
-134
-118
-155
-127
-113
-155
-113
-99
-156
-98
-87
-181
-104
-96
-208
-113
-109
-251
-139
-137
-243
-118
-116
-232
-92
-93
-229
-76
-78
-229
-69
-71
-234
-65
-68
-234
-61
-63
-232
-60
-60
-223
-58
-56
-219
-60
-56
-222
-69
-63
-211
-67
-59
-195
-58
-48
-186
-58
-47
-176
-54
-41
-167
-49
-35
-191
-73
-59
-219
-97
-82
-234
-107
-92
-219
-83
-69
-201
-58
-44
-204
-52
-39
-212
-54
-43
-215
-52
-45
-217
-52
-50
-241
-77
-75
-254
-90
-88
-237
-75
-70
-217
-56
-48
-214
-51
-42
-219
-52
-43
-222
-50
-40
-223
-46
-38
-225
-44
-37
-225
-44
-37
-222
-45
-37
-220
-49
-41
-218
-54
-44
-217
-59
-48
-215
-63
-52
-194
-47
-39
-196
-52
-44
-206
-58
-54
-217
-67
-66
-223
-70
-72
-224
-69
-73
-228
-71
-78
-234
-77
-86
-241
-81
-93
-246
-86
-98
-247
-87
-97
-248
-91
-100
-255
-102
-111
-255
-107
-115
-241
-86
-94
-219
-56
-61
-233
-50
-55
-240
-47
-52
-241
-46
-54
-240
-43
-52
-235
-37
-50
-235
-41
-52
-249
-62
-73
-255
-83
-95
-237
-63
-73
-232
-65
-73
-234
-71
-76
-242
-81
-86
-255
-90
-96
-255
-88
-93
-244
-71
-77
-227
-54
-56
-225
-53
-51
-228
-55
-51
-234
-59
-56
-242
-64
-62
-244
-64
-63
-239
-61
-59
-230
-57
-53
-224
-55
-50
-221
-56
-50
-218
-57
-49
-217
-56
-48
-217
-56
-48
-220
-55
-49
-227
-55
-51
-232
-57
-54
-233
-58
-55
-226
-58
-55
-224
-59
-57
-227
-58
-55
-230
-58
-56
-231
-58
-54
-229
-56
-52
-224
-53
-46
-218
-51
-43
-218
-54
-44
-219
-55
-45
-222
-56
-44
-226
-54
-44
-231
-50
-41
-235
-48
-41
-242
-47
-43
-246
-48
-47
-244
-50
-50
-244
-50
-51
-247
-49
-50
-246
-48
-49
-246
-48
-47
-242
-48
-46
-238
-51
-46
-231
-54
-46
-220
-56
-47
-224
-70
-60
-201
-57
-49
-190
-51
-46
-182
-44
-44
-238
-102
-106
-255
-121
-128
-248
-103
-116
-253
-100
-121
-250
-86
-113
-251
-76
-107
-255
-72
-106
-252
-64
-99
-239
-55
-89
-232
-63
-94
-224
-82
-104
-195
-89
-101
-135
-67
-66
-101
-67
-55
-90
-79
-59
-72
-70
-49
-65
-67
-45
-76
-71
-51
-70
-68
-45
-76
-85
-54
-83
-99
-62
-98
-116
-76
-108
-131
-85
-112
-139
-88
-110
-141
-82
-107
-141
-80
-105
-142
-75
-103
-143
-73
-104
-144
-74
-104
-145
-75
-106
-147
-77
-107
-148
-80
-109
-150
-84
-111
-150
-87
-112
-151
-86
-116
-155
-88
-115
-155
-85
-113
-153
-83
-111
-151
-80
-106
-147
-77
-103
-144
-74
-101
-142
-72
-100
-141
-71
-96
-135
-68
-93
-129
-65
-87
-121
-61
-82
-113
-56
-77
-105
-54
-76
-102
-54
-78
-101
-55
-79
-102
-56
-77
-103
-56
-78
-104
-56
-79
-105
-58
-85
-72
-56
-87
-74
-58
-91
-78
-62
-92
-79
-63
-93
-80
-64
-93
-80
-64
-95
-82
-66
-97
-84
-68
-95
-82
-66
-96
-83
-67
-97
-84
-68
-97
-84
-68
-96
-83
-67
-95
-82
-66
-95
-82
-66
-94
-81
-73
-86
-77
-82
-95
-88
-104
-110
-102
-123
-116
-112
-137
-120
-116
-151
-120
-119
-161
-120
-122
-171
-121
-123
-180
-115
-121
-183
-106
-114
-179
-96
-103
-173
-91
-99
-171
-95
-103
-176
-106
-114
-187
-118
-124
-198
-128
-132
-206
-147
-149
-223
-158
-159
-224
-173
-174
-228
-187
-189
-228
-203
-201
-225
-212
-211
-217
-221
-218
-209
-225
-223
-202
-229
-224
-194
-230
-226
-191
-228
-222
-188
-224
-215
-182
-218
-208
-181
-206
-198
-175
-190
-182
-163
-174
-167
-151
-155
-153
-140
-143
-141
-128
-140
-132
-121
-141
-123
-113
-147
-117
-107
-157
-114
-105
-169
-109
-101
-188
-111
-105
-230
-137
-132
-237
-129
-126
-240
-116
-114
-240
-102
-100
-238
-88
-89
-237
-79
-78
-235
-69
-69
-233
-65
-64
-227
-58
-55
-224
-59
-55
-228
-66
-61
-222
-69
-63
-204
-60
-51
-198
-61
-51
-196
-66
-53
-175
-49
-35
-174
-48
-34
-199
-73
-59
-220
-88
-75
-214
-78
-64
-204
-61
-47
-206
-56
-42
-208
-54
-42
-209
-51
-42
-214
-52
-50
-245
-85
-85
-255
-107
-104
-250
-93
-88
-227
-68
-62
-220
-59
-51
-223
-59
-50
-227
-56
-48
-226
-52
-45
-227
-50
-44
-226
-49
-43
-221
-48
-41
-212
-48
-39
-205
-47
-36
-198
-47
-36
-194
-48
-35
-197
-57
-44
-192
-52
-39
-193
-51
-41
-203
-58
-53
-215
-67
-65
-219
-69
-71
-219
-66
-71
-218
-64
-72
-225
-69
-80
-236
-80
-91
-242
-86
-97
-242
-86
-97
-249
-93
-104
-255
-101
-109
-241
-87
-95
-222
-63
-68
-233
-59
-60
-237
-53
-55
-237
-51
-56
-239
-50
-56
-242
-50
-61
-247
-57
-67
-255
-72
-83
-255
-86
-95
-229
-53
-63
-222
-51
-59
-223
-54
-59
-234
-65
-68
-249
-74
-79
-253
-72
-77
-244
-59
-65
-233
-49
-51
-232
-53
-49
-235
-57
-53
-239
-60
-56
-242
-60
-57
-243
-59
-57
-240
-58
-55
-233
-55
-51
-226
-55
-48
-223
-59
-50
-220
-59
-49
-219
-58
-48
-220
-57
-48
-223
-56
-50
-228
-55
-51
-232
-54
-52
-233
-55
-53
-230
-58
-56
-228
-59
-56
-230
-58
-56
-232
-58
-57
-232
-59
-55
-230
-57
-53
-225
-54
-47
-220
-51
-44
-219
-55
-45
-220
-56
-46
-223
-57
-45
-225
-55
-42
-229
-51
-41
-233
-49
-41
-241
-48
-41
-244
-49
-45
-243
-51
-50
-241
-51
-51
-244
-50
-50
-244
-48
-49
-244
-49
-47
-242
-48
-46
-238
-51
-46
-231
-54
-46
-222
-55
-47
-224
-67
-58
-202
-55
-48
-192
-49
-45
-192
-49
-51
-247
-106
-112
-255
-113
-122
-249
-103
-116
-248
-95
-116
-246
-82
-109
-252
-68
-102
-255
-63
-100
-255
-59
-99
-242
-58
-94
-228
-71
-100
-216
-91
-109
-171
-86
-91
-119
-69
-62
-100
-74
-61
-97
-89
-70
-84
-79
-59
-75
-73
-52
-80
-73
-54
-71
-69
-46
-71
-80
-51
-76
-92
-56
-90
-108
-70
-102
-124
-78
-109
-133
-83
-109
-138
-82
-108
-140
-77
-104
-141
-74
-102
-142
-72
-103
-143
-72
-103
-145
-73
-105
-146
-76
-106
-147
-79
-108
-149
-83
-110
-149
-86
-111
-150
-85
-116
-153
-86
-115
-152
-85
-110
-149
-82
-106
-146
-76
-102
-143
-75
-99
-140
-72
-97
-138
-70
-95
-136
-70
-90
-129
-66
-88
-124
-63
-83
-116
-59
-80
-110
-56
-79
-107
-58
-82
-108
-61
-87
-110
-64
-90
-113
-67
-85
-111
-63
-85
-112
-61
-85
-111
-63
-82
-69
-53
-85
-72
-56
-88
-75
-59
-90
-77
-61
-91
-78
-62
-92
-79
-63
-94
-81
-65
-96
-83
-67
-96
-83
-67
-97
-84
-68
-97
-84
-68
-97
-84
-68
-96
-83
-67
-96
-83
-67
-98
-85
-69
-97
-86
-80
-94
-86
-99
-106
-101
-124
-121
-117
-144
-125
-121
-154
-122
-121
-161
-120
-121
-169
-118
-121
-176
-115
-119
-180
-106
-114
-179
-99
-106
-176
-91
-99
-171
-93
-101
-174
-104
-112
-185
-118
-126
-199
-129
-135
-209
-136
-141
-209
-153
-157
-220
-163
-166
-221
-175
-179
-226
-187
-191
-228
-198
-199
-227
-207
-206
-224
-212
-211
-219
-215
-213
-214
-217
-214
-209
-217
-213
-204
-215
-208
-198
-210
-201
-192
-204
-195
-190
-197
-186
-184
-180
-168
-168
-163
-155
-153
-141
-137
-134
-124
-121
-116
-124
-116
-113
-120
-107
-101
-130
-107
-101
-143
-110
-103
-144
-97
-91
-157
-96
-91
-192
-115
-109
-215
-122
-117
-237
-128
-123
-249
-126
-121
-253
-115
-112
-250
-100
-99
-243
-85
-84
-237
-73
-71
-237
-68
-63
-234
-62
-58
-225
-60
-54
-224
-65
-59
-209
-58
-49
-211
-67
-58
-221
-84
-74
-194
-62
-50
-184
-54
-41
-189
-57
-44
-194
-61
-46
-200
-63
-47
-207
-66
-49
-215
-67
-53
-214
-64
-49
-209
-55
-45
-208
-50
-47
-234
-76
-77
-250
-95
-93
-242
-87
-83
-223
-68
-63
-217
-58
-52
-219
-56
-49
-224
-55
-48
-230
-57
-51
-231
-57
-50
-231
-57
-50
-226
-58
-49
-218
-57
-47
-209
-57
-44
-202
-56
-43
-196
-56
-41
-176
-40
-24
-184
-51
-34
-200
-64
-50
-211
-73
-62
-210
-68
-64
-203
-59
-58
-204
-55
-59
-207
-58
-64
-211
-57
-67
-227
-73
-83
-237
-86
-95
-240
-89
-98
-244
-93
-102
-246
-95
-104
-232
-83
-89
-218
-63
-67
-229
-64
-62
-236
-63
-59
-243
-64
-67
-253
-70
-74
-255
-76
-84
-255
-81
-89
-255
-84
-93
-255
-85
-94
-226
-51
-58
-221
-46
-53
-221
-46
-51
-231
-55
-58
-245
-60
-65
-249
-58
-63
-248
-52
-56
-244
-48
-50
-237
-52
-50
-239
-57
-53
-240
-56
-54
-237
-52
-50
-235
-50
-48
-234
-50
-48
-231
-52
-48
-225
-52
-46
-227
-60
-52
-224
-61
-52
-223
-60
-51
-222
-59
-50
-225
-56
-51
-228
-55
-51
-232
-52
-51
-232
-52
-51
-232
-56
-56
-231
-57
-56
-232
-56
-56
-235
-57
-57
-235
-57
-55
-233
-55
-53
-226
-53
-47
-222
-51
-44
-219
-55
-45
-220
-56
-44
-221
-58
-43
-223
-55
-42
-227
-50
-40
-231
-48
-40
-239
-48
-40
-242
-49
-44
-241
-52
-50
-240
-52
-51
-243
-51
-50
-243
-49
-49
-243
-49
-47
-241
-49
-46
-236
-51
-46
-231
-54
-46
-224
-57
-49
-217
-60
-51
-204
-55
-49
-193
-48
-45
-209
-64
-67
-255
-110
-117
-253
-107
-117
-247
-99
-113
-237
-84
-105
-241
-74
-102
-250
-62
-97
-255
-55
-94
-255
-55
-98
-248
-64
-100
-227
-79
-105
-200
-92
-105
-139
-71
-70
-106
-70
-58
-93
-76
-60
-93
-86
-67
-88
-81
-62
-81
-74
-55
-79
-71
-52
-73
-68
-46
-68
-74
-46
-71
-85
-50
-83
-99
-62
-94
-115
-72
-103
-127
-77
-106
-135
-79
-106
-138
-75
-103
-140
-71
-103
-140
-70
-102
-142
-71
-102
-144
-72
-103
-144
-74
-105
-146
-78
-107
-148
-82
-109
-148
-85
-109
-148
-85
-113
-149
-85
-111
-148
-81
-106
-145
-78
-103
-142
-75
-99
-140
-72
-96
-137
-69
-95
-136
-70
-94
-134
-71
-92
-130
-69
-91
-126
-68
-87
-120
-65
-86
-114
-63
-85
-111
-64
-89
-112
-66
-93
-114
-71
-94
-117
-71
-90
-114
-66
-88
-115
-64
-88
-115
-64
-78
-66
-50
-81
-69
-53
-85
-73
-57
-87
-75
-59
-88
-76
-60
-90
-78
-62
-92
-80
-64
-94
-82
-66
-97
-85
-69
-98
-86
-70
-98
-86
-70
-97
-85
-69
-95
-83
-67
-97
-85
-69
-102
-90
-74
-104
-93
-89
-110
-103
-119
-117
-112
-142
-124
-120
-153
-123
-121
-160
-119
-120
-166
-118
-119
-173
-112
-117
-175
-106
-111
-175
-97
-104
-172
-94
-102
-174
-95
-103
-176
-101
-109
-182
-112
-120
-192
-125
-133
-205
-137
-144
-216
-143
-151
-214
-153
-161
-210
-161
-168
-210
-170
-178
-217
-180
-186
-222
-186
-191
-223
-192
-193
-224
-195
-195
-223
-199
-197
-221
-198
-194
-217
-197
-192
-212
-193
-186
-204
-188
-179
-196
-187
-176
-193
-181
-168
-186
-166
-153
-170
-150
-139
-153
-139
-132
-139
-117
-111
-113
-119
-110
-111
-115
-101
-101
-122
-102
-101
-137
-109
-106
-133
-94
-89
-150
-99
-95
-155
-90
-84
-183
-103
-96
-214
-117
-110
-237
-124
-118
-252
-125
-119
-255
-120
-115
-254
-106
-102
-249
-92
-87
-252
-83
-78
-245
-72
-66
-230
-61
-54
-231
-68
-61
-216
-59
-52
-219
-71
-61
-234
-92
-82
-197
-59
-48
-196
-60
-48
-189
-55
-43
-190
-54
-40
-199
-62
-46
-209
-68
-51
-212
-66
-51
-212
-65
-49
-215
-65
-51
-210
-56
-54
-216
-62
-62
-221
-67
-67
-220
-66
-64
-214
-61
-55
-213
-56
-49
-216
-55
-47
-222
-55
-47
-229
-58
-51
-230
-57
-51
-229
-58
-51
-226
-59
-51
-219
-62
-53
-213
-65
-53
-209
-69
-56
-204
-71
-54
-174
-45
-24
-188
-59
-37
-205
-74
-56
-209
-76
-61
-198
-61
-53
-187
-48
-43
-192
-48
-48
-202
-57
-62
-215
-65
-74
-226
-76
-85
-236
-86
-97
-240
-90
-101
-239
-92
-100
-236
-89
-97
-223
-76
-82
-212
-62
-64
-209
-52
-47
-218
-53
-47
-227
-57
-57
-237
-63
-64
-245
-66
-72
-247
-68
-74
-244
-64
-73
-239
-62
-70
-228
-51
-59
-225
-48
-54
-230
-49
-54
-240
-55
-60
-247
-54
-57
-249
-49
-52
-254
-45
-50
-253
-49
-52
-239
-50
-48
-240
-57
-53
-240
-55
-52
-236
-48
-46
-232
-44
-42
-231
-48
-44
-230
-51
-46
-224
-51
-44
-228
-61
-53
-224
-61
-52
-224
-61
-52
-224
-60
-51
-227
-58
-53
-230
-57
-53
-234
-54
-53
-236
-54
-53
-236
-53
-55
-236
-53
-55
-237
-53
-55
-238
-54
-56
-238
-54
-54
-235
-53
-52
-228
-50
-46
-222
-49
-43
-222
-55
-46
-221
-57
-45
-221
-58
-43
-223
-55
-42
-225
-52
-38
-230
-49
-38
-237
-49
-40
-241
-49
-44
-240
-52
-50
-238
-53
-51
-241
-52
-50
-242
-50
-49
-243
-49
-47
-241
-49
-46
-236
-51
-46
-231
-54
-46
-226
-59
-51
-210
-52
-43
-210
-58
-53
-198
-50
-48
-231
-85
-88
-255
-112
-120
-249
-99
-110
-241
-90
-105
-227
-75
-96
-239
-72
-102
-253
-58
-98
-255
-49
-93
-255
-54
-98
-253
-67
-104
-219
-77
-101
-177
-80
-89
-106
-53
-47
-94
-71
-55
-88
-75
-58
-85
-78
-59
-89
-81
-62
-85
-74
-56
-76
-64
-48
-73
-68
-48
-64
-70
-44
-65
-79
-46
-75
-91
-54
-88
-106
-64
-98
-120
-71
-102
-129
-74
-104
-136
-73
-102
-139
-70
-101
-138
-68
-99
-139
-66
-99
-141
-69
-101
-142
-72
-103
-144
-76
-104
-145
-79
-105
-145
-82
-107
-146
-83
-110
-146
-82
-108
-144
-80
-104
-143
-78
-100
-139
-74
-97
-138
-72
-95
-136
-70
-95
-135
-72
-95
-135
-72
-95
-133
-72
-95
-130
-72
-93
-126
-71
-93
-121
-70
-93
-119
-72
-96
-119
-75
-99
-120
-79
-99
-122
-78
-92
-116
-66
-90
-117
-64
-90
-117
-64
-74
-67
-51
-77
-70
-54
-81
-72
-57
-84
-75
-60
-87
-75
-61
-89
-77
-63
-92
-79
-63
-94
-81
-65
-100
-87
-70
-101
-88
-71
-100
-88
-72
-98
-86
-70
-95
-85
-73
-97
-87
-77
-103
-94
-85
-108
-99
-102
-119
-114
-137
-121
-117
-154
-120
-118
-158
-116
-115
-159
-114
-114
-164
-116
-117
-173
-108
-112
-175
-98
-103
-169
-90
-97
-169
-95
-101
-175
-102
-108
-184
-109
-115
-191
-118
-124
-200
-129
-135
-211
-143
-147
-221
-151
-156
-222
-155
-161
-211
-160
-167
-209
-169
-174
-216
-174
-179
-221
-177
-180
-223
-178
-179
-223
-180
-179
-223
-182
-179
-222
-181
-176
-217
-179
-172
-213
-174
-166
-203
-171
-161
-196
-170
-159
-193
-164
-153
-185
-153
-140
-170
-136
-126
-150
-126
-120
-132
-102
-97
-103
-108
-99
-102
-100
-88
-90
-108
-90
-88
-124
-99
-95
-123
-86
-80
-147
-98
-93
-140
-77
-70
-162
-85
-77
-187
-97
-88
-212
-108
-99
-238
-121
-114
-255
-129
-122
-255
-124
-119
-255
-112
-106
-254
-97
-92
-247
-84
-79
-233
-71
-66
-238
-79
-73
-221
-66
-61
-222
-71
-64
-234
-87
-79
-186
-44
-34
-190
-49
-39
-190
-52
-39
-199
-62
-46
-209
-69
-54
-203
-62
-45
-193
-50
-34
-202
-55
-39
-219
-69
-55
-222
-69
-63
-211
-57
-55
-204
-51
-46
-205
-53
-48
-212
-59
-53
-215
-61
-53
-221
-60
-52
-225
-61
-52
-228
-59
-52
-228
-57
-50
-222
-53
-46
-215
-52
-43
-207
-53
-41
-202
-56
-43
-197
-60
-44
-194
-63
-45
-212
-83
-62
-200
-71
-50
-189
-60
-41
-190
-58
-45
-195
-61
-50
-196
-59
-53
-194
-55
-52
-194
-52
-51
-220
-75
-78
-221
-76
-81
-225
-80
-85
-229
-84
-89
-232
-89
-93
-229
-86
-88
-220
-77
-79
-212
-67
-64
-203
-52
-43
-212
-54
-43
-218
-53
-47
-224
-52
-50
-228
-49
-52
-232
-49
-54
-233
-48
-56
-231
-46
-54
-238
-51
-62
-237
-50
-59
-244
-52
-63
-253
-56
-66
-255
-51
-62
-253
-41
-53
-255
-40
-51
-255
-46
-57
-248
-45
-51
-249
-53
-55
-249
-53
-57
-240
-46
-47
-235
-42
-43
-233
-48
-46
-232
-53
-49
-226
-53
-47
-227
-60
-52
-224
-61
-52
-224
-61
-52
-225
-61
-52
-228
-59
-54
-231
-58
-54
-235
-55
-54
-238
-54
-54
-236
-52
-54
-235
-51
-53
-236
-50
-53
-237
-51
-52
-237
-53
-53
-234
-52
-49
-227
-49
-45
-219
-48
-40
-222
-56
-44
-221
-58
-43
-221
-58
-43
-222
-56
-40
-224
-52
-38
-227
-51
-36
-233
-51
-38
-236
-52
-42
-238
-53
-48
-238
-53
-50
-240
-52
-50
-240
-51
-47
-242
-50
-47
-239
-50
-44
-235
-52
-44
-231
-54
-46
-228
-61
-52
-205
-47
-38
-215
-62
-57
-202
-52
-53
-249
-98
-103
-255
-112
-121
-246
-91
-105
-237
-80
-99
-228
-70
-93
-243
-72
-104
-255
-61
-101
-255
-50
-93
-255
-55
-97
-245
-71
-104
-201
-74
-93
-148
-66
-70
-83
-43
-35
-88
-72
-56
-84
-75
-58
-79
-72
-54
-89
-80
-63
-83
-74
-57
-69
-64
-45
-71
-70
-49
-61
-67
-39
-64
-74
-40
-73
-85
-49
-83
-100
-58
-95
-114
-69
-101
-125
-73
-103
-132
-74
-101
-136
-72
-99
-136
-67
-97
-137
-66
-98
-138
-67
-99
-141
-69
-101
-142
-72
-102
-143
-77
-104
-143
-80
-105
-144
-81
-108
-144
-80
-107
-144
-77
-102
-141
-74
-99
-138
-73
-97
-136
-71
-96
-135
-70
-96
-135
-72
-96
-134
-73
-94
-129
-71
-94
-127
-70
-95
-125
-71
-96
-124
-73
-97
-123
-75
-100
-123
-77
-102
-124
-78
-102
-126
-78
-93
-120
-67
-92
-121
-63
-93
-122
-66
-68
-66
-54
-70
-68
-56
-74
-70
-59
-80
-71
-62
-82
-72
-62
-87
-73
-62
-93
-77
-62
-95
-79
-63
-96
-81
-62
-97
-82
-63
-96
-83
-66
-95
-86
-71
-98
-89
-82
-103
-98
-95
-111
-106
-110
-115
-111
-126
-119
-113
-147
-122
-116
-160
-124
-121
-168
-121
-119
-169
-112
-112
-166
-103
-103
-163
-96
-97
-162
-92
-95
-164
-96
-98
-173
-102
-104
-181
-111
-112
-192
-121
-122
-204
-132
-130
-214
-141
-139
-223
-150
-146
-231
-156
-153
-232
-160
-158
-223
-161
-160
-218
-163
-162
-219
-164
-163
-220
-166
-163
-220
-165
-162
-219
-165
-160
-216
-164
-159
-213
-165
-158
-210
-163
-156
-207
-162
-154
-201
-162
-153
-198
-159
-150
-193
-153
-142
-184
-142
-131
-171
-131
-124
-155
-113
-111
-124
-104
-103
-108
-99
-95
-96
-102
-90
-90
-108
-89
-85
-115
-86
-80
-128
-85
-78
-143
-86
-79
-150
-82
-73
-169
-89
-80
-181
-88
-80
-192
-91
-83
-216
-107
-100
-235
-122
-114
-246
-131
-124
-255
-139
-134
-249
-117
-113
-255
-117
-115
-237
-95
-93
-223
-80
-76
-217
-69
-65
-239
-90
-84
-204
-55
-49
-197
-50
-42
-196
-54
-42
-195
-55
-40
-192
-55
-39
-195
-55
-38
-198
-57
-40
-202
-59
-43
-208
-60
-46
-213
-63
-49
-210
-56
-46
-214
-60
-50
-215
-63
-52
-211
-59
-48
-205
-53
-40
-205
-51
-39
-216
-58
-47
-226
-64
-53
-224
-57
-48
-225
-57
-48
-222
-55
-46
-215
-55
-43
-207
-55
-41
-201
-58
-42
-198
-63
-44
-196
-65
-47
-194
-61
-46
-198
-64
-52
-203
-69
-58
-205
-71
-60
-204
-67
-59
-197
-60
-52
-187
-50
-44
-182
-43
-38
-199
-60
-55
-208
-69
-66
-217
-79
-76
-224
-86
-83
-227
-89
-86
-225
-88
-82
-216
-79
-73
-208
-67
-58
-205
-58
-42
-213
-58
-40
-220
-56
-44
-227
-53
-46
-232
-46
-47
-237
-42
-50
-240
-40
-51
-244
-39
-54
-251
-44
-62
-250
-43
-63
-251
-42
-63
-253
-41
-63
-255
-39
-63
-255
-38
-63
-255
-36
-60
-255
-35
-60
-255
-35
-55
-255
-38
-56
-255
-42
-59
-254
-44
-57
-244
-44
-54
-237
-46
-53
-233
-53
-54
-232
-60
-58
-221
-56
-52
-221
-58
-51
-222
-59
-52
-224
-59
-53
-227
-58
-53
-230
-57
-53
-233
-55
-51
-235
-53
-52
-235
-51
-53
-236
-52
-54
-235
-53
-52
-233
-53
-52
-231
-53
-51
-226
-53
-47
-221
-53
-44
-219
-53
-41
-220
-56
-44
-219
-57
-42
-220
-57
-40
-222
-57
-38
-223
-56
-38
-226
-55
-37
-227
-54
-37
-230
-52
-38
-236
-53
-45
-237
-52
-47
-240
-53
-48
-241
-52
-46
-241
-53
-44
-237
-53
-43
-232
-54
-42
-228
-56
-44
-222
-58
-48
-212
-55
-46
-211
-58
-53
-215
-62
-64
-255
-109
-117
-255
-98
-113
-248
-85
-106
-241
-75
-99
-247
-79
-105
-236
-58
-90
-249
-57
-94
-255
-63
-103
-245
-64
-99
-230
-80
-107
-178
-73
-87
-97
-36
-35
-71
-43
-32
-65
-56
-39
-75
-68
-52
-82
-76
-60
-79
-73
-57
-66
-67
-49
-59
-68
-47
-60
-73
-47
-65
-72
-38
-69
-75
-37
-75
-83
-46
-83
-93
-56
-91
-107
-68
-97
-118
-75
-100
-126
-78
-100
-131
-74
-98
-134
-70
-96
-136
-66
-97
-137
-64
-99
-139
-66
-101
-141
-70
-104
-144
-74
-108
-144
-80
-109
-145
-81
-108
-145
-76
-105
-142
-72
-103
-140
-71
-102
-139
-72
-102
-138
-74
-101
-137
-73
-99
-133
-72
-97
-131
-71
-100
-131
-74
-100
-129
-73
-98
-127
-71
-99
-126
-71
-100
-127
-74
-100
-127
-72
-101
-126
-71
-97
-125
-67
-91
-123
-60
-92
-127
-61
-95
-130
-66
-61
-63
-52
-63
-65
-54
-70
-67
-60
-74
-69
-63
-80
-69
-63
-84
-71
-62
-91
-75
-62
-93
-77
-61
-96
-79
-59
-96
-81
-60
-94
-83
-65
-94
-86
-73
-99
-91
-88
-104
-99
-105
-110
-108
-121
-115
-111
-134
-116
-112
-149
-118
-112
-158
-116
-112
-162
-112
-109
-162
-103
-102
-159
-97
-97
-159
-93
-94
-161
-92
-92
-164
-101
-100
-176
-107
-106
-186
-116
-114
-197
-125
-123
-207
-134
-130
-217
-141
-137
-224
-148
-142
-230
-152
-147
-229
-155
-149
-221
-156
-151
-217
-157
-152
-218
-158
-153
-219
-158
-151
-218
-157
-150
-217
-156
-150
-214
-155
-149
-211
-158
-150
-210
-156
-148
-205
-156
-147
-200
-155
-147
-198
-154
-145
-192
-147
-138
-183
-136
-127
-170
-128
-121
-154
-115
-109
-123
-107
-101
-105
-100
-94
-94
-101
-91
-89
-107
-90
-83
-113
-86
-77
-124
-84
-74
-141
-84
-75
-157
-84
-75
-178
-91
-82
-187
-88
-82
-195
-88
-82
-211
-102
-97
-221
-114
-106
-224
-120
-111
-235
-126
-119
-251
-136
-133
-255
-135
-133
-247
-117
-115
-238
-103
-100
-227
-85
-83
-235
-90
-85
-199
-50
-44
-194
-47
-37
-197
-55
-41
-195
-55
-38
-192
-55
-37
-193
-56
-38
-196
-56
-39
-200
-59
-42
-207
-59
-45
-211
-61
-47
-213
-57
-44
-213
-57
-44
-211
-58
-44
-210
-58
-44
-209
-57
-43
-209
-57
-43
-212
-56
-43
-216
-56
-44
-223
-59
-49
-224
-57
-48
-220
-56
-46
-214
-56
-44
-207
-57
-42
-200
-57
-40
-193
-58
-38
-190
-57
-38
-190
-54
-42
-193
-56
-48
-198
-61
-53
-201
-64
-56
-202
-65
-57
-200
-63
-55
-197
-60
-52
-194
-57
-49
-191
-52
-45
-199
-62
-54
-209
-72
-64
-216
-79
-71
-218
-81
-73
-215
-78
-70
-204
-67
-59
-195
-55
-42
-202
-55
-37
-211
-56
-36
-221
-55
-41
-229
-52
-44
-237
-47
-47
-244
-43
-51
-249
-41
-55
-253
-40
-58
-255
-43
-64
-255
-42
-65
-255
-41
-65
-255
-38
-65
-255
-35
-64
-255
-33
-60
-255
-30
-61
-255
-29
-58
-255
-30
-57
-255
-31
-56
-255
-36
-58
-255
-41
-59
-247
-45
-57
-241
-50
-58
-234
-55
-58
-230
-60
-60
-220
-57
-52
-220
-58
-53
-222
-59
-52
-224
-59
-53
-227
-58
-53
-230
-57
-53
-233
-55
-51
-235
-53
-50
-235
-51
-53
-236
-52
-54
-235
-53
-52
-232
-54
-52
-228
-55
-49
-223
-54
-47
-220
-53
-44
-217
-53
-41
-219
-57
-42
-219
-57
-42
-220
-57
-40
-220
-57
-38
-222
-57
-38
-223
-56
-37
-225
-56
-37
-227
-54
-37
-231
-53
-43
-234
-51
-43
-235
-52
-44
-235
-53
-42
-235
-53
-42
-232
-54
-40
-228
-55
-41
-223
-55
-42
-221
-61
-49
-209
-52
-43
-207
-53
-51
-239
-84
-88
-255
-102
-114
-255
-91
-111
-241
-73
-98
-249
-76
-104
-248
-69
-99
-247
-64
-95
-244
-56
-91
-243
-62
-97
-239
-78
-109
-205
-76
-98
-139
-56
-64
-89
-41
-37
-69
-51
-39
-60
-54
-40
-62
-59
-44
-67
-64
-49
-67
-66
-48
-61
-64
-45
-56
-68
-46
-58
-73
-44
-60
-68
-29
-75
-80
-39
-92
-98
-60
-101
-111
-74
-104
-118
-82
-101
-122
-81
-100
-126
-79
-100
-130
-76
-97
-131
-70
-97
-134
-65
-97
-137
-64
-99
-140
-64
-103
-141
-68
-105
-142
-72
-107
-144
-77
-108
-145
-78
-108
-145
-75
-106
-144
-71
-104
-141
-72
-102
-139
-70
-103
-138
-74
-102
-137
-73
-102
-133
-74
-100
-131
-72
-102
-131
-75
-100
-129
-73
-100
-127
-72
-100
-128
-70
-101
-129
-71
-101
-129
-71
-102
-127
-69
-98
-126
-65
-93
-128
-62
-95
-132
-63
-98
-135
-66
-54
-57
-46
-58
-60
-49
-63
-63
-55
-68
-65
-58
-75
-66
-59
-79
-69
-60
-86
-72
-61
-89
-76
-60
-94
-79
-60
-92
-79
-60
-92
-83
-66
-94
-87
-77
-99
-93
-93
-104
-101
-108
-111
-109
-123
-115
-113
-137
-115
-111
-148
-113
-107
-153
-106
-102
-152
-99
-96
-149
-92
-91
-148
-90
-90
-152
-92
-93
-160
-92
-95
-166
-104
-106
-181
-110
-111
-191
-119
-120
-202
-127
-128
-210
-134
-132
-216
-138
-136
-220
-143
-139
-224
-145
-142
-221
-147
-144
-215
-147
-144
-211
-147
-144
-211
-147
-144
-211
-148
-142
-212
-147
-141
-211
-147
-140
-208
-146
-139
-206
-149
-140
-205
-147
-139
-199
-148
-139
-194
-148
-140
-191
-147
-139
-186
-140
-133
-175
-131
-123
-162
-126
-115
-145
-121
-103
-119
-115
-96
-102
-103
-91
-91
-100
-91
-86
-100
-91
-82
-104
-88
-75
-117
-85
-72
-135
-83
-72
-166
-89
-81
-190
-95
-89
-203
-91
-89
-208
-88
-87
-218
-100
-98
-222
-109
-105
-220
-113
-107
-226
-119
-113
-251
-138
-132
-255
-138
-134
-255
-133
-129
-255
-125
-121
-247
-110
-104
-238
-97
-88
-196
-52
-43
-192
-50
-38
-196
-56
-41
-193
-58
-39
-192
-57
-38
-192
-57
-37
-194
-57
-38
-198
-59
-40
-204
-58
-43
-208
-58
-44
-214
-58
-45
-211
-53
-41
-206
-53
-39
-208
-56
-42
-212
-62
-47
-212
-62
-47
-206
-54
-40
-203
-47
-34
-218
-58
-46
-218
-56
-45
-217
-55
-44
-214
-56
-44
-208
-58
-43
-201
-58
-41
-194
-57
-38
-190
-55
-36
-189
-53
-41
-192
-54
-44
-194
-56
-46
-196
-58
-48
-199
-61
-51
-202
-64
-54
-203
-65
-55
-204
-66
-56
-199
-58
-49
-202
-64
-54
-207
-69
-59
-208
-70
-60
-210
-72
-62
-209
-71
-61
-202
-64
-54
-197
-55
-43
-204
-54
-37
-214
-54
-38
-223
-55
-44
-231
-52
-47
-241
-48
-51
-246
-45
-53
-251
-43
-57
-255
-42
-60
-252
-39
-59
-252
-39
-61
-251
-37
-61
-249
-35
-59
-251
-33
-58
-250
-30
-55
-252
-28
-55
-254
-27
-54
-255
-29
-55
-255
-30
-53
-254
-35
-55
-253
-42
-59
-247
-50
-60
-242
-55
-62
-236
-57
-60
-229
-59
-59
-220
-57
-52
-220
-58
-53
-222
-59
-52
-224
-59
-53
-229
-57
-53
-231
-56
-53
-233
-55
-51
-235
-53
-50
-237
-51
-54
-238
-52
-55
-237
-53
-53
-234
-54
-53
-229
-54
-49
-225
-54
-47
-220
-53
-44
-216
-52
-40
-218
-56
-41
-217
-57
-41
-218
-57
-39
-219
-56
-37
-221
-56
-37
-222
-55
-36
-224
-55
-36
-225
-54
-37
-225
-53
-39
-226
-52
-41
-227
-53
-42
-227
-54
-40
-227
-54
-40
-225
-55
-40
-221
-55
-41
-218
-56
-43
-219
-61
-50
-204
-50
-42
-211
-56
-54
-255
-108
-112
-255
-93
-108
-249
-81
-104
-237
-62
-91
-255
-75
-108
-247
-59
-92
-255
-66
-100
-240
-56
-90
-233
-65
-98
-227
-87
-113
-171
-64
-82
-101
-34
-41
-81
-46
-42
-65
-52
-43
-52
-53
-39
-53
-54
-38
-58
-59
-41
-63
-62
-42
-62
-61
-40
-60
-64
-41
-62
-69
-38
-62
-70
-29
-88
-97
-52
-115
-126
-84
-128
-140
-100
-119
-135
-96
-104
-127
-83
-97
-125
-76
-97
-128
-71
-96
-131
-67
-96
-133
-63
-97
-137
-64
-99
-140
-64
-104
-142
-69
-106
-143
-74
-107
-144
-77
-108
-145
-78
-110
-147
-77
-107
-145
-72
-104
-141
-72
-103
-140
-71
-104
-139
-75
-104
-139
-75
-102
-136
-76
-100
-134
-74
-101
-132
-75
-100
-131
-74
-99
-128
-70
-100
-129
-71
-102
-130
-72
-102
-130
-71
-101
-129
-70
-98
-128
-66
-99
-134
-68
-101
-138
-69
-104
-141
-72
-50
-53
-42
-53
-56
-45
-59
-60
-52
-65
-62
-55
-71
-64
-58
-75
-66
-59
-82
-69
-60
-86
-74
-60
-88
-76
-60
-89
-77
-61
-89
-81
-68
-94
-87
-79
-99
-94
-98
-105
-103
-114
-111
-110
-128
-114
-111
-140
-114
-109
-149
-106
-103
-148
-96
-94
-143
-87
-87
-139
-84
-85
-142
-87
-88
-152
-92
-95
-162
-97
-99
-173
-108
-110
-187
-114
-115
-195
-123
-124
-206
-130
-131
-213
-136
-134
-217
-138
-136
-219
-140
-136
-220
-141
-138
-217
-143
-142
-212
-143
-140
-209
-143
-140
-209
-142
-139
-210
-143
-137
-211
-142
-136
-210
-142
-134
-209
-141
-133
-206
-143
-133
-202
-142
-133
-196
-143
-134
-191
-144
-136
-187
-143
-136
-180
-137
-131
-169
-128
-121
-154
-126
-112
-137
-127
-96
-112
-121
-90
-96
-107
-89
-89
-99
-92
-84
-96
-94
-81
-98
-91
-73
-109
-86
-70
-128
-82
-69
-161
-84
-76
-193
-91
-89
-209
-89
-91
-217
-88
-92
-228
-99
-103
-228
-108
-107
-224
-112
-108
-228
-121
-115
-236
-125
-118
-237
-122
-115
-254
-131
-126
-255
-134
-129
-255
-129
-123
-245
-107
-97
-201
-60
-50
-196
-56
-41
-194
-59
-40
-191
-58
-39
-191
-59
-38
-190
-58
-37
-193
-58
-38
-197
-58
-39
-200
-57
-41
-206
-56
-42
-216
-58
-46
-212
-54
-42
-206
-53
-39
-206
-56
-41
-209
-62
-46
-209
-62
-46
-203
-56
-40
-199
-47
-33
-210
-54
-41
-211
-53
-41
-210
-52
-40
-210
-54
-41
-209
-57
-43
-205
-60
-43
-200
-61
-42
-196
-59
-41
-196
-58
-45
-196
-58
-47
-198
-57
-48
-198
-57
-47
-199
-58
-49
-200
-59
-49
-201
-60
-51
-203
-61
-51
-211
-68
-60
-211
-69
-59
-208
-65
-57
-203
-61
-51
-203
-60
-52
-207
-65
-55
-207
-64
-56
-206
-59
-49
-206
-53
-39
-217
-53
-41
-226
-53
-46
-235
-51
-49
-242
-47
-53
-247
-43
-54
-249
-41
-55
-252
-41
-58
-249
-38
-57
-247
-38
-59
-247
-38
-59
-248
-39
-60
-251
-38
-60
-253
-37
-58
-255
-36
-58
-255
-35
-58
-255
-33
-54
-253
-34
-54
-250
-37
-55
-249
-44
-59
-247
-53
-62
-242
-57
-63
-233
-57
-59
-225
-57
-56
-220
-57
-52
-220
-58
-53
-222
-59
-52
-224
-59
-53
-229
-57
-53
-231
-56
-53
-233
-55
-51
-235
-53
-52
-238
-52
-55
-238
-52
-55
-238
-54
-54
-234
-54
-53
-230
-55
-50
-225
-54
-47
-220
-53
-44
-215
-53
-42
-216
-56
-42
-216
-56
-40
-216
-56
-40
-217
-56
-38
-218
-55
-38
-220
-55
-36
-221
-54
-36
-221
-54
-36
-219
-53
-37
-220
-54
-40
-221
-55
-39
-220
-57
-40
-220
-57
-40
-218
-59
-40
-215
-58
-41
-214
-58
-43
-213
-59
-49
-206
-51
-46
-231
-73
-74
-255
-111
-119
-254
-85
-104
-243
-69
-94
-243
-62
-95
-255
-67
-102
-251
-55
-91
-252
-60
-97
-240
-66
-99
-228
-79
-108
-196
-80
-101
-129
-47
-61
-78
-29
-33
-72
-48
-46
-54
-47
-39
-50
-52
-39
-56
-58
-44
-62
-65
-46
-65
-64
-43
-63
-61
-36
-65
-64
-36
-69
-70
-36
-84
-93
-48
-112
-126
-77
-143
-159
-114
-151
-168
-124
-131
-152
-109
-106
-132
-87
-95
-123
-74
-93
-126
-69
-95
-131
-67
-97
-134
-64
-98
-138
-65
-102
-143
-67
-107
-144
-74
-108
-145
-76
-109
-146
-79
-109
-146
-79
-111
-148
-78
-108
-146
-73
-105
-142
-73
-104
-141
-72
-105
-140
-76
-105
-140
-76
-104
-138
-78
-103
-137
-77
-102
-133
-76
-100
-131
-74
-100
-129
-71
-101
-130
-72
-103
-131
-72
-104
-132
-73
-102
-130
-71
-100
-130
-68
-103
-138
-72
-105
-142
-73
-108
-145
-76
-45
-51
-39
-51
-54
-43
-56
-57
-49
-60
-59
-54
-66
-61
-57
-71
-64
-58
-77
-68
-61
-81
-71
-61
-83
-73
-61
-83
-75
-62
-85
-78
-68
-90
-85
-81
-97
-94
-101
-105
-103
-117
-109
-107
-129
-108
-107
-138
-106
-104
-144
-98
-96
-143
-88
-86
-136
-80
-80
-134
-81
-81
-141
-88
-89
-154
-96
-99
-170
-102
-106
-180
-111
-114
-193
-117
-120
-201
-124
-127
-208
-130
-133
-214
-134
-135
-217
-135
-136
-216
-138
-137
-217
-139
-138
-214
-139
-139
-209
-139
-138
-206
-138
-136
-209
-137
-135
-210
-137
-133
-210
-136
-131
-211
-138
-131
-211
-137
-130
-207
-140
-132
-205
-139
-132
-199
-141
-133
-192
-141
-134
-185
-141
-134
-175
-135
-130
-162
-126
-120
-146
-127
-110
-129
-131
-90
-104
-125
-84
-90
-108
-87
-84
-99
-92
-82
-92
-96
-79
-91
-95
-72
-102
-90
-68
-122
-83
-66
-149
-74
-68
-187
-83
-82
-209
-83
-87
-219
-82
-89
-230
-93
-100
-231
-102
-106
-224
-108
-108
-227
-118
-113
-228
-117
-110
-226
-111
-104
-247
-126
-118
-255
-130
-123
-255
-135
-126
-244
-108
-96
-201
-63
-50
-193
-56
-40
-192
-59
-40
-191
-61
-39
-191
-61
-39
-192
-60
-39
-194
-59
-39
-197
-58
-39
-199
-56
-40
-205
-55
-41
-216
-58
-47
-217
-56
-46
-210
-56
-44
-207
-57
-43
-204
-58
-43
-201
-58
-42
-200
-57
-41
-201
-55
-40
-207
-57
-43
-209
-55
-43
-210
-56
-44
-209
-55
-43
-207
-55
-42
-204
-56
-42
-203
-60
-44
-203
-62
-45
-202
-60
-48
-201
-61
-48
-202
-60
-50
-201
-59
-47
-200
-58
-48
-198
-56
-44
-197
-55
-45
-197
-53
-42
-208
-64
-55
-208
-64
-53
-205
-61
-52
-201
-57
-46
-203
-56
-48
-206
-59
-49
-205
-58
-50
-204
-53
-44
-208
-47
-37
-217
-48
-41
-228
-50
-48
-236
-50
-53
-244
-47
-56
-249
-45
-57
-251
-43
-59
-252
-44
-60
-252
-45
-63
-251
-46
-63
-252
-47
-64
-252
-47
-64
-254
-47
-65
-255
-47
-63
-255
-45
-63
-255
-46
-64
-255
-40
-56
-251
-40
-55
-247
-43
-55
-245
-48
-58
-241
-54
-61
-237
-56
-61
-228
-56
-56
-221
-53
-52
-220
-57
-52
-220
-58
-53
-222
-59
-54
-226
-58
-55
-229
-57
-53
-231
-56
-53
-234
-54
-53
-236
-52
-52
-241
-52
-56
-241
-52
-56
-239
-53
-54
-237
-55
-54
-230
-55
-50
-225
-54
-47
-218
-54
-44
-215
-53
-42
-216
-56
-42
-214
-57
-40
-214
-57
-40
-216
-57
-38
-216
-57
-38
-217
-56
-38
-218
-55
-38
-217
-56
-38
-213
-56
-37
-213
-58
-38
-214
-59
-39
-213
-61
-40
-212
-61
-40
-211
-62
-42
-211
-61
-44
-211
-61
-46
-208
-55
-47
-215
-60
-56
-255
-93
-100
-255
-96
-111
-255
-80
-103
-240
-60
-89
-255
-66
-104
-250
-55
-95
-255
-55
-95
-242
-52
-88
-237
-78
-108
-215
-92
-113
-148
-64
-79
-91
-38
-46
-71
-40
-45
-63
-49
-48
-49
-46
-41
-52
-54
-43
-58
-62
-47
-60
-65
-43
-58
-61
-34
-62
-61
-30
-80
-74
-40
-94
-92
-53
-121
-133
-83
-144
-163
-108
-170
-190
-139
-168
-190
-141
-142
-165
-119
-111
-139
-91
-97
-127
-75
-94
-127
-70
-96
-132
-68
-99
-136
-66
-101
-141
-68
-106
-147
-71
-111
-148
-78
-112
-149
-80
-111
-147
-83
-111
-147
-83
-111
-148
-78
-108
-146
-73
-105
-142
-73
-103
-140
-71
-105
-140
-76
-105
-140
-76
-105
-139
-79
-104
-138
-78
-102
-133
-74
-101
-132
-73
-100
-131
-72
-101
-132
-73
-103
-133
-73
-104
-134
-72
-103
-133
-71
-101
-133
-68
-105
-142
-73
-105
-145
-75
-108
-148
-78
-43
-49
-37
-46
-52
-42
-52
-55
-48
-56
-57
-51
-62
-58
-55
-66
-61
-58
-72
-65
-59
-75
-68
-60
-78
-72
-60
-78
-71
-61
-79
-74
-68
-87
-83
-82
-95
-94
-102
-102
-101
-117
-103
-103
-127
-103
-102
-134
-98
-97
-137
-91
-89
-138
-81
-81
-133
-78
-79
-135
-82
-83
-147
-91
-94
-163
-101
-105
-179
-108
-111
-190
-117
-119
-202
-122
-124
-209
-127
-129
-214
-131
-133
-216
-134
-135
-217
-134
-135
-215
-136
-135
-213
-137
-136
-212
-135
-135
-205
-134
-134
-204
-134
-132
-205
-133
-130
-207
-133
-128
-210
-133
-128
-210
-135
-127
-212
-135
-128
-208
-141
-133
-210
-140
-133
-201
-141
-133
-192
-140
-134
-182
-139
-133
-169
-132
-128
-155
-123
-118
-138
-124
-106
-120
-129
-87
-97
-126
-81
-86
-109
-85
-81
-100
-94
-80
-92
-100
-77
-89
-97
-73
-99
-93
-69
-118
-87
-67
-146
-78
-69
-183
-85
-82
-209
-84
-90
-219
-82
-90
-231
-92
-99
-231
-98
-103
-228
-104
-106
-231
-113
-111
-236
-121
-114
-230
-113
-104
-247
-124
-116
-243
-115
-106
-254
-120
-109
-230
-92
-81
-196
-59
-43
-190
-53
-35
-194
-59
-39
-193
-61
-40
-193
-61
-40
-195
-60
-40
-196
-59
-40
-200
-59
-41
-203
-57
-42
-207
-55
-42
-214
-53
-43
-216
-55
-45
-212
-58
-46
-206
-58
-44
-199
-58
-41
-196
-56
-39
-198
-58
-41
-202
-61
-44
-207
-61
-46
-214
-64
-50
-217
-65
-52
-214
-62
-49
-206
-56
-42
-200
-52
-38
-202
-56
-41
-203
-60
-44
-201
-58
-44
-200
-58
-44
-201
-59
-47
-201
-59
-45
-202
-58
-47
-200
-57
-43
-200
-53
-43
-199
-53
-40
-202
-54
-44
-207
-59
-47
-210
-62
-52
-211
-63
-51
-214
-63
-54
-213
-62
-51
-206
-55
-46
-201
-44
-35
-210
-43
-37
-220
-45
-42
-231
-48
-50
-240
-51
-57
-246
-49
-59
-250
-48
-60
-253
-48
-63
-253
-48
-63
-249
-48
-64
-247
-49
-64
-247
-49
-64
-246
-48
-61
-247
-47
-60
-247
-45
-57
-250
-44
-57
-250
-42
-55
-252
-46
-59
-248
-46
-58
-245
-48
-58
-240
-51
-58
-237
-54
-59
-231
-55
-58
-224
-54
-54
-218
-53
-51
-220
-57
-52
-221
-58
-53
-223
-58
-54
-226
-58
-55
-229
-57
-53
-231
-56
-53
-234
-54
-53
-236
-52
-52
-242
-53
-57
-242
-53
-57
-240
-54
-55
-237
-55
-54
-230
-55
-52
-223
-54
-47
-218
-54
-45
-214
-54
-42
-213
-55
-43
-212
-56
-41
-212
-56
-41
-212
-57
-39
-213
-56
-39
-213
-56
-37
-215
-55
-39
-212
-57
-37
-208
-57
-36
-206
-60
-37
-207
-61
-38
-207
-63
-39
-206
-64
-40
-206
-64
-42
-206
-63
-46
-208
-60
-48
-208
-55
-49
-232
-72
-72
-255
-103
-113
-254
-78
-98
-255
-72
-100
-246
-56
-90
-255
-66
-108
-246
-49
-92
-255
-57
-96
-234
-55
-87
-221
-83
-106
-185
-87
-102
-107
-50
-57
-71
-41
-43
-71
-55
-58
-59
-50
-51
-56
-51
-48
-58
-55
-48
-57
-59
-45
-53
-58
-35
-51
-56
-24
-66
-68
-29
-102
-99
-58
-129
-131
-84
-159
-174
-119
-169
-193
-135
-181
-206
-151
-175
-199
-147
-146
-174
-125
-118
-148
-98
-101
-134
-81
-96
-130
-70
-96
-133
-66
-99
-136
-66
-103
-143
-70
-109
-150
-74
-114
-152
-79
-114
-151
-82
-113
-149
-85
-112
-148
-84
-111
-148
-78
-108
-145
-75
-104
-141
-72
-102
-139
-70
-104
-139
-75
-105
-140
-76
-105
-139
-78
-105
-139
-79
-103
-134
-75
-102
-133
-74
-101
-132
-73
-102
-133
-73
-104
-136
-73
-105
-137
-72
-105
-135
-71
-102
-134
-67
-106
-143
-74
-107
-147
-77
-110
-150
-80
-40
-48
-35
-43
-49
-39
-47
-52
-45
-51
-53
-48
-55
-54
-52
-60
-56
-53
-64
-61
-56
-67
-62
-56
-73
-69
-60
-72
-69
-60
-75
-72
-67
-82
-80
-81
-91
-91
-101
-97
-98
-116
-98
-98
-124
-96
-96
-130
-95
-94
-136
-90
-88
-138
-84
-84
-138
-84
-84
-144
-92
-93
-160
-103
-105
-179
-112
-115
-196
-118
-120
-205
-123
-127
-216
-126
-130
-219
-131
-132
-222
-132
-134
-221
-132
-133
-216
-131
-132
-214
-133
-132
-212
-134
-133
-209
-131
-134
-203
-130
-133
-202
-131
-131
-205
-130
-129
-207
-131
-127
-211
-133
-128
-212
-136
-128
-214
-136
-128
-211
-141
-133
-210
-139
-132
-200
-139
-131
-188
-139
-132
-176
-137
-130
-163
-129
-124
-146
-119
-113
-127
-117
-102
-109
-125
-86
-91
-121
-81
-81
-107
-87
-78
-101
-95
-79
-93
-101
-77
-91
-100
-73
-100
-96
-71
-116
-91
-69
-140
-82
-70
-176
-91
-84
-202
-89
-91
-214
-85
-90
-226
-91
-97
-230
-93
-100
-231
-98
-101
-237
-109
-108
-245
-122
-115
-237
-114
-106
-247
-120
-111
-222
-89
-80
-229
-91
-80
-210
-68
-56
-195
-53
-39
-199
-58
-41
-197
-58
-39
-196
-60
-38
-197
-61
-39
-200
-61
-40
-202
-59
-42
-205
-58
-42
-208
-56
-42
-212
-54
-42
-211
-48
-39
-212
-51
-41
-210
-56
-44
-205
-59
-44
-199
-59
-42
-194
-59
-40
-192
-59
-40
-195
-60
-41
-200
-59
-42
-213
-67
-52
-225
-75
-61
-222
-72
-58
-211
-61
-47
-202
-52
-38
-201
-53
-39
-205
-59
-44
-200
-57
-41
-200
-57
-41
-200
-57
-43
-200
-57
-41
-202
-56
-43
-202
-56
-41
-203
-55
-43
-203
-55
-41
-205
-54
-43
-210
-60
-46
-215
-63
-52
-216
-64
-51
-218
-64
-54
-219
-65
-53
-215
-58
-49
-210
-49
-41
-220
-48
-46
-229
-49
-52
-238
-52
-57
-245
-54
-62
-249
-52
-62
-249
-49
-62
-250
-48
-64
-248
-47
-63
-242
-46
-60
-239
-47
-60
-237
-47
-57
-237
-48
-55
-239
-45
-53
-239
-44
-50
-242
-43
-50
-241
-42
-49
-244
-49
-57
-244
-50
-58
-242
-53
-59
-236
-53
-57
-229
-53
-55
-225
-53
-53
-223
-55
-54
-221
-56
-54
-220
-56
-54
-221
-57
-55
-223
-58
-54
-227
-58
-55
-230
-56
-55
-233
-55
-55
-234
-54
-55
-236
-52
-54
-244
-53
-58
-244
-53
-58
-241
-55
-58
-238
-56
-55
-230
-55
-52
-224
-55
-48
-218
-54
-45
-212
-54
-42
-211
-55
-42
-209
-56
-42
-208
-56
-42
-208
-57
-40
-208
-57
-40
-208
-57
-38
-209
-56
-40
-208
-57
-38
-203
-57
-34
-200
-58
-34
-200
-62
-36
-199
-63
-37
-200
-64
-40
-200
-64
-42
-203
-62
-45
-206
-59
-49
-213
-58
-54
-250
-85
-91
-255
-94
-111
-255
-71
-97
-253
-62
-95
-254
-58
-96
-255
-56
-102
-250
-53
-98
-244
-58
-95
-230
-71
-99
-192
-80
-96
-135
-64
-72
-84
-50
-51
-67
-53
-52
-68
-57
-61
-62
-51
-55
-66
-51
-54
-64
-53
-49
-58
-56
-43
-54
-60
-34
-57
-67
-30
-80
-92
-46
-125
-132
-80
-159
-168
-113
-176
-197
-138
-175
-203
-142
-176
-204
-146
-166
-195
-141
-146
-174
-125
-123
-153
-101
-103
-136
-81
-95
-129
-69
-94
-131
-64
-99
-137
-64
-105
-143
-68
-111
-149
-74
-115
-153
-80
-115
-152
-83
-113
-149
-85
-111
-147
-83
-110
-147
-78
-107
-144
-74
-103
-140
-71
-101
-138
-69
-103
-138
-74
-104
-139
-75
-105
-139
-78
-105
-139
-78
-102
-136
-75
-100
-134
-73
-100
-134
-73
-101
-136
-72
-103
-138
-74
-104
-139
-73
-105
-137
-72
-102
-137
-69
-106
-146
-76
-108
-150
-78
-111
-153
-81
-38
-46
-33
-40
-48
-37
-45
-50
-43
-49
-51
-46
-51
-51
-49
-55
-54
-52
-58
-57
-53
-60
-59
-54
-71
-68
-61
-68
-68
-60
-71
-70
-66
-79
-79
-81
-90
-90
-100
-95
-97
-112
-94
-96
-121
-92
-92
-126
-96
-95
-137
-92
-90
-140
-89
-88
-145
-92
-92
-154
-103
-103
-173
-113
-115
-192
-122
-124
-209
-127
-128
-220
-129
-132
-225
-130
-133
-228
-133
-134
-227
-132
-133
-225
-131
-131
-219
-129
-130
-213
-131
-130
-210
-131
-130
-206
-132
-135
-204
-131
-134
-201
-132
-132
-204
-131
-130
-206
-133
-130
-211
-135
-130
-214
-138
-130
-215
-140
-131
-212
-141
-133
-208
-140
-131
-196
-139
-130
-183
-138
-130
-171
-133
-127
-155
-127
-120
-136
-115
-110
-117
-111
-99
-99
-117
-87
-85
-114
-84
-76
-105
-87
-75
-102
-95
-77
-99
-101
-77
-97
-100
-73
-102
-96
-70
-115
-93
-70
-125
-79
-63
-159
-89
-77
-184
-89
-83
-197
-83
-82
-215
-86
-90
-226
-87
-92
-233
-90
-96
-240
-100
-101
-247
-114
-109
-241
-110
-102
-247
-113
-104
-209
-68
-59
-212
-65
-55
-197
-49
-37
-200
-52
-38
-212
-67
-50
-199
-57
-37
-199
-58
-38
-201
-59
-39
-205
-60
-41
-208
-58
-43
-211
-58
-44
-216
-56
-44
-217
-55
-44
-207
-44
-35
-206
-48
-37
-206
-54
-41
-203
-60
-44
-199
-64
-45
-193
-62
-42
-190
-59
-39
-188
-55
-36
-192
-52
-35
-209
-66
-50
-227
-79
-65
-228
-78
-64
-216
-66
-52
-203
-55
-41
-203
-55
-41
-208
-62
-47
-202
-59
-43
-201
-58
-42
-199
-56
-40
-198
-55
-39
-200
-54
-39
-202
-54
-40
-206
-56
-42
-208
-56
-43
-211
-59
-46
-213
-59
-47
-213
-57
-45
-210
-54
-42
-213
-55
-44
-218
-60
-49
-221
-60
-50
-220
-55
-49
-232
-56
-56
-241
-56
-61
-247
-58
-65
-251
-57
-66
-250
-52
-65
-245
-47
-60
-242
-44
-59
-239
-44
-58
-237
-47
-59
-234
-49
-57
-234
-51
-56
-235
-52
-56
-237
-53
-55
-241
-53
-54
-244
-51
-54
-243
-53
-55
-239
-50
-54
-238
-53
-58
-236
-56
-59
-233
-54
-57
-226
-52
-53
-222
-52
-52
-223
-55
-54
-225
-60
-58
-221
-56
-54
-222
-57
-55
-225
-57
-54
-227
-58
-55
-230
-56
-55
-233
-55
-55
-234
-54
-55
-236
-52
-54
-244
-53
-58
-244
-53
-58
-241
-55
-58
-236
-56
-57
-230
-57
-53
-223
-56
-50
-216
-55
-47
-211
-55
-43
-208
-56
-43
-205
-58
-42
-205
-57
-43
-204
-59
-42
-205
-58
-42
-205
-58
-40
-205
-58
-42
-204
-59
-40
-197
-57
-34
-194
-58
-34
-195
-61
-36
-194
-62
-37
-195
-63
-40
-198
-63
-43
-201
-61
-46
-205
-56
-49
-220
-60
-62
-255
-93
-102
-255
-81
-103
-255
-72
-100
-250
-56
-91
-255
-63
-103
-246
-46
-92
-251
-62
-104
-228
-61
-91
-224
-93
-111
-162
-76
-85
-91
-45
-45
-71
-56
-51
-70
-66
-63
-64
-55
-58
-67
-52
-57
-71
-48
-54
-70
-50
-49
-64
-57
-41
-63
-68
-38
-69
-86
-42
-96
-116
-63
-139
-157
-97
-170
-190
-127
-177
-203
-140
-171
-201
-139
-166
-195
-139
-157
-186
-132
-142
-172
-122
-123
-153
-101
-102
-135
-80
-90
-124
-64
-94
-129
-63
-97
-135
-62
-104
-142
-67
-111
-149
-74
-114
-152
-79
-114
-151
-82
-112
-148
-84
-110
-146
-82
-110
-147
-78
-106
-143
-73
-102
-139
-70
-100
-137
-68
-102
-137
-73
-104
-139
-75
-105
-139
-78
-105
-139
-78
-102
-136
-75
-101
-135
-74
-100
-135
-71
-101
-136
-70
-103
-138
-72
-104
-139
-71
-104
-139
-71
-101
-138
-68
-107
-147
-76
-109
-151
-79
-112
-154
-82
-40
-48
-33
-39
-47
-34
-40
-45
-38
-41
-46
-40
-46
-48
-45
-51
-51
-49
-55
-56
-51
-57
-58
-52
-61
-61
-53
-63
-64
-56
-68
-69
-64
-74
-76
-75
-79
-82
-89
-86
-88
-101
-90
-92
-115
-93
-94
-125
-89
-88
-130
-91
-89
-139
-94
-93
-150
-101
-101
-163
-110
-110
-182
-119
-120
-200
-127
-129
-216
-132
-133
-226
-140
-140
-238
-140
-140
-240
-138
-138
-236
-134
-135
-228
-130
-130
-220
-128
-128
-214
-130
-128
-211
-131
-130
-206
-128
-131
-198
-129
-133
-197
-131
-131
-201
-132
-132
-206
-134
-131
-208
-136
-131
-211
-139
-132
-210
-140
-132
-207
-138
-128
-197
-138
-128
-188
-137
-128
-175
-135
-125
-160
-128
-120
-143
-119
-111
-122
-107
-101
-103
-102
-93
-88
-106
-92
-81
-108
-92
-77
-104
-92
-76
-102
-94
-75
-101
-95
-73
-102
-96
-72
-106
-96
-71
-114
-94
-70
-114
-79
-59
-135
-84
-65
-166
-92
-79
-193
-96
-89
-209
-89
-88
-220
-81
-84
-237
-83
-91
-247
-92
-96
-249
-104
-101
-230
-89
-80
-212
-68
-60
-206
-55
-48
-209
-55
-47
-215
-58
-49
-214
-61
-47
-212
-59
-43
-207
-57
-40
-205
-58
-38
-207
-57
-40
-209
-58
-41
-212
-56
-41
-216
-56
-42
-220
-53
-44
-220
-53
-44
-208
-47
-37
-205
-51
-41
-204
-56
-44
-202
-62
-47
-197
-64
-47
-193
-64
-45
-190
-61
-42
-188
-57
-39
-194
-57
-41
-190
-48
-34
-233
-87
-74
-223
-75
-63
-195
-47
-35
-209
-61
-49
-206
-60
-47
-199
-56
-40
-202
-59
-43
-201
-58
-41
-200
-57
-40
-199
-56
-39
-200
-55
-38
-201
-54
-38
-203
-53
-38
-204
-52
-38
-208
-55
-41
-215
-59
-46
-220
-62
-50
-220
-60
-48
-217
-55
-44
-218
-56
-45
-226
-62
-52
-236
-67
-60
-245
-66
-69
-242
-57
-63
-240
-50
-60
-246
-52
-63
-246
-50
-64
-241
-45
-59
-237
-45
-58
-237
-50
-61
-236
-55
-62
-230
-53
-59
-228
-54
-56
-229
-55
-56
-235
-57
-57
-240
-58
-57
-241
-55
-56
-239
-55
-55
-242
-59
-61
-238
-60
-60
-234
-58
-58
-230
-56
-55
-225
-56
-53
-223
-55
-52
-220
-55
-53
-220
-55
-53
-222
-57
-55
-225
-57
-56
-227
-57
-57
-230
-58
-58
-233
-57
-59
-236
-57
-60
-237
-57
-60
-239
-56
-60
-244
-55
-59
-243
-54
-58
-240
-56
-58
-237
-57
-58
-231
-59
-57
-224
-59
-53
-215
-57
-48
-207
-55
-44
-202
-56
-43
-200
-57
-41
-199
-57
-43
-198
-58
-41
-199
-58
-41
-199
-58
-40
-200
-59
-42
-199
-60
-41
-193
-57
-35
-196
-61
-39
-190
-58
-35
-182
-52
-30
-188
-57
-37
-201
-68
-51
-206
-64
-54
-201
-49
-44
-255
-95
-101
-255
-87
-103
-255
-75
-98
-252
-61
-92
-245
-51
-88
-242
-50
-89
-247
-56
-99
-240
-69
-105
-228
-91
-111
-171
-71
-81
-110
-52
-51
-78
-51
-44
-67
-63
-54
-65
-66
-60
-66
-54
-56
-66
-43
-49
-77
-46
-51
-77
-49
-46
-67
-56
-38
-68
-74
-40
-88
-110
-61
-125
-155
-95
-155
-186
-119
-167
-198
-130
-171
-203
-140
-159
-190
-130
-152
-182
-128
-148
-178
-126
-130
-160
-110
-102
-132
-82
-88
-118
-66
-89
-123
-63
-93
-128
-62
-99
-135
-65
-105
-143
-68
-110
-148
-73
-109
-149
-76
-108
-148
-78
-107
-146
-79
-108
-145
-78
-105
-142
-73
-102
-138
-68
-99
-134
-66
-99
-134
-66
-102
-137
-73
-104
-139
-75
-102
-138
-76
-100
-136
-74
-103
-139
-77
-104
-140
-78
-103
-139
-75
-102
-139
-72
-101
-138
-69
-102
-139
-69
-106
-143
-73
-107
-147
-74
-113
-155
-81
-113
-157
-82
-114
-158
-83
-42
-48
-34
-41
-47
-35
-41
-46
-39
-41
-46
-40
-45
-47
-44
-49
-51
-48
-53
-54
-49
-55
-56
-50
-59
-60
-52
-62
-63
-55
-65
-68
-61
-72
-74
-71
-79
-80
-84
-83
-85
-97
-88
-89
-107
-90
-92
-117
-92
-90
-127
-94
-93
-137
-100
-98
-148
-107
-106
-164
-117
-116
-186
-127
-126
-206
-135
-135
-223
-139
-140
-233
-141
-141
-239
-140
-140
-240
-137
-137
-235
-133
-132
-226
-128
-128
-216
-128
-126
-210
-128
-127
-207
-130
-130
-204
-133
-134
-199
-134
-135
-199
-135
-136
-201
-137
-136
-204
-139
-136
-207
-140
-134
-206
-141
-134
-204
-142
-133
-200
-138
-128
-188
-137
-127
-177
-134
-124
-161
-130
-120
-147
-123
-115
-130
-116
-107
-112
-108
-98
-96
-100
-93
-83
-99
-96
-79
-98
-96
-75
-101
-94
-75
-102
-94
-75
-105
-92
-73
-108
-93
-72
-110
-94
-71
-113
-93
-69
-121
-93
-71
-130
-89
-67
-149
-88
-70
-173
-90
-76
-199
-86
-80
-221
-83
-83
-243
-82
-88
-254
-89
-95
-240
-85
-83
-227
-76
-69
-217
-62
-57
-213
-54
-48
-217
-54
-47
-220
-57
-48
-219
-57
-44
-214
-57
-40
-211
-56
-38
-209
-56
-38
-209
-56
-40
-212
-56
-41
-215
-55
-41
-220
-54
-42
-223
-52
-44
-221
-53
-44
-206
-48
-39
-201
-53
-41
-200
-57
-43
-198
-61
-45
-196
-65
-47
-193
-64
-45
-191
-60
-42
-190
-57
-40
-196
-56
-41
-203
-60
-46
-228
-82
-69
-220
-72
-60
-200
-52
-40
-204
-58
-45
-200
-58
-44
-194
-52
-38
-202
-61
-44
-203
-60
-43
-202
-59
-42
-202
-59
-42
-203
-58
-41
-204
-57
-41
-206
-56
-41
-207
-54
-40
-211
-55
-42
-214
-56
-44
-217
-55
-44
-215
-51
-41
-213
-49
-39
-216
-49
-40
-222
-55
-46
-231
-60
-53
-248
-68
-71
-241
-56
-62
-237
-47
-57
-239
-47
-58
-240
-48
-61
-238
-46
-59
-235
-49
-60
-235
-54
-63
-228
-53
-58
-220
-51
-54
-216
-50
-50
-223
-58
-56
-238
-69
-66
-248
-73
-70
-248
-68
-67
-243
-63
-62
-233
-58
-55
-231
-57
-56
-229
-57
-55
-226
-57
-54
-225
-56
-53
-224
-56
-53
-225
-57
-56
-225
-57
-56
-224
-56
-55
-226
-56
-56
-229
-57
-57
-231
-57
-58
-233
-57
-59
-236
-57
-60
-237
-57
-60
-238
-55
-59
-243
-54
-58
-242
-53
-57
-238
-54
-56
-234
-56
-56
-228
-59
-56
-220
-58
-53
-211
-57
-47
-203
-55
-43
-198
-56
-42
-195
-58
-42
-194
-58
-42
-192
-59
-42
-192
-59
-42
-193
-60
-41
-193
-60
-43
-193
-60
-41
-189
-57
-36
-193
-63
-41
-187
-58
-37
-179
-53
-31
-185
-58
-39
-192
-60
-47
-201
-58
-50
-215
-61
-61
-255
-95
-103
-255
-81
-100
-253
-67
-91
-246
-57
-87
-242
-57
-91
-242
-61
-96
-240
-64
-100
-224
-74
-101
-170
-64
-76
-131
-63
-62
-95
-58
-50
-72
-58
-47
-59
-61
-48
-59
-61
-50
-73
-59
-58
-85
-61
-61
-81
-47
-46
-84
-55
-47
-87
-75
-53
-100
-104
-69
-119
-143
-91
-140
-176
-112
-154
-195
-125
-159
-199
-129
-152
-186
-125
-154
-185
-128
-154
-182
-131
-141
-169
-120
-114
-142
-94
-89
-117
-69
-84
-112
-61
-92
-123
-66
-95
-127
-64
-98
-134
-64
-105
-141
-67
-109
-147
-72
-108
-148
-75
-107
-147
-76
-105
-144
-77
-105
-144
-77
-103
-140
-71
-101
-137
-67
-99
-134
-66
-99
-134
-68
-103
-138
-74
-105
-140
-76
-104
-140
-78
-103
-139
-77
-105
-141
-79
-105
-141
-77
-105
-142
-75
-103
-140
-71
-103
-140
-70
-102
-142
-69
-108
-146
-73
-109
-149
-76
-112
-156
-81
-111
-157
-82
-114
-158
-83
-45
-49
-34
-45
-49
-35
-44
-47
-38
-44
-46
-41
-47
-47
-45
-49
-49
-47
-51
-52
-47
-52
-53
-45
-57
-59
-48
-60
-62
-49
-64
-66
-55
-69
-72
-65
-75
-77
-76
-81
-82
-87
-85
-85
-97
-86
-87
-105
-92
-89
-116
-94
-93
-127
-102
-100
-140
-112
-110
-160
-122
-120
-183
-133
-131
-206
-141
-139
-223
-144
-144
-234
-144
-142
-239
-142
-140
-237
-138
-137
-231
-135
-132
-223
-129
-127
-211
-127
-124
-203
-127
-125
-200
-128
-127
-195
-134
-134
-196
-136
-136
-196
-138
-138
-198
-140
-139
-199
-140
-138
-201
-140
-136
-197
-140
-132
-191
-139
-130
-183
-137
-128
-175
-134
-124
-161
-128
-118
-145
-123
-112
-129
-117
-106
-114
-110
-100
-99
-105
-94
-88
-99
-93
-81
-93
-98
-76
-93
-98
-75
-97
-95
-74
-103
-92
-74
-109
-90
-73
-112
-91
-72
-114
-92
-71
-114
-92
-69
-122
-96
-73
-123
-87
-63
-137
-82
-61
-164
-85
-68
-199
-88
-79
-224
-86
-83
-245
-80
-84
-252
-79
-83
-226
-62
-60
-222
-60
-55
-221
-56
-52
-222
-55
-49
-225
-54
-47
-225
-54
-46
-221
-55
-43
-218
-55
-40
-212
-55
-38
-211
-56
-36
-211
-56
-38
-213
-56
-39
-216
-54
-41
-221
-53
-42
-224
-51
-44
-221
-53
-44
-203
-51
-40
-196
-54
-40
-194
-57
-41
-193
-60
-43
-194
-63
-45
-194
-63
-45
-193
-60
-43
-192
-56
-40
-195
-53
-39
-220
-74
-61
-218
-70
-58
-213
-65
-53
-206
-60
-47
-196
-54
-40
-196
-59
-43
-190
-54
-38
-198
-58
-41
-199
-58
-41
-199
-58
-41
-201
-58
-42
-202
-56
-41
-203
-55
-41
-204
-54
-40
-205
-51
-39
-213
-57
-45
-213
-55
-44
-214
-51
-42
-215
-51
-42
-218
-51
-43
-223
-54
-47
-229
-58
-51
-233
-60
-56
-240
-60
-61
-237
-52
-57
-235
-48
-55
-236
-49
-56
-238
-51
-60
-237
-52
-60
-235
-55
-64
-234
-61
-67
-221
-55
-59
-225
-65
-65
-236
-78
-75
-248
-89
-85
-253
-90
-85
-250
-81
-76
-239
-66
-62
-229
-56
-52
-226
-54
-50
-224
-55
-50
-224
-55
-50
-224
-55
-50
-225
-56
-53
-226
-57
-54
-228
-59
-56
-228
-59
-56
-225
-55
-55
-228
-56
-56
-230
-56
-58
-232
-56
-59
-235
-56
-60
-235
-56
-60
-235
-56
-60
-236
-56
-59
-239
-53
-56
-238
-52
-55
-236
-53
-55
-231
-55
-55
-226
-58
-55
-217
-58
-52
-207
-56
-47
-199
-55
-44
-194
-56
-43
-191
-58
-43
-189
-59
-43
-187
-60
-43
-187
-60
-43
-187
-60
-41
-187
-60
-43
-187
-60
-41
-184
-57
-38
-189
-64
-42
-179
-57
-36
-177
-54
-36
-182
-59
-43
-180
-49
-39
-194
-52
-48
-235
-80
-84
-255
-92
-105
-254
-75
-96
-243
-59
-85
-237
-57
-86
-238
-65
-93
-236
-73
-102
-227
-75
-100
-202
-79
-97
-130
-56
-57
-102
-62
-54
-85
-63
-50
-71
-64
-48
-59
-60
-44
-56
-54
-41
-65
-52
-43
-78
-55
-47
-72
-43
-35
-83
-60
-44
-103
-93
-66
-129
-136
-95
-146
-171
-116
-149
-188
-123
-148
-194
-122
-149
-192
-123
-146
-180
-120
-156
-184
-133
-154
-180
-133
-128
-154
-109
-92
-117
-75
-72
-98
-53
-78
-104
-56
-91
-120
-66
-95
-125
-63
-99
-131
-64
-104
-140
-68
-108
-146
-71
-106
-146
-73
-104
-146
-74
-103
-144
-76
-102
-143
-75
-100
-137
-68
-100
-135
-67
-99
-134
-68
-101
-136
-70
-104
-139
-75
-107
-142
-78
-107
-143
-79
-106
-142
-78
-105
-144
-79
-105
-144
-79
-105
-144
-77
-104
-144
-74
-103
-143
-72
-104
-146
-72
-108
-148
-75
-111
-153
-77
-115
-161
-86
-115
-163
-87
-117
-163
-88
-50
-52
-38
-48
-52
-38
-48
-49
-41
-48
-49
-43
-49
-50
-45
-50
-51
-46
-51
-52
-46
-52
-54
-43
-57
-59
-45
-59
-62
-45
-63
-65
-51
-68
-70
-57
-73
-74
-68
-77
-79
-78
-82
-81
-87
-83
-83
-93
-88
-86
-100
-92
-90
-111
-100
-97
-126
-110
-108
-148
-122
-119
-172
-132
-130
-195
-140
-137
-214
-145
-143
-227
-148
-145
-234
-147
-144
-235
-142
-139
-226
-137
-133
-217
-130
-127
-204
-127
-124
-195
-127
-124
-191
-128
-126
-189
-132
-131
-189
-134
-133
-190
-137
-136
-193
-141
-138
-193
-139
-136
-189
-137
-133
-183
-135
-127
-174
-133
-125
-166
-133
-123
-157
-128
-118
-143
-121
-110
-127
-114
-102
-112
-109
-97
-99
-107
-93
-90
-105
-90
-83
-99
-91
-78
-92
-97
-75
-90
-98
-74
-97
-95
-74
-103
-92
-74
-111
-89
-75
-115
-89
-74
-117
-90
-73
-119
-91
-70
-118
-86
-65
-123
-81
-59
-139
-81
-61
-171
-88
-70
-205
-91
-80
-226
-84
-80
-237
-71
-73
-239
-63
-65
-219
-50
-47
-220
-53
-47
-225
-53
-49
-227
-54
-48
-227
-53
-46
-225
-53
-43
-224
-54
-41
-219
-56
-41
-214
-55
-36
-211
-56
-36
-209
-56
-38
-212
-57
-39
-216
-54
-41
-220
-54
-42
-224
-51
-44
-218
-54
-45
-200
-54
-41
-189
-56
-39
-188
-55
-38
-189
-58
-40
-191
-62
-43
-194
-63
-45
-195
-59
-43
-196
-56
-41
-198
-52
-39
-233
-85
-73
-211
-60
-49
-204
-56
-44
-209
-66
-52
-190
-53
-37
-192
-61
-43
-192
-61
-43
-192
-56
-40
-196
-56
-39
-197
-57
-40
-199
-58
-41
-200
-57
-41
-203
-55
-41
-204
-54
-40
-205
-51
-39
-210
-54
-42
-212
-51
-41
-213
-50
-41
-219
-52
-44
-227
-58
-51
-233
-62
-55
-236
-63
-57
-236
-61
-58
-232
-52
-53
-236
-53
-57
-239
-54
-59
-238
-53
-59
-234
-50
-58
-230
-51
-57
-228
-55
-61
-226
-60
-64
-243
-85
-86
-252
-98
-98
-255
-109
-106
-255
-105
-100
-243
-86
-81
-228
-65
-60
-223
-54
-51
-221
-52
-47
-223
-54
-49
-222
-55
-49
-222
-55
-49
-223
-56
-50
-225
-56
-53
-226
-57
-54
-229
-57
-55
-230
-58
-56
-229
-55
-56
-230
-56
-57
-232
-56
-59
-233
-57
-60
-235
-56
-60
-235
-56
-60
-235
-56
-60
-236
-55
-60
-238
-53
-58
-238
-54
-56
-234
-54
-55
-229
-57
-55
-223
-60
-55
-214
-60
-52
-204
-57
-47
-197
-57
-44
-190
-57
-42
-186
-59
-42
-182
-59
-41
-181
-60
-41
-181
-60
-43
-180
-61
-41
-179
-59
-42
-179
-60
-40
-179
-58
-39
-183
-64
-44
-173
-56
-38
-173
-56
-39
-179
-59
-45
-171
-43
-34
-193
-53
-52
-252
-97
-103
-253
-85
-100
-249
-72
-92
-238
-62
-85
-232
-62
-88
-229
-73
-95
-220
-81
-100
-206
-81
-95
-177
-85
-90
-119
-70
-65
-92
-70
-57
-79
-66
-50
-74
-67
-49
-70
-67
-48
-64
-61
-42
-61
-54
-35
-61
-50
-30
-65
-50
-29
-81
-70
-42
-110
-107
-72
-138
-147
-102
-149
-172
-116
-145
-180
-116
-141
-184
-115
-144
-186
-120
-157
-187
-133
-161
-184
-138
-144
-167
-125
-108
-130
-91
-75
-95
-58
-65
-87
-48
-76
-99
-55
-87
-114
-63
-95
-123
-64
-100
-131
-64
-105
-138
-67
-107
-145
-70
-105
-145
-72
-103
-145
-71
-100
-143
-72
-101
-142
-74
-98
-135
-66
-99
-134
-66
-100
-135
-69
-103
-138
-72
-106
-141
-77
-108
-143
-79
-109
-145
-81
-110
-146
-82
-106
-145
-80
-106
-145
-78
-106
-146
-76
-104
-146
-74
-103
-145
-71
-105
-147
-71
-109
-151
-75
-112
-156
-79
-119
-166
-88
-118
-166
-90
-118
-166
-90
-55
-56
-40
-54
-56
-42
-54
-54
-44
-53
-54
-46
-53
-54
-48
-53
-54
-48
-54
-55
-47
-54
-56
-43
-59
-62
-45
-61
-64
-45
-64
-67
-46
-68
-71
-52
-73
-75
-62
-77
-78
-70
-81
-80
-78
-82
-82
-82
-86
-85
-83
-89
-88
-93
-97
-95
-108
-107
-105
-129
-117
-115
-155
-128
-125
-178
-136
-134
-199
-140
-138
-211
-149
-146
-225
-148
-145
-226
-144
-141
-220
-139
-135
-211
-132
-129
-196
-129
-125
-186
-127
-124
-181
-127
-124
-179
-129
-126
-181
-132
-129
-182
-135
-133
-183
-137
-134
-181
-138
-132
-176
-134
-128
-166
-129
-122
-155
-128
-119
-146
-127
-115
-135
-122
-110
-124
-114
-101
-108
-109
-95
-95
-106
-91
-88
-105
-90
-83
-106
-89
-79
-102
-90
-76
-97
-96
-76
-95
-97
-76
-100
-95
-76
-105
-92
-75
-110
-91
-76
-116
-90
-75
-122
-90
-75
-125
-90
-71
-127
-84
-65
-136
-81
-61
-157
-81
-65
-182
-86
-70
-205
-83
-72
-216
-72
-64
-223
-58
-56
-226
-52
-51
-221
-49
-45
-223
-51
-47
-226
-53
-47
-227
-53
-46
-225
-51
-44
-223
-51
-41
-221
-53
-40
-220
-57
-40
-211
-56
-36
-208
-57
-36
-207
-58
-38
-209
-58
-39
-212
-56
-41
-217
-55
-42
-221
-53
-44
-216
-55
-45
-196
-59
-43
-185
-58
-41
-181
-54
-37
-183
-56
-39
-189
-59
-43
-194
-61
-46
-199
-59
-46
-199
-55
-44
-208
-57
-48
-245
-92
-84
-214
-61
-53
-201
-53
-43
-207
-65
-53
-184
-51
-36
-183
-58
-40
-188
-63
-43
-191
-58
-41
-195
-58
-42
-198
-58
-43
-200
-58
-44
-202
-59
-45
-204
-58
-45
-207
-56
-45
-209
-55
-45
-208
-51
-42
-210
-49
-41
-214
-49
-43
-222
-55
-49
-229
-60
-55
-234
-62
-58
-232
-59
-55
-230
-55
-52
-233
-55
-53
-239
-59
-60
-240
-60
-63
-234
-54
-57
-228
-49
-53
-228
-53
-58
-232
-66
-70
-237
-77
-79
-255
-120
-119
-255
-113
-110
-241
-96
-91
-221
-74
-67
-209
-56
-51
-209
-50
-46
-220
-55
-51
-231
-64
-58
-224
-57
-51
-224
-57
-49
-224
-55
-50
-224
-55
-50
-226
-54
-50
-227
-55
-51
-229
-55
-54
-229
-55
-54
-230
-54
-56
-231
-55
-57
-234
-55
-59
-235
-56
-60
-235
-56
-62
-235
-56
-62
-232
-55
-61
-234
-55
-59
-238
-55
-59
-238
-55
-57
-234
-55
-58
-228
-58
-58
-223
-61
-58
-214
-61
-55
-203
-59
-50
-195
-59
-47
-186
-56
-42
-181
-58
-42
-179
-59
-42
-175
-60
-41
-175
-60
-42
-172
-60
-40
-172
-59
-41
-172
-59
-41
-170
-59
-40
-172
-61
-42
-166
-56
-39
-167
-57
-42
-170
-56
-45
-171
-48
-41
-203
-64
-67
-255
-105
-114
-243
-78
-94
-241
-72
-91
-235
-69
-89
-226
-73
-91
-215
-80
-94
-199
-85
-93
-178
-86
-87
-153
-90
-85
-103
-75
-63
-83
-74
-57
-80
-68
-52
-78
-67
-49
-73
-67
-45
-66
-64
-39
-63
-66
-35
-65
-71
-35
-77
-85
-46
-94
-103
-60
-120
-129
-84
-139
-153
-102
-145
-164
-109
-141
-169
-110
-143
-178
-114
-151
-185
-125
-157
-183
-136
-146
-167
-128
-117
-134
-100
-82
-99
-67
-63
-80
-48
-66
-83
-49
-79
-97
-57
-86
-108
-61
-98
-123
-66
-101
-130
-66
-105
-138
-67
-106
-144
-69
-105
-146
-70
-101
-145
-70
-98
-144
-72
-99
-142
-71
-98
-135
-66
-102
-134
-67
-103
-138
-72
-105
-140
-74
-107
-142
-78
-109
-144
-80
-110
-146
-82
-111
-147
-83
-106
-145
-78
-107
-146
-79
-106
-147
-77
-105
-147
-75
-105
-147
-73
-106
-150
-73
-110
-154
-75
-114
-158
-79
-120
-167
-89
-118
-167
-88
-118
-167
-88
-63
-61
-46
-61
-62
-46
-61
-61
-49
-61
-61
-51
-61
-61
-53
-59
-60
-52
-59
-61
-50
-59
-61
-47
-63
-66
-47
-64
-68
-45
-67
-71
-46
-70
-74
-51
-75
-76
-58
-78
-79
-65
-81
-81
-73
-82
-82
-72
-89
-87
-74
-90
-90
-78
-95
-94
-92
-103
-101
-114
-113
-110
-137
-123
-121
-161
-131
-128
-183
-135
-133
-196
-143
-140
-209
-143
-140
-211
-141
-138
-207
-138
-133
-199
-131
-127
-186
-126
-121
-175
-122
-119
-166
-121
-118
-165
-123
-119
-169
-124
-122
-171
-128
-125
-170
-131
-126
-166
-131
-125
-161
-127
-121
-149
-124
-116
-137
-122
-114
-129
-118
-107
-115
-114
-102
-104
-109
-95
-94
-106
-91
-86
-107
-90
-82
-108
-90
-80
-108
-90
-78
-107
-91
-78
-103
-94
-77
-102
-95
-77
-103
-94
-77
-106
-93
-77
-110
-93
-77
-118
-92
-77
-124
-92
-77
-131
-89
-73
-150
-94
-79
-157
-85
-71
-169
-77
-64
-185
-73
-61
-197
-64
-55
-204
-56
-46
-213
-50
-43
-221
-50
-43
-225
-53
-49
-225
-54
-47
-226
-53
-46
-226
-52
-45
-224
-50
-41
-222
-52
-39
-220
-54
-38
-218
-59
-40
-209
-57
-36
-205
-59
-36
-204
-59
-38
-206
-59
-39
-209
-58
-41
-213
-57
-42
-217
-55
-44
-211
-57
-45
-193
-62
-44
-180
-59
-40
-176
-53
-35
-178
-53
-35
-187
-57
-41
-196
-60
-46
-201
-59
-47
-203
-55
-45
-217
-63
-55
-248
-91
-84
-227
-73
-65
-206
-58
-48
-204
-64
-51
-184
-54
-38
-172
-51
-32
-181
-60
-41
-188
-57
-39
-191
-55
-39
-192
-55
-39
-195
-55
-40
-197
-55
-41
-201
-55
-42
-206
-55
-44
-209
-55
-45
-217
-60
-51
-219
-58
-50
-222
-57
-51
-229
-60
-55
-234
-62
-58
-234
-61
-57
-231
-56
-53
-227
-52
-49
-232
-57
-54
-235
-60
-57
-236
-58
-58
-232
-56
-58
-236
-62
-64
-248
-80
-80
-255
-98
-99
-255
-112
-112
-249
-104
-101
-226
-84
-80
-202
-61
-54
-192
-49
-43
-201
-52
-48
-214
-59
-55
-223
-61
-58
-224
-59
-55
-226
-59
-53
-225
-58
-50
-226
-57
-52
-225
-56
-51
-227
-55
-51
-228
-55
-51
-229
-53
-53
-230
-54
-54
-233
-54
-57
-233
-54
-57
-234
-55
-59
-235
-56
-60
-235
-56
-62
-234
-55
-61
-232
-55
-61
-233
-54
-58
-239
-56
-60
-236
-56
-57
-232
-56
-58
-227
-59
-58
-221
-62
-58
-211
-62
-55
-201
-60
-50
-192
-60
-47
-182
-56
-41
-178
-58
-41
-174
-59
-41
-170
-59
-40
-169
-60
-40
-168
-59
-39
-165
-58
-38
-165
-58
-40
-165
-60
-41
-160
-57
-40
-160
-59
-41
-160
-57
-42
-162
-54
-42
-181
-62
-56
-219
-84
-88
-249
-102
-112
-237
-76
-92
-237
-74
-93
-231
-76
-92
-216
-78
-91
-198
-83
-90
-177
-87
-86
-156
-92
-82
-136
-97
-82
-84
-71
-55
-77
-74
-57
-83
-70
-53
-77
-62
-43
-63
-51
-27
-57
-54
-23
-65
-77
-37
-78
-102
-54
-108
-138
-84
-119
-148
-92
-132
-155
-101
-137
-154
-100
-141
-155
-102
-144
-163
-107
-148
-173
-116
-152
-176
-124
-131
-149
-109
-110
-125
-92
-81
-96
-67
-60
-74
-48
-57
-70
-44
-65
-80
-49
-79
-95
-59
-87
-106
-61
-99
-122
-68
-101
-130
-66
-106
-139
-68
-107
-145
-70
-105
-146
-70
-101
-145
-70
-97
-143
-70
-99
-142
-71
-99
-136
-67
-105
-137
-70
-106
-141
-75
-108
-143
-77
-108
-143
-79
-108
-143
-79
-109
-145
-81
-110
-146
-82
-109
-148
-81
-109
-149
-79
-109
-150
-80
-108
-150
-76
-107
-151
-74
-109
-153
-74
-114
-159
-78
-115
-162
-81
-124
-173
-94
-123
-172
-93
-122
-171
-92
-68
-65
-48
-68
-66
-51
-68
-66
-54
-67
-67
-57
-67
-67
-59
-67
-67
-59
-66
-66
-54
-66
-67
-51
-68
-70
-48
-69
-72
-45
-71
-74
-45
-74
-77
-50
-79
-78
-57
-82
-81
-63
-84
-82
-69
-85
-83
-68
-92
-90
-67
-92
-92
-68
-92
-93
-79
-97
-97
-97
-105
-104
-120
-114
-113
-144
-123
-122
-166
-129
-126
-181
-134
-130
-191
-136
-131
-195
-136
-132
-193
-132
-129
-186
-127
-123
-174
-121
-115
-161
-116
-111
-151
-111
-109
-148
-112
-109
-154
-114
-111
-158
-118
-113
-154
-119
-115
-150
-119
-115
-142
-116
-111
-131
-115
-107
-120
-114
-105
-110
-109
-97
-97
-108
-95
-89
-106
-92
-83
-107
-90
-80
-109
-91
-79
-111
-91
-80
-111
-92
-78
-111
-92
-78
-110
-92
-78
-109
-93
-78
-107
-94
-78
-108
-95
-79
-111
-95
-79
-117
-96
-79
-125
-93
-78
-137
-89
-77
-161
-95
-83
-167
-79
-69
-174
-66
-56
-186
-59
-50
-197
-55
-45
-204
-50
-40
-212
-51
-41
-220
-53
-44
-224
-55
-48
-225
-54
-47
-225
-52
-45
-224
-51
-44
-224
-52
-42
-221
-53
-40
-216
-55
-37
-212
-57
-37
-207
-58
-34
-202
-61
-34
-201
-61
-36
-202
-62
-39
-205
-60
-41
-210
-59
-42
-213
-57
-44
-207
-59
-45
-191
-64
-45
-177
-60
-40
-172
-53
-33
-174
-51
-33
-186
-56
-40
-196
-60
-46
-202
-58
-47
-206
-53
-45
-216
-57
-51
-240
-78
-73
-241
-84
-77
-217
-66
-57
-204
-66
-53
-190
-63
-46
-166
-49
-29
-179
-60
-40
-190
-60
-44
-193
-57
-43
-193
-55
-42
-194
-54
-41
-197
-55
-43
-201
-57
-46
-207
-59
-49
-212
-59
-51
-225
-68
-61
-227
-65
-60
-228
-63
-59
-231
-62
-59
-233
-61
-59
-233
-59
-58
-232
-56
-56
-231
-56
-53
-231
-56
-53
-230
-57
-53
-230
-55
-52
-233
-59
-58
-244
-74
-74
-255
-92
-91
-255
-100
-99
-248
-99
-95
-204
-61
-57
-193
-56
-50
-189
-52
-46
-195
-56
-49
-213
-65
-61
-222
-69
-64
-223
-61
-59
-217
-52
-50
-226
-59
-53
-226
-59
-51
-226
-57
-52
-226
-57
-52
-228
-56
-52
-229
-56
-52
-231
-55
-55
-233
-55
-55
-234
-54
-57
-235
-55
-58
-235
-54
-59
-235
-56
-60
-235
-56
-62
-232
-55
-61
-232
-55
-61
-233
-54
-58
-235
-55
-58
-233
-54
-57
-230
-56
-57
-224
-59
-57
-219
-62
-57
-209
-62
-54
-198
-60
-49
-190
-60
-46
-179
-56
-41
-174
-59
-41
-170
-59
-40
-166
-59
-39
-164
-59
-40
-163
-58
-39
-163
-58
-39
-160
-57
-38
-161
-62
-43
-150
-55
-37
-156
-61
-43
-154
-57
-41
-154
-50
-39
-195
-80
-75
-237
-107
-109
-237
-93
-102
-235
-80
-94
-232
-75
-92
-220
-74
-87
-202
-77
-83
-182
-84
-83
-161
-93
-82
-142
-101
-81
-127
-106
-85
-78
-75
-56
-75
-72
-55
-80
-63
-47
-76
-55
-36
-69
-53
-27
-71
-71
-35
-87
-111
-61
-105
-146
-86
-127
-178
-111
-130
-179
-113
-131
-165
-104
-125
-146
-89
-131
-141
-89
-142
-150
-99
-137
-151
-100
-124
-140
-95
-88
-102
-67
-71
-84
-56
-57
-69
-45
-54
-66
-42
-58
-68
-44
-61
-74
-48
-74
-88
-55
-87
-104
-62
-101
-124
-70
-104
-130
-67
-108
-139
-69
-108
-144
-70
-105
-147
-71
-99
-145
-70
-97
-145
-71
-97
-143
-71
-102
-139
-70
-108
-140
-73
-109
-144
-78
-110
-145
-79
-108
-143
-79
-107
-142
-78
-107
-143
-79
-109
-145
-81
-112
-151
-84
-113
-153
-83
-112
-153
-83
-112
-154
-80
-111
-155
-78
-113
-157
-78
-116
-163
-82
-119
-166
-85
-126
-175
-96
-123
-174
-95
-121
-172
-93
-73
-67
-51
-74
-68
-54
-73
-69
-57
-73
-69
-58
-73
-71
-59
-73
-71
-59
-72
-70
-57
-72
-71
-53
-73
-72
-51
-74
-74
-50
-76
-76
-50
-78
-78
-52
-82
-80
-59
-84
-81
-62
-88
-82
-68
-89
-84
-65
-93
-89
-62
-91
-90
-62
-92
-89
-72
-94
-91
-84
-100
-97
-104
-110
-107
-126
-120
-115
-147
-125
-120
-160
-129
-123
-167
-131
-125
-171
-133
-127
-173
-131
-124
-166
-125
-119
-157
-117
-110
-143
-111
-105
-133
-107
-103
-130
-105
-102
-133
-106
-103
-134
-109
-104
-134
-109
-105
-128
-109
-105
-120
-108
-103
-110
-107
-98
-101
-106
-96
-94
-103
-93
-84
-104
-92
-80
-104
-90
-77
-107
-91
-76
-110
-93
-77
-113
-94
-79
-113
-94
-79
-112
-93
-78
-112
-93
-79
-111
-93
-79
-112
-93
-78
-115
-93
-79
-119
-93
-78
-126
-93
-78
-137
-91
-76
-147
-87
-76
-162
-84
-72
-166
-69
-60
-171
-57
-47
-186
-55
-45
-200
-56
-47
-211
-54
-45
-217
-54
-45
-221
-54
-45
-223
-54
-47
-223
-52
-45
-223
-52
-44
-223
-52
-44
-223
-55
-44
-221
-55
-41
-216
-54
-39
-209
-54
-36
-207
-58
-36
-204
-60
-36
-202
-60
-38
-203
-61
-39
-206
-59
-41
-209
-59
-42
-211
-58
-44
-206
-60
-45
-190
-65
-47
-175
-60
-39
-168
-51
-33
-172
-51
-32
-182
-57
-39
-193
-61
-46
-201
-59
-47
-204
-56
-46
-204
-50
-42
-224
-65
-59
-248
-91
-84
-224
-73
-64
-208
-68
-55
-202
-70
-55
-171
-50
-31
-184
-63
-44
-202
-70
-55
-204
-66
-53
-202
-64
-51
-203
-63
-50
-205
-63
-51
-210
-66
-55
-220
-69
-60
-225
-71
-63
-226
-64
-59
-226
-61
-57
-227
-58
-55
-226
-54
-52
-226
-54
-52
-227
-55
-53
-229
-57
-55
-229
-60
-57
-228
-63
-57
-224
-61
-54
-221
-58
-53
-225
-63
-58
-234
-77
-72
-234
-81
-76
-211
-64
-57
-184
-41
-35
-184
-45
-38
-190
-53
-45
-201
-62
-55
-208
-65
-59
-214
-62
-57
-217
-59
-56
-225
-59
-59
-231
-61
-61
-226
-57
-54
-226
-57
-54
-226
-57
-54
-228
-56
-54
-229
-57
-53
-231
-58
-54
-233
-57
-57
-234
-58
-58
-234
-56
-56
-234
-56
-56
-235
-56
-59
-235
-56
-59
-233
-57
-60
-232
-56
-59
-231
-55
-58
-231
-55
-58
-233
-54
-58
-230
-54
-56
-226
-56
-56
-222
-58
-56
-214
-61
-56
-204
-61
-53
-194
-60
-49
-185
-59
-45
-174
-57
-40
-170
-59
-42
-166
-59
-41
-162
-59
-40
-160
-59
-39
-158
-59
-38
-159
-58
-40
-155
-58
-39
-152
-63
-45
-140
-53
-34
-153
-61
-46
-152
-56
-42
-151
-47
-38
-205
-92
-88
-246
-122
-124
-222
-88
-95
-229
-89
-100
-217
-81
-91
-200
-77
-82
-183
-77
-79
-167
-87
-80
-155
-97
-85
-141
-104
-85
-128
-110
-86
-84
-84
-56
-67
-72
-42
-66
-57
-28
-72
-59
-27
-88
-80
-43
-110
-116
-68
-132
-162
-102
-148
-193
-126
-135
-188
-118
-134
-184
-115
-124
-158
-97
-110
-130
-77
-117
-126
-81
-130
-135
-94
-117
-125
-86
-91
-98
-64
-59
-68
-41
-52
-60
-37
-53
-61
-40
-61
-68
-50
-60
-69
-50
-57
-67
-43
-67
-80
-50
-85
-101
-62
-103
-123
-72
-105
-131
-70
-108
-139
-71
-109
-145
-71
-106
-147
-71
-102
-146
-71
-98
-144
-71
-99
-142
-71
-104
-141
-74
-108
-143
-77
-111
-146
-80
-110
-147
-80
-108
-143
-77
-105
-142
-75
-106
-143
-74
-106
-146
-76
-115
-155
-84
-115
-157
-85
-115
-157
-83
-114
-158
-81
-114
-158
-79
-115
-162
-82
-119
-166
-85
-122
-171
-90
-119
-167
-91
-117
-165
-91
-116
-164
-90
-82
-75
-59
-82
-75
-59
-82
-74
-61
-82
-74
-61
-82
-74
-61
-82
-74
-61
-82
-74
-61
-82
-75
-59
-85
-78
-60
-86
-79
-61
-87
-80
-62
-88
-81
-63
-89
-82
-64
-91
-84
-68
-92
-85
-69
-92
-85
-69
-98
-91
-72
-97
-90
-72
-97
-89
-76
-98
-89
-82
-101
-93
-91
-107
-97
-105
-113
-102
-116
-117
-106
-123
-122
-110
-132
-124
-112
-136
-127
-115
-139
-127
-115
-137
-124
-112
-132
-117
-106
-123
-109
-98
-114
-101
-93
-106
-99
-96
-105
-96
-95
-101
-95
-93
-98
-95
-90
-94
-94
-90
-89
-94
-89
-85
-97
-90
-82
-98
-90
-79
-101
-91
-79
-103
-91
-75
-105
-92
-75
-107
-92
-73
-107
-92
-71
-109
-92
-72
-109
-93
-70
-106
-94
-72
-106
-98
-79
-114
-101
-84
-113
-90
-74
-117
-79
-66
-139
-87
-74
-156
-92
-80
-162
-90
-76
-170
-91
-76
-164
-78
-61
-165
-70
-52
-166
-60
-44
-176
-56
-40
-194
-56
-45
-210
-56
-48
-221
-52
-49
-222
-49
-45
-223
-54
-47
-222
-55
-46
-222
-55
-46
-222
-55
-46
-222
-55
-46
-219
-55
-43
-216
-54
-41
-215
-55
-41
-213
-56
-41
-212
-56
-41
-210
-57
-41
-210
-57
-41
-210
-57
-43
-210
-57
-43
-212
-56
-43
-205
-59
-44
-189
-59
-43
-182
-62
-45
-174
-57
-40
-169
-49
-32
-171
-50
-33
-183
-57
-42
-192
-60
-47
-195
-57
-46
-200
-53
-43
-206
-53
-45
-212
-58
-48
-219
-67
-56
-221
-75
-62
-212
-72
-57
-194
-61
-44
-183
-50
-35
-221
-80
-70
-216
-74
-64
-212
-70
-60
-211
-69
-59
-215
-73
-63
-219
-72
-64
-221
-68
-62
-223
-61
-58
-223
-55
-52
-230
-56
-55
-234
-58
-58
-234
-58
-58
-229
-57
-55
-224
-55
-52
-222
-57
-51
-220
-61
-55
-220
-69
-62
-209
-65
-57
-199
-57
-47
-191
-50
-40
-185
-48
-38
-186
-52
-41
-191
-59
-47
-195
-63
-51
-195
-58
-48
-199
-61
-51
-208
-64
-55
-217
-64
-58
-224
-62
-59
-229
-60
-57
-233
-57
-57
-236
-58
-58
-230
-56
-58
-229
-56
-58
-229
-56
-58
-229
-57
-57
-229
-57
-55
-229
-57
-55
-229
-57
-53
-229
-57
-53
-224
-52
-48
-225
-53
-49
-228
-54
-53
-229
-55
-54
-230
-56
-57
-231
-57
-58
-231
-57
-58
-231
-57
-59
-235
-59
-62
-230
-57
-59
-223
-57
-57
-220
-61
-58
-214
-65
-61
-205
-66
-59
-193
-65
-54
-183
-63
-49
-169
-58
-41
-163
-60
-43
-160
-61
-42
-155
-60
-40
-153
-58
-38
-150
-58
-37
-151
-56
-38
-145
-56
-38
-144
-65
-48
-139
-60
-45
-135
-47
-35
-145
-47
-38
-188
-76
-74
-228
-109
-111
-229
-109
-111
-205
-86
-90
-189
-76
-78
-181
-78
-79
-170
-81
-77
-162
-85
-79
-155
-88
-79
-150
-93
-82
-149
-97
-84
-138
-106
-83
-88
-89
-47
-61
-75
-22
-56
-69
-15
-86
-97
-41
-127
-141
-80
-155
-176
-111
-161
-188
-121
-156
-189
-120
-146
-181
-115
-126
-157
-97
-104
-128
-76
-92
-109
-67
-89
-100
-66
-84
-93
-66
-72
-80
-57
-63
-68
-48
-58
-61
-44
-64
-67
-50
-60
-64
-49
-58
-62
-48
-60
-67
-51
-58
-67
-48
-65
-78
-50
-82
-100
-62
-93
-115
-66
-103
-131
-72
-112
-143
-75
-111
-147
-75
-108
-146
-71
-106
-146
-73
-105
-147
-75
-103
-144
-74
-108
-144
-80
-109
-145
-83
-111
-147
-83
-108
-147
-80
-109
-146
-77
-107
-147
-74
-109
-150
-74
-109
-152
-73
-113
-156
-76
-113
-158
-77
-114
-159
-78
-114
-161
-80
-116
-163
-82
-118
-167
-85
-121
-170
-89
-122
-170
-94
-123
-168
-101
-111
-155
-92
-101
-145
-82
-87
-78
-63
-87
-78
-63
-87
-78
-63
-87
-78
-63
-87
-78
-63
-87
-78
-63
-87
-78
-63
-87
-78
-63
-88
-79
-64
-89
-80
-65
-89
-80
-65
-91
-82
-67
-92
-83
-68
-93
-84
-69
-94
-85
-70
-95
-86
-71
-100
-91
-74
-99
-90
-73
-99
-89
-77
-99
-89
-79
-102
-91
-85
-106
-95
-93
-110
-98
-100
-112
-100
-104
-114
-101
-108
-116
-103
-112
-118
-105
-114
-118
-105
-114
-115
-102
-109
-109
-96
-103
-103
-91
-95
-98
-88
-89
-94
-91
-86
-90
-90
-82
-89
-86
-79
-87
-84
-75
-88
-84
-73
-88
-84
-72
-92
-86
-72
-94
-87
-71
-99
-90
-75
-99
-90
-73
-102
-91
-73
-103
-92
-72
-105
-93
-71
-106
-94
-70
-107
-95
-71
-106
-95
-73
-102
-97
-77
-111
-103
-84
-119
-91
-77
-129
-83
-70
-153
-86
-77
-168
-88
-79
-175
-82
-74
-180
-82
-69
-173
-73
-57
-170
-67
-48
-171
-61
-44
-177
-57
-41
-190
-56
-44
-204
-55
-48
-216
-52
-50
-220
-51
-48
-221
-54
-46
-220
-56
-46
-220
-56
-46
-220
-56
-46
-219
-55
-45
-218
-56
-45
-217
-55
-44
-215
-55
-43
-215
-55
-43
-213
-55
-43
-213
-55
-43
-213
-55
-43
-212
-56
-43
-212
-56
-43
-212
-56
-43
-206
-58
-44
-190
-60
-46
-182
-62
-46
-174
-57
-40
-166
-49
-32
-167
-50
-32
-178
-58
-41
-185
-62
-46
-190
-60
-46
-198
-58
-45
-199
-52
-42
-203
-52
-41
-210
-59
-48
-220
-69
-58
-225
-79
-66
-223
-81
-67
-221
-79
-67
-219
-70
-63
-214
-65
-59
-209
-60
-53
-208
-59
-52
-211
-62
-55
-215
-62
-56
-217
-58
-54
-218
-53
-51
-230
-56
-55
-234
-56
-56
-236
-56
-57
-234
-56
-56
-230
-56
-55
-226
-58
-55
-225
-62
-57
-219
-66
-58
-205
-64
-55
-194
-61
-52
-187
-57
-44
-180
-52
-39
-178
-52
-38
-181
-55
-41
-186
-60
-45
-191
-64
-49
-198
-64
-52
-205
-64
-54
-213
-65
-55
-220
-63
-56
-226
-58
-55
-230
-56
-55
-235
-55
-54
-239
-56
-58
-233
-54
-58
-231
-54
-60
-231
-55
-58
-230
-56
-57
-230
-56
-55
-229
-57
-53
-229
-57
-53
-227
-58
-53
-226
-57
-50
-227
-58
-51
-227
-58
-53
-228
-59
-54
-228
-59
-56
-228
-59
-56
-229
-57
-57
-229
-57
-57
-228
-58
-59
-227
-59
-59
-223
-60
-61
-217
-63
-61
-208
-65
-59
-196
-63
-54
-183
-61
-50
-172
-59
-45
-165
-59
-43
-160
-61
-42
-156
-61
-43
-151
-60
-41
-150
-59
-40
-146
-58
-38
-147
-56
-37
-140
-58
-37
-128
-57
-39
-128
-56
-41
-137
-53
-42
-157
-60
-53
-191
-81
-80
-215
-101
-101
-209
-94
-97
-183
-77
-77
-172
-78
-76
-164
-84
-77
-157
-89
-80
-152
-92
-81
-151
-94
-83
-151
-94
-83
-152
-95
-86
-140
-102
-81
-96
-95
-47
-83
-103
-42
-94
-114
-51
-122
-144
-79
-153
-175
-110
-165
-190
-124
-153
-178
-112
-136
-160
-98
-106
-130
-72
-97
-117
-66
-84
-101
-59
-74
-88
-55
-70
-80
-55
-63
-72
-53
-57
-63
-49
-53
-56
-45
-58
-60
-47
-65
-66
-52
-61
-63
-52
-58
-61
-50
-61
-65
-51
-58
-67
-48
-64
-77
-51
-82
-100
-62
-94
-116
-69
-103
-131
-72
-113
-144
-77
-112
-148
-76
-110
-146
-72
-107
-148
-72
-107
-147
-76
-104
-145
-75
-109
-145
-81
-110
-146
-84
-109
-148
-83
-109
-148
-81
-107
-147
-76
-107
-148
-72
-108
-151
-72
-109
-152
-72
-112
-157
-74
-112
-157
-74
-112
-160
-76
-115
-162
-81
-117
-166
-84
-120
-169
-88
-120
-169
-88
-120
-168
-94
-110
-152
-89
-100
-141
-83
-90
-131
-73
-93
-84
-69
-93
-84
-69
-93
-84
-69
-93
-84
-69
-93
-84
-69
-93
-84
-69
-93
-84
-69
-93
-84
-69
-91
-82
-67
-92
-83
-68
-93
-84
-69
-94
-85
-70
-95
-86
-71
-96
-87
-72
-97
-88
-73
-97
-88
-71
-101
-93
-74
-101
-93
-72
-100
-91
-74
-100
-91
-76
-101
-91
-81
-102
-91
-85
-104
-93
-89
-104
-93
-91
-105
-93
-93
-106
-94
-94
-107
-95
-95
-107
-95
-95
-105
-94
-92
-102
-91
-89
-98
-87
-83
-95
-86
-81
-90
-86
-77
-87
-84
-75
-85
-81
-72
-82
-78
-67
-81
-77
-66
-83
-79
-67
-87
-81
-67
-88
-82
-66
-94
-87
-71
-94
-87
-69
-97
-89
-70
-99
-91
-70
-103
-92
-72
-105
-94
-72
-107
-96
-74
-105
-97
-76
-101
-96
-77
-113
-101
-85
-123
-94
-80
-136
-88
-78
-162
-91
-85
-175
-88
-81
-177
-74
-69
-182
-71
-64
-182
-65
-55
-183
-63
-49
-182
-60
-47
-184
-56
-43
-189
-55
-43
-197
-57
-44
-204
-57
-47
-211
-57
-47
-217
-56
-46
-219
-55
-45
-219
-55
-45
-219
-57
-46
-218
-56
-45
-217
-55
-44
-217
-55
-44
-215
-55
-43
-215
-55
-43
-213
-55
-43
-213
-55
-43
-212
-56
-43
-212
-56
-43
-212
-56
-43
-210
-57
-43
-205
-59
-44
-192
-62
-48
-182
-62
-46
-173
-58
-40
-163
-50
-32
-163
-51
-31
-170
-58
-38
-179
-62
-44
-185
-62
-46
-196
-63
-48
-196
-56
-43
-197
-50
-40
-200
-52
-42
-208
-60
-48
-216
-70
-57
-220
-77
-63
-225
-78
-68
-216
-59
-54
-215
-53
-51
-210
-51
-48
-211
-53
-50
-216
-58
-55
-222
-63
-60
-227
-62
-60
-232
-60
-60
-236
-57
-60
-237
-54
-58
-234
-51
-55
-231
-51
-54
-230
-54
-56
-227
-57
-57
-224
-60
-58
-217
-64
-58
-193
-55
-45
-184
-56
-43
-179
-53
-39
-175
-52
-37
-175
-52
-37
-178
-55
-40
-182
-59
-43
-187
-61
-46
-200
-68
-53
-205
-67
-54
-213
-66
-56
-217
-63
-55
-223
-58
-52
-229
-56
-52
-234
-54
-53
-238
-55
-57
-234
-54
-57
-233
-54
-57
-233
-54
-57
-231
-55
-55
-231
-55
-55
-230
-57
-53
-229
-57
-53
-229
-58
-51
-227
-58
-51
-228
-59
-52
-228
-59
-54
-227
-60
-54
-227
-59
-56
-226
-58
-57
-225
-57
-57
-222
-56
-56
-221
-57
-58
-220
-60
-60
-218
-64
-62
-211
-66
-61
-200
-63
-57
-185
-58
-49
-173
-55
-43
-165
-55
-40
-161
-59
-44
-157
-60
-43
-153
-60
-43
-148
-59
-41
-147
-58
-40
-144
-57
-38
-144
-55
-37
-138
-57
-38
-122
-54
-35
-121
-54
-37
-136
-57
-44
-160
-70
-61
-185
-83
-79
-192
-87
-84
-184
-80
-79
-171
-73
-70
-162
-77
-72
-156
-83
-76
-153
-89
-80
-151
-94
-83
-151
-97
-87
-151
-97
-87
-152
-95
-86
-139
-101
-80
-115
-114
-70
-122
-141
-86
-147
-166
-110
-164
-185
-128
-171
-192
-135
-158
-179
-123
-124
-144
-91
-91
-111
-60
-63
-82
-36
-65
-83
-43
-65
-80
-47
-63
-76
-50
-58
-67
-48
-54
-60
-46
-54
-57
-48
-53
-56
-47
-57
-59
-46
-64
-65
-51
-61
-63
-52
-57
-60
-49
-61
-65
-51
-57
-66
-47
-64
-77
-51
-81
-99
-61
-96
-118
-71
-105
-133
-74
-115
-146
-79
-114
-150
-78
-112
-148
-74
-109
-150
-74
-109
-149
-78
-107
-148
-78
-112
-148
-84
-113
-149
-85
-111
-150
-83
-110
-150
-80
-108
-148
-75
-108
-149
-73
-108
-151
-72
-110
-153
-73
-112
-157
-76
-112
-157
-76
-112
-159
-78
-117
-164
-83
-120
-169
-88
-121
-170
-91
-117
-166
-87
-113
-160
-88
-95
-137
-74
-86
-127
-69
-79
-120
-62
-97
-88
-73
-97
-88
-73
-97
-88
-73
-97
-88
-73
-97
-88
-73
-97
-88
-73
-97
-88
-73
-97
-88
-73
-95
-86
-71
-96
-87
-72
-96
-87
-72
-97
-88
-73
-98
-89
-74
-99
-90
-75
-100
-91
-76
-100
-91
-74
-101
-93
-72
-102
-94
-71
-102
-94
-73
-103
-95
-76
-103
-94
-79
-102
-92
-80
-102
-92
-82
-102
-92
-83
-104
-93
-87
-104
-93
-87
-104
-93
-87
-104
-94
-85
-103
-93
-84
-101
-91
-81
-100
-90
-80
-99
-91
-78
-93
-89
-77
-90
-86
-74
-86
-82
-70
-82
-78
-66
-80
-76
-64
-80
-77
-62
-84
-78
-64
-85
-79
-63
-87
-81
-65
-89
-84
-65
-91
-86
-67
-93
-88
-68
-97
-90
-71
-100
-93
-74
-102
-95
-76
-102
-97
-77
-103
-97
-81
-111
-99
-85
-119
-91
-79
-138
-91
-81
-169
-98
-92
-182
-91
-88
-180
-71
-68
-183
-61
-58
-193
-61
-56
-195
-60
-54
-195
-58
-48
-193
-57
-45
-189
-56
-41
-189
-57
-42
-193
-61
-46
-202
-62
-47
-213
-57
-45
-217
-55
-44
-218
-56
-45
-217
-57
-45
-218
-56
-45
-216
-56
-44
-216
-56
-44
-213
-55
-43
-213
-55
-43
-212
-56
-43
-212
-56
-43
-212
-56
-43
-212
-56
-43
-212
-56
-43
-210
-57
-43
-205
-59
-44
-193
-63
-49
-182
-62
-46
-172
-57
-39
-162
-51
-32
-157
-51
-29
-162
-56
-34
-172
-61
-41
-181
-64
-46
-188
-63
-45
-191
-58
-43
-195
-55
-42
-197
-53
-42
-203
-55
-43
-206
-58
-46
-206
-60
-47
-211
-58
-50
-220
-55
-53
-223
-50
-52
-218
-50
-50
-218
-52
-52
-222
-56
-56
-226
-60
-60
-232
-62
-63
-235
-61
-62
-235
-56
-60
-235
-52
-56
-232
-49
-54
-229
-50
-53
-228
-54
-56
-224
-56
-55
-217
-55
-53
-204
-55
-49
-185
-51
-40
-177
-54
-39
-175
-53
-38
-174
-54
-38
-174
-54
-38
-176
-56
-40
-179
-58
-41
-181
-58
-42
-195
-65
-49
-202
-66
-52
-210
-66
-55
-217
-64
-56
-223
-60
-53
-227
-58
-53
-234
-56
-54
-236
-56
-55
-237
-54
-56
-235
-55
-56
-235
-55
-56
-234
-56
-54
-234
-56
-54
-232
-57
-52
-231
-58
-52
-230
-59
-52
-226
-57
-50
-225
-58
-50
-223
-58
-52
-224
-59
-55
-222
-58
-56
-220
-58
-56
-219
-57
-55
-217
-57
-57
-214
-60
-58
-213
-64
-60
-210
-67
-61
-202
-65
-59
-187
-59
-50
-175
-54
-43
-164
-54
-39
-158
-55
-40
-156
-59
-42
-152
-59
-41
-148
-59
-41
-146
-59
-40
-143
-58
-38
-141
-56
-36
-140
-55
-35
-135
-57
-37
-128
-61
-42
-118
-53
-35
-129
-53
-39
-153
-69
-58
-170
-80
-72
-172
-77
-71
-169
-76
-71
-166
-81
-76
-157
-80
-74
-152
-85
-76
-148
-90
-79
-148
-94
-82
-149
-97
-86
-149
-97
-86
-151
-97
-87
-141
-103
-84
-137
-133
-95
-153
-169
-120
-173
-189
-142
-166
-184
-136
-144
-161
-116
-115
-134
-89
-78
-96
-56
-47
-65
-27
-45
-62
-28
-51
-66
-37
-58
-70
-46
-61
-70
-51
-59
-65
-51
-58
-61
-50
-58
-61
-52
-60
-61
-53
-57
-57
-45
-63
-64
-50
-60
-62
-51
-57
-60
-49
-60
-64
-50
-57
-66
-47
-63
-76
-50
-80
-98
-60
-97
-119
-72
-106
-134
-75
-116
-147
-80
-115
-151
-79
-114
-150
-76
-111
-152
-76
-111
-151
-80
-109
-151
-79
-112
-151
-84
-115
-152
-85
-112
-152
-82
-111
-151
-80
-109
-150
-74
-109
-150
-72
-110
-153
-74
-112
-155
-75
-113
-158
-77
-114
-159
-78
-116
-163
-83
-121
-168
-88
-123
-172
-93
-119
-167
-91
-109
-157
-83
-101
-146
-77
-90
-132
-69
-82
-123
-65
-77
-118
-60
-99
-90
-75
-99
-90
-75
-99
-90
-75
-99
-90
-75
-99
-90
-75
-99
-90
-75
-99
-90
-75
-99
-90
-75
-99
-90
-75
-99
-90
-75
-100
-91
-76
-100
-91
-76
-101
-92
-77
-102
-93
-78
-102
-93
-78
-102
-93
-76
-102
-94
-71
-103
-95
-72
-104
-96
-73
-105
-97
-76
-105
-97
-78
-105
-96
-79
-104
-95
-80
-103
-94
-79
-106
-96
-84
-105
-96
-81
-105
-96
-81
-104
-95
-78
-104
-95
-78
-104
-96
-77
-104
-96
-77
-104
-97
-78
-100
-94
-78
-96
-90
-76
-91
-85
-71
-86
-80
-66
-80
-77
-62
-78
-75
-58
-78
-75
-58
-78
-75
-58
-80
-77
-60
-82
-79
-62
-84
-81
-64
-86
-83
-64
-88
-87
-67
-91
-90
-70
-93
-92
-72
-95
-92
-75
-99
-96
-81
-105
-93
-81
-112
-85
-74
-134
-91
-82
-172
-105
-99
-189
-100
-96
-191
-79
-77
-197
-67
-67
-205
-61
-61
-210
-58
-57
-209
-57
-52
-203
-56
-48
-194
-56
-43
-187
-60
-41
-184
-65
-43
-190
-65
-43
-208
-58
-43
-215
-55
-41
-216
-56
-42
-215
-58
-43
-217
-57
-43
-214
-57
-42
-214
-57
-42
-212
-56
-41
-212
-56
-41
-212
-56
-41
-212
-56
-41
-210
-57
-41
-210
-57
-41
-210
-57
-41
-210
-57
-41
-205
-59
-44
-193
-63
-49
-182
-62
-48
-171
-58
-40
-161
-54
-34
-154
-52
-30
-155
-55
-32
-163
-61
-38
-175
-66
-45
-179
-59
-42
-186
-59
-44
-194
-58
-44
-199
-57
-45
-203
-56
-46
-206
-58
-48
-208
-60
-48
-216
-59
-52
-232
-58
-60
-234
-53
-60
-228
-51
-57
-226
-51
-56
-223
-53
-56
-223
-53
-56
-225
-52
-56
-225
-51
-53
-233
-54
-60
-232
-53
-57
-231
-52
-58
-230
-56
-58
-226
-57
-60
-218
-56
-54
-206
-51
-49
-191
-48
-40
-181
-53
-40
-174
-57
-40
-174
-57
-40
-173
-58
-40
-173
-58
-40
-173
-58
-40
-173
-56
-38
-175
-55
-38
-184
-58
-43
-193
-59
-47
-205
-63
-51
-215
-64
-55
-221
-62
-56
-225
-60
-56
-231
-58
-54
-235
-57
-55
-237
-55
-54
-238
-54
-54
-238
-54
-54
-237
-55
-52
-234
-56
-52
-232
-58
-51
-231
-58
-51
-228
-60
-51
-225
-58
-50
-223
-59
-50
-223
-60
-53
-220
-61
-55
-219
-61
-58
-217
-62
-60
-215
-61
-59
-212
-62
-61
-207
-64
-60
-203
-66
-60
-197
-66
-58
-185
-61
-53
-173
-55
-45
-163
-53
-40
-158
-55
-40
-154
-58
-42
-150
-59
-41
-147
-60
-41
-145
-59
-42
-141
-58
-40
-138
-57
-38
-137
-56
-37
-136
-55
-36
-131
-56
-37
-131
-64
-45
-117
-52
-34
-123
-51
-37
-147
-71
-58
-164
-81
-73
-161
-78
-70
-158
-78
-71
-161
-87
-78
-152
-85
-76
-146
-88
-76
-144
-90
-78
-141
-92
-78
-143
-93
-82
-148
-96
-85
-151
-97
-87
-143
-104
-87
-141
-137
-102
-152
-165
-122
-157
-169
-129
-128
-142
-106
-93
-107
-72
-68
-83
-52
-50
-64
-38
-36
-50
-25
-45
-58
-38
-48
-59
-42
-53
-61
-46
-57
-63
-51
-60
-63
-52
-61
-63
-52
-58
-59
-51
-58
-58
-48
-57
-57
-45
-62
-63
-49
-59
-61
-50
-56
-59
-48
-59
-63
-49
-56
-65
-46
-62
-75
-49
-80
-98
-60
-98
-120
-73
-107
-135
-76
-117
-148
-81
-116
-152
-80
-115
-151
-77
-113
-154
-78
-113
-153
-82
-111
-153
-81
-114
-154
-83
-114
-154
-83
-114
-154
-81
-112
-153
-77
-109
-151
-75
-109
-152
-73
-112
-155
-76
-115
-158
-79
-116
-160
-81
-118
-162
-83
-120
-167
-89
-123
-169
-94
-122
-168
-95
-113
-159
-86
-100
-146
-74
-89
-134
-67
-92
-133
-73
-85
-124
-69
-81
-120
-65
-101
-92
-77
-101
-92
-77
-101
-92
-77
-101
-92
-77
-101
-92
-77
-101
-92
-77
-101
-92
-77
-101
-92
-77
-101
-92
-77
-102
-93
-78
-102
-93
-78
-102
-93
-78
-103
-94
-79
-103
-94
-79
-104
-95
-80
-104
-95
-78
-103
-95
-74
-104
-96
-73
-105
-97
-76
-106
-98
-77
-106
-98
-79
-106
-98
-79
-106
-97
-80
-106
-97
-80
-106
-97
-80
-105
-97
-78
-104
-96
-77
-104
-96
-75
-104
-96
-75
-104
-96
-73
-105
-97
-74
-106
-98
-75
-102
-95
-77
-98
-93
-74
-94
-88
-72
-88
-82
-66
-83
-77
-61
-77
-74
-57
-75
-72
-55
-73
-72
-54
-75
-74
-56
-76
-75
-57
-76
-77
-59
-78
-79
-61
-80
-81
-63
-81
-84
-65
-83
-86
-69
-84
-85
-69
-92
-88
-76
-95
-85
-73
-100
-80
-69
-124
-87
-78
-161
-104
-97
-181
-102
-97
-193
-88
-85
-211
-83
-82
-214
-65
-67
-220
-60
-62
-219
-57
-55
-210
-56
-48
-200
-58
-46
-189
-62
-43
-178
-66
-42
-183
-64
-40
-204
-59
-42
-212
-55
-40
-213
-56
-41
-213
-57
-42
-214
-57
-42
-213
-57
-42
-213
-57
-42
-212
-56
-41
-212
-56
-41
-210
-57
-41
-210
-57
-41
-210
-57
-41
-210
-57
-41
-210
-57
-41
-210
-57
-41
-205
-59
-44
-193
-63
-49
-181
-61
-47
-171
-60
-41
-162
-57
-36
-153
-54
-31
-149
-53
-29
-155
-59
-34
-167
-65
-42
-178
-66
-46
-185
-64
-47
-191
-59
-44
-195
-55
-42
-197
-50
-40
-203
-52
-43
-210
-59
-48
-223
-61
-56
-233
-54
-58
-237
-52
-60
-234
-55
-61
-232
-57
-62
-229
-59
-62
-228
-59
-62
-225
-59
-61
-224
-58
-60
-223
-53
-56
-224
-55
-58
-226
-57
-62
-224
-61
-62
-217
-61
-62
-207
-58
-54
-194
-51
-47
-181
-48
-39
-177
-57
-43
-172
-61
-42
-172
-61
-42
-171
-62
-42
-170
-61
-41
-169
-60
-40
-169
-58
-39
-171
-56
-37
-175
-54
-37
-183
-56
-41
-197
-59
-48
-206
-62
-51
-214
-61
-53
-222
-60
-55
-227
-59
-56
-232
-59
-55
-236
-56
-55
-239
-55
-53
-239
-55
-53
-238
-56
-53
-235
-58
-52
-233
-59
-52
-231
-60
-52
-228
-61
-52
-226
-62
-53
-224
-63
-55
-222
-65
-58
-218
-65
-59
-217
-65
-62
-213
-65
-63
-209
-64
-61
-205
-66
-63
-195
-63
-58
-187
-64
-56
-179
-61
-51
-170
-56
-45
-161
-53
-40
-155
-53
-39
-152
-56
-40
-149
-60
-42
-145
-60
-40
-141
-60
-41
-138
-60
-40
-136
-58
-38
-134
-57
-39
-132
-55
-37
-131
-54
-36
-127
-54
-37
-125
-58
-41
-116
-51
-33
-126
-57
-42
-151
-79
-65
-163
-89
-78
-156
-82
-71
-149
-79
-69
-152
-86
-74
-149
-89
-78
-144
-91
-77
-142
-90
-77
-140
-91
-77
-142
-92
-81
-147
-95
-84
-153
-96
-87
-145
-103
-87
-126
-120
-88
-121
-131
-94
-114
-124
-90
-85
-96
-66
-59
-69
-44
-47
-59
-37
-48
-59
-42
-48
-60
-46
-51
-61
-50
-52
-60
-49
-54
-60
-50
-60
-63
-54
-64
-65
-57
-63
-65
-54
-60
-60
-48
-55
-55
-43
-56
-57
-43
-62
-63
-49
-58
-60
-49
-55
-58
-47
-58
-62
-48
-55
-64
-45
-61
-74
-48
-79
-97
-59
-98
-120
-73
-107
-135
-76
-117
-148
-81
-117
-153
-81
-116
-152
-78
-113
-154
-78
-114
-154
-83
-112
-154
-82
-114
-154
-81
-115
-156
-80
-114
-155
-79
-112
-153
-75
-110
-153
-74
-112
-155
-76
-115
-158
-79
-118
-161
-82
-121
-165
-88
-123
-167
-90
-122
-168
-93
-120
-166
-93
-113
-159
-87
-103
-148
-79
-93
-138
-69
-88
-130
-66
-95
-134
-77
-87
-126
-71
-82
-121
-66
-103
-94
-79
-103
-94
-79
-103
-94
-79
-103
-94
-79
-103
-94
-79
-103
-94
-79
-103
-94
-79
-103
-94
-79
-103
-94
-79
-103
-94
-79
-103
-94
-79
-104
-95
-80
-104
-95
-80
-104
-95
-80
-104
-95
-80
-105
-96
-79
-106
-97
-80
-106
-98
-79
-106
-98
-79
-106
-98
-79
-105
-96
-79
-105
-96
-79
-105
-97
-78
-105
-97
-78
-105
-97
-78
-104
-96
-75
-104
-96
-75
-104
-96
-73
-104
-96
-73
-104
-97
-71
-104
-97
-71
-104
-97
-71
-102
-95
-76
-101
-94
-75
-98
-91
-73
-92
-87
-68
-87
-82
-63
-80
-77
-58
-76
-73
-56
-73
-72
-54
-73
-72
-54
-71
-72
-54
-71
-74
-57
-71
-75
-58
-72
-76
-59
-73
-77
-60
-72
-79
-63
-74
-78
-63
-82
-80
-67
-89
-81
-70
-92
-78
-67
-105
-82
-68
-129
-89
-77
-149
-87
-76
-174
-84
-76
-209
-91
-89
-217
-75
-74
-223
-65
-66
-223
-57
-57
-217
-55
-50
-207
-59
-49
-195
-62
-45
-183
-64
-42
-180
-60
-36
-201
-58
-41
-211
-55
-40
-212
-56
-41
-211
-58
-42
-213
-57
-42
-211
-58
-42
-211
-58
-42
-211
-58
-42
-210
-57
-41
-209
-58
-41
-209
-58
-41
-209
-58
-41
-209
-58
-41
-209
-58
-41
-209
-58
-41
-205
-59
-44
-193
-61
-48
-181
-61
-47
-172
-61
-44
-163
-60
-41
-152
-56
-32
-144
-52
-27
-149
-57
-32
-161
-65
-41
-173
-67
-45
-182
-65
-47
-191
-61
-47
-192
-54
-43
-194
-47
-37
-199
-48
-39
-208
-54
-46
-222
-58
-56
-232
-53
-57
-238
-54
-62
-236
-59
-65
-233
-64
-67
-229
-66
-69
-224
-66
-67
-220
-64
-65
-217
-63
-63
-204
-50
-50
-207
-55
-54
-211
-58
-60
-207
-62
-59
-199
-60
-57
-189
-56
-49
-180
-53
-46
-171
-53
-41
-170
-60
-45
-167
-62
-43
-167
-62
-43
-166
-63
-44
-165
-62
-43
-166
-61
-40
-166
-59
-39
-169
-58
-39
-170
-55
-37
-177
-56
-39
-188
-56
-43
-195
-57
-46
-203
-56
-48
-211
-58
-52
-220
-61
-57
-228
-63
-59
-233
-58
-55
-236
-57
-53
-236
-57
-53
-235
-58
-52
-233
-59
-52
-232
-59
-52
-229
-61
-52
-226
-62
-52
-224
-66
-55
-221
-67
-57
-218
-67
-60
-213
-66
-59
-207
-65
-61
-202
-63
-60
-199
-61
-59
-191
-62
-57
-177
-60
-51
-169
-58
-47
-162
-56
-43
-156
-54
-40
-152
-55
-39
-148
-56
-41
-145
-58
-41
-141
-58
-40
-139
-61
-41
-137
-60
-42
-135
-60
-41
-131
-58
-39
-130
-57
-40
-128
-55
-38
-127
-54
-37
-125
-54
-36
-120
-51
-35
-120
-53
-37
-133
-66
-50
-152
-85
-69
-157
-87
-75
-148
-80
-67
-144
-80
-68
-149
-90
-76
-147
-89
-77
-144
-90
-78
-144
-92
-81
-144
-92
-81
-146
-91
-84
-149
-92
-85
-152
-91
-86
-142
-98
-85
-107
-98
-69
-86
-96
-61
-74
-83
-52
-61
-71
-44
-54
-63
-42
-50
-61
-44
-52
-62
-51
-53
-63
-54
-54
-61
-54
-56
-63
-56
-61
-66
-59
-67
-70
-61
-69
-71
-60
-67
-68
-54
-64
-62
-47
-59
-57
-42
-55
-56
-42
-61
-62
-48
-58
-60
-49
-55
-58
-47
-58
-62
-48
-54
-63
-44
-61
-74
-48
-78
-96
-58
-97
-119
-72
-107
-135
-76
-117
-148
-81
-117
-153
-81
-116
-152
-78
-114
-155
-79
-114
-154
-83
-112
-154
-80
-113
-155
-79
-114
-157
-78
-113
-156
-77
-112
-155
-76
-111
-154
-75
-114
-157
-78
-117
-161
-84
-121
-165
-88
-127
-171
-96
-126
-169
-97
-122
-165
-93
-113
-156
-85
-102
-145
-76
-95
-137
-71
-93
-135
-69
-94
-136
-73
-97
-136
-79
-89
-128
-73
-82
-121
-66
-104
-95
-80
-104
-95
-80
-104
-95
-80
-104
-95
-80
-104
-95
-80
-104
-95
-80
-104
-95
-80
-104
-95
-80
-103
-94
-79
-104
-95
-80
-104
-95
-80
-104
-95
-80
-104
-95
-80
-104
-95
-80
-105
-96
-81
-105
-96
-81
-109
-100
-85
-108
-99
-84
-106
-97
-82
-105
-96
-81
-104
-95
-80
-103
-94
-79
-103
-94
-77
-104
-96
-77
-105
-97
-78
-105
-97
-76
-105
-97
-76
-105
-97
-76
-104
-96
-73
-104
-96
-73
-104
-97
-71
-104
-96
-73
-103
-97
-75
-102
-95
-76
-101
-94
-75
-98
-91
-72
-92
-87
-68
-85
-82
-63
-80
-77
-60
-77
-76
-58
-69
-70
-52
-68
-71
-52
-68
-72
-55
-68
-72
-55
-66
-73
-57
-66
-75
-58
-66
-75
-58
-67
-74
-58
-74
-74
-62
-84
-80
-68
-85
-79
-65
-89
-76
-60
-101
-75
-58
-115
-69
-53
-146
-74
-62
-192
-91
-83
-215
-83
-79
-222
-70
-69
-223
-59
-58
-220
-55
-53
-213
-59
-51
-204
-61
-47
-189
-60
-41
-184
-55
-34
-203
-58
-41
-207
-56
-39
-208
-57
-40
-210
-59
-42
-210
-59
-42
-210
-59
-42
-210
-59
-42
-210
-59
-42
-209
-58
-41
-209
-58
-41
-209
-58
-41
-209
-58
-41
-209
-58
-41
-209
-58
-41
-209
-58
-41
-205
-59
-44
-193
-59
-48
-182
-58
-46
-173
-60
-44
-167
-62
-43
-153
-57
-35
-143
-51
-26
-147
-55
-30
-159
-63
-39
-163
-57
-35
-176
-59
-41
-192
-62
-48
-198
-60
-49
-204
-56
-46
-208
-55
-47
-217
-60
-53
-227
-63
-61
-236
-61
-66
-238
-63
-68
-233
-67
-69
-226
-68
-67
-214
-64
-63
-202
-59
-55
-192
-53
-48
-187
-49
-46
-183
-48
-44
-187
-54
-49
-190
-58
-54
-187
-60
-54
-179
-58
-50
-169
-57
-46
-164
-56
-44
-160
-58
-43
-161
-61
-45
-159
-62
-43
-160
-63
-44
-161
-64
-45
-161
-64
-45
-163
-64
-43
-163
-62
-42
-164
-61
-42
-169
-59
-42
-173
-58
-40
-178
-55
-40
-184
-54
-41
-191
-53
-43
-201
-57
-48
-212
-63
-57
-224
-67
-62
-229
-60
-55
-232
-59
-53
-232
-59
-53
-231
-60
-52
-229
-60
-53
-228
-61
-52
-225
-62
-53
-222
-64
-53
-220
-68
-57
-216
-68
-58
-210
-67
-59
-202
-65
-57
-196
-63
-58
-188
-59
-54
-184
-56
-53
-176
-57
-51
-162
-55
-45
-153
-56
-40
-149
-53
-39
-147
-54
-39
-145
-58
-41
-143
-60
-42
-139
-58
-41
-133
-56
-38
-136
-61
-42
-133
-60
-43
-131
-60
-42
-128
-60
-41
-126
-58
-39
-124
-56
-37
-123
-54
-38
-123
-54
-38
-121
-49
-35
-128
-56
-42
-140
-71
-56
-150
-83
-67
-146
-80
-66
-139
-76
-61
-144
-82
-69
-153
-95
-83
-145
-87
-76
-146
-89
-78
-148
-91
-82
-150
-93
-84
-150
-93
-86
-151
-92
-86
-150
-89
-84
-140
-94
-81
-97
-88
-59
-69
-77
-40
-54
-64
-30
-56
-65
-38
-62
-71
-50
-60
-69
-52
-51
-61
-50
-45
-55
-46
-49
-56
-49
-55
-62
-54
-66
-69
-60
-71
-74
-63
-72
-73
-59
-66
-67
-49
-63
-62
-42
-59
-58
-38
-55
-56
-40
-61
-62
-48
-57
-59
-48
-54
-57
-46
-58
-62
-48
-54
-63
-44
-60
-73
-47
-78
-96
-58
-97
-119
-72
-106
-134
-75
-117
-148
-81
-116
-152
-80
-116
-152
-78
-114
-155
-79
-114
-154
-83
-112
-154
-80
-113
-156
-77
-113
-156
-76
-113
-156
-76
-112
-155
-75
-112
-155
-76
-115
-158
-79
-119
-163
-86
-123
-167
-92
-130
-173
-101
-128
-171
-100
-120
-163
-92
-106
-149
-80
-93
-135
-69
-89
-131
-65
-94
-136
-72
-101
-143
-80
-99
-138
-81
-90
-129
-74
-83
-122
-67
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-95
-83
-106
-96
-87
-106
-96
-87
-106
-96
-87
-106
-96
-87
-106
-96
-86
-106
-96
-86
-106
-96
-84
-106
-97
-82
-106
-97
-82
-106
-97
-80
-106
-97
-80
-106
-98
-79
-106
-98
-79
-106
-98
-79
-106
-98
-77
-106
-98
-77
-103
-95
-74
-103
-95
-74
-102
-94
-73
-101
-95
-73
-98
-93
-73
-90
-88
-67
-83
-80
-61
-77
-76
-58
-72
-73
-55
-69
-72
-55
-65
-69
-54
-64
-68
-53
-63
-69
-55
-63
-71
-56
-63
-71
-56
-63
-69
-55
-72
-74
-61
-74
-75
-61
-67
-68
-52
-75
-74
-54
-92
-81
-59
-96
-70
-47
-128
-75
-57
-189
-107
-93
-217
-104
-96
-224
-86
-83
-226
-71
-69
-229
-65
-64
-226
-64
-61
-215
-61
-53
-203
-59
-48
-201
-59
-45
-199
-51
-37
-203
-53
-38
-204
-54
-39
-205
-55
-40
-205
-55
-40
-206
-56
-41
-209
-59
-44
-211
-61
-46
-210
-60
-45
-210
-60
-45
-210
-60
-45
-210
-60
-45
-209
-59
-44
-209
-59
-44
-209
-59
-44
-206
-60
-45
-187
-50
-40
-182
-55
-46
-177
-59
-47
-168
-58
-41
-154
-55
-34
-148
-53
-31
-149
-55
-30
-156
-57
-34
-174
-65
-45
-179
-59
-43
-186
-54
-41
-193
-52
-42
-205
-54
-47
-215
-60
-55
-226
-67
-63
-234
-72
-69
-232
-68
-69
-232
-69
-72
-221
-67
-67
-201
-58
-54
-187
-54
-49
-180
-56
-48
-176
-55
-46
-169
-52
-43
-171
-57
-47
-169
-57
-46
-164
-56
-46
-160
-56
-45
-155
-57
-44
-150
-58
-43
-147
-60
-43
-146
-60
-43
-150
-61
-43
-152
-61
-42
-153
-62
-43
-154
-63
-44
-155
-64
-45
-156
-65
-44
-158
-66
-45
-161
-64
-45
-162
-59
-42
-165
-58
-40
-171
-55
-40
-176
-54
-41
-182
-54
-43
-190
-56
-45
-197
-58
-51
-204
-60
-52
-218
-61
-54
-224
-61
-54
-226
-63
-56
-226
-65
-55
-226
-65
-57
-222
-66
-54
-218
-64
-54
-215
-64
-53
-216
-72
-61
-210
-69
-59
-199
-65
-56
-187
-59
-50
-178
-53
-47
-170
-51
-45
-166
-49
-42
-159
-50
-43
-153
-57
-45
-146
-59
-42
-145
-57
-43
-141
-58
-42
-139
-58
-41
-136
-59
-41
-135
-59
-43
-133
-60
-43
-128
-57
-39
-125
-56
-40
-124
-57
-40
-124
-57
-40
-124
-57
-40
-123
-56
-39
-121
-54
-38
-120
-51
-36
-119
-45
-32
-139
-65
-52
-151
-79
-67
-147
-77
-65
-142
-76
-64
-145
-81
-69
-147
-85
-74
-142
-82
-71
-152
-92
-82
-152
-92
-82
-145
-85
-77
-144
-84
-76
-151
-90
-85
-149
-88
-83
-148
-87
-84
-147
-103
-90
-93
-84
-53
-73
-81
-42
-65
-75
-40
-66
-75
-44
-62
-72
-47
-55
-64
-43
-50
-61
-45
-52
-63
-49
-52
-60
-49
-72
-80
-67
-90
-94
-80
-87
-91
-74
-77
-79
-58
-68
-70
-46
-65
-65
-39
-61
-61
-37
-58
-59
-41
-62
-63
-49
-59
-61
-50
-58
-61
-50
-59
-63
-49
-52
-61
-42
-59
-72
-46
-80
-98
-60
-99
-121
-74
-108
-136
-77
-117
-148
-81
-115
-151
-79
-114
-150
-76
-112
-153
-77
-114
-154
-83
-113
-155
-81
-112
-157
-76
-113
-158
-75
-114
-159
-78
-114
-159
-78
-115
-159
-80
-118
-162
-85
-123
-167
-92
-127
-170
-98
-130
-173
-102
-120
-163
-94
-106
-147
-79
-96
-137
-71
-94
-135
-69
-97
-137
-74
-102
-142
-80
-104
-144
-84
-100
-137
-83
-91
-128
-76
-84
-121
-69
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-95
-83
-106
-95
-89
-106
-95
-91
-106
-95
-91
-106
-95
-89
-106
-95
-89
-106
-96
-87
-106
-96
-86
-106
-96
-84
-106
-96
-84
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-80
-106
-97
-80
-104
-96
-77
-104
-96
-75
-103
-95
-74
-103
-95
-74
-100
-93
-74
-94
-89
-69
-85
-82
-63
-79
-78
-58
-73
-74
-58
-69
-72
-55
-66
-68
-54
-64
-68
-53
-63
-69
-55
-62
-70
-55
-62
-70
-55
-61
-69
-54
-66
-70
-56
-65
-67
-53
-64
-69
-49
-72
-76
-53
-77
-73
-48
-82
-65
-39
-124
-82
-58
-185
-117
-98
-201
-100
-88
-221
-96
-90
-234
-86
-84
-230
-72
-71
-226
-64
-62
-226
-64
-61
-219
-62
-57
-209
-56
-48
-205
-57
-43
-206
-61
-44
-207
-61
-46
-207
-62
-45
-207
-59
-45
-206
-59
-43
-205
-57
-43
-205
-58
-42
-206
-58
-44
-208
-58
-43
-208
-58
-44
-208
-58
-43
-208
-58
-44
-208
-58
-43
-208
-58
-44
-205
-59
-46
-201
-63
-53
-197
-66
-58
-188
-66
-55
-174
-61
-47
-159
-54
-35
-150
-49
-29
-150
-49
-29
-155
-50
-29
-168
-53
-35
-180
-54
-40
-195
-59
-47
-209
-65
-56
-222
-69
-63
-230
-73
-68
-233
-74
-70
-234
-75
-72
-224
-66
-65
-219
-69
-68
-208
-66
-62
-190
-59
-51
-175
-57
-47
-171
-61
-48
-165
-63
-49
-159
-61
-48
-159
-63
-49
-156
-62
-50
-151
-62
-48
-149
-61
-47
-143
-61
-47
-139
-62
-46
-135
-64
-46
-136
-63
-44
-142
-61
-42
-143
-60
-42
-146
-60
-43
-145
-62
-44
-148
-63
-43
-148
-63
-43
-150
-63
-44
-153
-62
-44
-159
-64
-46
-161
-61
-45
-164
-58
-44
-168
-56
-44
-173
-55
-43
-178
-56
-45
-184
-57
-48
-189
-56
-47
-202
-60
-50
-208
-60
-50
-211
-63
-53
-213
-65
-55
-215
-67
-57
-214
-67
-57
-212
-68
-57
-209
-69
-56
-202
-66
-54
-195
-65
-52
-185
-61
-51
-176
-58
-48
-169
-54
-47
-164
-53
-46
-159
-52
-44
-153
-55
-44
-146
-58
-46
-140
-61
-44
-138
-59
-44
-136
-59
-43
-134
-58
-42
-132
-59
-42
-131
-60
-42
-129
-60
-44
-126
-59
-42
-124
-59
-41
-123
-57
-41
-121
-58
-41
-120
-57
-40
-119
-56
-39
-117
-54
-39
-119
-52
-36
-128
-52
-39
-144
-68
-55
-152
-78
-67
-145
-75
-63
-140
-74
-62
-143
-81
-68
-146
-84
-73
-144
-82
-71
-147
-83
-74
-152
-88
-79
-152
-85
-79
-151
-86
-80
-156
-93
-88
-148
-87
-82
-142
-83
-79
-138
-99
-84
-93
-87
-53
-88
-99
-57
-95
-106
-66
-90
-102
-66
-73
-84
-54
-54
-67
-41
-52
-64
-42
-60
-72
-52
-79
-88
-71
-89
-98
-81
-95
-102
-84
-87
-92
-70
-74
-78
-55
-66
-69
-42
-63
-63
-35
-60
-60
-34
-57
-58
-40
-61
-62
-48
-58
-60
-49
-57
-60
-49
-60
-64
-50
-53
-62
-43
-59
-72
-46
-80
-98
-60
-100
-122
-75
-108
-136
-77
-117
-148
-81
-116
-152
-80
-114
-150
-76
-113
-154
-78
-114
-154
-83
-113
-155
-81
-115
-160
-79
-114
-159
-76
-112
-157
-76
-113
-158
-77
-116
-160
-81
-120
-164
-87
-124
-167
-95
-127
-170
-99
-123
-166
-97
-111
-154
-85
-99
-140
-74
-93
-134
-68
-97
-137
-74
-101
-141
-78
-101
-141
-78
-99
-139
-79
-100
-137
-83
-91
-128
-76
-84
-121
-69
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-95
-85
-106
-95
-91
-106
-94
-94
-106
-94
-94
-106
-95
-93
-106
-95
-89
-106
-96
-87
-106
-96
-86
-106
-96
-84
-106
-96
-84
-106
-96
-84
-106
-96
-84
-106
-96
-84
-106
-96
-84
-106
-96
-84
-106
-96
-86
-106
-96
-84
-108
-97
-79
-107
-96
-76
-105
-97
-78
-105
-97
-78
-102
-95
-76
-97
-92
-72
-89
-86
-67
-83
-82
-62
-77
-75
-60
-72
-73
-57
-68
-70
-56
-65
-69
-54
-65
-69
-54
-63
-70
-54
-62
-68
-54
-61
-67
-53
-62
-69
-53
-58
-62
-45
-66
-71
-49
-73
-75
-51
-69
-63
-37
-84
-64
-39
-132
-92
-67
-181
-116
-96
-179
-87
-74
-214
-100
-90
-239
-101
-98
-236
-84
-83
-230
-70
-72
-235
-71
-72
-232
-66
-68
-219
-57
-54
-203
-55
-43
-201
-58
-42
-201
-58
-44
-201
-58
-42
-203
-57
-44
-202
-56
-41
-200
-54
-41
-200
-54
-39
-202
-56
-43
-203
-55
-41
-203
-55
-43
-203
-55
-41
-203
-55
-43
-204
-56
-42
-204
-56
-44
-203
-56
-46
-194
-51
-45
-190
-53
-47
-182
-54
-45
-173
-51
-40
-161
-48
-34
-158
-47
-30
-160
-49
-32
-167
-51
-36
-188
-65
-50
-199
-67
-55
-214
-71
-63
-225
-76
-70
-231
-76
-71
-233
-74
-70
-229
-70
-66
-223
-68
-64
-216
-66
-65
-209
-67
-65
-195
-63
-58
-177
-59
-49
-166
-60
-47
-161
-65
-49
-156
-69
-52
-152
-69
-51
-149
-68
-51
-146
-67
-52
-143
-66
-50
-138
-65
-48
-133
-64
-48
-130
-65
-47
-126
-65
-46
-129
-64
-46
-132
-59
-42
-136
-59
-43
-137
-58
-41
-137
-60
-42
-139
-60
-43
-139
-60
-43
-142
-61
-42
-143
-60
-42
-150
-63
-46
-152
-60
-45
-155
-59
-43
-158
-56
-42
-162
-56
-43
-167
-56
-45
-170
-58
-46
-175
-57
-47
-185
-57
-46
-190
-57
-48
-193
-59
-48
-196
-62
-51
-197
-63
-51
-197
-65
-52
-195
-65
-51
-193
-65
-52
-182
-59
-44
-178
-58
-44
-170
-56
-45
-163
-55
-43
-158
-54
-43
-155
-54
-44
-152
-55
-46
-148
-58
-47
-141
-59
-47
-136
-60
-44
-135
-59
-45
-132
-59
-44
-130
-58
-43
-128
-59
-43
-128
-59
-43
-127
-60
-44
-125
-59
-43
-122
-59
-42
-122
-59
-44
-119
-57
-42
-118
-56
-41
-117
-55
-40
-116
-54
-41
-118
-52
-38
-136
-59
-49
-148
-70
-60
-150
-78
-66
-142
-74
-61
-136
-72
-60
-141
-79
-66
-145
-83
-72
-146
-82
-73
-146
-79
-73
-153
-84
-79
-153
-83
-81
-154
-86
-83
-154
-93
-90
-147
-89
-85
-141
-91
-84
-141
-108
-91
-129
-125
-88
-126
-137
-94
-128
-139
-97
-108
-120
-82
-76
-88
-52
-54
-68
-35
-61
-74
-46
-76
-90
-64
-101
-113
-89
-101
-111
-87
-93
-101
-77
-80
-85
-62
-69
-73
-48
-63
-67
-40
-61
-64
-35
-58
-60
-36
-56
-57
-39
-59
-60
-46
-56
-58
-47
-57
-60
-49
-61
-65
-51
-54
-63
-44
-60
-73
-47
-80
-98
-60
-100
-122
-75
-109
-137
-78
-118
-149
-82
-116
-152
-80
-115
-151
-77
-113
-154
-78
-114
-154
-83
-112
-154
-80
-117
-162
-81
-112
-160
-76
-110
-157
-76
-112
-159
-79
-117
-164
-86
-121
-167
-92
-125
-168
-96
-124
-167
-96
-112
-153
-85
-102
-143
-77
-92
-132
-69
-92
-132
-69
-101
-140
-77
-105
-144
-81
-102
-141
-78
-95
-133
-72
-99
-136
-82
-90
-127
-76
-83
-120
-69
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-96
-86
-107
-96
-92
-107
-95
-95
-107
-96
-94
-107
-96
-92
-107
-96
-90
-107
-97
-88
-107
-97
-87
-107
-97
-85
-107
-97
-85
-107
-97
-85
-107
-97
-85
-107
-97
-85
-107
-97
-87
-107
-97
-87
-107
-97
-88
-107
-97
-87
-110
-98
-82
-109
-98
-80
-106
-98
-79
-106
-98
-79
-104
-97
-78
-101
-94
-75
-95
-90
-71
-89
-86
-69
-82
-79
-62
-77
-75
-60
-71
-72
-58
-68
-70
-56
-67
-69
-55
-66
-68
-54
-64
-68
-53
-62
-66
-51
-63
-70
-52
-60
-65
-45
-71
-73
-51
-76
-70
-48
-77
-59
-37
-110
-78
-57
-152
-100
-79
-167
-96
-78
-158
-66
-53
-197
-84
-76
-229
-100
-95
-239
-95
-94
-237
-83
-85
-237
-74
-79
-234
-68
-72
-227
-64
-65
-205
-56
-49
-199
-57
-45
-197
-55
-43
-197
-55
-43
-200
-56
-45
-202
-58
-47
-203
-59
-48
-205
-58
-48
-209
-62
-52
-209
-62
-52
-210
-62
-52
-210
-62
-52
-211
-63
-53
-211
-63
-53
-211
-63
-53
-211
-62
-55
-211
-63
-59
-209
-66
-62
-203
-68
-62
-198
-70
-61
-194
-70
-60
-195
-73
-62
-199
-77
-64
-206
-80
-68
-217
-83
-72
-221
-80
-71
-226
-77
-71
-228
-73
-69
-228
-71
-66
-226
-67
-63
-224
-65
-61
-220
-65
-61
-214
-69
-66
-202
-67
-63
-189
-62
-55
-173
-59
-48
-161
-61
-46
-155
-66
-48
-151
-70
-51
-148
-73
-54
-142
-69
-52
-140
-69
-51
-138
-66
-51
-133
-66
-49
-130
-64
-48
-125
-64
-46
-123
-64
-46
-124
-63
-45
-128
-59
-44
-131
-57
-44
-131
-58
-43
-132
-59
-44
-132
-59
-44
-133
-60
-45
-135
-59
-43
-136
-59
-43
-137
-58
-43
-140
-57
-41
-143
-55
-41
-147
-55
-42
-150
-56
-44
-156
-58
-47
-160
-59
-47
-163
-59
-48
-170
-58
-47
-173
-56
-46
-175
-57
-47
-176
-58
-46
-176
-58
-46
-176
-58
-44
-175
-57
-43
-174
-56
-42
-168
-55
-41
-165
-55
-40
-158
-54
-41
-155
-54
-42
-149
-55
-43
-146
-56
-45
-145
-57
-47
-142
-60
-48
-136
-60
-46
-133
-60
-45
-131
-59
-44
-129
-57
-42
-127
-58
-42
-126
-57
-42
-125
-58
-42
-125
-59
-43
-124
-58
-44
-122
-59
-44
-121
-59
-44
-119
-57
-42
-115
-56
-42
-113
-54
-40
-114
-55
-41
-117
-53
-41
-140
-68
-56
-146
-72
-61
-145
-75
-63
-138
-72
-58
-135
-73
-60
-139
-79
-68
-147
-84
-75
-151
-84
-76
-150
-81
-76
-155
-84
-80
-152
-81
-79
-148
-83
-79
-150
-92
-88
-144
-95
-88
-144
-104
-94
-151
-126
-106
-148
-148
-112
-133
-146
-102
-117
-130
-87
-89
-104
-63
-67
-82
-43
-63
-79
-42
-80
-96
-60
-99
-114
-81
-101
-116
-85
-92
-105
-75
-78
-88
-61
-67
-76
-49
-63
-69
-43
-62
-66
-41
-61
-65
-40
-59
-61
-39
-55
-56
-40
-58
-59
-45
-55
-57
-46
-57
-60
-49
-61
-65
-51
-55
-64
-45
-60
-73
-47
-79
-97
-59
-98
-120
-73
-108
-136
-77
-118
-149
-82
-117
-153
-81
-116
-152
-78
-114
-155
-79
-114
-154
-83
-111
-155
-80
-113
-160
-79
-111
-158
-77
-111
-158
-77
-115
-162
-82
-122
-168
-93
-124
-170
-97
-122
-165
-94
-117
-160
-91
-99
-140
-74
-94
-135
-69
-91
-131
-68
-95
-135
-72
-103
-142
-79
-106
-145
-80
-102
-141
-76
-96
-135
-72
-98
-135
-81
-89
-126
-75
-82
-119
-68
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-96
-84
-107
-96
-90
-107
-96
-92
-107
-96
-90
-107
-97
-88
-107
-97
-87
-107
-97
-85
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-97
-85
-107
-97
-87
-107
-97
-87
-107
-97
-88
-107
-97
-87
-111
-99
-85
-110
-98
-82
-107
-98
-81
-107
-98
-81
-107
-98
-81
-104
-97
-79
-100
-93
-77
-96
-90
-74
-88
-82
-66
-82
-79
-62
-78
-75
-60
-73
-71
-56
-71
-69
-54
-68
-69
-53
-66
-67
-51
-63
-66
-49
-64
-72
-49
-65
-70
-47
-77
-71
-49
-83
-62
-43
-101
-62
-45
-148
-90
-76
-170
-96
-83
-153
-63
-52
-155
-52
-43
-179
-64
-57
-214
-89
-85
-241
-106
-103
-245
-101
-101
-235
-82
-85
-232
-73
-78
-233
-77
-80
-217
-73
-65
-211
-70
-60
-205
-64
-54
-203
-62
-52
-206
-64
-54
-210
-68
-58
-213
-71
-61
-215
-71
-62
-218
-74
-65
-218
-74
-65
-221
-74
-66
-221
-74
-66
-222
-75
-67
-222
-75
-67
-224
-75
-68
-224
-75
-69
-235
-83
-82
-232
-84
-84
-227
-83
-82
-220
-82
-79
-216
-83
-76
-216
-83
-76
-219
-85
-76
-224
-85
-78
-224
-76
-72
-225
-73
-70
-227
-69
-66
-226
-67
-64
-228
-66
-64
-226
-67
-64
-228
-69
-66
-224
-70
-68
-218
-73
-70
-203
-68
-64
-188
-61
-55
-174
-60
-50
-163
-62
-50
-153
-66
-49
-147
-68
-51
-146
-71
-52
-141
-68
-51
-138
-66
-51
-137
-65
-51
-132
-63
-48
-130
-62
-49
-128
-62
-48
-125
-62
-47
-125
-62
-47
-127
-59
-46
-128
-58
-46
-128
-58
-46
-128
-58
-46
-128
-61
-45
-129
-60
-45
-129
-60
-45
-131
-59
-45
-130
-57
-42
-132
-56
-42
-134
-56
-43
-138
-56
-42
-140
-57
-43
-144
-58
-45
-146
-58
-46
-148
-58
-47
-155
-59
-47
-158
-57
-45
-159
-57
-45
-160
-58
-44
-161
-57
-44
-162
-56
-43
-162
-56
-42
-162
-56
-42
-159
-56
-41
-156
-56
-41
-152
-56
-40
-148
-56
-41
-143
-57
-42
-140
-58
-44
-137
-58
-45
-135
-59
-45
-132
-58
-45
-130
-58
-44
-129
-57
-43
-128
-56
-42
-125
-56
-41
-125
-55
-43
-124
-56
-43
-123
-57
-43
-122
-56
-44
-121
-57
-45
-120
-58
-45
-118
-56
-43
-113
-53
-42
-111
-53
-41
-113
-55
-43
-116
-57
-43
-140
-72
-59
-141
-73
-60
-137
-73
-61
-132
-73
-59
-133
-75
-63
-140
-82
-70
-147
-87
-77
-152
-88
-79
-152
-81
-77
-156
-85
-81
-152
-82
-80
-147
-86
-81
-146
-96
-89
-136
-98
-87
-131
-103
-91
-134
-122
-100
-110
-114
-81
-90
-105
-64
-74
-89
-48
-65
-82
-40
-73
-90
-48
-87
-105
-63
-100
-118
-78
-106
-124
-86
-88
-105
-69
-76
-91
-58
-63
-76
-46
-58
-68
-41
-60
-68
-44
-62
-67
-45
-60
-65
-45
-58
-61
-44
-56
-57
-43
-58
-59
-45
-54
-56
-45
-56
-59
-48
-62
-66
-52
-55
-64
-45
-59
-72
-46
-76
-94
-56
-95
-117
-70
-105
-133
-74
-116
-147
-80
-116
-152
-80
-116
-152
-78
-114
-155
-79
-115
-155
-84
-112
-156
-81
-110
-157
-77
-109
-158
-76
-112
-161
-80
-119
-168
-89
-124
-170
-97
-122
-168
-96
-114
-157
-88
-105
-147
-81
-90
-131
-65
-92
-132
-69
-97
-136
-73
-101
-140
-77
-103
-142
-77
-103
-142
-75
-104
-141
-74
-102
-138
-76
-99
-134
-80
-89
-123
-73
-82
-116
-66
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-97
-85
-108
-98
-89
-108
-98
-89
-108
-98
-89
-108
-98
-86
-108
-98
-86
-108
-99
-82
-108
-99
-82
-108
-100
-81
-108
-100
-81
-108
-100
-81
-108
-99
-82
-108
-99
-84
-108
-98
-86
-108
-98
-88
-108
-98
-88
-108
-98
-88
-111
-99
-85
-110
-98
-82
-107
-98
-81
-108
-99
-82
-108
-99
-82
-107
-98
-81
-103
-96
-80
-100
-93
-77
-94
-87
-71
-89
-83
-67
-83
-77
-63
-77
-74
-59
-75
-72
-57
-71
-69
-54
-69
-66
-51
-64
-65
-47
-61
-71
-46
-66
-70
-45
-81
-66
-45
-98
-61
-45
-129
-69
-58
-169
-89
-82
-178
-79
-74
-155
-46
-43
-175
-60
-57
-184
-62
-59
-208
-84
-82
-242
-112
-110
-254
-118
-118
-243
-100
-104
-237
-88
-94
-242
-93
-95
-227
-85
-81
-218
-80
-70
-212
-71
-64
-208
-67
-58
-209
-68
-61
-212
-71
-62
-214
-71
-65
-214
-71
-63
-217
-72
-67
-218
-74
-66
-220
-72
-68
-221
-74
-67
-222
-74
-70
-222
-75
-68
-224
-75
-71
-224
-75
-71
-226
-72
-72
-225
-71
-73
-220
-72
-72
-217
-71
-71
-214
-72
-68
-215
-72
-68
-216
-71
-66
-219
-70
-66
-224
-66
-65
-228
-65
-66
-230
-66
-65
-232
-66
-66
-231
-67
-66
-228
-66
-64
-223
-65
-62
-219
-65
-63
-221
-73
-71
-205
-66
-63
-188
-59
-54
-175
-61
-51
-165
-63
-51
-153
-64
-48
-146
-65
-48
-144
-67
-51
-140
-64
-50
-137
-64
-49
-136
-62
-49
-134
-60
-49
-132
-60
-48
-129
-59
-49
-129
-59
-49
-128
-60
-49
-128
-60
-49
-127
-61
-49
-127
-60
-51
-127
-61
-49
-127
-61
-49
-127
-61
-47
-127
-61
-49
-127
-61
-47
-128
-60
-47
-129
-60
-45
-131
-59
-45
-131
-57
-44
-133
-57
-44
-132
-56
-42
-133
-55
-43
-133
-54
-41
-141
-57
-46
-143
-56
-46
-145
-57
-45
-148
-58
-47
-151
-59
-46
-154
-61
-46
-158
-60
-47
-159
-62
-46
-153
-57
-41
-150
-57
-40
-147
-58
-42
-144
-58
-43
-138
-59
-44
-135
-59
-43
-132
-59
-44
-130
-58
-43
-130
-58
-44
-129
-57
-43
-127
-55
-41
-126
-54
-40
-123
-53
-41
-123
-53
-41
-123
-53
-41
-122
-54
-41
-120
-54
-42
-120
-56
-44
-119
-57
-44
-115
-56
-42
-112
-52
-41
-111
-53
-41
-114
-58
-45
-118
-60
-48
-139
-77
-64
-137
-75
-60
-132
-74
-60
-130
-77
-61
-133
-81
-67
-139
-86
-72
-146
-88
-77
-151
-87
-78
-147
-78
-73
-153
-84
-79
-151
-86
-82
-149
-92
-85
-144
-101
-92
-123
-94
-80
-102
-86
-70
-96
-94
-71
-69
-79
-45
-62
-78
-41
-63
-79
-40
-74
-92
-50
-95
-114
-69
-107
-126
-81
-101
-120
-75
-88
-106
-64
-77
-95
-55
-64
-81
-45
-54
-69
-38
-55
-68
-42
-61
-70
-49
-61
-68
-52
-58
-62
-48
-55
-59
-45
-56
-58
-44
-58
-59
-45
-54
-56
-45
-56
-59
-48
-62
-66
-52
-55
-64
-45
-57
-70
-44
-73
-91
-53
-91
-113
-66
-101
-129
-70
-114
-145
-78
-115
-151
-79
-115
-151
-77
-114
-155
-79
-115
-155
-84
-112
-156
-81
-109
-156
-76
-111
-160
-79
-115
-164
-85
-120
-168
-92
-122
-168
-96
-115
-160
-91
-105
-147
-81
-96
-138
-72
-89
-129
-66
-94
-134
-71
-101
-140
-77
-103
-142
-77
-102
-141
-74
-101
-141
-71
-103
-140
-71
-104
-140
-76
-97
-132
-78
-88
-122
-72
-81
-115
-65
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-108
-98
-88
-108
-98
-86
-108
-98
-86
-108
-99
-82
-108
-99
-82
-108
-100
-79
-108
-100
-79
-108
-100
-77
-108
-100
-77
-108
-100
-77
-108
-100
-79
-108
-100
-81
-108
-99
-82
-108
-99
-84
-108
-98
-86
-108
-98
-86
-111
-99
-85
-109
-97
-83
-107
-98
-83
-108
-99
-84
-109
-100
-85
-108
-99
-84
-105
-96
-81
-102
-95
-79
-98
-91
-75
-94
-87
-71
-88
-81
-65
-82
-76
-60
-79
-73
-57
-74
-71
-54
-73
-67
-51
-65
-67
-46
-60
-70
-43
-66
-69
-42
-86
-64
-43
-122
-70
-57
-163
-80
-76
-178
-72
-72
-180
-57
-60
-183
-52
-57
-197
-67
-69
-193
-65
-64
-200
-75
-73
-222
-98
-96
-241
-113
-112
-242
-109
-112
-233
-97
-101
-228
-89
-92
-219
-81
-78
-213
-76
-68
-207
-68
-63
-205
-66
-59
-207
-68
-63
-208
-69
-62
-208
-66
-62
-205
-64
-57
-210
-67
-63
-210
-67
-61
-212
-67
-64
-213
-68
-63
-215
-67
-65
-216
-68
-64
-217
-69
-67
-218
-68
-67
-221
-65
-68
-221
-65
-68
-222
-68
-70
-221
-71
-72
-223
-73
-72
-224
-74
-73
-227
-73
-73
-229
-71
-72
-231
-65
-67
-234
-65
-68
-236
-66
-69
-236
-66
-69
-231
-65
-65
-226
-64
-62
-219
-61
-58
-214
-60
-58
-219
-69
-70
-204
-60
-60
-188
-54
-51
-177
-58
-50
-169
-62
-52
-155
-61
-49
-147
-61
-48
-145
-63
-49
-139
-60
-47
-139
-59
-48
-138
-58
-49
-137
-57
-48
-136
-56
-49
-135
-56
-51
-136
-57
-52
-133
-58
-52
-128
-60
-51
-125
-61
-51
-125
-61
-52
-125
-61
-51
-125
-61
-51
-125
-61
-49
-125
-61
-51
-124
-60
-48
-124
-60
-48
-124
-61
-46
-126
-60
-46
-126
-58
-45
-125
-57
-44
-125
-56
-41
-126
-54
-42
-126
-54
-42
-131
-57
-46
-131
-57
-46
-135
-57
-45
-137
-57
-46
-141
-57
-46
-145
-59
-46
-149
-60
-46
-150
-61
-45
-146
-57
-41
-145
-58
-41
-141
-58
-42
-138
-59
-42
-135
-59
-43
-131
-60
-42
-128
-59
-43
-126
-59
-42
-128
-56
-42
-128
-56
-44
-126
-54
-42
-125
-53
-41
-124
-52
-40
-122
-52
-40
-122
-52
-42
-121
-53
-42
-117
-50
-41
-118
-54
-44
-118
-56
-45
-114
-54
-43
-111
-51
-41
-111
-53
-42
-115
-58
-47
-120
-64
-51
-138
-80
-66
-134
-78
-63
-129
-78
-61
-130
-81
-64
-133
-86
-70
-137
-88
-73
-142
-85
-74
-145
-82
-73
-146
-79
-73
-151
-84
-78
-147
-84
-79
-145
-92
-86
-138
-102
-90
-110
-91
-74
-80
-75
-55
-69
-75
-49
-65
-78
-48
-75
-90
-57
-87
-103
-67
-96
-114
-74
-103
-121
-79
-100
-122
-76
-86
-108
-62
-71
-93
-47
-65
-86
-45
-55
-72
-36
-49
-64
-33
-54
-66
-42
-61
-70
-53
-60
-68
-57
-56
-61
-54
-55
-58
-51
-57
-59
-46
-59
-60
-46
-54
-56
-45
-57
-60
-49
-63
-67
-53
-55
-64
-45
-55
-68
-42
-70
-88
-50
-86
-108
-61
-97
-125
-66
-111
-142
-75
-113
-149
-77
-115
-151
-77
-114
-155
-79
-116
-156
-85
-113
-157
-82
-111
-158
-80
-113
-162
-81
-117
-166
-87
-118
-166
-90
-115
-161
-89
-106
-151
-82
-98
-140
-74
-91
-133
-69
-94
-134
-72
-96
-136
-73
-99
-138
-75
-101
-140
-75
-102
-141
-74
-102
-142
-72
-102
-139
-70
-101
-137
-73
-96
-131
-77
-87
-121
-71
-80
-114
-64
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-105
-96
-81
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-108
-98
-86
-108
-99
-84
-108
-99
-84
-108
-99
-82
-108
-100
-81
-108
-100
-79
-108
-100
-79
-108
-100
-77
-108
-100
-77
-108
-100
-79
-108
-100
-79
-108
-100
-81
-108
-99
-82
-108
-99
-84
-108
-99
-84
-108
-99
-84
-110
-98
-84
-109
-97
-83
-109
-97
-83
-109
-97
-83
-109
-100
-85
-108
-99
-84
-106
-97
-82
-103
-96
-80
-100
-93
-77
-96
-89
-73
-90
-83
-67
-85
-78
-62
-80
-75
-56
-77
-72
-53
-73
-68
-49
-69
-67
-46
-65
-69
-42
-71
-67
-40
-92
-65
-44
-137
-83
-71
-175
-92
-88
-169
-63
-65
-169
-49
-51
-203
-74
-78
-195
-64
-69
-189
-61
-62
-185
-59
-60
-195
-71
-71
-216
-90
-91
-229
-101
-102
-221
-88
-91
-205
-71
-72
-209
-74
-71
-207
-69
-66
-205
-66
-63
-206
-67
-62
-210
-71
-66
-210
-71
-66
-206
-67
-62
-201
-62
-55
-207
-68
-61
-209
-68
-61
-210
-68
-64
-212
-69
-65
-214
-69
-66
-217
-69
-67
-220
-67
-69
-222
-68
-70
-222
-63
-67
-223
-64
-68
-222
-66
-69
-223
-69
-69
-225
-71
-71
-224
-70
-70
-224
-66
-67
-225
-62
-63
-232
-66
-68
-234
-64
-67
-232
-62
-65
-231
-61
-62
-228
-62
-62
-228
-64
-63
-226
-67
-64
-223
-69
-67
-215
-65
-66
-200
-56
-56
-184
-52
-48
-177
-58
-52
-169
-62
-54
-155
-61
-51
-146
-60
-47
-142
-63
-50
-137
-59
-47
-136
-58
-48
-136
-58
-48
-136
-56
-49
-136
-55
-51
-138
-55
-51
-137
-56
-52
-136
-59
-53
-128
-58
-50
-126
-59
-50
-126
-59
-50
-124
-60
-50
-124
-60
-48
-124
-60
-48
-124
-60
-48
-124
-60
-48
-120
-56
-44
-121
-57
-45
-124
-58
-46
-124
-58
-46
-125
-59
-45
-125
-59
-45
-125
-57
-44
-125
-57
-44
-126
-58
-47
-127
-57
-47
-128
-55
-46
-129
-55
-44
-132
-54
-42
-133
-53
-42
-134
-55
-42
-134
-55
-40
-138
-56
-42
-136
-57
-42
-136
-59
-43
-133
-60
-45
-132
-60
-45
-128
-61
-44
-126
-60
-44
-125
-59
-43
-125
-57
-44
-125
-55
-45
-124
-54
-44
-121
-53
-42
-122
-52
-42
-120
-52
-41
-120
-52
-41
-120
-53
-44
-114
-50
-40
-117
-53
-43
-118
-56
-45
-114
-54
-43
-110
-52
-41
-110
-53
-42
-116
-59
-48
-120
-66
-54
-138
-85
-71
-132
-80
-66
-128
-79
-64
-132
-83
-68
-136
-87
-73
-140
-86
-74
-140
-82
-71
-141
-78
-71
-149
-84
-78
-148
-85
-78
-139
-82
-75
-132
-88
-77
-127
-100
-83
-101
-90
-68
-71
-75
-50
-61
-74
-44
-73
-88
-57
-90
-107
-73
-103
-120
-84
-99
-120
-81
-89
-110
-69
-83
-104
-61
-78
-99
-56
-74
-95
-52
-58
-76
-38
-48
-63
-30
-44
-57
-29
-53
-62
-41
-61
-67
-53
-60
-66
-56
-58
-60
-55
-57
-60
-53
-59
-61
-50
-59
-61
-48
-55
-57
-46
-57
-60
-49
-63
-67
-53
-56
-63
-45
-56
-66
-41
-69
-85
-49
-85
-104
-59
-97
-122
-67
-110
-138
-77
-114
-147
-78
-114
-150
-78
-114
-154
-81
-115
-157
-83
-113
-157
-82
-114
-160
-85
-117
-163
-88
-118
-164
-91
-116
-162
-90
-111
-154
-85
-102
-144
-78
-94
-136
-72
-91
-131
-68
-100
-140
-78
-97
-137
-75
-96
-135
-72
-99
-138
-73
-102
-141
-74
-103
-142
-75
-101
-138
-69
-97
-133
-69
-96
-131
-77
-87
-121
-71
-80
-114
-64
-105
-96
-81
-105
-96
-81
-105
-96
-81
-106
-97
-82
-106
-97
-82
-107
-98
-83
-107
-98
-83
-107
-98
-83
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-81
-107
-98
-81
-107
-98
-81
-107
-98
-81
-108
-99
-82
-108
-99
-82
-108
-99
-82
-108
-99
-82
-108
-99
-84
-108
-99
-84
-108
-99
-84
-110
-98
-84
-107
-93
-80
-112
-96
-81
-116
-100
-87
-114
-100
-87
-110
-98
-86
-106
-96
-84
-104
-96
-83
-104
-98
-84
-103
-97
-83
-103
-97
-81
-99
-93
-77
-91
-86
-67
-86
-81
-61
-83
-78
-56
-78
-72
-50
-71
-65
-41
-76
-70
-44
-74
-62
-36
-98
-73
-51
-145
-103
-87
-182
-120
-109
-187
-108
-101
-183
-89
-87
-185
-79
-79
-182
-66
-69
-189
-66
-69
-194
-68
-71
-200
-70
-72
-205
-72
-75
-208
-74
-75
-211
-75
-77
-211
-75
-77
-205
-69
-69
-205
-69
-69
-208
-70
-68
-211
-72
-69
-212
-70
-66
-207
-68
-61
-206
-67
-60
-207
-70
-60
-200
-68
-56
-201
-69
-57
-203
-69
-60
-207
-68
-63
-212
-67
-64
-216
-66
-67
-222
-63
-68
-222
-61
-67
-225
-66
-70
-223
-67
-68
-223
-67
-68
-224
-68
-69
-224
-68
-69
-225
-70
-68
-225
-70
-68
-227
-69
-68
-227
-67
-67
-228
-66
-64
-228
-64
-63
-227
-63
-62
-227
-63
-62
-227
-63
-61
-227
-63
-61
-224
-66
-63
-211
-66
-63
-197
-62
-58
-184
-57
-51
-170
-55
-48
-160
-57
-48
-151
-61
-50
-142
-62
-51
-134
-62
-50
-131
-63
-50
-129
-63
-51
-129
-61
-50
-129
-59
-51
-132
-57
-51
-135
-56
-51
-136
-56
-49
-136
-57
-50
-133
-59
-48
-132
-60
-46
-132
-60
-46
-129
-60
-45
-129
-59
-47
-128
-58
-46
-128
-58
-46
-128
-58
-46
-126
-58
-45
-126
-58
-45
-126
-58
-45
-126
-58
-45
-126
-58
-47
-126
-58
-47
-126
-58
-47
-126
-58
-47
-125
-57
-48
-125
-57
-48
-126
-56
-48
-126
-56
-46
-128
-55
-46
-128
-55
-46
-128
-55
-46
-126
-56
-44
-128
-56
-44
-126
-56
-44
-125
-57
-44
-124
-56
-45
-123
-57
-45
-122
-56
-44
-120
-56
-44
-120
-56
-44
-120
-56
-46
-120
-56
-46
-119
-55
-45
-118
-56
-45
-118
-54
-44
-116
-54
-43
-115
-53
-42
-113
-53
-43
-109
-49
-39
-114
-54
-44
-110
-52
-41
-109
-51
-40
-111
-54
-43
-109
-52
-41
-113
-56
-45
-127
-73
-61
-133
-83
-72
-133
-83
-74
-134
-82
-71
-136
-82
-72
-139
-80
-72
-144
-81
-74
-148
-81
-75
-149
-82
-76
-147
-84
-77
-141
-84
-75
-137
-91
-78
-130
-99
-81
-111
-95
-72
-89
-85
-58
-77
-86
-55
-79
-95
-59
-106
-126
-89
-98
-120
-81
-89
-111
-72
-85
-106
-67
-82
-103
-64
-77
-98
-59
-73
-89
-53
-67
-82
-49
-55
-68
-38
-52
-62
-35
-50
-58
-35
-54
-59
-39
-60
-62
-48
-64
-66
-53
-64
-64
-54
-60
-62
-51
-53
-56
-45
-51
-57
-45
-52
-58
-46
-55
-58
-47
-57
-61
-47
-59
-63
-46
-61
-66
-44
-60
-69
-40
-83
-95
-59
-97
-114
-70
-110
-134
-82
-115
-145
-85
-114
-149
-81
-114
-154
-83
-115
-157
-83
-114
-157
-85
-117
-158
-90
-126
-167
-101
-126
-167
-101
-112
-152
-89
-98
-138
-75
-94
-134
-71
-94
-134
-72
-94
-132
-71
-96
-134
-73
-98
-136
-75
-100
-138
-77
-102
-141
-78
-101
-140
-77
-99
-138
-75
-96
-135
-72
-94
-132
-71
-95
-130
-76
-84
-118
-68
-75
-109
-59
-105
-96
-81
-105
-96
-81
-105
-96
-81
-106
-97
-82
-106
-97
-82
-107
-98
-83
-107
-98
-83
-107
-98
-83
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-110
-98
-84
-114
-98
-83
-113
-97
-82
-114
-98
-85
-113
-99
-86
-114
-102
-90
-111
-103
-90
-109
-101
-88
-106
-100
-86
-103
-99
-87
-107
-104
-89
-111
-105
-89
-108
-103
-84
-104
-99
-79
-99
-94
-72
-91
-85
-61
-82
-76
-52
-80
-74
-48
-72
-62
-37
-81
-63
-41
-107
-80
-61
-127
-88
-71
-132
-78
-66
-136
-69
-61
-147
-68
-63
-177
-87
-86
-184
-84
-84
-187
-81
-81
-192
-80
-79
-192
-78
-77
-193
-77
-77
-194
-76
-74
-194
-76
-74
-205
-85
-84
-197
-73
-71
-192
-62
-62
-195
-61
-58
-205
-67
-64
-209
-70
-65
-205
-66
-59
-199
-62
-52
-202
-68
-57
-202
-68
-57
-204
-70
-61
-208
-69
-62
-214
-69
-66
-219
-66
-68
-223
-64
-69
-224
-63
-69
-223
-67
-70
-223
-67
-68
-223
-67
-68
-223
-69
-69
-224
-69
-67
-224
-70
-68
-225
-70
-68
-225
-70
-68
-224
-69
-65
-225
-67
-64
-224
-66
-63
-224
-65
-62
-226
-64
-61
-226
-64
-61
-226
-64
-61
-224
-66
-63
-213
-68
-63
-200
-67
-60
-186
-62
-54
-172
-58
-48
-160
-57
-48
-148
-58
-47
-138
-60
-48
-130
-60
-48
-128
-65
-50
-126
-64
-51
-126
-62
-52
-127
-60
-51
-131
-58
-51
-134
-57
-49
-136
-56
-49
-137
-57
-48
-135
-59
-46
-133
-60
-45
-132
-59
-44
-132
-59
-44
-131
-59
-45
-130
-58
-44
-130
-58
-44
-130
-58
-44
-127
-57
-45
-127
-57
-45
-127
-57
-45
-127
-57
-45
-126
-58
-47
-126
-58
-47
-126
-58
-47
-126
-58
-47
-125
-57
-48
-125
-57
-48
-125
-57
-48
-125
-57
-48
-125
-57
-48
-125
-57
-48
-124
-57
-48
-124
-57
-48
-124
-57
-48
-122
-58
-48
-122
-58
-48
-121
-57
-47
-121
-57
-47
-121
-57
-47
-119
-57
-46
-119
-57
-46
-119
-56
-47
-119
-56
-47
-116
-56
-46
-115
-55
-45
-114
-54
-44
-114
-54
-44
-112
-54
-43
-112
-54
-43
-107
-49
-38
-113
-55
-44
-109
-52
-41
-108
-51
-40
-111
-54
-43
-108
-51
-40
-112
-55
-44
-126
-72
-62
-132
-82
-73
-133
-83
-76
-136
-81
-74
-139
-80
-74
-144
-81
-76
-148
-80
-77
-149
-81
-78
-148
-83
-79
-138
-79
-71
-133
-83
-72
-128
-91
-75
-123
-101
-80
-115
-105
-80
-104
-107
-76
-102
-113
-81
-103
-120
-84
-94
-116
-77
-88
-110
-71
-80
-102
-63
-76
-97
-58
-75
-95
-58
-75
-92
-58
-71
-86
-55
-67
-80
-52
-60
-70
-45
-56
-64
-41
-54
-59
-39
-55
-58
-41
-60
-61
-47
-63
-64
-50
-62
-62
-50
-59
-61
-48
-52
-58
-48
-51
-59
-48
-53
-59
-49
-54
-60
-48
-58
-60
-47
-60
-63
-46
-62
-65
-44
-62
-68
-42
-81
-91
-57
-94
-109
-68
-107
-129
-82
-112
-140
-82
-112
-147
-83
-113
-153
-82
-115
-157
-83
-115
-158
-86
-120
-159
-94
-124
-162
-101
-120
-158
-97
-107
-145
-84
-96
-134
-73
-93
-131
-70
-93
-131
-70
-92
-130
-69
-96
-134
-73
-97
-135
-74
-99
-137
-76
-101
-139
-78
-100
-138
-77
-98
-136
-75
-96
-134
-73
-94
-132
-73
-93
-127
-76
-82
-116
-66
-73
-107
-57
-105
-96
-81
-105
-96
-81
-105
-96
-81
-106
-97
-82
-106
-97
-82
-107
-98
-83
-107
-98
-83
-107
-98
-83
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-110
-98
-84
-113
-100
-84
-111
-95
-80
-109
-93
-80
-109
-95
-82
-113
-101
-89
-111
-103
-92
-108
-100
-89
-104
-98
-86
-102
-98
-87
-112
-108
-96
-123
-120
-105
-126
-123
-106
-127
-121
-105
-122
-117
-98
-112
-105
-86
-101
-96
-74
-84
-84
-60
-70
-70
-46
-67
-62
-40
-77
-66
-46
-83
-64
-47
-85
-56
-40
-93
-55
-42
-108
-61
-51
-110
-55
-48
-117
-57
-49
-126
-59
-53
-135
-64
-58
-146
-73
-66
-155
-80
-74
-165
-88
-80
-171
-91
-82
-185
-94
-89
-183
-84
-78
-181
-72
-69
-186
-67
-63
-198
-68
-66
-206
-71
-67
-210
-68
-64
-207
-64
-58
-208
-65
-59
-209
-66
-60
-211
-68
-62
-213
-70
-64
-215
-70
-67
-219
-69
-70
-222
-68
-70
-222
-68
-70
-222
-68
-68
-222
-68
-68
-222
-68
-68
-221
-69
-68
-223
-69
-69
-222
-70
-69
-223
-69
-67
-223
-69
-67
-222
-68
-66
-222
-68
-66
-221
-68
-63
-220
-67
-62
-221
-66
-61
-221
-66
-61
-221
-66
-61
-220
-67
-62
-214
-69
-64
-206
-69
-63
-195
-66
-60
-179
-62
-53
-162
-58
-49
-148
-56
-45
-136
-57
-44
-131
-59
-45
-130
-64
-50
-127
-64
-49
-126
-62
-50
-127
-61
-49
-131
-58
-49
-134
-57
-49
-135
-56
-49
-136
-58
-48
-135
-59
-46
-132
-59
-44
-132
-59
-44
-132
-59
-44
-130
-58
-44
-130
-58
-44
-128
-58
-46
-128
-58
-46
-127
-57
-45
-127
-57
-45
-126
-58
-47
-126
-58
-47
-126
-58
-47
-126
-58
-47
-126
-58
-47
-126
-58
-47
-125
-57
-48
-125
-57
-48
-125
-57
-48
-125
-57
-48
-124
-57
-48
-123
-56
-47
-123
-56
-47
-123
-56
-47
-123
-59
-49
-123
-59
-49
-122
-58
-48
-121
-59
-48
-120
-58
-47
-120
-58
-47
-120
-58
-47
-120
-58
-47
-116
-56
-46
-116
-56
-46
-115
-55
-45
-115
-55
-45
-114
-54
-44
-113
-53
-43
-111
-53
-42
-111
-53
-42
-106
-49
-38
-111
-54
-43
-109
-52
-41
-107
-50
-39
-108
-54
-42
-105
-51
-39
-109
-55
-43
-125
-71
-61
-135
-80
-73
-135
-80
-73
-139
-80
-74
-142
-81
-76
-145
-82
-77
-146
-83
-78
-148
-85
-80
-145
-86
-80
-140
-87
-79
-135
-91
-80
-126
-94
-79
-116
-98
-78
-111
-105
-81
-111
-114
-85
-108
-119
-89
-102
-119
-85
-81
-101
-66
-75
-95
-58
-69
-89
-54
-68
-85
-51
-69
-86
-54
-71
-86
-57
-71
-84
-56
-69
-82
-56
-63
-73
-48
-60
-68
-45
-57
-62
-42
-55
-59
-42
-58
-60
-46
-60
-62
-48
-59
-61
-47
-57
-59
-46
-54
-60
-50
-53
-61
-50
-54
-60
-50
-54
-60
-48
-58
-60
-47
-60
-62
-48
-61
-64
-45
-61
-67
-41
-77
-87
-53
-90
-105
-64
-102
-124
-77
-108
-136
-78
-110
-145
-81
-113
-153
-82
-117
-159
-85
-116
-159
-87
-122
-161
-96
-119
-157
-96
-110
-148
-87
-99
-137
-76
-92
-130
-69
-92
-130
-69
-92
-130
-69
-90
-128
-67
-95
-133
-72
-97
-135
-74
-98
-136
-75
-100
-138
-77
-99
-137
-76
-97
-135
-74
-95
-133
-72
-93
-131
-72
-91
-125
-74
-80
-113
-66
-70
-103
-56
-105
-96
-81
-105
-96
-81
-105
-96
-81
-106
-97
-82
-106
-97
-82
-107
-98
-83
-107
-98
-83
-107
-98
-83
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-106
-97
-82
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-110
-98
-84
-114
-100
-87
-111
-97
-84
-109
-95
-82
-107
-95
-83
-107
-97
-87
-108
-99
-90
-108
-101
-91
-106
-102
-93
-106
-102
-93
-120
-116
-105
-136
-132
-120
-145
-141
-129
-149
-143
-129
-146
-140
-126
-137
-130
-114
-125
-122
-103
-96
-99
-78
-79
-84
-62
-68
-71
-50
-70
-69
-49
-72
-67
-48
-70
-61
-44
-76
-60
-44
-86
-67
-52
-80
-57
-43
-82
-54
-42
-86
-52
-42
-89
-53
-41
-92
-54
-43
-97
-57
-47
-101
-61
-49
-109
-61
-49
-136
-76
-66
-157
-83
-74
-173
-86
-79
-181
-79
-75
-188
-70
-68
-196
-66
-66
-208
-68
-67
-216
-70
-70
-212
-64
-62
-213
-65
-63
-214
-66
-62
-216
-68
-64
-217
-69
-67
-219
-69
-68
-219
-69
-68
-221
-69
-68
-222
-68
-68
-221
-69
-68
-221
-69
-68
-221
-69
-68
-221
-69
-68
-221
-69
-68
-221
-69
-66
-220
-71
-67
-219
-70
-66
-218
-69
-65
-217
-68
-62
-217
-68
-62
-218
-67
-60
-218
-67
-60
-219
-68
-61
-217
-68
-62
-214
-67
-60
-211
-70
-63
-201
-70
-62
-186
-65
-56
-167
-59
-49
-152
-56
-44
-140
-57
-43
-133
-60
-45
-131
-64
-48
-127
-64
-49
-126
-63
-48
-127
-61
-47
-131
-58
-49
-132
-58
-47
-135
-57
-47
-136
-58
-46
-132
-58
-45
-132
-59
-44
-132
-59
-44
-131
-58
-43
-130
-58
-44
-130
-58
-44
-127
-57
-45
-127
-57
-45
-127
-57
-45
-127
-57
-45
-126
-58
-47
-126
-58
-47
-126
-58
-47
-126
-58
-47
-126
-58
-47
-126
-58
-47
-125
-57
-48
-124
-57
-48
-125
-57
-48
-123
-56
-47
-123
-56
-47
-123
-56
-47
-123
-56
-47
-120
-56
-46
-123
-59
-49
-121
-59
-48
-121
-59
-48
-121
-59
-48
-120
-58
-47
-120
-58
-47
-120
-58
-47
-118
-58
-47
-115
-55
-45
-115
-55
-45
-115
-55
-45
-114
-54
-44
-113
-53
-43
-111
-53
-42
-111
-53
-42
-109
-52
-41
-106
-49
-38
-111
-54
-43
-108
-51
-40
-104
-50
-38
-107
-53
-41
-104
-50
-38
-108
-54
-42
-124
-70
-60
-138
-79
-71
-140
-79
-74
-141
-80
-75
-143
-82
-77
-144
-83
-78
-145
-86
-80
-144
-87
-80
-140
-90
-81
-137
-93
-82
-133
-97
-85
-121
-95
-80
-105
-90
-71
-100
-95
-73
-100
-104
-79
-92
-102
-75
-78
-93
-64
-69
-85
-56
-65
-81
-52
-61
-77
-48
-60
-75
-46
-63
-77
-51
-67
-81
-55
-70
-82
-58
-71
-83
-59
-66
-76
-52
-62
-71
-50
-58
-65
-47
-57
-61
-44
-57
-61
-46
-57
-61
-46
-56
-60
-45
-55
-59
-45
-55
-61
-51
-54
-61
-53
-54
-59
-52
-54
-60
-50
-58
-60
-49
-59
-61
-47
-60
-63
-44
-60
-65
-42
-74
-83
-52
-86
-101
-62
-98
-120
-73
-106
-134
-76
-110
-145
-81
-115
-155
-84
-119
-161
-87
-120
-162
-90
-123
-162
-97
-114
-152
-91
-101
-139
-78
-92
-130
-69
-90
-128
-67
-92
-130
-69
-92
-130
-69
-90
-128
-67
-95
-133
-72
-96
-134
-73
-97
-135
-74
-98
-136
-75
-97
-135
-74
-96
-134
-73
-94
-132
-71
-93
-131
-74
-90
-124
-74
-78
-111
-64
-69
-102
-55
-104
-97
-81
-104
-97
-81
-104
-97
-81
-105
-98
-82
-105
-98
-82
-106
-99
-83
-106
-99
-83
-106
-99
-83
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-114
-102
-88
-116
-104
-92
-115
-103
-91
-109
-99
-89
-106
-97
-88
-108
-101
-93
-115
-110
-104
-122
-119
-112
-129
-126
-119
-144
-141
-134
-160
-157
-148
-168
-165
-156
-171
-167
-156
-168
-164
-153
-163
-157
-145
-153
-150
-135
-122
-123
-107
-99
-102
-83
-79
-82
-63
-71
-74
-55
-69
-72
-53
-66
-69
-50
-66
-69
-50
-69
-72
-53
-75
-76
-60
-74
-72
-57
-71
-68
-53
-68
-62
-48
-65
-57
-44
-65
-55
-43
-64
-54
-42
-70
-52
-40
-85
-53
-42
-113
-66
-56
-142
-79
-72
-160
-79
-75
-175
-73
-71
-191
-71
-73
-204
-69
-73
-211
-66
-69
-213
-64
-66
-215
-65
-66
-216
-66
-65
-217
-67
-66
-218
-69
-65
-218
-69
-65
-218
-69
-65
-218
-69
-65
-221
-69
-68
-221
-68
-70
-221
-68
-70
-219
-69
-70
-219
-69
-68
-219
-69
-68
-219
-69
-68
-217
-69
-67
-218
-70
-66
-217
-69
-65
-214
-70
-62
-213
-69
-61
-213
-69
-61
-213
-69
-61
-213
-69
-61
-214
-70
-62
-212
-65
-58
-211
-67
-59
-206
-69
-61
-193
-66
-57
-174
-62
-51
-158
-57
-45
-145
-59
-46
-138
-60
-47
-132
-63
-48
-129
-63
-47
-128
-62
-46
-128
-61
-45
-129
-59
-47
-132
-58
-45
-134
-58
-45
-135
-59
-46
-132
-58
-45
-131
-59
-45
-130
-58
-44
-130
-58
-44
-130
-58
-44
-129
-57
-43
-127
-57
-45
-127
-57
-45
-126
-58
-47
-126
-58
-47
-126
-58
-47
-126
-58
-47
-125
-58
-49
-125
-58
-49
-125
-58
-49
-125
-58
-49
-124
-57
-49
-122
-58
-49
-124
-57
-49
-121
-57
-48
-121
-57
-48
-120
-56
-47
-120
-56
-47
-118
-55
-46
-121
-58
-49
-121
-58
-49
-120
-57
-48
-118
-58
-48
-118
-58
-48
-117
-57
-47
-117
-57
-47
-116
-58
-47
-114
-55
-47
-113
-54
-46
-113
-54
-46
-112
-53
-45
-111
-52
-44
-110
-51
-43
-110
-51
-43
-109
-52
-43
-106
-49
-40
-109
-55
-45
-106
-52
-42
-104
-50
-40
-106
-52
-42
-102
-50
-39
-106
-54
-43
-125
-68
-59
-141
-78
-71
-143
-78
-72
-144
-81
-74
-144
-84
-76
-144
-85
-79
-142
-87
-80
-138
-89
-82
-131
-91
-81
-123
-89
-77
-118
-92
-79
-107
-90
-74
-93
-85
-66
-89
-88
-68
-89
-94
-72
-79
-89
-65
-63
-75
-51
-58
-72
-47
-55
-69
-46
-52
-66
-43
-53
-65
-43
-56
-68
-46
-61
-73
-51
-67
-76
-55
-69
-78
-57
-66
-75
-54
-63
-72
-53
-60
-69
-50
-58
-65
-47
-56
-63
-47
-55
-62
-46
-53
-60
-44
-52
-58
-44
-53
-60
-52
-53
-60
-53
-54
-59
-53
-54
-59
-52
-57
-59
-48
-58
-60
-47
-59
-62
-45
-59
-64
-41
-71
-80
-49
-82
-97
-58
-96
-118
-71
-105
-133
-75
-111
-146
-82
-117
-157
-86
-121
-163
-89
-121
-163
-91
-120
-159
-96
-110
-145
-87
-96
-131
-73
-90
-125
-67
-91
-126
-68
-94
-129
-71
-94
-129
-71
-93
-128
-70
-96
-131
-73
-97
-132
-74
-98
-133
-75
-98
-133
-75
-97
-132
-74
-96
-131
-73
-95
-130
-72
-94
-129
-73
-87
-124
-73
-76
-112
-66
-66
-102
-56
-104
-97
-81
-104
-97
-81
-104
-97
-81
-105
-98
-82
-105
-98
-82
-106
-99
-83
-106
-99
-83
-106
-99
-83
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-107
-97
-85
-110
-100
-90
-112
-102
-92
-108
-99
-90
-107
-100
-92
-114
-109
-103
-132
-129
-124
-145
-144
-140
-167
-163
-160
-181
-177
-174
-196
-193
-188
-201
-198
-193
-201
-196
-190
-197
-192
-186
-192
-185
-177
-185
-178
-168
-164
-156
-143
-136
-130
-114
-102
-99
-84
-80
-81
-63
-70
-73
-56
-62
-69
-51
-59
-68
-49
-58
-70
-50
-56
-69
-51
-56
-69
-51
-56
-67
-50
-58
-66
-51
-60
-66
-52
-64
-67
-56
-67
-69
-58
-71
-69
-57
-64
-52
-40
-83
-56
-47
-104
-61
-54
-129
-68
-65
-163
-79
-79
-192
-87
-91
-204
-81
-86
-202
-67
-73
-211
-71
-74
-214
-70
-70
-216
-70
-70
-218
-70
-68
-219
-70
-66
-219
-70
-66
-220
-68
-63
-220
-68
-65
-221
-69
-68
-221
-68
-70
-219
-69
-70
-219
-69
-70
-218
-68
-67
-218
-68
-67
-218
-68
-67
-217
-69
-67
-217
-69
-65
-215
-70
-65
-214
-69
-64
-212
-69
-61
-211
-68
-60
-210
-69
-60
-211
-70
-61
-212
-69
-61
-212
-63
-56
-213
-64
-57
-208
-67
-58
-198
-67
-57
-182
-65
-55
-165
-61
-48
-150
-61
-47
-140
-61
-46
-134
-62
-47
-130
-63
-47
-129
-62
-46
-128
-61
-45
-129
-60
-45
-131
-59
-45
-132
-58
-45
-133
-59
-46
-130
-58
-44
-130
-58
-44
-130
-58
-44
-130
-58
-44
-129
-57
-43
-127
-58
-43
-127
-57
-45
-126
-56
-44
-126
-58
-47
-126
-58
-47
-126
-58
-47
-126
-58
-47
-125
-58
-49
-125
-58
-49
-125
-58
-49
-125
-58
-49
-122
-58
-49
-122
-58
-49
-121
-57
-48
-121
-57
-48
-120
-56
-47
-118
-55
-46
-118
-55
-46
-116
-56
-46
-119
-56
-47
-117
-57
-47
-117
-57
-47
-115
-57
-46
-116
-56
-46
-115
-57
-46
-114
-56
-45
-114
-56
-45
-113
-54
-46
-113
-54
-46
-112
-53
-45
-111
-52
-44
-110
-51
-43
-109
-52
-43
-108
-51
-42
-106
-52
-42
-104
-50
-40
-108
-54
-44
-105
-51
-41
-102
-50
-39
-104
-52
-41
-101
-49
-38
-105
-53
-42
-123
-66
-57
-142
-77
-71
-146
-77
-72
-145
-80
-74
-143
-84
-76
-141
-86
-79
-135
-88
-78
-129
-89
-79
-124
-92
-81
-115
-92
-78
-107
-91
-76
-96
-87
-70
-86
-83
-66
-80
-83
-66
-74
-81
-63
-64
-73
-54
-52
-64
-44
-51
-60
-43
-50
-59
-42
-48
-57
-40
-48
-57
-40
-50
-59
-42
-53
-62
-45
-57
-66
-49
-60
-69
-52
-63
-72
-55
-63
-72
-53
-62
-71
-52
-58
-70
-50
-58
-67
-50
-53
-64
-47
-51
-62
-45
-49
-60
-44
-51
-58
-51
-51
-57
-53
-52
-57
-53
-52
-57
-50
-56
-57
-49
-57
-59
-46
-59
-62
-45
-59
-64
-42
-67
-76
-47
-79
-94
-55
-93
-115
-68
-105
-132
-77
-112
-147
-83
-119
-159
-89
-121
-163
-89
-119
-161
-89
-113
-152
-89
-102
-137
-79
-90
-125
-67
-88
-123
-65
-92
-127
-69
-93
-128
-70
-93
-128
-70
-94
-129
-71
-96
-131
-73
-96
-131
-73
-96
-131
-73
-96
-131
-73
-96
-131
-73
-95
-130
-72
-94
-129
-71
-93
-128
-74
-85
-121
-73
-74
-110
-64
-65
-101
-57
-104
-97
-81
-104
-97
-81
-104
-97
-81
-105
-98
-82
-105
-98
-82
-106
-99
-83
-106
-99
-83
-106
-99
-83
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-98
-86
-106
-96
-86
-106
-97
-88
-107
-100
-90
-107
-103
-94
-117
-112
-106
-136
-133
-128
-159
-158
-154
-176
-176
-174
-195
-194
-192
-211
-210
-208
-226
-225
-223
-231
-230
-228
-231
-227
-224
-227
-222
-218
-222
-214
-211
-217
-206
-200
-206
-188
-178
-184
-165
-151
-151
-135
-122
-121
-109
-93
-95
-89
-73
-75
-76
-58
-64
-69
-49
-59
-68
-47
-62
-74
-54
-61
-72
-55
-61
-70
-53
-59
-67
-52
-59
-62
-53
-58
-59
-51
-57
-56
-51
-58
-55
-48
-63
-60
-51
-69
-59
-50
-81
-53
-49
-99
-55
-52
-137
-71
-72
-177
-92
-95
-199
-96
-100
-202
-87
-90
-205
-81
-83
-209
-79
-79
-213
-78
-75
-216
-77
-74
-219
-74
-71
-221
-72
-68
-224
-69
-65
-223
-68
-66
-222
-68
-68
-221
-68
-70
-221
-68
-70
-220
-67
-69
-220
-67
-69
-219
-66
-68
-219
-67
-66
-217
-67
-66
-218
-68
-67
-216
-68
-64
-213
-68
-63
-212
-69
-63
-211
-68
-60
-210
-69
-60
-211
-70
-61
-212
-69
-61
-217
-64
-58
-217
-64
-58
-209
-66
-58
-200
-67
-58
-188
-67
-58
-172
-64
-52
-153
-59
-47
-140
-57
-43
-137
-61
-47
-131
-62
-46
-129
-62
-45
-128
-61
-44
-129
-60
-44
-131
-59
-44
-131
-59
-44
-132
-60
-45
-130
-58
-44
-130
-58
-44
-130
-58
-44
-129
-57
-43
-127
-57
-45
-127
-57
-45
-126
-56
-46
-125
-57
-46
-126
-58
-47
-126
-58
-47
-125
-58
-49
-125
-58
-49
-125
-58
-49
-125
-58
-49
-125
-58
-49
-125
-58
-49
-122
-58
-49
-121
-58
-49
-120
-57
-48
-120
-57
-48
-119
-56
-47
-116
-56
-46
-115
-55
-45
-114
-56
-45
-116
-56
-46
-115
-57
-46
-114
-56
-45
-113
-56
-45
-114
-56
-45
-112
-55
-44
-112
-55
-44
-112
-55
-44
-111
-54
-45
-111
-54
-45
-110
-53
-44
-110
-53
-44
-109
-52
-43
-108
-51
-42
-107
-50
-41
-105
-51
-41
-103
-49
-39
-107
-55
-44
-104
-52
-41
-101
-49
-38
-104
-52
-41
-98
-48
-37
-102
-52
-41
-122
-65
-56
-144
-77
-71
-146
-77
-72
-145
-80
-74
-142
-85
-76
-136
-88
-78
-129
-89
-79
-120
-90
-79
-114
-92
-78
-107
-94
-78
-94
-87
-71
-82
-80
-65
-75
-78
-61
-67
-74
-58
-57
-66
-49
-50
-58
-43
-48
-56
-41
-49
-55
-43
-49
-55
-45
-48
-54
-44
-47
-53
-43
-47
-53
-41
-48
-56
-43
-50
-58
-43
-52
-60
-45
-57
-68
-52
-59
-70
-53
-61
-72
-55
-60
-73
-55
-59
-70
-53
-54
-67
-49
-51
-64
-44
-49
-62
-45
-46
-56
-48
-48
-54
-50
-49
-54
-50
-50
-55
-49
-55
-56
-50
-57
-59
-48
-58
-60
-46
-58
-63
-41
-63
-72
-43
-75
-89
-53
-91
-113
-67
-104
-131
-76
-113
-147
-86
-119
-158
-91
-119
-161
-89
-115
-156
-86
-103
-141
-80
-94
-129
-73
-85
-120
-64
-87
-122
-66
-91
-126
-70
-91
-126
-70
-91
-126
-70
-93
-128
-72
-95
-130
-74
-95
-130
-74
-95
-130
-74
-95
-130
-74
-94
-129
-73
-94
-129
-73
-93
-128
-72
-93
-128
-74
-85
-118
-73
-74
-107
-64
-64
-96
-55
-104
-97
-81
-104
-97
-81
-104
-97
-81
-105
-98
-82
-105
-98
-82
-106
-99
-83
-106
-99
-83
-106
-99
-83
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-105
-98
-82
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-99
-84
-108
-98
-86
-112
-103
-94
-110
-103
-95
-108
-103
-97
-116
-113
-106
-135
-132
-127
-161
-160
-156
-188
-188
-186
-206
-208
-207
-207
-207
-207
-224
-224
-224
-242
-242
-242
-250
-248
-249
-251
-247
-246
-247
-243
-240
-241
-236
-233
-240
-226
-223
-232
-208
-198
-221
-193
-181
-193
-171
-157
-162
-145
-129
-125
-117
-98
-94
-92
-71
-75
-77
-55
-67
-72
-50
-65
-73
-50
-65
-73
-52
-64
-71
-53
-66
-68
-55
-65
-65
-55
-66
-61
-57
-67
-57
-55
-65
-57
-54
-59
-58
-53
-66
-61
-55
-71
-53
-49
-76
-45
-43
-102
-54
-54
-145
-81
-82
-181
-102
-105
-199
-109
-109
-192
-92
-92
-199
-90
-87
-206
-87
-83
-211
-84
-78
-216
-78
-75
-222
-74
-72
-225
-70
-68
-226
-68
-67
-221
-68
-70
-219
-69
-70
-219
-69
-70
-220
-67
-69
-220
-67
-69
-219
-66
-68
-219
-67
-66
-219
-67
-66
-220
-68
-67
-217
-67
-66
-215
-67
-63
-212
-67
-62
-212
-67
-62
-211
-68
-60
-210
-69
-60
-213
-69
-61
-221
-66
-61
-219
-65
-57
-210
-66
-58
-202
-68
-59
-191
-69
-58
-176
-65
-54
-156
-58
-45
-139
-53
-38
-138
-60
-47
-133
-61
-46
-130
-61
-45
-128
-61
-44
-129
-60
-44
-129
-60
-44
-131
-60
-42
-132
-60
-45
-130
-58
-44
-130
-58
-44
-130
-58
-44
-127
-58
-43
-127
-57
-45
-126
-56
-44
-125
-57
-46
-125
-57
-46
-126
-58
-47
-126
-58
-47
-125
-58
-49
-125
-58
-49
-125
-58
-49
-125
-58
-49
-125
-58
-49
-123
-59
-49
-121
-58
-49
-119
-59
-49
-120
-57
-48
-117
-57
-47
-116
-56
-46
-115
-57
-46
-114
-56
-45
-113
-55
-44
-114
-56
-45
-113
-56
-45
-112
-55
-44
-110
-56
-44
-112
-55
-44
-109
-55
-43
-111
-54
-43
-111
-54
-43
-111
-54
-45
-111
-54
-45
-110
-53
-44
-109
-52
-43
-108
-51
-42
-106
-52
-42
-105
-51
-41
-104
-52
-41
-102
-50
-39
-107
-55
-44
-104
-52
-41
-99
-49
-38
-101
-51
-40
-98
-48
-37
-101
-51
-40
-120
-66
-56
-142
-77
-71
-146
-79
-73
-142
-82
-74
-138
-85
-77
-131
-88
-79
-122
-90
-79
-113
-91
-77
-104
-92
-76
-90
-84
-68
-73
-74
-58
-63
-67
-52
-62
-68
-54
-57
-65
-50
-48
-56
-43
-47
-55
-42
-54
-60
-50
-52
-55
-48
-53
-56
-49
-53
-55
-50
-52
-55
-48
-50
-53
-46
-48
-54
-44
-48
-56
-45
-49
-57
-44
-54
-65
-51
-58
-69
-53
-61
-74
-57
-62
-75
-57
-60
-73
-55
-55
-70
-51
-50
-65
-44
-49
-62
-45
-44
-54
-46
-46
-52
-48
-48
-53
-49
-49
-54
-48
-54
-55
-49
-56
-58
-47
-58
-60
-46
-58
-63
-43
-60
-69
-42
-73
-87
-52
-89
-111
-65
-103
-130
-77
-112
-146
-86
-118
-157
-92
-117
-158
-88
-112
-153
-85
-96
-134
-73
-88
-123
-67
-83
-118
-62
-87
-122
-66
-91
-126
-70
-89
-124
-68
-89
-124
-68
-92
-127
-71
-95
-130
-74
-95
-130
-74
-94
-129
-73
-94
-129
-73
-94
-129
-73
-93
-128
-72
-93
-128
-72
-93
-127
-76
-83
-116
-73
-72
-104
-65
-63
-93
-55
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-106
-99
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-108
-99
-84
-108
-99
-84
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-108
-100
-87
-105
-98
-90
-103
-100
-93
-118
-115
-110
-147
-146
-142
-175
-175
-173
-196
-198
-197
-218
-220
-219
-234
-238
-239
-243
-244
-246
-246
-247
-249
-252
-252
-254
-255
-255
-255
-255
-255
-253
-255
-251
-250
-252
-247
-244
-253
-242
-236
-247
-225
-212
-242
-216
-199
-224
-202
-181
-198
-182
-159
-170
-160
-135
-136
-132
-105
-98
-98
-70
-69
-72
-45
-68
-72
-47
-67
-71
-48
-70
-69
-49
-71
-68
-53
-70
-60
-51
-67
-54
-48
-70
-52
-50
-73
-57
-57
-65
-60
-57
-66
-61
-58
-70
-56
-55
-75
-54
-53
-101
-69
-70
-147
-105
-106
-198
-147
-146
-233
-172
-169
-211
-140
-136
-199
-119
-112
-191
-96
-90
-195
-86
-81
-210
-82
-79
-219
-77
-76
-225
-71
-73
-225
-69
-72
-220
-70
-71
-220
-74
-75
-217
-68
-70
-210
-60
-62
-215
-62
-64
-225
-72
-74
-225
-71
-73
-216
-62
-64
-218
-64
-64
-218
-64
-64
-217
-65
-64
-215
-66
-62
-215
-66
-62
-212
-64
-60
-209
-64
-59
-211
-64
-57
-222
-67
-62
-219
-65
-57
-211
-64
-57
-202
-65
-57
-190
-66
-56
-176
-64
-53
-159
-58
-46
-144
-56
-42
-140
-61
-48
-135
-62
-47
-131
-62
-46
-129
-62
-45
-128
-61
-44
-127
-60
-43
-129
-61
-42
-129
-60
-44
-127
-58
-43
-127
-57
-45
-127
-57
-45
-126
-56
-44
-126
-56
-46
-124
-56
-45
-124
-56
-45
-124
-56
-45
-124
-57
-48
-124
-57
-48
-124
-57
-48
-124
-57
-48
-122
-58
-49
-122
-58
-49
-122
-58
-49
-122
-58
-49
-121
-61
-53
-119
-60
-52
-119
-59
-51
-117
-58
-50
-116
-57
-49
-113
-56
-47
-112
-55
-46
-112
-55
-46
-111
-54
-45
-109
-55
-45
-109
-55
-45
-108
-56
-45
-109
-55
-45
-108
-56
-45
-109
-55
-45
-109
-55
-45
-105
-50
-43
-109
-54
-47
-112
-57
-50
-111
-56
-49
-107
-52
-45
-103
-50
-42
-103
-50
-42
-104
-51
-43
-101
-48
-40
-105
-55
-46
-100
-50
-41
-93
-45
-35
-96
-48
-38
-95
-47
-37
-98
-50
-40
-115
-62
-54
-140
-79
-74
-143
-80
-75
-136
-81
-74
-129
-82
-74
-125
-89
-77
-118
-95
-81
-102
-89
-73
-84
-78
-62
-68
-69
-53
-62
-69
-53
-58
-67
-50
-53
-64
-48
-52
-60
-47
-51
-59
-48
-52
-58
-48
-52
-58
-48
-54
-56
-51
-55
-56
-51
-54
-54
-52
-52
-54
-49
-51
-53
-48
-49
-54
-47
-47
-54
-46
-46
-54
-43
-46
-57
-43
-50
-61
-45
-54
-67
-50
-58
-71
-54
-58
-73
-54
-56
-71
-52
-52
-67
-46
-49
-63
-46
-42
-52
-43
-44
-50
-46
-45
-50
-46
-46
-51
-45
-52
-53
-47
-55
-57
-46
-58
-60
-47
-58
-63
-43
-54
-62
-38
-68
-82
-49
-87
-108
-67
-104
-130
-82
-115
-148
-93
-119
-158
-95
-114
-155
-87
-107
-148
-82
-91
-126
-68
-88
-121
-68
-84
-117
-64
-84
-117
-64
-87
-120
-67
-90
-123
-70
-91
-124
-71
-90
-123
-70
-94
-127
-74
-98
-131
-78
-98
-131
-78
-94
-127
-74
-92
-125
-72
-95
-128
-75
-96
-129
-76
-94
-126
-77
-83
-113
-75
-70
-100
-66
-61
-88
-55
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-108
-99
-84
-108
-99
-84
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-108
-100
-89
-103
-100
-93
-111
-110
-106
-134
-133
-131
-164
-164
-162
-193
-195
-194
-214
-218
-219
-234
-238
-239
-247
-251
-252
-247
-251
-254
-248
-252
-255
-252
-253
-255
-254
-254
-254
-255
-255
-253
-255
-254
-250
-255
-252
-249
-255
-250
-243
-255
-240
-224
-251
-235
-212
-237
-223
-197
-215
-205
-178
-192
-187
-157
-164
-163
-132
-130
-131
-99
-103
-106
-75
-76
-81
-51
-71
-74
-47
-69
-67
-46
-71
-66
-47
-72
-62
-50
-73
-58
-51
-76
-57
-53
-75
-60
-57
-66
-56
-55
-71
-62
-63
-81
-69
-69
-96
-80
-80
-124
-104
-103
-166
-140
-139
-207
-178
-174
-232
-197
-191
-255
-213
-207
-234
-177
-168
-201
-131
-123
-188
-99
-93
-199
-87
-85
-213
-83
-83
-219
-74
-77
-216
-67
-69
-213
-71
-70
-210
-70
-69
-215
-73
-72
-219
-75
-75
-218
-70
-70
-212
-62
-63
-214
-61
-63
-221
-67
-69
-217
-63
-63
-217
-63
-63
-218
-64
-64
-218
-64
-64
-217
-65
-62
-214
-65
-61
-212
-64
-60
-212
-63
-57
-220
-65
-60
-219
-64
-59
-211
-64
-57
-203
-66
-58
-191
-67
-59
-177
-65
-54
-160
-59
-49
-146
-56
-45
-140
-61
-48
-135
-62
-47
-131
-62
-46
-129
-62
-45
-128
-61
-44
-127
-60
-43
-129
-60
-44
-129
-60
-44
-127
-58
-43
-127
-57
-45
-127
-57
-45
-126
-56
-44
-125
-57
-46
-124
-56
-45
-124
-56
-45
-124
-56
-45
-124
-57
-48
-124
-57
-48
-124
-57
-48
-124
-57
-48
-122
-58
-49
-123
-59
-50
-123
-59
-50
-122
-59
-50
-119
-60
-52
-117
-60
-51
-117
-58
-50
-115
-58
-49
-114
-57
-48
-110
-56
-46
-111
-54
-45
-109
-55
-45
-109
-55
-45
-108
-56
-45
-108
-56
-45
-108
-56
-45
-108
-56
-45
-106
-56
-45
-108
-56
-45
-108
-56
-45
-107
-54
-46
-110
-55
-48
-111
-56
-49
-110
-57
-49
-108
-55
-47
-105
-52
-44
-103
-50
-42
-101
-51
-42
-99
-49
-40
-100
-52
-42
-95
-47
-37
-94
-46
-36
-98
-50
-40
-94
-46
-36
-96
-48
-38
-112
-62
-53
-129
-74
-69
-135
-82
-76
-135
-88
-82
-126
-88
-79
-114
-86
-75
-100
-82
-68
-81
-74
-58
-62
-63
-47
-58
-65
-49
-54
-65
-48
-53
-64
-48
-51
-62
-48
-52
-60
-49
-52
-60
-49
-53
-59
-49
-55
-58
-51
-55
-57
-52
-55
-55
-53
-55
-55
-53
-53
-55
-50
-52
-54
-49
-49
-54
-47
-47
-54
-46
-47
-55
-44
-46
-57
-43
-49
-60
-46
-52
-65
-48
-56
-69
-52
-57
-72
-53
-56
-71
-52
-52
-69
-50
-52
-66
-49
-46
-56
-47
-46
-53
-46
-46
-51
-45
-45
-50
-43
-50
-51
-43
-52
-54
-43
-56
-58
-45
-57
-61
-44
-55
-63
-40
-68
-81
-51
-87
-108
-69
-104
-130
-85
-116
-149
-96
-119
-157
-98
-112
-152
-89
-103
-143
-80
-89
-124
-68
-87
-120
-67
-84
-117
-64
-84
-117
-64
-86
-119
-66
-89
-122
-69
-89
-122
-69
-89
-122
-69
-91
-124
-71
-95
-128
-75
-95
-128
-75
-92
-125
-72
-91
-124
-71
-94
-127
-74
-94
-127
-74
-94
-123
-77
-82
-109
-74
-70
-95
-66
-59
-84
-55
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-107
-98
-83
-107
-98
-83
-107
-98
-83
-108
-99
-84
-108
-99
-84
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-110
-101
-86
-110
-101
-86
-108
-102
-90
-101
-100
-95
-121
-123
-120
-151
-153
-152
-178
-182
-183
-205
-209
-210
-228
-233
-236
-244
-249
-252
-250
-255
-255
-251
-255
-255
-252
-255
-255
-253
-254
-255
-254
-254
-254
-255
-254
-252
-255
-255
-251
-255
-255
-250
-255
-255
-244
-254
-252
-231
-250
-249
-221
-239
-240
-209
-225
-229
-196
-210
-216
-180
-188
-196
-159
-160
-168
-131
-135
-145
-108
-96
-103
-69
-81
-88
-55
-68
-71
-44
-68
-67
-46
-74
-68
-52
-76
-68
-55
-75
-65
-56
-73
-62
-58
-68
-58
-57
-84
-74
-75
-107
-95
-95
-130
-118
-118
-157
-146
-144
-192
-178
-175
-219
-206
-200
-234
-220
-211
-248
-228
-217
-255
-240
-229
-255
-224
-214
-234
-167
-159
-190
-101
-97
-177
-67
-68
-198
-72
-75
-219
-86
-89
-216
-88
-85
-207
-79
-76
-202
-70
-66
-204
-69
-66
-210
-70
-69
-214
-70
-70
-216
-68
-68
-217
-67
-68
-214
-61
-63
-216
-62
-64
-217
-63
-63
-217
-63
-63
-217
-65
-64
-214
-64
-63
-213
-65
-61
-213
-64
-58
-217
-64
-58
-217
-64
-58
-210
-66
-58
-203
-69
-60
-192
-68
-60
-178
-66
-55
-161
-60
-50
-147
-57
-46
-142
-60
-48
-137
-61
-48
-131
-62
-47
-129
-62
-46
-127
-61
-45
-126
-60
-44
-128
-61
-45
-128
-61
-45
-127
-57
-45
-127
-57
-45
-126
-58
-47
-125
-57
-46
-125
-57
-46
-124
-56
-45
-123
-56
-47
-123
-56
-47
-125
-58
-49
-125
-58
-49
-123
-59
-50
-123
-59
-50
-123
-59
-50
-123
-59
-50
-122
-59
-52
-120
-60
-52
-116
-59
-50
-113
-59
-49
-114
-57
-48
-111
-57
-47
-110
-56
-46
-108
-56
-45
-108
-54
-44
-107
-55
-44
-108
-56
-45
-106
-56
-45
-106
-56
-45
-106
-56
-45
-106
-56
-45
-105
-57
-45
-106
-56
-45
-106
-56
-45
-110
-57
-49
-109
-56
-48
-109
-56
-48
-109
-56
-48
-109
-56
-48
-105
-55
-46
-102
-52
-43
-99
-49
-40
-100
-50
-41
-97
-49
-39
-93
-45
-35
-95
-48
-38
-99
-52
-42
-92
-45
-35
-95
-48
-38
-115
-68
-60
-125
-80
-74
-129
-86
-80
-126
-89
-81
-112
-84
-73
-94
-74
-63
-79
-67
-55
-63
-60
-45
-52
-54
-40
-50
-59
-42
-48
-59
-43
-49
-60
-46
-50
-61
-47
-52
-60
-49
-52
-60
-49
-53
-59
-49
-55
-58
-51
-55
-57
-52
-55
-57
-54
-54
-56
-51
-53
-55
-50
-53
-55
-50
-50
-55
-48
-48
-55
-47
-48
-56
-45
-46
-57
-43
-48
-59
-45
-50
-63
-46
-54
-67
-50
-55
-69
-52
-56
-71
-52
-56
-71
-52
-57
-70
-53
-52
-62
-51
-51
-58
-50
-47
-52
-45
-44
-50
-40
-47
-48
-40
-49
-51
-40
-53
-55
-42
-54
-58
-41
-54
-62
-39
-68
-81
-53
-89
-109
-74
-107
-132
-90
-119
-151
-102
-119
-156
-102
-108
-147
-90
-95
-135
-75
-87
-120
-67
-87
-117
-67
-84
-114
-64
-84
-114
-64
-86
-116
-66
-88
-118
-68
-89
-119
-69
-89
-119
-69
-90
-120
-70
-93
-123
-73
-95
-125
-75
-93
-123
-73
-93
-123
-73
-95
-125
-75
-94
-124
-74
-90
-119
-75
-78
-101
-72
-65
-87
-64
-54
-76
-53
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-105
-99
-83
-106
-99
-83
-107
-98
-83
-107
-98
-83
-108
-99
-84
-108
-99
-84
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-110
-101
-86
-110
-101
-86
-110
-101
-86
-110
-101
-86
-109
-103
-91
-106
-107
-102
-131
-135
-136
-163
-167
-168
-185
-190
-193
-208
-213
-216
-229
-237
-239
-243
-251
-253
-245
-253
-255
-251
-255
-255
-251
-255
-255
-252
-255
-255
-252
-254
-251
-253
-254
-249
-254
-253
-248
-255
-254
-247
-255
-255
-243
-248
-253
-230
-244
-253
-222
-238
-247
-216
-230
-242
-206
-221
-233
-195
-206
-218
-180
-182
-193
-153
-161
-171
-134
-128
-135
-101
-102
-109
-76
-77
-81
-54
-70
-72
-48
-72
-74
-53
-75
-73
-58
-72
-68
-57
-68
-64
-55
-80
-70
-68
-106
-96
-95
-139
-129
-128
-164
-154
-153
-183
-175
-172
-203
-198
-194
-223
-218
-212
-234
-230
-221
-247
-238
-229
-255
-249
-239
-255
-246
-235
-255
-215
-207
-245
-178
-172
-227
-141
-140
-200
-100
-100
-176
-68
-66
-194
-83
-76
-200
-85
-78
-199
-82
-73
-195
-72
-65
-199
-72
-66
-211
-77
-74
-213
-74
-71
-207
-63
-62
-210
-62
-62
-212
-62
-63
-213
-63
-62
-216
-64
-63
-214
-64
-63
-214
-64
-63
-213
-65
-61
-213
-65
-61
-214
-62
-57
-213
-64
-58
-210
-67
-61
-204
-69
-63
-192
-69
-62
-178
-65
-57
-162
-61
-53
-149
-59
-50
-142
-60
-49
-137
-61
-48
-131
-62
-47
-129
-62
-46
-127
-61
-47
-126
-60
-44
-128
-61
-45
-128
-61
-45
-127
-57
-45
-127
-57
-45
-126
-58
-47
-125
-57
-46
-125
-57
-46
-124
-56
-45
-123
-56
-47
-123
-56
-47
-126
-59
-50
-126
-59
-50
-124
-60
-51
-123
-59
-50
-123
-59
-50
-123
-59
-50
-122
-59
-52
-120
-60
-52
-114
-57
-48
-111
-57
-47
-111
-57
-47
-109
-57
-46
-108
-56
-45
-107
-55
-44
-106
-54
-43
-104
-54
-43
-105
-55
-44
-105
-55
-44
-105
-55
-44
-104
-56
-44
-104
-56
-44
-104
-56
-44
-104
-56
-44
-104
-56
-44
-109
-59
-50
-108
-55
-47
-106
-53
-45
-105
-55
-46
-106
-56
-47
-106
-56
-47
-102
-52
-43
-97
-49
-39
-101
-53
-43
-97
-50
-40
-93
-46
-36
-97
-50
-40
-98
-51
-41
-89
-42
-32
-97
-50
-40
-121
-78
-69
-129
-92
-86
-118
-87
-82
-105
-78
-71
-87
-67
-58
-73
-60
-51
-64
-58
-46
-58
-59
-45
-56
-60
-46
-48
-56
-41
-47
-58
-42
-51
-59
-46
-52
-60
-47
-53
-61
-50
-53
-59
-49
-54
-57
-48
-54
-57
-48
-55
-57
-52
-54
-56
-51
-54
-56
-51
-52
-57
-50
-51
-56
-49
-51
-57
-47
-49
-57
-46
-49
-57
-46
-46
-57
-43
-47
-58
-44
-48
-61
-44
-50
-63
-46
-53
-66
-49
-55
-69
-52
-59
-72
-54
-60
-73
-56
-57
-67
-56
-55
-63
-52
-50
-56
-46
-45
-51
-39
-46
-48
-37
-47
-49
-36
-50
-52
-38
-52
-56
-39
-52
-60
-39
-69
-82
-56
-93
-112
-80
-114
-139
-100
-123
-154
-110
-119
-156
-105
-102
-141
-88
-85
-124
-69
-83
-115
-65
-84
-114
-64
-83
-113
-63
-83
-113
-63
-84
-114
-64
-85
-115
-65
-86
-116
-66
-86
-116
-66
-87
-117
-67
-91
-121
-71
-93
-123
-73
-92
-122
-72
-94
-124
-74
-95
-125
-75
-92
-122
-72
-87
-114
-73
-73
-93
-68
-61
-78
-60
-49
-66
-48
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-105
-99
-83
-106
-99
-83
-107
-98
-83
-107
-98
-83
-108
-99
-84
-108
-99
-84
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-110
-101
-86
-110
-101
-86
-111
-102
-87
-111
-102
-87
-110
-103
-93
-113
-113
-111
-135
-140
-143
-164
-169
-172
-183
-191
-194
-205
-213
-216
-227
-237
-239
-242
-252
-254
-244
-254
-255
-248
-255
-255
-250
-255
-255
-251
-255
-252
-253
-255
-250
-252
-253
-245
-250
-252
-241
-249
-249
-237
-246
-248
-234
-246
-255
-232
-243
-255
-228
-240
-253
-225
-238
-249
-217
-233
-244
-210
-222
-232
-197
-202
-210
-173
-182
-190
-153
-157
-163
-129
-125
-130
-98
-89
-93
-66
-71
-76
-53
-70
-75
-55
-70
-74
-57
-67
-71
-57
-65
-67
-56
-98
-95
-88
-133
-125
-122
-170
-162
-159
-192
-184
-181
-203
-195
-193
-213
-208
-205
-230
-225
-221
-241
-238
-233
-249
-246
-239
-250
-243
-233
-251
-237
-226
-255
-236
-227
-255
-242
-234
-255
-224
-219
-233
-165
-162
-182
-105
-99
-164
-76
-64
-178
-82
-68
-192
-90
-78
-199
-92
-82
-197
-83
-73
-190
-69
-61
-193
-64
-59
-202
-67
-64
-203
-64
-61
-206
-64
-62
-209
-63
-63
-210
-64
-64
-211
-66
-63
-211
-66
-63
-211
-66
-63
-211
-66
-61
-211
-63
-59
-210
-65
-60
-208
-69
-64
-201
-69
-64
-189
-67
-62
-175
-64
-57
-160
-62
-53
-149
-61
-51
-142
-60
-49
-137
-60
-50
-131
-61
-49
-129
-61
-48
-127
-61
-49
-126
-60
-46
-127
-61
-47
-127
-61
-47
-126
-58
-47
-126
-58
-47
-126
-58
-47
-125
-57
-46
-124
-57
-48
-123
-56
-47
-123
-56
-47
-123
-56
-47
-124
-60
-51
-124
-60
-51
-124
-60
-51
-123
-59
-50
-122
-59
-52
-121
-58
-51
-121
-58
-51
-119
-59
-51
-110
-55
-48
-109
-56
-48
-108
-55
-47
-108
-55
-47
-107
-54
-46
-104
-54
-45
-104
-54
-45
-104
-54
-45
-105
-55
-46
-104
-56
-46
-104
-56
-46
-103
-56
-46
-103
-56
-46
-103
-56
-46
-103
-56
-46
-104
-56
-46
-107
-57
-50
-104
-54
-47
-102
-52
-45
-103
-53
-46
-105
-55
-48
-104
-55
-48
-101
-52
-45
-98
-49
-42
-99
-50
-43
-98
-51
-43
-95
-48
-40
-93
-49
-40
-93
-49
-40
-86
-42
-33
-98
-54
-45
-123
-85
-76
-116
-89
-82
-97
-78
-72
-78
-63
-56
-65
-55
-46
-61
-54
-44
-59
-57
-45
-57
-59
-46
-57
-60
-49
-51
-57
-45
-51
-59
-46
-53
-59
-47
-54
-60
-48
-54
-60
-48
-55
-58
-47
-53
-56
-45
-52
-55
-46
-54
-57
-48
-52
-57
-50
-51
-56
-49
-51
-57
-47
-51
-57
-47
-50
-58
-47
-49
-57
-46
-49
-57
-44
-46
-57
-43
-46
-57
-43
-47
-58
-44
-48
-59
-45
-51
-62
-46
-54
-67
-50
-58
-69
-53
-60
-71
-55
-61
-69
-56
-58
-66
-53
-53
-59
-47
-48
-54
-40
-48
-50
-37
-47
-49
-36
-49
-51
-37
-49
-53
-36
-50
-58
-37
-71
-83
-59
-98
-117
-87
-119
-143
-107
-124
-155
-114
-113
-149
-103
-92
-130
-81
-74
-112
-61
-79
-111
-62
-81
-110
-62
-81
-110
-62
-81
-110
-62
-81
-110
-62
-81
-110
-62
-83
-112
-64
-83
-112
-64
-87
-116
-68
-91
-120
-72
-93
-122
-74
-93
-122
-74
-95
-124
-76
-95
-124
-76
-90
-119
-71
-82
-108
-69
-65
-82
-63
-54
-67
-57
-43
-56
-46
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-105
-99
-83
-106
-99
-83
-107
-98
-83
-107
-98
-83
-108
-99
-84
-108
-99
-84
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-110
-101
-86
-110
-101
-86
-111
-102
-87
-112
-103
-88
-112
-103
-88
-110
-103
-93
-108
-110
-109
-122
-130
-133
-147
-154
-160
-171
-181
-183
-196
-206
-208
-220
-230
-232
-237
-247
-249
-244
-254
-255
-245
-254
-253
-246
-255
-252
-250
-255
-250
-251
-255
-249
-251
-254
-243
-248
-250
-237
-245
-246
-232
-241
-244
-227
-244
-253
-234
-244
-253
-232
-244
-252
-229
-243
-249
-223
-242
-246
-219
-233
-236
-205
-216
-215
-185
-197
-196
-165
-177
-176
-146
-143
-142
-114
-101
-103
-79
-77
-80
-59
-71
-75
-58
-70
-77
-61
-71
-79
-66
-74
-82
-71
-122
-123
-115
-158
-155
-148
-195
-190
-184
-215
-207
-204
-222
-212
-211
-230
-220
-219
-243
-235
-233
-252
-247
-244
-243
-240
-235
-254
-251
-244
-255
-255
-246
-255
-251
-241
-255
-243
-234
-255
-237
-229
-255
-226
-218
-255
-210
-199
-212
-143
-127
-181
-100
-81
-162
-75
-58
-178
-85
-70
-190
-88
-74
-182
-71
-60
-182
-63
-55
-199
-74
-68
-199
-67
-62
-202
-67
-63
-205
-66
-63
-208
-66
-64
-208
-66
-62
-208
-66
-62
-208
-66
-62
-208
-65
-61
-210
-65
-60
-210
-67
-63
-206
-68
-65
-197
-68
-63
-184
-65
-61
-170
-61
-56
-158
-59
-53
-149
-60
-52
-142
-59
-51
-137
-60
-50
-131
-61
-51
-129
-61
-50
-127
-61
-49
-126
-60
-48
-127
-61
-49
-127
-61
-47
-126
-58
-47
-126
-58
-47
-126
-58
-47
-125
-57
-46
-124
-57
-48
-123
-56
-47
-123
-56
-47
-123
-56
-47
-124
-60
-51
-123
-59
-50
-123
-59
-50
-122
-58
-49
-121
-58
-51
-120
-57
-50
-119
-56
-49
-117
-57
-49
-110
-55
-48
-108
-55
-47
-108
-55
-47
-106
-56
-47
-105
-55
-46
-105
-55
-46
-104
-54
-45
-103
-55
-45
-103
-55
-45
-103
-55
-45
-102
-55
-45
-102
-55
-45
-102
-55
-45
-102
-55
-45
-102
-55
-45
-102
-55
-45
-104
-55
-48
-104
-54
-47
-103
-53
-46
-103
-53
-46
-103
-54
-47
-104
-55
-48
-103
-54
-47
-102
-53
-46
-97
-50
-42
-101
-54
-46
-94
-50
-41
-92
-48
-39
-96
-52
-43
-97
-53
-44
-105
-61
-52
-117
-83
-74
-88
-71
-64
-69
-62
-54
-60
-53
-47
-57
-53
-44
-59
-56
-47
-56
-58
-47
-53
-55
-44
-51
-54
-43
-54
-57
-46
-53
-59
-47
-55
-58
-47
-54
-57
-46
-54
-57
-46
-53
-56
-45
-53
-55
-44
-51
-54
-43
-50
-56
-44
-49
-57
-44
-50
-56
-46
-49
-57
-44
-49
-57
-46
-49
-57
-44
-49
-57
-44
-49
-57
-44
-46
-57
-43
-46
-57
-43
-46
-57
-43
-47
-58
-44
-48
-59
-43
-51
-62
-46
-54
-65
-49
-55
-66
-50
-60
-68
-53
-58
-67
-50
-56
-63
-47
-53
-59
-45
-52
-54
-41
-50
-52
-39
-49
-51
-37
-48
-52
-37
-48
-55
-37
-72
-84
-62
-101
-120
-92
-117
-141
-109
-116
-146
-108
-102
-137
-95
-82
-119
-75
-66
-104
-57
-75
-107
-60
-78
-107
-59
-80
-109
-61
-80
-109
-61
-78
-107
-59
-78
-107
-59
-79
-108
-60
-81
-110
-62
-86
-115
-67
-90
-119
-71
-93
-122
-74
-94
-123
-75
-95
-124
-76
-95
-124
-76
-86
-115
-67
-78
-102
-66
-59
-73
-56
-48
-59
-51
-38
-47
-42
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-105
-99
-83
-106
-99
-83
-107
-98
-83
-107
-98
-83
-108
-99
-84
-108
-99
-84
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-109
-100
-85
-110
-101
-86
-110
-101
-86
-111
-102
-87
-112
-103
-88
-113
-104
-89
-111
-104
-94
-104
-105
-107
-109
-116
-122
-133
-140
-148
-163
-172
-177
-191
-200
-205
-211
-222
-226
-229
-240
-242
-240
-252
-252
-242
-252
-251
-245
-254
-249
-248
-255
-247
-250
-255
-246
-252
-255
-242
-250
-253
-236
-248
-249
-231
-246
-247
-231
-246
-246
-234
-247
-247
-235
-250
-247
-232
-252
-246
-230
-253
-245
-226
-247
-236
-214
-231
-216
-195
-213
-198
-175
-192
-177
-154
-158
-147
-125
-117
-110
-91
-90
-87
-70
-80
-81
-67
-83
-86
-75
-91
-98
-90
-99
-109
-100
-146
-154
-141
-176
-179
-168
-210
-207
-198
-230
-223
-217
-242
-228
-227
-249
-235
-235
-255
-241
-244
-255
-248
-249
-255
-253
-251
-255
-251
-248
-249
-248
-243
-247
-247
-237
-251
-249
-237
-255
-252
-240
-255
-253
-241
-255
-249
-234
-255
-224
-203
-234
-168
-144
-183
-111
-89
-168
-87
-68
-174
-85
-69
-183
-82
-70
-185
-77
-65
-191
-74
-65
-195
-71
-63
-198
-69
-63
-202
-69
-64
-203
-68
-64
-205
-68
-62
-204
-67
-61
-203
-66
-60
-204
-65
-60
-209
-67
-63
-208
-69
-64
-204
-69
-65
-194
-67
-61
-179
-61
-57
-166
-59
-53
-156
-59
-53
-149
-60
-54
-140
-60
-51
-135
-61
-52
-133
-60
-53
-129
-61
-52
-127
-60
-51
-126
-60
-48
-127
-61
-49
-127
-61
-49
-126
-58
-47
-126
-58
-47
-126
-58
-47
-125
-57
-46
-124
-57
-48
-123
-56
-47
-123
-56
-47
-123
-56
-47
-123
-59
-50
-123
-59
-50
-121
-58
-51
-120
-57
-50
-119
-56
-49
-118
-55
-48
-118
-55
-48
-115
-55
-47
-110
-55
-48
-106
-56
-47
-106
-56
-47
-106
-56
-47
-106
-56
-47
-104
-56
-46
-104
-56
-46
-104
-56
-46
-103
-55
-45
-102
-55
-45
-102
-55
-45
-102
-55
-45
-100
-56
-45
-100
-56
-45
-100
-56
-45
-102
-55
-45
-103
-54
-47
-104
-55
-48
-105
-56
-49
-105
-56
-49
-104
-55
-48
-105
-56
-49
-106
-59
-51
-108
-61
-53
-103
-56
-48
-107
-60
-52
-98
-54
-45
-97
-53
-44
-111
-67
-58
-120
-76
-67
-116
-73
-64
-110
-77
-68
-67
-57
-48
-53
-54
-46
-52
-53
-47
-56
-57
-49
-56
-59
-50
-52
-55
-46
-49
-52
-43
-50
-53
-44
-53
-56
-45
-53
-56
-45
-53
-55
-44
-52
-54
-43
-52
-54
-43
-52
-54
-43
-52
-54
-41
-51
-55
-41
-47
-55
-40
-46
-57
-41
-48
-56
-43
-46
-57
-41
-46
-57
-43
-46
-57
-41
-48
-56
-41
-48
-56
-41
-49
-57
-42
-48
-56
-41
-48
-56
-43
-47
-55
-42
-48
-56
-43
-49
-57
-44
-51
-59
-46
-52
-60
-45
-57
-66
-49
-58
-67
-48
-59
-66
-48
-58
-65
-49
-58
-60
-46
-54
-56
-42
-50
-52
-38
-47
-51
-36
-50
-57
-39
-73
-85
-63
-99
-117
-91
-109
-132
-103
-102
-132
-98
-87
-121
-84
-73
-110
-69
-63
-100
-56
-72
-103
-59
-76
-105
-59
-78
-107
-61
-78
-107
-61
-76
-105
-59
-76
-105
-59
-77
-106
-60
-79
-108
-62
-85
-114
-68
-89
-118
-72
-91
-120
-74
-93
-122
-76
-94
-123
-77
-92
-121
-75
-81
-110
-64
-71
-95
-59
-54
-66
-52
-43
-52
-47
-34
-40
-38
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-103
-100
-83
-105
-99
-83
-106
-99
-83
-106
-99
-83
-106
-98
-85
-108
-98
-86
-108
-98
-86
-109
-99
-87
-109
-100
-85
-109
-100
-85
-109
-100
-85
-108
-101
-85
-109
-102
-86
-110
-103
-87
-111
-103
-90
-110
-104
-92
-111
-104
-94
-109
-106
-101
-107
-111
-114
-109
-116
-122
-131
-138
-144
-165
-174
-179
-195
-204
-209
-213
-223
-225
-230
-238
-241
-244
-252
-254
-244
-253
-250
-247
-253
-249
-249
-254
-247
-250
-255
-244
-252
-255
-242
-252
-255
-241
-252
-255
-238
-253
-254
-240
-251
-248
-239
-254
-250
-241
-255
-249
-239
-255
-250
-237
-255
-249
-233
-255
-242
-223
-239
-224
-203
-221
-206
-183
-193
-178
-155
-162
-151
-129
-124
-117
-98
-98
-95
-78
-88
-90
-76
-93
-99
-87
-109
-119
-110
-124
-134
-125
-165
-173
-162
-187
-193
-181
-215
-215
-207
-235
-230
-226
-250
-238
-238
-255
-244
-244
-255
-245
-247
-254
-244
-245
-253
-247
-247
-250
-249
-247
-250
-252
-247
-251
-255
-249
-250
-253
-244
-244
-247
-238
-247
-249
-238
-255
-252
-239
-255
-242
-225
-255
-242
-224
-250
-201
-184
-188
-129
-113
-157
-85
-71
-171
-85
-72
-183
-85
-74
-177
-69
-59
-192
-74
-64
-198
-71
-64
-201
-70
-62
-202
-69
-62
-202
-67
-61
-201
-66
-60
-199
-66
-59
-200
-65
-59
-207
-70
-62
-205
-71
-62
-199
-71
-62
-188
-67
-59
-173
-62
-53
-159
-58
-50
-149
-59
-51
-145
-62
-54
-138
-61
-53
-132
-62
-52
-130
-62
-53
-129
-61
-52
-127
-60
-51
-126
-60
-48
-128
-60
-49
-128
-60
-49
-126
-58
-47
-126
-58
-47
-126
-58
-49
-125
-57
-48
-124
-57
-48
-123
-56
-47
-123
-56
-47
-123
-56
-47
-122
-58
-49
-122
-58
-49
-120
-57
-50
-119
-56
-49
-118
-55
-48
-117
-54
-47
-117
-54
-47
-113
-54
-46
-109
-56
-48
-107
-57
-48
-106
-56
-47
-106
-56
-47
-105
-57
-47
-105
-57
-47
-105
-57
-47
-104
-56
-46
-103
-55
-45
-102
-55
-45
-103
-55
-45
-102
-55
-45
-102
-55
-45
-102
-55
-45
-102
-55
-45
-102
-55
-45
-102
-53
-46
-106
-56
-49
-109
-59
-52
-107
-58
-51
-106
-57
-50
-106
-58
-48
-109
-62
-52
-111
-67
-56
-108
-64
-53
-111
-68
-59
-100
-60
-50
-99
-61
-50
-122
-86
-74
-134
-100
-90
-121
-87
-77
-98
-76
-65
-62
-58
-49
-51
-56
-49
-52
-57
-50
-55
-60
-53
-52
-58
-48
-47
-53
-43
-50
-53
-44
-57
-60
-51
-51
-54
-43
-50
-53
-42
-50
-52
-41
-48
-51
-40
-49
-51
-40
-50
-53
-42
-52
-54
-43
-52
-55
-44
-46
-54
-41
-44
-55
-41
-47
-55
-42
-45
-56
-42
-47
-55
-42
-47
-55
-42
-47
-55
-42
-47
-55
-42
-49
-57
-44
-48
-56
-43
-48
-56
-45
-47
-55
-44
-47
-55
-44
-47
-55
-44
-48
-56
-45
-48
-56
-43
-55
-63
-48
-57
-66
-49
-60
-69
-52
-61
-68
-52
-59
-65
-51
-56
-60
-46
-50
-54
-39
-45
-52
-36
-50
-59
-42
-74
-86
-66
-99
-114
-91
-104
-124
-97
-93
-118
-88
-79
-109
-75
-70
-102
-65
-65
-97
-58
-72
-100
-59
-75
-104
-60
-78
-107
-63
-78
-107
-63
-75
-104
-60
-74
-103
-57
-76
-105
-61
-78
-107
-61
-84
-113
-69
-87
-116
-72
-90
-119
-75
-91
-120
-76
-93
-122
-78
-90
-118
-77
-78
-106
-65
-67
-91
-59
-50
-62
-52
-41
-47
-47
-31
-37
-37
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-106
-100
-86
-106
-100
-86
-106
-100
-88
-108
-100
-89
-108
-99
-90
-109
-101
-90
-109
-101
-88
-109
-102
-86
-103
-96
-78
-106
-101
-82
-110
-107
-88
-111
-108
-93
-104
-101
-92
-102
-101
-97
-115
-113
-114
-129
-130
-134
-137
-142
-146
-149
-157
-160
-170
-178
-181
-194
-199
-202
-215
-220
-223
-233
-237
-238
-245
-246
-248
-248
-250
-249
-252
-254
-253
-254
-254
-252
-255
-255
-250
-253
-254
-246
-250
-253
-242
-249
-252
-241
-250
-253
-242
-251
-254
-243
-249
-250
-242
-250
-250
-242
-249
-249
-237
-252
-250
-235
-254
-252
-231
-249
-247
-222
-233
-229
-202
-213
-212
-182
-186
-185
-155
-152
-152
-124
-113
-116
-89
-95
-100
-77
-98
-107
-88
-114
-125
-108
-132
-144
-130
-145
-155
-144
-180
-185
-178
-202
-204
-199
-226
-227
-222
-240
-239
-235
-247
-243
-242
-251
-247
-246
-253
-249
-248
-252
-248
-247
-255
-254
-252
-254
-254
-252
-254
-254
-252
-253
-255
-250
-254
-255
-250
-254
-255
-250
-254
-255
-250
-254
-255
-250
-251
-253
-248
-255
-253
-248
-255
-251
-246
-255
-229
-223
-215
-166
-159
-163
-96
-88
-155
-68
-61
-178
-75
-66
-193
-79
-69
-195
-71
-61
-198
-67
-57
-201
-68
-59
-205
-72
-63
-206
-73
-64
-203
-72
-64
-202
-71
-61
-198
-71
-56
-195
-72
-56
-190
-73
-56
-181
-71
-56
-166
-69
-53
-154
-66
-52
-144
-66
-53
-139
-67
-53
-133
-67
-53
-129
-67
-54
-127
-65
-52
-127
-63
-51
-128
-62
-50
-128
-60
-49
-129
-59
-49
-129
-59
-49
-127
-57
-49
-126
-58
-49
-124
-57
-49
-123
-56
-48
-122
-55
-47
-122
-55
-47
-119
-55
-46
-118
-54
-45
-119
-55
-46
-119
-55
-46
-119
-56
-47
-119
-56
-47
-118
-55
-46
-117
-54
-45
-113
-53
-43
-110
-51
-43
-108
-55
-47
-105
-56
-49
-105
-56
-49
-104
-55
-48
-104
-55
-48
-103
-54
-47
-103
-54
-47
-103
-54
-47
-102
-53
-46
-103
-54
-47
-105
-55
-48
-105
-56
-49
-104
-55
-48
-103
-54
-47
-101
-52
-45
-101
-51
-44
-104
-51
-45
-106
-53
-47
-109
-56
-48
-107
-57
-48
-106
-58
-48
-105
-59
-46
-105
-61
-48
-107
-65
-51
-103
-66
-50
-106
-73
-58
-100
-72
-58
-118
-95
-79
-126
-107
-92
-138
-120
-106
-140
-127
-111
-82
-74
-61
-55
-57
-46
-52
-58
-48
-52
-58
-48
-51
-57
-47
-51
-57
-47
-51
-57
-47
-50
-56
-46
-50
-56
-46
-49
-55
-45
-49
-55
-45
-51
-54
-45
-48
-54
-44
-50
-53
-44
-47
-53
-43
-49
-52
-43
-47
-53
-43
-47
-52
-45
-46
-53
-45
-47
-52
-45
-46
-53
-45
-47
-52
-45
-47
-52
-45
-47
-52
-45
-47
-52
-45
-48
-53
-46
-47
-52
-45
-47
-52
-45
-46
-51
-44
-46
-51
-44
-47
-52
-45
-47
-52
-45
-47
-54
-46
-49
-59
-50
-51
-61
-50
-54
-64
-53
-56
-66
-55
-57
-68
-54
-55
-66
-52
-53
-64
-48
-51
-62
-45
-52
-63
-46
-68
-81
-61
-87
-101
-78
-91
-107
-81
-80
-98
-72
-69
-88
-60
-64
-84
-56
-66
-87
-54
-73
-99
-62
-75
-101
-62
-75
-102
-61
-75
-102
-61
-74
-101
-60
-74
-101
-58
-76
-103
-62
-79
-106
-63
-85
-112
-71
-89
-116
-75
-92
-118
-79
-93
-119
-80
-93
-119
-82
-87
-113
-78
-72
-98
-63
-59
-79
-54
-37
-48
-42
-38
-43
-46
-36
-41
-44
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-106
-99
-89
-107
-100
-90
-108
-99
-92
-109
-100
-91
-109
-101
-90
-109
-102
-86
-105
-100
-81
-106
-104
-83
-109
-106
-87
-106
-107
-91
-103
-103
-95
-108
-108
-108
-126
-127
-132
-144
-147
-154
-167
-174
-180
-183
-193
-195
-208
-213
-216
-225
-230
-233
-241
-242
-244
-250
-251
-253
-255
-254
-255
-255
-254
-255
-254
-253
-251
-255
-254
-250
-255
-255
-250
-254
-255
-249
-251
-252
-244
-248
-251
-242
-246
-252
-242
-247
-253
-243
-247
-250
-241
-248
-250
-239
-248
-250
-237
-247
-250
-233
-249
-251
-229
-242
-245
-218
-223
-226
-195
-204
-208
-175
-180
-184
-151
-145
-150
-118
-107
-113
-85
-89
-97
-73
-95
-107
-85
-116
-129
-111
-140
-152
-138
-157
-167
-156
-191
-193
-188
-211
-211
-209
-231
-231
-229
-243
-243
-241
-247
-247
-245
-251
-251
-249
-252
-252
-250
-251
-251
-249
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-251
-255
-254
-241
-255
-255
-237
-251
-252
-247
-249
-248
-255
-248
-247
-255
-233
-230
-239
-190
-185
-196
-128
-119
-164
-80
-70
-176
-78
-65
-186
-76
-63
-193
-75
-63
-196
-74
-61
-194
-68
-56
-188
-61
-52
-190
-63
-54
-196
-70
-58
-196
-70
-55
-195
-74
-55
-191
-76
-58
-180
-73
-55
-166
-70
-54
-153
-67
-50
-144
-68
-54
-138
-71
-55
-130
-68
-55
-127
-67
-56
-126
-66
-55
-124
-64
-53
-126
-62
-52
-127
-60
-51
-128
-60
-49
-128
-60
-51
-125
-58
-50
-125
-58
-50
-122
-58
-49
-122
-58
-49
-121
-57
-48
-120
-56
-47
-118
-55
-46
-118
-55
-46
-117
-54
-45
-118
-55
-46
-116
-56
-46
-116
-56
-46
-116
-56
-46
-114
-54
-44
-111
-53
-42
-109
-52
-43
-108
-55
-47
-105
-56
-49
-106
-56
-49
-104
-55
-48
-105
-55
-48
-104
-55
-48
-103
-54
-47
-103
-54
-47
-101
-51
-44
-101
-51
-44
-103
-53
-46
-104
-54
-47
-106
-56
-49
-106
-56
-49
-106
-56
-49
-107
-57
-50
-107
-54
-48
-108
-55
-49
-107
-57
-48
-107
-59
-49
-107
-59
-47
-106
-62
-49
-106
-64
-48
-105
-68
-50
-103
-72
-54
-107
-80
-61
-103
-82
-65
-117
-102
-83
-129
-117
-101
-140
-133
-115
-134
-131
-114
-75
-76
-60
-54
-57
-46
-51
-57
-47
-51
-57
-47
-51
-57
-47
-50
-56
-46
-50
-56
-46
-50
-56
-46
-49
-55
-45
-49
-55
-45
-49
-55
-45
-49
-55
-45
-48
-54
-44
-48
-54
-44
-47
-53
-43
-47
-53
-43
-47
-53
-43
-47
-52
-46
-47
-52
-46
-47
-52
-46
-47
-52
-46
-47
-52
-46
-47
-52
-46
-47
-52
-46
-47
-52
-46
-48
-53
-47
-47
-52
-46
-46
-51
-45
-46
-51
-45
-46
-51
-45
-46
-51
-45
-47
-52
-46
-47
-54
-47
-46
-56
-48
-47
-58
-50
-49
-61
-51
-52
-64
-54
-54
-66
-54
-54
-66
-54
-54
-66
-52
-53
-66
-49
-54
-67
-49
-67
-80
-62
-80
-93
-73
-82
-96
-73
-73
-87
-64
-65
-79
-54
-66
-80
-55
-69
-85
-58
-74
-98
-64
-74
-100
-63
-75
-101
-64
-75
-101
-62
-73
-99
-60
-72
-99
-58
-73
-100
-59
-74
-101
-60
-83
-110
-69
-88
-114
-75
-92
-118
-81
-93
-119
-84
-91
-116
-84
-84
-109
-79
-67
-92
-62
-54
-73
-53
-38
-49
-45
-39
-44
-48
-37
-42
-46
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-106
-99
-89
-107
-100
-90
-108
-99
-92
-109
-100
-91
-109
-101
-90
-109
-102
-86
-109
-104
-85
-107
-105
-84
-109
-106
-87
-106
-107
-91
-107
-107
-99
-119
-119
-119
-145
-146
-151
-167
-172
-178
-190
-197
-203
-209
-219
-221
-235
-240
-243
-246
-251
-254
-253
-254
-255
-254
-255
-255
-255
-254
-255
-255
-253
-254
-254
-253
-251
-255
-254
-250
-255
-255
-250
-253
-254
-248
-250
-251
-243
-245
-248
-239
-241
-247
-235
-241
-247
-235
-244
-247
-236
-245
-249
-235
-246
-248
-234
-245
-248
-229
-245
-247
-225
-238
-238
-212
-219
-219
-191
-201
-202
-171
-176
-177
-146
-147
-150
-121
-117
-121
-96
-107
-112
-90
-116
-123
-105
-136
-144
-129
-159
-167
-156
-174
-181
-173
-205
-207
-202
-222
-222
-220
-239
-239
-237
-248
-248
-246
-251
-251
-249
-254
-254
-252
-254
-254
-252
-253
-253
-251
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-253
-255
-254
-245
-250
-253
-251
-255
-255
-254
-254
-254
-255
-248
-246
-255
-250
-244
-255
-245
-235
-248
-204
-193
-215
-157
-143
-147
-75
-60
-164
-81
-65
-168
-75
-58
-167
-64
-49
-183
-71
-59
-207
-89
-77
-206
-84
-73
-189
-63
-51
-196
-68
-55
-198
-72
-58
-195
-75
-61
-185
-73
-59
-170
-66
-55
-157
-63
-51
-149
-65
-55
-144
-70
-59
-134
-66
-57
-129
-66
-57
-126
-66
-56
-123
-65
-54
-122
-64
-53
-122
-62
-52
-122
-62
-52
-122
-62
-52
-120
-60
-52
-120
-60
-52
-119
-59
-51
-119
-59
-51
-117
-58
-50
-116
-57
-49
-116
-57
-49
-116
-57
-49
-114
-57
-48
-114
-57
-48
-114
-57
-48
-114
-57
-48
-111
-57
-47
-110
-56
-46
-108
-54
-44
-107
-53
-43
-108
-55
-47
-106
-56
-49
-108
-55
-49
-106
-56
-49
-107
-54
-48
-105
-55
-48
-105
-55
-48
-104
-54
-47
-103
-53
-46
-103
-53
-46
-102
-53
-46
-103
-54
-47
-104
-55
-48
-105
-56
-49
-107
-58
-51
-107
-58
-51
-108
-59
-52
-106
-59
-51
-105
-58
-48
-104
-60
-49
-107
-63
-50
-106
-67
-52
-105
-68
-50
-102
-69
-50
-102
-73
-55
-108
-86
-65
-106
-89
-71
-117
-106
-86
-134
-127
-109
-145
-142
-123
-128
-127
-109
-69
-70
-54
-53
-56
-45
-50
-56
-46
-50
-56
-46
-50
-56
-46
-49
-55
-45
-49
-55
-45
-49
-55
-45
-48
-54
-44
-49
-55
-45
-49
-55
-45
-49
-55
-45
-48
-54
-44
-48
-54
-44
-47
-53
-43
-47
-53
-43
-47
-53
-43
-47
-52
-46
-47
-52
-46
-47
-52
-46
-47
-52
-46
-47
-52
-46
-47
-52
-46
-47
-52
-46
-47
-52
-46
-47
-52
-46
-47
-52
-46
-46
-51
-45
-45
-50
-44
-45
-50
-44
-46
-51
-45
-47
-52
-46
-46
-53
-46
-43
-53
-45
-43
-54
-46
-45
-57
-47
-47
-59
-49
-50
-62
-50
-52
-64
-52
-54
-66
-52
-55
-68
-51
-56
-69
-51
-63
-76
-58
-69
-82
-62
-67
-81
-58
-59
-73
-50
-56
-70
-45
-62
-76
-51
-68
-84
-57
-74
-95
-64
-74
-98
-64
-76
-100
-66
-75
-99
-63
-73
-97
-61
-71
-96
-57
-70
-95
-56
-71
-96
-57
-82
-107
-68
-88
-112
-76
-93
-117
-83
-94
-118
-86
-90
-113
-84
-80
-103
-75
-61
-84
-56
-46
-65
-46
-38
-49
-45
-39
-44
-48
-37
-42
-46
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-106
-99
-89
-107
-100
-90
-108
-99
-92
-109
-100
-91
-109
-101
-90
-109
-102
-86
-110
-105
-86
-108
-106
-85
-108
-107
-87
-108
-109
-93
-112
-113
-105
-128
-130
-129
-158
-161
-166
-185
-190
-196
-195
-202
-208
-218
-228
-230
-244
-249
-252
-250
-255
-255
-251
-252
-254
-251
-252
-254
-253
-251
-252
-251
-250
-248
-255
-254
-252
-255
-255
-251
-255
-254
-249
-251
-252
-244
-245
-246
-238
-238
-241
-230
-233
-239
-227
-231
-237
-223
-237
-241
-226
-240
-244
-229
-241
-244
-227
-241
-244
-223
-242
-241
-220
-234
-234
-208
-216
-216
-188
-199
-199
-171
-178
-177
-149
-161
-161
-137
-145
-147
-125
-144
-147
-128
-156
-158
-145
-170
-173
-162
-182
-187
-180
-192
-197
-191
-220
-220
-218
-233
-233
-231
-246
-246
-244
-251
-251
-249
-253
-253
-251
-255
-255
-253
-255
-255
-253
-253
-253
-251
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-254
-251
-251
-253
-255
-254
-255
-255
-254
-255
-245
-240
-237
-246
-237
-230
-255
-249
-240
-255
-250
-236
-255
-238
-222
-232
-191
-173
-183
-127
-110
-148
-79
-63
-163
-80
-64
-185
-89
-75
-184
-78
-64
-180
-68
-56
-190
-69
-58
-193
-65
-54
-198
-70
-59
-197
-73
-63
-188
-71
-61
-173
-64
-57
-161
-60
-52
-152
-62
-54
-149
-66
-60
-139
-64
-59
-133
-66
-60
-128
-65
-58
-124
-65
-59
-121
-64
-57
-119
-64
-57
-117
-64
-56
-118
-63
-56
-118
-61
-52
-118
-61
-52
-118
-61
-52
-117
-60
-51
-115
-61
-51
-114
-60
-50
-114
-60
-50
-113
-59
-49
-111
-59
-48
-111
-59
-48
-111
-59
-48
-110
-58
-47
-107
-57
-46
-106
-56
-45
-106
-56
-45
-105
-55
-46
-109
-56
-50
-110
-55
-50
-109
-54
-49
-108
-55
-49
-108
-55
-49
-107
-54
-48
-105
-55
-48
-105
-55
-48
-108
-58
-51
-106
-57
-50
-104
-55
-48
-102
-55
-47
-102
-55
-47
-102
-55
-47
-104
-57
-49
-102
-58
-49
-106
-63
-54
-102
-62
-52
-101
-61
-49
-102
-62
-50
-104
-67
-51
-105
-69
-53
-102
-71
-51
-99
-71
-50
-99
-74
-54
-104
-86
-64
-105
-92
-73
-115
-107
-86
-133
-130
-111
-143
-142
-122
-112
-113
-95
-57
-61
-44
-52
-55
-44
-50
-56
-46
-49
-55
-45
-49
-55
-45
-49
-55
-45
-48
-54
-44
-48
-54
-44
-48
-54
-44
-49
-55
-45
-49
-55
-45
-49
-55
-45
-48
-54
-44
-48
-54
-44
-47
-53
-43
-47
-53
-43
-47
-53
-43
-46
-51
-45
-46
-51
-45
-46
-51
-45
-46
-51
-45
-46
-51
-45
-46
-51
-45
-46
-51
-45
-46
-51
-45
-46
-51
-45
-46
-51
-45
-45
-50
-44
-45
-50
-44
-45
-50
-44
-45
-50
-44
-46
-51
-45
-45
-52
-45
-42
-52
-44
-41
-52
-44
-42
-54
-44
-43
-55
-45
-46
-58
-46
-49
-61
-49
-52
-64
-50
-53
-65
-51
-54
-67
-50
-58
-71
-53
-60
-73
-55
-56
-69
-49
-50
-63
-43
-50
-64
-41
-56
-70
-47
-62
-78
-52
-68
-88
-60
-69
-93
-61
-75
-96
-65
-74
-98
-64
-75
-96
-63
-71
-95
-59
-72
-94
-58
-70
-94
-58
-83
-105
-69
-88
-112
-78
-96
-117
-86
-94
-117
-88
-90
-110
-83
-76
-99
-73
-57
-77
-52
-41
-58
-40
-38
-47
-44
-37
-42
-46
-35
-40
-44
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-106
-99
-89
-107
-100
-90
-108
-99
-92
-109
-100
-91
-109
-101
-90
-109
-102
-86
-108
-103
-84
-107
-105
-84
-110
-109
-89
-111
-112
-96
-116
-117
-109
-133
-135
-134
-164
-167
-172
-191
-196
-202
-205
-212
-218
-229
-239
-241
-251
-255
-255
-251
-255
-255
-250
-251
-253
-252
-253
-255
-255
-253
-254
-253
-252
-250
-255
-255
-253
-255
-255
-251
-254
-253
-248
-247
-248
-240
-239
-240
-232
-231
-234
-223
-224
-230
-218
-222
-229
-213
-231
-235
-218
-234
-239
-219
-237
-240
-219
-236
-240
-217
-238
-238
-214
-232
-232
-208
-218
-216
-191
-204
-202
-177
-194
-189
-167
-183
-181
-160
-177
-174
-157
-182
-180
-167
-193
-190
-181
-201
-200
-195
-210
-211
-206
-217
-217
-215
-232
-232
-230
-242
-242
-240
-250
-250
-248
-252
-252
-250
-253
-253
-251
-255
-255
-253
-255
-255
-253
-252
-252
-250
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-255
-254
-252
-255
-251
-254
-255
-247
-250
-250
-246
-245
-248
-247
-243
-252
-255
-248
-254
-255
-248
-254
-255
-244
-253
-252
-234
-255
-254
-236
-245
-220
-200
-196
-155
-137
-157
-98
-80
-151
-75
-59
-165
-76
-60
-180
-80
-64
-186
-74
-60
-189
-65
-55
-196
-68
-59
-195
-71
-63
-188
-69
-61
-176
-63
-59
-166
-58
-55
-157
-59
-56
-152
-63
-59
-143
-62
-59
-137
-63
-60
-130
-65
-61
-124
-65
-61
-119
-66
-60
-115
-66
-59
-114
-67
-59
-115
-66
-59
-113
-63
-54
-115
-62
-54
-115
-62
-54
-114
-61
-53
-114
-61
-53
-114
-61
-53
-112
-62
-53
-111
-61
-52
-110
-62
-52
-109
-61
-51
-108
-60
-50
-107
-59
-49
-106
-59
-49
-105
-58
-48
-105
-58
-48
-106
-58
-48
-110
-55
-50
-112
-54
-50
-112
-54
-50
-109
-54
-49
-109
-54
-49
-108
-55
-49
-105
-55
-48
-105
-55
-48
-108
-59
-52
-107
-58
-51
-104
-57
-49
-101
-57
-48
-101
-57
-48
-101
-57
-48
-101
-58
-49
-100
-60
-50
-102
-66
-54
-99
-65
-53
-99
-67
-52
-100
-68
-53
-100
-71
-53
-100
-73
-54
-98
-73
-51
-95
-73
-50
-94
-76
-54
-101
-86
-63
-106
-98
-77
-114
-109
-87
-132
-131
-111
-132
-135
-114
-91
-96
-76
-51
-58
-40
-50
-56
-44
-50
-56
-46
-49
-55
-45
-49
-55
-45
-49
-55
-45
-48
-54
-44
-48
-54
-44
-48
-54
-44
-49
-55
-45
-49
-55
-45
-49
-55
-45
-48
-54
-44
-48
-54
-44
-47
-53
-43
-47
-53
-43
-47
-53
-43
-46
-51
-45
-46
-51
-45
-46
-51
-45
-46
-51
-45
-46
-51
-45
-46
-51
-45
-46
-51
-45
-46
-51
-45
-45
-50
-44
-45
-50
-44
-44
-49
-43
-44
-49
-43
-44
-49
-43
-44
-49
-43
-45
-50
-44
-44
-51
-44
-44
-54
-46
-43
-53
-45
-42
-52
-43
-42
-52
-43
-43
-53
-44
-46
-56
-45
-48
-59
-45
-50
-61
-47
-50
-61
-45
-53
-64
-47
-54
-65
-48
-53
-65
-45
-49
-61
-41
-49
-61
-41
-53
-65
-45
-56
-70
-47
-61
-79
-53
-64
-84
-56
-70
-89
-61
-72
-92
-64
-74
-93
-63
-73
-94
-61
-75
-94
-62
-75
-96
-63
-84
-103
-71
-91
-112
-81
-99
-118
-90
-97
-117
-90
-89
-107
-83
-74
-93
-71
-54
-71
-52
-38
-52
-37
-36
-45
-42
-36
-41
-44
-34
-39
-42
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-106
-99
-89
-107
-100
-90
-108
-99
-92
-109
-100
-91
-109
-101
-90
-108
-102
-86
-106
-103
-84
-107
-106
-85
-108
-110
-89
-111
-114
-97
-115
-118
-109
-129
-133
-132
-159
-164
-168
-184
-191
-199
-213
-222
-227
-236
-246
-248
-251
-255
-255
-251
-255
-255
-250
-251
-255
-253
-254
-255
-255
-254
-255
-253
-252
-250
-255
-255
-251
-255
-255
-250
-252
-252
-244
-243
-245
-234
-235
-237
-226
-227
-231
-217
-221
-227
-213
-220
-227
-209
-228
-233
-211
-231
-236
-213
-233
-237
-214
-234
-236
-212
-235
-235
-211
-232
-230
-207
-223
-218
-196
-211
-206
-184
-211
-206
-186
-204
-198
-182
-203
-195
-184
-208
-201
-193
-215
-210
-206
-224
-219
-216
-234
-230
-229
-240
-239
-237
-243
-242
-240
-249
-249
-247
-253
-253
-251
-253
-253
-251
-253
-253
-251
-255
-255
-253
-254
-254
-252
-252
-252
-250
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-255
-253
-252
-255
-252
-253
-255
-246
-247
-253
-249
-248
-254
-255
-253
-249
-255
-253
-246
-255
-250
-237
-255
-243
-240
-254
-239
-235
-242
-226
-255
-255
-237
-255
-236
-217
-204
-166
-147
-163
-106
-87
-161
-90
-70
-170
-87
-69
-173
-76
-59
-182
-70
-58
-188
-70
-60
-189
-70
-62
-185
-70
-63
-178
-66
-62
-169
-61
-58
-161
-59
-57
-153
-59
-57
-149
-61
-60
-142
-62
-61
-133
-63
-61
-125
-64
-59
-120
-65
-60
-115
-66
-59
-112
-68
-59
-112
-68
-59
-112
-63
-56
-113
-63
-54
-113
-63
-54
-113
-63
-54
-113
-63
-54
-112
-62
-53
-111
-63
-53
-111
-63
-53
-111
-64
-54
-110
-63
-53
-109
-62
-52
-107
-60
-50
-104
-60
-49
-104
-60
-49
-104
-60
-49
-108
-60
-50
-111
-56
-51
-113
-54
-50
-112
-54
-50
-112
-54
-50
-109
-54
-49
-108
-55
-49
-106
-56
-49
-105
-56
-49
-104
-55
-48
-103
-56
-48
-101
-57
-48
-101
-58
-49
-100
-60
-50
-101
-63
-52
-102
-64
-53
-100
-66
-54
-94
-66
-52
-97
-71
-56
-99
-76
-58
-100
-77
-59
-99
-77
-56
-96
-75
-54
-93
-75
-51
-93
-77
-52
-93
-81
-57
-98
-88
-63
-109
-104
-82
-115
-115
-91
-128
-131
-110
-118
-123
-101
-70
-79
-58
-52
-61
-42
-51
-57
-45
-50
-56
-46
-50
-56
-46
-50
-56
-46
-49
-55
-45
-49
-55
-45
-49
-55
-45
-48
-54
-44
-49
-55
-45
-49
-55
-45
-49
-55
-45
-48
-54
-44
-48
-54
-44
-47
-53
-43
-47
-53
-43
-47
-53
-43
-45
-50
-44
-45
-50
-44
-45
-50
-44
-45
-50
-44
-45
-50
-44
-45
-50
-44
-45
-50
-44
-45
-50
-44
-45
-50
-44
-44
-49
-43
-43
-48
-42
-43
-48
-42
-43
-48
-42
-43
-48
-42
-44
-49
-43
-44
-51
-44
-46
-53
-46
-44
-54
-46
-42
-52
-43
-42
-52
-43
-42
-52
-43
-43
-53
-44
-45
-55
-44
-46
-57
-43
-45
-56
-42
-48
-59
-43
-52
-63
-47
-53
-64
-47
-52
-63
-46
-51
-63
-43
-51
-62
-45
-51
-64
-44
-55
-70
-47
-57
-75
-51
-64
-79
-56
-66
-84
-58
-71
-87
-60
-72
-91
-63
-77
-93
-66
-77
-96
-68
-85
-101
-74
-92
-111
-83
-100
-116
-90
-96
-114
-90
-88
-103
-82
-71
-88
-69
-52
-66
-49
-36
-50
-37
-36
-45
-42
-36
-41
-44
-34
-39
-42
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-106
-100
-86
-106
-100
-86
-106
-99
-89
-107
-100
-90
-108
-99
-92
-109
-100
-91
-108
-102
-90
-108
-102
-86
-108
-105
-86
-108
-107
-86
-107
-109
-88
-107
-110
-93
-108
-114
-104
-121
-127
-125
-149
-157
-160
-174
-183
-190
-209
-218
-223
-233
-242
-247
-251
-255
-255
-248
-253
-255
-248
-249
-253
-254
-255
-255
-255
-254
-255
-249
-248
-246
-255
-255
-251
-254
-253
-248
-249
-249
-241
-241
-243
-232
-233
-235
-222
-227
-231
-216
-223
-230
-214
-224
-232
-211
-228
-233
-210
-231
-237
-211
-232
-236
-211
-231
-233
-209
-232
-232
-208
-231
-229
-206
-224
-219
-199
-215
-208
-190
-218
-211
-195
-217
-209
-198
-222
-212
-203
-230
-221
-216
-238
-228
-227
-243
-233
-234
-250
-241
-244
-255
-249
-251
-250
-249
-247
-254
-254
-252
-255
-255
-253
-253
-253
-251
-253
-253
-251
-255
-255
-253
-255
-255
-253
-252
-252
-250
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-255
-253
-252
-255
-250
-249
-255
-251
-250
-255
-254
-253
-252
-255
-253
-245
-255
-252
-234
-251
-245
-234
-255
-248
-242
-255
-253
-245
-255
-250
-239
-245
-231
-255
-250
-234
-255
-250
-232
-242
-204
-185
-171
-119
-98
-143
-81
-58
-170
-93
-73
-175
-80
-62
-179
-76
-61
-179
-75
-62
-179
-75
-64
-177
-73
-64
-172
-69
-62
-162
-63
-58
-154
-59
-55
-150
-61
-57
-143
-62
-58
-136
-63
-57
-129
-64
-58
-122
-65
-58
-117
-67
-58
-113
-69
-58
-113
-69
-60
-112
-63
-56
-113
-63
-56
-113
-63
-56
-113
-63
-56
-113
-63
-56
-113
-63
-56
-112
-63
-56
-112
-63
-56
-113
-66
-58
-112
-65
-57
-110
-63
-55
-108
-61
-53
-105
-61
-52
-106
-62
-53
-106
-62
-53
-110
-61
-54
-111
-56
-51
-114
-55
-51
-112
-54
-50
-112
-54
-50
-110
-55
-50
-108
-55
-49
-106
-56
-49
-105
-56
-49
-100
-56
-47
-100
-57
-48
-99
-59
-49
-100
-62
-51
-100
-64
-52
-99
-65
-53
-99
-65
-53
-95
-67
-53
-90
-69
-52
-95
-78
-60
-103
-86
-66
-104
-87
-67
-99
-83
-60
-94
-79
-56
-91
-79
-53
-92
-82
-55
-93
-86
-60
-93
-89
-62
-110
-108
-85
-116
-118
-94
-124
-129
-107
-99
-109
-85
-50
-62
-40
-54
-66
-46
-51
-59
-46
-51
-57
-47
-51
-57
-47
-51
-57
-47
-50
-56
-46
-50
-56
-46
-50
-56
-46
-49
-55
-45
-49
-55
-45
-49
-55
-45
-49
-55
-45
-48
-54
-44
-48
-54
-44
-47
-53
-43
-47
-53
-43
-47
-53
-43
-45
-50
-44
-45
-50
-44
-45
-50
-44
-45
-50
-44
-45
-50
-44
-45
-50
-44
-45
-50
-44
-45
-50
-44
-44
-49
-43
-44
-49
-43
-43
-48
-42
-42
-47
-41
-42
-47
-41
-43
-48
-42
-44
-49
-43
-43
-50
-43
-45
-52
-45
-43
-53
-45
-42
-52
-44
-42
-52
-44
-43
-53
-44
-43
-53
-44
-44
-54
-43
-45
-55
-44
-44
-54
-43
-47
-58
-44
-50
-61
-47
-54
-65
-49
-55
-66
-50
-55
-66
-49
-53
-64
-48
-52
-63
-46
-50
-63
-45
-52
-67
-46
-58
-71
-51
-61
-76
-53
-65
-79
-56
-68
-84
-58
-74
-88
-63
-76
-92
-66
-84
-98
-73
-92
-107
-84
-99
-113
-90
-94
-109
-88
-85
-98
-80
-68
-82
-65
-50
-62
-48
-35
-47
-37
-38
-47
-44
-38
-44
-44
-36
-42
-42
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-106
-100
-86
-106
-100
-86
-106
-99
-89
-107
-100
-90
-108
-99
-92
-109
-100
-91
-108
-102
-90
-108
-102
-86
-111
-108
-89
-109
-108
-87
-106
-108
-87
-103
-107
-90
-102
-108
-98
-114
-123
-120
-142
-152
-154
-168
-177
-184
-201
-210
-215
-226
-235
-240
-247
-252
-255
-246
-251
-254
-249
-250
-254
-254
-255
-255
-255
-254
-255
-249
-248
-244
-255
-255
-250
-253
-253
-245
-248
-248
-238
-240
-242
-229
-233
-235
-221
-229
-233
-216
-227
-234
-216
-229
-237
-214
-230
-236
-210
-233
-237
-210
-234
-237
-210
-232
-232
-206
-232
-230
-207
-232
-227
-207
-225
-218
-200
-216
-208
-195
-216
-206
-196
-221
-210
-204
-234
-223
-219
-248
-237
-235
-255
-244
-246
-255
-245
-249
-255
-245
-251
-255
-249
-252
-254
-252
-253
-255
-255
-253
-255
-255
-253
-254
-254
-252
-254
-254
-252
-255
-255
-253
-255
-255
-253
-253
-253
-251
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-255
-254
-250
-255
-249
-247
-255
-249
-247
-251
-250
-248
-247
-251
-250
-245
-255
-254
-243
-255
-255
-240
-255
-255
-237
-253
-250
-240
-252
-248
-251
-255
-250
-255
-253
-241
-255
-242
-226
-255
-239
-219
-255
-225
-203
-216
-174
-150
-170
-114
-91
-164
-89
-68
-169
-84
-64
-168
-81
-62
-169
-82
-65
-173
-81
-66
-169
-77
-64
-161
-68
-60
-151
-61
-53
-149
-62
-55
-143
-63
-54
-137
-62
-56
-131
-64
-55
-125
-65
-55
-119
-67
-54
-116
-68
-56
-115
-69
-56
-113
-63
-56
-113
-63
-56
-115
-62
-56
-113
-63
-56
-113
-63
-56
-113
-63
-56
-113
-63
-56
-112
-63
-56
-115
-66
-59
-113
-66
-58
-111
-64
-56
-109
-62
-54
-108
-61
-53
-106
-62
-53
-109
-62
-54
-111
-62
-55
-111
-56
-51
-113
-55
-51
-111
-56
-51
-109
-56
-50
-109
-56
-50
-105
-56
-49
-104
-57
-49
-102
-58
-49
-102
-59
-50
-100
-62
-51
-100
-64
-52
-98
-66
-53
-96
-67
-53
-93
-65
-51
-92
-64
-50
-87
-66
-49
-84
-71
-52
-91
-83
-62
-102
-94
-71
-105
-94
-72
-98
-88
-63
-90
-83
-57
-90
-83
-55
-92
-87
-58
-90
-86
-59
-88
-87
-59
-107
-109
-85
-115
-119
-94
-117
-125
-102
-85
-97
-73
-38
-50
-28
-56
-68
-48
-51
-59
-46
-52
-58
-48
-52
-58
-48
-51
-57
-47
-51
-57
-47
-51
-57
-47
-50
-56
-46
-50
-56
-46
-49
-55
-45
-49
-55
-45
-49
-55
-45
-48
-54
-44
-48
-54
-44
-47
-53
-43
-47
-53
-43
-47
-53
-43
-45
-50
-44
-45
-50
-44
-45
-50
-44
-45
-50
-44
-45
-50
-44
-45
-50
-44
-45
-50
-44
-45
-50
-44
-44
-49
-43
-43
-48
-42
-43
-48
-42
-42
-47
-41
-42
-47
-41
-43
-48
-42
-43
-48
-42
-44
-49
-43
-43
-50
-43
-41
-51
-43
-42
-52
-44
-43
-53
-45
-43
-53
-44
-44
-54
-45
-45
-55
-46
-45
-55
-44
-44
-54
-43
-46
-56
-45
-50
-60
-49
-54
-65
-51
-57
-68
-54
-57
-68
-52
-55
-66
-52
-54
-65
-49
-48
-59
-43
-50
-63
-45
-53
-66
-48
-57
-70
-50
-60
-73
-53
-64
-78
-55
-70
-84
-61
-74
-88
-63
-82
-96
-73
-91
-104
-84
-97
-110
-90
-92
-105
-87
-81
-94
-77
-66
-78
-64
-47
-59
-47
-34
-44
-35
-42
-48
-44
-40
-46
-44
-38
-44
-44
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-107
-101
-87
-107
-101
-87
-107
-100
-90
-108
-101
-91
-109
-100
-93
-110
-101
-92
-109
-103
-91
-109
-103
-87
-113
-110
-91
-107
-109
-87
-107
-110
-89
-107
-114
-96
-106
-114
-103
-112
-121
-118
-135
-145
-147
-159
-170
-176
-187
-196
-201
-208
-217
-222
-234
-239
-243
-246
-251
-254
-252
-253
-255
-254
-255
-255
-255
-254
-255
-254
-253
-249
-255
-255
-250
-254
-254
-246
-250
-250
-240
-246
-248
-235
-244
-246
-232
-240
-244
-227
-234
-241
-223
-231
-239
-216
-240
-246
-218
-237
-242
-212
-235
-238
-209
-236
-236
-210
-232
-230
-209
-225
-220
-201
-221
-213
-200
-222
-212
-202
-224
-211
-205
-231
-217
-216
-241
-227
-227
-249
-234
-237
-253
-241
-243
-255
-246
-250
-255
-248
-255
-255
-252
-255
-255
-253
-254
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-255
-250
-255
-254
-250
-255
-255
-251
-255
-255
-253
-254
-255
-255
-252
-255
-255
-250
-255
-255
-249
-254
-255
-249
-253
-255
-254
-255
-255
-254
-253
-251
-254
-249
-243
-255
-248
-238
-255
-249
-233
-255
-248
-226
-255
-241
-217
-255
-232
-207
-182
-132
-105
-162
-100
-75
-147
-83
-58
-155
-87
-64
-165
-93
-71
-160
-83
-65
-154
-75
-58
-155
-76
-61
-142
-63
-50
-141
-63
-50
-135
-63
-51
-128
-60
-47
-121
-59
-46
-116
-60
-45
-115
-63
-49
-115
-66
-52
-114
-61
-53
-114
-61
-55
-116
-61
-56
-115
-62
-56
-117
-64
-58
-117
-64
-58
-116
-63
-57
-113
-63
-56
-115
-65
-58
-113
-64
-57
-113
-64
-57
-113
-64
-57
-112
-63
-56
-110
-63
-55
-111
-62
-55
-111
-62
-55
-107
-57
-50
-109
-56
-50
-108
-58
-51
-108
-59
-52
-108
-59
-52
-104
-60
-51
-103
-60
-51
-99
-61
-50
-99
-63
-51
-94
-62
-49
-100
-71
-57
-99
-71
-57
-84
-61
-45
-78
-57
-40
-77
-56
-39
-64
-49
-30
-87
-81
-59
-80
-78
-55
-75
-73
-48
-79
-75
-50
-93
-89
-62
-105
-101
-74
-101
-97
-68
-86
-85
-55
-88
-88
-60
-93
-96
-67
-111
-115
-90
-122
-128
-102
-100
-108
-85
-61
-73
-49
-45
-57
-35
-50
-62
-42
-52
-60
-47
-53
-59
-49
-52
-58
-48
-52
-58
-48
-52
-58
-48
-51
-57
-47
-51
-57
-47
-51
-57
-47
-51
-57
-47
-51
-57
-47
-51
-57
-47
-50
-56
-46
-49
-55
-45
-49
-55
-45
-49
-55
-45
-48
-54
-44
-49
-54
-48
-49
-54
-48
-48
-53
-47
-48
-53
-47
-47
-52
-46
-47
-52
-46
-47
-52
-46
-47
-52
-46
-44
-49
-43
-44
-49
-43
-44
-49
-43
-44
-49
-43
-44
-49
-43
-44
-49
-43
-43
-48
-42
-43
-48
-42
-46
-53
-46
-45
-52
-45
-45
-52
-45
-44
-51
-44
-45
-52
-45
-45
-52
-44
-46
-53
-45
-46
-53
-45
-43
-50
-42
-45
-52
-44
-48
-55
-47
-53
-61
-50
-57
-65
-54
-61
-69
-56
-63
-71
-60
-63
-74
-60
-55
-66
-50
-53
-64
-47
-51
-62
-45
-49
-61
-41
-50
-62
-42
-57
-69
-47
-66
-78
-56
-73
-85
-63
-79
-91
-71
-86
-98
-78
-93
-104
-87
-89
-100
-84
-76
-87
-73
-60
-70
-59
-47
-57
-46
-41
-51
-42
-42
-48
-44
-41
-47
-43
-40
-46
-44
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-107
-101
-87
-107
-101
-87
-107
-100
-90
-108
-101
-91
-109
-100
-93
-110
-101
-92
-109
-103
-91
-107
-104
-87
-111
-110
-90
-106
-108
-86
-107
-110
-89
-107
-114
-96
-106
-116
-105
-113
-124
-120
-137
-148
-150
-163
-174
-180
-190
-199
-204
-210
-219
-224
-235
-240
-244
-247
-252
-255
-253
-254
-255
-254
-255
-255
-255
-254
-252
-254
-253
-249
-255
-255
-250
-254
-254
-244
-251
-251
-239
-247
-249
-235
-244
-247
-230
-240
-245
-225
-234
-242
-221
-232
-237
-214
-234
-239
-209
-230
-235
-203
-228
-231
-202
-230
-230
-204
-227
-225
-204
-223
-217
-201
-222
-212
-202
-223
-212
-206
-230
-216
-215
-236
-222
-222
-245
-230
-233
-250
-238
-242
-255
-243
-247
-255
-246
-250
-255
-249
-253
-255
-251
-254
-255
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-253
-255
-252
-250
-255
-249
-250
-255
-249
-253
-255
-252
-253
-254
-255
-253
-252
-255
-253
-250
-255
-255
-250
-255
-255
-248
-255
-255
-252
-255
-255
-250
-253
-255
-248
-246
-255
-249
-242
-255
-252
-239
-255
-252
-234
-254
-248
-226
-255
-241
-215
-255
-234
-206
-217
-178
-149
-163
-117
-91
-142
-92
-67
-146
-92
-66
-152
-92
-68
-152
-87
-67
-150
-83
-64
-138
-70
-51
-137
-68
-52
-135
-68
-51
-131
-68
-51
-126
-67
-51
-122
-66
-49
-118
-65
-49
-115
-63
-49
-117
-64
-56
-115
-62
-56
-117
-62
-57
-117
-64
-58
-116
-63
-57
-111
-61
-54
-112
-62
-55
-115
-65
-58
-113
-63
-56
-112
-63
-56
-112
-63
-56
-110
-63
-55
-111
-62
-55
-109
-62
-54
-110
-61
-54
-109
-62
-54
-107
-60
-52
-108
-61
-53
-109
-62
-54
-107
-63
-54
-106
-63
-54
-103
-65
-54
-101
-65
-53
-98
-66
-53
-100
-71
-57
-91
-65
-50
-94
-71
-55
-94
-73
-56
-78
-61
-43
-70
-55
-36
-71
-56
-37
-62
-54
-33
-76
-76
-52
-71
-75
-50
-68
-71
-44
-68
-68
-42
-77
-77
-49
-92
-91
-63
-98
-97
-67
-96
-97
-66
-89
-89
-61
-100
-103
-74
-115
-119
-94
-115
-121
-95
-88
-96
-73
-58
-68
-44
-47
-59
-37
-55
-67
-47
-54
-62
-49
-54
-60
-50
-54
-60
-50
-54
-60
-50
-53
-59
-49
-53
-59
-49
-53
-59
-49
-53
-59
-49
-53
-59
-49
-53
-59
-49
-53
-59
-49
-52
-58
-48
-52
-58
-48
-51
-57
-47
-51
-57
-47
-51
-57
-47
-50
-55
-49
-50
-55
-49
-50
-55
-49
-49
-54
-48
-49
-54
-48
-49
-54
-48
-48
-53
-47
-48
-53
-47
-46
-51
-45
-46
-51
-45
-45
-50
-44
-45
-50
-44
-44
-49
-43
-44
-49
-43
-43
-48
-42
-43
-48
-42
-42
-49
-42
-42
-49
-42
-41
-48
-41
-41
-48
-41
-41
-48
-41
-42
-49
-42
-43
-50
-42
-44
-51
-43
-46
-53
-45
-45
-52
-44
-46
-53
-45
-48
-55
-47
-52
-59
-51
-57
-65
-54
-63
-70
-62
-66
-74
-63
-59
-70
-56
-58
-69
-53
-55
-66
-49
-52
-63
-46
-51
-63
-43
-54
-66
-46
-60
-72
-50
-64
-76
-54
-76
-88
-68
-83
-95
-75
-89
-100
-84
-87
-98
-82
-76
-86
-75
-61
-71
-60
-49
-59
-50
-43
-53
-44
-44
-51
-44
-43
-49
-45
-42
-48
-44
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-107
-101
-87
-107
-101
-87
-108
-99
-90
-109
-100
-91
-109
-100
-93
-110
-101
-92
-109
-103
-91
-107
-104
-87
-109
-108
-88
-105
-109
-86
-106
-111
-89
-107
-116
-97
-105
-117
-105
-113
-125
-121
-138
-152
-153
-165
-178
-184
-191
-202
-208
-212
-221
-226
-237
-242
-246
-247
-252
-255
-252
-253
-255
-253
-255
-254
-255
-254
-252
-254
-253
-248
-255
-255
-247
-253
-253
-243
-250
-251
-237
-247
-250
-233
-244
-247
-228
-239
-244
-222
-231
-239
-216
-229
-235
-209
-226
-231
-201
-222
-225
-194
-221
-221
-193
-222
-222
-198
-222
-219
-200
-221
-215
-203
-224
-213
-207
-228
-217
-215
-237
-225
-225
-242
-230
-234
-249
-237
-241
-254
-243
-247
-255
-246
-250
-255
-248
-251
-255
-249
-252
-255
-252
-252
-255
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-253
-255
-252
-246
-255
-250
-246
-255
-250
-250
-254
-253
-253
-253
-253
-255
-250
-254
-255
-248
-255
-255
-246
-255
-255
-244
-254
-255
-249
-255
-255
-247
-252
-255
-247
-247
-255
-250
-245
-255
-255
-246
-255
-255
-242
-250
-253
-236
-250
-248
-227
-254
-240
-214
-255
-246
-219
-255
-235
-208
-223
-191
-166
-168
-131
-105
-132
-90
-66
-131
-83
-60
-145
-93
-71
-148
-93
-72
-139
-82
-62
-127
-70
-50
-118
-63
-42
-117
-62
-42
-118
-66
-45
-121
-70
-51
-120
-71
-54
-113
-63
-52
-110
-60
-51
-113
-60
-52
-116
-66
-57
-115
-65
-56
-111
-63
-53
-113
-65
-55
-120
-72
-62
-110
-62
-52
-109
-62
-52
-109
-62
-52
-107
-63
-52
-108
-61
-51
-106
-62
-51
-108
-61
-51
-106
-62
-51
-103
-63
-53
-103
-65
-54
-103
-65
-54
-103
-67
-55
-101
-67
-55
-99
-67
-54
-96
-67
-53
-94
-68
-53
-98
-75
-59
-85
-66
-49
-90
-73
-55
-96
-83
-64
-82
-71
-51
-67
-59
-38
-69
-61
-40
-70
-65
-43
-65
-69
-44
-66
-72
-46
-65
-69
-42
-60
-64
-37
-63
-66
-37
-78
-78
-50
-95
-96
-65
-105
-106
-75
-97
-97
-69
-110
-113
-84
-118
-122
-97
-103
-109
-83
-74
-79
-57
-52
-60
-37
-52
-61
-40
-61
-70
-51
-56
-62
-50
-56
-62
-52
-56
-62
-52
-56
-62
-52
-55
-61
-51
-55
-61
-51
-55
-61
-51
-54
-60
-50
-56
-62
-52
-56
-62
-52
-55
-61
-51
-55
-61
-51
-55
-61
-51
-54
-60
-50
-54
-60
-50
-54
-60
-50
-53
-58
-52
-52
-57
-51
-52
-57
-51
-52
-57
-51
-51
-56
-50
-51
-56
-50
-51
-56
-50
-50
-55
-49
-48
-53
-47
-48
-53
-47
-47
-52
-46
-46
-51
-45
-45
-50
-44
-44
-49
-43
-43
-48
-42
-43
-48
-42
-41
-46
-40
-41
-46
-40
-41
-46
-40
-41
-46
-40
-41
-46
-40
-42
-47
-41
-43
-48
-42
-44
-49
-43
-49
-54
-48
-47
-52
-46
-44
-49
-43
-44
-49
-43
-47
-52
-46
-54
-59
-52
-61
-66
-60
-65
-72
-64
-64
-75
-61
-62
-75
-58
-60
-73
-55
-56
-69
-51
-52
-65
-45
-50
-63
-43
-51
-65
-42
-53
-67
-44
-68
-81
-61
-75
-88
-68
-81
-94
-77
-81
-94
-77
-72
-84
-72
-60
-72
-60
-50
-62
-52
-46
-56
-47
-46
-53
-46
-46
-53
-46
-45
-52
-45
-103
-100
-85
-103
-100
-85
-104
-101
-86
-104
-101
-86
-104
-101
-86
-104
-101
-86
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-107
-101
-87
-107
-101
-87
-108
-99
-90
-109
-100
-91
-109
-100
-93
-109
-102
-92
-109
-103
-91
-106
-105
-87
-107
-109
-88
-105
-109
-86
-106
-111
-89
-106
-115
-96
-104
-116
-104
-109
-124
-119
-136
-152
-152
-166
-179
-185
-191
-202
-208
-211
-220
-227
-235
-240
-246
-246
-251
-255
-252
-253
-255
-253
-255
-254
-255
-255
-253
-255
-254
-249
-254
-254
-246
-253
-253
-241
-250
-251
-237
-247
-250
-231
-244
-247
-226
-238
-243
-220
-229
-237
-213
-226
-232
-206
-219
-224
-192
-215
-218
-187
-214
-214
-188
-217
-215
-194
-221
-215
-199
-222
-215
-205
-229
-219
-217
-236
-224
-224
-247
-235
-239
-250
-239
-245
-255
-244
-250
-255
-248
-253
-255
-249
-252
-255
-250
-250
-255
-250
-250
-255
-252
-251
-255
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-253
-255
-252
-247
-255
-253
-247
-255
-253
-250
-254
-253
-253
-253
-253
-255
-251
-253
-255
-248
-254
-255
-246
-253
-255
-244
-250
-255
-248
-251
-255
-247
-250
-255
-248
-248
-255
-252
-249
-255
-255
-248
-255
-255
-248
-250
-255
-244
-250
-252
-238
-255
-255
-237
-255
-248
-228
-253
-238
-219
-255
-239
-219
-255
-239
-217
-238
-210
-188
-176
-144
-121
-118
-82
-60
-117
-76
-54
-117
-75
-53
-119
-74
-53
-123
-78
-57
-125
-80
-59
-120
-75
-54
-107
-64
-45
-98
-55
-38
-123
-77
-64
-115
-68
-58
-113
-66
-56
-115
-68
-58
-111
-67
-56
-103
-59
-48
-100
-56
-45
-103
-61
-49
-105
-63
-51
-105
-63
-51
-105
-63
-51
-103
-63
-51
-102
-62
-50
-102
-62
-50
-102
-62
-50
-101
-63
-50
-98
-64
-52
-98
-66
-53
-96
-67
-53
-95
-67
-53
-95
-67
-53
-91
-68
-52
-90
-69
-52
-87
-68
-51
-88
-73
-54
-79
-66
-47
-92
-84
-63
-111
-105
-83
-99
-94
-72
-77
-75
-52
-73
-71
-48
-73
-75
-51
-62
-68
-42
-63
-72
-45
-64
-70
-42
-60
-66
-38
-60
-65
-35
-70
-73
-44
-88
-89
-58
-100
-101
-70
-109
-109
-81
-120
-120
-92
-116
-118
-94
-91
-95
-70
-64
-67
-46
-54
-59
-37
-56
-64
-43
-60
-67
-49
-57
-63
-51
-57
-63
-53
-57
-63
-53
-56
-62
-52
-56
-62
-52
-55
-61
-51
-55
-61
-51
-55
-61
-51
-57
-63
-53
-56
-62
-52
-56
-62
-52
-56
-62
-52
-56
-62
-52
-56
-62
-52
-56
-62
-52
-56
-62
-52
-55
-60
-54
-55
-60
-54
-55
-60
-54
-54
-59
-53
-54
-59
-53
-54
-59
-53
-53
-58
-52
-53
-58
-52
-51
-56
-50
-51
-56
-50
-49
-54
-48
-48
-53
-47
-47
-52
-46
-45
-50
-44
-44
-49
-43
-44
-49
-43
-43
-48
-42
-43
-48
-42
-42
-47
-41
-42
-47
-41
-43
-48
-42
-44
-49
-43
-45
-50
-44
-45
-50
-44
-48
-53
-47
-46
-51
-45
-43
-48
-42
-43
-48
-42
-45
-50
-46
-50
-55
-49
-56
-61
-57
-59
-66
-58
-64
-75
-61
-64
-77
-59
-64
-77
-59
-61
-74
-54
-56
-69
-49
-51
-64
-44
-49
-63
-40
-48
-62
-39
-60
-73
-53
-66
-79
-59
-72
-85
-67
-73
-86
-69
-68
-80
-66
-59
-71
-59
-50
-62
-52
-46
-58
-48
-45
-55
-47
-47
-54
-47
-46
-53
-46
-103
-100
-85
-103
-100
-85
-103
-100
-85
-104
-101
-86
-104
-101
-86
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-107
-101
-87
-108
-100
-87
-108
-99
-90
-109
-100
-91
-109
-100
-93
-109
-102
-92
-109
-103
-91
-106
-105
-87
-107
-109
-88
-105
-110
-87
-105
-113
-90
-103
-115
-95
-100
-114
-101
-106
-121
-116
-133
-149
-149
-163
-178
-183
-189
-200
-206
-210
-219
-226
-234
-239
-245
-244
-249
-253
-251
-252
-255
-253
-255
-254
-255
-255
-253
-255
-255
-250
-255
-255
-248
-255
-255
-243
-254
-255
-241
-251
-254
-235
-247
-250
-229
-240
-245
-222
-230
-238
-214
-226
-232
-204
-217
-220
-191
-213
-213
-185
-210
-208
-185
-212
-209
-190
-218
-212
-200
-224
-217
-209
-234
-224
-223
-244
-233
-237
-253
-242
-248
-255
-246
-251
-255
-250
-255
-255
-252
-255
-255
-253
-254
-254
-253
-251
-254
-253
-249
-254
-253
-249
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-253
-255
-254
-250
-255
-255
-250
-255
-255
-252
-255
-255
-255
-255
-255
-255
-253
-254
-255
-251
-251
-255
-249
-250
-255
-249
-248
-255
-248
-246
-255
-249
-247
-255
-250
-247
-255
-254
-249
-255
-255
-251
-255
-255
-251
-253
-255
-250
-252
-253
-248
-244
-241
-234
-255
-251
-243
-255
-253
-244
-255
-251
-241
-255
-248
-235
-255
-244
-228
-246
-227
-210
-228
-207
-188
-208
-183
-163
-183
-156
-135
-146
-118
-97
-118
-87
-67
-104
-73
-53
-104
-73
-53
-109
-76
-57
-112
-79
-60
-108
-71
-55
-105
-66
-51
-103
-66
-50
-106
-69
-53
-110
-73
-57
-110
-74
-58
-111
-75
-59
-111
-75
-59
-101
-65
-49
-99
-66
-49
-99
-66
-49
-99
-66
-49
-99
-66
-49
-99
-66
-49
-98
-67
-49
-96
-67
-51
-93
-70
-54
-92
-71
-54
-92
-71
-54
-90
-71
-54
-90
-71
-54
-87
-72
-53
-84
-71
-52
-82
-71
-51
-80
-72
-51
-78
-72
-50
-102
-100
-77
-126
-126
-102
-114
-114
-90
-86
-88
-64
-74
-76
-52
-71
-77
-51
-60
-69
-42
-60
-70
-43
-63
-72
-43
-65
-71
-43
-65
-70
-40
-68
-71
-42
-77
-78
-47
-84
-85
-54
-120
-119
-91
-123
-122
-94
-110
-110
-86
-85
-85
-61
-67
-66
-46
-63
-65
-44
-62
-65
-46
-58
-62
-45
-59
-62
-51
-57
-63
-53
-57
-63
-53
-56
-62
-52
-56
-62
-52
-55
-61
-51
-55
-61
-51
-55
-61
-51
-56
-62
-52
-56
-62
-52
-56
-62
-52
-56
-62
-52
-56
-62
-52
-56
-62
-52
-56
-62
-52
-56
-62
-52
-57
-62
-56
-57
-62
-56
-57
-62
-56
-56
-61
-55
-56
-61
-55
-56
-61
-55
-55
-60
-54
-55
-60
-54
-54
-59
-53
-53
-58
-52
-52
-57
-51
-51
-56
-50
-50
-55
-49
-48
-53
-47
-47
-52
-46
-47
-52
-46
-45
-50
-46
-45
-50
-46
-44
-49
-45
-43
-48
-44
-43
-48
-44
-44
-49
-45
-45
-50
-46
-45
-50
-46
-44
-49
-45
-44
-49
-45
-44
-49
-45
-44
-49
-45
-46
-50
-49
-48
-53
-49
-51
-55
-54
-52
-59
-52
-59
-71
-57
-61
-76
-57
-64
-79
-60
-64
-79
-58
-60
-75
-54
-55
-70
-47
-52
-67
-44
-50
-65
-42
-54
-69
-46
-58
-73
-52
-64
-79
-60
-66
-80
-63
-63
-77
-62
-56
-70
-55
-49
-63
-50
-45
-57
-45
-45
-55
-46
-46
-53
-45
-45
-52
-44
-102
-99
-84
-102
-99
-84
-103
-100
-85
-104
-101
-86
-104
-101
-86
-105
-102
-87
-106
-103
-88
-106
-103
-88
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-108
-100
-87
-108
-100
-87
-108
-99
-90
-109
-100
-91
-109
-100
-93
-109
-102
-92
-109
-103
-91
-106
-105
-87
-107
-109
-88
-105
-110
-87
-105
-113
-90
-103
-115
-95
-98
-112
-99
-103
-120
-114
-130
-148
-148
-163
-178
-183
-192
-203
-209
-212
-221
-228
-235
-240
-246
-245
-250
-254
-251
-252
-255
-253
-255
-254
-255
-255
-253
-255
-255
-250
-255
-255
-248
-255
-255
-244
-255
-255
-243
-255
-255
-239
-250
-253
-232
-242
-247
-224
-231
-240
-213
-226
-232
-204
-215
-218
-189
-209
-209
-181
-205
-203
-180
-206
-203
-186
-214
-207
-197
-222
-215
-209
-236
-226
-227
-247
-238
-243
-255
-245
-253
-255
-249
-255
-255
-252
-255
-255
-254
-255
-255
-254
-252
-253
-254
-249
-253
-254
-248
-253
-255
-249
-254
-255
-250
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-254
-253
-254
-255
-254
-255
-255
-254
-255
-255
-254
-255
-255
-254
-255
-253
-254
-255
-250
-253
-254
-248
-253
-253
-245
-251
-251
-241
-252
-252
-244
-254
-253
-248
-255
-254
-250
-255
-255
-253
-254
-254
-254
-254
-252
-255
-254
-252
-255
-251
-246
-252
-255
-250
-254
-254
-248
-250
-249
-244
-241
-253
-246
-240
-255
-254
-244
-255
-254
-241
-255
-254
-237
-255
-248
-230
-252
-239
-220
-242
-227
-208
-226
-209
-189
-205
-187
-167
-179
-161
-141
-155
-134
-115
-140
-117
-99
-122
-93
-75
-125
-94
-76
-116
-85
-67
-97
-68
-50
-87
-58
-40
-89
-60
-42
-91
-62
-44
-88
-61
-42
-96
-69
-50
-96
-69
-50
-96
-69
-50
-95
-70
-50
-96
-71
-51
-96
-71
-51
-96
-71
-51
-93
-72
-51
-92
-75
-55
-92
-77
-58
-92
-77
-58
-89
-76
-57
-88
-77
-57
-85
-77
-56
-82
-76
-54
-81
-76
-54
-78
-76
-53
-81
-81
-57
-105
-107
-83
-124
-128
-103
-109
-113
-88
-83
-89
-63
-70
-76
-50
-62
-71
-44
-60
-70
-43
-60
-70
-43
-63
-72
-43
-68
-74
-46
-69
-74
-44
-68
-71
-42
-72
-73
-42
-76
-77
-46
-121
-120
-92
-116
-115
-87
-102
-100
-77
-84
-82
-59
-76
-73
-54
-75
-74
-54
-70
-69
-51
-60
-61
-45
-60
-63
-52
-57
-63
-53
-57
-63
-53
-57
-63
-53
-56
-62
-52
-56
-62
-52
-56
-62
-52
-56
-62
-52
-55
-61
-51
-55
-61
-51
-56
-62
-52
-56
-62
-52
-56
-62
-52
-56
-62
-52
-57
-63
-53
-57
-63
-53
-58
-63
-57
-58
-63
-57
-58
-63
-57
-58
-63
-57
-57
-62
-56
-57
-62
-56
-57
-62
-56
-56
-61
-55
-56
-61
-55
-56
-61
-55
-55
-60
-54
-54
-59
-53
-53
-58
-52
-52
-57
-51
-51
-56
-50
-51
-56
-50
-47
-52
-48
-46
-51
-47
-45
-50
-46
-44
-49
-45
-43
-48
-44
-43
-48
-44
-43
-48
-44
-43
-48
-44
-43
-48
-44
-44
-49
-45
-45
-49
-48
-46
-50
-49
-47
-51
-50
-47
-51
-50
-47
-51
-50
-45
-52
-45
-51
-63
-49
-55
-70
-51
-61
-76
-55
-64
-79
-58
-63
-78
-55
-60
-75
-52
-57
-72
-49
-56
-71
-48
-53
-68
-45
-56
-71
-48
-60
-75
-54
-62
-77
-58
-60
-74
-57
-55
-69
-54
-49
-63
-50
-45
-57
-45
-44
-54
-45
-46
-53
-45
-45
-52
-44
-102
-99
-84
-102
-99
-84
-103
-100
-85
-104
-101
-86
-104
-101
-86
-105
-102
-87
-106
-103
-88
-106
-103
-88
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-108
-100
-87
-108
-100
-87
-108
-99
-90
-109
-100
-91
-109
-100
-93
-109
-102
-92
-109
-103
-91
-106
-105
-87
-106
-108
-87
-104
-109
-86
-104
-114
-90
-102
-115
-95
-99
-113
-100
-104
-121
-115
-133
-151
-151
-165
-183
-187
-199
-210
-216
-218
-227
-234
-240
-245
-251
-248
-253
-255
-252
-253
-255
-253
-255
-254
-255
-255
-253
-255
-254
-249
-255
-255
-245
-255
-255
-242
-255
-255
-240
-252
-255
-236
-248
-251
-230
-239
-244
-221
-226
-235
-208
-221
-227
-199
-213
-213
-185
-206
-204
-179
-201
-196
-176
-202
-196
-180
-208
-201
-191
-218
-210
-207
-233
-224
-227
-246
-237
-242
-255
-246
-254
-255
-249
-255
-255
-252
-255
-255
-254
-255
-254
-254
-252
-252
-254
-249
-251
-255
-247
-252
-255
-248
-253
-255
-250
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-254
-254
-251
-255
-255
-252
-255
-254
-253
-255
-253
-255
-254
-250
-255
-250
-247
-255
-248
-246
-255
-243
-245
-255
-240
-243
-254
-238
-245
-255
-242
-250
-255
-246
-253
-255
-250
-255
-253
-254
-255
-251
-255
-255
-249
-255
-255
-248
-255
-252
-241
-255
-254
-245
-255
-255
-250
-255
-255
-253
-255
-255
-252
-255
-252
-251
-249
-248
-248
-240
-245
-245
-233
-255
-255
-241
-255
-255
-239
-255
-255
-237
-255
-255
-237
-255
-252
-234
-255
-246
-229
-251
-239
-223
-248
-235
-218
-249
-228
-209
-255
-230
-208
-227
-202
-180
-165
-143
-120
-116
-94
-71
-101
-79
-56
-98
-76
-53
-92
-72
-48
-94
-74
-50
-92
-74
-50
-92
-74
-50
-93
-75
-51
-93
-75
-51
-94
-76
-52
-94
-76
-52
-92
-77
-54
-89
-78
-56
-87
-79
-58
-87
-79
-58
-86
-80
-58
-85
-79
-57
-83
-78
-56
-80
-78
-55
-78
-78
-54
-77
-79
-55
-80
-84
-59
-96
-102
-76
-102
-111
-84
-85
-94
-67
-69
-79
-52
-65
-75
-48
-60
-70
-43
-63
-73
-46
-63
-73
-46
-67
-76
-47
-72
-78
-50
-72
-77
-47
-70
-73
-44
-79
-80
-49
-89
-88
-58
-113
-109
-82
-106
-102
-75
-97
-92
-70
-91
-86
-64
-89
-84
-65
-84
-81
-62
-77
-74
-57
-66
-67
-51
-61
-64
-53
-59
-65
-55
-59
-65
-55
-59
-65
-55
-58
-64
-54
-58
-64
-54
-58
-64
-54
-57
-63
-53
-56
-62
-52
-56
-62
-52
-56
-62
-52
-57
-63
-53
-57
-63
-53
-58
-64
-54
-58
-64
-54
-58
-64
-54
-59
-64
-58
-59
-64
-58
-59
-64
-58
-58
-63
-57
-58
-63
-57
-57
-62
-56
-57
-62
-56
-57
-62
-56
-58
-63
-57
-58
-63
-57
-57
-62
-56
-57
-62
-56
-56
-61
-55
-56
-61
-55
-55
-60
-54
-55
-60
-54
-52
-57
-53
-50
-55
-51
-49
-54
-50
-47
-52
-48
-45
-50
-46
-44
-49
-45
-43
-47
-46
-43
-47
-46
-44
-48
-47
-44
-48
-47
-45
-49
-48
-46
-50
-49
-46
-50
-51
-46
-50
-51
-45
-49
-50
-43
-49
-45
-43
-57
-42
-47
-64
-45
-54
-72
-50
-59
-77
-55
-61
-79
-55
-60
-78
-52
-58
-76
-50
-58
-76
-50
-53
-71
-47
-55
-73
-49
-58
-76
-54
-60
-77
-58
-58
-75
-57
-54
-71
-55
-48
-64
-51
-45
-59
-46
-45
-55
-46
-46
-53
-45
-45
-52
-44
-99
-100
-82
-99
-100
-82
-100
-101
-83
-101
-102
-84
-101
-102
-86
-104
-102
-87
-105
-103
-88
-105
-103
-88
-104
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-105
-102
-87
-107
-101
-87
-107
-101
-87
-107
-101
-87
-108
-100
-89
-108
-101
-91
-109
-100
-93
-109
-102
-92
-107
-103
-91
-106
-105
-87
-105
-107
-86
-104
-109
-87
-104
-114
-90
-103
-116
-96
-100
-113
-103
-106
-123
-117
-137
-155
-157
-170
-187
-194
-205
-216
-222
-223
-232
-239
-242
-249
-255
-250
-255
-255
-251
-255
-255
-253
-255
-254
-254
-255
-250
-254
-254
-246
-250
-250
-238
-250
-251
-237
-250
-251
-233
-248
-250
-229
-244
-246
-225
-234
-238
-215
-223
-227
-202
-217
-219
-195
-211
-209
-184
-204
-199
-177
-197
-190
-172
-198
-190
-177
-204
-195
-188
-214
-206
-204
-230
-221
-224
-244
-234
-242
-253
-246
-254
-254
-249
-255
-255
-253
-255
-254
-254
-255
-253
-253
-251
-252
-254
-249
-251
-255
-249
-252
-255
-250
-253
-255
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-254
-254
-252
-255
-254
-252
-255
-254
-252
-255
-254
-252
-255
-253
-254
-255
-250
-255
-255
-251
-255
-254
-252
-255
-252
-254
-253
-249
-255
-251
-246
-255
-247
-244
-255
-244
-243
-255
-241
-242
-254
-240
-245
-255
-242
-250
-255
-246
-254
-255
-250
-255
-252
-251
-255
-249
-252
-255
-247
-255
-255
-246
-255
-255
-248
-255
-255
-247
-255
-255
-249
-255
-255
-252
-255
-253
-252
-255
-251
-253
-252
-250
-255
-251
-252
-255
-250
-244
-250
-240
-244
-250
-238
-247
-249
-236
-247
-248
-234
-248
-246
-231
-251
-248
-231
-255
-250
-234
-255
-253
-234
-253
-241
-219
-255
-251
-228
-236
-220
-197
-158
-142
-119
-96
-80
-55
-82
-66
-41
-88
-72
-47
-88
-72
-47
-91
-77
-51
-91
-77
-51
-90
-78
-52
-90
-78
-52
-91
-79
-53
-91
-79
-53
-92
-80
-54
-91
-81
-56
-85
-79
-55
-84
-79
-57
-84
-79
-57
-81
-79
-56
-80
-78
-55
-78
-78
-54
-75
-77
-53
-73
-77
-52
-74
-78
-53
-76
-82
-56
-83
-92
-65
-80
-89
-60
-64
-73
-44
-59
-70
-40
-65
-76
-46
-63
-74
-42
-67
-78
-46
-68
-79
-47
-72
-81
-50
-76
-83
-50
-73
-78
-48
-74
-77
-46
-89
-90
-59
-107
-106
-78
-102
-101
-73
-98
-94
-69
-94
-89
-67
-95
-90
-70
-96
-91
-71
-90
-85
-66
-83
-78
-59
-76
-73
-56
-65
-66
-52
-64
-66
-53
-64
-66
-53
-62
-65
-54
-62
-65
-54
-62
-65
-54
-61
-64
-55
-61
-64
-55
-57
-63
-53
-57
-63
-53
-57
-63
-53
-58
-64
-54
-58
-64
-54
-58
-66
-55
-58
-66
-55
-58
-66
-55
-59
-64
-57
-59
-64
-57
-59
-64
-58
-58
-63
-56
-58
-63
-57
-57
-62
-55
-57
-62
-56
-57
-62
-55
-59
-64
-58
-59
-64
-57
-59
-64
-58
-59
-64
-57
-58
-63
-57
-58
-63
-56
-58
-63
-57
-58
-63
-57
-56
-63
-56
-55
-61
-57
-52
-59
-52
-51
-56
-50
-49
-54
-48
-47
-52
-46
-46
-51
-47
-46
-51
-47
-46
-50
-49
-46
-50
-49
-44
-50
-46
-44
-50
-46
-43
-50
-43
-43
-50
-42
-44
-52
-41
-41
-54
-37
-36
-54
-30
-41
-61
-33
-50
-70
-43
-56
-76
-49
-59
-79
-54
-59
-77
-53
-59
-77
-53
-59
-77
-53
-56
-74
-50
-57
-75
-51
-59
-77
-53
-60
-78
-54
-60
-78
-56
-55
-72
-53
-49
-66
-48
-46
-60
-45
-46
-56
-45
-47
-54
-46
-46
-53
-45
-92
-102
-78
-93
-103
-79
-95
-103
-80
-96
-104
-81
-98
-106
-85
-101
-106
-86
-103
-106
-87
-104
-107
-88
-102
-103
-85
-104
-103
-85
-104
-101
-86
-104
-101
-86
-106
-100
-86
-107
-101
-87
-107
-101
-89
-108
-102
-88
-107
-101
-87
-106
-103
-88
-109
-103
-91
-108
-104
-93
-109
-102
-94
-106
-102
-91
-104
-100
-88
-102
-100
-85
-102
-103
-85
-103
-108
-86
-102
-111
-90
-98
-111
-93
-99
-112
-103
-114
-130
-127
-150
-168
-172
-185
-199
-208
-209
-219
-228
-224
-233
-240
-240
-247
-253
-247
-252
-255
-247
-253
-251
-250
-255
-251
-252
-255
-248
-252
-254
-243
-248
-249
-235
-250
-251
-235
-249
-248
-230
-243
-240
-221
-239
-236
-217
-236
-233
-214
-224
-222
-201
-214
-209
-189
-216
-208
-189
-203
-191
-175
-188
-179
-164
-188
-178
-169
-195
-184
-180
-205
-195
-196
-219
-210
-215
-233
-223
-231
-250
-243
-251
-253
-248
-255
-254
-251
-255
-255
-254
-255
-254
-254
-255
-252
-254
-253
-251
-253
-250
-252
-254
-251
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-255
-254
-252
-255
-254
-252
-255
-255
-253
-255
-255
-253
-255
-255
-251
-255
-254
-250
-255
-253
-250
-255
-252
-249
-255
-252
-249
-255
-252
-249
-255
-254
-255
-255
-253
-254
-253
-253
-253
-253
-253
-253
-254
-255
-255
-254
-255
-253
-251
-255
-252
-249
-254
-248
-253
-255
-250
-251
-252
-246
-253
-252
-247
-255
-255
-250
-255
-254
-248
-255
-249
-244
-255
-247
-243
-255
-250
-249
-255
-251
-255
-255
-252
-255
-254
-253
-255
-254
-255
-255
-254
-255
-255
-251
-255
-252
-251
-255
-252
-250
-254
-253
-252
-255
-255
-252
-255
-255
-255
-255
-253
-255
-254
-249
-255
-254
-242
-255
-254
-237
-255
-254
-234
-255
-254
-232
-251
-245
-223
-255
-252
-230
-233
-225
-202
-145
-137
-114
-86
-79
-53
-88
-78
-51
-85
-76
-47
-83
-74
-45
-87
-78
-49
-87
-78
-49
-85
-78
-49
-85
-78
-49
-84
-79
-50
-84
-79
-50
-84
-78
-52
-83
-79
-52
-81
-77
-50
-82
-78
-53
-80
-78
-53
-80
-80
-54
-77
-79
-55
-75
-79
-54
-72
-77
-54
-71
-76
-53
-74
-80
-54
-70
-79
-52
-65
-74
-45
-61
-70
-39
-62
-72
-38
-68
-75
-42
-70
-77
-43
-68
-78
-41
-77
-88
-48
-75
-87
-47
-70
-81
-41
-67
-77
-40
-79
-86
-52
-94
-99
-67
-96
-99
-68
-90
-90
-62
-89
-89
-63
-91
-89
-66
-95
-90
-68
-95
-90
-70
-95
-88
-69
-92
-85
-66
-88
-81
-62
-85
-78
-59
-75
-70
-51
-71
-68
-49
-68
-65
-48
-65
-63
-48
-64
-62
-49
-62
-62
-50
-63
-63
-53
-63
-65
-54
-60
-63
-54
-58
-64
-54
-58
-64
-54
-57
-65
-54
-57
-65
-52
-55
-66
-52
-55
-66
-52
-55
-66
-52
-58
-66
-55
-57
-65
-54
-57
-64
-56
-56
-64
-53
-56
-63
-55
-57
-65
-54
-57
-64
-56
-58
-66
-55
-58
-65
-57
-58
-66
-55
-57
-64
-56
-58
-66
-55
-59
-66
-58
-60
-68
-57
-61
-68
-60
-62
-69
-61
-56
-66
-58
-55
-65
-57
-55
-65
-56
-55
-63
-52
-53
-61
-48
-51
-59
-46
-50
-56
-46
-49
-54
-48
-46
-52
-48
-47
-53
-49
-45
-55
-47
-45
-57
-45
-46
-59
-41
-48
-64
-38
-54
-71
-39
-55
-77
-39
-59
-86
-43
-59
-88
-44
-60
-86
-49
-59
-84
-52
-59
-82
-56
-60
-79
-57
-61
-78
-59
-61
-79
-57
-58
-76
-54
-63
-81
-55
-68
-86
-60
-68
-87
-59
-67
-87
-60
-64
-84
-59
-55
-74
-52
-46
-63
-44
-45
-55
-44
-44
-51
-43
-41
-48
-40
-89
-103
-77
-90
-104
-78
-92
-104
-80
-93
-105
-81
-97
-107
-83
-98
-108
-84
-103
-108
-88
-103
-108
-88
-103
-104
-86
-103
-104
-86
-105
-102
-87
-105
-102
-87
-107
-101
-87
-108
-102
-88
-109
-101
-90
-109
-103
-89
-108
-102
-88
-106
-103
-88
-107
-103
-91
-108
-104
-93
-107
-103
-94
-106
-102
-91
-104
-102
-90
-101
-102
-86
-104
-105
-87
-103
-108
-86
-103
-112
-93
-102
-115
-98
-106
-119
-110
-121
-137
-136
-156
-171
-178
-186
-200
-209
-208
-218
-227
-224
-233
-238
-240
-247
-253
-246
-254
-255
-249
-255
-253
-249
-255
-249
-251
-254
-245
-249
-253
-239
-249
-250
-236
-248
-249
-231
-246
-243
-226
-238
-235
-216
-235
-230
-211
-230
-225
-206
-221
-214
-196
-210
-201
-184
-203
-191
-175
-193
-179
-166
-184
-172
-160
-187
-174
-166
-194
-183
-181
-205
-195
-196
-219
-208
-214
-228
-221
-228
-251
-243
-254
-253
-247
-255
-254
-251
-255
-255
-254
-255
-254
-253
-255
-252
-253
-255
-252
-254
-253
-252
-254
-253
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-255
-254
-252
-255
-254
-252
-255
-255
-253
-255
-255
-253
-255
-253
-250
-255
-253
-250
-255
-253
-250
-255
-252
-249
-255
-252
-248
-255
-253
-248
-255
-254
-253
-255
-254
-252
-253
-253
-253
-253
-253
-253
-255
-255
-255
-255
-255
-255
-254
-254
-254
-253
-253
-253
-255
-255
-253
-255
-255
-251
-255
-252
-249
-254
-247
-241
-245
-236
-229
-238
-228
-219
-244
-231
-222
-250
-241
-234
-255
-252
-253
-254
-254
-255
-253
-255
-254
-254
-255
-253
-252
-255
-251
-251
-255
-250
-251
-255
-254
-250
-254
-255
-252
-255
-255
-252
-255
-255
-255
-254
-255
-254
-254
-252
-255
-253
-244
-255
-254
-236
-255
-253
-231
-255
-254
-229
-248
-246
-223
-254
-252
-231
-229
-224
-202
-141
-137
-112
-83
-77
-51
-84
-79
-50
-82
-75
-46
-81
-74
-45
-85
-79
-47
-85
-79
-47
-84
-79
-49
-84
-79
-49
-83
-79
-50
-83
-79
-50
-81
-80
-52
-81
-80
-52
-81
-77
-50
-79
-78
-50
-80
-78
-53
-78
-81
-54
-77
-79
-55
-74
-80
-54
-72
-77
-54
-69
-77
-53
-71
-80
-53
-69
-78
-49
-65
-74
-45
-63
-73
-39
-66
-73
-40
-70
-77
-43
-74
-80
-44
-74
-82
-43
-75
-86
-43
-75
-88
-42
-82
-93
-51
-89
-100
-60
-93
-101
-64
-87
-94
-60
-83
-88
-58
-83
-86
-57
-85
-85
-61
-86
-86
-62
-90
-85
-65
-91
-86
-66
-92
-85
-66
-92
-84
-65
-90
-82
-61
-89
-81
-60
-82
-76
-54
-80
-74
-52
-75
-70
-51
-72
-67
-48
-67
-64
-49
-65
-63
-50
-66
-64
-52
-63
-65
-54
-61
-62
-54
-58
-64
-54
-58
-64
-54
-57
-65
-54
-55
-66
-52
-55
-66
-52
-54
-67
-50
-54
-67
-50
-58
-66
-55
-57
-65
-54
-57
-65
-54
-56
-64
-53
-56
-64
-53
-57
-65
-54
-57
-65
-54
-58
-66
-55
-58
-66
-55
-58
-66
-55
-58
-66
-55
-58
-66
-55
-59
-67
-56
-60
-68
-57
-61
-69
-58
-60
-70
-59
-61
-71
-63
-60
-72
-62
-60
-70
-59
-60
-71
-55
-60
-68
-53
-58
-66
-51
-57
-63
-51
-56
-61
-54
-55
-62
-55
-52
-62
-54
-51
-61
-52
-48
-62
-45
-51
-67
-41
-57
-77
-42
-66
-89
-47
-71
-97
-49
-79
-112
-59
-76
-110
-59
-76
-105
-61
-70
-97
-62
-66
-89
-63
-60
-82
-61
-59
-76
-58
-58
-75
-56
-61
-79
-57
-68
-86
-60
-74
-93
-65
-76
-95
-65
-75
-95
-67
-72
-92
-64
-60
-83
-57
-51
-70
-48
-43
-53
-42
-43
-50
-42
-40
-47
-39
-89
-103
-77
-90
-104
-78
-92
-104
-80
-94
-106
-82
-97
-107
-83
-99
-109
-85
-103
-108
-88
-104
-109
-89
-105
-106
-88
-105
-106
-88
-107
-104
-89
-107
-104
-89
-108
-102
-88
-109
-103
-89
-110
-102
-91
-110
-104
-90
-108
-102
-88
-107
-104
-89
-107
-103
-91
-107
-103
-92
-107
-103
-94
-106
-102
-91
-104
-102
-90
-101
-102
-86
-104
-105
-87
-101
-106
-84
-100
-109
-90
-103
-116
-99
-111
-124
-115
-127
-143
-142
-157
-172
-179
-182
-196
-205
-204
-214
-223
-221
-230
-235
-239
-246
-252
-246
-254
-255
-249
-255
-253
-248
-255
-248
-248
-251
-242
-245
-249
-235
-244
-245
-231
-241
-242
-224
-236
-233
-216
-226
-223
-204
-222
-217
-198
-216
-211
-192
-208
-201
-183
-199
-190
-173
-192
-180
-164
-188
-174
-161
-187
-175
-163
-194
-181
-173
-204
-193
-191
-215
-205
-206
-227
-216
-222
-234
-227
-234
-251
-243
-254
-253
-247
-255
-254
-251
-255
-254
-253
-255
-253
-252
-255
-252
-253
-255
-252
-254
-253
-253
-255
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-255
-254
-252
-255
-254
-252
-255
-255
-253
-255
-254
-252
-255
-253
-250
-255
-253
-250
-255
-252
-249
-255
-252
-249
-255
-252
-248
-255
-253
-248
-255
-254
-253
-254
-253
-251
-252
-252
-252
-253
-253
-253
-254
-254
-254
-255
-255
-255
-254
-254
-254
-253
-253
-253
-255
-255
-253
-255
-255
-251
-255
-253
-250
-249
-242
-236
-232
-223
-216
-223
-213
-204
-234
-221
-212
-246
-237
-230
-255
-252
-253
-254
-254
-255
-253
-255
-254
-254
-255
-253
-252
-255
-251
-251
-255
-250
-251
-255
-254
-250
-254
-255
-252
-255
-255
-252
-255
-255
-255
-254
-255
-254
-254
-252
-255
-253
-244
-255
-254
-236
-255
-253
-231
-255
-254
-229
-249
-247
-224
-254
-252
-231
-228
-223
-201
-138
-134
-109
-80
-74
-48
-82
-77
-48
-82
-75
-46
-82
-75
-46
-84
-78
-46
-85
-79
-47
-84
-79
-49
-85
-80
-50
-84
-80
-51
-83
-79
-50
-81
-80
-52
-80
-79
-51
-81
-77
-50
-79
-78
-50
-80
-78
-53
-77
-80
-53
-77
-79
-55
-74
-80
-54
-73
-78
-55
-70
-78
-54
-72
-81
-54
-69
-78
-49
-67
-76
-47
-66
-76
-42
-70
-77
-44
-73
-80
-46
-79
-85
-49
-81
-89
-50
-80
-91
-48
-85
-98
-52
-103
-116
-73
-119
-130
-90
-112
-120
-83
-88
-95
-61
-76
-81
-51
-78
-81
-52
-80
-80
-56
-81
-81
-57
-84
-79
-59
-85
-80
-60
-87
-80
-61
-88
-81
-62
-91
-83
-62
-92
-84
-63
-89
-83
-61
-86
-80
-58
-81
-76
-57
-77
-72
-53
-71
-68
-53
-68
-66
-53
-67
-65
-53
-63
-65
-54
-61
-62
-54
-58
-64
-54
-58
-64
-54
-57
-65
-54
-55
-66
-52
-55
-66
-52
-54
-67
-50
-54
-67
-50
-58
-66
-55
-58
-66
-55
-57
-65
-54
-57
-65
-54
-57
-65
-54
-57
-65
-54
-58
-66
-55
-58
-66
-55
-58
-66
-55
-58
-66
-55
-58
-66
-55
-58
-66
-55
-59
-67
-56
-60
-68
-57
-62
-70
-59
-60
-70
-59
-64
-74
-66
-63
-75
-65
-64
-74
-63
-64
-75
-59
-65
-73
-58
-63
-71
-56
-63
-69
-57
-62
-67
-60
-62
-69
-62
-57
-67
-59
-54
-64
-55
-52
-66
-49
-57
-73
-47
-66
-86
-51
-80
-103
-61
-88
-114
-66
-94
-127
-74
-91
-125
-74
-87
-116
-72
-77
-104
-69
-67
-90
-64
-57
-79
-58
-54
-71
-53
-52
-69
-50
-60
-78
-56
-69
-87
-61
-77
-96
-68
-82
-101
-71
-82
-102
-74
-78
-98
-70
-65
-88
-62
-56
-75
-53
-47
-57
-46
-47
-54
-46
-44
-51
-43
-89
-103
-77
-90
-104
-78
-92
-104
-80
-94
-106
-82
-98
-108
-84
-100
-110
-86
-104
-109
-89
-105
-110
-90
-107
-108
-90
-107
-108
-90
-109
-106
-91
-108
-105
-90
-110
-104
-90
-110
-104
-90
-111
-103
-92
-111
-105
-91
-109
-103
-89
-107
-104
-89
-107
-103
-91
-107
-103
-92
-106
-102
-93
-106
-102
-91
-104
-102
-90
-102
-103
-87
-102
-103
-85
-97
-102
-80
-95
-104
-85
-100
-113
-96
-112
-125
-116
-127
-143
-142
-151
-166
-173
-171
-185
-194
-199
-209
-218
-217
-226
-231
-237
-244
-250
-245
-253
-255
-248
-254
-252
-245
-252
-245
-243
-246
-237
-238
-242
-228
-234
-235
-221
-228
-229
-211
-221
-218
-201
-212
-209
-190
-208
-203
-184
-202
-197
-178
-195
-188
-170
-189
-180
-163
-196
-184
-168
-198
-184
-171
-203
-191
-179
-213
-200
-192
-224
-213
-211
-234
-224
-225
-244
-233
-239
-248
-241
-248
-252
-244
-255
-253
-247
-255
-254
-251
-255
-254
-253
-255
-253
-252
-255
-251
-252
-254
-252
-254
-253
-253
-255
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-255
-254
-252
-255
-254
-252
-255
-254
-252
-255
-254
-252
-255
-253
-250
-255
-252
-249
-255
-252
-249
-255
-252
-249
-255
-251
-247
-255
-252
-247
-255
-253
-252
-253
-252
-250
-251
-251
-251
-252
-252
-252
-254
-254
-254
-255
-255
-255
-254
-254
-254
-253
-253
-253
-254
-253
-251
-255
-255
-251
-255
-253
-250
-250
-243
-237
-234
-225
-218
-227
-217
-208
-239
-226
-217
-251
-242
-235
-255
-252
-253
-254
-254
-255
-253
-255
-254
-254
-255
-253
-252
-255
-251
-251
-255
-250
-251
-255
-254
-250
-254
-255
-252
-255
-255
-252
-255
-255
-255
-254
-255
-254
-254
-252
-255
-253
-244
-255
-254
-236
-255
-252
-230
-255
-253
-228
-252
-250
-227
-255
-254
-233
-228
-223
-201
-137
-133
-108
-80
-74
-48
-82
-77
-48
-84
-77
-48
-84
-77
-48
-84
-78
-46
-85
-79
-47
-85
-80
-50
-85
-80
-50
-84
-80
-51
-83
-79
-50
-80
-79
-51
-79
-78
-50
-81
-77
-50
-79
-78
-50
-79
-77
-52
-76
-79
-52
-76
-78
-54
-74
-80
-54
-74
-79
-56
-71
-79
-55
-74
-83
-56
-71
-80
-51
-70
-79
-50
-72
-82
-48
-76
-83
-50
-78
-85
-51
-85
-91
-55
-91
-99
-60
-103
-114
-71
-115
-128
-82
-135
-148
-105
-144
-156
-116
-133
-143
-106
-110
-117
-83
-90
-95
-65
-82
-87
-57
-79
-79
-55
-78
-78
-54
-80
-75
-55
-79
-74
-54
-82
-75
-56
-85
-78
-59
-89
-81
-60
-91
-83
-62
-90
-84
-62
-88
-82
-60
-84
-79
-60
-80
-75
-56
-74
-71
-56
-71
-69
-56
-69
-67
-55
-65
-67
-56
-61
-62
-54
-58
-64
-54
-58
-64
-54
-57
-65
-54
-55
-66
-52
-55
-66
-52
-54
-67
-50
-54
-67
-50
-59
-67
-56
-58
-66
-55
-57
-65
-54
-57
-65
-54
-57
-65
-54
-57
-65
-54
-58
-66
-55
-59
-67
-56
-59
-67
-56
-58
-66
-55
-58
-66
-55
-59
-67
-56
-59
-67
-56
-61
-69
-58
-62
-70
-59
-61
-71
-60
-61
-71
-63
-60
-72
-62
-62
-72
-61
-62
-73
-57
-64
-72
-57
-63
-71
-56
-63
-69
-57
-63
-68
-61
-61
-68
-61
-57
-67
-59
-54
-64
-55
-52
-66
-49
-57
-73
-47
-68
-88
-53
-82
-105
-63
-91
-117
-69
-89
-122
-69
-87
-121
-70
-84
-113
-69
-73
-100
-65
-62
-85
-59
-51
-73
-52
-48
-65
-47
-46
-63
-44
-54
-72
-50
-64
-82
-56
-75
-94
-66
-82
-101
-71
-83
-103
-75
-79
-99
-71
-65
-88
-62
-54
-73
-51
-49
-59
-48
-48
-55
-47
-45
-52
-44
-89
-103
-77
-90
-104
-78
-92
-104
-80
-94
-106
-82
-98
-108
-84
-100
-110
-86
-105
-110
-90
-106
-111
-91
-109
-110
-92
-108
-109
-91
-110
-107
-92
-109
-106
-91
-110
-104
-90
-110
-104
-90
-112
-104
-93
-111
-105
-91
-109
-103
-89
-107
-104
-89
-106
-102
-90
-106
-102
-91
-105
-101
-92
-105
-101
-90
-104
-102
-90
-102
-103
-87
-103
-104
-86
-97
-102
-80
-94
-103
-84
-100
-113
-96
-112
-125
-116
-125
-141
-140
-145
-160
-167
-161
-175
-184
-194
-204
-213
-214
-223
-228
-234
-241
-247
-243
-251
-253
-245
-251
-249
-242
-249
-242
-239
-242
-233
-233
-237
-223
-227
-228
-214
-218
-219
-201
-211
-208
-191
-204
-201
-182
-201
-196
-177
-195
-190
-171
-190
-183
-165
-187
-178
-161
-202
-190
-174
-209
-195
-182
-218
-206
-194
-229
-216
-208
-238
-227
-225
-248
-238
-239
-255
-245
-251
-255
-249
-255
-252
-244
-255
-253
-247
-255
-253
-250
-255
-253
-252
-255
-252
-251
-255
-251
-252
-254
-252
-254
-253
-254
-255
-255
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-254
-255
-254
-252
-255
-254
-252
-255
-254
-252
-255
-254
-252
-255
-252
-249
-255
-252
-249
-255
-252
-249
-255
-251
-248
-255
-251
-247
-255
-252
-247
-255
-252
-251
-252
-251
-249
-251
-251
-251
-252
-252
-252
-254
-254
-254
-255
-255
-255
-254
-254
-254
-253
-253
-253
-254
-253
-251
-254
-253
-249
-255
-252
-249
-254
-247
-241
-245
-236
-229
-239
-229
-220
-247
-234
-225
-254
-245
-238
-255
-252
-253
-254
-254
-255
-253
-255
-254
-254
-255
-253
-252
-255
-251
-251
-255
-250
-251
-255
-254
-250
-254
-255
-251
-255
-255
-251
-255
-255
-254
-253
-255
-254
-254
-252
-255
-254
-245
-255
-254
-236
-255
-252
-230
-255
-252
-227
-254
-252
-229
-255
-255
-235
-229
-224
-202
-138
-134
-109
-81
-75
-49
-84
-79
-50
-86
-79
-50
-87
-80
-51
-84
-78
-46
-85
-79
-47
-86
-81
-51
-86
-81
-51
-85
-81
-52
-83
-79
-50
-79
-78
-50
-78
-77
-49
-81
-77
-50
-79
-78
-50
-79
-77
-52
-76
-79
-52
-76
-78
-54
-74
-80
-54
-74
-79
-56
-73
-81
-57
-76
-85
-58
-73
-82
-53
-74
-83
-54
-78
-88
-54
-81
-88
-55
-82
-89
-55
-91
-97
-61
-99
-107
-68
-129
-142
-98
-146
-162
-115
-161
-174
-131
-157
-169
-129
-148
-158
-121
-138
-145
-111
-115
-120
-90
-90
-95
-65
-80
-80
-56
-78
-78
-54
-78
-73
-53
-76
-71
-51
-78
-71
-52
-81
-74
-55
-86
-78
-57
-88
-80
-59
-88
-82
-60
-86
-80
-58
-83
-78
-59
-80
-75
-56
-76
-73
-58
-73
-71
-58
-71
-69
-57
-67
-69
-58
-61
-62
-54
-58
-64
-54
-58
-64
-54
-57
-65
-54
-55
-66
-52
-55
-66
-52
-54
-67
-50
-54
-67
-50
-59
-67
-56
-59
-67
-56
-58
-66
-55
-57
-65
-54
-57
-65
-54
-58
-66
-55
-59
-67
-56
-59
-67
-56
-59
-67
-56
-59
-67
-56
-59
-67
-56
-59
-67
-56
-60
-68
-57
-61
-69
-58
-62
-70
-59
-61
-71
-60
-59
-69
-61
-58
-70
-60
-60
-70
-59
-60
-71
-55
-62
-70
-55
-61
-69
-54
-62
-68
-56
-61
-66
-59
-58
-65
-58
-55
-65
-57
-53
-63
-54
-52
-66
-49
-57
-73
-47
-66
-86
-51
-78
-101
-59
-85
-111
-63
-83
-116
-63
-81
-115
-64
-79
-108
-64
-69
-96
-61
-57
-80
-54
-46
-68
-47
-44
-61
-43
-44
-61
-42
-49
-67
-45
-60
-78
-52
-73
-92
-64
-80
-99
-69
-82
-102
-74
-78
-98
-70
-63
-86
-60
-52
-71
-49
-43
-53
-42
-43
-50
-42
-40
-47
-39
diff --git a/hl/tools/h52jpeg/image8.txt b/hl/tools/h52jpeg/image8.txt
deleted file mode 100644
index 4ba5980..0000000
--- a/hl/tools/h52jpeg/image8.txt
+++ /dev/null
@@ -1,120006 +0,0 @@
-components
-1
-height
-400
-width
-300
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-12
-8
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-61
-52
-39
-25
-10
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-93
-86
-77
-65
-48
-16
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-108
-106
-104
-99
-88
-48
-23
-8
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-109
-107
-106
-106
-105
-98
-60
-26
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-107
-105
-104
-104
-105
-105
-100
-73
-37
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-108
-105
-104
-104
-105
-105
-104
-93
-69
-29
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-109
-105
-103
-103
-104
-106
-106
-103
-89
-59
-12
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-111
-105
-103
-103
-104
-106
-107
-106
-100
-86
-29
-10
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-113
-105
-102
-101
-102
-105
-107
-108
-106
-100
-55
-20
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-115
-107
-102
-101
-100
-101
-104
-107
-108
-107
-88
-42
-15
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-118
-109
-103
-100
-99
-100
-102
-105
-108
-108
-99
-63
-30
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-119
-111
-104
-100
-97
-100
-101
-103
-106
-109
-105
-82
-48
-17
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-2
-3
-3
-4
-5
-6
-7
-7
-8
-9
-9
-9
-9
-9
-8
-7
-7
-6
-4
-3
-2
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-119
-113
-106
-100
-97
-100
-101
-102
-104
-108
-108
-95
-65
-30
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-3
-4
-6
-7
-9
-11
-13
-16
-18
-20
-22
-24
-26
-27
-27
-28
-28
-27
-25
-24
-22
-20
-16
-13
-11
-8
-6
-3
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-119
-115
-109
-102
-97
-100
-103
-104
-104
-106
-108
-103
-79
-46
-15
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-4
-6
-9
-12
-17
-21
-25
-30
-34
-40
-44
-48
-52
-55
-58
-60
-61
-62
-62
-60
-58
-56
-52
-48
-41
-35
-29
-23
-18
-11
-7
-4
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-115
-114
-111
-106
-99
-97
-104
-106
-106
-106
-107
-106
-91
-65
-30
-7
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-3
-6
-9
-13
-20
-26
-33
-41
-49
-59
-66
-74
-80
-87
-94
-98
-102
-106
-109
-112
-113
-114
-115
-115
-115
-114
-112
-109
-105
-98
-91
-82
-72
-61
-46
-36
-26
-18
-12
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-109
-111
-110
-107
-103
-97
-104
-107
-108
-107
-107
-107
-97
-77
-44
-16
-7
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-4
-6
-11
-17
-24
-31
-40
-52
-62
-71
-79
-87
-95
-100
-104
-107
-110
-113
-115
-117
-119
-120
-121
-122
-123
-124
-124
-125
-125
-124
-124
-123
-120
-118
-113
-108
-101
-87
-75
-62
-49
-36
-21
-13
-7
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-102
-104
-106
-107
-106
-98
-101
-106
-109
-108
-108
-107
-101
-85
-56
-27
-14
-6
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-6
-10
-15
-22
-33
-43
-53
-64
-74
-85
-93
-99
-104
-109
-113
-115
-117
-119
-120
-121
-122
-123
-124
-124
-125
-126
-126
-127
-128
-128
-129
-129
-129
-129
-129
-129
-127
-125
-122
-115
-106
-96
-84
-70
-50
-37
-25
-16
-9
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-95
-97
-101
-104
-106
-100
-99
-104
-109
-110
-108
-108
-104
-92
-67
-38
-23
-12
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-3
-6
-12
-18
-27
-36
-48
-63
-75
-85
-95
-103
-110
-113
-116
-117
-118
-119
-120
-120
-121
-121
-122
-122
-122
-123
-123
-124
-124
-125
-126
-126
-127
-128
-129
-129
-130
-130
-130
-131
-131
-130
-129
-127
-122
-114
-104
-85
-69
-53
-38
-25
-11
-6
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-90
-92
-95
-99
-105
-105
-98
-102
-108
-111
-110
-109
-106
-98
-79
-48
-33
-19
-9
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-5
-10
-17
-29
-41
-55
-69
-83
-99
-107
-112
-115
-116
-117
-118
-118
-119
-119
-120
-120
-120
-120
-120
-119
-119
-119
-119
-119
-119
-119
-120
-121
-122
-123
-124
-126
-127
-128
-129
-130
-131
-131
-131
-131
-131
-131
-129
-128
-120
-108
-91
-73
-53
-31
-18
-10
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-89
-90
-93
-96
-99
-105
-100
-98
-101
-110
-111
-110
-108
-101
-85
-68
-54
-37
-21
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-9
-16
-26
-38
-52
-74
-88
-100
-109
-114
-115
-116
-117
-117
-118
-118
-117
-117
-115
-113
-111
-110
-109
-108
-108
-108
-109
-109
-110
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-121
-123
-124
-126
-128
-129
-131
-131
-131
-131
-132
-131
-130
-127
-120
-108
-83
-62
-43
-26
-14
-4
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-88
-89
-91
-95
-98
-104
-103
-99
-98
-106
-110
-110
-108
-102
-90
-71
-62
-50
-36
-18
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-8
-15
-29
-42
-58
-73
-88
-102
-108
-111
-114
-116
-116
-116
-116
-115
-113
-110
-108
-107
-106
-105
-105
-105
-106
-106
-107
-107
-108
-109
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-123
-124
-125
-126
-128
-129
-130
-131
-132
-132
-132
-131
-129
-126
-115
-101
-83
-63
-44
-21
-11
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-87
-88
-90
-93
-99
-103
-104
-101
-97
-99
-107
-109
-108
-103
-92
-74
-65
-57
-47
-31
-9
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-8
-15
-25
-38
-59
-74
-88
-99
-107
-114
-115
-115
-115
-115
-113
-111
-109
-107
-105
-103
-102
-102
-102
-102
-103
-104
-105
-106
-108
-109
-111
-112
-113
-114
-116
-117
-118
-118
-119
-119
-120
-120
-120
-121
-122
-122
-123
-124
-125
-126
-128
-129
-130
-131
-132
-132
-133
-133
-133
-130
-124
-113
-99
-81
-53
-34
-20
-10
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-87
-87
-88
-92
-100
-103
-104
-103
-99
-93
-101
-104
-105
-101
-93
-75
-66
-60
-54
-44
-18
-7
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-4
-11
-22
-35
-51
-68
-90
-102
-110
-114
-115
-115
-115
-113
-111
-110
-106
-103
-100
-99
-98
-99
-100
-101
-102
-104
-106
-108
-110
-113
-115
-118
-120
-123
-124
-126
-128
-129
-130
-130
-130
-130
-129
-129
-128
-127
-126
-126
-126
-126
-126
-126
-127
-128
-129
-130
-131
-132
-133
-133
-134
-134
-133
-131
-125
-115
-90
-68
-46
-27
-13
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-87
-87
-88
-92
-102
-105
-105
-104
-102
-95
-90
-97
-99
-97
-93
-76
-66
-61
-57
-54
-32
-13
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-6
-12
-28
-46
-66
-86
-104
-113
-114
-115
-115
-115
-114
-112
-107
-102
-98
-95
-95
-96
-96
-98
-99
-101
-103
-106
-109
-114
-119
-124
-129
-133
-138
-142
-145
-148
-150
-152
-153
-153
-153
-152
-150
-149
-147
-144
-142
-138
-136
-133
-131
-129
-128
-128
-128
-129
-129
-130
-131
-132
-133
-134
-134
-135
-135
-134
-133
-125
-108
-84
-58
-33
-11
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-90
-90
-91
-95
-104
-108
-107
-106
-104
-102
-91
-86
-86
-89
-89
-83
-71
-63
-60
-58
-48
-25
-10
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-13
-26
-44
-74
-94
-107
-113
-114
-115
-115
-114
-112
-108
-100
-96
-94
-93
-93
-95
-96
-97
-100
-103
-110
-117
-125
-133
-141
-151
-158
-164
-169
-174
-178
-181
-183
-185
-186
-187
-187
-187
-187
-186
-185
-183
-182
-179
-176
-172
-168
-164
-159
-154
-148
-143
-139
-136
-133
-132
-132
-132
-133
-133
-134
-135
-135
-135
-135
-134
-132
-125
-110
-87
-49
-25
-11
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-93
-93
-96
-102
-107
-108
-107
-106
-105
-104
-96
-88
-83
-81
-82
-80
-75
-69
-64
-61
-55
-35
-16
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-9
-20
-38
-59
-81
-101
-108
-112
-114
-114
-113
-110
-105
-100
-96
-93
-92
-92
-93
-94
-98
-102
-109
-117
-127
-139
-149
-157
-164
-171
-178
-182
-185
-187
-189
-191
-192
-193
-193
-194
-194
-194
-193
-193
-193
-192
-191
-189
-188
-186
-184
-181
-179
-176
-173
-169
-164
-160
-155
-150
-143
-140
-137
-135
-134
-134
-135
-135
-135
-135
-135
-134
-132
-127
-117
-89
-61
-36
-17
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-96
-97
-101
-106
-109
-109
-107
-106
-105
-105
-101
-95
-87
-80
-77
-76
-75
-71
-67
-63
-59
-43
-23
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-9
-27
-47
-69
-88
-103
-112
-113
-113
-113
-111
-105
-100
-96
-92
-90
-91
-92
-94
-98
-103
-114
-123
-134
-145
-155
-167
-174
-179
-184
-188
-192
-193
-195
-195
-196
-196
-196
-196
-196
-195
-195
-194
-194
-193
-193
-192
-192
-191
-190
-189
-188
-186
-185
-183
-182
-179
-177
-174
-170
-166
-160
-155
-150
-145
-141
-138
-136
-136
-135
-135
-135
-135
-135
-134
-131
-117
-96
-71
-44
-22
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-99
-100
-104
-109
-110
-108
-106
-105
-105
-105
-104
-101
-95
-86
-76
-72
-72
-71
-69
-66
-62
-50
-30
-11
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-5
-13
-26
-55
-78
-96
-108
-112
-113
-112
-111
-108
-103
-95
-91
-89
-89
-89
-93
-97
-103
-112
-122
-139
-152
-163
-172
-180
-187
-190
-193
-195
-196
-196
-196
-196
-196
-196
-195
-194
-193
-192
-191
-189
-188
-187
-186
-186
-185
-185
-185
-185
-185
-185
-184
-184
-183
-183
-182
-181
-181
-179
-178
-174
-170
-165
-159
-153
-146
-142
-139
-137
-136
-136
-135
-135
-135
-135
-132
-123
-105
-80
-51
-19
-8
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-102
-103
-107
-110
-110
-104
-103
-103
-104
-105
-105
-105
-101
-94
-81
-70
-69
-69
-68
-67
-64
-56
-36
-15
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-14
-30
-55
-93
-104
-110
-113
-114
-112
-110
-104
-97
-90
-87
-87
-87
-89
-91
-99
-110
-124
-140
-155
-171
-180
-186
-190
-193
-195
-196
-197
-197
-197
-197
-196
-195
-193
-192
-189
-186
-184
-181
-179
-175
-173
-172
-170
-169
-169
-169
-170
-171
-173
-175
-177
-178
-179
-180
-181
-181
-181
-180
-179
-178
-178
-176
-173
-170
-162
-155
-149
-143
-139
-137
-136
-136
-135
-135
-135
-134
-129
-116
-92
-47
-23
-9
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-103
-105
-108
-110
-110
-103
-101
-102
-103
-105
-105
-105
-103
-98
-87
-70
-68
-67
-67
-66
-65
-60
-42
-20
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-7
-23
-47
-75
-100
-109
-112
-113
-113
-111
-104
-95
-89
-86
-84
-86
-88
-92
-100
-111
-135
-151
-165
-177
-185
-191
-194
-195
-196
-197
-197
-196
-195
-194
-192
-189
-185
-181
-177
-172
-165
-159
-154
-149
-144
-138
-134
-130
-127
-125
-123
-123
-124
-125
-127
-132
-136
-141
-146
-151
-158
-164
-169
-173
-176
-177
-177
-177
-176
-175
-174
-172
-168
-163
-156
-146
-141
-138
-136
-136
-135
-135
-135
-132
-128
-104
-68
-37
-14
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-104
-105
-107
-109
-110
-103
-101
-101
-102
-104
-104
-104
-101
-95
-86
-70
-67
-66
-66
-66
-65
-61
-44
-23
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-7
-27
-54
-79
-97
-107
-112
-112
-111
-108
-101
-92
-87
-85
-85
-86
-90
-99
-112
-128
-144
-164
-175
-183
-188
-193
-195
-196
-196
-196
-195
-194
-192
-189
-185
-180
-173
-167
-160
-153
-145
-135
-128
-122
-115
-110
-103
-99
-95
-92
-89
-87
-87
-87
-87
-88
-91
-94
-98
-103
-108
-117
-125
-133
-141
-149
-159
-165
-170
-173
-174
-174
-173
-172
-170
-167
-161
-154
-148
-142
-138
-136
-136
-135
-134
-133
-124
-104
-76
-45
-18
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-103
-105
-107
-109
-110
-105
-102
-101
-102
-104
-104
-102
-97
-91
-84
-71
-66
-65
-65
-65
-65
-62
-46
-24
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-10
-24
-58
-82
-98
-107
-111
-112
-110
-105
-98
-91
-84
-83
-84
-87
-92
-106
-122
-138
-155
-170
-182
-188
-192
-195
-196
-196
-196
-195
-193
-191
-186
-182
-176
-169
-162
-151
-142
-133
-124
-115
-104
-97
-91
-85
-80
-76
-73
-71
-69
-67
-66
-66
-66
-66
-66
-68
-69
-72
-74
-78
-84
-89
-96
-103
-112
-125
-135
-145
-153
-161
-168
-171
-172
-172
-171
-168
-164
-159
-154
-147
-141
-138
-136
-135
-135
-133
-124
-107
-81
-48
-15
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-103
-104
-106
-108
-109
-106
-103
-102
-103
-104
-103
-99
-92
-85
-82
-74
-67
-64
-64
-65
-65
-62
-46
-24
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-10
-26
-51
-88
-101
-108
-111
-112
-109
-103
-96
-88
-84
-81
-84
-88
-95
-107
-130
-150
-165
-177
-187
-192
-195
-196
-196
-196
-195
-193
-190
-187
-182
-174
-166
-157
-148
-137
-123
-112
-103
-93
-85
-76
-71
-67
-63
-61
-59
-58
-57
-57
-57
-57
-57
-57
-57
-57
-57
-58
-58
-59
-60
-62
-64
-67
-72
-78
-88
-98
-110
-121
-134
-150
-158
-164
-168
-170
-171
-170
-168
-165
-159
-150
-144
-140
-137
-136
-135
-133
-127
-112
-85
-39
-18
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-102
-103
-105
-106
-107
-107
-105
-104
-104
-105
-104
-93
-85
-80
-80
-78
-69
-65
-64
-65
-65
-62
-45
-23
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-8
-25
-52
-86
-106
-109
-110
-111
-111
-103
-92
-85
-81
-80
-82
-87
-98
-114
-135
-161
-175
-185
-191
-195
-197
-197
-197
-196
-194
-191
-187
-182
-176
-169
-156
-144
-132
-120
-107
-91
-81
-73
-66
-61
-57
-56
-55
-55
-54
-54
-54
-54
-54
-55
-55
-55
-55
-55
-55
-56
-56
-56
-56
-57
-57
-57
-58
-59
-60
-62
-66
-72
-80
-92
-112
-129
-143
-156
-165
-170
-171
-171
-170
-169
-163
-155
-147
-141
-137
-136
-135
-134
-130
-122
-79
-42
-17
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-100
-101
-102
-103
-104
-107
-106
-106
-107
-108
-97
-85
-80
-80
-81
-80
-73
-67
-64
-65
-65
-61
-42
-19
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-9
-33
-64
-92
-106
-109
-110
-110
-107
-101
-87
-82
-79
-79
-82
-93
-110
-131
-153
-171
-186
-191
-195
-197
-197
-197
-195
-193
-190
-187
-180
-172
-162
-151
-138
-119
-104
-91
-80
-70
-61
-58
-55
-54
-53
-53
-53
-53
-53
-53
-54
-54
-54
-54
-54
-54
-54
-55
-55
-55
-55
-55
-55
-56
-56
-56
-56
-56
-57
-57
-57
-58
-59
-60
-62
-68
-76
-89
-105
-123
-145
-159
-166
-170
-170
-169
-167
-164
-157
-148
-140
-137
-136
-135
-133
-124
-94
-58
-26
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-99
-99
-99
-100
-102
-103
-105
-106
-107
-109
-91
-82
-80
-81
-82
-80
-72
-67
-65
-65
-65
-57
-36
-14
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-6
-31
-64
-88
-103
-108
-109
-109
-105
-98
-89
-81
-79
-79
-84
-93
-116
-138
-157
-174
-185
-194
-196
-197
-197
-196
-193
-191
-187
-182
-176
-164
-151
-138
-123
-108
-90
-78
-69
-63
-58
-55
-54
-53
-53
-53
-53
-53
-53
-53
-53
-53
-53
-54
-54
-54
-54
-54
-54
-54
-54
-55
-55
-55
-55
-55
-55
-56
-56
-56
-56
-57
-57
-58
-58
-59
-61
-64
-69
-76
-86
-106
-124
-139
-153
-164
-168
-168
-168
-165
-160
-150
-144
-139
-136
-135
-131
-119
-94
-62
-26
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-98
-98
-97
-97
-99
-100
-103
-105
-107
-109
-88
-81
-80
-81
-81
-78
-70
-66
-65
-65
-64
-52
-30
-10
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-7
-21
-61
-87
-101
-107
-109
-109
-105
-98
-89
-81
-77
-79
-85
-96
-113
-142
-162
-177
-187
-194
-197
-197
-196
-195
-193
-189
-184
-178
-169
-159
-141
-125
-110
-96
-82
-69
-62
-58
-55
-53
-52
-52
-52
-52
-52
-53
-53
-53
-53
-53
-53
-53
-53
-53
-53
-53
-53
-53
-53
-53
-54
-54
-54
-54
-54
-54
-55
-55
-55
-56
-56
-56
-57
-57
-57
-58
-59
-60
-62
-66
-78
-90
-105
-122
-139
-156
-164
-168
-168
-166
-160
-154
-147
-142
-137
-135
-131
-118
-95
-61
-19
-7
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-98
-97
-96
-95
-96
-98
-100
-103
-106
-109
-90
-82
-81
-81
-78
-74
-68
-66
-65
-66
-63
-44
-22
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-6
-19
-45
-88
-101
-107
-108
-108
-106
-98
-88
-81
-77
-78
-84
-97
-115
-138
-167
-181
-190
-195
-198
-198
-196
-194
-191
-188
-182
-174
-164
-151
-137
-114
-98
-84
-73
-64
-57
-54
-53
-52
-52
-52
-52
-52
-52
-52
-52
-52
-52
-52
-53
-53
-53
-53
-53
-53
-52
-52
-52
-52
-52
-52
-52
-53
-53
-53
-53
-53
-54
-54
-54
-55
-55
-56
-56
-56
-57
-57
-58
-58
-59
-62
-66
-75
-89
-106
-132
-148
-159
-165
-167
-166
-163
-157
-150
-143
-137
-135
-131
-120
-98
-47
-21
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-98
-97
-96
-95
-95
-96
-96
-99
-104
-109
-98
-83
-80
-80
-73
-70
-67
-66
-66
-66
-60
-33
-14
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-15
-39
-75
-103
-106
-108
-108
-107
-99
-87
-80
-76
-75
-82
-96
-117
-141
-165
-185
-192
-196
-198
-198
-196
-193
-190
-187
-182
-172
-160
-144
-127
-109
-87
-74
-65
-58
-54
-52
-52
-52
-52
-52
-52
-52
-52
-52
-52
-52
-52
-52
-52
-52
-52
-52
-52
-52
-52
-52
-52
-51
-51
-51
-51
-51
-51
-51
-51
-52
-52
-52
-52
-53
-53
-54
-54
-55
-55
-56
-57
-57
-57
-58
-58
-59
-61
-65
-71
-94
-116
-136
-153
-164
-167
-168
-166
-162
-153
-141
-138
-135
-132
-126
-88
-46
-18
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-97
-97
-96
-95
-95
-95
-95
-96
-100
-107
-107
-79
-76
-80
-73
-70
-68
-67
-66
-64
-40
-17
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-14
-41
-73
-100
-107
-108
-107
-105
-99
-85
-78
-75
-76
-80
-101
-126
-150
-172
-188
-196
-198
-199
-198
-195
-191
-188
-183
-176
-167
-147
-129
-110
-92
-77
-63
-58
-54
-52
-52
-51
-51
-51
-51
-51
-51
-52
-52
-52
-52
-52
-52
-52
-52
-52
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-52
-52
-53
-53
-54
-55
-56
-56
-57
-58
-58
-59
-60
-64
-72
-87
-108
-132
-158
-165
-167
-166
-164
-157
-148
-141
-137
-134
-125
-96
-58
-23
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-97
-97
-96
-95
-95
-95
-95
-96
-98
-102
-108
-78
-75
-80
-75
-71
-69
-67
-63
-54
-23
-9
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-8
-32
-64
-91
-104
-107
-107
-105
-99
-90
-77
-75
-76
-82
-94
-125
-150
-171
-186
-194
-198
-199
-197
-195
-191
-186
-181
-173
-162
-147
-122
-104
-87
-74
-63
-56
-54
-52
-51
-51
-51
-51
-51
-51
-51
-51
-52
-52
-52
-52
-52
-52
-52
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-51
-51
-51
-51
-51
-51
-52
-52
-53
-54
-54
-56
-56
-57
-58
-59
-60
-63
-70
-80
-96
-125
-144
-157
-164
-165
-164
-159
-151
-143
-138
-132
-120
-93
-58
-21
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-97
-97
-96
-96
-96
-96
-95
-95
-96
-99
-108
-80
-75
-78
-76
-72
-69
-64
-55
-38
-11
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-21
-55
-83
-101
-106
-107
-105
-99
-91
-81
-74
-75
-81
-94
-114
-149
-171
-185
-194
-198
-199
-197
-194
-191
-187
-180
-171
-158
-143
-124
-99
-83
-71
-62
-56
-53
-52
-51
-51
-51
-51
-51
-51
-51
-51
-51
-52
-52
-52
-52
-52
-51
-51
-51
-51
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-49
-49
-49
-49
-49
-49
-50
-50
-50
-50
-50
-50
-51
-51
-51
-52
-52
-54
-54
-55
-56
-57
-58
-60
-62
-66
-73
-92
-113
-132
-149
-160
-166
-164
-159
-153
-145
-137
-132
-117
-92
-54
-14
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-96
-97
-96
-96
-96
-97
-96
-95
-95
-96
-107
-87
-77
-74
-77
-72
-67
-58
-43
-22
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-8
-41
-76
-96
-105
-107
-105
-100
-92
-83
-74
-73
-78
-91
-111
-138
-171
-186
-194
-198
-199
-198
-194
-190
-186
-181
-171
-157
-140
-121
-101
-78
-67
-59
-55
-52
-51
-51
-51
-50
-50
-50
-51
-51
-51
-51
-52
-52
-52
-52
-52
-51
-51
-51
-50
-50
-50
-50
-50
-50
-50
-50
-50
-49
-49
-49
-49
-49
-48
-48
-48
-48
-48
-48
-48
-48
-48
-49
-49
-49
-50
-50
-50
-50
-51
-51
-52
-52
-53
-54
-56
-57
-58
-59
-60
-62
-69
-83
-102
-123
-145
-161
-164
-164
-161
-154
-144
-138
-132
-119
-92
-38
-15
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-96
-96
-96
-96
-96
-97
-98
-97
-95
-95
-103
-101
-83
-69
-75
-69
-61
-47
-29
-11
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-7
-17
-65
-91
-103
-106
-106
-102
-95
-84
-76
-72
-74
-86
-107
-133
-161
-188
-195
-198
-199
-198
-195
-190
-186
-181
-174
-158
-139
-118
-98
-79
-63
-57
-54
-52
-51
-51
-50
-50
-50
-50
-50
-51
-51
-51
-52
-52
-52
-52
-52
-51
-51
-50
-50
-50
-50
-50
-49
-49
-49
-49
-49
-49
-48
-48
-48
-47
-47
-47
-47
-47
-46
-46
-46
-46
-46
-46
-47
-47
-47
-48
-49
-49
-50
-50
-50
-51
-51
-51
-52
-53
-55
-56
-57
-58
-59
-61
-65
-75
-91
-114
-147
-159
-164
-164
-163
-155
-145
-139
-133
-125
-79
-36
-12
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-96
-96
-96
-96
-96
-97
-99
-99
-98
-95
-96
-103
-90
-72
-66
-65
-53
-36
-19
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-16
-42
-92
-101
-105
-106
-103
-94
-83
-75
-71
-72
-85
-108
-135
-162
-185
-198
-199
-198
-197
-195
-189
-184
-178
-170
-157
-132
-110
-90
-74
-62
-54
-53
-52
-51
-51
-50
-50
-50
-50
-50
-51
-51
-52
-52
-52
-52
-52
-51
-51
-50
-49
-49
-49
-49
-49
-49
-49
-49
-49
-48
-48
-48
-48
-47
-47
-47
-47
-47
-46
-46
-46
-46
-46
-45
-45
-45
-45
-45
-45
-45
-46
-46
-47
-48
-49
-50
-50
-51
-51
-51
-52
-53
-54
-56
-57
-59
-60
-62
-66
-74
-101
-126
-146
-160
-165
-164
-159
-150
-142
-136
-124
-88
-48
-15
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-96
-96
-96
-95
-95
-97
-99
-101
-101
-97
-96
-102
-98
-86
-65
-57
-49
-34
-18
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-10
-30
-64
-99
-104
-105
-103
-99
-87
-77
-72
-72
-76
-101
-129
-156
-179
-194
-199
-199
-197
-195
-191
-184
-178
-169
-157
-139
-111
-91
-75
-63
-56
-53
-52
-51
-51
-50
-50
-50
-50
-50
-51
-52
-52
-52
-52
-52
-52
-51
-50
-50
-49
-49
-49
-49
-49
-49
-49
-49
-49
-48
-48
-48
-48
-47
-47
-47
-47
-47
-47
-47
-47
-46
-46
-46
-46
-46
-45
-45
-45
-45
-45
-45
-45
-45
-46
-46
-48
-49
-50
-50
-51
-51
-52
-52
-53
-54
-57
-58
-60
-62
-65
-77
-95
-117
-138
-156
-164
-163
-159
-152
-143
-133
-117
-85
-47
-13
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-95
-95
-95
-95
-95
-97
-99
-101
-103
-101
-96
-99
-101
-94
-72
-50
-41
-29
-16
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-19
-45
-82
-103
-105
-104
-100
-94
-80
-73
-72
-75
-86
-120
-149
-173
-190
-199
-199
-198
-195
-191
-186
-179
-170
-158
-141
-120
-91
-75
-64
-56
-53
-52
-51
-50
-50
-50
-50
-50
-50
-51
-51
-52
-52
-52
-52
-52
-51
-50
-50
-49
-49
-49
-49
-49
-49
-49
-49
-48
-48
-48
-48
-48
-48
-48
-48
-48
-48
-48
-48
-48
-48
-48
-48
-47
-47
-47
-47
-46
-46
-45
-45
-44
-44
-44
-44
-45
-45
-46
-47
-49
-50
-51
-51
-51
-52
-53
-54
-56
-58
-59
-61
-66
-75
-91
-111
-134
-156
-162
-162
-159
-152
-141
-132
-113
-83
-42
-8
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-95
-95
-95
-95
-95
-97
-99
-101
-104
-104
-98
-98
-100
-98
-84
-48
-34
-22
-13
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-8
-30
-60
-95
-105
-105
-102
-96
-88
-74
-71
-73
-82
-100
-139
-167
-186
-197
-200
-198
-196
-192
-187
-181
-172
-160
-143
-123
-100
-75
-63
-56
-53
-52
-51
-50
-50
-50
-49
-50
-50
-51
-52
-52
-53
-53
-52
-52
-51
-50
-49
-49
-49
-49
-49
-49
-49
-49
-49
-48
-48
-48
-48
-48
-48
-48
-48
-48
-48
-48
-49
-49
-49
-49
-49
-49
-49
-49
-49
-48
-48
-47
-47
-46
-45
-45
-44
-44
-44
-44
-44
-45
-46
-48
-49
-50
-51
-51
-51
-52
-53
-55
-57
-59
-61
-64
-72
-85
-105
-137
-153
-161
-162
-160
-149
-141
-132
-114
-80
-25
-9
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-95
-95
-94
-95
-95
-97
-99
-102
-104
-106
-103
-98
-99
-101
-98
-57
-33
-17
-7
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-15
-43
-76
-101
-106
-103
-98
-91
-81
-70
-70
-77
-92
-117
-159
-183
-195
-200
-200
-196
-193
-188
-183
-176
-164
-147
-126
-104
-82
-63
-56
-53
-52
-51
-50
-50
-49
-49
-49
-50
-51
-52
-52
-53
-53
-53
-52
-51
-50
-49
-49
-49
-49
-49
-49
-49
-49
-49
-48
-48
-48
-48
-48
-48
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-50
-50
-50
-50
-51
-51
-50
-50
-49
-47
-46
-45
-44
-44
-44
-44
-44
-44
-45
-47
-48
-50
-51
-51
-51
-52
-53
-54
-56
-59
-61
-63
-68
-77
-106
-134
-152
-162
-163
-160
-150
-140
-131
-119
-59
-22
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-94
-94
-94
-95
-95
-99
-102
-104
-105
-107
-107
-102
-100
-100
-103
-89
-47
-20
-6
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-27
-61
-92
-104
-105
-100
-93
-83
-73
-68
-74
-88
-111
-142
-182
-194
-200
-200
-198
-193
-188
-182
-175
-167
-147
-125
-102
-82
-65
-55
-53
-52
-51
-50
-49
-49
-49
-49
-50
-51
-52
-53
-53
-53
-53
-52
-51
-50
-49
-49
-49
-49
-49
-49
-49
-49
-49
-48
-48
-48
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-50
-50
-50
-51
-51
-51
-52
-52
-52
-51
-50
-48
-46
-44
-44
-43
-43
-43
-44
-45
-47
-48
-50
-51
-51
-52
-52
-52
-55
-58
-60
-62
-64
-73
-93
-119
-143
-160
-163
-161
-153
-143
-133
-115
-66
-28
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-94
-94
-94
-95
-96
-101
-103
-105
-107
-107
-108
-105
-102
-100
-102
-97
-67
-34
-9
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-9
-39
-72
-97
-104
-104
-96
-87
-78
-70
-69
-79
-99
-127
-160
-191
-198
-200
-198
-195
-190
-183
-177
-168
-157
-131
-108
-87
-70
-58
-53
-52
-51
-50
-49
-49
-49
-49
-50
-51
-52
-53
-53
-53
-53
-52
-51
-50
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-48
-47
-47
-46
-46
-46
-46
-46
-47
-47
-48
-48
-49
-50
-51
-51
-52
-52
-53
-53
-52
-52
-50
-48
-46
-45
-44
-43
-43
-44
-44
-46
-47
-50
-51
-51
-52
-52
-53
-54
-57
-59
-62
-66
-75
-91
-114
-140
-159
-161
-159
-153
-142
-127
-101
-61
-23
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-93
-94
-94
-95
-97
-102
-104
-106
-107
-108
-109
-108
-104
-101
-102
-101
-84
-51
-18
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-16
-51
-81
-100
-103
-102
-92
-82
-74
-69
-72
-87
-113
-144
-176
-198
-200
-199
-196
-192
-186
-179
-171
-160
-145
-115
-92
-74
-62
-55
-52
-51
-50
-50
-49
-49
-49
-50
-50
-52
-53
-53
-53
-53
-53
-51
-50
-50
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-48
-47
-46
-46
-45
-44
-44
-44
-44
-44
-45
-45
-46
-47
-48
-48
-50
-50
-51
-52
-52
-53
-53
-54
-53
-53
-51
-50
-48
-46
-44
-43
-43
-43
-44
-45
-47
-49
-50
-51
-52
-52
-53
-54
-56
-59
-62
-66
-74
-89
-112
-145
-156
-160
-159
-152
-136
-122
-92
-53
-15
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-93
-94
-94
-96
-98
-103
-105
-107
-107
-108
-109
-109
-106
-103
-101
-102
-96
-68
-32
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-25
-63
-88
-102
-103
-99
-88
-78
-72
-69
-75
-97
-127
-160
-188
-202
-200
-198
-194
-189
-181
-174
-164
-150
-131
-99
-79
-65
-56
-53
-51
-51
-50
-49
-49
-49
-49
-50
-51
-53
-53
-54
-53
-53
-52
-51
-50
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-48
-48
-46
-45
-44
-43
-43
-43
-43
-43
-43
-44
-44
-45
-46
-46
-47
-48
-49
-50
-51
-52
-52
-53
-54
-54
-54
-54
-54
-53
-51
-49
-47
-44
-44
-43
-43
-44
-45
-47
-49
-50
-51
-52
-52
-52
-54
-56
-60
-62
-66
-72
-85
-120
-143
-156
-161
-160
-146
-135
-116
-86
-38
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-92
-93
-94
-96
-100
-105
-106
-107
-108
-108
-109
-109
-108
-106
-101
-102
-101
-83
-52
-12
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-5
-33
-74
-95
-102
-103
-95
-83
-75
-70
-69
-80
-109
-143
-174
-197
-203
-199
-195
-191
-185
-177
-168
-155
-138
-116
-84
-68
-58
-54
-52
-51
-50
-49
-49
-49
-49
-50
-51
-52
-53
-54
-54
-53
-52
-51
-50
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-50
-50
-50
-49
-48
-47
-45
-43
-42
-42
-42
-42
-42
-43
-43
-43
-44
-44
-45
-46
-47
-47
-48
-49
-50
-51
-52
-52
-53
-54
-54
-54
-55
-55
-55
-54
-53
-51
-47
-45
-44
-43
-43
-43
-44
-46
-48
-50
-52
-52
-52
-52
-53
-56
-60
-62
-65
-69
-88
-119
-143
-158
-162
-158
-144
-132
-112
-77
-15
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-92
-93
-95
-97
-102
-106
-107
-107
-107
-108
-108
-109
-109
-108
-103
-102
-102
-96
-77
-35
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-8
-49
-83
-98
-101
-101
-90
-79
-73
-70
-71
-91
-128
-162
-188
-201
-202
-196
-192
-187
-180
-170
-158
-142
-121
-96
-69
-59
-54
-52
-51
-50
-49
-48
-48
-48
-49
-51
-52
-53
-54
-54
-53
-53
-52
-50
-49
-49
-49
-49
-49
-49
-49
-49
-49
-49
-50
-50
-50
-50
-49
-47
-44
-43
-42
-41
-42
-42
-42
-43
-43
-44
-45
-46
-47
-47
-48
-49
-49
-49
-50
-50
-51
-51
-52
-52
-53
-54
-54
-54
-55
-55
-55
-55
-55
-54
-52
-50
-47
-45
-43
-43
-43
-44
-45
-47
-50
-51
-52
-52
-52
-53
-55
-58
-62
-64
-69
-83
-109
-137
-157
-161
-157
-145
-131
-118
-57
-20
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-92
-94
-96
-99
-103
-107
-107
-107
-107
-107
-107
-108
-109
-108
-106
-102
-102
-100
-86
-54
-10
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-13
-60
-88
-99
-101
-100
-85
-76
-71
-70
-73
-102
-142
-174
-195
-202
-201
-194
-189
-183
-175
-164
-150
-130
-107
-83
-62
-56
-53
-52
-51
-49
-48
-48
-48
-49
-50
-52
-53
-54
-54
-54
-53
-52
-51
-50
-49
-49
-49
-49
-49
-49
-49
-49
-49
-50
-50
-50
-49
-48
-46
-43
-42
-41
-41
-41
-42
-43
-44
-45
-46
-47
-48
-48
-49
-49
-50
-50
-50
-50
-50
-51
-51
-52
-52
-53
-53
-54
-54
-55
-55
-55
-55
-55
-55
-55
-54
-52
-50
-48
-46
-44
-43
-43
-44
-45
-48
-50
-51
-52
-52
-53
-54
-55
-58
-62
-66
-72
-86
-108
-138
-159
-159
-154
-143
-127
-94
-46
-16
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-92
-94
-96
-100
-104
-107
-107
-107
-107
-106
-106
-107
-108
-109
-108
-103
-103
-102
-94
-73
-17
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-6
-19
-69
-91
-100
-100
-98
-82
-74
-70
-71
-77
-115
-155
-183
-199
-202
-199
-191
-186
-180
-171
-157
-140
-118
-94
-73
-57
-54
-52
-51
-50
-49
-48
-48
-48
-49
-51
-52
-53
-54
-54
-54
-53
-52
-51
-50
-49
-49
-49
-49
-49
-49
-49
-49
-50
-50
-50
-49
-48
-46
-43
-41
-41
-41
-41
-42
-44
-45
-46
-47
-48
-49
-49
-50
-50
-50
-50
-50
-50
-50
-50
-51
-51
-51
-52
-52
-53
-54
-54
-55
-55
-55
-55
-55
-55
-55
-55
-54
-52
-50
-48
-45
-44
-43
-43
-44
-45
-48
-50
-51
-52
-53
-53
-54
-56
-58
-63
-66
-73
-87
-111
-146
-157
-158
-152
-140
-116
-75
-37
-9
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-92
-94
-97
-101
-105
-107
-107
-107
-107
-106
-105
-106
-107
-109
-109
-104
-103
-102
-99
-88
-29
-9
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-8
-25
-77
-94
-100
-99
-95
-78
-72
-69
-72
-82
-128
-167
-190
-201
-202
-196
-188
-182
-176
-166
-150
-129
-106
-83
-64
-54
-53
-51
-50
-49
-48
-48
-48
-49
-50
-51
-53
-53
-54
-54
-53
-52
-51
-50
-50
-49
-49
-49
-49
-49
-49
-49
-50
-50
-50
-50
-48
-46
-43
-41
-40
-41
-42
-43
-44
-46
-48
-48
-49
-49
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-51
-51
-51
-52
-53
-54
-54
-55
-55
-55
-55
-55
-55
-55
-55
-54
-53
-51
-47
-45
-44
-43
-43
-44
-46
-48
-50
-52
-53
-53
-53
-54
-56
-60
-63
-67
-73
-85
-124
-147
-157
-158
-152
-130
-103
-62
-24
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-93
-95
-98
-102
-106
-107
-107
-107
-106
-105
-104
-105
-106
-108
-109
-105
-103
-103
-101
-97
-46
-16
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-11
-32
-84
-96
-100
-98
-93
-75
-70
-68
-73
-89
-141
-177
-196
-202
-201
-193
-186
-179
-172
-162
-141
-118
-94
-73
-59
-53
-52
-51
-50
-48
-48
-48
-48
-49
-50
-52
-53
-53
-54
-54
-53
-52
-51
-50
-50
-50
-49
-49
-49
-49
-49
-50
-50
-50
-50
-49
-46
-43
-41
-40
-40
-41
-43
-45
-47
-48
-49
-49
-49
-50
-50
-50
-50
-50
-50
-51
-51
-51
-50
-50
-50
-50
-49
-49
-49
-50
-51
-53
-53
-54
-55
-55
-55
-55
-55
-55
-55
-55
-54
-53
-50
-47
-45
-44
-43
-43
-44
-46
-48
-50
-52
-53
-53
-54
-54
-57
-61
-64
-67
-71
-93
-127
-149
-160
-160
-142
-126
-90
-47
-10
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-93
-95
-98
-103
-107
-107
-107
-106
-106
-105
-103
-104
-105
-106
-109
-107
-104
-103
-102
-101
-65
-27
-8
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-15
-42
-90
-97
-100
-97
-88
-72
-69
-69
-78
-100
-157
-186
-199
-202
-201
-189
-182
-175
-166
-154
-128
-103
-81
-64
-55
-52
-51
-50
-49
-48
-48
-48
-49
-49
-51
-53
-53
-53
-53
-53
-53
-51
-50
-50
-50
-50
-50
-49
-49
-50
-50
-50
-50
-50
-50
-46
-42
-40
-40
-40
-42
-44
-46
-48
-48
-49
-49
-49
-50
-50
-51
-52
-53
-54
-55
-56
-56
-55
-54
-53
-51
-50
-49
-49
-48
-47
-47
-48
-50
-51
-53
-54
-54
-55
-55
-55
-55
-55
-55
-54
-52
-50
-48
-46
-44
-43
-44
-44
-46
-48
-51
-52
-53
-53
-54
-55
-58
-61
-64
-67
-73
-92
-122
-149
-161
-159
-140
-120
-88
-35
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-94
-95
-99
-103
-107
-107
-107
-106
-105
-104
-103
-103
-104
-105
-108
-107
-104
-103
-102
-102
-78
-34
-11
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-19
-49
-93
-98
-99
-95
-85
-70
-68
-70
-82
-109
-167
-190
-200
-201
-199
-186
-179
-171
-161
-147
-118
-93
-73
-59
-54
-52
-51
-50
-48
-48
-48
-48
-49
-50
-51
-53
-53
-53
-53
-53
-52
-51
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-48
-42
-40
-40
-40
-41
-44
-46
-47
-48
-48
-49
-49
-50
-51
-53
-58
-62
-67
-71
-74
-77
-77
-76
-74
-71
-65
-60
-56
-52
-49
-47
-47
-47
-47
-48
-50
-51
-53
-54
-54
-55
-55
-55
-55
-54
-53
-52
-50
-47
-45
-44
-44
-44
-45
-46
-49
-51
-52
-53
-54
-55
-57
-59
-62
-65
-69
-78
-99
-126
-154
-161
-153
-136
-108
-68
-15
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-94
-95
-99
-103
-107
-107
-107
-106
-105
-103
-103
-103
-103
-105
-108
-108
-104
-103
-103
-102
-87
-42
-15
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-7
-23
-55
-94
-98
-98
-94
-83
-69
-68
-72
-87
-118
-175
-194
-201
-201
-197
-183
-176
-168
-156
-139
-108
-85
-67
-56
-53
-51
-50
-49
-48
-48
-48
-48
-49
-50
-51
-53
-53
-53
-53
-53
-52
-51
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-49
-45
-40
-39
-39
-40
-42
-46
-47
-48
-48
-48
-49
-51
-53
-58
-64
-73
-80
-86
-91
-96
-100
-101
-101
-100
-97
-91
-84
-76
-69
-61
-54
-50
-48
-46
-47
-48
-49
-51
-52
-53
-54
-54
-54
-54
-54
-54
-53
-51
-49
-47
-45
-44
-44
-44
-45
-48
-50
-52
-53
-53
-54
-56
-58
-60
-63
-67
-71
-82
-103
-134
-160
-159
-147
-127
-99
-34
-12
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-94
-96
-99
-104
-107
-107
-107
-106
-104
-103
-102
-102
-103
-104
-108
-108
-104
-103
-103
-102
-93
-50
-20
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-2
-3
-5
-6
-7
-7
-6
-5
-3
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-8
-26
-61
-95
-98
-98
-93
-81
-69
-68
-73
-91
-126
-183
-196
-201
-200
-195
-181
-173
-164
-151
-131
-99
-77
-62
-55
-53
-51
-50
-49
-48
-48
-48
-49
-49
-50
-51
-52
-53
-53
-53
-53
-51
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-49
-47
-42
-39
-39
-40
-41
-44
-47
-47
-48
-48
-48
-50
-54
-60
-68
-77
-88
-96
-102
-108
-112
-117
-119
-121
-121
-121
-117
-111
-103
-94
-83
-69
-61
-54
-50
-47
-47
-48
-49
-50
-52
-53
-53
-54
-54
-54
-54
-53
-52
-50
-48
-46
-44
-44
-44
-44
-46
-49
-51
-52
-53
-54
-55
-57
-59
-62
-66
-68
-72
-84
-108
-150
-159
-155
-142
-122
-61
-25
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-94
-96
-99
-104
-107
-107
-107
-106
-104
-103
-102
-102
-102
-104
-108
-108
-105
-103
-103
-103
-97
-58
-25
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-3
-4
-5
-6
-6
-6
-6
-5
-5
-4
-4
-4
-6
-8
-14
-18
-21
-21
-19
-14
-9
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-10
-29
-67
-96
-98
-97
-91
-79
-68
-68
-75
-95
-134
-189
-198
-202
-199
-192
-179
-170
-160
-145
-123
-90
-70
-59
-54
-52
-51
-49
-48
-48
-48
-48
-49
-50
-50
-51
-52
-52
-53
-53
-52
-51
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-48
-45
-40
-39
-39
-40
-43
-46
-47
-47
-47
-48
-49
-54
-62
-71
-82
-90
-98
-103
-108
-112
-116
-120
-123
-125
-127
-129
-131
-131
-129
-124
-114
-96
-82
-69
-58
-50
-47
-47
-47
-48
-50
-52
-52
-53
-53
-54
-54
-53
-53
-51
-50
-47
-45
-44
-44
-44
-45
-47
-50
-52
-53
-54
-54
-56
-58
-61
-65
-68
-70
-74
-82
-127
-153
-161
-154
-134
-93
-44
-15
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-94
-96
-99
-103
-107
-107
-107
-106
-104
-102
-102
-102
-102
-104
-108
-108
-105
-103
-103
-103
-100
-65
-30
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-5
-9
-14
-23
-30
-36
-41
-44
-45
-44
-41
-37
-33
-28
-27
-28
-32
-41
-57
-69
-76
-79
-79
-71
-57
-41
-25
-12
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-12
-34
-74
-97
-98
-96
-90
-77
-68
-68
-76
-99
-143
-193
-200
-202
-198
-189
-176
-167
-154
-137
-113
-80
-64
-56
-53
-52
-50
-49
-48
-48
-48
-48
-49
-50
-51
-51
-52
-52
-52
-52
-52
-51
-50
-50
-50
-50
-50
-50
-50
-50
-50
-51
-49
-46
-42
-39
-38
-39
-42
-45
-46
-47
-47
-47
-49
-53
-63
-73
-81
-87
-92
-99
-103
-107
-109
-112
-115
-118
-121
-125
-128
-132
-133
-134
-134
-134
-130
-119
-104
-88
-71
-56
-50
-48
-47
-48
-50
-51
-52
-53
-53
-53
-53
-53
-52
-51
-49
-47
-45
-44
-43
-44
-46
-48
-50
-53
-54
-54
-55
-57
-59
-65
-67
-69
-70
-73
-90
-129
-152
-160
-156
-125
-77
-37
-10
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-94
-95
-99
-103
-107
-107
-107
-106
-105
-103
-102
-102
-103
-105
-108
-108
-104
-102
-102
-103
-101
-69
-33
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-3
-10
-20
-32
-44
-55
-65
-70
-74
-77
-79
-80
-79
-78
-76
-73
-69
-65
-64
-67
-73
-85
-91
-95
-97
-98
-96
-90
-82
-70
-53
-25
-12
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-14
-38
-78
-97
-98
-96
-89
-76
-67
-68
-77
-102
-149
-195
-200
-202
-197
-187
-174
-164
-150
-131
-106
-74
-61
-54
-52
-52
-50
-48
-48
-48
-48
-48
-49
-50
-50
-51
-51
-52
-52
-52
-52
-51
-50
-50
-50
-50
-50
-50
-50
-50
-51
-50
-48
-44
-40
-38
-38
-40
-43
-46
-46
-46
-47
-48
-51
-57
-68
-75
-81
-87
-90
-92
-91
-89
-87
-86
-86
-89
-93
-98
-105
-116
-123
-129
-133
-135
-135
-132
-126
-116
-100
-76
-63
-54
-49
-47
-48
-50
-51
-52
-52
-53
-53
-53
-52
-52
-50
-48
-46
-45
-44
-44
-45
-47
-49
-52
-54
-54
-55
-56
-58
-63
-67
-69
-70
-72
-79
-105
-135
-158
-161
-138
-104
-61
-23
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-94
-95
-98
-103
-107
-107
-107
-107
-105
-103
-103
-102
-104
-106
-109
-108
-103
-102
-102
-104
-102
-72
-35
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-5
-12
-23
-41
-53
-64
-73
-80
-86
-88
-90
-92
-93
-94
-94
-93
-93
-92
-90
-88
-88
-89
-92
-98
-101
-103
-105
-105
-105
-104
-101
-95
-85
-64
-43
-23
-9
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-16
-42
-81
-97
-98
-96
-88
-75
-67
-68
-78
-104
-152
-196
-201
-202
-197
-185
-172
-162
-146
-125
-99
-69
-59
-54
-52
-51
-49
-48
-48
-48
-48
-49
-49
-50
-50
-51
-51
-51
-52
-51
-51
-51
-50
-50
-50
-50
-50
-50
-50
-51
-51
-50
-47
-43
-39
-38
-38
-41
-44
-46
-46
-46
-46
-49
-53
-60
-70
-75
-79
-81
-80
-75
-70
-67
-64
-62
-62
-64
-66
-70
-75
-86
-96
-106
-117
-127
-135
-137
-136
-132
-124
-103
-84
-68
-57
-50
-48
-49
-50
-51
-52
-53
-53
-53
-52
-52
-50
-49
-47
-45
-44
-44
-44
-46
-48
-51
-53
-54
-54
-55
-57
-61
-67
-70
-71
-72
-74
-87
-115
-145
-162
-152
-125
-85
-42
-11
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-93
-95
-98
-102
-107
-107
-107
-107
-106
-104
-103
-103
-105
-107
-109
-108
-103
-101
-102
-104
-103
-74
-37
-7
-2
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-11
-22
-36
-53
-74
-83
-88
-90
-91
-91
-91
-91
-92
-93
-94
-95
-96
-96
-97
-99
-99
-99
-100
-101
-103
-104
-105
-105
-106
-106
-106
-105
-105
-104
-97
-79
-54
-29
-9
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-19
-45
-84
-98
-98
-95
-88
-74
-67
-68
-79
-106
-155
-197
-202
-202
-196
-183
-170
-159
-142
-120
-93
-65
-57
-53
-52
-51
-49
-48
-48
-48
-48
-49
-49
-50
-50
-51
-51
-51
-51
-51
-51
-51
-50
-50
-50
-50
-50
-50
-50
-51
-51
-50
-46
-41
-38
-37
-39
-42
-45
-46
-46
-46
-47
-49
-55
-61
-69
-73
-73
-71
-65
-56
-52
-49
-47
-47
-47
-47
-48
-49
-51
-57
-65
-76
-90
-105
-123
-131
-136
-139
-139
-128
-110
-90
-71
-57
-49
-49
-49
-50
-51
-52
-52
-53
-52
-52
-51
-49
-48
-46
-45
-44
-44
-45
-47
-50
-53
-54
-54
-55
-56
-60
-66
-70
-73
-73
-73
-76
-95
-125
-157
-162
-142
-107
-66
-23
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-93
-95
-97
-101
-106
-107
-107
-108
-107
-105
-104
-105
-107
-109
-109
-106
-101
-101
-102
-105
-103
-75
-38
-8
-3
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-13
-34
-57
-77
-87
-90
-91
-92
-91
-90
-86
-84
-84
-83
-84
-87
-90
-93
-95
-98
-100
-101
-102
-103
-103
-104
-105
-105
-105
-105
-105
-105
-106
-106
-106
-105
-103
-93
-69
-28
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-21
-48
-85
-98
-98
-95
-88
-74
-67
-67
-79
-107
-156
-198
-202
-201
-195
-182
-168
-157
-138
-115
-88
-62
-56
-53
-52
-51
-49
-48
-48
-48
-48
-49
-49
-50
-50
-50
-51
-51
-51
-51
-51
-51
-50
-50
-50
-50
-50
-50
-51
-51
-51
-49
-44
-40
-38
-37
-39
-43
-45
-46
-46
-46
-47
-50
-55
-61
-67
-67
-64
-57
-48
-45
-44
-44
-43
-43
-44
-44
-44
-44
-45
-45
-47
-50
-55
-66
-92
-114
-129
-139
-142
-142
-135
-118
-95
-71
-53
-50
-49
-49
-50
-52
-52
-52
-52
-52
-51
-50
-49
-47
-45
-44
-44
-45
-46
-49
-53
-54
-54
-55
-56
-59
-64
-70
-74
-76
-74
-74
-80
-101
-144
-164
-152
-128
-92
-41
-7
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-92
-95
-97
-100
-106
-107
-107
-108
-108
-108
-107
-108
-108
-109
-109
-103
-100
-100
-102
-105
-102
-73
-37
-9
-6
-7
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-13
-31
-68
-82
-88
-90
-91
-88
-82
-75
-70
-65
-62
-61
-61
-62
-64
-68
-73
-79
-86
-93
-100
-102
-103
-104
-104
-104
-103
-103
-103
-102
-102
-102
-102
-103
-104
-105
-105
-104
-100
-90
-30
-10
-2
-1
-1
-3
-3
-2
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-23
-51
-85
-98
-98
-95
-88
-75
-67
-67
-79
-107
-156
-198
-202
-201
-195
-181
-165
-153
-134
-109
-83
-59
-55
-52
-51
-50
-48
-48
-48
-48
-48
-49
-50
-50
-50
-50
-50
-51
-51
-51
-51
-51
-51
-50
-50
-50
-50
-51
-51
-51
-51
-49
-43
-39
-37
-37
-40
-44
-45
-45
-45
-45
-46
-50
-54
-59
-59
-57
-51
-46
-44
-43
-43
-43
-43
-43
-43
-43
-43
-44
-44
-44
-44
-44
-45
-46
-51
-64
-85
-110
-133
-143
-145
-142
-131
-108
-73
-59
-52
-49
-50
-51
-52
-52
-52
-52
-52
-51
-49
-48
-46
-45
-44
-44
-45
-47
-51
-53
-54
-55
-55
-58
-62
-69
-75
-80
-79
-76
-76
-83
-103
-158
-163
-151
-121
-75
-20
-7
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-92
-94
-96
-99
-106
-107
-107
-108
-108
-108
-109
-109
-109
-109
-108
-101
-100
-100
-102
-105
-101
-69
-36
-12
-9
-9
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-11
-29
-50
-69
-82
-87
-88
-86
-82
-74
-69
-65
-62
-60
-58
-57
-58
-59
-61
-65
-70
-77
-85
-93
-100
-101
-102
-102
-102
-103
-102
-102
-102
-102
-101
-100
-99
-99
-99
-101
-102
-103
-103
-100
-73
-34
-12
-2
-1
-2
-7
-9
-8
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-24
-52
-85
-98
-98
-95
-88
-75
-67
-68
-78
-106
-156
-198
-202
-201
-194
-180
-164
-151
-131
-105
-79
-58
-54
-52
-51
-50
-48
-48
-48
-48
-49
-49
-50
-50
-50
-50
-50
-50
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-48
-42
-38
-37
-37
-41
-44
-45
-45
-45
-45
-46
-49
-53
-55
-55
-51
-47
-44
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-44
-44
-44
-44
-44
-44
-46
-50
-59
-74
-97
-130
-141
-145
-142
-133
-101
-76
-61
-52
-50
-50
-51
-52
-52
-52
-52
-51
-50
-49
-47
-45
-44
-44
-45
-46
-51
-53
-54
-55
-55
-57
-61
-67
-73
-81
-83
-80
-77
-78
-85
-140
-159
-156
-136
-103
-38
-14
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-91
-94
-96
-98
-105
-107
-107
-107
-108
-109
-109
-109
-109
-108
-106
-100
-99
-100
-102
-104
-99
-65
-35
-15
-13
-12
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-20
-39
-57
-73
-84
-86
-85
-82
-78
-73
-66
-63
-60
-58
-57
-56
-56
-57
-58
-60
-64
-70
-77
-85
-94
-100
-101
-101
-102
-102
-102
-102
-101
-100
-98
-97
-96
-95
-95
-95
-96
-97
-99
-101
-103
-95
-66
-36
-11
-3
-3
-8
-15
-20
-19
-12
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-5
-24
-52
-85
-98
-98
-95
-88
-76
-67
-68
-77
-103
-154
-198
-202
-201
-194
-180
-164
-150
-128
-103
-76
-57
-54
-52
-51
-50
-48
-48
-48
-48
-49
-49
-50
-50
-50
-50
-50
-50
-50
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-48
-41
-38
-37
-37
-41
-44
-45
-45
-45
-45
-45
-48
-50
-51
-51
-47
-45
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-44
-47
-54
-67
-101
-125
-139
-146
-145
-126
-99
-76
-59
-52
-50
-51
-51
-52
-52
-52
-52
-51
-49
-48
-45
-45
-44
-45
-46
-50
-53
-54
-55
-55
-56
-60
-65
-72
-81
-86
-84
-81
-78
-77
-113
-148
-159
-150
-127
-61
-26
-8
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-89
-93
-95
-97
-104
-106
-106
-107
-108
-109
-109
-109
-108
-106
-103
-99
-98
-100
-103
-104
-96
-60
-33
-18
-17
-13
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-8
-19
-47
-69
-79
-82
-83
-82
-79
-74
-70
-67
-63
-61
-59
-58
-57
-56
-56
-56
-58
-60
-65
-71
-78
-87
-95
-101
-101
-102
-102
-103
-102
-100
-97
-95
-93
-91
-90
-90
-91
-92
-93
-93
-95
-97
-101
-102
-93
-66
-34
-11
-5
-7
-17
-29
-36
-29
-17
-8
-3
-1
-1
-1
-1
-1
-1
-1
-5
-23
-52
-85
-98
-98
-95
-89
-76
-67
-68
-76
-100
-151
-198
-202
-202
-194
-180
-163
-149
-126
-100
-74
-56
-53
-52
-51
-50
-48
-48
-48
-49
-49
-50
-50
-50
-50
-50
-50
-50
-50
-50
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-48
-41
-38
-37
-37
-41
-43
-44
-44
-44
-44
-45
-47
-48
-49
-48
-45
-44
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-45
-48
-68
-99
-124
-141
-148
-144
-123
-97
-72
-56
-51
-51
-51
-52
-52
-52
-52
-51
-50
-48
-46
-45
-45
-45
-45
-49
-52
-54
-55
-55
-56
-59
-65
-72
-81
-88
-88
-85
-81
-76
-88
-132
-156
-161
-145
-86
-42
-15
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-88
-93
-95
-97
-102
-106
-106
-106
-106
-108
-108
-108
-107
-104
-99
-97
-97
-100
-103
-104
-93
-55
-32
-22
-20
-11
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-8
-24
-56
-77
-81
-82
-81
-78
-72
-70
-68
-66
-64
-63
-61
-59
-58
-57
-56
-56
-57
-59
-62
-67
-72
-79
-88
-96
-103
-105
-105
-104
-103
-99
-94
-90
-87
-85
-84
-84
-85
-87
-90
-92
-92
-93
-93
-95
-101
-102
-97
-76
-32
-10
-11
-15
-26
-50
-53
-40
-22
-7
-2
-1
-1
-1
-1
-1
-1
-4
-22
-50
-83
-98
-98
-96
-89
-77
-67
-67
-74
-97
-146
-198
-203
-202
-195
-180
-163
-148
-125
-99
-73
-56
-53
-52
-51
-50
-48
-48
-48
-49
-49
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-48
-41
-38
-36
-37
-41
-43
-44
-44
-44
-44
-44
-45
-47
-47
-46
-44
-44
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-43
-42
-42
-42
-42
-42
-42
-42
-42
-43
-43
-47
-67
-97
-127
-145
-149
-142
-120
-92
-65
-52
-51
-51
-51
-52
-52
-52
-51
-50
-49
-46
-45
-45
-45
-45
-48
-51
-54
-55
-55
-56
-58
-64
-71
-79
-90
-91
-89
-85
-79
-77
-115
-148
-165
-157
-113
-61
-26
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-85
-92
-94
-96
-100
-106
-106
-106
-105
-105
-106
-106
-104
-100
-96
-96
-97
-100
-103
-103
-84
-50
-32
-25
-22
-8
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-18
-46
-72
-80
-79
-75
-73
-72
-71
-69
-68
-67
-66
-65
-64
-63
-61
-59
-57
-56
-56
-59
-62
-66
-70
-78
-89
-99
-106
-107
-106
-104
-100
-95
-86
-83
-81
-80
-80
-80
-81
-83
-86
-89
-91
-92
-92
-92
-93
-94
-100
-102
-101
-96
-53
-30
-23
-26
-32
-64
-66
-58
-39
-12
-2
-1
-1
-1
-1
-1
-3
-18
-44
-79
-97
-98
-96
-91
-79
-67
-67
-72
-91
-136
-195
-202
-202
-196
-182
-164
-147
-124
-98
-71
-55
-53
-52
-51
-49
-49
-48
-49
-49
-49
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-48
-42
-38
-36
-36
-40
-42
-44
-44
-44
-44
-44
-44
-45
-45
-45
-44
-44
-44
-44
-44
-44
-44
-44
-43
-43
-43
-42
-42
-42
-42
-42
-41
-40
-40
-39
-40
-40
-41
-42
-43
-46
-63
-91
-128
-147
-148
-141
-123
-90
-59
-53
-51
-51
-52
-52
-52
-52
-51
-49
-47
-46
-45
-45
-45
-47
-51
-53
-55
-55
-56
-57
-63
-70
-77
-90
-93
-94
-92
-85
-76
-87
-123
-157
-164
-142
-92
-48
-16
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-83
-92
-94
-95
-98
-106
-106
-106
-104
-103
-103
-103
-100
-97
-96
-95
-98
-101
-103
-102
-76
-46
-32
-26
-21
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-24
-52
-69
-76
-76
-74
-73
-72
-72
-73
-71
-69
-68
-67
-67
-66
-64
-61
-59
-57
-57
-58
-62
-66
-70
-80
-92
-100
-105
-107
-106
-103
-97
-91
-85
-80
-78
-76
-75
-74
-75
-77
-80
-83
-87
-91
-92
-92
-92
-93
-94
-96
-99
-101
-101
-89
-71
-51
-36
-37
-51
-65
-67
-59
-40
-9
-3
-1
-1
-1
-1
-2
-15
-39
-75
-97
-98
-97
-92
-81
-68
-67
-70
-87
-127
-191
-202
-203
-197
-183
-165
-148
-125
-98
-71
-55
-53
-52
-51
-49
-49
-48
-49
-49
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-49
-42
-38
-36
-36
-39
-42
-43
-44
-43
-43
-43
-44
-44
-45
-45
-45
-44
-44
-44
-44
-44
-44
-44
-43
-43
-42
-42
-42
-41
-41
-41
-40
-39
-38
-37
-37
-38
-39
-41
-42
-44
-51
-68
-101
-139
-146
-146
-136
-113
-72
-59
-53
-52
-52
-52
-52
-52
-51
-50
-48
-46
-45
-45
-45
-47
-50
-53
-55
-55
-56
-57
-62
-70
-77
-89
-94
-97
-95
-91
-79
-80
-108
-142
-165
-155
-115
-69
-28
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-81
-91
-94
-95
-97
-105
-106
-106
-105
-102
-101
-100
-98
-96
-95
-96
-99
-101
-102
-99
-67
-44
-32
-26
-17
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-6
-18
-52
-70
-75
-75
-73
-74
-77
-77
-76
-75
-73
-70
-69
-69
-68
-66
-64
-61
-59
-58
-59
-62
-67
-72
-78
-90
-100
-105
-107
-106
-102
-96
-89
-83
-78
-73
-71
-69
-68
-68
-70
-72
-76
-80
-84
-90
-91
-92
-92
-93
-94
-95
-96
-99
-101
-101
-93
-79
-64
-51
-50
-61
-68
-68
-60
-28
-11
-3
-1
-1
-1
-2
-11
-32
-69
-95
-97
-97
-93
-83
-68
-67
-69
-83
-117
-186
-200
-204
-198
-185
-166
-149
-126
-99
-72
-55
-53
-51
-51
-49
-49
-49
-49
-49
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-50
-43
-39
-36
-36
-38
-41
-42
-43
-43
-43
-43
-43
-44
-44
-45
-44
-44
-44
-44
-44
-44
-44
-43
-43
-42
-42
-41
-40
-40
-40
-40
-39
-38
-37
-36
-35
-35
-36
-38
-41
-42
-45
-54
-75
-124
-141
-147
-143
-131
-89
-67
-56
-52
-52
-52
-52
-52
-52
-51
-48
-47
-45
-45
-45
-46
-50
-53
-55
-56
-56
-57
-62
-69
-77
-87
-95
-98
-98
-96
-84
-79
-94
-123
-161
-161
-135
-90
-44
-12
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-79
-90
-94
-94
-95
-104
-105
-106
-105
-102
-99
-98
-97
-96
-96
-97
-100
-101
-100
-93
-59
-41
-31
-24
-12
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-6
-18
-42
-74
-75
-74
-72
-75
-80
-84
-85
-82
-76
-73
-71
-70
-69
-68
-66
-64
-61
-60
-60
-63
-67
-72
-78
-86
-99
-104
-106
-105
-103
-95
-87
-81
-75
-71
-66
-63
-62
-62
-63
-65
-68
-72
-76
-81
-88
-90
-92
-92
-93
-95
-95
-95
-96
-98
-100
-100
-98
-90
-71
-60
-60
-66
-71
-72
-51
-25
-9
-3
-1
-1
-1
-8
-26
-61
-94
-97
-97
-94
-86
-70
-67
-68
-79
-107
-179
-198
-204
-199
-187
-167
-150
-127
-100
-73
-55
-53
-51
-51
-49
-49
-49
-49
-49
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-50
-51
-51
-51
-51
-51
-51
-51
-51
-51
-50
-45
-40
-37
-36
-37
-39
-41
-42
-43
-43
-43
-43
-43
-44
-44
-44
-44
-44
-44
-44
-44
-43
-43
-42
-41
-40
-40
-40
-39
-39
-39
-38
-38
-37
-34
-33
-33
-33
-35
-40
-41
-43
-46
-55
-103
-132
-144
-147
-143
-108
-78
-61
-53
-52
-52
-52
-52
-52
-51
-49
-47
-46
-45
-45
-46
-49
-53
-55
-56
-56
-57
-61
-68
-77
-86
-94
-99
-100
-100
-90
-81
-84
-106
-153
-164
-150
-111
-64
-21
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-77
-90
-94
-94
-94
-102
-105
-106
-105
-102
-99
-97
-96
-96
-96
-98
-100
-101
-97
-86
-50
-37
-29
-20
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-16
-39
-71
-76
-72
-70
-74
-84
-92
-92
-90
-86
-77
-73
-71
-70
-70
-68
-66
-64
-63
-62
-62
-66
-70
-77
-85
-94
-104
-105
-105
-103
-96
-84
-78
-72
-67
-61
-58
-58
-59
-60
-61
-62
-64
-67
-72
-77
-85
-89
-91
-92
-93
-95
-96
-96
-95
-94
-94
-95
-95
-94
-93
-77
-69
-67
-71
-76
-73
-46
-22
-6
-2
-1
-1
-5
-19
-52
-91
-96
-97
-95
-89
-72
-67
-67
-75
-96
-170
-196
-205
-201
-190
-170
-152
-129
-102
-75
-55
-53
-51
-51
-49
-49
-49
-49
-49
-50
-50
-50
-50
-50
-50
-50
-49
-49
-50
-50
-50
-51
-51
-51
-51
-51
-51
-51
-51
-51
-51
-46
-41
-37
-36
-37
-38
-40
-41
-42
-43
-43
-43
-43
-43
-43
-44
-44
-44
-44
-44
-43
-42
-41
-40
-40
-40
-39
-39
-39
-39
-38
-38
-37
-36
-33
-32
-31
-31
-32
-37
-40
-42
-44
-46
-78
-119
-140
-147
-147
-126
-91
-68
-55
-52
-52
-52
-52
-52
-52
-49
-47
-46
-45
-45
-46
-49
-52
-55
-56
-56
-57
-61
-67
-77
-86
-93
-99
-102
-102
-96
-84
-81
-95
-138
-164
-159
-130
-86
-34
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-75
-89
-93
-93
-94
-99
-103
-105
-106
-105
-100
-98
-97
-97
-97
-100
-100
-99
-92
-74
-43
-30
-22
-14
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-15
-43
-68
-75
-71
-70
-77
-87
-98
-101
-100
-95
-88
-81
-74
-73
-73
-72
-71
-67
-65
-64
-64
-66
-74
-85
-95
-103
-107
-106
-101
-95
-87
-79
-71
-65
-59
-56
-55
-56
-56
-56
-56
-55
-56
-57
-60
-64
-69
-77
-84
-88
-90
-92
-94
-97
-98
-98
-98
-97
-95
-93
-92
-91
-90
-83
-77
-74
-75
-79
-75
-54
-28
-7
-1
-1
-3
-12
-36
-84
-94
-97
-96
-92
-75
-69
-67
-71
-83
-155
-190
-204
-203
-193
-173
-156
-133
-106
-78
-56
-53
-51
-51
-50
-49
-49
-49
-49
-50
-50
-50
-50
-50
-50
-50
-49
-49
-50
-50
-50
-51
-51
-52
-52
-51
-51
-51
-51
-52
-51
-49
-44
-39
-37
-37
-38
-38
-39
-39
-41
-42
-42
-43
-43
-43
-43
-43
-43
-42
-41
-40
-40
-40
-40
-40
-40
-40
-40
-39
-39
-39
-38
-37
-36
-33
-31
-29
-29
-29
-33
-38
-41
-43
-44
-56
-96
-127
-145
-147
-140
-109
-81
-60
-53
-52
-52
-52
-52
-52
-50
-48
-47
-46
-46
-46
-49
-52
-55
-56
-56
-57
-60
-67
-76
-86
-91
-98
-102
-103
-102
-90
-83
-87
-109
-160
-161
-147
-114
-58
-12
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-73
-88
-93
-93
-93
-97
-101
-104
-106
-106
-102
-101
-100
-99
-99
-100
-100
-96
-85
-65
-35
-25
-17
-9
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-9
-37
-59
-72
-73
-70
-74
-85
-96
-104
-106
-104
-99
-93
-87
-81
-79
-77
-75
-72
-68
-67
-69
-74
-84
-93
-99
-101
-102
-102
-95
-88
-83
-77
-70
-59
-56
-53
-52
-51
-51
-50
-51
-51
-53
-54
-55
-57
-59
-63
-70
-77
-82
-86
-89
-92
-95
-97
-98
-99
-99
-99
-98
-97
-95
-93
-90
-84
-78
-76
-78
-77
-69
-51
-23
-3
-1
-2
-8
-24
-74
-91
-96
-96
-94
-79
-70
-67
-69
-77
-139
-182
-202
-204
-196
-177
-160
-137
-110
-81
-57
-53
-51
-51
-50
-49
-49
-49
-49
-50
-50
-51
-50
-50
-50
-50
-49
-49
-49
-50
-50
-51
-51
-52
-52
-52
-51
-51
-51
-52
-52
-50
-46
-41
-38
-37
-38
-38
-38
-38
-39
-40
-40
-41
-41
-42
-42
-41
-41
-40
-39
-39
-39
-40
-40
-40
-41
-41
-42
-42
-42
-42
-41
-40
-38
-34
-31
-29
-28
-28
-31
-36
-40
-42
-44
-51
-82
-116
-141
-147
-143
-120
-91
-66
-54
-53
-53
-53
-52
-52
-51
-49
-47
-46
-46
-46
-49
-52
-55
-56
-57
-57
-60
-66
-76
-85
-90
-96
-101
-104
-103
-95
-86
-84
-94
-151
-159
-154
-130
-80
-21
-7
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-72
-87
-93
-93
-92
-95
-98
-103
-106
-106
-104
-102
-101
-101
-101
-101
-99
-91
-75
-53
-27
-20
-12
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-24
-53
-68
-73
-71
-70
-80
-92
-102
-107
-108
-105
-101
-97
-91
-86
-83
-81
-77
-74
-72
-77
-82
-89
-96
-101
-101
-98
-95
-92
-85
-78
-70
-63
-57
-51
-48
-47
-45
-44
-44
-44
-46
-48
-50
-52
-53
-54
-55
-57
-63
-69
-75
-81
-84
-87
-90
-93
-95
-98
-100
-101
-101
-100
-99
-97
-96
-92
-88
-83
-80
-79
-76
-67
-45
-11
-4
-2
-5
-15
-62
-86
-95
-96
-95
-82
-72
-67
-68
-73
-122
-173
-198
-205
-199
-180
-164
-141
-115
-85
-59
-54
-52
-51
-50
-49
-49
-49
-49
-50
-51
-51
-51
-50
-50
-50
-50
-49
-50
-50
-50
-51
-51
-52
-52
-52
-51
-51
-51
-52
-52
-51
-49
-44
-39
-38
-38
-38
-38
-38
-38
-38
-39
-39
-39
-40
-39
-39
-39
-39
-39
-39
-40
-40
-41
-43
-44
-44
-45
-45
-46
-46
-45
-44
-42
-37
-32
-29
-28
-28
-29
-34
-39
-42
-43
-48
-71
-105
-136
-147
-145
-128
-101
-73
-56
-53
-53
-53
-53
-52
-51
-49
-47
-46
-46
-47
-49
-52
-55
-56
-57
-57
-60
-66
-76
-85
-89
-94
-99
-104
-104
-99
-90
-83
-86
-138
-156
-158
-142
-102
-33
-12
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-71
-87
-92
-92
-92
-93
-96
-101
-105
-106
-105
-103
-102
-102
-102
-101
-96
-83
-64
-40
-20
-14
-8
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-8
-44
-65
-73
-72
-69
-73
-87
-98
-106
-109
-108
-106
-103
-100
-95
-90
-87
-84
-82
-80
-81
-89
-95
-100
-101
-100
-96
-90
-85
-79
-72
-65
-57
-51
-46
-44
-42
-40
-38
-37
-37
-39
-41
-43
-46
-48
-50
-51
-52
-53
-56
-61
-67
-73
-78
-82
-85
-87
-91
-94
-98
-100
-101
-102
-101
-101
-100
-99
-97
-92
-84
-82
-80
-76
-66
-26
-10
-3
-4
-8
-48
-79
-93
-96
-96
-86
-74
-68
-67
-70
-107
-161
-192
-205
-202
-185
-168
-146
-120
-90
-61
-55
-52
-51
-50
-49
-49
-49
-49
-50
-51
-51
-51
-51
-50
-50
-50
-50
-50
-50
-50
-51
-51
-52
-52
-52
-52
-51
-51
-51
-52
-52
-51
-48
-42
-39
-38
-38
-38
-38
-38
-38
-38
-38
-38
-38
-38
-38
-38
-38
-39
-40
-41
-42
-44
-45
-46
-47
-47
-48
-49
-49
-49
-49
-47
-41
-34
-30
-28
-28
-29
-33
-38
-41
-43
-46
-63
-96
-130
-146
-146
-134
-108
-79
-58
-53
-53
-53
-53
-53
-51
-49
-48
-47
-47
-47
-50
-53
-55
-57
-57
-58
-60
-66
-75
-85
-88
-93
-97
-103
-104
-102
-93
-85
-84
-122
-151
-160
-150
-123
-48
-18
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-70
-86
-92
-92
-91
-91
-92
-98
-104
-106
-105
-104
-103
-103
-102
-101
-88
-71
-50
-28
-13
-9
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-6
-19
-63
-72
-73
-71
-69
-76
-92
-103
-108
-110
-108
-107
-105
-102
-99
-95
-92
-91
-90
-91
-96
-98
-99
-99
-98
-93
-89
-83
-75
-65
-52
-46
-43
-42
-40
-37
-35
-35
-34
-34
-34
-35
-36
-38
-40
-44
-46
-48
-48
-49
-50
-53
-58
-65
-71
-78
-80
-82
-84
-87
-94
-98
-101
-102
-102
-101
-101
-100
-99
-98
-91
-86
-83
-81
-78
-51
-20
-7
-4
-5
-32
-69
-88
-96
-96
-89
-77
-70
-67
-68
-92
-147
-185
-204
-204
-189
-173
-152
-126
-96
-64
-56
-52
-51
-50
-49
-49
-49
-49
-50
-51
-51
-51
-51
-51
-50
-50
-50
-50
-50
-50
-51
-51
-52
-52
-52
-52
-51
-51
-51
-52
-52
-52
-50
-47
-40
-39
-39
-39
-39
-38
-38
-38
-38
-38
-38
-38
-38
-38
-39
-41
-43
-44
-46
-47
-47
-48
-48
-48
-48
-49
-51
-52
-52
-51
-46
-38
-32
-28
-28
-29
-33
-38
-41
-43
-45
-58
-89
-124
-145
-146
-138
-114
-85
-61
-54
-53
-53
-53
-53
-52
-50
-48
-47
-47
-47
-50
-53
-56
-57
-57
-58
-61
-66
-75
-85
-88
-91
-95
-101
-104
-103
-96
-87
-83
-107
-145
-159
-156
-140
-66
-27
-8
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-69
-86
-91
-91
-91
-89
-88
-92
-98
-105
-106
-105
-105
-103
-101
-89
-71
-50
-30
-14
-7
-5
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-16
-42
-73
-75
-72
-68
-68
-79
-95
-104
-109
-109
-109
-108
-107
-106
-105
-103
-102
-101
-100
-100
-99
-98
-97
-93
-86
-72
-63
-55
-48
-43
-40
-38
-37
-36
-35
-35
-34
-34
-34
-34
-34
-34
-34
-35
-37
-40
-42
-44
-45
-45
-45
-45
-47
-51
-56
-66
-72
-77
-80
-81
-84
-90
-95
-99
-101
-101
-101
-101
-101
-102
-101
-97
-92
-87
-85
-76
-46
-21
-6
-6
-16
-52
-79
-94
-95
-93
-81
-72
-67
-67
-78
-124
-169
-201
-207
-195
-180
-160
-136
-105
-69
-58
-53
-51
-50
-49
-49
-49
-49
-49
-51
-51
-51
-51
-51
-51
-50
-50
-50
-50
-50
-50
-51
-52
-52
-52
-52
-52
-51
-51
-51
-52
-52
-52
-51
-46
-42
-40
-40
-40
-40
-40
-39
-39
-39
-39
-40
-41
-42
-44
-46
-46
-47
-47
-47
-48
-48
-48
-48
-48
-49
-51
-53
-53
-53
-50
-41
-34
-30
-29
-30
-33
-38
-41
-43
-45
-55
-84
-118
-144
-146
-140
-119
-91
-64
-54
-54
-53
-53
-53
-52
-50
-49
-48
-48
-48
-51
-54
-56
-57
-57
-58
-61
-67
-75
-84
-87
-89
-92
-97
-103
-103
-99
-91
-84
-93
-135
-155
-159
-153
-92
-42
-14
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-68
-85
-91
-91
-90
-88
-85
-85
-90
-100
-103
-103
-101
-97
-91
-74
-53
-33
-17
-9
-6
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-9
-27
-59
-75
-74
-70
-67
-67
-80
-95
-104
-108
-109
-109
-108
-108
-107
-106
-104
-102
-101
-100
-99
-96
-91
-82
-72
-62
-51
-46
-43
-40
-38
-37
-37
-37
-38
-38
-38
-38
-38
-38
-37
-36
-35
-35
-35
-36
-38
-40
-41
-43
-43
-43
-43
-43
-44
-46
-52
-58
-64
-71
-75
-80
-83
-89
-94
-98
-99
-100
-100
-100
-100
-101
-99
-96
-93
-89
-84
-66
-39
-15
-7
-12
-38
-67
-89
-95
-94
-85
-75
-68
-67
-72
-107
-153
-193
-207
-199
-185
-167
-143
-114
-75
-61
-54
-51
-50
-49
-49
-49
-49
-49
-50
-51
-51
-51
-51
-51
-51
-50
-50
-50
-50
-50
-51
-52
-53
-53
-52
-52
-52
-51
-51
-52
-52
-52
-52
-50
-46
-43
-42
-41
-41
-42
-42
-42
-42
-43
-43
-44
-45
-46
-47
-47
-47
-47
-48
-48
-48
-48
-49
-49
-50
-52
-54
-55
-55
-51
-42
-35
-31
-30
-31
-35
-39
-42
-43
-45
-54
-83
-117
-143
-146
-141
-121
-93
-66
-55
-54
-53
-53
-53
-52
-51
-49
-48
-48
-49
-51
-54
-57
-57
-58
-58
-61
-67
-76
-83
-85
-87
-89
-94
-102
-103
-100
-94
-84
-89
-126
-150
-161
-157
-110
-55
-21
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-67
-84
-90
-91
-90
-89
-82
-79
-81
-89
-94
-95
-91
-84
-75
-51
-33
-20
-11
-7
-4
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-17
-40
-70
-77
-72
-68
-66
-67
-80
-94
-103
-108
-109
-108
-108
-108
-107
-105
-103
-101
-99
-95
-90
-79
-70
-61
-53
-46
-41
-40
-39
-39
-40
-41
-42
-43
-44
-44
-45
-45
-44
-43
-42
-40
-38
-37
-36
-35
-37
-38
-40
-41
-42
-42
-42
-42
-42
-42
-44
-48
-52
-57
-63
-69
-74
-80
-87
-94
-98
-99
-99
-99
-99
-100
-100
-99
-96
-93
-90
-80
-56
-30
-11
-11
-27
-55
-82
-94
-94
-88
-79
-70
-66
-69
-92
-137
-181
-205
-203
-191
-174
-152
-123
-82
-65
-55
-52
-50
-49
-49
-49
-49
-49
-50
-51
-52
-52
-52
-52
-52
-51
-51
-50
-50
-50
-51
-52
-53
-53
-53
-52
-52
-51
-51
-52
-52
-52
-52
-52
-50
-47
-45
-43
-42
-43
-43
-43
-44
-44
-45
-45
-46
-46
-47
-47
-47
-47
-48
-48
-48
-49
-49
-50
-51
-54
-55
-56
-56
-51
-42
-35
-31
-31
-32
-36
-39
-42
-43
-45
-55
-83
-117
-143
-145
-141
-121
-94
-66
-55
-54
-53
-53
-53
-52
-51
-50
-49
-49
-49
-52
-55
-57
-58
-58
-58
-62
-68
-76
-82
-84
-85
-87
-91
-100
-102
-101
-96
-85
-87
-117
-144
-161
-160
-126
-69
-29
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-67
-84
-90
-90
-90
-89
-81
-74
-71
-75
-80
-80
-74
-65
-53
-28
-17
-11
-8
-6
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-7
-27
-53
-75
-77
-70
-66
-65
-66
-80
-93
-101
-106
-107
-107
-107
-106
-104
-102
-98
-94
-89
-82
-72
-58
-50
-44
-41
-40
-40
-41
-42
-43
-44
-47
-48
-49
-49
-50
-50
-50
-50
-49
-48
-45
-43
-40
-38
-36
-36
-37
-38
-39
-41
-41
-41
-41
-41
-41
-41
-42
-43
-45
-49
-57
-62
-69
-76
-85
-94
-97
-98
-99
-99
-99
-100
-100
-99
-96
-93
-89
-73
-48
-18
-12
-19
-44
-72
-92
-93
-91
-82
-72
-66
-67
-81
-119
-166
-202
-205
-195
-181
-160
-132
-90
-69
-58
-52
-50
-49
-49
-49
-49
-49
-50
-51
-52
-52
-53
-53
-53
-52
-51
-51
-51
-51
-51
-52
-53
-53
-53
-53
-52
-52
-51
-51
-52
-52
-52
-52
-52
-51
-49
-47
-45
-44
-44
-44
-45
-45
-46
-46
-46
-47
-47
-47
-48
-48
-48
-49
-49
-50
-50
-51
-54
-56
-57
-57
-57
-51
-41
-35
-32
-32
-33
-37
-40
-43
-44
-46
-58
-86
-119
-143
-145
-140
-120
-93
-66
-55
-54
-54
-53
-53
-52
-51
-50
-49
-49
-50
-53
-56
-58
-58
-58
-59
-62
-68
-77
-81
-82
-83
-84
-87
-98
-101
-101
-97
-87
-86
-109
-138
-160
-161
-139
-83
-39
-10
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-66
-83
-89
-90
-90
-89
-81
-71
-64
-62
-63
-58
-50
-39
-26
-17
-14
-10
-7
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-12
-37
-63
-78
-77
-68
-65
-64
-65
-78
-90
-98
-103
-105
-105
-103
-102
-99
-95
-86
-76
-66
-56
-48
-43
-42
-41
-41
-41
-45
-46
-48
-49
-49
-49
-50
-50
-50
-51
-51
-52
-52
-52
-52
-50
-48
-45
-42
-39
-36
-36
-37
-38
-40
-40
-41
-41
-41
-41
-41
-41
-41
-41
-42
-44
-47
-53
-60
-69
-84
-92
-96
-98
-98
-99
-99
-100
-99
-99
-96
-94
-87
-68
-32
-15
-17
-33
-59
-87
-93
-92
-85
-76
-67
-66
-73
-103
-146
-195
-205
-200
-188
-169
-143
-99
-75
-61
-53
-51
-50
-49
-49
-49
-49
-50
-51
-52
-53
-54
-54
-54
-53
-52
-51
-51
-51
-51
-52
-53
-53
-53
-53
-53
-52
-51
-51
-51
-52
-52
-53
-53
-52
-52
-50
-48
-47
-46
-46
-46
-46
-46
-46
-47
-47
-48
-48
-48
-48
-49
-50
-50
-51
-52
-53
-56
-58
-58
-58
-57
-48
-39
-34
-32
-32
-34
-38
-41
-43
-44
-47
-61
-91
-122
-143
-144
-138
-118
-91
-66
-55
-54
-54
-53
-53
-53
-51
-50
-50
-50
-51
-54
-57
-58
-58
-58
-59
-62
-69
-77
-80
-80
-81
-82
-84
-95
-100
-101
-98
-89
-86
-102
-132
-158
-162
-149
-97
-49
-14
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-66
-82
-88
-89
-89
-90
-87
-74
-60
-53
-49
-41
-35
-30
-24
-17
-14
-9
-4
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-22
-50
-74
-80
-75
-67
-63
-63
-63
-71
-79
-84
-87
-88
-87
-81
-76
-70
-62
-53
-48
-45
-44
-43
-43
-44
-45
-47
-49
-49
-49
-49
-49
-49
-49
-49
-50
-50
-51
-52
-52
-53
-54
-54
-54
-54
-52
-49
-46
-41
-38
-36
-36
-37
-39
-39
-40
-40
-40
-40
-40
-40
-40
-41
-41
-42
-43
-45
-48
-60
-75
-87
-95
-98
-99
-99
-99
-100
-99
-98
-97
-95
-85
-64
-23
-20
-25
-42
-74
-92
-92
-89
-82
-70
-66
-68
-85
-119
-175
-206
-204
-195
-180
-158
-114
-86
-67
-56
-51
-50
-49
-49
-49
-48
-49
-51
-52
-53
-54
-55
-55
-55
-54
-53
-52
-52
-52
-52
-53
-54
-54
-54
-53
-53
-52
-51
-51
-51
-51
-52
-52
-53
-53
-53
-53
-52
-51
-50
-49
-49
-48
-48
-48
-48
-49
-49
-49
-50
-51
-52
-52
-53
-54
-56
-59
-59
-59
-57
-53
-43
-37
-34
-34
-34
-37
-41
-43
-45
-45
-50
-70
-101
-129
-144
-144
-134
-112
-85
-63
-55
-54
-54
-54
-54
-53
-52
-51
-51
-51
-52
-56
-58
-58
-59
-59
-59
-63
-70
-77
-78
-78
-78
-78
-80
-91
-98
-100
-98
-91
-85
-95
-124
-154
-162
-156
-114
-65
-23
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-65
-81
-87
-88
-88
-90
-88
-79
-66
-54
-49
-42
-37
-32
-27
-19
-15
-9
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-9
-33
-59
-78
-81
-74
-66
-62
-61
-61
-65
-69
-72
-72
-71
-68
-62
-58
-54
-50
-47
-45
-44
-44
-45
-46
-47
-48
-48
-49
-49
-48
-48
-48
-48
-48
-48
-48
-49
-50
-51
-52
-53
-55
-56
-57
-57
-55
-53
-50
-46
-42
-39
-37
-36
-37
-38
-38
-39
-39
-40
-40
-40
-40
-40
-41
-41
-41
-42
-43
-48
-56
-68
-82
-93
-98
-99
-99
-100
-100
-99
-98
-97
-92
-82
-39
-27
-25
-35
-59
-88
-91
-90
-85
-74
-66
-67
-76
-102
-154
-200
-204
-200
-188
-169
-127
-96
-74
-59
-52
-50
-49
-49
-49
-48
-49
-50
-52
-53
-55
-56
-56
-56
-56
-55
-53
-53
-53
-53
-53
-54
-54
-54
-54
-53
-52
-51
-51
-51
-51
-51
-52
-52
-53
-53
-53
-53
-53
-52
-52
-51
-51
-51
-51
-51
-51
-51
-52
-52
-53
-53
-54
-55
-56
-58
-59
-59
-58
-55
-49
-39
-36
-35
-35
-36
-40
-43
-44
-45
-46
-54
-80
-110
-135
-144
-143
-129
-105
-80
-61
-55
-54
-54
-54
-54
-53
-52
-52
-52
-52
-54
-57
-58
-59
-59
-59
-59
-64
-70
-77
-77
-76
-75
-76
-77
-88
-96
-99
-98
-92
-85
-92
-120
-150
-163
-159
-125
-76
-31
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-65
-80
-86
-87
-87
-89
-89
-84
-73
-59
-52
-47
-41
-36
-32
-22
-16
-8
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-15
-43
-67
-81
-82
-73
-65
-61
-60
-59
-60
-61
-61
-60
-58
-55
-51
-49
-47
-45
-45
-45
-45
-46
-47
-48
-48
-49
-49
-48
-48
-48
-48
-48
-47
-47
-47
-48
-48
-49
-51
-52
-54
-55
-57
-58
-59
-59
-57
-55
-50
-46
-43
-40
-37
-37
-37
-38
-38
-39
-39
-39
-39
-40
-40
-40
-40
-40
-41
-41
-43
-46
-54
-65
-80
-93
-97
-99
-99
-100
-99
-98
-98
-96
-92
-59
-36
-28
-32
-46
-82
-88
-90
-87
-79
-67
-66
-70
-88
-129
-191
-202
-202
-195
-179
-141
-108
-82
-64
-54
-50
-50
-49
-49
-48
-49
-50
-51
-53
-55
-57
-57
-57
-57
-57
-55
-54
-54
-54
-54
-54
-54
-54
-54
-54
-53
-52
-51
-51
-51
-51
-51
-52
-52
-53
-53
-53
-53
-53
-53
-53
-53
-53
-53
-53
-53
-53
-53
-54
-54
-55
-56
-57
-58
-59
-60
-58
-55
-50
-44
-37
-36
-36
-36
-38
-42
-44
-45
-46
-48
-63
-92
-119
-139
-144
-141
-122
-97
-74
-59
-55
-54
-54
-54
-54
-53
-52
-52
-52
-53
-56
-58
-59
-59
-59
-59
-60
-65
-71
-76
-76
-74
-74
-73
-74
-85
-94
-98
-97
-93
-85
-90
-115
-145
-163
-161
-135
-88
-39
-8
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-64
-79
-85
-86
-86
-89
-89
-87
-80
-66
-57
-53
-48
-43
-39
-27
-17
-8
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-22
-53
-74
-83
-83
-72
-65
-61
-59
-57
-56
-55
-54
-52
-50
-48
-46
-46
-45
-45
-45
-46
-47
-48
-48
-49
-49
-49
-49
-49
-49
-48
-48
-47
-47
-47
-47
-48
-48
-49
-52
-54
-55
-57
-58
-60
-61
-61
-61
-59
-54
-50
-47
-43
-40
-37
-37
-37
-38
-38
-39
-39
-39
-39
-39
-39
-39
-39
-40
-40
-41
-42
-44
-50
-62
-82
-92
-97
-99
-99
-99
-99
-98
-98
-96
-78
-49
-35
-32
-38
-72
-85
-89
-88
-83
-69
-66
-67
-78
-105
-176
-197
-204
-200
-189
-155
-122
-93
-70
-57
-51
-50
-49
-49
-48
-48
-49
-51
-53
-55
-58
-58
-59
-58
-58
-57
-56
-55
-55
-55
-55
-55
-55
-55
-55
-54
-52
-51
-51
-51
-50
-51
-51
-51
-52
-53
-53
-53
-53
-53
-54
-54
-54
-54
-54
-54
-54
-55
-55
-55
-56
-58
-59
-59
-60
-59
-56
-51
-45
-40
-36
-36
-37
-38
-41
-44
-45
-46
-48
-52
-75
-105
-128
-142
-144
-137
-113
-88
-68
-57
-55
-54
-54
-54
-54
-53
-53
-53
-53
-54
-58
-59
-60
-60
-59
-59
-60
-65
-71
-76
-76
-73
-72
-71
-72
-82
-93
-97
-97
-93
-85
-88
-111
-141
-163
-162
-143
-98
-48
-11
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-62
-78
-83
-84
-85
-87
-89
-89
-85
-76
-64
-60
-56
-52
-45
-33
-19
-9
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-5
-30
-62
-79
-85
-84
-71
-65
-61
-59
-56
-52
-51
-49
-47
-46
-46
-45
-45
-45
-45
-47
-48
-48
-49
-49
-50
-51
-51
-51
-51
-49
-49
-48
-47
-47
-47
-47
-48
-49
-50
-54
-57
-59
-60
-61
-62
-62
-63
-63
-62
-60
-55
-50
-46
-44
-40
-38
-38
-38
-38
-39
-39
-38
-38
-37
-37
-37
-38
-38
-39
-40
-41
-42
-43
-45
-63
-81
-92
-97
-99
-99
-99
-99
-98
-98
-91
-63
-44
-34
-35
-60
-80
-88
-89
-87
-73
-67
-66
-71
-85
-156
-190
-203
-203
-197
-169
-136
-105
-79
-61
-52
-50
-49
-49
-48
-48
-49
-50
-52
-54
-58
-59
-60
-60
-59
-58
-57
-57
-56
-56
-55
-55
-55
-55
-55
-54
-53
-52
-51
-51
-50
-50
-50
-50
-51
-52
-52
-53
-53
-53
-54
-54
-54
-55
-55
-55
-55
-55
-56
-57
-58
-59
-59
-59
-59
-56
-51
-45
-41
-38
-37
-37
-39
-41
-44
-46
-46
-47
-51
-59
-90
-119
-136
-144
-143
-130
-102
-79
-62
-55
-55
-54
-54
-54
-54
-54
-54
-54
-54
-56
-59
-60
-60
-60
-59
-59
-61
-66
-72
-75
-75
-72
-70
-70
-70
-80
-91
-96
-97
-94
-85
-87
-108
-136
-163
-163
-150
-108
-57
-15
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-60
-75
-81
-82
-82
-85
-88
-89
-88
-83
-72
-66
-62
-58
-52
-39
-21
-9
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-9
-43
-72
-84
-86
-85
-71
-65
-62
-59
-56
-50
-48
-47
-46
-46
-46
-46
-46
-46
-47
-49
-49
-50
-51
-51
-52
-52
-52
-52
-51
-48
-47
-47
-47
-47
-48
-50
-52
-55
-58
-60
-61
-61
-62
-62
-63
-63
-64
-64
-64
-63
-61
-57
-51
-47
-44
-42
-41
-41
-40
-39
-39
-38
-38
-37
-37
-37
-37
-38
-38
-39
-40
-41
-42
-42
-44
-55
-72
-88
-97
-98
-98
-99
-98
-98
-96
-82
-59
-41
-38
-47
-71
-84
-88
-88
-80
-70
-66
-67
-72
-120
-169
-196
-206
-204
-186
-157
-125
-95
-71
-55
-52
-50
-49
-49
-48
-48
-49
-51
-53
-57
-59
-60
-61
-61
-60
-60
-59
-58
-57
-57
-57
-57
-56
-56
-55
-54
-53
-52
-51
-50
-50
-49
-49
-49
-49
-50
-50
-51
-52
-52
-53
-53
-53
-54
-55
-55
-56
-57
-57
-58
-58
-58
-57
-53
-47
-43
-40
-39
-38
-39
-41
-43
-45
-46
-47
-48
-51
-61
-78
-112
-133
-142
-143
-139
-112
-86
-68
-57
-55
-55
-55
-55
-54
-54
-54
-55
-55
-56
-59
-61
-61
-61
-60
-60
-60
-62
-67
-73
-75
-74
-70
-69
-68
-69
-77
-89
-95
-96
-94
-85
-86
-104
-131
-162
-164
-156
-119
-69
-21
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-57
-73
-79
-80
-80
-82
-86
-88
-88
-86
-78
-73
-69
-65
-59
-45
-25
-10
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-14
-52
-77
-86
-87
-85
-71
-65
-62
-60
-56
-50
-48
-46
-46
-45
-46
-46
-47
-48
-49
-50
-50
-51
-51
-52
-52
-51
-51
-49
-48
-47
-46
-47
-48
-49
-53
-55
-57
-58
-59
-60
-61
-61
-62
-62
-63
-63
-63
-63
-63
-63
-63
-60
-57
-52
-46
-44
-43
-42
-41
-40
-40
-39
-38
-37
-37
-37
-38
-38
-38
-39
-40
-41
-41
-42
-42
-46
-55
-69
-88
-97
-98
-98
-98
-98
-97
-90
-70
-50
-40
-44
-63
-78
-87
-88
-83
-73
-67
-66
-68
-98
-149
-184
-202
-206
-196
-172
-142
-110
-82
-60
-54
-51
-49
-49
-48
-48
-49
-50
-52
-56
-58
-60
-61
-62
-62
-61
-60
-60
-59
-58
-58
-58
-58
-57
-57
-55
-54
-52
-51
-50
-49
-49
-49
-48
-48
-49
-49
-50
-50
-51
-51
-52
-52
-53
-54
-54
-55
-56
-56
-56
-55
-52
-49
-46
-43
-41
-40
-40
-40
-42
-44
-45
-46
-47
-48
-51
-60
-76
-97
-127
-138
-142
-138
-129
-96
-75
-62
-56
-55
-55
-55
-55
-55
-55
-55
-56
-57
-58
-60
-62
-62
-61
-60
-60
-60
-62
-68
-73
-74
-73
-70
-68
-68
-68
-76
-88
-94
-95
-93
-84
-86
-102
-128
-161
-165
-159
-126
-79
-27
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-55
-71
-77
-78
-77
-78
-85
-88
-88
-87
-81
-77
-74
-70
-65
-48
-26
-11
-2
-1
-1
-1
-1
-1
-1
-1
-1
-2
-7
-18
-60
-80
-88
-89
-86
-72
-66
-63
-61
-58
-51
-48
-46
-45
-45
-46
-46
-47
-48
-50
-50
-51
-51
-51
-51
-51
-50
-49
-47
-46
-46
-48
-49
-51
-54
-56
-58
-59
-59
-60
-60
-60
-60
-60
-60
-60
-60
-60
-61
-61
-62
-62
-61
-59
-55
-50
-47
-45
-43
-42
-41
-40
-39
-38
-38
-38
-38
-39
-40
-40
-40
-40
-41
-41
-42
-42
-43
-46
-55
-70
-90
-96
-98
-98
-98
-98
-94
-79
-60
-43
-44
-56
-72
-85
-87
-85
-77
-69
-65
-65
-82
-127
-167
-196
-206
-203
-185
-159
-128
-96
-68
-58
-52
-50
-49
-48
-48
-48
-49
-50
-54
-57
-59
-61
-62
-63
-62
-62
-61
-60
-59
-59
-59
-59
-59
-58
-57
-55
-54
-52
-50
-49
-49
-48
-47
-47
-47
-47
-48
-48
-49
-49
-50
-51
-51
-52
-52
-53
-52
-52
-50
-49
-46
-44
-43
-41
-41
-41
-42
-43
-44
-46
-46
-47
-48
-50
-59
-75
-94
-115
-136
-140
-138
-130
-113
-81
-66
-58
-55
-55
-55
-55
-55
-55
-56
-56
-57
-59
-60
-62
-62
-62
-61
-60
-60
-60
-63
-69
-73
-74
-72
-69
-68
-68
-68
-75
-87
-93
-94
-93
-84
-85
-100
-125
-160
-166
-161
-133
-88
-33
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-52
-68
-74
-75
-74
-75
-82
-87
-88
-88
-84
-81
-77
-73
-68
-48
-25
-10
-2
-1
-1
-1
-1
-1
-1
-1
-1
-3
-9
-23
-66
-83
-90
-90
-87
-73
-66
-63
-62
-60
-53
-48
-46
-46
-45
-46
-46
-47
-48
-49
-50
-50
-51
-50
-50
-49
-47
-47
-46
-47
-48
-51
-53
-56
-57
-58
-58
-58
-58
-58
-57
-56
-55
-55
-54
-54
-54
-55
-55
-56
-58
-59
-59
-59
-57
-53
-49
-46
-44
-43
-42
-41
-40
-39
-39
-39
-40
-41
-42
-42
-42
-42
-42
-42
-43
-43
-42
-43
-45
-52
-77
-90
-96
-98
-98
-98
-97
-86
-69
-48
-45
-52
-67
-81
-87
-86
-80
-72
-66
-64
-71
-104
-147
-185
-204
-207
-196
-175
-146
-113
-78
-64
-55
-51
-50
-49
-48
-48
-48
-49
-52
-55
-58
-61
-62
-63
-63
-63
-62
-62
-61
-60
-60
-60
-60
-59
-58
-57
-55
-54
-51
-50
-49
-48
-47
-46
-46
-45
-45
-46
-46
-47
-47
-48
-48
-48
-48
-48
-47
-46
-45
-43
-42
-42
-42
-41
-42
-43
-44
-45
-46
-47
-47
-48
-50
-58
-75
-94
-113
-130
-140
-138
-131
-117
-95
-68
-59
-56
-55
-55
-55
-56
-56
-56
-57
-58
-59
-61
-62
-63
-63
-62
-61
-60
-60
-60
-64
-69
-73
-73
-71
-69
-68
-68
-68
-75
-86
-92
-94
-92
-84
-84
-98
-123
-159
-167
-163
-138
-96
-40
-6
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-49
-64
-70
-71
-71
-72
-79
-85
-88
-88
-85
-82
-79
-74
-67
-45
-22
-8
-2
-1
-1
-1
-1
-1
-1
-1
-1
-3
-10
-26
-72
-86
-91
-91
-88
-74
-67
-64
-63
-61
-55
-50
-47
-46
-45
-46
-46
-47
-48
-49
-50
-49
-49
-48
-47
-46
-46
-46
-47
-50
-54
-56
-57
-58
-58
-58
-57
-55
-54
-52
-49
-48
-47
-47
-46
-46
-46
-47
-47
-48
-51
-52
-54
-56
-56
-55
-51
-48
-46
-44
-43
-42
-41
-40
-40
-40
-42
-43
-44
-44
-44
-44
-45
-45
-45
-44
-43
-43
-43
-44
-57
-78
-91
-97
-98
-98
-97
-91
-77
-54
-46
-49
-62
-77
-86
-86
-83
-75
-67
-63
-66
-84
-123
-167
-200
-208
-203
-189
-165
-133
-92
-72
-60
-53
-50
-49
-49
-48
-48
-48
-50
-53
-56
-60
-62
-63
-64
-64
-63
-63
-62
-61
-61
-61
-60
-60
-59
-58
-57
-55
-53
-51
-49
-48
-47
-45
-44
-44
-43
-42
-42
-42
-42
-42
-42
-42
-42
-41
-41
-41
-41
-41
-41
-41
-42
-43
-44
-45
-46
-47
-47
-48
-48
-50
-54
-75
-97
-115
-129
-138
-139
-132
-118
-99
-76
-59
-56
-55
-55
-56
-56
-56
-57
-58
-59
-60
-61
-63
-63
-63
-63
-63
-61
-60
-60
-61
-66
-70
-73
-73
-70
-68
-68
-68
-68
-74
-85
-91
-93
-91
-83
-84
-96
-121
-158
-168
-165
-143
-104
-47
-7
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-46
-58
-64
-65
-65
-66
-74
-81
-86
-87
-85
-81
-77
-69
-58
-35
-16
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-14
-33
-76
-87
-92
-92
-90
-76
-68
-64
-63
-63
-59
-54
-49
-46
-45
-45
-45
-46
-46
-46
-46
-46
-46
-46
-46
-47
-50
-53
-55
-57
-58
-57
-57
-55
-52
-49
-47
-45
-44
-43
-43
-42
-42
-42
-43
-43
-43
-43
-43
-43
-44
-45
-46
-47
-47
-48
-48
-48
-46
-45
-43
-43
-42
-42
-42
-43
-43
-44
-44
-44
-44
-45
-46
-48
-52
-51
-49
-46
-43
-43
-44
-57
-75
-90
-97
-98
-98
-94
-83
-60
-47
-48
-58
-71
-85
-86
-85
-79
-71
-64
-63
-70
-96
-134
-178
-207
-208
-202
-187
-161
-118
-91
-71
-59
-52
-49
-49
-49
-48
-48
-48
-50
-53
-56
-59
-63
-64
-64
-64
-64
-64
-63
-63
-63
-62
-62
-61
-60
-58
-56
-54
-52
-50
-49
-47
-45
-44
-43
-42
-42
-41
-40
-40
-40
-40
-40
-40
-40
-40
-41
-42
-42
-44
-45
-46
-47
-47
-47
-47
-48
-49
-50
-54
-64
-82
-110
-124
-133
-137
-138
-128
-112
-93
-75
-60
-56
-55
-56
-56
-56
-57
-58
-59
-60
-61
-63
-64
-64
-64
-64
-64
-62
-61
-60
-60
-62
-67
-71
-73
-73
-69
-68
-68
-68
-68
-74
-84
-90
-91
-90
-83
-83
-95
-119
-157
-169
-166
-149
-113
-56
-10
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-43
-53
-58
-60
-60
-60
-66
-75
-81
-83
-82
-78
-71
-61
-48
-25
-11
-3
-1
-1
-1
-1
-1
-1
-1
-1
-2
-6
-16
-37
-79
-88
-92
-92
-91
-79
-69
-64
-63
-63
-61
-58
-54
-49
-47
-46
-46
-46
-46
-46
-46
-46
-47
-48
-51
-54
-56
-57
-57
-57
-54
-51
-49
-47
-45
-44
-43
-42
-42
-42
-42
-42
-42
-42
-42
-42
-43
-43
-43
-43
-44
-44
-45
-45
-46
-46
-46
-45
-45
-44
-43
-43
-43
-43
-43
-44
-44
-44
-45
-45
-45
-45
-46
-49
-55
-58
-57
-53
-48
-44
-43
-48
-62
-80
-94
-98
-97
-94
-84
-63
-47
-48
-56
-68
-83
-86
-85
-81
-74
-66
-62
-66
-81
-110
-155
-195
-205
-207
-198
-180
-140
-110
-86
-68
-57
-51
-50
-49
-48
-48
-48
-48
-50
-52
-55
-59
-62
-63
-64
-65
-64
-64
-64
-64
-64
-64
-63
-62
-61
-59
-56
-54
-52
-50
-48
-46
-45
-44
-43
-42
-41
-41
-41
-41
-41
-41
-42
-43
-44
-45
-46
-46
-47
-47
-47
-48
-48
-48
-48
-49
-52
-60
-73
-90
-109
-128
-133
-136
-136
-130
-109
-91
-75
-63
-57
-55
-56
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-65
-64
-64
-63
-62
-61
-61
-61
-63
-69
-72
-73
-72
-69
-68
-68
-68
-69
-74
-84
-89
-91
-89
-82
-82
-94
-118
-156
-169
-167
-152
-118
-62
-12
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-41
-48
-52
-53
-53
-51
-56
-63
-70
-73
-72
-67
-59
-48
-35
-14
-6
-2
-1
-1
-1
-1
-1
-1
-1
-1
-2
-7
-18
-39
-81
-89
-93
-93
-91
-81
-70
-65
-63
-63
-63
-61
-58
-55
-52
-49
-48
-48
-48
-49
-50
-51
-53
-54
-56
-57
-56
-55
-53
-50
-47
-46
-44
-43
-42
-42
-41
-41
-41
-41
-42
-42
-42
-42
-42
-42
-43
-43
-43
-43
-43
-44
-44
-45
-45
-45
-45
-45
-44
-44
-44
-44
-44
-44
-44
-44
-45
-45
-45
-45
-46
-47
-49
-52
-58
-65
-65
-63
-57
-49
-44
-45
-53
-67
-87
-96
-96
-94
-85
-64
-47
-48
-54
-66
-81
-86
-86
-83
-77
-69
-63
-63
-71
-91
-129
-178
-198
-207
-206
-196
-163
-132
-104
-81
-64
-54
-51
-50
-49
-48
-48
-48
-48
-50
-52
-56
-59
-61
-63
-64
-64
-64
-64
-64
-64
-64
-64
-64
-63
-62
-59
-58
-56
-54
-52
-50
-48
-47
-46
-45
-45
-44
-44
-44
-45
-45
-46
-46
-47
-47
-48
-48
-48
-48
-48
-48
-48
-49
-51
-56
-67
-83
-99
-114
-127
-136
-136
-133
-125
-112
-89
-74
-64
-57
-55
-56
-57
-57
-58
-59
-61
-62
-63
-64
-65
-65
-65
-65
-64
-64
-63
-62
-61
-61
-61
-65
-70
-72
-73
-72
-68
-68
-68
-68
-69
-73
-83
-88
-89
-88
-81
-82
-93
-118
-156
-170
-168
-155
-124
-68
-14
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-40
-43
-45
-46
-46
-42
-43
-47
-51
-53
-53
-48
-40
-30
-20
-5
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-7
-19
-42
-83
-90
-93
-93
-91
-83
-72
-65
-62
-62
-63
-63
-62
-60
-58
-54
-53
-53
-53
-53
-55
-57
-58
-58
-57
-55
-52
-49
-46
-44
-42
-42
-41
-41
-41
-41
-41
-41
-41
-41
-42
-42
-42
-42
-43
-43
-43
-43
-43
-43
-44
-44
-44
-44
-45
-45
-45
-45
-45
-44
-44
-44
-44
-45
-45
-45
-45
-46
-47
-48
-49
-53
-56
-60
-65
-73
-73
-72
-68
-59
-46
-45
-47
-56
-74
-92
-93
-92
-83
-63
-47
-47
-53
-64
-80
-86
-86
-84
-79
-72
-64
-62
-65
-77
-103
-156
-184
-202
-209
-206
-184
-156
-126
-99
-76
-59
-54
-51
-50
-49
-48
-48
-48
-48
-49
-52
-55
-57
-60
-62
-63
-64
-64
-64
-64
-64
-64
-64
-64
-63
-62
-60
-59
-57
-56
-54
-52
-51
-50
-50
-49
-49
-49
-49
-49
-50
-49
-49
-49
-49
-49
-49
-48
-49
-49
-49
-52
-55
-62
-72
-92
-109
-122
-132
-136
-137
-132
-122
-107
-90
-70
-62
-58
-56
-56
-57
-58
-59
-60
-61
-63
-64
-65
-66
-66
-66
-65
-65
-64
-64
-63
-61
-61
-61
-61
-67
-71
-72
-72
-71
-68
-68
-68
-69
-69
-73
-82
-87
-88
-87
-81
-81
-93
-117
-156
-170
-169
-157
-128
-74
-17
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-38
-39
-39
-39
-39
-31
-29
-27
-26
-24
-22
-17
-12
-7
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-3
-8
-21
-46
-84
-91
-93
-93
-91
-85
-75
-67
-61
-61
-61
-62
-62
-62
-61
-60
-60
-59
-59
-59
-59
-59
-58
-55
-50
-45
-43
-42
-42
-41
-41
-41
-41
-41
-41
-41
-41
-41
-42
-42
-42
-43
-43
-44
-44
-45
-45
-45
-45
-45
-45
-45
-45
-45
-45
-45
-45
-45
-45
-46
-46
-46
-46
-46
-46
-47
-47
-48
-50
-52
-56
-62
-68
-75
-79
-82
-83
-82
-80
-74
-52
-47
-46
-49
-57
-82
-87
-86
-78
-59
-45
-46
-52
-63
-79
-86
-86
-85
-81
-75
-67
-63
-63
-68
-81
-129
-165
-191
-206
-212
-202
-179
-151
-121
-93
-68
-59
-54
-51
-50
-49
-48
-48
-48
-48
-49
-50
-52
-55
-58
-61
-62
-63
-64
-64
-64
-64
-64
-64
-63
-62
-61
-61
-60
-59
-57
-56
-56
-55
-54
-53
-53
-52
-52
-51
-51
-50
-50
-49
-49
-49
-49
-49
-49
-50
-52
-59
-70
-84
-101
-123
-131
-135
-136
-137
-133
-119
-102
-84
-68
-59
-57
-56
-57
-57
-59
-60
-61
-62
-63
-65
-66
-67
-67
-67
-66
-65
-65
-64
-64
-62
-61
-61
-61
-62
-69
-72
-73
-72
-70
-68
-68
-68
-69
-70
-73
-81
-86
-87
-86
-80
-81
-93
-117
-156
-171
-169
-160
-132
-79
-20
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-37
-36
-34
-32
-30
-25
-22
-18
-15
-13
-8
-7
-5
-3
-3
-2
-2
-1
-1
-1
-1
-1
-2
-2
-3
-3
-5
-11
-24
-47
-85
-91
-93
-93
-92
-86
-77
-68
-61
-57
-58
-59
-61
-61
-61
-61
-60
-59
-58
-56
-49
-44
-42
-42
-42
-41
-41
-41
-41
-40
-40
-41
-41
-41
-41
-42
-43
-45
-46
-48
-50
-52
-54
-55
-56
-58
-58
-58
-58
-58
-58
-57
-56
-55
-53
-52
-51
-51
-50
-50
-50
-50
-51
-52
-53
-56
-59
-62
-66
-71
-80
-86
-92
-98
-105
-106
-103
-99
-95
-92
-73
-56
-48
-47
-49
-59
-66
-67
-63
-52
-44
-44
-51
-63
-79
-87
-87
-85
-82
-78
-70
-65
-62
-62
-65
-94
-131
-165
-191
-207
-212
-202
-184
-158
-129
-93
-74
-61
-54
-51
-49
-49
-48
-48
-48
-48
-48
-48
-49
-50
-52
-54
-56
-57
-59
-60
-61
-61
-62
-62
-61
-61
-60
-59
-58
-57
-56
-56
-55
-54
-53
-52
-52
-51
-50
-50
-49
-49
-49
-49
-49
-50
-52
-57
-64
-81
-97
-112
-125
-133
-135
-136
-136
-132
-124
-101
-83
-71
-63
-59
-57
-57
-58
-59
-60
-61
-63
-64
-65
-67
-68
-68
-68
-67
-67
-66
-65
-65
-64
-63
-62
-61
-61
-62
-65
-71
-72
-72
-72
-70
-68
-68
-69
-70
-71
-73
-80
-84
-86
-85
-80
-80
-92
-117
-156
-171
-170
-162
-137
-86
-23
-8
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-37
-35
-33
-30
-28
-24
-21
-18
-14
-12
-9
-8
-7
-6
-5
-4
-3
-3
-2
-2
-2
-2
-2
-3
-3
-4
-5
-11
-24
-47
-84
-90
-93
-93
-92
-87
-78
-69
-61
-56
-54
-55
-56
-57
-57
-55
-54
-51
-49
-47
-45
-44
-43
-43
-42
-40
-40
-40
-40
-40
-42
-43
-45
-47
-49
-53
-55
-58
-60
-62
-65
-67
-69
-70
-72
-73
-74
-75
-75
-76
-76
-75
-75
-75
-74
-73
-72
-71
-71
-70
-71
-71
-73
-74
-77
-80
-84
-89
-94
-99
-107
-112
-117
-121
-124
-125
-123
-118
-111
-105
-91
-69
-55
-48
-48
-51
-53
-52
-49
-43
-41
-42
-51
-65
-80
-87
-87
-86
-83
-79
-72
-68
-64
-61
-61
-74
-104
-138
-170
-195
-210
-208
-199
-182
-158
-121
-96
-77
-64
-56
-52
-51
-50
-49
-49
-48
-48
-48
-48
-49
-50
-50
-51
-52
-53
-55
-55
-56
-56
-56
-56
-56
-56
-55
-54
-54
-53
-52
-52
-51
-50
-50
-50
-49
-49
-49
-49
-50
-51
-52
-58
-65
-74
-86
-100
-116
-124
-130
-133
-136
-135
-130
-121
-109
-93
-76
-68
-63
-59
-58
-58
-59
-60
-61
-62
-64
-66
-67
-68
-68
-69
-68
-68
-67
-67
-66
-65
-64
-64
-63
-62
-62
-62
-64
-67
-72
-72
-72
-71
-69
-69
-69
-70
-71
-71
-73
-79
-83
-85
-84
-79
-80
-92
-117
-157
-172
-171
-163
-140
-91
-26
-9
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-37
-35
-32
-29
-27
-23
-21
-19
-17
-16
-14
-13
-12
-11
-10
-7
-6
-5
-4
-3
-3
-3
-3
-3
-3
-4
-6
-13
-26
-49
-83
-90
-93
-93
-92
-88
-80
-71
-62
-55
-52
-51
-51
-52
-52
-52
-51
-51
-50
-49
-47
-44
-41
-40
-39
-39
-40
-41
-43
-46
-49
-53
-56
-59
-61
-65
-67
-70
-72
-74
-77
-78
-80
-82
-83
-85
-86
-87
-88
-89
-90
-90
-91
-92
-92
-92
-93
-93
-93
-94
-95
-97
-99
-101
-104
-109
-113
-117
-122
-127
-133
-136
-139
-141
-143
-142
-141
-136
-129
-121
-109
-86
-66
-52
-49
-48
-47
-44
-40
-38
-38
-41
-52
-67
-81
-87
-88
-86
-84
-80
-74
-70
-66
-63
-59
-64
-82
-110
-143
-175
-202
-208
-207
-198
-183
-150
-124
-101
-82
-67
-56
-53
-52
-51
-50
-49
-49
-49
-49
-49
-49
-49
-49
-50
-50
-51
-51
-51
-51
-52
-52
-51
-51
-51
-51
-51
-50
-50
-50
-50
-49
-49
-49
-50
-51
-53
-56
-60
-66
-73
-86
-96
-106
-116
-125
-133
-135
-135
-134
-130
-120
-109
-96
-84
-73
-64
-61
-59
-59
-59
-60
-61
-62
-64
-65
-67
-68
-69
-69
-69
-69
-68
-68
-67
-66
-65
-65
-64
-63
-63
-62
-62
-64
-66
-70
-72
-72
-72
-71
-69
-69
-70
-71
-72
-72
-74
-78
-82
-83
-83
-79
-80
-92
-118
-158
-172
-171
-164
-142
-95
-29
-10
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-36
-34
-31
-28
-27
-24
-23
-22
-21
-21
-20
-20
-19
-17
-16
-14
-11
-9
-7
-5
-4
-3
-3
-4
-4
-5
-8
-15
-29
-52
-83
-90
-93
-93
-93
-90
-83
-73
-63
-55
-50
-49
-48
-48
-49
-50
-51
-51
-51
-49
-46
-41
-37
-36
-37
-39
-42
-45
-49
-54
-60
-64
-67
-70
-73
-75
-77
-79
-81
-82
-84
-86
-88
-89
-91
-93
-94
-96
-97
-99
-100
-102
-103
-105
-106
-108
-110
-111
-113
-115
-117
-120
-123
-126
-130
-135
-139
-143
-146
-150
-153
-156
-157
-159
-159
-158
-156
-153
-147
-137
-126
-105
-81
-60
-50
-48
-45
-40
-36
-35
-36
-41
-55
-70
-83
-88
-88
-87
-85
-82
-77
-72
-69
-65
-60
-60
-66
-85
-114
-148
-186
-201
-208
-208
-201
-178
-155
-130
-106
-85
-66
-59
-55
-52
-51
-50
-50
-49
-49
-49
-49
-49
-49
-49
-49
-49
-48
-48
-48
-48
-49
-49
-49
-49
-49
-49
-49
-50
-50
-51
-52
-54
-56
-59
-63
-70
-77
-85
-94
-105
-119
-127
-134
-137
-138
-136
-133
-128
-122
-113
-95
-82
-72
-66
-62
-60
-60
-59
-60
-61
-62
-64
-65
-67
-68
-70
-70
-70
-70
-70
-69
-68
-68
-67
-66
-65
-65
-64
-63
-63
-63
-64
-66
-68
-71
-72
-72
-71
-70
-69
-69
-71
-73
-73
-74
-74
-78
-81
-82
-81
-79
-80
-92
-119
-160
-172
-172
-165
-144
-100
-31
-11
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-36
-34
-31
-28
-27
-25
-25
-24
-24
-24
-24
-24
-24
-24
-23
-22
-20
-17
-13
-8
-5
-4
-4
-4
-5
-7
-10
-18
-33
-56
-83
-89
-92
-93
-93
-91
-86
-77
-65
-56
-51
-49
-48
-48
-50
-52
-52
-48
-41
-34
-32
-33
-34
-36
-38
-43
-49
-54
-60
-64
-69
-72
-74
-76
-78
-80
-82
-83
-85
-86
-89
-91
-92
-94
-96
-98
-100
-102
-103
-105
-107
-109
-111
-112
-114
-117
-119
-121
-124
-126
-131
-135
-139
-143
-147
-152
-155
-158
-161
-164
-167
-168
-169
-170
-171
-171
-169
-167
-163
-154
-141
-126
-100
-73
-52
-49
-45
-40
-36
-35
-36
-44
-58
-73
-84
-88
-88
-87
-86
-83
-79
-74
-71
-67
-62
-60
-59
-66
-84
-115
-162
-188
-204
-211
-212
-201
-184
-162
-137
-112
-84
-69
-60
-55
-53
-51
-51
-50
-50
-49
-49
-49
-48
-48
-48
-48
-48
-48
-48
-48
-48
-49
-49
-49
-50
-50
-51
-52
-53
-55
-60
-66
-74
-84
-95
-110
-121
-130
-136
-140
-141
-142
-141
-140
-137
-131
-120
-106
-92
-78
-67
-64
-62
-61
-60
-60
-60
-61
-62
-63
-66
-68
-69
-70
-71
-71
-71
-71
-70
-70
-69
-68
-68
-67
-66
-65
-65
-64
-64
-64
-64
-66
-68
-71
-72
-72
-72
-71
-70
-70
-70
-73
-74
-75
-75
-75
-77
-79
-81
-80
-78
-79
-93
-120
-161
-173
-172
-166
-146
-103
-34
-12
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-36
-33
-30
-27
-27
-25
-25
-25
-25
-25
-25
-26
-25
-25
-25
-24
-24
-24
-24
-23
-17
-12
-9
-8
-12
-20
-27
-35
-44
-58
-79
-87
-91
-91
-91
-91
-89
-84
-75
-63
-54
-53
-53
-54
-54
-51
-43
-36
-31
-31
-33
-35
-36
-37
-40
-46
-52
-58
-64
-69
-74
-77
-80
-82
-85
-88
-91
-93
-96
-99
-102
-105
-107
-110
-112
-115
-117
-119
-121
-123
-125
-127
-129
-131
-133
-136
-139
-142
-145
-149
-155
-159
-162
-165
-168
-171
-172
-174
-175
-176
-177
-178
-178
-179
-179
-179
-178
-178
-176
-173
-161
-150
-130
-102
-68
-52
-48
-42
-37
-35
-37
-47
-61
-75
-85
-89
-90
-89
-87
-84
-80
-77
-74
-71
-67
-62
-60
-59
-62
-72
-113
-148
-178
-200
-210
-212
-207
-198
-184
-164
-134
-112
-92
-75
-64
-57
-55
-53
-52
-51
-51
-50
-50
-50
-50
-50
-51
-51
-52
-53
-55
-58
-61
-65
-71
-80
-89
-98
-107
-117
-129
-135
-140
-142
-144
-145
-146
-146
-145
-143
-139
-133
-123
-111
-98
-81
-73
-68
-64
-63
-62
-61
-61
-61
-61
-62
-63
-65
-67
-69
-71
-72
-72
-72
-72
-72
-71
-71
-70
-70
-69
-68
-68
-67
-66
-65
-65
-65
-65
-65
-67
-69
-71
-72
-72
-72
-71
-71
-70
-70
-72
-76
-77
-78
-77
-76
-77
-78
-79
-79
-78
-79
-93
-121
-163
-174
-173
-167
-148
-107
-37
-14
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-37
-33
-30
-27
-26
-25
-25
-26
-26
-26
-27
-27
-28
-27
-27
-25
-24
-24
-24
-24
-23
-22
-21
-20
-22
-35
-45
-52
-57
-63
-77
-84
-89
-90
-90
-90
-89
-86
-81
-72
-63
-60
-58
-57
-54
-44
-36
-32
-32
-33
-35
-36
-37
-38
-40
-48
-55
-63
-69
-75
-81
-84
-88
-91
-94
-98
-101
-104
-107
-110
-114
-116
-119
-121
-124
-127
-129
-131
-134
-136
-139
-142
-145
-148
-152
-157
-161
-165
-168
-171
-174
-175
-176
-177
-177
-178
-179
-179
-179
-180
-180
-180
-180
-180
-180
-180
-180
-180
-180
-179
-173
-164
-150
-126
-92
-59
-51
-45
-41
-38
-39
-47
-61
-75
-86
-91
-91
-91
-89
-86
-81
-77
-75
-73
-70
-66
-62
-60
-59
-62
-80
-109
-140
-170
-195
-209
-210
-207
-201
-193
-175
-157
-139
-121
-104
-87
-78
-71
-67
-64
-62
-62
-63
-64
-66
-70
-74
-79
-85
-91
-99
-106
-112
-118
-123
-128
-131
-135
-138
-141
-143
-144
-144
-144
-143
-139
-134
-127
-120
-112
-100
-92
-85
-79
-74
-68
-65
-63
-62
-62
-61
-61
-62
-63
-64
-66
-68
-70
-71
-72
-73
-73
-73
-73
-73
-72
-72
-71
-71
-70
-69
-68
-68
-67
-67
-66
-66
-67
-67
-68
-70
-71
-72
-72
-72
-72
-71
-71
-71
-71
-74
-79
-80
-80
-79
-77
-77
-78
-78
-78
-77
-79
-94
-123
-165
-174
-173
-168
-150
-110
-39
-14
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-38
-34
-30
-27
-26
-25
-25
-26
-26
-27
-27
-27
-28
-29
-29
-27
-25
-24
-24
-24
-24
-25
-27
-31
-35
-46
-57
-66
-72
-75
-81
-85
-87
-88
-89
-89
-89
-88
-85
-79
-70
-66
-62
-56
-49
-36
-32
-31
-32
-34
-36
-37
-38
-39
-41
-50
-59
-67
-75
-81
-87
-90
-94
-98
-101
-105
-109
-112
-115
-118
-121
-124
-126
-129
-131
-135
-137
-140
-143
-146
-150
-154
-158
-163
-167
-172
-175
-178
-179
-181
-181
-181
-181
-181
-181
-181
-181
-181
-181
-181
-181
-181
-181
-181
-181
-181
-181
-181
-181
-181
-179
-174
-165
-148
-118
-75
-59
-49
-43
-41
-41
-48
-60
-74
-85
-92
-93
-92
-90
-87
-82
-78
-76
-74
-72
-69
-65
-62
-59
-58
-64
-80
-103
-131
-162
-191
-202
-207
-207
-205
-196
-187
-175
-163
-149
-132
-122
-114
-108
-104
-101
-101
-103
-104
-107
-112
-116
-120
-124
-128
-133
-136
-139
-141
-143
-144
-144
-144
-142
-140
-135
-130
-126
-121
-116
-108
-102
-96
-90
-84
-76
-71
-68
-66
-64
-63
-62
-62
-62
-62
-63
-64
-65
-67
-69
-71
-72
-73
-74
-74
-74
-74
-74
-74
-74
-73
-72
-72
-71
-71
-70
-69
-69
-68
-68
-68
-68
-69
-69
-70
-71
-72
-72
-72
-72
-72
-71
-71
-71
-72
-77
-82
-84
-84
-82
-77
-77
-77
-77
-77
-77
-78
-95
-125
-166
-175
-174
-168
-151
-113
-41
-15
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-40
-36
-32
-28
-26
-25
-25
-25
-26
-26
-26
-26
-27
-29
-30
-29
-26
-24
-23
-23
-23
-24
-28
-34
-39
-47
-59
-71
-81
-85
-86
-86
-87
-87
-88
-88
-88
-87
-86
-83
-76
-69
-62
-53
-42
-32
-31
-31
-32
-35
-37
-38
-39
-40
-43
-54
-64
-72
-79
-85
-91
-95
-99
-103
-107
-112
-115
-118
-121
-124
-128
-131
-133
-136
-139
-143
-146
-149
-152
-155
-161
-166
-171
-175
-178
-182
-183
-183
-183
-183
-182
-182
-182
-181
-181
-181
-181
-182
-182
-182
-182
-182
-182
-182
-182
-181
-181
-181
-181
-181
-181
-180
-176
-165
-145
-98
-72
-55
-47
-44
-44
-49
-59
-73
-85
-93
-94
-94
-92
-89
-84
-80
-77
-75
-73
-71
-69
-65
-61
-58
-59
-63
-75
-94
-120
-158
-181
-195
-203
-205
-204
-201
-197
-191
-184
-173
-165
-158
-153
-148
-145
-145
-145
-147
-148
-150
-151
-152
-151
-151
-149
-146
-144
-140
-137
-133
-130
-126
-121
-116
-108
-102
-96
-89
-83
-76
-72
-69
-67
-65
-64
-64
-63
-63
-63
-63
-63
-64
-64
-65
-67
-69
-70
-72
-73
-75
-75
-76
-76
-76
-75
-75
-75
-75
-74
-74
-73
-72
-72
-72
-71
-70
-70
-70
-70
-70
-70
-71
-71
-72
-72
-72
-72
-72
-72
-72
-71
-71
-72
-73
-81
-86
-88
-87
-86
-78
-77
-76
-76
-76
-76
-78
-96
-127
-168
-176
-174
-169
-152
-115
-43
-16
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-45
-42
-36
-30
-26
-24
-24
-24
-24
-25
-24
-24
-26
-28
-29
-29
-26
-24
-23
-23
-24
-24
-23
-23
-24
-32
-48
-64
-77
-85
-89
-89
-89
-88
-88
-87
-86
-86
-85
-83
-77
-69
-59
-48
-36
-31
-31
-31
-33
-36
-39
-40
-41
-42
-44
-57
-67
-76
-83
-89
-95
-100
-105
-109
-113
-118
-122
-125
-128
-132
-136
-139
-142
-145
-148
-153
-157
-160
-165
-169
-177
-181
-184
-186
-186
-185
-184
-184
-183
-182
-181
-181
-181
-181
-181
-182
-182
-183
-183
-184
-185
-185
-184
-184
-183
-182
-181
-181
-181
-181
-182
-182
-181
-178
-168
-127
-91
-66
-51
-46
-46
-49
-58
-71
-84
-93
-95
-95
-94
-91
-86
-82
-79
-76
-73
-72
-71
-68
-65
-60
-59
-59
-62
-68
-81
-112
-141
-167
-188
-199
-203
-201
-199
-197
-194
-190
-187
-183
-180
-176
-173
-170
-167
-165
-162
-159
-157
-154
-151
-148
-142
-135
-127
-119
-110
-98
-90
-83
-78
-73
-69
-68
-66
-65
-65
-64
-64
-64
-64
-63
-63
-63
-63
-63
-64
-65
-66
-68
-69
-71
-73
-74
-75
-76
-77
-77
-77
-77
-77
-77
-76
-76
-75
-75
-75
-74
-73
-73
-73
-72
-72
-72
-72
-72
-72
-72
-72
-72
-72
-72
-72
-72
-72
-72
-72
-72
-72
-72
-73
-75
-86
-90
-92
-92
-90
-80
-77
-76
-76
-76
-76
-78
-97
-129
-170
-176
-174
-169
-152
-117
-45
-17
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-26
-33
-36
-37
-36
-34
-32
-30
-30
-30
-32
-32
-32
-30
-29
-23
-22
-22
-22
-23
-26
-28
-28
-28
-26
-25
-27
-33
-44
-59
-77
-83
-87
-89
-89
-88
-87
-86
-84
-82
-77
-69
-59
-48
-37
-32
-32
-33
-36
-41
-42
-42
-42
-44
-49
-65
-76
-85
-92
-98
-106
-111
-116
-120
-125
-130
-134
-137
-141
-144
-149
-153
-156
-160
-163
-169
-173
-179
-184
-189
-191
-190
-190
-188
-187
-183
-181
-180
-180
-180
-180
-181
-182
-184
-186
-189
-191
-194
-196
-198
-199
-199
-199
-198
-196
-192
-188
-184
-182
-181
-181
-181
-182
-182
-181
-166
-131
-95
-66
-50
-47
-48
-54
-65
-80
-93
-96
-97
-97
-94
-89
-85
-81
-78
-75
-72
-72
-71
-69
-66
-61
-60
-59
-60
-61
-68
-84
-105
-128
-151
-175
-185
-191
-192
-192
-189
-186
-183
-179
-176
-171
-167
-163
-158
-152
-141
-131
-120
-108
-97
-84
-78
-73
-70
-67
-66
-65
-65
-64
-64
-64
-64
-64
-64
-65
-65
-65
-65
-66
-66
-67
-69
-70
-71
-73
-74
-75
-76
-77
-77
-78
-79
-79
-79
-79
-79
-78
-78
-77
-77
-76
-76
-75
-75
-75
-74
-74
-74
-74
-74
-73
-73
-73
-73
-73
-72
-72
-72
-72
-72
-72
-72
-72
-72
-72
-72
-73
-74
-77
-81
-92
-97
-99
-98
-96
-84
-78
-76
-75
-75
-75
-78
-99
-132
-172
-177
-175
-169
-153
-119
-47
-18
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-16
-18
-19
-20
-21
-21
-21
-21
-22
-22
-22
-22
-22
-22
-21
-21
-21
-23
-25
-29
-34
-36
-36
-36
-35
-30
-29
-29
-33
-37
-46
-53
-61
-70
-79
-86
-87
-86
-85
-83
-78
-72
-63
-52
-41
-37
-38
-41
-44
-45
-43
-42
-43
-47
-56
-73
-83
-91
-98
-104
-112
-117
-121
-126
-130
-136
-140
-144
-148
-151
-156
-160
-163
-168
-172
-179
-184
-188
-191
-192
-192
-189
-186
-183
-180
-179
-179
-179
-180
-182
-185
-188
-190
-193
-196
-200
-203
-205
-207
-209
-210
-211
-211
-210
-209
-206
-202
-197
-192
-186
-182
-181
-182
-182
-182
-177
-157
-126
-92
-62
-49
-49
-52
-60
-74
-90
-96
-99
-99
-98
-92
-87
-83
-79
-76
-73
-72
-72
-71
-69
-65
-63
-61
-59
-59
-61
-67
-76
-89
-104
-125
-138
-149
-158
-164
-166
-166
-163
-159
-154
-145
-136
-127
-117
-107
-96
-89
-83
-79
-75
-71
-70
-68
-68
-67
-67
-68
-69
-69
-70
-71
-72
-72
-73
-74
-74
-75
-75
-76
-77
-77
-78
-78
-79
-79
-80
-80
-80
-80
-81
-80
-80
-80
-80
-79
-79
-78
-78
-77
-77
-76
-76
-75
-75
-75
-75
-74
-74
-74
-74
-74
-73
-73
-73
-73
-73
-73
-73
-73
-73
-73
-72
-72
-72
-73
-73
-75
-78
-81
-86
-97
-103
-104
-104
-101
-87
-80
-76
-75
-74
-75
-78
-100
-134
-173
-178
-175
-170
-154
-120
-48
-18
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-19
-19
-19
-19
-19
-20
-20
-20
-20
-20
-20
-20
-21
-22
-23
-25
-27
-30
-34
-37
-41
-42
-43
-42
-42
-38
-35
-33
-32
-31
-34
-37
-42
-49
-57
-65
-72
-78
-82
-82
-80
-76
-70
-63
-53
-50
-51
-52
-51
-47
-43
-42
-46
-53
-66
-81
-89
-97
-104
-110
-117
-122
-127
-132
-136
-143
-147
-151
-155
-159
-164
-167
-172
-178
-183
-189
-192
-193
-194
-192
-187
-182
-179
-178
-176
-178
-180
-183
-185
-188
-191
-194
-197
-200
-203
-207
-210
-212
-214
-215
-217
-217
-217
-217
-216
-215
-212
-208
-203
-197
-188
-184
-182
-182
-182
-181
-173
-153
-122
-86
-56
-51
-50
-55
-65
-85
-93
-98
-100
-100
-96
-90
-85
-81
-77
-74
-73
-72
-71
-70
-68
-66
-64
-61
-59
-58
-60
-63
-68
-75
-87
-97
-106
-115
-122
-127
-127
-125
-121
-116
-107
-99
-92
-86
-80
-74
-72
-70
-70
-70
-71
-72
-73
-74
-75
-76
-77
-77
-78
-79
-79
-80
-80
-81
-81
-81
-82
-82
-82
-82
-83
-83
-83
-83
-83
-82
-82
-82
-82
-82
-81
-81
-80
-80
-79
-78
-78
-78
-77
-77
-76
-76
-76
-75
-75
-75
-75
-75
-74
-74
-74
-74
-73
-73
-73
-73
-73
-73
-73
-73
-73
-73
-73
-73
-74
-75
-78
-82
-87
-92
-103
-108
-110
-110
-107
-91
-82
-77
-75
-74
-74
-78
-101
-136
-175
-179
-175
-170
-154
-121
-49
-19
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-29
-28
-28
-27
-26
-26
-25
-25
-25
-25
-25
-26
-27
-28
-30
-33
-37
-40
-42
-45
-46
-47
-47
-47
-47
-46
-43
-40
-38
-35
-34
-34
-33
-34
-37
-42
-51
-62
-70
-73
-75
-76
-74
-70
-64
-61
-59
-57
-52
-46
-42
-45
-52
-63
-76
-89
-96
-103
-110
-116
-123
-129
-134
-139
-144
-150
-154
-159
-163
-167
-172
-177
-183
-189
-193
-196
-196
-194
-191
-186
-179
-175
-174
-175
-177
-181
-184
-188
-191
-193
-196
-199
-202
-205
-209
-213
-215
-216
-218
-219
-219
-220
-220
-220
-220
-220
-219
-216
-213
-209
-199
-190
-185
-183
-182
-182
-181
-171
-151
-118
-72
-58
-51
-52
-57
-76
-88
-96
-101
-102
-100
-95
-89
-83
-78
-75
-74
-73
-72
-71
-70
-69
-67
-64
-61
-59
-59
-59
-60
-61
-64
-68
-73
-78
-84
-88
-88
-86
-84
-80
-74
-71
-70
-69
-69
-70
-71
-72
-73
-75
-77
-79
-81
-82
-83
-84
-85
-85
-85
-85
-85
-85
-85
-85
-85
-85
-85
-85
-85
-85
-85
-85
-84
-84
-84
-83
-83
-82
-82
-81
-81
-80
-80
-79
-79
-78
-78
-77
-77
-77
-76
-76
-76
-76
-75
-75
-75
-75
-75
-75
-74
-74
-74
-74
-73
-73
-73
-73
-73
-73
-74
-74
-74
-75
-76
-78
-82
-87
-93
-98
-109
-114
-116
-116
-113
-96
-84
-78
-75
-74
-74
-78
-103
-139
-176
-179
-175
-170
-154
-122
-50
-19
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-38
-38
-38
-37
-37
-36
-36
-35
-35
-35
-35
-36
-37
-39
-40
-43
-45
-46
-47
-48
-50
-50
-50
-50
-50
-49
-48
-46
-44
-42
-39
-37
-35
-34
-34
-34
-35
-37
-42
-48
-59
-65
-66
-65
-63
-58
-52
-46
-42
-40
-42
-51
-64
-76
-86
-96
-103
-110
-117
-123
-130
-136
-141
-147
-152
-158
-163
-167
-171
-175
-182
-188
-194
-198
-199
-198
-195
-189
-182
-173
-172
-172
-174
-177
-183
-189
-190
-192
-193
-194
-198
-201
-205
-210
-213
-217
-219
-220
-220
-221
-221
-221
-221
-221
-221
-221
-222
-221
-219
-216
-210
-202
-193
-185
-183
-183
-182
-181
-172
-153
-101
-72
-56
-50
-51
-63
-80
-92
-99
-103
-103
-100
-94
-87
-80
-76
-74
-73
-72
-71
-71
-71
-70
-68
-65
-61
-59
-59
-59
-60
-60
-61
-62
-63
-64
-65
-65
-65
-65
-65
-65
-66
-67
-69
-71
-74
-77
-79
-81
-83
-84
-85
-85
-86
-86
-86
-86
-86
-86
-86
-86
-86
-86
-86
-86
-85
-85
-85
-85
-85
-85
-85
-84
-84
-84
-83
-82
-82
-81
-80
-80
-79
-79
-78
-78
-78
-77
-77
-77
-77
-76
-76
-76
-76
-76
-76
-76
-76
-76
-75
-75
-75
-75
-75
-75
-75
-75
-75
-75
-75
-75
-76
-77
-78
-79
-83
-88
-94
-100
-105
-114
-120
-122
-122
-120
-101
-87
-79
-75
-73
-74
-78
-104
-141
-177
-180
-176
-170
-155
-122
-50
-19
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-51
-51
-50
-50
-50
-49
-49
-49
-49
-49
-49
-49
-50
-51
-52
-54
-55
-56
-57
-58
-60
-60
-60
-60
-60
-59
-57
-56
-54
-52
-50
-48
-46
-44
-42
-39
-38
-37
-37
-37
-38
-39
-39
-39
-39
-39
-39
-40
-42
-46
-61
-72
-81
-89
-95
-106
-113
-120
-126
-131
-139
-145
-150
-155
-161
-167
-171
-176
-180
-186
-195
-200
-201
-201
-199
-190
-177
-170
-167
-168
-172
-179
-184
-188
-190
-191
-191
-192
-193
-196
-203
-209
-213
-216
-218
-219
-219
-219
-218
-216
-213
-213
-213
-214
-216
-219
-221
-222
-223
-223
-219
-215
-207
-198
-188
-183
-183
-183
-181
-177
-147
-110
-79
-58
-50
-51
-62
-77
-91
-100
-104
-104
-102
-97
-90
-80
-76
-74
-72
-72
-71
-71
-71
-70
-69
-67
-64
-63
-61
-61
-61
-60
-60
-60
-61
-61
-62
-63
-64
-65
-68
-71
-73
-75
-76
-77
-76
-75
-73
-70
-67
-66
-66
-67
-68
-69
-71
-74
-77
-79
-81
-81
-82
-82
-83
-83
-83
-83
-83
-83
-82
-82
-82
-82
-81
-81
-80
-80
-80
-79
-79
-79
-78
-78
-78
-78
-78
-78
-78
-79
-79
-80
-80
-80
-80
-80
-80
-80
-80
-80
-80
-80
-80
-80
-80
-80
-79
-80
-80
-80
-81
-82
-83
-84
-87
-92
-97
-103
-109
-113
-121
-127
-129
-130
-128
-110
-93
-82
-76
-73
-74
-79
-106
-144
-178
-180
-176
-170
-155
-123
-51
-20
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-60
-60
-60
-60
-59
-59
-59
-59
-58
-58
-59
-59
-59
-60
-61
-62
-63
-64
-65
-65
-66
-67
-67
-67
-66
-65
-64
-63
-61
-60
-58
-56
-55
-53
-51
-49
-48
-46
-45
-43
-43
-43
-43
-43
-44
-46
-48
-52
-58
-65
-76
-83
-90
-97
-104
-114
-121
-127
-132
-138
-146
-152
-157
-162
-168
-174
-179
-184
-190
-197
-201
-202
-201
-196
-186
-171
-168
-167
-168
-173
-183
-186
-188
-189
-190
-189
-189
-191
-194
-200
-207
-211
-214
-216
-217
-215
-212
-208
-203
-199
-196
-194
-195
-196
-198
-203
-209
-215
-219
-222
-222
-220
-216
-208
-199
-187
-184
-183
-182
-181
-169
-141
-109
-80
-58
-50
-54
-63
-76
-92
-102
-103
-103
-101
-97
-88
-82
-77
-74
-72
-71
-71
-71
-70
-70
-69
-68
-66
-65
-64
-62
-61
-61
-61
-61
-62
-63
-65
-67
-70
-73
-74
-74
-73
-70
-65
-61
-57
-54
-52
-50
-49
-48
-47
-47
-49
-50
-52
-54
-56
-62
-66
-71
-74
-77
-79
-80
-81
-81
-81
-81
-81
-81
-81
-81
-80
-80
-80
-80
-79
-79
-79
-80
-80
-81
-82
-82
-83
-84
-85
-86
-86
-86
-87
-87
-87
-87
-88
-88
-87
-87
-87
-87
-86
-86
-86
-86
-86
-86
-86
-87
-88
-89
-91
-95
-99
-105
-110
-115
-118
-124
-131
-134
-135
-134
-117
-98
-84
-77
-73
-74
-79
-108
-145
-179
-180
-176
-170
-155
-123
-51
-20
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-70
-70
-69
-69
-69
-69
-68
-68
-68
-68
-68
-68
-69
-69
-70
-71
-71
-72
-72
-73
-73
-73
-73
-73
-73
-72
-71
-70
-69
-67
-65
-64
-63
-61
-60
-58
-57
-56
-55
-53
-52
-52
-52
-53
-55
-58
-62
-66
-72
-78
-86
-92
-99
-106
-113
-122
-128
-134
-139
-145
-153
-159
-164
-170
-174
-181
-187
-193
-198
-203
-203
-200
-191
-181
-171
-163
-165
-170
-176
-182
-188
-189
-189
-188
-186
-186
-187
-191
-196
-202
-209
-211
-213
-213
-211
-206
-200
-195
-190
-186
-184
-184
-185
-186
-189
-194
-198
-204
-210
-216
-222
-223
-221
-217
-209
-196
-188
-185
-183
-183
-179
-163
-138
-107
-77
-55
-52
-54
-63
-77
-95
-100
-102
-102
-100
-95
-89
-84
-79
-75
-72
-72
-71
-71
-70
-70
-69
-68
-67
-66
-64
-63
-62
-62
-63
-65
-67
-69
-71
-73
-74
-72
-69
-65
-61
-57
-55
-53
-53
-52
-52
-53
-53
-52
-51
-49
-47
-45
-44
-44
-47
-50
-54
-57
-61
-67
-70
-74
-76
-78
-79
-80
-80
-80
-80
-80
-80
-80
-80
-81
-81
-82
-83
-84
-86
-88
-89
-90
-91
-92
-93
-94
-94
-94
-95
-95
-95
-95
-95
-95
-95
-95
-94
-94
-94
-93
-93
-93
-93
-93
-94
-95
-97
-99
-102
-106
-111
-115
-119
-122
-127
-134
-138
-140
-139
-125
-103
-88
-78
-74
-74
-80
-109
-147
-180
-181
-176
-170
-154
-123
-51
-20
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-79
-79
-79
-79
-79
-78
-78
-78
-78
-78
-78
-78
-78
-78
-79
-79
-79
-80
-80
-80
-81
-81
-80
-80
-80
-79
-78
-77
-76
-75
-73
-72
-71
-70
-69
-68
-67
-66
-65
-64
-64
-64
-65
-66
-68
-72
-75
-80
-84
-89
-95
-102
-109
-115
-122
-129
-135
-141
-146
-152
-160
-166
-171
-177
-181
-189
-195
-201
-205
-205
-200
-190
-177
-165
-160
-163
-170
-178
-185
-189
-189
-188
-186
-184
-183
-183
-186
-191
-198
-204
-208
-210
-210
-208
-203
-195
-189
-184
-180
-178
-178
-180
-181
-183
-186
-189
-192
-195
-200
-207
-218
-222
-223
-222
-218
-206
-195
-188
-185
-184
-183
-178
-162
-137
-105
-69
-57
-51
-53
-61
-83
-94
-99
-101
-101
-99
-95
-91
-86
-81
-76
-74
-73
-72
-71
-71
-70
-70
-69
-68
-66
-66
-66
-66
-67
-70
-72
-74
-74
-74
-71
-66
-61
-57
-54
-53
-54
-55
-57
-59
-62
-64
-66
-67
-66
-62
-58
-53
-48
-44
-41
-40
-40
-42
-45
-51
-56
-61
-65
-69
-72
-74
-76
-77
-78
-79
-80
-80
-81
-82
-83
-85
-87
-89
-91
-94
-95
-97
-98
-99
-100
-101
-101
-102
-102
-103
-103
-103
-103
-103
-102
-102
-102
-102
-101
-101
-101
-100
-101
-101
-101
-102
-104
-106
-109
-113
-116
-120
-123
-125
-129
-137
-142
-144
-144
-133
-110
-92
-79
-74
-74
-80
-110
-149
-180
-181
-176
-169
-154
-123
-50
-19
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-89
-89
-88
-88
-88
-88
-88
-87
-87
-87
-87
-87
-87
-87
-87
-88
-88
-88
-88
-88
-88
-88
-88
-87
-87
-86
-85
-84
-83
-82
-81
-80
-79
-78
-77
-76
-76
-75
-75
-75
-75
-75
-76
-78
-80
-83
-86
-90
-94
-99
-107
-113
-119
-124
-129
-137
-142
-148
-153
-159
-167
-173
-178
-183
-188
-198
-204
-206
-206
-204
-188
-168
-159
-157
-159
-171
-182
-188
-190
-189
-187
-183
-181
-180
-180
-181
-185
-192
-198
-204
-206
-206
-205
-201
-196
-187
-182
-178
-176
-176
-177
-179
-181
-183
-186
-189
-192
-195
-198
-200
-209
-217
-222
-224
-223
-216
-205
-195
-187
-184
-184
-183
-177
-163
-137
-93
-70
-55
-49
-51
-64
-82
-94
-99
-99
-98
-96
-94
-92
-88
-83
-80
-76
-74
-73
-72
-71
-71
-71
-70
-70
-71
-72
-73
-75
-76
-76
-75
-74
-71
-62
-56
-53
-52
-52
-53
-53
-55
-56
-59
-63
-67
-72
-76
-80
-82
-80
-75
-68
-59
-48
-42
-39
-37
-37
-38
-39
-42
-45
-50
-57
-62
-66
-70
-73
-76
-78
-80
-81
-82
-84
-87
-89
-92
-95
-98
-99
-101
-102
-103
-104
-105
-106
-107
-108
-108
-109
-109
-109
-109
-109
-109
-108
-108
-108
-108
-107
-107
-107
-108
-108
-109
-110
-112
-114
-117
-119
-122
-125
-128
-131
-139
-145
-149
-149
-141
-117
-97
-81
-75
-75
-81
-111
-150
-181
-181
-176
-170
-154
-122
-50
-19
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-101
-101
-101
-101
-101
-101
-100
-100
-100
-100
-100
-99
-99
-99
-99
-99
-99
-99
-99
-99
-98
-98
-98
-97
-97
-96
-95
-94
-93
-92
-91
-90
-90
-89
-88
-88
-87
-87
-87
-87
-88
-89
-90
-92
-94
-98
-101
-105
-109
-113
-119
-124
-129
-134
-140
-147
-152
-157
-163
-169
-177
-182
-187
-193
-200
-207
-208
-206
-198
-182
-154
-153
-155
-161
-176
-189
-190
-190
-188
-183
-178
-178
-179
-179
-179
-181
-186
-192
-199
-202
-203
-203
-200
-195
-187
-178
-174
-172
-172
-174
-178
-182
-187
-192
-195
-198
-199
-199
-200
-201
-204
-209
-216
-222
-224
-223
-217
-207
-197
-187
-184
-184
-183
-179
-170
-135
-104
-78
-59
-49
-50
-59
-74
-88
-96
-95
-94
-94
-92
-91
-89
-87
-85
-83
-81
-79
-78
-78
-77
-77
-77
-78
-78
-78
-78
-77
-75
-71
-65
-57
-52
-51
-51
-52
-52
-52
-53
-53
-53
-53
-57
-63
-71
-78
-85
-91
-92
-91
-87
-81
-71
-63
-56
-49
-44
-39
-38
-38
-38
-39
-40
-42
-45
-49
-53
-60
-66
-71
-75
-79
-83
-86
-89
-92
-95
-99
-100
-102
-103
-104
-106
-107
-108
-109
-110
-111
-112
-112
-112
-113
-113
-113
-113
-113
-113
-112
-112
-113
-113
-113
-114
-115
-115
-116
-118
-120
-121
-124
-127
-130
-133
-141
-148
-153
-154
-149
-128
-105
-85
-76
-75
-82
-113
-152
-182
-182
-176
-170
-154
-121
-48
-19
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-111
-111
-111
-110
-110
-110
-110
-110
-109
-109
-109
-109
-108
-108
-108
-108
-107
-107
-107
-107
-106
-106
-105
-105
-104
-103
-103
-102
-101
-100
-99
-98
-98
-97
-96
-96
-96
-96
-96
-97
-98
-99
-100
-102
-104
-108
-111
-114
-118
-122
-128
-133
-138
-143
-147
-154
-159
-164
-170
-176
-183
-188
-194
-201
-207
-208
-206
-193
-176
-157
-150
-154
-165
-178
-187
-190
-189
-186
-181
-178
-177
-177
-177
-178
-178
-180
-187
-193
-198
-201
-202
-201
-196
-189
-180
-173
-171
-171
-174
-178
-188
-196
-202
-207
-211
-213
-213
-212
-210
-207
-206
-209
-213
-218
-223
-225
-222
-215
-206
-195
-186
-185
-184
-183
-179
-160
-133
-105
-80
-61
-49
-52
-59
-71
-84
-92
-92
-91
-90
-88
-88
-87
-86
-85
-83
-82
-81
-81
-80
-80
-80
-80
-79
-79
-78
-74
-69
-63
-57
-52
-51
-51
-51
-52
-52
-52
-52
-53
-53
-53
-56
-61
-68
-77
-87
-96
-100
-100
-98
-93
-84
-76
-68
-61
-54
-48
-45
-42
-41
-39
-40
-41
-43
-46
-49
-55
-61
-66
-71
-76
-81
-85
-89
-92
-95
-99
-101
-102
-104
-105
-107
-108
-110
-111
-112
-113
-113
-114
-114
-114
-114
-114
-114
-114
-114
-114
-114
-114
-114
-115
-115
-116
-117
-118
-119
-121
-122
-125
-129
-132
-136
-142
-150
-156
-158
-155
-136
-112
-89
-77
-76
-82
-114
-153
-182
-182
-176
-170
-153
-119
-47
-18
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-120
-120
-120
-120
-120
-120
-119
-119
-119
-119
-118
-118
-118
-117
-117
-116
-116
-116
-115
-115
-114
-114
-113
-112
-112
-111
-110
-109
-108
-108
-107
-106
-105
-105
-105
-104
-104
-105
-105
-106
-107
-108
-110
-112
-114
-117
-121
-124
-128
-132
-137
-141
-146
-150
-155
-161
-166
-171
-177
-182
-189
-196
-202
-207
-209
-206
-191
-173
-157
-147
-153
-166
-178
-187
-191
-189
-185
-180
-177
-176
-176
-176
-177
-178
-178
-181
-188
-194
-198
-200
-200
-197
-191
-183
-175
-171
-171
-173
-179
-187
-200
-208
-214
-219
-222
-223
-223
-221
-220
-217
-212
-211
-213
-216
-221
-225
-224
-220
-214
-204
-191
-187
-185
-184
-183
-175
-157
-133
-106
-81
-58
-52
-52
-58
-69
-82
-87
-87
-86
-85
-84
-84
-84
-84
-84
-83
-82
-82
-81
-81
-81
-80
-78
-77
-74
-67
-61
-56
-52
-50
-50
-50
-51
-51
-51
-51
-51
-52
-53
-53
-55
-60
-67
-77
-87
-100
-105
-107
-106
-103
-94
-86
-78
-70
-63
-56
-52
-48
-46
-44
-43
-43
-43
-45
-48
-54
-59
-64
-69
-74
-80
-85
-89
-92
-96
-99
-102
-104
-106
-107
-110
-111
-113
-114
-115
-116
-117
-117
-117
-117
-117
-117
-116
-116
-116
-116
-116
-116
-116
-116
-117
-118
-118
-119
-120
-123
-124
-127
-131
-135
-139
-144
-152
-159
-162
-159
-145
-120
-94
-78
-77
-83
-115
-153
-182
-182
-177
-170
-153
-118
-46
-17
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-130
-130
-130
-129
-129
-129
-129
-129
-128
-128
-127
-127
-127
-126
-126
-125
-125
-124
-123
-123
-122
-121
-121
-120
-119
-118
-117
-117
-116
-115
-114
-114
-113
-113
-113
-113
-113
-113
-114
-114
-116
-117
-119
-121
-123
-127
-130
-133
-137
-140
-145
-149
-153
-157
-162
-168
-173
-178
-184
-188
-196
-203
-208
-210
-208
-194
-169
-153
-145
-149
-164
-180
-188
-190
-189
-184
-179
-176
-175
-175
-176
-177
-177
-178
-179
-182
-188
-194
-197
-198
-197
-193
-186
-178
-171
-170
-172
-178
-187
-199
-212
-219
-224
-226
-228
-228
-228
-228
-227
-225
-220
-216
-215
-216
-219
-224
-225
-224
-220
-212
-198
-190
-187
-185
-185
-183
-174
-157
-134
-107
-76
-60
-53
-52
-55
-69
-77
-81
-82
-81
-79
-79
-79
-80
-80
-81
-81
-81
-81
-80
-79
-77
-75
-71
-67
-58
-53
-51
-49
-49
-50
-50
-49
-49
-48
-49
-50
-52
-53
-53
-55
-59
-67
-77
-88
-102
-109
-113
-113
-111
-102
-94
-86
-78
-71
-63
-58
-55
-52
-50
-48
-47
-47
-48
-50
-55
-60
-65
-69
-74
-80
-85
-89
-93
-97
-101
-103
-106
-108
-110
-113
-115
-116
-118
-119
-120
-121
-121
-121
-121
-120
-120
-120
-119
-119
-118
-118
-118
-118
-118
-119
-120
-120
-121
-123
-126
-127
-130
-133
-138
-143
-147
-154
-161
-165
-164
-152
-128
-100
-80
-78
-84
-115
-154
-183
-182
-177
-170
-152
-116
-44
-17
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-139
-139
-139
-139
-139
-139
-138
-138
-138
-137
-137
-136
-136
-135
-135
-134
-133
-132
-132
-131
-130
-129
-128
-128
-127
-126
-125
-124
-123
-123
-122
-122
-121
-121
-121
-121
-121
-121
-122
-123
-125
-126
-128
-130
-132
-136
-139
-142
-145
-149
-153
-157
-161
-165
-168
-174
-180
-185
-190
-194
-205
-210
-211
-209
-204
-164
-147
-142
-146
-158
-185
-190
-191
-189
-185
-177
-175
-175
-175
-175
-176
-178
-179
-180
-181
-183
-188
-193
-196
-196
-195
-190
-182
-174
-169
-170
-174
-184
-197
-210
-222
-226
-228
-229
-229
-230
-230
-229
-229
-229
-228
-223
-220
-218
-219
-223
-225
-225
-224
-219
-206
-196
-189
-186
-185
-185
-183
-175
-159
-136
-101
-78
-62
-53
-50
-55
-62
-70
-75
-75
-73
-71
-70
-70
-72
-75
-77
-78
-78
-78
-75
-72
-67
-62
-56
-50
-49
-48
-48
-49
-49
-48
-47
-46
-46
-46
-49
-51
-52
-53
-55
-59
-67
-78
-90
-105
-113
-118
-119
-117
-109
-102
-94
-86
-78
-69
-64
-60
-57
-55
-54
-54
-55
-56
-57
-60
-63
-67
-71
-75
-81
-86
-90
-94
-98
-103
-105
-108
-111
-113
-116
-118
-120
-121
-123
-124
-125
-125
-125
-125
-125
-125
-124
-124
-123
-123
-122
-122
-122
-122
-122
-123
-124
-125
-126
-129
-131
-134
-137
-142
-147
-150
-156
-163
-167
-167
-160
-136
-106
-82
-80
-85
-116
-155
-183
-182
-177
-170
-152
-114
-43
-16
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-152
-152
-152
-152
-151
-151
-151
-151
-150
-150
-149
-149
-148
-147
-147
-145
-145
-144
-143
-142
-141
-140
-139
-138
-137
-136
-135
-134
-133
-133
-132
-132
-131
-131
-131
-131
-132
-132
-133
-134
-136
-138
-140
-142
-144
-147
-150
-153
-156
-159
-163
-167
-170
-173
-177
-184
-188
-193
-198
-206
-212
-212
-208
-194
-162
-138
-138
-148
-165
-186
-191
-190
-187
-182
-176
-174
-174
-175
-176
-179
-182
-183
-183
-183
-183
-184
-188
-192
-194
-195
-193
-185
-176
-170
-169
-171
-182
-197
-211
-223
-229
-229
-229
-230
-230
-230
-230
-230
-230
-230
-229
-228
-226
-223
-221
-223
-225
-226
-226
-224
-216
-206
-196
-189
-186
-186
-186
-184
-179
-168
-141
-116
-92
-72
-57
-49
-50
-53
-57
-64
-68
-67
-65
-62
-60
-57
-58
-59
-60
-60
-59
-58
-55
-52
-49
-47
-47
-47
-47
-47
-46
-44
-43
-43
-43
-45
-48
-51
-53
-53
-55
-61
-70
-81
-93
-109
-117
-123
-125
-124
-117
-109
-101
-93
-85
-76
-70
-66
-63
-62
-61
-62
-63
-64
-66
-69
-71
-73
-76
-79
-84
-89
-94
-98
-102
-106
-109
-112
-114
-117
-120
-122
-123
-125
-126
-127
-128
-128
-129
-129
-130
-130
-130
-130
-129
-129
-129
-129
-129
-129
-130
-130
-131
-132
-134
-137
-139
-142
-144
-149
-154
-156
-160
-165
-170
-170
-166
-146
-116
-86
-82
-88
-118
-155
-183
-182
-177
-169
-150
-111
-40
-15
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-161
-161
-161
-161
-161
-161
-160
-160
-160
-159
-159
-158
-157
-156
-156
-154
-153
-152
-151
-150
-149
-148
-147
-146
-144
-143
-142
-141
-141
-140
-139
-139
-139
-139
-139
-139
-139
-140
-141
-142
-144
-146
-148
-150
-152
-156
-158
-161
-164
-166
-170
-173
-176
-180
-184
-190
-194
-199
-206
-212
-213
-209
-191
-165
-141
-136
-148
-165
-181
-190
-190
-186
-181
-177
-175
-174
-175
-178
-182
-186
-187
-187
-185
-184
-183
-184
-188
-191
-193
-193
-191
-181
-173
-169
-168
-174
-190
-206
-219
-226
-229
-229
-229
-229
-229
-229
-229
-229
-229
-230
-229
-229
-228
-226
-224
-224
-225
-226
-226
-225
-220
-212
-203
-194
-188
-186
-186
-186
-184
-180
-163
-144
-122
-100
-79
-60
-54
-52
-53
-56
-59
-60
-60
-59
-58
-55
-53
-52
-50
-49
-48
-48
-47
-46
-45
-45
-46
-46
-46
-45
-43
-42
-41
-41
-42
-46
-49
-51
-53
-54
-56
-63
-73
-85
-97
-113
-121
-127
-130
-129
-121
-113
-105
-96
-87
-78
-73
-69
-67
-66
-66
-67
-68
-70
-71
-73
-74
-76
-79
-82
-88
-93
-97
-101
-105
-109
-112
-114
-117
-120
-122
-124
-126
-127
-128
-130
-130
-131
-131
-131
-132
-132
-132
-132
-132
-133
-133
-134
-134
-135
-135
-137
-138
-139
-140
-143
-146
-149
-151
-155
-160
-162
-164
-168
-172
-172
-170
-152
-124
-91
-85
-90
-119
-156
-183
-182
-177
-169
-149
-108
-38
-14
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-171
-171
-171
-171
-170
-170
-170
-170
-169
-169
-168
-167
-166
-166
-165
-163
-162
-161
-160
-158
-157
-156
-154
-153
-152
-151
-150
-149
-148
-148
-147
-147
-146
-146
-146
-147
-147
-148
-149
-150
-152
-154
-156
-158
-161
-164
-166
-169
-171
-173
-177
-180
-183
-186
-191
-195
-200
-206
-212
-214
-211
-193
-167
-144
-133
-144
-164
-180
-189
-190
-186
-181
-177
-175
-174
-175
-179
-185
-190
-193
-193
-192
-188
-185
-184
-184
-188
-190
-192
-192
-189
-178
-171
-168
-168
-178
-198
-213
-224
-228
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-228
-226
-225
-226
-226
-226
-226
-223
-218
-209
-200
-192
-187
-187
-187
-186
-185
-178
-165
-148
-128
-107
-82
-68
-59
-54
-53
-54
-56
-56
-57
-56
-54
-52
-49
-47
-46
-44
-43
-43
-42
-42
-43
-43
-43
-43
-42
-41
-41
-41
-41
-43
-47
-50
-52
-53
-54
-58
-67
-77
-89
-102
-117
-127
-133
-135
-134
-125
-116
-107
-98
-89
-80
-75
-72
-70
-70
-70
-71
-72
-74
-75
-76
-77
-79
-82
-86
-92
-97
-101
-104
-107
-112
-115
-117
-120
-123
-125
-127
-129
-130
-132
-133
-133
-134
-134
-134
-135
-135
-135
-135
-135
-136
-137
-138
-138
-139
-141
-142
-143
-145
-147
-150
-153
-155
-158
-161
-166
-167
-169
-171
-174
-174
-172
-158
-132
-96
-87
-92
-121
-157
-183
-182
-177
-169
-147
-105
-36
-13
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-180
-180
-180
-180
-180
-180
-180
-179
-179
-178
-177
-177
-176
-175
-174
-172
-171
-169
-168
-167
-165
-163
-162
-161
-159
-158
-157
-156
-155
-155
-154
-154
-154
-154
-154
-154
-155
-155
-157
-158
-160
-162
-164
-166
-168
-171
-174
-176
-178
-180
-184
-186
-189
-193
-196
-201
-207
-212
-215
-214
-201
-169
-145
-133
-136
-161
-180
-189
-190
-188
-180
-177
-175
-174
-175
-179
-186
-193
-199
-200
-200
-197
-191
-185
-183
-184
-187
-190
-191
-191
-186
-175
-169
-167
-168
-184
-205
-219
-227
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-228
-227
-227
-227
-227
-227
-225
-221
-215
-207
-198
-189
-188
-187
-187
-187
-186
-180
-169
-155
-136
-109
-91
-75
-64
-57
-54
-53
-54
-54
-54
-54
-52
-50
-48
-46
-44
-42
-41
-40
-40
-40
-41
-41
-41
-41
-40
-41
-41
-42
-45
-49
-52
-53
-54
-55
-61
-72
-83
-94
-106
-123
-133
-139
-141
-138
-129
-118
-108
-98
-89
-80
-76
-74
-73
-73
-73
-74
-75
-76
-77
-78
-80
-83
-86
-91
-96
-100
-104
-107
-110
-115
-118
-121
-123
-126
-129
-131
-132
-134
-135
-136
-137
-137
-138
-138
-138
-138
-138
-138
-139
-140
-140
-141
-142
-144
-145
-147
-149
-150
-152
-156
-159
-161
-164
-167
-171
-173
-174
-175
-176
-176
-175
-163
-140
-102
-91
-95
-123
-158
-183
-182
-177
-168
-146
-101
-33
-12
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-190
-190
-190
-190
-190
-189
-189
-189
-188
-188
-187
-186
-185
-184
-183
-181
-180
-178
-177
-175
-173
-171
-169
-168
-166
-164
-163
-162
-161
-161
-160
-160
-160
-160
-160
-160
-161
-162
-163
-165
-167
-170
-172
-174
-176
-179
-181
-183
-185
-187
-189
-192
-195
-199
-201
-208
-214
-216
-215
-213
-174
-142
-131
-135
-149
-184
-189
-190
-188
-182
-176
-174
-173
-174
-177
-187
-196
-203
-207
-208
-207
-201
-193
-185
-183
-183
-187
-189
-190
-189
-184
-173
-167
-167
-169
-191
-212
-223
-228
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-228
-228
-228
-227
-227
-226
-224
-219
-213
-204
-192
-189
-187
-187
-187
-188
-187
-183
-175
-163
-140
-121
-102
-85
-70
-59
-53
-51
-51
-52
-52
-52
-51
-50
-48
-45
-43
-42
-41
-40
-40
-40
-40
-40
-40
-41
-41
-43
-45
-48
-51
-53
-54
-55
-56
-66
-78
-89
-100
-112
-130
-141
-146
-146
-143
-131
-119
-108
-97
-88
-80
-77
-76
-75
-75
-76
-76
-77
-77
-78
-80
-83
-87
-91
-96
-101
-104
-107
-111
-114
-118
-121
-124
-127
-129
-132
-134
-135
-137
-138
-139
-140
-140
-141
-141
-142
-142
-143
-143
-144
-145
-145
-146
-147
-148
-150
-151
-153
-155
-157
-160
-163
-166
-169
-172
-176
-178
-178
-178
-178
-178
-177
-168
-146
-108
-94
-99
-126
-160
-184
-182
-177
-167
-144
-97
-30
-11
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-202
-202
-202
-202
-202
-202
-202
-202
-201
-201
-200
-199
-198
-196
-195
-193
-191
-189
-188
-186
-184
-182
-180
-179
-177
-176
-175
-174
-173
-172
-172
-171
-171
-171
-171
-172
-173
-174
-175
-177
-179
-181
-183
-185
-186
-189
-190
-192
-193
-195
-197
-200
-203
-206
-210
-217
-217
-216
-208
-185
-133
-129
-136
-154
-183
-191
-190
-186
-181
-175
-172
-172
-175
-181
-190
-202
-208
-212
-215
-215
-214
-205
-194
-185
-182
-183
-185
-187
-188
-188
-181
-171
-166
-166
-170
-199
-217
-226
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-228
-228
-228
-227
-225
-223
-219
-213
-201
-193
-189
-188
-188
-188
-188
-188
-187
-183
-172
-158
-143
-126
-108
-87
-75
-64
-57
-53
-53
-52
-52
-51
-51
-50
-48
-47
-46
-44
-43
-43
-43
-43
-43
-45
-46
-48
-50
-51
-53
-54
-55
-57
-61
-77
-89
-99
-109
-122
-143
-153
-156
-154
-147
-131
-117
-104
-93
-85
-79
-77
-76
-76
-77
-77
-78
-78
-80
-82
-87
-91
-95
-98
-102
-106
-109
-112
-116
-119
-124
-127
-129
-132
-134
-137
-138
-140
-141
-142
-143
-143
-144
-145
-146
-147
-148
-149
-150
-151
-153
-154
-155
-156
-157
-159
-160
-161
-163
-164
-167
-169
-171
-173
-176
-181
-182
-182
-182
-181
-180
-179
-173
-154
-117
-100
-104
-130
-162
-184
-181
-177
-166
-140
-91
-26
-9
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-212
-212
-212
-212
-212
-212
-212
-212
-211
-211
-210
-209
-207
-206
-205
-202
-200
-198
-196
-194
-191
-188
-186
-184
-182
-180
-179
-178
-177
-177
-177
-176
-176
-176
-177
-177
-178
-179
-181
-182
-185
-187
-189
-190
-192
-194
-196
-198
-199
-201
-204
-207
-209
-212
-215
-218
-218
-209
-189
-149
-128
-134
-153
-175
-189
-190
-187
-181
-176
-171
-171
-175
-182
-190
-199
-208
-212
-215
-216
-217
-215
-206
-195
-186
-182
-182
-184
-186
-187
-186
-180
-169
-165
-166
-171
-203
-220
-227
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-227
-226
-224
-221
-217
-207
-199
-193
-189
-188
-188
-188
-189
-189
-188
-184
-176
-166
-154
-139
-118
-104
-90
-78
-68
-59
-56
-54
-53
-52
-51
-50
-50
-49
-48
-47
-47
-47
-47
-48
-48
-49
-50
-52
-53
-54
-54
-56
-62
-71
-87
-97
-106
-118
-133
-156
-162
-163
-158
-147
-127
-112
-100
-90
-83
-78
-77
-77
-77
-78
-79
-80
-83
-85
-88
-93
-96
-99
-102
-106
-110
-113
-117
-120
-124
-128
-131
-134
-136
-138
-140
-142
-143
-144
-145
-146
-147
-148
-149
-151
-152
-154
-155
-156
-158
-159
-160
-162
-163
-164
-165
-167
-168
-169
-170
-172
-174
-175
-176
-178
-182
-184
-184
-184
-183
-182
-181
-175
-159
-123
-105
-109
-134
-164
-184
-181
-176
-164
-137
-86
-24
-8
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-221
-221
-221
-222
-222
-222
-222
-222
-221
-221
-220
-218
-217
-215
-214
-211
-209
-207
-205
-203
-200
-197
-195
-192
-190
-187
-186
-184
-183
-183
-182
-182
-182
-182
-182
-183
-185
-186
-188
-190
-193
-195
-197
-199
-200
-202
-204
-205
-207
-208
-211
-213
-215
-216
-218
-219
-214
-192
-162
-132
-130
-150
-171
-187
-191
-188
-182
-176
-171
-169
-173
-181
-190
-199
-206
-212
-215
-216
-217
-217
-216
-207
-196
-186
-182
-182
-184
-185
-186
-185
-179
-168
-164
-165
-172
-206
-221
-228
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-228
-226
-224
-223
-220
-213
-205
-198
-192
-189
-188
-188
-189
-190
-190
-190
-187
-182
-174
-164
-147
-133
-119
-105
-92
-77
-70
-64
-59
-56
-53
-52
-51
-51
-50
-50
-50
-50
-50
-50
-51
-51
-52
-53
-54
-55
-57
-62
-71
-83
-97
-105
-116
-130
-148
-168
-171
-168
-159
-144
-121
-106
-95
-86
-81
-78
-78
-78
-79
-81
-83
-86
-88
-91
-94
-98
-101
-104
-107
-110
-115
-119
-122
-126
-129
-133
-135
-138
-140
-142
-144
-145
-146
-148
-149
-151
-152
-153
-155
-157
-159
-160
-162
-163
-165
-166
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-184
-185
-186
-186
-185
-183
-182
-178
-162
-129
-110
-114
-137
-166
-184
-181
-176
-163
-133
-81
-21
-7
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-231
-231
-231
-231
-232
-232
-232
-232
-231
-231
-230
-229
-227
-225
-223
-220
-218
-215
-213
-210
-207
-205
-203
-200
-198
-195
-193
-192
-190
-189
-189
-188
-188
-188
-189
-191
-192
-194
-197
-199
-202
-204
-205
-207
-208
-210
-211
-212
-213
-214
-216
-217
-218
-219
-219
-217
-201
-169
-138
-127
-143
-170
-185
-190
-189
-184
-176
-171
-168
-170
-179
-189
-198
-205
-210
-214
-216
-217
-218
-218
-216
-208
-197
-187
-182
-181
-183
-184
-184
-184
-178
-168
-163
-165
-172
-208
-222
-228
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-230
-230
-230
-230
-229
-228
-226
-225
-223
-222
-217
-211
-204
-197
-191
-188
-188
-189
-189
-190
-192
-192
-190
-188
-183
-171
-160
-147
-134
-120
-103
-91
-81
-73
-66
-60
-57
-55
-53
-52
-52
-52
-51
-52
-52
-52
-53
-54
-54
-55
-58
-64
-73
-83
-94
-105
-114
-128
-145
-165
-179
-178
-170
-157
-138
-114
-100
-89
-83
-79
-78
-79
-81
-83
-85
-89
-92
-95
-97
-100
-103
-106
-109
-112
-116
-121
-124
-128
-131
-134
-137
-140
-142
-144
-145
-148
-149
-151
-152
-154
-156
-158
-160
-162
-164
-166
-168
-169
-171
-172
-174
-175
-175
-176
-177
-178
-179
-179
-180
-181
-182
-182
-183
-183
-183
-185
-186
-187
-187
-186
-185
-184
-180
-166
-135
-115
-119
-141
-168
-183
-181
-176
-161
-129
-75
-18
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-240
-241
-241
-241
-242
-242
-241
-241
-241
-241
-241
-240
-239
-237
-235
-231
-227
-223
-219
-215
-212
-209
-207
-206
-204
-202
-200
-199
-198
-197
-196
-196
-196
-197
-197
-199
-201
-203
-205
-207
-209
-210
-211
-212
-213
-214
-214
-215
-216
-217
-218
-219
-219
-220
-219
-213
-173
-142
-127
-130
-170
-186
-191
-189
-186
-179
-170
-167
-168
-173
-189
-196
-203
-208
-212
-216
-217
-218
-218
-218
-216
-209
-198
-187
-181
-181
-182
-183
-183
-183
-178
-167
-163
-164
-171
-208
-222
-228
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-230
-230
-230
-230
-230
-229
-227
-225
-224
-223
-221
-216
-209
-202
-195
-190
-188
-188
-188
-189
-191
-193
-194
-194
-193
-188
-181
-171
-161
-148
-131
-118
-106
-95
-85
-74
-68
-63
-59
-56
-54
-54
-53
-54
-54
-55
-55
-55
-56
-57
-66
-77
-87
-97
-104
-114
-127
-144
-163
-182
-187
-182
-169
-151
-129
-105
-93
-85
-80
-79
-80
-82
-85
-88
-91
-95
-98
-100
-102
-105
-108
-111
-115
-118
-122
-127
-130
-134
-137
-139
-142
-144
-146
-148
-150
-152
-154
-155
-157
-160
-163
-165
-168
-170
-172
-174
-176
-177
-178
-179
-180
-181
-182
-182
-183
-183
-184
-184
-184
-185
-185
-185
-186
-186
-186
-187
-187
-188
-188
-187
-186
-185
-181
-169
-141
-121
-124
-145
-170
-183
-181
-176
-159
-125
-70
-16
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-252
-251
-249
-246
-244
-241
-240
-239
-239
-240
-241
-241
-242
-243
-243
-242
-241
-240
-237
-233
-226
-221
-216
-212
-210
-207
-206
-205
-204
-204
-203
-203
-203
-204
-204
-206
-208
-210
-212
-214
-215
-215
-216
-216
-217
-217
-218
-219
-220
-221
-221
-221
-221
-219
-214
-162
-133
-125
-136
-166
-192
-191
-189
-185
-181
-166
-164
-166
-172
-185
-195
-201
-207
-212
-216
-218
-219
-219
-219
-219
-217
-209
-199
-189
-182
-181
-181
-182
-182
-182
-178
-168
-163
-163
-168
-206
-222
-228
-229
-229
-228
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-230
-230
-230
-230
-230
-230
-229
-227
-226
-224
-223
-222
-220
-216
-210
-202
-194
-191
-189
-188
-188
-189
-191
-193
-195
-197
-197
-195
-191
-185
-177
-163
-152
-140
-128
-117
-104
-95
-87
-81
-75
-69
-66
-64
-62
-61
-61
-62
-65
-70
-78
-90
-97
-103
-110
-118
-135
-153
-172
-187
-196
-192
-177
-157
-134
-112
-91
-84
-82
-81
-82
-87
-91
-95
-98
-100
-103
-105
-107
-110
-113
-117
-120
-124
-128
-131
-135
-138
-141
-143
-146
-148
-150
-152
-154
-157
-160
-162
-165
-168
-171
-174
-176
-178
-180
-182
-183
-185
-186
-186
-187
-187
-187
-187
-187
-187
-187
-187
-187
-187
-187
-187
-187
-187
-187
-188
-188
-188
-188
-189
-188
-187
-186
-183
-172
-147
-127
-131
-150
-172
-183
-180
-175
-155
-118
-62
-13
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-180
-181
-182
-185
-190
-194
-199
-200
-200
-198
-196
-198
-201
-205
-211
-220
-227
-233
-236
-235
-233
-230
-226
-221
-217
-213
-210
-209
-208
-207
-207
-207
-207
-208
-209
-213
-215
-216
-216
-216
-215
-215
-215
-215
-215
-217
-218
-219
-219
-216
-203
-192
-178
-161
-143
-124
-124
-141
-165
-186
-192
-189
-186
-181
-173
-162
-162
-168
-177
-188
-198
-205
-211
-215
-218
-219
-219
-219
-219
-219
-217
-211
-201
-191
-184
-180
-181
-181
-181
-181
-178
-169
-163
-161
-165
-200
-220
-227
-228
-228
-228
-228
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-229
-230
-230
-230
-230
-230
-230
-230
-229
-227
-226
-224
-223
-222
-222
-219
-214
-208
-199
-194
-191
-189
-188
-188
-190
-191
-194
-196
-198
-199
-198
-195
-190
-180
-170
-160
-149
-139
-125
-115
-107
-99
-92
-85
-81
-78
-76
-76
-78
-81
-85
-90
-96
-102
-107
-114
-125
-138
-158
-175
-189
-198
-200
-187
-165
-140
-117
-99
-86
-84
-83
-85
-89
-94
-98
-100
-103
-105
-108
-110
-113
-116
-119
-124
-128
-131
-135
-138
-142
-144
-147
-149
-151
-154
-157
-159
-162
-164
-168
-171
-174
-177
-179
-182
-184
-186
-187
-188
-188
-189
-189
-189
-189
-189
-189
-189
-189
-189
-188
-188
-188
-188
-188
-188
-188
-188
-188
-188
-188
-189
-189
-189
-189
-188
-187
-184
-174
-150
-132
-136
-154
-175
-183
-180
-174
-151
-112
-56
-10
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-148
-162
-177
-189
-197
-202
-206
-207
-207
-205
-204
-204
-204
-204
-204
-208
-214
-220
-226
-232
-235
-234
-232
-228
-224
-219
-216
-213
-212
-211
-210
-211
-212
-214
-216
-219
-218
-217
-212
-202
-197
-198
-201
-203
-203
-198
-187
-175
-160
-145
-132
-128
-125
-121
-115
-121
-140
-164
-184
-193
-190
-186
-182
-176
-164
-159
-162
-170
-180
-190
-202
-209
-214
-217
-219
-219
-219
-219
-219
-219
-218
-212
-204
-194
-186
-181
-180
-180
-181
-180
-178
-170
-163
-160
-162
-193
-216
-226
-228
-228
-228
-228
-228
-229
-229
-229
-229
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-229
-227
-226
-224
-223
-223
-222
-221
-218
-212
-203
-197
-193
-190
-189
-188
-189
-190
-192
-194
-198
-200
-201
-201
-198
-192
-185
-176
-167
-157
-144
-134
-126
-118
-111
-103
-99
-97
-95
-95
-96
-99
-102
-105
-108
-114
-122
-133
-146
-160
-179
-192
-201
-203
-198
-173
-146
-122
-103
-90
-85
-86
-88
-92
-97
-101
-104
-106
-108
-110
-114
-117
-120
-124
-127
-132
-136
-139
-142
-145
-148
-151
-153
-155
-158
-161
-164
-167
-170
-173
-177
-180
-183
-185
-187
-189
-189
-190
-191
-191
-192
-192
-192
-192
-192
-191
-191
-191
-191
-191
-190
-190
-190
-190
-190
-189
-189
-189
-189
-189
-189
-189
-189
-189
-189
-188
-188
-185
-176
-153
-137
-140
-158
-177
-183
-180
-173
-147
-105
-49
-9
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-152
-178
-200
-216
-224
-226
-226
-226
-226
-226
-226
-225
-222
-217
-211
-207
-206
-209
-214
-223
-232
-234
-234
-232
-230
-225
-222
-219
-216
-215
-215
-216
-218
-220
-222
-217
-205
-194
-182
-165
-154
-155
-156
-157
-153
-140
-123
-105
-86
-71
-71
-80
-94
-108
-119
-141
-168
-185
-194
-193
-186
-184
-178
-169
-157
-157
-163
-172
-183
-193
-206
-213
-216
-218
-219
-219
-219
-219
-219
-219
-219
-214
-207
-197
-189
-182
-180
-180
-180
-180
-178
-171
-164
-160
-160
-184
-211
-224
-228
-228
-228
-228
-228
-228
-228
-229
-229
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-228
-227
-225
-224
-223
-223
-223
-222
-220
-215
-207
-200
-195
-192
-190
-189
-188
-189
-190
-193
-197
-200
-203
-204
-204
-200
-195
-188
-181
-172
-160
-151
-143
-136
-129
-122
-118
-116
-114
-113
-113
-114
-115
-118
-121
-131
-143
-156
-170
-182
-197
-204
-206
-201
-188
-151
-124
-105
-92
-87
-88
-91
-95
-100
-104
-108
-110
-112
-114
-117
-121
-125
-128
-132
-136
-141
-144
-147
-149
-152
-155
-157
-160
-163
-166
-170
-173
-177
-180
-183
-186
-188
-190
-192
-193
-193
-194
-194
-194
-194
-195
-195
-195
-195
-195
-194
-194
-194
-194
-194
-193
-193
-192
-192
-192
-192
-191
-191
-191
-191
-191
-190
-190
-190
-190
-189
-188
-186
-177
-156
-141
-145
-162
-179
-183
-180
-171
-143
-98
-43
-7
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-186
-210
-221
-226
-227
-227
-226
-226
-225
-225
-225
-225
-225
-225
-224
-217
-210
-207
-207
-210
-225
-231
-234
-234
-234
-230
-228
-225
-222
-220
-221
-223
-224
-224
-222
-202
-160
-129
-109
-98
-83
-72
-62
-50
-36
-23
-23
-28
-39
-54
-80
-99
-114
-128
-143
-177
-190
-195
-193
-189
-184
-181
-172
-161
-153
-154
-162
-173
-184
-196
-210
-215
-217
-218
-218
-219
-219
-219
-219
-219
-219
-217
-210
-202
-192
-184
-181
-180
-179
-179
-178
-172
-165
-160
-158
-174
-205
-222
-228
-228
-228
-228
-227
-227
-228
-228
-229
-229
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-229
-228
-226
-225
-224
-223
-223
-223
-223
-221
-218
-209
-203
-198
-194
-191
-189
-189
-189
-190
-192
-197
-200
-203
-205
-206
-205
-201
-196
-190
-184
-174
-166
-159
-152
-145
-139
-134
-131
-127
-125
-123
-123
-126
-132
-141
-159
-171
-181
-190
-199
-208
-210
-205
-192
-165
-123
-103
-92
-88
-88
-93
-98
-103
-107
-109
-112
-114
-117
-120
-124
-129
-133
-137
-141
-145
-149
-151
-154
-156
-159
-163
-166
-169
-173
-176
-181
-184
-187
-190
-192
-194
-195
-195
-196
-196
-197
-198
-198
-199
-199
-199
-199
-199
-199
-199
-199
-199
-199
-198
-198
-197
-197
-196
-196
-196
-195
-195
-194
-193
-193
-192
-192
-191
-191
-190
-189
-189
-187
-178
-159
-145
-150
-165
-180
-183
-179
-170
-138
-91
-37
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-197
-216
-224
-226
-226
-224
-223
-223
-223
-224
-224
-224
-224
-225
-225
-224
-218
-212
-207
-207
-211
-220
-228
-233
-234
-233
-232
-229
-227
-227
-230
-230
-218
-184
-115
-59
-41
-27
-18
-11
-8
-5
-4
-6
-10
-28
-49
-73
-97
-118
-135
-141
-152
-166
-185
-196
-196
-193
-189
-184
-182
-174
-162
-152
-150
-152
-160
-172
-186
-201
-214
-216
-217
-217
-217
-218
-219
-219
-219
-220
-220
-219
-215
-208
-199
-188
-183
-180
-179
-179
-178
-174
-167
-161
-158
-162
-190
-212
-226
-228
-228
-227
-227
-227
-227
-227
-228
-228
-229
-229
-229
-229
-230
-230
-230
-230
-229
-229
-229
-228
-226
-225
-224
-224
-224
-223
-223
-223
-222
-218
-210
-203
-198
-194
-191
-189
-189
-189
-190
-193
-198
-201
-204
-207
-209
-209
-207
-204
-199
-192
-183
-176
-169
-163
-157
-149
-145
-143
-141
-141
-146
-153
-162
-171
-180
-188
-194
-200
-206
-211
-211
-204
-182
-151
-117
-95
-92
-92
-94
-99
-107
-111
-114
-116
-118
-122
-125
-129
-133
-138
-143
-147
-151
-154
-157
-160
-163
-166
-169
-173
-178
-181
-185
-188
-191
-194
-196
-197
-198
-199
-200
-200
-201
-202
-203
-204
-204
-204
-205
-205
-205
-206
-206
-206
-206
-206
-206
-205
-205
-204
-204
-203
-202
-202
-201
-200
-200
-199
-198
-197
-196
-195
-194
-193
-192
-190
-189
-187
-179
-161
-151
-156
-170
-182
-183
-179
-166
-130
-80
-29
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-205
-219
-225
-226
-225
-223
-223
-223
-223
-224
-224
-224
-224
-224
-225
-225
-222
-216
-210
-207
-211
-219
-227
-232
-234
-234
-233
-232
-231
-231
-226
-189
-138
-87
-47
-24
-17
-12
-8
-6
-4
-5
-13
-27
-50
-83
-103
-120
-133
-141
-152
-162
-175
-186
-194
-197
-194
-189
-185
-183
-181
-167
-156
-149
-148
-150
-158
-172
-188
-205
-216
-216
-216
-216
-216
-217
-219
-219
-219
-220
-220
-220
-218
-214
-206
-193
-186
-182
-179
-179
-177
-175
-169
-163
-158
-159
-177
-200
-220
-227
-228
-227
-227
-227
-227
-227
-227
-227
-227
-228
-228
-228
-228
-228
-228
-228
-228
-227
-227
-226
-225
-225
-224
-224
-224
-224
-224
-223
-220
-216
-207
-201
-196
-193
-190
-189
-190
-191
-194
-197
-202
-206
-209
-211
-212
-212
-210
-207
-204
-198
-190
-184
-178
-173
-168
-164
-163
-163
-164
-167
-172
-177
-183
-188
-192
-199
-204
-209
-211
-212
-199
-171
-142
-116
-101
-94
-95
-98
-103
-108
-114
-116
-119
-122
-125
-131
-135
-140
-144
-148
-154
-157
-161
-164
-168
-173
-176
-180
-184
-187
-191
-193
-196
-197
-199
-200
-201
-202
-203
-203
-204
-205
-205
-205
-206
-206
-206
-207
-207
-207
-207
-207
-208
-208
-208
-208
-208
-208
-207
-207
-207
-207
-206
-205
-205
-204
-203
-202
-201
-200
-199
-197
-196
-195
-193
-191
-190
-187
-180
-162
-154
-160
-172
-183
-183
-178
-162
-123
-72
-24
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-207
-220
-225
-226
-225
-222
-222
-223
-224
-225
-224
-224
-224
-224
-225
-225
-223
-217
-211
-209
-211
-219
-227
-233
-234
-234
-234
-233
-230
-222
-171
-117
-70
-34
-16
-8
-6
-5
-4
-3
-6
-19
-39
-65
-92
-120
-134
-145
-153
-159
-171
-181
-190
-196
-197
-195
-190
-186
-184
-183
-176
-160
-151
-147
-147
-149
-157
-172
-191
-209
-217
-216
-215
-213
-213
-216
-218
-219
-220
-220
-220
-221
-220
-217
-212
-200
-191
-185
-180
-179
-177
-176
-172
-166
-159
-157
-166
-187
-210
-225
-228
-227
-227
-227
-227
-226
-226
-226
-226
-227
-227
-227
-227
-227
-227
-227
-226
-226
-226
-225
-225
-224
-224
-224
-224
-224
-223
-221
-217
-211
-203
-197
-194
-191
-191
-192
-194
-197
-200
-204
-208
-210
-212
-214
-214
-213
-211
-209
-206
-202
-197
-192
-188
-184
-181
-180
-179
-180
-182
-184
-189
-192
-195
-199
-203
-207
-210
-211
-206
-194
-161
-134
-114
-101
-97
-99
-104
-108
-113
-117
-121
-124
-128
-132
-136
-143
-148
-152
-156
-160
-165
-170
-174
-178
-182
-186
-190
-192
-195
-197
-199
-200
-201
-202
-203
-204
-204
-204
-205
-205
-206
-206
-206
-207
-207
-207
-207
-207
-207
-208
-208
-208
-208
-208
-209
-209
-209
-209
-209
-209
-209
-209
-209
-208
-208
-207
-206
-205
-204
-204
-202
-200
-199
-197
-194
-191
-190
-188
-180
-164
-158
-164
-175
-183
-183
-177
-158
-115
-64
-19
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-206
-220
-225
-225
-225
-222
-221
-222
-224
-225
-224
-224
-224
-224
-225
-224
-222
-217
-212
-210
-214
-222
-229
-233
-235
-234
-233
-227
-210
-180
-95
-48
-22
-11
-6
-4
-4
-4
-4
-5
-18
-45
-75
-104
-126
-143
-151
-159
-166
-175
-187
-194
-198
-198
-196
-193
-187
-185
-184
-183
-170
-155
-148
-147
-147
-148
-156
-173
-194
-213
-216
-215
-212
-211
-211
-215
-217
-219
-219
-220
-220
-221
-221
-220
-217
-207
-197
-189
-183
-179
-177
-176
-173
-169
-161
-157
-159
-173
-195
-218
-226
-227
-227
-227
-227
-226
-226
-226
-226
-226
-226
-226
-226
-226
-226
-225
-225
-225
-225
-225
-224
-224
-224
-224
-224
-223
-221
-217
-211
-205
-197
-193
-191
-190
-191
-195
-199
-202
-206
-209
-212
-213
-214
-215
-214
-213
-211
-209
-206
-204
-201
-198
-196
-194
-193
-192
-192
-193
-194
-196
-199
-201
-203
-206
-209
-211
-208
-199
-183
-159
-121
-106
-100
-100
-102
-108
-114
-118
-122
-125
-130
-134
-139
-145
-150
-157
-161
-166
-170
-174
-179
-183
-187
-191
-194
-198
-200
-201
-202
-203
-203
-203
-203
-204
-204
-204
-204
-204
-204
-204
-204
-204
-205
-205
-205
-206
-206
-207
-207
-207
-208
-208
-208
-208
-209
-209
-209
-209
-210
-210
-210
-210
-210
-210
-210
-209
-209
-208
-207
-206
-205
-203
-201
-199
-196
-192
-191
-188
-180
-165
-161
-168
-177
-184
-182
-176
-152
-106
-55
-15
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-205
-219
-225
-225
-225
-222
-221
-221
-222
-224
-225
-225
-225
-225
-225
-222
-218
-215
-213
-212
-219
-228
-233
-235
-235
-234
-230
-207
-161
-88
-28
-15
-7
-4
-3
-3
-3
-3
-5
-10
-44
-81
-110
-130
-144
-157
-166
-174
-183
-191
-198
-199
-199
-197
-194
-188
-185
-184
-184
-183
-162
-151
-147
-147
-147
-148
-156
-174
-197
-214
-216
-213
-210
-207
-208
-213
-216
-217
-219
-220
-220
-221
-221
-221
-221
-215
-205
-195
-187
-180
-177
-176
-174
-171
-165
-157
-156
-161
-176
-203
-224
-226
-227
-227
-227
-226
-226
-226
-226
-226
-226
-225
-225
-225
-225
-225
-225
-225
-225
-225
-224
-224
-224
-224
-224
-222
-216
-209
-202
-196
-190
-188
-188
-190
-192
-197
-200
-204
-207
-210
-212
-213
-214
-214
-213
-212
-210
-208
-205
-203
-201
-200
-199
-198
-197
-197
-198
-199
-201
-203
-206
-208
-210
-211
-212
-208
-193
-166
-136
-111
-102
-102
-104
-108
-114
-119
-122
-125
-128
-133
-140
-146
-152
-158
-163
-170
-176
-181
-187
-191
-196
-199
-200
-201
-202
-202
-203
-203
-204
-204
-204
-203
-203
-202
-202
-201
-201
-201
-200
-200
-199
-199
-199
-200
-201
-202
-203
-204
-205
-206
-207
-207
-208
-208
-208
-209
-209
-209
-210
-210
-210
-210
-211
-211
-211
-211
-211
-210
-209
-209
-207
-206
-204
-201
-198
-193
-192
-188
-180
-166
-164
-172
-180
-184
-182
-175
-145
-97
-47
-11
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-198
-216
-224
-225
-226
-222
-221
-221
-221
-221
-221
-221
-221
-220
-219
-217
-217
-217
-220
-225
-232
-234
-234
-234
-232
-216
-166
-106
-52
-21
-8
-4
-3
-2
-2
-3
-3
-5
-15
-39
-91
-117
-137
-152
-166
-180
-187
-193
-197
-199
-200
-199
-197
-193
-191
-186
-185
-185
-184
-180
-155
-149
-147
-147
-147
-148
-155
-176
-200
-216
-216
-210
-205
-202
-203
-208
-211
-214
-216
-218
-219
-220
-221
-221
-222
-220
-215
-207
-197
-187
-179
-177
-175
-173
-171
-161
-157
-156
-160
-171
-205
-219
-225
-227
-227
-226
-226
-226
-226
-226
-226
-225
-225
-225
-225
-225
-225
-225
-224
-224
-224
-223
-222
-220
-216
-207
-200
-194
-190
-187
-186
-186
-187
-189
-191
-195
-197
-199
-201
-202
-204
-204
-204
-204
-204
-203
-203
-202
-202
-202
-201
-201
-201
-201
-202
-204
-206
-207
-208
-208
-209
-209
-207
-201
-186
-149
-125
-111
-105
-104
-106
-111
-116
-121
-125
-132
-137
-144
-150
-157
-165
-171
-177
-182
-188
-194
-197
-199
-200
-201
-201
-202
-202
-202
-201
-199
-198
-196
-194
-192
-188
-184
-181
-177
-174
-171
-170
-169
-168
-168
-168
-169
-171
-173
-176
-180
-184
-187
-191
-195
-200
-202
-205
-206
-208
-209
-209
-209
-210
-210
-210
-210
-211
-212
-212
-212
-212
-212
-211
-211
-210
-208
-207
-204
-200
-194
-192
-188
-180
-168
-167
-176
-182
-184
-182
-171
-134
-84
-36
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-189
-211
-221
-224
-226
-224
-223
-222
-221
-221
-221
-221
-221
-221
-221
-221
-223
-226
-228
-230
-233
-232
-227
-215
-191
-127
-80
-45
-21
-9
-4
-2
-2
-2
-2
-2
-4
-14
-36
-73
-117
-139
-157
-171
-182
-191
-194
-197
-199
-200
-199
-197
-195
-193
-190
-186
-186
-186
-183
-176
-152
-150
-149
-149
-148
-149
-156
-178
-203
-216
-215
-208
-202
-198
-198
-202
-206
-209
-211
-214
-216
-218
-220
-220
-221
-221
-219
-214
-207
-196
-184
-179
-176
-174
-172
-166
-160
-157
-157
-160
-178
-201
-215
-223
-226
-226
-226
-225
-225
-225
-225
-225
-225
-225
-224
-224
-224
-223
-223
-222
-219
-216
-212
-208
-202
-196
-192
-189
-187
-186
-186
-186
-188
-189
-191
-193
-195
-196
-198
-199
-200
-201
-201
-202
-202
-202
-202
-203
-203
-203
-204
-205
-206
-206
-207
-207
-207
-207
-207
-206
-200
-187
-171
-153
-136
-120
-114
-111
-112
-116
-121
-126
-130
-134
-139
-146
-152
-159
-166
-174
-183
-188
-191
-194
-196
-199
-200
-200
-199
-198
-196
-192
-188
-184
-179
-172
-167
-162
-158
-154
-151
-149
-147
-145
-143
-141
-140
-139
-139
-139
-141
-142
-144
-146
-149
-154
-158
-163
-169
-175
-184
-189
-195
-199
-203
-206
-208
-209
-210
-210
-210
-210
-211
-211
-212
-213
-213
-212
-212
-212
-211
-210
-208
-206
-201
-195
-193
-187
-179
-169
-170
-179
-183
-184
-181
-168
-124
-73
-29
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-175
-202
-215
-221
-225
-224
-224
-223
-223
-222
-222
-222
-223
-223
-224
-225
-226
-228
-229
-228
-222
-205
-181
-149
-111
-56
-30
-14
-6
-3
-2
-1
-2
-2
-2
-3
-8
-30
-64
-104
-141
-160
-174
-185
-192
-196
-198
-199
-200
-199
-198
-196
-194
-192
-190
-186
-187
-187
-183
-173
-152
-152
-152
-151
-149
-149
-157
-180
-205
-216
-214
-205
-198
-194
-192
-195
-199
-202
-205
-208
-212
-215
-217
-218
-220
-221
-220
-218
-214
-206
-193
-185
-180
-176
-173
-170
-164
-159
-156
-155
-162
-178
-196
-211
-221
-225
-225
-225
-225
-224
-224
-223
-223
-222
-221
-220
-219
-218
-216
-214
-210
-207
-203
-199
-195
-191
-189
-188
-187
-186
-187
-188
-189
-191
-192
-195
-196
-198
-199
-200
-202
-202
-203
-204
-205
-206
-206
-206
-207
-207
-208
-208
-208
-208
-207
-205
-202
-197
-189
-180
-164
-151
-138
-126
-117
-113
-115
-117
-120
-125
-132
-138
-144
-150
-157
-167
-173
-179
-184
-189
-194
-196
-197
-198
-197
-193
-190
-185
-180
-175
-168
-163
-158
-154
-149
-144
-140
-137
-134
-132
-130
-129
-128
-128
-127
-126
-125
-125
-125
-125
-125
-126
-127
-129
-131
-134
-138
-142
-148
-154
-164
-172
-180
-188
-194
-201
-204
-207
-209
-210
-210
-210
-211
-211
-212
-213
-213
-213
-213
-213
-212
-211
-210
-207
-202
-195
-193
-187
-179
-171
-173
-181
-184
-184
-180
-163
-113
-63
-23
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-157
-188
-204
-212
-220
-222
-223
-223
-223
-223
-223
-223
-224
-224
-224
-223
-221
-217
-210
-199
-176
-145
-108
-69
-34
-11
-6
-3
-1
-1
-1
-1
-1
-1
-1
-4
-19
-54
-95
-131
-161
-177
-187
-194
-197
-198
-199
-200
-199
-199
-197
-195
-194
-193
-190
-188
-188
-188
-183
-170
-154
-155
-155
-154
-150
-149
-158
-183
-207
-216
-213
-203
-195
-190
-186
-187
-191
-193
-196
-200
-204
-209
-212
-215
-217
-220
-220
-220
-219
-215
-204
-194
-186
-180
-175
-172
-168
-163
-158
-155
-153
-160
-173
-190
-207
-220
-222
-223
-224
-223
-222
-221
-220
-219
-218
-216
-214
-212
-210
-207
-203
-200
-197
-195
-193
-191
-191
-190
-190
-191
-192
-193
-195
-197
-198
-201
-202
-203
-205
-206
-207
-207
-208
-208
-209
-209
-210
-210
-209
-209
-207
-206
-203
-200
-196
-188
-181
-171
-159
-145
-129
-122
-118
-116
-117
-120
-124
-129
-134
-139
-148
-154
-162
-170
-178
-187
-191
-195
-196
-197
-195
-193
-190
-186
-181
-173
-166
-159
-152
-145
-138
-133
-130
-127
-125
-124
-123
-123
-122
-122
-121
-121
-121
-121
-121
-121
-121
-121
-121
-120
-119
-119
-119
-119
-120
-122
-124
-127
-130
-135
-145
-154
-163
-173
-182
-192
-198
-203
-206
-209
-209
-210
-210
-211
-212
-213
-213
-214
-214
-214
-213
-212
-211
-208
-202
-196
-193
-186
-178
-173
-175
-183
-185
-183
-179
-155
-102
-53
-17
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-138
-167
-185
-197
-209
-215
-218
-220
-220
-221
-221
-221
-221
-220
-218
-212
-202
-183
-157
-123
-72
-42
-22
-10
-3
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-8
-40
-83
-125
-154
-179
-190
-195
-197
-197
-199
-199
-199
-199
-198
-197
-196
-195
-194
-191
-189
-190
-189
-183
-168
-157
-158
-159
-157
-151
-150
-160
-185
-209
-215
-211
-201
-192
-186
-180
-179
-181
-182
-185
-189
-194
-200
-204
-208
-212
-217
-218
-220
-220
-219
-215
-206
-196
-187
-179
-174
-172
-168
-163
-156
-153
-152
-154
-162
-179
-206
-215
-221
-224
-223
-223
-221
-220
-219
-217
-214
-212
-210
-208
-206
-202
-200
-198
-196
-195
-195
-195
-197
-199
-201
-205
-207
-209
-211
-212
-213
-214
-214
-214
-214
-213
-213
-213
-212
-211
-210
-210
-209
-207
-205
-201
-195
-186
-176
-163
-146
-135
-127
-122
-119
-117
-117
-118
-120
-124
-133
-140
-148
-157
-165
-176
-183
-189
-193
-195
-197
-197
-197
-196
-193
-184
-174
-163
-152
-142
-133
-128
-126
-124
-123
-122
-122
-122
-121
-121
-121
-122
-122
-122
-123
-123
-123
-123
-123
-123
-123
-122
-122
-121
-121
-120
-119
-118
-118
-117
-117
-117
-118
-120
-122
-128
-136
-145
-156
-166
-180
-189
-196
-202
-206
-209
-209
-210
-211
-212
-213
-213
-214
-214
-214
-214
-213
-212
-209
-203
-197
-193
-186
-178
-174
-179
-185
-185
-182
-177
-146
-89
-43
-12
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-114
-131
-144
-154
-166
-173
-177
-180
-180
-178
-172
-165
-154
-139
-121
-92
-70
-50
-34
-21
-10
-6
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-23
-78
-122
-155
-176
-193
-195
-196
-197
-197
-199
-199
-199
-199
-198
-198
-198
-197
-195
-192
-191
-192
-191
-184
-169
-163
-164
-164
-160
-151
-150
-164
-188
-210
-215
-209
-198
-189
-182
-173
-169
-167
-166
-167
-170
-175
-181
-187
-193
-199
-207
-211
-215
-218
-219
-219
-216
-211
-203
-193
-181
-176
-173
-170
-167
-158
-154
-151
-150
-150
-158
-174
-191
-206
-217
-220
-221
-221
-220
-219
-218
-216
-215
-214
-213
-212
-211
-211
-212
-213
-214
-214
-215
-215
-216
-216
-216
-215
-215
-215
-214
-213
-213
-212
-210
-208
-205
-202
-198
-193
-185
-177
-169
-161
-153
-141
-135
-130
-127
-125
-124
-124
-125
-126
-128
-133
-138
-144
-149
-154
-159
-165
-171
-178
-185
-191
-194
-197
-197
-196
-188
-177
-164
-151
-139
-129
-125
-123
-122
-121
-121
-121
-121
-121
-122
-124
-126
-128
-130
-132
-136
-138
-141
-143
-146
-148
-148
-148
-148
-146
-144
-141
-139
-135
-132
-127
-124
-122
-120
-118
-116
-115
-115
-115
-115
-117
-121
-127
-135
-145
-161
-172
-183
-192
-200
-205
-207
-209
-210
-211
-212
-213
-214
-214
-215
-214
-214
-213
-210
-203
-197
-193
-185
-178
-176
-182
-186
-185
-181
-174
-130
-72
-31
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-102
-110
-115
-119
-123
-125
-122
-120
-115
-109
-100
-94
-86
-77
-67
-54
-44
-34
-25
-17
-9
-5
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-7
-48
-105
-144
-170
-186
-195
-195
-196
-196
-197
-199
-199
-199
-199
-199
-200
-200
-198
-196
-193
-193
-194
-192
-186
-172
-168
-168
-167
-161
-150
-150
-166
-191
-211
-214
-208
-197
-188
-180
-170
-163
-159
-156
-155
-156
-158
-163
-169
-175
-182
-192
-199
-205
-211
-215
-218
-217
-215
-211
-206
-195
-186
-179
-174
-171
-166
-161
-157
-153
-150
-150
-155
-160
-167
-179
-194
-203
-210
-214
-215
-216
-216
-215
-215
-214
-214
-213
-213
-213
-213
-213
-213
-213
-212
-212
-210
-208
-205
-202
-198
-192
-187
-183
-178
-173
-167
-163
-158
-154
-150
-146
-143
-140
-137
-134
-131
-130
-128
-128
-127
-128
-130
-132
-136
-140
-146
-153
-161
-169
-177
-187
-191
-195
-197
-198
-194
-186
-175
-164
-153
-142
-136
-131
-127
-124
-122
-121
-121
-122
-123
-126
-129
-134
-139
-144
-152
-157
-162
-167
-171
-175
-178
-179
-180
-181
-182
-182
-181
-180
-179
-176
-173
-169
-164
-159
-151
-145
-138
-131
-125
-120
-117
-114
-113
-113
-113
-115
-119
-124
-133
-147
-159
-171
-182
-192
-201
-204
-207
-208
-210
-212
-213
-214
-215
-215
-215
-214
-213
-210
-203
-198
-191
-184
-178
-178
-185
-186
-184
-179
-170
-115
-59
-23
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-94
-97
-98
-97
-95
-92
-88
-84
-80
-75
-69
-65
-61
-56
-51
-47
-42
-35
-28
-21
-12
-6
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-13
-76
-130
-162
-180
-192
-195
-195
-195
-196
-197
-199
-199
-199
-199
-200
-201
-201
-199
-197
-194
-195
-195
-194
-189
-177
-172
-172
-169
-161
-150
-150
-169
-193
-211
-214
-208
-196
-187
-178
-168
-159
-154
-148
-145
-144
-144
-147
-151
-157
-163
-174
-181
-190
-198
-205
-213
-215
-216
-215
-213
-206
-198
-190
-182
-176
-171
-168
-164
-159
-155
-151
-149
-148
-149
-154
-165
-171
-178
-183
-187
-193
-195
-197
-198
-199
-200
-199
-199
-198
-196
-194
-192
-190
-187
-184
-180
-176
-172
-169
-165
-160
-157
-153
-150
-146
-142
-140
-137
-135
-133
-132
-131
-130
-130
-130
-131
-132
-133
-135
-137
-142
-148
-154
-161
-167
-176
-182
-187
-192
-196
-197
-193
-187
-179
-171
-161
-152
-144
-135
-128
-123
-121
-120
-120
-121
-124
-128
-132
-138
-144
-152
-159
-165
-171
-176
-182
-186
-190
-193
-196
-198
-199
-200
-200
-201
-201
-201
-200
-200
-199
-197
-195
-192
-188
-184
-177
-169
-161
-152
-142
-131
-124
-118
-114
-112
-111
-111
-113
-117
-123
-135
-147
-159
-172
-184
-195
-200
-204
-207
-209
-211
-213
-214
-215
-215
-215
-215
-213
-209
-203
-198
-190
-183
-179
-180
-187
-186
-183
-176
-163
-99
-47
-17
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-89
-89
-89
-87
-83
-75
-71
-68
-66
-65
-64
-64
-63
-62
-61
-58
-54
-47
-39
-30
-16
-8
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-8
-22
-104
-151
-175
-187
-195
-195
-194
-194
-195
-198
-200
-199
-199
-200
-201
-203
-202
-200
-197
-196
-197
-197
-196
-191
-181
-176
-175
-169
-160
-149
-150
-172
-195
-212
-214
-208
-196
-186
-178
-168
-157
-151
-144
-138
-135
-132
-133
-136
-139
-144
-153
-161
-169
-179
-189
-201
-208
-212
-214
-214
-213
-209
-203
-195
-186
-178
-174
-170
-167
-163
-157
-153
-150
-147
-145
-145
-146
-148
-151
-156
-163
-167
-170
-172
-173
-174
-174
-173
-171
-169
-166
-163
-160
-156
-152
-147
-144
-141
-139
-137
-135
-134
-133
-133
-132
-132
-132
-132
-132
-133
-133
-134
-135
-136
-137
-141
-144
-148
-153
-159
-167
-174
-182
-189
-196
-201
-201
-199
-195
-191
-181
-170
-158
-145
-133
-124
-120
-118
-118
-118
-120
-122
-125
-129
-134
-142
-149
-158
-166
-174
-184
-191
-196
-199
-202
-205
-206
-207
-207
-208
-208
-209
-209
-209
-209
-209
-209
-209
-209
-209
-208
-207
-206
-204
-202
-197
-191
-184
-175
-164
-149
-137
-127
-119
-114
-110
-109
-110
-112
-115
-125
-135
-148
-161
-174
-188
-196
-201
-205
-207
-210
-212
-214
-215
-215
-215
-215
-213
-209
-203
-197
-188
-182
-180
-182
-188
-186
-182
-173
-154
-82
-36
-12
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-85
-86
-86
-85
-83
-74
-70
-67
-65
-65
-69
-73
-77
-80
-82
-78
-72
-64
-54
-41
-22
-11
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-12
-36
-129
-164
-182
-190
-196
-194
-192
-193
-195
-198
-200
-199
-199
-200
-202
-204
-203
-200
-198
-198
-199
-199
-197
-193
-185
-179
-176
-168
-158
-149
-150
-174
-197
-212
-213
-208
-196
-187
-178
-168
-157
-150
-142
-135
-131
-126
-124
-124
-125
-127
-132
-138
-146
-155
-165
-182
-194
-204
-212
-214
-215
-214
-213
-210
-204
-190
-181
-175
-171
-168
-166
-163
-160
-157
-152
-147
-145
-143
-142
-142
-141
-142
-142
-142
-142
-142
-142
-141
-141
-140
-139
-138
-137
-136
-136
-136
-135
-135
-135
-134
-134
-134
-134
-134
-134
-135
-135
-136
-137
-138
-141
-144
-147
-151
-155
-163
-171
-179
-187
-195
-203
-207
-210
-212
-211
-201
-185
-169
-153
-140
-128
-123
-119
-116
-115
-115
-115
-116
-117
-119
-125
-133
-143
-155
-167
-182
-191
-197
-201
-204
-206
-207
-208
-208
-209
-209
-209
-209
-209
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-208
-206
-201
-195
-186
-171
-157
-142
-129
-119
-111
-108
-108
-108
-110
-116
-126
-137
-150
-164
-181
-190
-198
-202
-206
-209
-212
-214
-215
-215
-215
-215
-213
-208
-203
-195
-187
-182
-182
-184
-189
-185
-180
-168
-142
-66
-26
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-83
-84
-85
-85
-84
-77
-73
-71
-71
-74
-94
-102
-106
-106
-105
-95
-86
-74
-60
-45
-25
-12
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-19
-55
-150
-175
-187
-192
-196
-193
-191
-192
-194
-198
-198
-198
-199
-201
-204
-205
-203
-201
-201
-201
-202
-202
-199
-194
-187
-178
-173
-164
-155
-148
-150
-176
-198
-212
-213
-209
-200
-190
-180
-172
-160
-152
-144
-137
-131
-126
-122
-120
-119
-118
-119
-120
-122
-126
-131
-143
-155
-170
-184
-199
-210
-213
-214
-214
-214
-212
-206
-198
-188
-179
-172
-169
-166
-165
-163
-160
-158
-156
-153
-151
-149
-147
-146
-145
-144
-143
-142
-142
-141
-140
-140
-140
-140
-140
-140
-140
-140
-141
-142
-143
-143
-144
-145
-147
-149
-152
-154
-157
-161
-167
-175
-182
-189
-195
-201
-208
-211
-213
-214
-213
-199
-180
-162
-146
-136
-129
-124
-121
-118
-116
-114
-113
-113
-113
-114
-117
-124
-134
-146
-161
-180
-190
-197
-202
-205
-207
-207
-208
-208
-209
-209
-209
-209
-209
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-211
-211
-211
-211
-211
-211
-211
-210
-210
-208
-204
-194
-182
-167
-150
-134
-117
-110
-107
-106
-106
-109
-116
-126
-138
-151
-170
-183
-192
-199
-204
-208
-211
-213
-215
-216
-216
-215
-212
-207
-202
-192
-185
-183
-183
-187
-189
-184
-177
-159
-121
-45
-16
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-83
-85
-86
-87
-86
-82
-79
-78
-81
-91
-112
-116
-117
-116
-111
-99
-87
-72
-57
-40
-23
-11
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-23
-64
-157
-177
-187
-192
-196
-193
-191
-191
-192
-195
-196
-197
-200
-203
-206
-206
-204
-203
-203
-204
-204
-202
-198
-191
-182
-172
-167
-160
-153
-148
-150
-175
-197
-211
-213
-210
-203
-196
-188
-179
-167
-158
-150
-143
-137
-130
-126
-123
-121
-119
-118
-118
-118
-119
-121
-125
-130
-138
-149
-163
-183
-195
-205
-211
-214
-214
-212
-209
-205
-200
-191
-184
-177
-172
-168
-164
-162
-160
-159
-157
-155
-153
-152
-151
-150
-149
-149
-149
-149
-148
-148
-148
-148
-148
-148
-149
-149
-150
-151
-153
-156
-159
-163
-168
-173
-180
-185
-190
-195
-199
-203
-205
-207
-208
-206
-188
-171
-159
-152
-149
-144
-139
-133
-128
-123
-119
-115
-112
-111
-111
-111
-113
-119
-128
-139
-157
-169
-179
-187
-193
-200
-203
-205
-207
-208
-208
-209
-209
-209
-210
-210
-211
-211
-211
-212
-212
-212
-213
-213
-213
-213
-213
-213
-213
-212
-212
-212
-212
-211
-211
-211
-211
-211
-211
-211
-211
-211
-210
-210
-208
-203
-195
-182
-167
-149
-126
-115
-108
-105
-104
-106
-111
-119
-130
-142
-163
-177
-188
-196
-202
-207
-211
-213
-215
-216
-216
-215
-211
-206
-201
-190
-185
-183
-185
-189
-188
-182
-172
-148
-101
-31
-11
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-83
-86
-89
-90
-90
-87
-85
-85
-91
-107
-124
-126
-126
-122
-114
-99
-83
-66
-50
-35
-18
-9
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-24
-68
-158
-177
-187
-192
-196
-194
-192
-191
-191
-193
-196
-198
-202
-206
-207
-207
-205
-205
-206
-206
-204
-199
-191
-181
-170
-164
-161
-156
-151
-147
-149
-173
-194
-209
-211
-210
-206
-201
-195
-189
-178
-170
-162
-155
-148
-139
-134
-130
-126
-123
-120
-118
-117
-117
-117
-117
-119
-122
-127
-135
-150
-163
-177
-190
-201
-209
-212
-213
-213
-211
-205
-200
-195
-190
-185
-178
-174
-171
-169
-166
-164
-162
-161
-160
-159
-158
-157
-157
-156
-157
-157
-158
-159
-161
-162
-166
-169
-172
-175
-178
-183
-186
-190
-193
-197
-201
-204
-205
-202
-193
-173
-167
-165
-164
-163
-153
-142
-135
-129
-126
-123
-120
-116
-113
-110
-109
-107
-108
-112
-118
-131
-142
-154
-164
-175
-188
-195
-201
-204
-206
-208
-208
-209
-209
-210
-210
-211
-211
-212
-213
-213
-214
-214
-214
-215
-215
-215
-215
-215
-216
-216
-216
-215
-215
-215
-215
-214
-214
-213
-213
-212
-212
-212
-211
-211
-211
-211
-211
-211
-210
-208
-203
-194
-181
-164
-137
-121
-111
-105
-103
-104
-108
-114
-123
-135
-155
-171
-184
-194
-201
-207
-210
-213
-215
-216
-216
-215
-210
-205
-199
-188
-185
-184
-186
-190
-186
-180
-165
-135
-82
-20
-7
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-83
-89
-93
-95
-96
-93
-92
-94
-103
-122
-132
-133
-131
-124
-113
-93
-74
-56
-41
-28
-14
-6
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-23
-66
-156
-175
-185
-191
-196
-196
-193
-192
-192
-194
-197
-201
-205
-208
-208
-208
-208
-208
-207
-206
-199
-188
-175
-163
-154
-154
-155
-154
-150
-146
-147
-168
-190
-206
-209
-209
-208
-205
-202
-199
-191
-185
-178
-171
-165
-154
-148
-142
-137
-132
-126
-123
-120
-118
-117
-116
-116
-116
-117
-118
-123
-132
-144
-159
-174
-191
-200
-206
-210
-212
-213
-213
-211
-208
-203
-197
-192
-188
-184
-182
-178
-177
-175
-174
-173
-172
-171
-171
-172
-172
-174
-176
-178
-180
-183
-187
-192
-196
-200
-204
-207
-206
-203
-199
-194
-189
-186
-183
-176
-162
-132
-125
-122
-122
-122
-124
-124
-123
-121
-117
-113
-109
-106
-103
-103
-108
-114
-122
-133
-145
-165
-180
-191
-199
-203
-206
-207
-208
-208
-209
-210
-210
-211
-211
-212
-213
-214
-214
-215
-216
-216
-217
-217
-217
-217
-218
-218
-218
-218
-218
-218
-218
-217
-217
-217
-217
-217
-216
-216
-215
-214
-214
-213
-212
-212
-211
-211
-211
-211
-210
-210
-208
-203
-193
-177
-149
-129
-115
-106
-102
-102
-105
-110
-118
-128
-149
-166
-181
-192
-200
-206
-210
-213
-215
-216
-217
-214
-209
-203
-196
-186
-185
-185
-188
-191
-184
-177
-156
-119
-62
-12
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-84
-93
-99
-102
-102
-99
-98
-105
-117
-134
-139
-138
-132
-121
-107
-80
-60
-44
-31
-18
-10
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-20
-58
-150
-171
-182
-189
-197
-198
-197
-195
-195
-196
-202
-206
-209
-210
-210
-210
-210
-209
-207
-203
-185
-165
-149
-138
-132
-144
-150
-151
-149
-145
-145
-162
-184
-203
-207
-208
-208
-207
-206
-206
-203
-201
-197
-192
-186
-176
-168
-160
-153
-146
-138
-132
-128
-124
-120
-117
-116
-115
-115
-115
-115
-116
-118
-123
-132
-152
-169
-184
-197
-206
-212
-214
-214
-214
-214
-214
-213
-211
-208
-204
-200
-198
-196
-195
-195
-197
-198
-200
-201
-202
-205
-207
-209
-210
-211
-212
-213
-213
-212
-212
-208
-198
-181
-160
-138
-117
-110
-108
-111
-119
-129
-136
-138
-138
-133
-126
-118
-109
-100
-96
-93
-94
-95
-99
-106
-127
-149
-169
-186
-197
-203
-205
-207
-207
-208
-208
-209
-209
-210
-211
-212
-213
-214
-215
-216
-217
-217
-217
-218
-218
-218
-218
-218
-218
-218
-218
-218
-218
-218
-218
-218
-218
-218
-218
-218
-218
-218
-218
-218
-217
-217
-216
-215
-214
-213
-212
-211
-211
-211
-211
-210
-210
-207
-201
-189
-162
-139
-121
-108
-102
-100
-103
-107
-113
-122
-143
-163
-179
-191
-199
-206
-211
-214
-215
-216
-217
-213
-207
-201
-193
-186
-185
-187
-189
-191
-182
-173
-145
-101
-43
-7
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-85
-99
-106
-109
-109
-108
-110
-120
-133
-143
-144
-138
-128
-111
-87
-55
-42
-29
-19
-10
-4
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-14
-43
-133
-160
-173
-181
-192
-199
-200
-201
-202
-204
-209
-210
-211
-211
-211
-211
-209
-205
-194
-176
-141
-120
-108
-103
-103
-128
-142
-148
-148
-144
-142
-150
-172
-193
-201
-204
-206
-207
-207
-207
-207
-207
-207
-207
-206
-202
-197
-190
-183
-175
-165
-157
-150
-143
-136
-130
-125
-121
-119
-116
-115
-114
-114
-114
-114
-117
-120
-127
-136
-149
-167
-180
-192
-201
-208
-213
-216
-218
-220
-221
-221
-220
-219
-218
-217
-215
-215
-215
-215
-215
-214
-213
-212
-209
-205
-193
-175
-156
-137
-122
-106
-105
-108
-116
-129
-144
-148
-149
-149
-145
-137
-124
-111
-99
-92
-90
-89
-89
-90
-93
-102
-118
-139
-162
-183
-197
-202
-205
-206
-207
-208
-208
-209
-209
-210
-211
-213
-214
-215
-216
-217
-217
-217
-218
-218
-218
-218
-218
-218
-218
-219
-219
-219
-219
-219
-219
-219
-219
-219
-219
-219
-219
-219
-219
-219
-219
-219
-219
-218
-218
-218
-218
-217
-216
-215
-214
-212
-212
-211
-211
-210
-210
-210
-207
-200
-176
-151
-130
-113
-102
-99
-101
-104
-108
-116
-139
-160
-177
-190
-199
-207
-211
-214
-216
-217
-216
-211
-205
-197
-190
-186
-186
-189
-190
-189
-178
-163
-124
-73
-23
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-86
-102
-110
-113
-114
-115
-121
-131
-141
-147
-145
-134
-116
-94
-72
-53
-39
-25
-15
-8
-3
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-9
-29
-114
-148
-163
-169
-177
-196
-202
-204
-206
-209
-211
-212
-212
-212
-211
-209
-202
-187
-166
-140
-116
-105
-98
-95
-95
-110
-132
-142
-145
-144
-140
-142
-159
-179
-191
-196
-201
-204
-205
-205
-207
-207
-208
-208
-208
-207
-205
-202
-198
-192
-183
-176
-169
-161
-154
-145
-140
-135
-130
-127
-122
-119
-117
-115
-114
-114
-115
-117
-119
-123
-129
-135
-142
-150
-159
-169
-176
-183
-188
-193
-196
-199
-200
-202
-202
-201
-198
-192
-184
-174
-160
-152
-144
-137
-130
-125
-124
-127
-131
-136
-142
-144
-145
-146
-149
-149
-141
-131
-120
-109
-101
-97
-93
-90
-89
-89
-94
-102
-114
-131
-158
-172
-184
-193
-200
-204
-206
-207
-208
-208
-209
-210
-212
-213
-214
-215
-216
-216
-217
-217
-218
-218
-218
-218
-218
-219
-219
-219
-220
-221
-222
-222
-223
-223
-224
-224
-224
-224
-224
-224
-223
-222
-221
-221
-220
-220
-219
-219
-219
-219
-219
-218
-218
-218
-217
-215
-214
-213
-212
-211
-210
-210
-210
-208
-205
-185
-160
-137
-118
-104
-99
-101
-102
-106
-113
-137
-159
-177
-191
-200
-208
-212
-215
-216
-217
-215
-209
-202
-195
-188
-186
-187
-190
-190
-185
-174
-150
-104
-53
-14
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-87
-105
-114
-117
-118
-122
-131
-141
-147
-150
-143
-126
-106
-87
-71
-57
-44
-30
-17
-9
-3
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-16
-89
-134
-152
-156
-160
-180
-196
-203
-207
-210
-211
-212
-212
-211
-209
-198
-182
-160
-138
-121
-106
-99
-95
-92
-91
-98
-117
-133
-143
-144
-138
-137
-147
-162
-176
-182
-189
-194
-197
-198
-202
-204
-206
-207
-208
-208
-209
-208
-206
-203
-196
-191
-184
-176
-169
-159
-153
-147
-142
-139
-134
-130
-126
-123
-120
-117
-116
-114
-114
-113
-114
-116
-119
-123
-128
-134
-139
-143
-146
-149
-151
-153
-154
-154
-152
-149
-146
-143
-138
-132
-127
-127
-128
-128
-127
-129
-133
-139
-146
-152
-157
-157
-154
-148
-139
-125
-115
-107
-98
-91
-87
-87
-88
-91
-96
-107
-122
-138
-155
-171
-190
-198
-202
-205
-206
-207
-208
-209
-210
-211
-213
-214
-215
-216
-216
-217
-217
-218
-218
-218
-218
-218
-219
-220
-220
-221
-222
-223
-224
-225
-227
-227
-228
-229
-229
-230
-229
-229
-229
-229
-228
-227
-226
-225
-224
-223
-222
-221
-220
-219
-219
-219
-219
-219
-218
-217
-216
-214
-212
-211
-210
-210
-210
-209
-207
-192
-168
-144
-122
-106
-99
-100
-101
-104
-110
-137
-160
-179
-192
-201
-209
-213
-215
-216
-216
-213
-206
-199
-192
-187
-187
-189
-191
-189
-181
-169
-133
-83
-36
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-88
-109
-118
-121
-122
-130
-141
-148
-151
-151
-138
-118
-102
-90
-83
-73
-60
-45
-31
-18
-7
-3
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-7
-59
-115
-140
-146
-145
-157
-180
-194
-202
-207
-209
-209
-208
-205
-199
-178
-155
-135
-120
-114
-108
-104
-101
-98
-93
-93
-104
-122
-138
-143
-137
-133
-135
-143
-156
-163
-170
-176
-180
-182
-189
-193
-196
-200
-203
-205
-207
-209
-209
-208
-205
-201
-196
-190
-182
-173
-166
-159
-153
-149
-145
-142
-138
-135
-131
-126
-123
-120
-118
-117
-115
-114
-114
-114
-114
-114
-114
-115
-115
-115
-114
-114
-114
-113
-112
-111
-111
-112
-113
-115
-123
-132
-140
-148
-153
-159
-161
-163
-163
-162
-156
-149
-140
-129
-114
-96
-90
-87
-86
-86
-88
-91
-96
-105
-117
-140
-160
-177
-192
-200
-205
-206
-207
-208
-208
-209
-210
-212
-213
-214
-216
-217
-217
-217
-217
-218
-218
-218
-218
-219
-219
-220
-221
-222
-223
-225
-226
-227
-229
-230
-231
-232
-232
-233
-233
-233
-233
-233
-233
-233
-232
-231
-231
-230
-228
-227
-225
-224
-222
-221
-220
-219
-219
-219
-219
-218
-217
-215
-213
-212
-211
-210
-210
-210
-209
-197
-175
-150
-127
-107
-99
-99
-100
-103
-109
-138
-162
-180
-194
-203
-210
-214
-216
-216
-216
-211
-203
-196
-190
-187
-187
-190
-191
-187
-177
-160
-112
-62
-22
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-90
-112
-121
-124
-126
-138
-148
-153
-153
-150
-130
-113
-106
-105
-106
-105
-89
-76
-60
-39
-16
-6
-2
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-25
-92
-127
-139
-137
-132
-149
-172
-192
-198
-204
-204
-200
-192
-178
-148
-130
-122
-118
-116
-117
-121
-121
-114
-100
-93
-95
-109
-126
-139
-140
-132
-128
-128
-133
-140
-144
-148
-153
-154
-160
-167
-174
-181
-189
-196
-202
-206
-209
-210
-211
-210
-208
-203
-196
-187
-178
-169
-161
-155
-151
-149
-147
-146
-144
-141
-138
-135
-132
-130
-126
-123
-120
-118
-116
-115
-114
-114
-113
-113
-114
-115
-117
-121
-126
-135
-141
-145
-148
-151
-155
-159
-161
-163
-165
-166
-166
-165
-163
-159
-143
-124
-108
-96
-89
-86
-85
-85
-86
-87
-95
-102
-116
-133
-154
-184
-195
-202
-205
-206
-207
-207
-208
-209
-210
-213
-215
-216
-217
-217
-217
-217
-218
-218
-218
-218
-218
-219
-220
-221
-222
-223
-224
-225
-226
-228
-229
-230
-230
-231
-232
-233
-233
-234
-234
-234
-234
-234
-234
-233
-233
-233
-232
-232
-231
-230
-229
-228
-226
-224
-221
-220
-220
-219
-219
-219
-218
-217
-215
-212
-211
-210
-210
-210
-209
-201
-180
-156
-131
-109
-99
-99
-100
-103
-109
-141
-165
-183
-196
-204
-212
-215
-216
-216
-216
-208
-200
-193
-189
-187
-188
-192
-190
-184
-173
-146
-89
-42
-11
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-93
-116
-126
-128
-131
-145
-153
-156
-154
-146
-124
-120
-121
-124
-125
-119
-110
-103
-92
-73
-49
-27
-12
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-38
-90
-133
-139
-119
-117
-124
-137
-152
-159
-162
-159
-151
-136
-126
-124
-123
-125
-134
-147
-150
-152
-150
-144
-114
-100
-98
-108
-132
-140
-137
-130
-122
-121
-119
-118
-118
-118
-117
-117
-119
-122
-127
-134
-149
-164
-180
-194
-204
-211
-214
-216
-216
-213
-208
-202
-193
-183
-172
-161
-156
-152
-150
-149
-148
-147
-146
-145
-145
-144
-144
-143
-143
-143
-143
-143
-143
-144
-144
-145
-147
-149
-151
-153
-155
-155
-157
-159
-163
-167
-170
-173
-174
-174
-170
-165
-155
-142
-125
-105
-97
-91
-88
-86
-85
-87
-89
-94
-103
-118
-139
-161
-182
-197
-204
-206
-207
-207
-208
-209
-210
-212
-214
-216
-217
-217
-217
-217
-217
-218
-218
-218
-218
-219
-220
-221
-222
-223
-224
-224
-225
-226
-226
-227
-228
-229
-230
-231
-232
-232
-233
-233
-233
-233
-233
-232
-232
-232
-232
-232
-232
-232
-232
-231
-231
-230
-229
-229
-228
-225
-223
-221
-220
-220
-219
-219
-218
-216
-214
-211
-210
-210
-210
-210
-204
-186
-161
-135
-112
-100
-99
-99
-103
-112
-148
-171
-187
-199
-207
-213
-216
-217
-216
-214
-203
-195
-191
-188
-188
-191
-192
-185
-175
-166
-115
-58
-22
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-93
-118
-129
-131
-133
-148
-155
-157
-153
-142
-128
-129
-132
-136
-137
-131
-123
-115
-105
-91
-72
-52
-32
-15
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-14
-51
-97
-135
-130
-117
-113
-117
-126
-138
-140
-138
-134
-129
-126
-126
-130
-137
-144
-150
-152
-154
-154
-154
-142
-122
-106
-101
-112
-137
-138
-132
-124
-120
-117
-114
-113
-112
-112
-110
-110
-110
-110
-111
-114
-122
-134
-149
-166
-188
-200
-207
-212
-214
-213
-211
-207
-201
-194
-179
-171
-164
-158
-154
-152
-150
-149
-148
-148
-147
-147
-146
-146
-146
-146
-147
-147
-148
-149
-150
-152
-154
-157
-159
-163
-166
-169
-172
-174
-176
-177
-177
-175
-171
-161
-149
-137
-124
-112
-99
-93
-89
-87
-86
-88
-93
-100
-110
-124
-152
-173
-188
-198
-204
-206
-207
-208
-208
-210
-212
-214
-215
-216
-217
-217
-217
-217
-217
-218
-218
-218
-219
-220
-221
-222
-222
-223
-223
-224
-224
-225
-225
-225
-226
-227
-228
-229
-229
-230
-230
-230
-230
-229
-229
-229
-229
-228
-228
-229
-229
-229
-230
-230
-230
-230
-230
-230
-229
-228
-227
-225
-223
-221
-220
-220
-219
-219
-217
-214
-212
-211
-210
-210
-210
-205
-188
-164
-137
-113
-100
-99
-99
-104
-117
-155
-176
-191
-202
-209
-214
-216
-216
-215
-210
-199
-193
-189
-188
-189
-192
-192
-182
-168
-153
-85
-38
-12
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-93
-120
-131
-133
-135
-149
-156
-158
-153
-141
-133
-136
-140
-144
-144
-141
-135
-128
-118
-105
-85
-70
-52
-32
-12
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-22
-56
-105
-134
-125
-115
-110
-112
-120
-126
-128
-129
-128
-128
-132
-137
-143
-148
-150
-152
-154
-156
-157
-155
-142
-123
-106
-101
-122
-134
-135
-129
-121
-117
-114
-112
-111
-110
-108
-106
-105
-103
-102
-100
-101
-105
-112
-122
-145
-167
-184
-198
-207
-213
-214
-213
-211
-207
-197
-188
-179
-171
-165
-160
-157
-156
-154
-153
-152
-151
-151
-151
-151
-151
-152
-153
-154
-155
-158
-160
-163
-165
-168
-171
-174
-177
-179
-180
-181
-179
-176
-172
-165
-151
-139
-127
-115
-104
-94
-90
-88
-88
-89
-95
-103
-116
-132
-152
-180
-194
-201
-205
-206
-207
-208
-210
-211
-213
-215
-216
-217
-217
-217
-217
-217
-217
-218
-218
-219
-220
-220
-221
-222
-223
-223
-223
-223
-223
-223
-223
-223
-224
-225
-226
-227
-228
-228
-228
-228
-228
-228
-227
-227
-227
-227
-227
-227
-227
-227
-227
-228
-228
-229
-229
-229
-229
-229
-228
-228
-226
-225
-223
-221
-220
-220
-219
-218
-215
-212
-211
-210
-210
-210
-206
-189
-165
-138
-114
-101
-99
-100
-107
-123
-163
-182
-195
-204
-211
-216
-216
-216
-213
-207
-195
-191
-189
-189
-190
-193
-188
-177
-159
-132
-58
-23
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-93
-121
-132
-135
-137
-149
-156
-158
-153
-141
-137
-142
-147
-149
-150
-149
-145
-139
-130
-117
-95
-81
-67
-50
-27
-4
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-20
-58
-117
-128
-123
-114
-109
-108
-117
-123
-128
-130
-131
-137
-142
-145
-147
-149
-151
-153
-155
-157
-158
-156
-142
-121
-100
-103
-124
-135
-136
-126
-119
-116
-113
-112
-110
-109
-108
-106
-104
-102
-97
-94
-91
-89
-88
-101
-125
-149
-171
-189
-207
-212
-213
-214
-214
-209
-203
-195
-187
-178
-170
-166
-164
-161
-160
-158
-157
-156
-156
-156
-156
-157
-158
-160
-162
-166
-168
-171
-173
-176
-179
-180
-182
-183
-183
-182
-179
-174
-167
-158
-143
-132
-120
-109
-99
-90
-89
-89
-90
-94
-105
-119
-137
-158
-180
-199
-204
-206
-207
-207
-209
-210
-212
-214
-216
-217
-217
-217
-217
-217
-217
-217
-218
-218
-219
-220
-221
-221
-222
-222
-222
-222
-222
-221
-221
-221
-221
-222
-223
-224
-226
-226
-227
-227
-227
-227
-227
-227
-227
-227
-226
-226
-226
-226
-226
-226
-226
-226
-226
-227
-228
-228
-229
-229
-228
-228
-227
-226
-224
-222
-220
-220
-219
-218
-215
-212
-211
-210
-210
-210
-206
-190
-165
-138
-115
-101
-99
-101
-110
-133
-171
-187
-199
-207
-212
-216
-216
-215
-210
-202
-192
-190
-189
-190
-191
-192
-181
-169
-146
-106
-34
-12
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-91
-121
-133
-137
-138
-149
-156
-157
-153
-142
-141
-148
-152
-154
-154
-153
-152
-148
-141
-129
-104
-88
-75
-63
-50
-11
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-7
-65
-114
-131
-128
-117
-106
-107
-115
-125
-132
-137
-140
-142
-144
-145
-146
-148
-150
-154
-157
-159
-158
-155
-142
-111
-93
-107
-127
-140
-137
-123
-120
-117
-114
-113
-113
-112
-112
-110
-108
-100
-95
-90
-85
-81
-77
-85
-105
-130
-157
-191
-205
-211
-213
-215
-213
-211
-207
-201
-192
-182
-176
-171
-169
-167
-164
-163
-162
-161
-161
-161
-162
-163
-165
-167
-169
-171
-174
-177
-179
-183
-185
-186
-187
-186
-183
-178
-172
-163
-153
-138
-125
-112
-101
-94
-90
-90
-92
-96
-102
-119
-140
-162
-183
-200
-205
-206
-207
-208
-209
-211
-214
-216
-217
-217
-217
-217
-217
-217
-217
-217
-218
-219
-219
-220
-221
-221
-221
-222
-221
-221
-220
-219
-219
-219
-220
-221
-222
-223
-225
-226
-226
-227
-227
-227
-227
-227
-227
-227
-227
-227
-227
-226
-226
-226
-226
-226
-226
-226
-226
-226
-227
-227
-228
-228
-228
-227
-226
-225
-223
-221
-220
-220
-218
-215
-212
-211
-210
-210
-210
-206
-189
-165
-138
-115
-101
-100
-103
-116
-144
-179
-193
-203
-209
-215
-216
-216
-213
-207
-197
-190
-189
-189
-191
-193
-191
-174
-157
-129
-74
-16
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-87
-118
-133
-137
-139
-148
-156
-157
-153
-146
-146
-152
-155
-155
-155
-154
-154
-153
-152
-150
-127
-101
-82
-68
-61
-35
-12
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-34
-81
-121
-133
-127
-115
-111
-113
-118
-127
-134
-138
-139
-139
-139
-141
-145
-151
-157
-160
-160
-159
-156
-149
-99
-91
-100
-119
-141
-139
-130
-125
-122
-120
-122
-125
-127
-129
-129
-124
-117
-106
-93
-82
-74
-69
-67
-73
-91
-137
-167
-190
-204
-212
-215
-213
-213
-211
-207
-198
-189
-182
-176
-172
-169
-167
-165
-164
-163
-164
-165
-166
-169
-171
-176
-179
-182
-184
-186
-188
-188
-188
-188
-187
-182
-176
-169
-159
-148
-131
-118
-107
-98
-93
-91
-93
-97
-105
-118
-147
-170
-189
-202
-206
-207
-207
-209
-210
-212
-216
-216
-217
-217
-217
-217
-217
-217
-217
-217
-218
-219
-219
-220
-220
-220
-220
-220
-219
-218
-217
-218
-218
-219
-219
-220
-222
-223
-225
-225
-226
-226
-226
-227
-227
-227
-227
-227
-227
-227
-227
-227
-227
-227
-227
-227
-226
-226
-226
-226
-226
-226
-226
-227
-227
-227
-227
-226
-225
-224
-222
-221
-220
-218
-215
-212
-211
-210
-210
-210
-206
-187
-161
-135
-114
-101
-102
-109
-128
-162
-189
-199
-207
-213
-216
-216
-215
-208
-200
-192
-189
-189
-190
-192
-192
-182
-165
-136
-94
-37
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-84
-113
-130
-137
-140
-147
-155
-157
-154
-148
-149
-154
-155
-155
-154
-154
-154
-154
-155
-154
-146
-120
-93
-71
-62
-47
-21
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-10
-28
-56
-94
-119
-122
-123
-123
-123
-124
-126
-128
-128
-128
-130
-136
-142
-148
-155
-161
-161
-160
-159
-156
-132
-102
-91
-97
-114
-139
-137
-134
-130
-127
-128
-130
-132
-133
-133
-132
-131
-126
-117
-103
-81
-71
-64
-62
-63
-83
-114
-146
-177
-202
-213
-213
-213
-212
-210
-206
-202
-195
-188
-181
-176
-173
-171
-169
-168
-168
-168
-170
-172
-174
-179
-181
-184
-186
-188
-189
-189
-190
-189
-187
-182
-175
-167
-157
-145
-127
-114
-104
-97
-93
-93
-97
-105
-119
-138
-168
-187
-199
-205
-207
-208
-209
-211
-213
-215
-216
-217
-217
-217
-217
-217
-217
-217
-217
-218
-219
-219
-219
-220
-220
-219
-218
-217
-217
-217
-217
-217
-218
-219
-220
-222
-224
-225
-226
-226
-226
-226
-227
-227
-227
-227
-227
-227
-227
-227
-227
-227
-227
-227
-227
-227
-227
-227
-226
-226
-226
-226
-226
-226
-227
-227
-226
-226
-225
-224
-222
-222
-220
-218
-215
-211
-211
-210
-210
-210
-204
-184
-158
-132
-112
-102
-103
-118
-142
-175
-195
-203
-210
-215
-216
-216
-211
-204
-196
-191
-190
-190
-191
-192
-191
-169
-152
-113
-64
-19
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-82
-107
-126
-137
-140
-147
-155
-157
-154
-149
-152
-155
-155
-155
-154
-154
-154
-155
-157
-158
-156
-138
-108
-77
-60
-52
-33
-14
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-18
-42
-70
-94
-109
-118
-123
-128
-130
-131
-131
-132
-134
-139
-144
-149
-154
-160
-161
-162
-161
-159
-150
-123
-100
-87
-92
-117
-132
-137
-137
-134
-133
-133
-134
-135
-135
-136
-136
-136
-132
-124
-103
-84
-69
-58
-52
-54
-71
-98
-133
-171
-204
-210
-213
-213
-212
-210
-208
-203
-198
-191
-183
-179
-176
-174
-172
-170
-171
-171
-173
-176
-180
-184
-186
-188
-190
-190
-191
-190
-190
-188
-181
-174
-165
-154
-142
-123
-111
-102
-96
-93
-95
-103
-116
-134
-156
-184
-198
-204
-207
-208
-209
-211
-213
-215
-216
-217
-217
-217
-217
-217
-217
-217
-217
-218
-218
-219
-219
-219
-219
-218
-217
-216
-216
-216
-216
-217
-218
-219
-221
-223
-225
-225
-226
-226
-226
-226
-226
-226
-226
-226
-226
-226
-226
-226
-227
-227
-227
-227
-227
-227
-227
-227
-227
-227
-226
-226
-226
-226
-226
-226
-226
-226
-226
-225
-224
-223
-222
-220
-217
-214
-211
-211
-210
-210
-209
-201
-179
-154
-129
-109
-104
-107
-129
-159
-185
-199
-207
-213
-216
-216
-214
-207
-199
-193
-190
-190
-191
-192
-190
-184
-160
-133
-87
-39
-9
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-81
-102
-121
-135
-141
-147
-154
-157
-155
-151
-154
-155
-155
-154
-153
-153
-154
-156
-159
-161
-161
-153
-125
-89
-58
-51
-42
-22
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-19
-48
-70
-87
-101
-117
-125
-130
-135
-139
-143
-147
-150
-153
-155
-159
-161
-162
-162
-160
-158
-145
-120
-94
-80
-89
-113
-129
-138
-140
-137
-137
-136
-136
-136
-136
-137
-139
-139
-139
-128
-106
-83
-64
-51
-43
-44
-58
-85
-124
-180
-199
-210
-214
-214
-212
-210
-208
-205
-200
-191
-186
-181
-178
-175
-173
-172
-173
-174
-177
-182
-185
-188
-191
-191
-191
-191
-191
-190
-188
-181
-173
-163
-152
-139
-120
-109
-100
-96
-94
-100
-111
-128
-149
-172
-196
-204
-207
-208
-209
-210
-213
-215
-216
-217
-217
-217
-217
-217
-217
-217
-217
-218
-218
-218
-219
-218
-218
-217
-216
-215
-215
-215
-215
-216
-218
-219
-221
-223
-225
-226
-226
-226
-226
-226
-226
-226
-226
-226
-225
-225
-225
-225
-226
-226
-226
-226
-226
-227
-227
-227
-227
-227
-227
-227
-226
-226
-226
-226
-226
-226
-226
-225
-225
-223
-223
-222
-219
-216
-213
-211
-210
-210
-210
-209
-197
-173
-148
-126
-108
-106
-115
-144
-175
-193
-203
-211
-215
-216
-216
-211
-201
-195
-191
-190
-190
-192
-191
-186
-173
-151
-107
-59
-20
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-80
-96
-115
-132
-142
-147
-154
-157
-155
-152
-155
-156
-155
-153
-153
-153
-154
-158
-162
-165
-166
-162
-143
-108
-57
-43
-43
-26
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-7
-18
-39
-72
-91
-109
-124
-138
-151
-155
-157
-157
-157
-159
-160
-162
-162
-162
-160
-157
-144
-120
-82
-72
-79
-103
-128
-141
-142
-140
-139
-137
-136
-136
-138
-139
-141
-142
-142
-133
-110
-82
-54
-41
-37
-37
-44
-65
-133
-177
-202
-213
-215
-214
-211
-210
-208
-206
-199
-192
-187
-182
-178
-175
-174
-175
-176
-178
-183
-187
-190
-191
-192
-192
-192
-191
-190
-187
-180
-172
-162
-150
-136
-117
-106
-99
-96
-96
-105
-122
-142
-164
-186
-205
-207
-208
-209
-210
-212
-214
-216
-216
-217
-217
-217
-217
-217
-217
-217
-217
-218
-218
-218
-218
-217
-216
-215
-215
-214
-214
-215
-215
-217
-220
-223
-225
-226
-226
-226
-226
-226
-226
-225
-225
-224
-224
-224
-224
-224
-224
-224
-224
-225
-225
-225
-226
-226
-226
-227
-227
-227
-227
-227
-226
-226
-226
-225
-225
-225
-225
-225
-224
-223
-223
-222
-219
-215
-212
-210
-210
-210
-210
-209
-192
-167
-142
-120
-108
-108
-131
-162
-188
-198
-208
-214
-216
-216
-215
-205
-196
-192
-190
-190
-192
-192
-190
-181
-161
-135
-77
-33
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-81
-91
-109
-129
-143
-149
-155
-157
-156
-154
-155
-155
-154
-153
-153
-153
-155
-161
-168
-174
-175
-171
-161
-135
-85
-37
-39
-29
-14
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-3
-7
-15
-29
-48
-72
-106
-127
-141
-151
-155
-157
-159
-160
-161
-162
-161
-160
-158
-150
-130
-77
-67
-66
-80
-113
-141
-142
-143
-142
-140
-138
-139
-140
-142
-144
-145
-143
-135
-117
-85
-44
-36
-32
-30
-31
-52
-103
-156
-197
-215
-216
-214
-212
-210
-209
-206
-202
-196
-191
-185
-180
-177
-176
-177
-178
-184
-187
-190
-192
-192
-193
-192
-192
-190
-187
-180
-171
-160
-147
-133
-114
-104
-98
-97
-100
-117
-137
-158
-180
-199
-207
-208
-209
-210
-211
-214
-216
-216
-217
-217
-217
-217
-217
-217
-217
-217
-217
-218
-217
-217
-216
-215
-214
-214
-213
-214
-214
-216
-219
-222
-225
-226
-226
-226
-226
-226
-225
-224
-224
-223
-223
-223
-223
-223
-223
-223
-222
-222
-222
-222
-222
-223
-223
-224
-225
-226
-227
-227
-227
-227
-227
-226
-225
-225
-225
-225
-225
-224
-224
-223
-223
-220
-217
-213
-211
-210
-210
-210
-208
-205
-181
-159
-133
-113
-109
-118
-159
-184
-198
-203
-214
-216
-216
-214
-210
-196
-192
-191
-191
-191
-192
-190
-179
-164
-151
-89
-38
-11
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-81
-89
-107
-128
-144
-150
-155
-157
-157
-155
-156
-155
-154
-153
-153
-153
-155
-162
-169
-177
-179
-177
-169
-148
-110
-34
-27
-22
-15
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-5
-10
-18
-31
-59
-85
-108
-127
-140
-149
-153
-156
-158
-160
-161
-160
-159
-156
-149
-113
-79
-62
-59
-71
-115
-135
-143
-144
-143
-142
-142
-143
-144
-146
-147
-146
-140
-128
-107
-63
-41
-30
-27
-26
-33
-55
-98
-149
-196
-216
-216
-215
-213
-210
-207
-204
-200
-195
-189
-183
-180
-178
-178
-179
-184
-188
-191
-192
-193
-193
-193
-192
-190
-187
-179
-170
-159
-145
-130
-111
-102
-98
-99
-106
-126
-147
-169
-189
-203
-208
-209
-210
-211
-213
-215
-216
-216
-217
-217
-217
-217
-217
-217
-217
-217
-217
-217
-217
-216
-215
-214
-213
-213
-213
-214
-216
-219
-222
-225
-226
-226
-226
-226
-225
-224
-223
-223
-223
-223
-223
-223
-223
-222
-222
-221
-221
-220
-220
-220
-221
-221
-222
-223
-224
-225
-226
-227
-227
-227
-227
-226
-225
-225
-224
-224
-224
-224
-223
-223
-222
-219
-215
-212
-210
-210
-210
-209
-206
-199
-175
-145
-124
-113
-112
-146
-177
-193
-202
-209
-215
-216
-215
-211
-202
-193
-191
-191
-191
-192
-191
-183
-170
-151
-127
-52
-19
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-81
-87
-106
-129
-145
-151
-156
-157
-157
-155
-156
-155
-154
-153
-153
-154
-155
-161
-169
-179
-182
-180
-175
-160
-129
-38
-22
-17
-14
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-5
-10
-25
-46
-68
-91
-112
-129
-138
-145
-150
-154
-157
-158
-159
-158
-157
-139
-105
-74
-51
-45
-76
-112
-133
-144
-145
-145
-145
-146
-147
-149
-150
-149
-145
-136
-122
-81
-49
-31
-23
-22
-25
-32
-57
-97
-152
-205
-213
-216
-215
-212
-210
-206
-203
-199
-194
-187
-183
-181
-181
-181
-184
-189
-191
-192
-193
-193
-193
-192
-190
-187
-179
-169
-157
-144
-128
-109
-101
-99
-102
-111
-135
-157
-178
-195
-206
-209
-209
-210
-212
-214
-216
-216
-216
-216
-216
-216
-217
-217
-217
-217
-217
-217
-217
-216
-215
-214
-213
-212
-213
-213
-216
-219
-222
-224
-226
-226
-226
-225
-224
-223
-222
-222
-223
-223
-223
-223
-223
-222
-221
-220
-220
-220
-220
-220
-220
-220
-220
-221
-222
-223
-225
-226
-227
-227
-227
-226
-225
-225
-224
-224
-224
-224
-223
-223
-222
-220
-217
-213
-211
-210
-210
-209
-208
-203
-194
-161
-133
-119
-117
-126
-171
-190
-200
-206
-213
-216
-216
-212
-205
-196
-191
-191
-191
-191
-192
-187
-173
-158
-134
-91
-25
-8
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-81
-86
-106
-130
-146
-152
-156
-158
-157
-155
-156
-154
-154
-154
-154
-154
-155
-160
-167
-178
-183
-182
-180
-169
-144
-49
-22
-13
-10
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-6
-16
-32
-52
-75
-99
-114
-126
-135
-142
-149
-153
-155
-157
-158
-154
-132
-97
-60
-34
-39
-77
-111
-136
-145
-147
-148
-149
-150
-152
-153
-152
-149
-142
-131
-98
-61
-35
-20
-17
-20
-22
-31
-54
-98
-177
-203
-214
-217
-215
-212
-209
-206
-203
-199
-192
-187
-184
-183
-183
-184
-189
-191
-193
-193
-193
-193
-192
-190
-187
-179
-169
-156
-142
-126
-108
-101
-100
-106
-117
-143
-165
-185
-200
-208
-209
-210
-211
-213
-215
-216
-216
-216
-216
-216
-216
-216
-217
-217
-217
-217
-216
-216
-215
-214
-212
-212
-212
-213
-214
-218
-221
-224
-225
-226
-225
-224
-223
-222
-221
-221
-222
-223
-223
-223
-223
-222
-221
-220
-220
-220
-220
-220
-220
-220
-220
-220
-221
-221
-223
-225
-226
-227
-227
-227
-226
-225
-224
-224
-224
-223
-223
-223
-222
-221
-218
-214
-212
-210
-210
-209
-209
-206
-199
-184
-143
-125
-119
-126
-149
-189
-198
-205
-210
-215
-216
-213
-206
-198
-192
-191
-191
-191
-191
-190
-178
-162
-142
-108
-52
-8
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-82
-87
-108
-132
-147
-153
-157
-158
-157
-156
-156
-155
-155
-155
-155
-155
-155
-157
-162
-173
-181
-182
-181
-174
-159
-69
-25
-8
-5
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-7
-16
-31
-58
-78
-94
-108
-120
-133
-142
-149
-154
-156
-156
-151
-126
-86
-35
-18
-34
-73
-116
-143
-147
-149
-151
-152
-154
-156
-155
-153
-148
-140
-114
-78
-44
-19
-12
-13
-18
-23
-31
-48
-130
-182
-208
-217
-216
-215
-212
-209
-205
-201
-196
-191
-187
-186
-186
-187
-190
-191
-193
-193
-193
-193
-192
-190
-187
-178
-168
-155
-140
-124
-106
-101
-102
-110
-124
-150
-172
-191
-204
-209
-210
-211
-212
-214
-215
-216
-216
-216
-216
-216
-216
-216
-216
-216
-216
-216
-216
-215
-214
-213
-212
-212
-212
-213
-216
-220
-223
-225
-226
-226
-224
-223
-221
-221
-220
-221
-222
-223
-224
-224
-223
-221
-220
-220
-220
-220
-220
-220
-220
-220
-220
-220
-221
-222
-223
-225
-226
-227
-227
-227
-226
-225
-224
-223
-223
-223
-222
-222
-221
-220
-216
-212
-210
-210
-209
-209
-208
-204
-192
-167
-125
-121
-125
-143
-179
-199
-204
-209
-214
-216
-215
-208
-200
-193
-191
-191
-191
-191
-190
-185
-164
-152
-118
-70
-19
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-83
-90
-113
-136
-147
-154
-157
-158
-157
-156
-156
-155
-156
-157
-157
-155
-155
-155
-157
-162
-178
-182
-182
-178
-165
-86
-31
-8
-3
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-4
-12
-23
-38
-54
-72
-95
-114
-130
-143
-151
-155
-154
-148
-124
-71
-14
-10
-22
-54
-106
-142
-147
-151
-153
-155
-156
-155
-153
-151
-147
-126
-99
-64
-32
-11
-7
-9
-14
-21
-28
-56
-122
-175
-208
-217
-216
-215
-213
-210
-206
-201
-198
-194
-191
-190
-190
-191
-192
-193
-193
-193
-193
-192
-190
-187
-178
-167
-153
-138
-121
-105
-102
-105
-115
-131
-158
-179
-196
-206
-210
-211
-211
-213
-214
-215
-216
-216
-216
-216
-216
-216
-216
-216
-216
-216
-216
-215
-214
-213
-212
-211
-212
-213
-215
-218
-222
-224
-225
-225
-224
-222
-220
-219
-219
-220
-222
-223
-224
-224
-224
-222
-221
-220
-220
-220
-220
-220
-220
-220
-220
-220
-220
-221
-222
-224
-226
-226
-227
-227
-226
-225
-223
-223
-222
-222
-222
-221
-221
-220
-216
-212
-210
-209
-209
-209
-208
-205
-191
-167
-134
-125
-127
-150
-179
-198
-205
-211
-214
-215
-215
-208
-198
-193
-192
-191
-191
-191
-189
-181
-167
-153
-119
-69
-23
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-84
-95
-117
-139
-148
-155
-158
-158
-157
-156
-156
-156
-157
-158
-159
-157
-156
-155
-155
-158
-172
-180
-182
-179
-171
-98
-37
-10
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-4
-8
-14
-23
-36
-60
-83
-106
-127
-141
-151
-153
-150
-134
-97
-22
-9
-9
-23
-52
-108
-133
-145
-151
-154
-155
-154
-152
-150
-146
-129
-103
-71
-38
-13
-6
-6
-9
-13
-22
-40
-79
-136
-187
-212
-216
-216
-215
-213
-210
-204
-201
-198
-195
-193
-193
-193
-193
-194
-194
-194
-193
-192
-190
-187
-178
-166
-153
-137
-120
-105
-103
-108
-119
-135
-162
-183
-198
-208
-210
-211
-212
-213
-214
-215
-216
-216
-216
-216
-216
-216
-216
-216
-216
-216
-216
-215
-214
-213
-211
-211
-212
-213
-215
-219
-223
-224
-224
-224
-223
-220
-219
-218
-219
-220
-223
-224
-224
-224
-224
-222
-221
-221
-220
-220
-220
-220
-220
-220
-220
-220
-221
-222
-224
-225
-226
-226
-226
-226
-225
-223
-222
-222
-221
-221
-221
-221
-219
-216
-212
-210
-209
-209
-208
-208
-206
-193
-169
-146
-132
-129
-151
-174
-194
-204
-210
-213
-215
-214
-211
-199
-194
-192
-192
-191
-191
-188
-180
-169
-159
-128
-76
-35
-8
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-85
-99
-122
-142
-149
-157
-159
-159
-157
-156
-156
-157
-158
-159
-159
-159
-157
-155
-155
-156
-166
-177
-182
-180
-174
-106
-42
-12
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-4
-8
-14
-30
-51
-77
-103
-127
-144
-148
-148
-137
-109
-28
-10
-3
-7
-19
-61
-97
-124
-141
-149
-152
-152
-150
-146
-142
-127
-105
-75
-42
-14
-6
-5
-6
-8
-13
-27
-52
-98
-151
-199
-214
-216
-215
-214
-213
-208
-204
-201
-199
-197
-195
-195
-195
-194
-194
-194
-194
-193
-190
-187
-177
-166
-152
-136
-119
-105
-104
-110
-122
-138
-165
-185
-200
-208
-211
-211
-212
-213
-214
-215
-216
-216
-216
-216
-216
-216
-216
-216
-216
-216
-215
-214
-213
-212
-211
-211
-212
-213
-216
-219
-223
-223
-223
-223
-221
-218
-217
-217
-218
-220
-224
-224
-224
-224
-224
-223
-222
-222
-221
-220
-220
-220
-220
-220
-221
-222
-223
-224
-225
-226
-226
-226
-225
-224
-223
-221
-221
-221
-221
-221
-220
-218
-215
-212
-210
-208
-208
-208
-208
-206
-194
-172
-152
-138
-133
-148
-174
-192
-203
-208
-213
-214
-213
-210
-203
-194
-192
-192
-192
-192
-189
-181
-171
-158
-141
-86
-40
-13
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-87
-104
-126
-144
-150
-158
-159
-159
-157
-156
-156
-157
-159
-160
-160
-159
-159
-157
-155
-155
-161
-174
-181
-181
-175
-111
-46
-14
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-3
-10
-24
-45
-71
-100
-126
-135
-137
-129
-107
-31
-10
-2
-2
-3
-20
-54
-87
-116
-136
-143
-145
-144
-141
-137
-122
-104
-75
-44
-14
-5
-5
-4
-5
-6
-17
-34
-65
-112
-175
-210
-214
-216
-215
-214
-212
-207
-205
-202
-200
-197
-197
-196
-195
-195
-194
-194
-193
-191
-187
-178
-166
-151
-135
-117
-106
-106
-112
-124
-141
-167
-187
-200
-209
-211
-212
-212
-213
-214
-215
-215
-216
-216
-216
-216
-216
-216
-216
-216
-216
-215
-214
-213
-212
-211
-211
-212
-213
-216
-219
-222
-222
-222
-221
-219
-216
-216
-216
-217
-220
-224
-225
-225
-225
-225
-224
-223
-223
-222
-222
-221
-221
-221
-222
-222
-224
-225
-225
-226
-226
-226
-225
-224
-222
-221
-220
-220
-220
-220
-219
-217
-214
-211
-209
-208
-208
-208
-207
-204
-198
-174
-152
-142
-140
-144
-174
-193
-203
-209
-212
-214
-213
-210
-204
-196
-192
-192
-192
-191
-190
-182
-171
-159
-140
-109
-41
-14
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-87
-110
-131
-147
-151
-158
-160
-159
-157
-156
-156
-158
-159
-160
-160
-160
-159
-158
-156
-155
-158
-171
-179
-181
-177
-115
-48
-14
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-5
-14
-30
-54
-94
-107
-111
-105
-92
-29
-10
-2
-1
-1
-3
-13
-37
-71
-108
-126
-133
-134
-132
-129
-116
-98
-73
-43
-13
-4
-4
-4
-4
-4
-7
-21
-45
-81
-134
-201
-211
-215
-216
-215
-214
-211
-207
-204
-203
-199
-198
-198
-197
-196
-195
-194
-193
-191
-187
-178
-166
-151
-134
-117
-107
-108
-114
-126
-143
-169
-187
-201
-209
-211
-212
-213
-213
-214
-215
-215
-216
-216
-216
-216
-216
-216
-216
-216
-216
-215
-214
-213
-212
-211
-211
-212
-213
-216
-219
-221
-221
-221
-220
-218
-215
-215
-215
-216
-220
-224
-225
-225
-225
-225
-225
-225
-224
-224
-224
-224
-224
-224
-225
-225
-225
-226
-226
-226
-226
-225
-223
-222
-221
-220
-220
-220
-219
-217
-216
-212
-210
-208
-208
-208
-208
-207
-205
-196
-178
-149
-144
-142
-148
-168
-197
-205
-209
-212
-214
-214
-210
-203
-196
-192
-192
-192
-191
-189
-184
-171
-162
-144
-111
-58
-9
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-89
-118
-138
-149
-152
-159
-161
-159
-157
-157
-157
-158
-159
-160
-160
-160
-160
-159
-157
-155
-157
-169
-178
-181
-177
-117
-48
-14
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-2
-4
-7
-24
-36
-39
-37
-30
-10
-4
-2
-1
-1
-1
-2
-6
-16
-39
-80
-97
-106
-108
-106
-95
-80
-55
-29
-7
-2
-2
-3
-3
-3
-4
-7
-21
-47
-88
-169
-200
-213
-216
-216
-215
-214
-210
-207
-205
-203
-201
-199
-198
-197
-195
-194
-193
-191
-188
-178
-166
-151
-134
-117
-108
-109
-116
-127
-143
-168
-186
-200
-209
-211
-212
-213
-213
-214
-214
-215
-215
-215
-216
-216
-216
-216
-216
-216
-216
-215
-214
-213
-211
-211
-211
-211
-213
-215
-218
-220
-220
-219
-218
-216
-214
-213
-213
-215
-219
-224
-225
-225
-225
-225
-225
-225
-225
-225
-225
-225
-225
-225
-225
-225
-225
-226
-225
-225
-224
-222
-220
-220
-219
-218
-217
-215
-214
-212
-210
-208
-208
-208
-208
-207
-205
-198
-183
-166
-152
-147
-148
-161
-180
-199
-209
-211
-213
-213
-213
-208
-200
-195
-192
-192
-192
-191
-186
-180
-172
-160
-136
-94
-48
-11
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-91
-124
-143
-151
-153
-160
-161
-159
-157
-157
-157
-158
-159
-160
-160
-160
-160
-159
-157
-155
-157
-169
-178
-181
-177
-114
-46
-13
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-3
-8
-12
-13
-12
-10
-4
-2
-1
-1
-1
-1
-1
-3
-6
-14
-37
-59
-74
-81
-82
-74
-61
-41
-20
-5
-2
-2
-2
-3
-3
-3
-5
-13
-30
-61
-133
-182
-206
-214
-216
-216
-215
-213
-210
-206
-204
-202
-201
-200
-199
-196
-195
-193
-191
-188
-179
-167
-152
-135
-118
-109
-110
-117
-128
-143
-166
-184
-198
-208
-211
-212
-213
-213
-214
-214
-215
-215
-215
-215
-216
-216
-216
-216
-216
-216
-215
-214
-213
-212
-211
-211
-211
-212
-214
-217
-218
-218
-218
-217
-215
-212
-212
-212
-213
-216
-223
-224
-225
-225
-225
-225
-225
-225
-225
-225
-225
-225
-225
-225
-225
-224
-224
-222
-221
-220
-218
-217
-216
-215
-214
-213
-212
-210
-210
-209
-208
-208
-207
-205
-203
-190
-176
-165
-157
-152
-155
-168
-184
-199
-208
-211
-212
-213
-212
-208
-199
-195
-193
-192
-192
-189
-185
-179
-172
-163
-133
-90
-50
-19
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-94
-129
-147
-153
-154
-160
-161
-160
-158
-157
-157
-158
-159
-159
-160
-160
-160
-159
-157
-156
-157
-169
-178
-181
-176
-108
-43
-12
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-2
-3
-2
-2
-1
-1
-1
-1
-1
-1
-1
-1
-2
-4
-13
-28
-41
-51
-56
-51
-41
-27
-13
-4
-1
-1
-1
-2
-3
-3
-4
-7
-18
-39
-101
-158
-194
-212
-215
-216
-216
-215
-212
-209
-206
-204
-203
-201
-200
-197
-195
-194
-192
-188
-180
-168
-153
-136
-119
-110
-111
-117
-127
-141
-163
-181
-196
-206
-211
-212
-213
-213
-214
-214
-215
-215
-215
-215
-215
-216
-216
-216
-216
-216
-215
-214
-213
-212
-211
-211
-211
-212
-213
-215
-217
-217
-217
-216
-215
-212
-211
-211
-211
-213
-220
-223
-224
-225
-225
-225
-225
-225
-224
-224
-224
-224
-223
-223
-222
-221
-220
-218
-217
-216
-215
-214
-213
-212
-212
-210
-210
-209
-208
-208
-207
-205
-201
-195
-187
-174
-165
-159
-157
-159
-174
-189
-201
-208
-211
-212
-212
-210
-206
-201
-195
-193
-192
-191
-189
-184
-179
-171
-159
-139
-89
-48
-21
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-98
-133
-150
-155
-156
-161
-161
-160
-158
-157
-157
-158
-158
-159
-160
-160
-160
-159
-157
-156
-157
-170
-179
-181
-174
-100
-38
-10
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-3
-7
-16
-24
-30
-28
-23
-15
-8
-3
-1
-1
-1
-1
-2
-2
-3
-4
-9
-22
-72
-128
-175
-206
-214
-215
-216
-216
-215
-212
-208
-207
-205
-203
-201
-198
-196
-194
-192
-189
-181
-170
-155
-138
-120
-111
-112
-117
-127
-139
-160
-177
-192
-204
-210
-212
-213
-213
-214
-214
-214
-214
-215
-215
-215
-215
-216
-216
-216
-216
-215
-214
-213
-212
-211
-211
-211
-211
-212
-214
-216
-216
-216
-215
-214
-211
-210
-209
-209
-210
-216
-221
-223
-224
-225
-225
-224
-224
-223
-223
-222
-222
-221
-220
-219
-217
-216
-215
-214
-213
-212
-211
-211
-210
-210
-209
-208
-208
-207
-206
-202
-197
-190
-181
-171
-163
-161
-162
-166
-175
-195
-205
-210
-212
-212
-212
-209
-205
-200
-195
-193
-192
-191
-188
-185
-178
-171
-157
-134
-99
-42
-17
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-102
-136
-151
-156
-157
-161
-161
-160
-158
-157
-157
-157
-158
-159
-159
-159
-159
-159
-157
-156
-158
-172
-180
-180
-171
-87
-32
-8
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-3
-5
-8
-9
-7
-5
-3
-2
-1
-1
-1
-1
-1
-2
-2
-3
-4
-7
-44
-98
-154
-197
-212
-215
-216
-216
-216
-216
-211
-209
-207
-205
-202
-200
-196
-194
-192
-190
-182
-171
-157
-140
-122
-113
-113
-117
-125
-137
-156
-172
-188
-200
-208
-211
-213
-213
-214
-214
-214
-214
-214
-215
-215
-215
-215
-215
-215
-215
-215
-215
-214
-213
-212
-211
-211
-211
-212
-213
-214
-215
-215
-214
-214
-211
-209
-208
-208
-208
-210
-216
-220
-223
-224
-224
-224
-223
-222
-222
-220
-219
-218
-217
-216
-214
-213
-212
-212
-211
-211
-210
-210
-209
-209
-208
-207
-206
-204
-200
-190
-181
-174
-168
-164
-163
-164
-172
-184
-200
-210
-211
-212
-212
-212
-209
-203
-198
-195
-193
-192
-190
-187
-183
-179
-172
-159
-130
-91
-45
-9
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-108
-137
-152
-157
-158
-162
-162
-161
-159
-157
-157
-157
-158
-158
-159
-159
-159
-158
-157
-156
-160
-175
-181
-177
-162
-65
-22
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-2
-3
-5
-19
-58
-113
-168
-206
-214
-215
-216
-217
-217
-215
-212
-210
-208
-205
-201
-198
-195
-193
-191
-184
-174
-160
-144
-126
-114
-114
-117
-124
-133
-149
-164
-180
-193
-203
-209
-211
-213
-213
-214
-214
-214
-214
-214
-214
-215
-215
-215
-215
-215
-215
-215
-214
-214
-213
-212
-211
-211
-211
-212
-213
-213
-213
-213
-213
-211
-209
-208
-206
-206
-205
-207
-211
-215
-218
-221
-222
-221
-221
-220
-219
-218
-217
-215
-214
-213
-212
-211
-211
-210
-210
-209
-208
-207
-206
-202
-197
-192
-185
-179
-173
-170
-169
-168
-167
-176
-189
-200
-207
-211
-212
-212
-211
-209
-206
-199
-196
-194
-193
-192
-188
-184
-180
-176
-170
-145
-105
-63
-28
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-111
-138
-152
-158
-159
-162
-162
-161
-159
-158
-157
-158
-158
-158
-159
-159
-159
-158
-157
-157
-164
-178
-182
-173
-146
-47
-15
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-2
-3
-12
-38
-83
-138
-194
-212
-214
-215
-216
-217
-216
-214
-212
-210
-206
-202
-198
-196
-193
-192
-185
-176
-163
-148
-130
-116
-115
-117
-123
-131
-144
-157
-172
-186
-197
-205
-209
-212
-213
-213
-214
-214
-214
-214
-214
-214
-215
-215
-215
-215
-215
-215
-215
-214
-213
-212
-212
-211
-211
-212
-212
-212
-212
-212
-212
-211
-209
-208
-206
-205
-204
-204
-205
-207
-209
-212
-214
-216
-216
-217
-216
-215
-215
-214
-213
-211
-210
-209
-208
-207
-205
-203
-200
-197
-194
-188
-184
-181
-178
-175
-172
-172
-174
-179
-185
-196
-203
-208
-210
-211
-211
-209
-207
-204
-200
-196
-194
-192
-189
-187
-183
-180
-173
-161
-140
-92
-54
-27
-10
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-115
-139
-152
-159
-160
-163
-163
-161
-160
-158
-158
-158
-158
-158
-158
-159
-158
-158
-157
-157
-169
-180
-181
-165
-124
-31
-10
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-6
-23
-57
-107
-171
-208
-212
-214
-215
-217
-217
-216
-214
-211
-208
-203
-199
-196
-194
-192
-186
-178
-166
-152
-134
-118
-116
-118
-122
-128
-139
-151
-164
-178
-190
-200
-206
-209
-212
-213
-213
-214
-214
-214
-214
-214
-214
-214
-215
-215
-215
-215
-215
-214
-214
-213
-212
-212
-212
-212
-212
-212
-212
-212
-212
-211
-209
-208
-207
-205
-203
-203
-202
-203
-203
-205
-206
-207
-208
-209
-209
-208
-208
-207
-206
-205
-204
-202
-200
-199
-196
-193
-191
-188
-185
-181
-179
-177
-176
-176
-178
-181
-187
-193
-200
-207
-210
-211
-211
-210
-208
-205
-202
-199
-196
-193
-190
-188
-185
-182
-178
-169
-152
-127
-93
-45
-22
-8
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-118
-139
-152
-159
-161
-163
-163
-162
-160
-158
-158
-158
-158
-158
-158
-159
-158
-158
-157
-159
-175
-181
-178
-154
-96
-17
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-12
-36
-77
-139
-200
-209
-213
-214
-216
-217
-216
-215
-213
-209
-204
-200
-197
-195
-193
-188
-180
-170
-156
-139
-121
-118
-118
-121
-126
-135
-144
-156
-168
-181
-194
-200
-205
-209
-212
-213
-213
-213
-213
-214
-214
-214
-214
-214
-214
-215
-215
-215
-215
-214
-214
-213
-213
-212
-212
-212
-212
-212
-212
-211
-211
-210
-209
-207
-206
-204
-203
-202
-201
-200
-200
-200
-200
-200
-200
-200
-200
-200
-199
-198
-197
-195
-194
-192
-190
-187
-185
-183
-182
-181
-179
-179
-179
-181
-183
-189
-195
-201
-206
-210
-212
-211
-210
-209
-207
-204
-200
-197
-195
-193
-189
-186
-184
-180
-177
-165
-145
-116
-81
-45
-13
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-120
-140
-152
-159
-161
-164
-164
-163
-161
-158
-158
-158
-158
-158
-158
-159
-158
-157
-158
-161
-181
-182
-173
-138
-64
-8
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-5
-19
-49
-102
-187
-204
-212
-214
-214
-216
-216
-215
-213
-211
-205
-201
-198
-196
-194
-189
-182
-173
-161
-145
-124
-120
-119
-121
-125
-132
-138
-147
-158
-171
-185
-193
-200
-205
-209
-212
-213
-213
-213
-213
-213
-213
-214
-214
-214
-214
-214
-214
-214
-214
-214
-214
-213
-213
-212
-212
-212
-212
-211
-211
-211
-210
-209
-208
-207
-204
-203
-202
-201
-200
-198
-198
-197
-196
-195
-194
-194
-193
-192
-191
-190
-189
-188
-187
-186
-184
-184
-183
-182
-181
-182
-184
-187
-192
-198
-205
-209
-211
-211
-212
-211
-209
-207
-205
-202
-199
-196
-193
-190
-187
-184
-182
-180
-175
-167
-138
-101
-63
-31
-10
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-123
-140
-152
-159
-162
-164
-164
-164
-162
-160
-158
-158
-158
-158
-159
-159
-158
-158
-161
-170
-183
-181
-152
-100
-29
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-9
-25
-59
-145
-188
-207
-213
-214
-215
-215
-215
-214
-211
-207
-203
-200
-197
-195
-191
-186
-178
-167
-154
-132
-124
-121
-121
-124
-129
-133
-138
-146
-156
-170
-180
-188
-195
-201
-207
-210
-211
-212
-213
-213
-213
-213
-213
-213
-213
-214
-214
-214
-214
-214
-214
-214
-213
-213
-213
-212
-212
-212
-211
-211
-210
-210
-209
-208
-207
-205
-204
-202
-200
-199
-198
-197
-196
-195
-194
-193
-192
-192
-191
-190
-189
-188
-187
-187
-186
-187
-188
-191
-194
-199
-203
-207
-209
-210
-211
-211
-211
-210
-208
-206
-204
-202
-199
-197
-193
-190
-186
-184
-182
-179
-174
-164
-145
-114
-65
-34
-14
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-124
-139
-151
-159
-162
-165
-165
-164
-163
-161
-159
-159
-159
-159
-159
-159
-158
-159
-164
-177
-181
-171
-124
-64
-12
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-5
-15
-36
-103
-165
-198
-211
-213
-214
-215
-215
-214
-212
-208
-205
-201
-199
-196
-192
-188
-181
-173
-162
-141
-129
-124
-122
-124
-128
-131
-134
-139
-146
-158
-167
-176
-184
-192
-200
-204
-207
-210
-211
-212
-212
-212
-212
-213
-213
-213
-213
-213
-214
-214
-214
-214
-213
-213
-213
-213
-213
-212
-212
-212
-211
-211
-210
-210
-209
-208
-206
-205
-204
-202
-201
-200
-198
-197
-196
-195
-195
-194
-194
-193
-194
-194
-195
-195
-197
-199
-201
-203
-205
-207
-209
-209
-210
-210
-210
-209
-208
-206
-205
-202
-200
-197
-194
-190
-186
-184
-182
-180
-177
-168
-150
-124
-93
-60
-26
-13
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-125
-139
-150
-158
-162
-165
-165
-165
-164
-162
-160
-159
-159
-160
-160
-158
-158
-162
-170
-180
-179
-148
-91
-35
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-7
-18
-68
-134
-180
-207
-213
-214
-214
-214
-214
-213
-209
-206
-203
-200
-197
-194
-190
-185
-178
-169
-150
-137
-128
-124
-124
-127
-129
-132
-135
-139
-148
-156
-164
-172
-180
-190
-196
-201
-205
-208
-210
-211
-212
-212
-212
-212
-212
-212
-212
-213
-213
-213
-213
-213
-213
-213
-213
-213
-213
-213
-212
-212
-212
-212
-211
-210
-210
-209
-208
-207
-206
-205
-204
-203
-203
-202
-201
-201
-201
-201
-201
-202
-202
-203
-204
-206
-207
-208
-209
-210
-210
-210
-209
-209
-209
-207
-206
-204
-203
-200
-197
-194
-191
-187
-184
-181
-179
-176
-170
-161
-135
-107
-77
-48
-25
-7
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-126
-139
-149
-157
-162
-165
-165
-165
-164
-163
-161
-161
-161
-161
-160
-158
-160
-167
-175
-181
-170
-115
-57
-14
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-7
-39
-98
-155
-197
-211
-213
-214
-214
-214
-213
-210
-207
-204
-201
-199
-195
-192
-188
-182
-175
-160
-146
-135
-128
-126
-126
-129
-131
-133
-135
-140
-146
-152
-160
-167
-178
-185
-191
-197
-201
-206
-208
-210
-211
-211
-211
-211
-212
-212
-212
-212
-212
-213
-213
-213
-213
-213
-213
-213
-213
-213
-213
-212
-212
-212
-212
-211
-211
-211
-211
-210
-209
-209
-209
-208
-208
-208
-208
-208
-208
-208
-209
-209
-209
-210
-210
-210
-210
-210
-210
-209
-209
-208
-207
-206
-204
-202
-200
-198
-195
-190
-187
-184
-181
-179
-176
-172
-163
-149
-128
-89
-59
-34
-16
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-127
-138
-148
-156
-161
-164
-165
-165
-165
-164
-163
-163
-162
-161
-159
-159
-163
-172
-179
-178
-149
-72
-25
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-3
-14
-61
-122
-177
-208
-213
-213
-214
-214
-214
-211
-209
-206
-203
-200
-196
-194
-190
-185
-180
-168
-156
-144
-134
-128
-128
-129
-130
-132
-133
-135
-138
-143
-148
-154
-164
-171
-179
-185
-192
-199
-203
-206
-208
-210
-210
-211
-211
-211
-211
-211
-211
-211
-212
-212
-212
-212
-212
-213
-213
-213
-213
-212
-212
-212
-212
-212
-212
-212
-212
-212
-212
-212
-211
-211
-211
-211
-211
-211
-211
-211
-211
-210
-210
-210
-210
-210
-209
-209
-208
-207
-206
-206
-204
-203
-201
-198
-194
-191
-187
-182
-180
-178
-177
-175
-169
-157
-136
-109
-76
-39
-18
-7
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-127
-138
-147
-155
-160
-163
-164
-165
-165
-164
-164
-163
-161
-159
-159
-161
-170
-174
-172
-160
-76
-28
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-7
-24
-70
-130
-191
-211
-213
-213
-214
-214
-212
-210
-208
-205
-202
-199
-196
-193
-189
-185
-178
-169
-158
-148
-138
-132
-131
-131
-132
-133
-135
-135
-137
-139
-142
-148
-154
-160
-167
-173
-182
-188
-193
-198
-202
-206
-208
-209
-209
-210
-210
-210
-210
-210
-210
-210
-211
-211
-211
-211
-211
-212
-212
-212
-212
-212
-212
-212
-212
-212
-212
-211
-211
-211
-211
-211
-211
-211
-210
-210
-210
-209
-209
-209
-208
-207
-207
-207
-206
-206
-204
-203
-200
-197
-194
-189
-185
-182
-179
-177
-176
-174
-171
-166
-156
-128
-100
-70
-42
-23
-5
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-128
-138
-147
-153
-158
-163
-164
-164
-165
-164
-164
-162
-161
-160
-161
-167
-173
-171
-154
-111
-39
-15
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-13
-43
-89
-153
-204
-211
-213
-213
-213
-213
-211
-209
-207
-204
-201
-198
-195
-192
-188
-183
-176
-168
-159
-150
-140
-137
-135
-134
-134
-135
-136
-137
-138
-140
-143
-146
-150
-154
-160
-167
-173
-179
-184
-190
-196
-200
-203
-205
-207
-208
-209
-209
-209
-209
-209
-209
-209
-209
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-210
-209
-209
-209
-209
-209
-208
-208
-208
-207
-207
-206
-205
-204
-202
-200
-197
-194
-190
-187
-183
-179
-177
-175
-174
-172
-169
-162
-150
-133
-111
-77
-51
-31
-18
-8
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-128
-139
-147
-152
-157
-161
-163
-164
-164
-164
-162
-161
-160
-161
-162
-170
-171
-156
-123
-73
-23
-10
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-6
-23
-56
-111
-185
-204
-212
-213
-213
-213
-212
-210
-208
-206
-203
-200
-197
-194
-191
-186
-182
-177
-170
-162
-152
-146
-143
-140
-138
-137
-138
-138
-139
-139
-141
-143
-145
-148
-151
-156
-161
-165
-170
-176
-183
-188
-192
-196
-199
-202
-204
-206
-207
-207
-208
-208
-208
-208
-208
-208
-208
-209
-209
-209
-209
-209
-209
-209
-209
-209
-209
-209
-208
-208
-208
-208
-207
-207
-207
-206
-206
-205
-204
-203
-200
-198
-196
-193
-190
-186
-183
-180
-177
-175
-173
-171
-169
-166
-161
-147
-131
-111
-89
-65
-36
-20
-11
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-129
-140
-147
-152
-155
-160
-162
-163
-164
-163
-161
-160
-161
-162
-164
-171
-162
-132
-91
-49
-19
-9
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-10
-31
-69
-153
-190
-207
-212
-213
-213
-213
-211
-210
-208
-205
-202
-199
-197
-194
-190
-187
-183
-178
-173
-164
-158
-153
-149
-145
-142
-141
-141
-140
-141
-141
-142
-143
-145
-146
-149
-152
-155
-159
-163
-169
-174
-178
-183
-187
-193
-196
-199
-201
-203
-204
-205
-206
-206
-207
-207
-207
-207
-207
-207
-207
-207
-207
-207
-207
-207
-207
-207
-206
-206
-206
-205
-205
-204
-203
-202
-200
-199
-197
-195
-191
-188
-185
-182
-179
-176
-173
-172
-170
-169
-166
-163
-157
-148
-136
-111
-88
-66
-45
-28
-9
-5
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-130
-141
-147
-151
-154
-159
-162
-163
-162
-160
-160
-161
-161
-163
-167
-169
-144
-107
-70
-44
-23
-11
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-12
-32
-108
-166
-198
-211
-213
-213
-213
-212
-211
-209
-207
-204
-201
-199
-196
-192
-190
-187
-185
-182
-175
-170
-166
-162
-158
-153
-150
-147
-145
-143
-142
-142
-143
-144
-145
-146
-149
-150
-152
-154
-158
-161
-165
-169
-172
-178
-182
-186
-190
-193
-197
-199
-201
-203
-204
-204
-205
-205
-205
-205
-205
-205
-205
-204
-204
-204
-204
-203
-203
-202
-201
-200
-199
-197
-196
-193
-190
-188
-185
-182
-178
-175
-173
-171
-169
-168
-167
-166
-165
-163
-157
-147
-132
-114
-91
-61
-41
-26
-15
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-131
-142
-148
-151
-153
-159
-160
-159
-159
-160
-161
-159
-159
-162
-170
-155
-117
-90
-70
-52
-25
-12
-5
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-10
-48
-109
-163
-200
-211
-212
-213
-213
-212
-211
-209
-207
-204
-202
-199
-196
-193
-191
-190
-188
-185
-182
-179
-177
-175
-172
-169
-166
-163
-159
-154
-151
-148
-146
-146
-146
-148
-149
-150
-152
-154
-155
-157
-158
-160
-162
-165
-167
-169
-172
-175
-178
-181
-184
-186
-189
-191
-192
-194
-194
-195
-195
-195
-195
-194
-194
-192
-191
-190
-188
-186
-184
-182
-180
-178
-175
-173
-171
-169
-167
-166
-165
-164
-164
-163
-161
-158
-153
-144
-131
-107
-87
-68
-49
-31
-13
-9
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-131
-143
-149
-151
-153
-158
-158
-159
-160
-161
-159
-157
-161
-167
-168
-131
-108
-95
-83
-65
-32
-16
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-24
-68
-121
-170
-203
-211
-212
-212
-212
-212
-210
-209
-206
-204
-202
-198
-196
-194
-192
-191
-190
-188
-186
-184
-183
-181
-180
-178
-176
-174
-171
-168
-164
-161
-157
-152
-151
-150
-150
-151
-153
-154
-155
-156
-158
-160
-161
-162
-164
-165
-167
-168
-169
-170
-172
-173
-174
-175
-177
-177
-178
-179
-179
-180
-180
-179
-179
-178
-177
-176
-174
-173
-171
-170
-168
-166
-165
-164
-163
-163
-162
-161
-159
-156
-152
-141
-129
-115
-100
-83
-60
-45
-32
-20
-10
-5
-3
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-133
-144
-149
-151
-153
-157
-158
-159
-160
-160
-156
-156
-164
-168
-158
-120
-113
-110
-105
-92
-52
-27
-11
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-9
-35
-79
-130
-180
-207
-210
-212
-212
-212
-211
-210
-208
-206
-204
-201
-199
-196
-194
-193
-192
-191
-191
-190
-188
-188
-187
-186
-186
-185
-183
-181
-178
-176
-172
-167
-163
-160
-157
-155
-155
-155
-155
-156
-157
-158
-159
-160
-161
-162
-163
-163
-164
-164
-165
-165
-166
-166
-166
-167
-167
-167
-168
-168
-167
-167
-167
-166
-166
-165
-164
-163
-163
-162
-161
-160
-159
-159
-158
-157
-153
-148
-142
-134
-123
-105
-90
-73
-57
-43
-27
-19
-12
-6
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-134
-145
-149
-151
-153
-157
-159
-161
-161
-157
-154
-160
-168
-166
-144
-121
-127
-130
-130
-123
-84
-49
-23
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-12
-41
-85
-143
-194
-206
-211
-212
-212
-212
-211
-210
-208
-207
-204
-202
-199
-197
-195
-194
-193
-193
-193
-192
-192
-192
-192
-191
-191
-191
-190
-189
-188
-186
-183
-179
-175
-171
-166
-162
-161
-159
-159
-158
-159
-159
-160
-161
-161
-162
-162
-163
-163
-163
-163
-163
-162
-162
-162
-162
-161
-161
-161
-160
-160
-159
-159
-159
-158
-158
-158
-157
-157
-157
-156
-155
-154
-151
-148
-138
-128
-116
-102
-86
-65
-49
-35
-24
-15
-7
-5
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-136
-146
-150
-151
-153
-157
-163
-163
-159
-153
-154
-169
-172
-160
-131
-135
-145
-150
-150
-148
-127
-82
-43
-15
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-13
-42
-92
-166
-195
-208
-211
-212
-212
-212
-211
-210
-209
-207
-204
-202
-200
-197
-195
-195
-194
-194
-194
-195
-195
-195
-195
-195
-195
-195
-194
-194
-193
-193
-192
-191
-189
-186
-181
-177
-172
-168
-165
-162
-161
-161
-161
-162
-162
-163
-163
-163
-163
-163
-163
-163
-162
-162
-162
-161
-161
-160
-160
-159
-159
-158
-158
-158
-157
-156
-156
-155
-154
-153
-151
-147
-141
-133
-114
-99
-83
-66
-49
-29
-18
-11
-6
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-137
-146
-150
-151
-154
-162
-164
-161
-156
-155
-168
-177
-163
-144
-135
-153
-155
-155
-153
-151
-146
-127
-86
-41
-10
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-10
-30
-96
-151
-187
-207
-211
-211
-212
-212
-211
-210
-209
-208
-206
-204
-202
-199
-197
-196
-195
-195
-195
-196
-196
-196
-196
-196
-196
-197
-197
-197
-197
-197
-197
-197
-196
-195
-193
-192
-190
-187
-184
-181
-179
-176
-174
-172
-171
-171
-170
-170
-170
-169
-169
-169
-168
-167
-167
-166
-166
-165
-164
-163
-163
-162
-161
-160
-159
-157
-156
-154
-150
-144
-134
-120
-102
-77
-60
-44
-30
-18
-8
-4
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-138
-146
-150
-153
-158
-167
-164
-160
-158
-162
-179
-179
-159
-140
-144
-157
-157
-156
-153
-150
-147
-139
-110
-69
-22
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-4
-12
-49
-97
-145
-185
-206
-211
-211
-212
-212
-212
-210
-209
-208
-207
-205
-203
-201
-199
-198
-197
-196
-196
-196
-196
-196
-196
-197
-197
-197
-198
-198
-198
-198
-198
-198
-198
-197
-197
-196
-196
-194
-193
-191
-190
-189
-187
-185
-184
-183
-183
-182
-181
-181
-180
-180
-179
-178
-178
-177
-177
-175
-174
-172
-170
-169
-165
-162
-159
-156
-152
-144
-132
-115
-96
-76
-52
-37
-24
-14
-7
-3
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-139
-147
-150
-154
-162
-169
-163
-161
-164
-174
-184
-174
-154
-140
-151
-160
-160
-157
-153
-149
-146
-143
-125
-91
-38
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-20
-53
-97
-143
-183
-207
-210
-211
-212
-212
-211
-211
-210
-209
-208
-206
-205
-203
-201
-200
-199
-199
-198
-198
-197
-197
-197
-198
-198
-198
-199
-199
-199
-199
-199
-199
-199
-199
-199
-200
-199
-199
-198
-198
-198
-197
-196
-195
-194
-193
-192
-191
-191
-190
-189
-188
-187
-186
-185
-184
-181
-179
-177
-174
-171
-167
-162
-157
-150
-141
-123
-105
-86
-67
-50
-31
-20
-11
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-141
-147
-151
-156
-166
-170
-163
-164
-171
-185
-186
-166
-149
-142
-156
-163
-162
-157
-152
-147
-145
-143
-134
-107
-54
-9
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-21
-51
-92
-141
-189
-202
-209
-211
-211
-212
-211
-211
-210
-210
-209
-207
-206
-205
-204
-203
-202
-201
-200
-200
-199
-199
-199
-199
-200
-200
-200
-201
-201
-201
-200
-200
-201
-201
-201
-201
-201
-202
-202
-202
-202
-202
-202
-201
-201
-200
-199
-198
-197
-196
-194
-193
-191
-189
-186
-182
-179
-176
-172
-167
-159
-151
-142
-131
-116
-91
-72
-54
-39
-26
-15
-9
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-143
-148
-152
-158
-170
-169
-164
-168
-177
-188
-186
-157
-145
-147
-159
-164
-163
-157
-151
-145
-143
-142
-137
-117
-70
-13
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-5
-19
-44
-82
-147
-184
-203
-210
-210
-211
-212
-211
-211
-211
-210
-210
-209
-208
-207
-206
-205
-204
-203
-202
-202
-202
-202
-202
-202
-203
-203
-203
-203
-202
-202
-202
-202
-202
-201
-201
-202
-202
-203
-203
-204
-204
-204
-204
-204
-204
-203
-201
-200
-198
-195
-193
-190
-187
-184
-179
-175
-169
-162
-154
-137
-123
-107
-90
-73
-52
-37
-25
-15
-8
-5
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-144
-148
-155
-163
-173
-166
-165
-173
-184
-189
-181
-150
-141
-147
-160
-161
-155
-149
-144
-143
-143
-142
-138
-122
-83
-19
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-10
-26
-68
-110
-150
-183
-204
-210
-211
-212
-212
-212
-212
-212
-211
-211
-211
-211
-211
-210
-210
-210
-209
-209
-208
-208
-208
-207
-207
-207
-206
-206
-205
-204
-203
-203
-202
-202
-202
-202
-203
-203
-203
-204
-204
-205
-205
-203
-201
-198
-195
-191
-185
-180
-172
-164
-154
-140
-128
-115
-102
-88
-71
-58
-44
-32
-23
-14
-10
-6
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-144
-149
-157
-166
-173
-164
-165
-176
-187
-190
-173
-147
-141
-146
-155
-151
-147
-144
-143
-142
-141
-140
-137
-123
-88
-21
-7
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-9
-32
-60
-93
-127
-159
-189
-200
-206
-209
-211
-211
-212
-212
-212
-212
-212
-211
-211
-211
-211
-211
-211
-210
-210
-210
-209
-209
-208
-208
-207
-206
-205
-205
-204
-203
-202
-202
-202
-202
-203
-203
-202
-202
-201
-198
-191
-185
-178
-170
-161
-148
-138
-127
-116
-105
-89
-78
-67
-56
-45
-35
-26
-19
-13
-8
-5
-3
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-146
-150
-159
-167
-170
-162
-167
-179
-189
-189
-164
-144
-139
-143
-146
-144
-142
-142
-141
-141
-139
-139
-136
-123
-90
-23
-8
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-11
-27
-48
-74
-104
-140
-161
-177
-189
-198
-204
-206
-208
-209
-209
-210
-210
-210
-210
-210
-210
-210
-210
-210
-209
-209
-209
-208
-208
-207
-206
-205
-204
-203
-202
-201
-201
-201
-201
-200
-199
-196
-192
-186
-178
-164
-154
-143
-131
-119
-103
-91
-80
-70
-60
-48
-39
-31
-24
-19
-13
-8
-6
-4
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-147
-151
-159
-166
-166
-160
-170
-181
-190
-188
-156
-141
-138
-139
-139
-140
-141
-141
-140
-139
-138
-137
-135
-122
-90
-23
-8
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-7
-18
-33
-52
-83
-106
-128
-147
-163
-176
-183
-188
-192
-195
-197
-199
-200
-201
-201
-202
-202
-202
-203
-203
-203
-203
-203
-203
-203
-202
-201
-201
-200
-199
-197
-196
-195
-193
-190
-184
-177
-168
-157
-144
-126
-112
-99
-86
-74
-59
-49
-40
-32
-25
-19
-14
-9
-6
-5
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-147
-152
-160
-165
-162
-159
-174
-184
-189
-184
-148
-139
-136
-136
-137
-141
-141
-140
-139
-137
-137
-136
-133
-120
-87
-22
-7
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-3
-8
-17
-34
-50
-66
-81
-96
-115
-128
-139
-149
-157
-165
-169
-172
-175
-178
-180
-182
-184
-186
-188
-189
-190
-191
-192
-192
-192
-192
-191
-190
-189
-187
-184
-179
-174
-166
-153
-140
-126
-112
-98
-80
-67
-55
-43
-33
-24
-18
-12
-8
-5
-4
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-147
-152
-157
-159
-155
-159
-180
-187
-183
-172
-142
-137
-136
-138
-141
-141
-141
-140
-138
-137
-136
-136
-132
-115
-77
-17
-6
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-6
-11
-18
-24
-31
-37
-41
-45
-50
-54
-60
-64
-67
-71
-74
-78
-81
-85
-89
-93
-100
-104
-108
-112
-115
-119
-121
-122
-122
-121
-117
-112
-106
-99
-91
-79
-70
-60
-50
-41
-30
-23
-17
-11
-6
-4
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-145
-151
-154
-154
-152
-168
-183
-184
-176
-163
-141
-139
-139
-141
-142
-142
-141
-140
-140
-138
-137
-136
-130
-110
-67
-13
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-4
-6
-9
-11
-14
-15
-17
-18
-20
-22
-23
-25
-26
-28
-30
-31
-33
-35
-38
-41
-44
-47
-50
-53
-56
-58
-60
-61
-61
-59
-56
-53
-49
-45
-38
-33
-27
-22
-17
-11
-8
-6
-4
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-142
-148
-150
-150
-153
-177
-183
-178
-167
-154
-141
-141
-142
-143
-142
-142
-142
-142
-142
-141
-139
-137
-128
-103
-55
-9
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-3
-3
-4
-4
-4
-4
-5
-5
-6
-6
-7
-8
-8
-9
-10
-11
-12
-14
-15
-17
-18
-20
-21
-22
-23
-23
-23
-22
-20
-19
-17
-14
-11
-9
-7
-5
-3
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-138
-144
-147
-150
-158
-182
-179
-169
-157
-148
-143
-144
-143
-143
-143
-143
-145
-145
-145
-143
-141
-137
-123
-93
-43
-6
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-2
-2
-2
-2
-3
-3
-3
-3
-4
-4
-4
-5
-5
-5
-5
-4
-4
-3
-2
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-138
-142
-145
-153
-171
-181
-171
-159
-150
-145
-145
-144
-143
-143
-143
-146
-148
-149
-148
-146
-143
-138
-117
-81
-31
-4
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-139
-143
-151
-162
-175
-168
-157
-150
-146
-145
-145
-143
-144
-146
-150
-156
-157
-155
-153
-149
-145
-136
-104
-62
-18
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-142
-148
-158
-167
-170
-157
-150
-147
-146
-145
-143
-144
-148
-153
-157
-159
-158
-156
-153
-150
-146
-130
-92
-47
-12
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-145
-153
-161
-165
-159
-149
-147
-146
-145
-144
-143
-149
-154
-158
-160
-160
-159
-157
-154
-152
-146
-120
-78
-35
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-148
-157
-160
-158
-148
-145
-145
-145
-145
-144
-146
-155
-158
-159
-159
-159
-158
-157
-155
-153
-143
-108
-64
-24
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-148
-157
-154
-147
-143
-144
-145
-145
-145
-144
-155
-158
-157
-156
-155
-157
-157
-157
-156
-153
-139
-93
-49
-15
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-148
-148
-143
-138
-143
-144
-145
-144
-145
-148
-159
-153
-151
-150
-151
-153
-155
-156
-155
-151
-118
-68
-30
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-143
-139
-137
-138
-143
-144
-145
-145
-147
-153
-155
-151
-149
-149
-150
-151
-152
-152
-149
-141
-92
-47
-18
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-138
-134
-135
-138
-143
-145
-145
-145
-148
-154
-152
-150
-149
-149
-149
-149
-149
-147
-138
-121
-65
-29
-10
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-134
-131
-134
-138
-143
-145
-145
-145
-148
-153
-151
-150
-149
-149
-148
-147
-145
-138
-123
-94
-40
-16
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-130
-130
-134
-139
-143
-145
-144
-145
-148
-151
-150
-150
-149
-149
-148
-146
-140
-126
-101
-64
-19
-7
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-128
-130
-134
-139
-144
-145
-144
-146
-149
-150
-151
-150
-150
-149
-148
-144
-129
-101
-67
-31
-6
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-128
-130
-134
-139
-144
-145
-144
-146
-149
-150
-151
-151
-150
-148
-147
-141
-115
-81
-46
-17
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-128
-130
-134
-139
-144
-145
-144
-146
-148
-150
-151
-150
-149
-148
-146
-135
-99
-61
-29
-8
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-128
-130
-134
-139
-145
-145
-144
-146
-148
-150
-151
-150
-148
-147
-145
-126
-82
-44
-16
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-128
-130
-134
-140
-145
-145
-145
-146
-148
-150
-150
-149
-148
-146
-143
-112
-64
-28
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-128
-130
-134
-139
-145
-145
-145
-146
-147
-149
-149
-148
-146
-143
-137
-87
-39
-13
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-128
-129
-133
-139
-145
-145
-145
-146
-147
-149
-148
-146
-144
-140
-129
-62
-25
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-128
-129
-133
-139
-145
-146
-146
-147
-148
-148
-147
-145
-143
-134
-112
-39
-14
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-128
-128
-132
-138
-145
-146
-147
-147
-148
-147
-145
-144
-140
-124
-88
-21
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-127
-128
-131
-137
-145
-146
-147
-147
-147
-145
-143
-142
-135
-111
-58
-7
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-127
-127
-130
-136
-143
-146
-146
-145
-144
-142
-142
-139
-118
-78
-22
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-127
-127
-130
-134
-139
-144
-143
-142
-142
-142
-141
-130
-93
-46
-9
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-127
-127
-130
-133
-137
-140
-140
-141
-141
-141
-137
-108
-64
-22
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-128
-128
-129
-132
-135
-138
-139
-140
-140
-139
-123
-76
-35
-7
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-128
-128
-129
-132
-135
-136
-139
-140
-139
-136
-94
-39
-11
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-129
-130
-131
-132
-134
-138
-139
-138
-129
-107
-29
-9
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-130
-131
-132
-133
-136
-139
-138
-127
-101
-52
-10
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-132
-133
-134
-136
-138
-137
-126
-97
-59
-18
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-135
-135
-136
-137
-137
-125
-97
-57
-20
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-137
-137
-137
-137
-134
-94
-44
-16
-3
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-136
-134
-125
-104
-66
-18
-6
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-105
-88
-67
-45
-22
-6
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-55
-41
-26
-13
-4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-13
-7
-4
-2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
diff --git a/hl/tools/h52jpeg/testfiles/h52jpegtst.h5 b/hl/tools/h52jpeg/testfiles/h52jpegtst.h5
deleted file mode 100644
index 048e568..0000000
--- a/hl/tools/h52jpeg/testfiles/h52jpegtst.h5
+++ /dev/null
Binary files differ