Index: /issm/trunk/configure.ac
===================================================================
--- /issm/trunk/configure.ac	(revision 27034)
+++ /issm/trunk/configure.ac	(revision 27035)
@@ -2,5 +2,5 @@
 
 #AUTOCONF
-AC_INIT([Ice Sheet System Model (ISSM)],[4.19],[issm@jpl.nasa.gov],[issm],[http://issm.jpl.nasa.gov]) #Initializing configure
+AC_INIT([Ice-sheet and Sea-level System Model (ISSM)],[4.20],[issm@jpl.nasa.gov],[issm],[http://issm.jpl.nasa.gov]) #Initializing configure
 AC_CONFIG_AUX_DIR([./aux-config])	# Put config files in aux-config
 AC_CONFIG_MACRO_DIR([m4])			# m4 macros are located in m4
@@ -9,5 +9,5 @@
 #print header
 AC_MSG_NOTICE(============================================================================)
-AC_MSG_NOTICE(=              AC_PACKAGE_NAME AC_PACKAGE_VERSION configuration            =)
+AC_MSG_NOTICE(=      AC_PACKAGE_NAME AC_PACKAGE_VERSION configuration      =)
 AC_MSG_NOTICE(============================================================================)
 
Index: /issm/trunk/etc/environment.csh
===================================================================
--- /issm/trunk/etc/environment.csh	(revision 27034)
+++ /issm/trunk/etc/environment.csh	(revision 27035)
@@ -148,6 +148,8 @@
 set GSL_ROOT="{$ISSM_EXT_DIR}/gsl/install"
 if ( -d {$GSL_ROOT} ) then
-	setenv GSL_HOME "{$GSL_ROOT}" # Used in installation of Dakota
+	setenv GSL_HOME {$GSL_ROOT} # Used in installation of Dakota
+	setenv GSL_ROOT {$GSL_ROOT}
 	setenv LD_LIBRARY_PATH {$LD_LIBRARY_PATH}:{$GSL_ROOT}/lib
+	setenv DYLD_LIBRARY_PATH {$GSL_ROOT}/lib:{$DYLD_LIBRARY_PATH}
 endif
 
Index: /issm/trunk/etc/environment.sh
===================================================================
--- /issm/trunk/etc/environment.sh	(revision 27034)
+++ /issm/trunk/etc/environment.sh	(revision 27035)
@@ -295,5 +295,5 @@
 
 	if [[ ${MINGW} -eq 1 ]]; then
-		path_append "${BLAS_ROOT}/lib" # Allows dynamic loaded to find DLLs
+		path_append "${BLAS_ROOT}/lib" # Allows dynamic loader to find DLLs
 	fi
 fi
@@ -306,5 +306,5 @@
 
 	if [[ ${MINGW} -eq 1 ]]; then
-		path_append "${LAPACK_ROOT}/lib" # Allows dynamic loaded to find DLLs
+		path_append "${LAPACK_ROOT}/lib" # Allows dynamic loader to find DLLs
 	fi
 fi
@@ -317,5 +317,5 @@
 
 	if [[ ${MINGW} -eq 1 ]]; then
-		path_append "${METIS_ROOT}/lib" # Allows dynamic loaded to find DLLs
+		path_append "${METIS_ROOT}/lib" # Allows dynamic loader to find DLLs
 	fi
 fi
@@ -327,5 +327,5 @@
 
 	if [[ ${MINGW} -eq 1 ]]; then
-		path_append "${MUMPS_ROOT}/lib" # Allows dynamic loaded to find DLLs
+		path_append "${MUMPS_ROOT}/lib" # Allows dynamic loader to find DLLs
 	fi
 fi
@@ -338,5 +338,5 @@
 
 	if [[ ${MINGW} -eq 1 ]]; then
-		path_append "${PARMETIS_ROOT}/lib" # Allows dynamic loaded to find DLLs
+		path_append "${PARMETIS_ROOT}/lib" # Allows dynamic loader to find DLLs
 	fi
 fi
@@ -348,5 +348,5 @@
 
 	if [[ ${MINGW} -eq 1 ]]; then
-		path_append "${SCALAPACK_ROOT}/lib" # Allows dynamic loaded to find DLLs
+		path_append "${SCALAPACK_ROOT}/lib" # Allows dynamic loader to find DLLs
 	fi
 fi
@@ -365,5 +365,5 @@
 
 	if [[ ${MINGW} -eq 1 ]]; then
-		path_append "${PETSC_ROOT}/lib" # Allows dynamic loaded to find DLLs
+		path_append "${PETSC_ROOT}/lib" # Allows dynamic loader to find DLLs
 	fi
 
@@ -413,4 +413,12 @@
 fi
 
+MPLAPACK_ROOT="${ISSM_EXT_DIR}/mplapack/install"
+if [ -d "${MPLAPACK_ROOT}" ]; then
+	cplus_include_path_prepend "${MPLAPACK_ROOT}/include"
+	cplus_include_path_prepend "${MPLAPACK_ROOT}/include/mplapack"
+	library_path_prepend "${MPLAPACK_ROOT}/lib"
+	ld_library_path_prepend "${MPLAPACK_ROOT}/lib"
+fi
+
 SCOTCH_ROOT="${ISSM_EXT_DIR}/scotch/install"
 ld_library_path_append "${SCOTCH_ROOT}/lib"
@@ -499,10 +507,11 @@
 SQLITE_ROOT="${ISSM_EXT_DIR}/sqlite/install"
 if [ -d "${SQLITE_ROOT}" ]; then
-	path_append "${SQLITE_ROOT}/bin"
-	library_path_append "${SQLITE_ROOT}/lib"
-	ld_library_path_append "${SQLITE_ROOT}/lib"
-fi
-
-LIBTIFF_ROOT="${ISSM_EXT_SHARED_DIR}/libtiff/install"
+	path_prepend "${SQLITE_ROOT}/bin"
+	cpath_prepend "${SQLITE_ROOT}/include"
+	library_path_prepend "${SQLITE_ROOT}/lib"
+	ld_library_path_prepend "${SQLITE_ROOT}/lib"
+fi
+
+LIBTIFF_ROOT="${ISSM_EXT_DIR}/libtiff/install"
 if [ -d "${LIBTIFF_ROOT}" ]; then
 	dyld_library_path_append "${LIBTIFF_ROOT}/install/libtiff"
@@ -550,5 +559,5 @@
 
 	if [[ ${MINGW} -eq 1 ]]; then
-		path_append "${TRIANGLE_ROOT}/lib" # Allows dynamic loaded to find DLLs
+		path_append "${TRIANGLE_ROOT}/lib" # Allows dynamic loader to find DLLs
 	fi
 fi
Index: /issm/trunk/examples/Inversion/Square.par
===================================================================
--- /issm/trunk/examples/Inversion/Square.par	(revision 27034)
+++ /issm/trunk/examples/Inversion/Square.par	(revision 27035)
@@ -11,5 +11,5 @@
 
 disp('      creating drag');
-md.friction.coefficient=200*ones(md.mesh.numberofvertices,1);
+md.friction.coefficient=50*ones(md.mesh.numberofvertices,1);
 md.friction.coefficient(find(md.mask.ocean_levelset<0.))=0.;
 md.friction.p = ones(md.mesh.numberofelements,1);
Index: /issm/trunk/examples/Inversion/runme.m
===================================================================
--- /issm/trunk/examples/Inversion/runme.m	(revision 27034)
+++ /issm/trunk/examples/Inversion/runme.m	(revision 27035)
@@ -1,3 +1,3 @@
-steps=[1];
+steps=[4];
 
 if any(steps==1) 
Index: /issm/trunk/examples/SlrGRACE/runme.m
===================================================================
--- /issm/trunk/examples/SlrGRACE/runme.m	(revision 27034)
+++ /issm/trunk/examples/SlrGRACE/runme.m	(revision 27035)
@@ -1,11 +1,11 @@
-clear all;
+%clear all;
 addpath('../Data','../Functions');
 
-steps=[1:7];
+%steps=[1:7];
 
 if any(steps==1) % {{{ 
 	disp('   Step 1: Global mesh creation');
 
-	numrefine=5;
+	numrefine=1;
 	resolution=150*1e3;			% inital resolution [m]
 	radius = 6.371012*10^6;		% mean radius of Earth, m
@@ -50,5 +50,6 @@
 	save ./Models/SlrGRACE_Mesh md;
 
-	plotmodel (md,'data',md.mask.ocean_levelset,'edgecolor','k');
+	plotmodel (md,'data',md.mask.ocean_levelset,'edgecolor','k','view',[45 45]);
+
 end % }}} 
 if any(steps==2) % {{{ 
@@ -70,5 +71,7 @@
 	md.geometry.surface=md.geometry.bed+md.geometry.thickness;
 
-	md.masstransport.spcthickness = [md.geometry.thickness + ice_load; 0];
+	md.masstransport.spcthickness = repmat(md.geometry.thickness,1,2); 
+	md.masstransport.spcthickness(:,end) = md.masstransport.spcthickness(:,end) + ice_load; 
+	md.masstransport.spcthickness(end+1,:) = [0 1]; % dummy time. 
 
 	md.smb.mass_balance=zeros(md.mesh.numberofvertices,1); 
@@ -140,5 +143,5 @@
 	md = loadmodel('./Models/SlrGRACE_Solution');
 
-	sol1 = (md.masstransport.spcthickness(1:end-1)-md.geometry.thickness)*100; % [cm]
+	sol1 = (md.masstransport.spcthickness(1:end-1,2)-md.masstransport.spcthickness(1:end-1,1))*100; % [cm]
 	sol2 = (md.results.TransientSolution.Sealevel-md.results.TransientSolution.Bed)*1000;	% [mm]
 
@@ -208,6 +211,7 @@
 	% masstransport evalulates diff between the successive times, so we should cumsum. 
 	num_time = size(ice_load,2); 
-	md.masstransport.spcthickness = [repmat(md.geometry.thickness,1,size(ice_load,2)) + ice_load];
-	md.masstransport.spcthickness =[ md.masstransport.spcthickness; 0:num_time-1]; 
+	md.masstransport.spcthickness = repmat(md.geometry.thickness,1,num_time+1); 
+	md.masstransport.spcthickness(:,2:end) = md.masstransport.spcthickness(:,2:end) + ice_load;
+	md.masstransport.spcthickness(end+1,:) = 0:num_time; % dummy time. 
 
 	%Physics 
@@ -241,13 +245,13 @@
 	md = loadmodel('./Models/SlrGRACE_Transient');
 
-	time = md.masstransport.spcthickness(end,:);
+	time = md.masstransport.spcthickness(end,2:end);
 
 	for tt=1:length(time)
 		gmsl(tt) = md.results.TransientSolution(tt).CumBslc*1000; % [mm]
-		sol1(:,tt) = (md.masstransport.spcthickness(1:end-1,tt)-md.geometry.thickness)*100; % [cm]
+		sol1(:,tt) = (md.masstransport.spcthickness(1:end-1,tt+1)-md.geometry.thickness)*100; % [cm]
 		sol2(:,tt) = (md.results.TransientSolution(tt).Sealevel-md.results.TransientSolution(tt).Bed)*1000;	% [mm]
 	end
 	sol_name = {'Change in water equivalent height [cm]', 'Relative sea level [mm]'};
-	movie_name = {'Movie_dH.mp4','Movie_slr.mp4'};
+	movie_name = {'Movie_dH','Movie_slr'};
 	
 	res = 1.0;
@@ -273,5 +277,4 @@
 		vidObj = VideoWriter(movie_name{kk});
 		vidObj.FrameRate=2; % frames per second
-		vifObj.FileFormat='mp4';
 		open(vidObj);
 
@@ -311,5 +314,4 @@
 		close(vidObj);
 	end
-	!open *.mp4;
 
 	% plot GMSL time series
Index: /issm/trunk/externalpackages/autotools/install-linux.sh
===================================================================
--- /issm/trunk/externalpackages/autotools/install-linux.sh	(revision 27034)
+++ /issm/trunk/externalpackages/autotools/install-linux.sh	(revision 27035)
@@ -7,5 +7,5 @@
 AUTOCONF_VER="2.69"
 AUTOMAKE_VER="1.16.1"
-LIBTOOL_VER="2.4.2"
+LIBTOOL_VER="2.4.6"
 M4_VER="1.4.19"
 
Index: /issm/trunk/externalpackages/autotools/install-mac.sh
===================================================================
--- /issm/trunk/externalpackages/autotools/install-mac.sh	(revision 27034)
+++ /issm/trunk/externalpackages/autotools/install-mac.sh	(revision 27035)
@@ -7,5 +7,5 @@
 AUTOCONF_VER="2.69"
 AUTOMAKE_VER="1.16.1"
-LIBTOOL_VER="2.4.2"
+LIBTOOL_VER="2.4.6"
 M4_VER="1.4.19"
 
Index: /issm/trunk/externalpackages/autotools/install-win.sh
===================================================================
--- /issm/trunk/externalpackages/autotools/install-win.sh	(revision 27034)
+++ /issm/trunk/externalpackages/autotools/install-win.sh	(revision 27035)
@@ -8,5 +8,5 @@
 AUTOMAKE_MIN_VER="1.16"
 AUTOMAKE_VER="${AUTOMAKE_MIN_VER}.1"
-LIBTOOL_VER="2.4.2"
+LIBTOOL_VER="2.4.6"
 M4_VER="1.4.19"
 
Index: /issm/trunk/externalpackages/curl/install-7-linux-static.sh
===================================================================
--- /issm/trunk/externalpackages/curl/install-7-linux-static.sh	(revision 27034)
+++ /issm/trunk/externalpackages/curl/install-7-linux-static.sh	(revision 27035)
@@ -34,5 +34,8 @@
 	--disable-ldaps \
 	--with-zlib="${ZLIB_ROOT}" \
-	--without-libidn2
+	--without-libidn2 \
+	--without-nghttp2 \
+	--without-brotli \
+	--without-librtmp
 
 # Compile and install
Index: /issm/trunk/externalpackages/curl/install-7-mac-static.sh
===================================================================
--- /issm/trunk/externalpackages/curl/install-7-mac-static.sh	(revision 27034)
+++ /issm/trunk/externalpackages/curl/install-7-mac-static.sh	(revision 27035)
@@ -39,4 +39,7 @@
 	--with-zlib="${ZLIB_ROOT}" \
 	--without-libidn2 \
+	--without-nghttp2 \
+	--without-brotli \
+	--without-librtmp \
 	--with-secure-transport
 
Index: /issm/trunk/externalpackages/dakota/configs/6.2/BuildDakotaCustom.cmake.pfe.patch
===================================================================
--- /issm/trunk/externalpackages/dakota/configs/6.2/BuildDakotaCustom.cmake.pfe.patch	(revision 27034)
+++ /issm/trunk/externalpackages/dakota/configs/6.2/BuildDakotaCustom.cmake.pfe.patch	(revision 27035)
@@ -1,11 +1,11 @@
-67a68,75
+54,55c54,55
+< #set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} <flag>"
+< #     CACHE STRING "CXX Flags for my platform" )
+---
+> set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMPICH_IGNORE_CXX_SEEK"
+>      CACHE STRING "CXX Flags for my platform" )
+67a68,69
 > set( DAKOTA_HAVE_MPI ON
 >  CACHE BOOL "Always build with MPI enabled" FORCE)
-> set( MPI_INCLUDE_PATH
->  "/nasa/hpe/mpt/2.17r13/include"
->  CACHE FILEPATH "Use installed MPI headers" FORCE)
-> set( MPI_LIBRARY
->  "/nasa/hpe/mpt/2.17r13/lib/libmpi.so"
->  CACHE FILEPATH "Use installed MPI library" FORCE)
 73,77c73,77
 < #set(BOOST_ROOT
@@ -16,5 +16,5 @@
 ---
 > set(BOOST_ROOT
->     "/nasa/pkgsrc/sles12/2018Q3/" 
+>     "$ISSM_DIR/externalpackages/boost/install"
 >     CACHE PATH "Use non-standard Boost install" FORCE)
 > set( Boost_NO_SYSTEM_PATHS TRUE
Index: /issm/trunk/externalpackages/dakota/configs/6.2/CMakeLists.txt.pfe.patch
===================================================================
--- /issm/trunk/externalpackages/dakota/configs/6.2/CMakeLists.txt.pfe.patch	(revision 27034)
+++ /issm/trunk/externalpackages/dakota/configs/6.2/CMakeLists.txt.pfe.patch	(revision 27035)
@@ -3,4 +3,4 @@
 ---
 > # TODO: Can't this be integrated into the following logic?
-> set(BLAS_LIBS "-L/nasa/intel/Compiler/2016.2.181/compilers_and_libraries_2016.2.181/linux/mkl/lib/intel64/ -lmkl_intel_lp64 -lmkl_sequential -lmkl_core")
-> set(LAPACK_LIBS "-L/nasa/intel/Compiler/2016.2.181/compilers_and_libraries_2016.2.181/linux/mkl/lib/intel64/ -lmkl_intel_lp64 -lmkl_sequential -lmkl_core")
+> set(BLAS_LIBS "-L/nasa/intel/Compiler/2018.3.222/compilers_and_libraries_2018.3.222/linux/mkl/lib/intel64/ -lmkl_intel_lp64 -lmkl_sequential -lmkl_core")
+> set(LAPACK_LIBS "-L/nasa/intel/Compiler/2018.3.222/compilers_and_libraries_2018.3.222/linux/mkl/lib/intel64/lib/intel64/ -lmkl_intel_lp64 -lmkl_sequential -lmkl_core")
Index: /issm/trunk/externalpackages/dakota/configs/6.2/linux/cmake/BuildDakotaCustom.pleiades.cmake
===================================================================
--- /issm/trunk/externalpackages/dakota/configs/6.2/linux/cmake/BuildDakotaCustom.pleiades.cmake	(revision 27035)
+++ /issm/trunk/externalpackages/dakota/configs/6.2/linux/cmake/BuildDakotaCustom.pleiades.cmake	(revision 27035)
@@ -0,0 +1,93 @@
+##############################################################################
+#
+# Template CMake Configuration File.
+#
+##############################################################################
+# The following CMake variables represent the minimum set of variables
+# that are required to allow Dakota to
+#   * find all prerequisite third party libraries (TPLs)
+#   * configure compiler and MPI options
+#   * set Dakota install path
+#
+# Instructions:
+# 1. Read Dakota/INSTALL - Source Quick Start to use this template file.
+#
+# 2. Uncomment CMake variables below ONLY for values you need to change for
+#    your platform. Edit variables as needed.
+#
+#    For example, if you are using a custom install of Boost, installed in
+#    /home/me/usr/boost, uncomment both CMake Boost variables  and edit
+#    paths:
+#       set(BOOST_ROOT
+#           "/home/me/usr/boost"
+#           CACHE PATH "Use non-standard Boost install" FORCE)
+#       set( Boost_NO_SYSTEM_PATHS TRUE
+#            CACHE BOOL "Supress search paths other than BOOST_ROOT" FORCE)
+#
+#    Save file and exit.
+#
+# 6. Run CMake with script file. At terminal window, type:
+#      $ cmake -C BuildCustom.cmake $DAK_SRC
+#
+#    If you have not followed instructions in INSTALL -Source Quick Start,
+#    you will need to replace BuildCustom.cmake with the actual filename of
+#    this file and $DAK_SRC with the actual path to Dakota source.
+#
+##############################################################################
+
+##############################################################################
+# Set BLAS, LAPACK library paths ONLY if in non-standard locations
+##############################################################################
+set( BLAS_LIBS
+      "$ENV{BLAS_LIBS}"
+      CACHE FILEPATH "Use non-standard BLAS library path" FORCE )
+set( LAPACK_LIBS
+      "$ENV{LAPACK_LIBS}"
+      CACHE FILEPATH "Use non-standard BLAS library path" FORCE )
+
+##############################################################################
+# Set additional compiler options
+# Uncomment and replace <flag> with actual compiler flag, e.g. -xxe4.2
+##############################################################################
+#set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} <flag>" 
+#     CACHE STRING "C Flags my platform" )
+set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMPICH_IGNORE_CXX_SEEK"
+     CACHE STRING "CXX Flags for my platform" )
+#set( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} <flag>"
+#     CACHE STRING "Fortran Flags for my platform" )
+
+##############################################################################
+# Set MPI options
+# Recommended practice is to set DAKOTA_HAVE_MPI and set MPI_CXX_COMPILER
+# to a compiler wrapper.
+##############################################################################
+set( DAKOTA_HAVE_MPI ON
+     CACHE BOOL "Build with MPI enabled" FORCE)
+#set( MPI_CXX_COMPILER "path/to/mpicxx"
+#     CACHE FILEPATH "Use MPI compiler wrapper" FORCE)
+
+##############################################################################
+# Set Boost path if CMake cannot find your installed version of Boost or
+# if you have a custom Boost install location.
+##############################################################################
+set(BOOST_ROOT
+    $ENV{BOOST_ROOT}
+    CACHE PATH "Use non-standard Boost install" FORCE)
+set( Boost_NO_SYSTEM_PATHS TRUE
+     CACHE BOOL "Supress search paths other than BOOST_ROOT" FORCE)
+
+##############################################################################
+# Set Trilinos path if you want have a custom Trilinos install location. If
+# not set, the Trilinos package, teuchos, will be build during the Dakota
+# build.
+##############################################################################
+#set( Trilinos_DIR
+#      "path/to/Trilinos/install"
+#      CACHE PATH "Path to installed Trilinos" FORCE )
+
+##############################################################################
+# Customize DAKOTA
+##############################################################################
+set( CMAKE_INSTALL_PREFIX
+     $ENV{DAK_INSTALL}
+     CACHE PATH "Path to Dakota installation" )
Index: /issm/trunk/externalpackages/dakota/install-6.2-discover.sh
===================================================================
--- /issm/trunk/externalpackages/dakota/install-6.2-discover.sh	(revision 27034)
+++ /issm/trunk/externalpackages/dakota/install-6.2-discover.sh	(revision 27035)
@@ -37,16 +37,17 @@
 
 cmake -D CMAKE_C_COMPILER=mpicc \
-	   -D CMAKE_CXX_COMPILER=mpicxx \
-	   -D CMAKE_Fortran_COMPILER=/usr/bin/gfortran \
-		-DBUILD_SHARED_LIBS=ON \
-		-DBUILD_STATIC_LIBS=OFF \
-		-DBoost_NO_BOOST_CMAKE=TRUE \
-		-DHAVE_ACRO=OFF \
-		-DHAVE_JEGA=OFF \
-		-DHAVE_QUESO=ON \
-		-DDAKOTA_HAVE_GSL=ON \
-		-C $DAK_SRC/cmake/BuildDakotaCustom.cmake \
-		-C $DAK_SRC/cmake/DakotaDev.cmake \
-		$DAK_SRC
+	-D CMAKE_CXX_COMPILER=mpicxx \
+	-D CMAKE_Fortran_COMPILER=/usr/bin/gfortran \
+	-DCMAKE_CXX_FLAGS="-lstdc++ -lirc -lsvml -limf" \
+	-DBUILD_SHARED_LIBS=ON \
+	-DBUILD_STATIC_LIBS=OFF \
+	-DBoost_NO_BOOST_CMAKE=TRUE \
+	-DHAVE_ACRO=OFF \
+	-DHAVE_JEGA=OFF \
+	-DHAVE_QUESO=ON \
+	-DDAKOTA_HAVE_GSL=ON \
+	-C $DAK_SRC/cmake/BuildDakotaCustom.cmake \
+	-C $DAK_SRC/cmake/DakotaDev.cmake \
+	$DAK_SRC
 cd ..
 
Index: /issm/trunk/externalpackages/dakota/install-6.2-pleiades.sh
===================================================================
--- /issm/trunk/externalpackages/dakota/install-6.2-pleiades.sh	(revision 27034)
+++ /issm/trunk/externalpackages/dakota/install-6.2-pleiades.sh	(revision 27035)
@@ -2,43 +2,56 @@
 set -eu
 
-#Some cleanup
-rm -rf Dakota
-rm -rf src 
-rm -rf build 
-rm -rf install 
-mkdir src build install 
 
-#Download from ISSM server
-$ISSM_DIR/scripts/DownloadExternalPackage.sh 'https://issm.ess.uci.edu/files/externalpackages/dakota-6.2-public.src.tar.gz' 'dakota-6.2-public-src.tar.gz'
+## Constants
+#
+VER="6.2"
 
-#Untar 
-tar -zxvf dakota-6.2-public-src.tar.gz
+PREFIX="${ISSM_DIR}/externalpackages/dakota/install" # Set to location where external package should be installed
 
-#Move Dakota to src directory
-mv dakota-6.2.0.src/* src
-rm -rf dakota-6.2.0.src
+## Environment
+#
+export BLAS_LIBS="-L/nasa/intel/Compiler/2018.3.222/compilers_and_libraries_2018.3.222/linux/mkl/lib/intel64/ -lmkl_intel_lp64 -lmkl_sequential -lmkl_core" # Need to export BLAS_LIBS *and* pass it as an option to CMake to ensure that external packages also find it; should upate to /nasa/intel/Compiler/2021.4.0/mkl/2021.4.0/lib/intel64
+export CXXFLAGS='-std=c++11'
+export DAK_BUILD=${ISSM_DIR}/externalpackages/dakota/build # DO NOT CHANGE THIS
+export DAK_INSTALL=${PREFIX} # DO NOT CHANGE THIS
+export DAK_SRC=${ISSM_DIR}/externalpackages/dakota/src # DO NOT CHANGE THIS
+export LAPACK_LIBS="-L/nasa/intel/Compiler/2018.3.222/compilers_and_libraries_2018.3.222/linux/mkl/lib/intel64/lib/intel64/ -lmkl_intel_lp64 -lmkl_sequential -lmkl_core" # Need to export LAPACK_LIBS *and* pass it as an option to CMake to ensure that external packages also find it; should upate to /nasa/intel/Compiler/2021.4.0/mkl/2021.4.0/lib/intel64
 
-#Set up Dakota cmake variables and config
-export DAK_SRC=$ISSM_DIR/externalpackages/dakota/src
-export DAK_BUILD=$ISSM_DIR/externalpackages/dakota/build
-cp $DAK_SRC/cmake/BuildDakotaTemplate.cmake $DAK_SRC/cmake/BuildDakotaCustom.cmake
-patch $DAK_SRC/cmake/BuildDakotaCustom.cmake configs/6.2/BuildDakotaCustom.cmake.pfe.patch
-patch $DAK_SRC/cmake/DakotaDev.cmake configs/6.2/DakotaDev.cmake.patch
-patch $DAK_SRC/CMakeLists.txt configs/6.2/CMakeLists.txt.pfe.patch
+# Cleanup
+rm -rf ${DAK_BUILD} ${DAK_INSTALL} ${DAK_SRC}
+mkdir -p ${DAK_BUILD} ${DAK_INSTALL} ${DAK_SRC}
 
-#Apply patches
-patch src/src/NonDSampling.cpp configs/6.2/NonDSampling.cpp.patch
-patch src/src/NonDLocalReliability.cpp configs/6.2/NonDLocalReliability.cpp.patch
-patch src/packages/pecos/src/pecos_global_defs.hpp configs/6.2/pecos_global_defs.hpp.patch
+# Download source
+${ISSM_DIR}/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/dakota-${VER}-public.src.tar.gz" "dakota-${VER}-public-src.tar.gz"
 
-#Configure dakota
-cd $DAK_BUILD
+# Unpack source
+tar -zxvf dakota-${VER}-public-src.tar.gz
 
+# Move source to 'src' directory
+mv dakota-${VER}.0.src/* ${DAK_SRC}
+rm -rf dakota-${VER}.0.src
+
+# Copy customized source and configuration files to 'src' directory
+cp configs/${VER}/packages/DDACE/src/Analyzer/MainEffectsExcelOutput.cpp ${DAK_SRC}/packages/DDACE/src/Analyzer
+cp configs/${VER}/packages/queso/src/misc/src/1DQuadrature.C ${DAK_SRC}/packages/queso/src/misc/src
+cp configs/${VER}/packages/surfpack/src/surfaces/nkm/NKM_KrigingModel.cpp ${DAK_SRC}/packages/surfpack/src/surfaces/nkm
+cp configs/${VER}/packages/VPISparseGrid/src/sandia_rules.cpp ${DAK_SRC}/packages/VPISparseGrid/src
+cp configs/${VER}/src/DakotaInterface.cpp ${DAK_SRC}/src
+cp configs/${VER}/src/NonDLocalReliability.cpp ${DAK_SRC}/src
+cp configs/${VER}/src/NonDSampling.cpp ${DAK_SRC}/src
+
+# Copy customized source and configuration files specific to Linux to 'src' directory
+cp configs/${VER}/linux/cmake/BuildDakotaCustom.pleiades.cmake ${DAK_SRC}/cmake/BuildDakotaCustom.cmake
+cp configs/${VER}/linux/cmake/DakotaDev.cmake ${DAK_SRC}/cmake
+
+# Configure
+cd ${DAK_BUILD}
 cmake \
 	-DBUILD_SHARED_LIBS=ON \
 	-DBUILD_STATIC_LIBS=OFF \
 	-DCMAKE_C_COMPILER=mpicc \
+	-DCMAKE_C_FLAGS="-Wno-error=implicit-function-declaration" \
 	-DCMAKE_CXX_COMPILER=mpicxx \
-	-DCMAKE_Fortran_COMPILER=mpif77 \
+	-DCMAKE_Fortran_COMPILER=/usr/bin/gfortran \
 	-DBoost_NO_BOOST_CMAKE=TRUE \
 	-DHAVE_ACRO=OFF \
@@ -50,10 +63,6 @@
 	${DAK_SRC}
 
-cd ..
-
-#Compile and install dakota
-cd $DAK_BUILD
-if [ $# -eq 0 ];
-then
+# Compile and install
+if [ $# -eq 0 ]; then
 	make
 	make install
@@ -62,3 +71,8 @@
 	make -j $1 install
 fi
-cd ..
+
+cd ${DAK_INSTALL}
+
+# Comment out definition of HAVE_MPI in Teuchos config header file in order to
+# avoid conflict with our definition
+sed -i -e "s/#define HAVE_MPI/\/* #define HAVE_MPI *\//g" include/Teuchos_config.h
Index: /issm/trunk/externalpackages/gmt/configs/6/static/linux/cmake/ConfigUser.static.cmake
===================================================================
--- /issm/trunk/externalpackages/gmt/configs/6/static/linux/cmake/ConfigUser.static.cmake	(revision 27034)
+++ /issm/trunk/externalpackages/gmt/configs/6/static/linux/cmake/ConfigUser.static.cmake	(revision 27035)
@@ -39,5 +39,5 @@
 
 # Installation path (usually defaults to /usr/local) [auto]:
-set (CMAKE_INSTALL_PREFIX "$ENV{ISSM_DIR}/externalpackages/gmt/install")
+set (CMAKE_INSTALL_PREFIX "$ENV{PREFIX}")
 
 # Set install name suffix used for directories and gmt executables
Index: /issm/trunk/externalpackages/gmt/configs/6/static/mac/cmake/ConfigUser.static.cmake
===================================================================
--- /issm/trunk/externalpackages/gmt/configs/6/static/mac/cmake/ConfigUser.static.cmake	(revision 27034)
+++ /issm/trunk/externalpackages/gmt/configs/6/static/mac/cmake/ConfigUser.static.cmake	(revision 27035)
@@ -39,5 +39,5 @@
 
 # Installation path (usually defaults to /usr/local) [auto]:
-set (CMAKE_INSTALL_PREFIX "$ENV{ISSM_DIR}/externalpackages/gmt/install")
+set (CMAKE_INSTALL_PREFIX "$ENV{PREFIX}")
 
 # Set install name suffix used for directories and gmt executables
Index: /issm/trunk/externalpackages/hdf5/install-1-parallel-with_tests.sh
===================================================================
--- /issm/trunk/externalpackages/hdf5/install-1-parallel-with_tests.sh	(revision 27035)
+++ /issm/trunk/externalpackages/hdf5/install-1-parallel-with_tests.sh	(revision 27035)
@@ -0,0 +1,47 @@
+#!/bin/bash
+set -eu
+
+
+# Constants
+#
+VER="1.10.5"
+
+PREFIX="${ISSM_DIR}/externalpackages/hdf5/install" # Set to location where external package should be installed
+
+## Environnment
+#
+export CC=mpicc
+
+# Download source
+$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/hdf5-${VER}.tar.gz" "hdf5-${VER}.tar.gz"
+
+# Untar source
+tar -zxvf hdf5-${VER}.tar.gz
+
+# Cleanup
+rm -rf install src
+mkdir install src
+
+# Move source to 'src' directory
+mv hdf5-${VER}/* src/
+rm -rf hdf5-${VER}
+
+# Configure
+cd src
+./configure \
+	--prefix="${PREFIX}" \
+	--enable-parallel \
+	--with-zlib="${ZLIB_ROOT}" \
+	--enable-hl
+
+# Compile, test, and install
+#
+if [ $# -eq 0 ]; then
+	make
+	make check
+	make install
+else
+	make -j $1
+	make -j $1 check
+	make -j $1 install
+fi
Index: /issm/trunk/externalpackages/hdf5/install-1-parallel.sh
===================================================================
--- /issm/trunk/externalpackages/hdf5/install-1-parallel.sh	(revision 27035)
+++ /issm/trunk/externalpackages/hdf5/install-1-parallel.sh	(revision 27035)
@@ -0,0 +1,45 @@
+#!/bin/bash
+set -eu
+
+
+# Constants
+#
+VER="1.10.5"
+
+PREFIX="${ISSM_DIR}/externalpackages/hdf5/install" # Set to location where external package should be installed
+
+## Environnment
+#
+export CC=mpicc
+
+# Download source
+$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/hdf5-${VER}.tar.gz" "hdf5-${VER}.tar.gz"
+
+# Untar source
+tar -zxvf hdf5-${VER}.tar.gz
+
+# Cleanup
+rm -rf install src
+mkdir install src
+
+# Move source to 'src' directory
+mv hdf5-${VER}/* src/
+rm -rf hdf5-${VER}
+
+# Configure
+cd src
+./configure \
+	--prefix="${PREFIX}" \
+	--enable-parallel \
+	--with-zlib="${ZLIB_ROOT}" \
+	--enable-hl
+
+# Compile and install
+#
+if [ $# -eq 0 ]; then
+	make
+	make install
+else
+	make -j $1
+	make -j $1 install
+fi
Index: /issm/trunk/externalpackages/hdf5/install-1-with_tests.sh
===================================================================
--- /issm/trunk/externalpackages/hdf5/install-1-with_tests.sh	(revision 27035)
+++ /issm/trunk/externalpackages/hdf5/install-1-with_tests.sh	(revision 27035)
@@ -0,0 +1,42 @@
+#!/bin/bash
+set -eu
+
+
+## Constants
+#
+VER="1.10.5"
+
+PREFIX="${ISSM_DIR}/externalpackages/hdf5/install" # Set to location where external package should be installed
+
+# Download source
+$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/hdf5-${VER}.tar.gz" "hdf5-${VER}.tar.gz"
+
+# Untar source
+tar -zxvf hdf5-${VER}.tar.gz
+
+# Cleanup
+rm -rf install src
+mkdir install src
+
+# Move source to 'src' directory
+mv hdf5-${VER}/* src/
+rm -rf hdf5-${VER}
+
+# Configure
+cd src
+./configure \
+	--prefix="${PREFIX}" \
+	--with-zlib="${ZLIB_ROOT}" \
+	--enable-hl
+
+# Compile, test, and install
+#
+if [ $# -eq 0 ]; then
+	make
+	make check
+	make install
+else
+	make -j $1
+	make -j $1 check
+	make -j $1 install
+fi
Index: sm/trunk/externalpackages/hdf5/install-1.10-parallel-with_tests.sh
===================================================================
--- /issm/trunk/externalpackages/hdf5/install-1.10-parallel-with_tests.sh	(revision 27034)
+++ 	(revision )
@@ -1,49 +1,0 @@
-#!/bin/bash
-set -eu
-
-
-# Constants
-#
-VER="1.10.5"
-ZLIB_ROOT="${ISSM_DIR}/externalpackages/zlib/install"
-
-## Environnment
-#
-export CC=mpicc
-
-# Download source
-$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/hdf5-${VER}.tar.gz" "hdf5-${VER}.tar.gz"
-
-# Untar source
-tar -zxvf hdf5-$VER.tar.gz
-
-# Cleanup
-rm -rf install src
-mkdir install src
-
-# Move source to 'src' directory
-mv hdf5-$VER/* src/
-rm -rf hdf5-$VER
-
-# Configure
-cd src
-./configure \
-	--prefix="${ISSM_DIR}/externalpackages/hdf5/install" \
-	--enable-parallel \
-	--with-zlib=${ZLIB_ROOT} \
-	--enable-hl
-
-# Compile, test, and install
-#
-if [ $# -eq 0 ]; then
-	make
-	make check
-	make install
-else
-	make -j $1
-	make -j $1 check
-	make -j $1 install
-fi
-
-# Return to initial directory
-cd ..
Index: sm/trunk/externalpackages/hdf5/install-1.10-parallel.sh
===================================================================
--- /issm/trunk/externalpackages/hdf5/install-1.10-parallel.sh	(revision 27034)
+++ 	(revision )
@@ -1,47 +1,0 @@
-#!/bin/bash
-set -eu
-
-
-# Constants
-#
-VER="1.10.5"
-ZLIB_ROOT="${ISSM_DIR}/externalpackages/zlib/install"
-
-## Environnment
-#
-export CC=mpicc
-
-# Download source
-$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/hdf5-${VER}.tar.gz" "hdf5-${VER}.tar.gz"
-
-# Untar source
-tar -zxvf hdf5-$VER.tar.gz
-
-# Cleanup
-rm -rf install src
-mkdir install src
-
-# Move source to 'src' directory
-mv hdf5-$VER/* src/
-rm -rf hdf5-$VER
-
-# Configure
-cd src
-./configure \
-	--prefix="${ISSM_DIR}/externalpackages/hdf5/install" \
-	--enable-parallel \
-	--with-zlib=${ZLIB_ROOT} \
-	--enable-hl
-
-# Compile and install
-#
-if [ $# -eq 0 ]; then
-	make
-	make install
-else
-	make -j $1
-	make -j $1 install
-fi
-
-# Return to initial directory
-cd ..
Index: sm/trunk/externalpackages/hdf5/install-1.10-with_tests.sh
===================================================================
--- /issm/trunk/externalpackages/hdf5/install-1.10-with_tests.sh	(revision 27034)
+++ 	(revision )
@@ -1,44 +1,0 @@
-#!/bin/bash
-set -eu
-
-
-## Constants
-#
-VER="1.10.5"
-ZLIB_ROOT="${ISSM_DIR}/externalpackages/zlib/install"
-
-# Download source
-$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/hdf5-${VER}.tar.gz" "hdf5-${VER}.tar.gz"
-
-# Untar source
-tar -zxvf hdf5-$VER.tar.gz
-
-# Cleanup
-rm -rf install src
-mkdir install src
-
-# Move source to 'src' directory
-mv hdf5-$VER/* src/
-rm -rf hdf5-$VER
-
-# Configure
-cd src
-./configure \
-	--prefix="${ISSM_DIR}/externalpackages/hdf5/install" \
-	--with-zlib=${ZLIB_ROOT} \
-	--enable-hl
-
-# Compile, test, and install
-#
-if [ $# -eq 0 ]; then
-	make
-	make check
-	make install
-else
-	make -j $1
-	make -j $1 check
-	make -j $1 install
-fi
-
-# Return to initial directory
-cd ..
Index: sm/trunk/externalpackages/hdf5/install-1.10.sh
===================================================================
--- /issm/trunk/externalpackages/hdf5/install-1.10.sh	(revision 27034)
+++ 	(revision )
@@ -1,42 +1,0 @@
-#!/bin/bash
-set -eu
-
-
-## Constants
-#
-VER="1.10.5"
-ZLIB_ROOT="${ISSM_DIR}/externalpackages/zlib/install"
-
-# Download source
-$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/hdf5-${VER}.tar.gz" "hdf5-${VER}.tar.gz"
-
-# Untar source
-tar -zxvf hdf5-$VER.tar.gz
-
-# Cleanup
-rm -rf install src
-mkdir install src
-
-# Move source to 'src' directory
-mv hdf5-$VER/* src/
-rm -rf hdf5-$VER
-
-# Configure
-cd src
-./configure \
-	--prefix="${ISSM_DIR}/externalpackages/hdf5/install" \
-	--with-zlib=${ZLIB_ROOT} \
-	--enable-hl
-
-# Compile and install
-#
-if [ $# -eq 0 ]; then
-	make
-	make install
-else
-	make -j $1
-	make -j $1 install
-fi
-
-# Return to initial directory
-cd ..
Index: /issm/trunk/externalpackages/hdf5/install-1.sh
===================================================================
--- /issm/trunk/externalpackages/hdf5/install-1.sh	(revision 27035)
+++ /issm/trunk/externalpackages/hdf5/install-1.sh	(revision 27035)
@@ -0,0 +1,40 @@
+#!/bin/bash
+set -eu
+
+
+## Constants
+#
+VER="1.10.5"
+
+PREFIX="${ISSM_DIR}/externalpackages/hdf5/install" # Set to location where external package should be installed
+
+# Download source
+$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/hdf5-${VER}.tar.gz" "hdf5-${VER}.tar.gz"
+
+# Untar source
+tar -zxvf hdf5-${VER}.tar.gz
+
+# Cleanup
+rm -rf install src
+mkdir install src
+
+# Move source to 'src' directory
+mv hdf5-${VER}/* src/
+rm -rf hdf5-${VER}
+
+# Configure
+cd src
+./configure \
+	--prefix="${PREFIX}" \
+	--with-zlib="${ZLIB_ROOT}" \
+	--enable-hl
+
+# Compile and install
+#
+if [ $# -eq 0 ]; then
+	make
+	make install
+else
+	make -j $1
+	make -j $1 install
+fi
Index: sm/trunk/externalpackages/hdf5/install.sh
===================================================================
--- /issm/trunk/externalpackages/hdf5/install.sh	(revision 27034)
+++ 	(revision )
@@ -1,36 +1,0 @@
-#!/bin/bash
-set -eu
-
-VER="1.8.9"
-
-# Cleanup
-rm -rf src install hdf5-${VER}
-mkdir src install
-
-# Download source
-$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/hdf5-${VER}.tar.gz" "hdf5-${VER}.tar.gz"
-
-# Untar source
-tar -zxvf  hdf5-${VER}.tar.gz
-
-# Move source to src directory
-rm -rf src/*
-mv hdf5-${VER}/* src/
-rm -rf hdf5-${VER}
-
-# This project uses C code with C++-style comments. As such, we need to specify
-# a C standard that supports them.
-export CFLAGS='-std=c99'
-
-# Configure, compile, and install
-cd src
-./configure \
-	--prefix="$ISSM_DIR/externalpackages/hdf5/install"
-
-if [ $# -eq 0 ]; then
-	make
-	make install
-else
-	make -j $1
-	make -j $1 install
-fi
Index: /issm/trunk/externalpackages/mplapack/install-1-linux.sh
===================================================================
--- /issm/trunk/externalpackages/mplapack/install-1-linux.sh	(revision 27035)
+++ /issm/trunk/externalpackages/mplapack/install-1-linux.sh	(revision 27035)
@@ -0,0 +1,74 @@
+#!/bin/bash
+set -eu
+
+##
+# Source code and installation guidelines available at,
+#
+#	https://github.com/nakatamaho/mplapack
+#
+# Note that original website (for MPACK) at,
+#
+#	http://mplapack.sourceforge.net
+#
+# is not maintained.
+#
+
+## Constants
+#
+VER="1.0.1"
+
+PREFIX="${ISSM_DIR}/externalpackages/mplapack/install" # Set to location where external package should be installed
+
+## Environment
+#
+export CC=gcc
+export CXX=g++
+export FC=gfortran
+export F77=gfortran
+
+# Cleanup
+rm -rf ${PREFIX} src
+mkdir -p ${PREFIX} src
+
+# Download source
+${ISSM_DIR}/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/mplapack-${VER}.tar.gz" "mplapack-${VER}.tar.gz"
+
+# Unpack source
+tar -zxvf mplapack-${VER}.tar.gz
+
+# Move source to 'src' directory
+mv mplapack-${VER}/* src
+rm -rf mplapack-${VER}
+
+# Configure
+cd src
+pushd mplapack/test/compare
+bash gen.Makefile.am.sh
+popd
+autoreconf --force --install
+aclocal
+autoconf
+automake --add-missing
+autoreconf --force --install
+./configure \
+	--prefix="${PREFIX}" \
+	--disable-static \
+	--enable-fast-install=yes \
+	--disable-dependency-tracking \
+	--enable-fortranwrapper=yes \
+	--enable-gmp=yes \
+	--enable-mpfr=yes \
+	--enable-qd=yes \
+	--enable-dd=yes \
+	--enable-double=yes \
+	--enable-_Float128=yes \
+	--enable-_Float64x=yes
+
+# Compile and install
+if [ $# -eq 0 ]; then
+	make
+	make install
+else
+	make -j $1
+	make -j $1 install
+fi
Index: /issm/trunk/externalpackages/petsc/install-3.14-discover.sh
===================================================================
--- /issm/trunk/externalpackages/petsc/install-3.14-discover.sh	(revision 27034)
+++ /issm/trunk/externalpackages/petsc/install-3.14-discover.sh	(revision 27035)
@@ -10,5 +10,5 @@
 
 # Constants
-VER="3.14.0"
+VER="3.14.6"
 
 # Download source
Index: /issm/trunk/externalpackages/petsc/install-3.14-linux.sh
===================================================================
--- /issm/trunk/externalpackages/petsc/install-3.14-linux.sh	(revision 27034)
+++ /issm/trunk/externalpackages/petsc/install-3.14-linux.sh	(revision 27035)
@@ -5,5 +5,5 @@
 ## Constants
 #
-VER="3.14.0"
+VER="3.14.6"
 
 PETSC_DIR="${ISSM_DIR}/externalpackages/petsc/src" # DO NOT CHANGE THIS
@@ -11,5 +11,5 @@
 
 # Download source
-$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-lite-${VER}.tar.gz" "petsc-${VER}.tar.gz"
+$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/petsc-lite-${VER}.tar.gz" "petsc-${VER}.tar.gz"
 
 # Unpack source
Index: /issm/trunk/externalpackages/petsc/install-3.14-mac-nohdf5.sh
===================================================================
--- /issm/trunk/externalpackages/petsc/install-3.14-mac-nohdf5.sh	(revision 27035)
+++ /issm/trunk/externalpackages/petsc/install-3.14-mac-nohdf5.sh	(revision 27035)
@@ -0,0 +1,59 @@
+#!/bin/bash
+set -eu
+
+
+## Constants
+#
+VER="3.14.6"
+
+PETSC_DIR="${ISSM_DIR}/externalpackages/petsc/src" # DO NOT CHANGE THIS
+PREFIX="${ISSM_DIR}/externalpackages/petsc/install" # Set to location where external package should be installed
+
+# Download source
+$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/petsc-lite-${VER}.tar.gz" "petsc-${VER}.tar.gz"
+
+# Unpack source
+tar -zxvf petsc-${VER}.tar.gz
+
+# Cleanup
+rm -rf ${PREFIX} ${PETSC_DIR}
+mkdir ${PETSC_DIR}
+
+# Move source to $PETSC_DIR
+mv petsc-${VER}/* ${PETSC_DIR}
+rm -rf petsc-${VER}
+
+# Configure
+#
+# NOTE:
+# - Added -Wno-error=implicit-function-declaration to CFLAGS for Clang >= 12. 
+#	(may need to remove it for earlier versions not using the C99 standard).
+# - Added -fallow-argument-mismatch to FFLAGS in order to clear,
+#
+#		error: The Fortran compiler gfortran will not compile files that call 
+#		the same routine with arguments of different types.
+#
+#	for gfortran 10 or later (may need to remove it for earlier versions).
+#
+cd ${PETSC_DIR}
+./config/configure.py \
+	--prefix="${PREFIX}" \
+	--PETSC_DIR="${PETSC_DIR}" \
+	--CFLAGS="-Wno-error=implicit-function-declaration" \
+	--FFLAGS="-fallow-argument-mismatch" \
+	--with-debugging=0 \
+	--with-valgrind=0 \
+	--with-x=0 \
+	--with-ssl=0 \
+	--with-pic=1 \
+	--download-fblaslapack=1 \
+	--download-mpich=1 \
+	--download-metis=1 \
+	--download-parmetis=1 \
+	--download-scalapack=1 \
+	--download-mumps=1 \
+	--download-zlib=1
+
+# Compile and install
+make
+make install
Index: /issm/trunk/externalpackages/petsc/install-3.14-mac.sh
===================================================================
--- /issm/trunk/externalpackages/petsc/install-3.14-mac.sh	(revision 27034)
+++ /issm/trunk/externalpackages/petsc/install-3.14-mac.sh	(revision 27035)
@@ -4,8 +4,12 @@
 
 ## Constants
-VER="3.14.0"
+#
+VER="3.14.6"
+
+PETSC_DIR="${ISSM_DIR}/externalpackages/petsc/src" # DO NOT CHANGE THIS
+PREFIX="${ISSM_DIR}/externalpackages/petsc/install" # Set to location where external package should be installed
 
 # Download source
-$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-lite-${VER}.tar.gz" "petsc-${VER}.tar.gz"
+$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/petsc-lite-${VER}.tar.gz" "petsc-${VER}.tar.gz"
 
 # Unpack source
@@ -13,9 +17,9 @@
 
 # Cleanup
-rm -rf install src
-mkdir install src
+rm -rf ${PREFIX} ${PETSC_DIR}
+mkdir ${PETSC_DIR}
 
-# Move source to 'src' directory
-mv petsc-${VER}/* src/
+# Move source to $PETSC_DIR
+mv petsc-${VER}/* ${PETSC_DIR}
 rm -rf petsc-${VER}
 
@@ -23,4 +27,6 @@
 #
 # NOTE:
+# - Added -Wno-error=implicit-function-declaration to CFLAGS for Clang >= 12. 
+#	(may need to remove it for earlier versions not using the C99 standard).
 # - Added -fallow-argument-mismatch to FFLAGS in order to clear,
 #
@@ -29,11 +35,9 @@
 #
 #	for gfortran 10 or later (may need to remove it for earlier versions).
-# - Added -Wno-error=implicit-function-declaration to CFLAGS for Clang >= 12. 
-#	(may need to remove it for earlier versions not using the C99 standard).
 #
-cd src
+cd ${PETSC_DIR}
 ./config/configure.py \
-	--prefix="${ISSM_DIR}/externalpackages/petsc/install" \
-	--PETSC_DIR="${ISSM_DIR}/externalpackages/petsc/src" \
+	--prefix="${PREFIX}" \
+	--PETSC_DIR="${PETSC_DIR}" \
 	--CFLAGS="-Wno-error=implicit-function-declaration" \
 	--FFLAGS="-fallow-argument-mismatch" \
Index: /issm/trunk/externalpackages/petsc/install-3.14-pleiades.sh
===================================================================
--- /issm/trunk/externalpackages/petsc/install-3.14-pleiades.sh	(revision 27035)
+++ /issm/trunk/externalpackages/petsc/install-3.14-pleiades.sh	(revision 27035)
@@ -0,0 +1,50 @@
+#!/bin/bash
+set -eu
+
+
+## Constants
+#
+VER="3.14.6"
+
+PETSC_DIR="${ISSM_DIR}/externalpackages/petsc/src" # DO NOT CHANGE THIS
+PREFIX="${ISSM_DIR}/externalpackages/petsc/install" # Set to location where external package should be installed
+
+# Download source
+$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/petsc-lite-${VER}.tar.gz" "petsc-${VER}.tar.gz"
+
+# Unpack source
+tar -zxvf petsc-${VER}.tar.gz
+
+# Cleanup
+rm -rf ${PREFIX} ${PETSC_DIR}
+mkdir ${PETSC_DIR}
+
+# Move source to $PETSC_DIR
+mv petsc-${VER}/* ${PETSC_DIR}
+rm -rf petsc-${VER}
+
+# Configure
+cd ${PETSC_DIR}
+./config/configure.py \
+	--prefix="${PREFIX}" \
+	--PETSC_DIR="${PETSC_DIR}" \
+	--CFLAGS="-g -O3" \
+	--CXXFLAGS="-g -O3" \
+	--FFLAGS="-g -O3" \
+	--with-debugging=0 \
+	--with-valgrind=0 \
+	--with-x=0 \
+	--with-ssl=0 \
+	--with-pic=1 \
+	--with-batch=1 \
+	--with-blas-lapack-dir="/nasa/intel/Compiler/2018.3.222/compilers_and_libraries_2018.3.222/linux/mkl" \
+	--with-scalapack-include=/nasa/intel/Compiler/2018.3.222/mkl/include \
+	--with-scalapack-lib="/nasa/intel/Compiler/2018.3.222/mkl/lib/intel64/libmkl_scalapack_lp64.so /nasa/intel/Compiler/2018.3.222/mkl/lib/intel64/libmkl_blacs_intelmpi_lp64.so" \
+	--download-metis=1 \
+	--download-parmetis=1 \
+	--download-scalapack=0 \
+	--download-mumps=1
+
+# Compile and install
+make
+make install
Index: /issm/trunk/externalpackages/petsc/install-3.14-tetralith.sh
===================================================================
--- /issm/trunk/externalpackages/petsc/install-3.14-tetralith.sh	(revision 27034)
+++ /issm/trunk/externalpackages/petsc/install-3.14-tetralith.sh	(revision 27035)
@@ -10,5 +10,5 @@
 
 # Constants
-VER="3.14.0"
+VER="3.14.6"
 
 # Download source
Index: /issm/trunk/externalpackages/petsc/install-3.14-win-msys2-mingw-msmpi.sh
===================================================================
--- /issm/trunk/externalpackages/petsc/install-3.14-win-msys2-mingw-msmpi.sh	(revision 27034)
+++ /issm/trunk/externalpackages/petsc/install-3.14-win-msys2-mingw-msmpi.sh	(revision 27035)
@@ -18,5 +18,5 @@
 ## Constants
 #
-VER="3.14.4"
+VER="3.14.6"
 
 MAKEFILE_GENERATOR='-G "MSYS Makefiles"'
Index: /issm/trunk/externalpackages/petsc/install-3.15-discovery.sh
===================================================================
--- /issm/trunk/externalpackages/petsc/install-3.15-discovery.sh	(revision 27034)
+++ /issm/trunk/externalpackages/petsc/install-3.15-discovery.sh	(revision 27035)
@@ -21,21 +21,23 @@
 cd src
 ./config/configure.py \
-        COPTFLAGS="-g -O3" CXXOPTFLAGS="-g -O3" FOPTFLAGS="-g -O3" \
-		  --with-make-np=20 \
-        --with-blas-lapack-dir=$MKL_ROOT \
-        --with-mpi-dir="/optnfs/el7/mpich/3.3-intel19.3/" \
-        --known-mpi-shared-libraries=1 \
-        --known-mpi-long-double=1 \
-        --known-mpi-int64_t=1 \
-        --known-mpi-c-double-complex=1 \
-        --with-debugging=0 \
-        --with-valgrind=0 \
-        --with-x=0 \
-        --with-ssl=0 \
-        --with-pic=1 \
-        --download-metis=1 \
-        --download-parmetis=1 \
-        --download-scalapack=1 \
-        --download-mumps=1
+	COPTFLAGS="-g -O3" CXXOPTFLAGS="-g -O3" FOPTFLAGS="-g -O3" \
+	--prefix="${ISSM_DIR}/externalpackages/petsc/install" \
+	--PETSC_DIR="${ISSM_DIR}/externalpackages/petsc/src" \
+	--with-make-np=20 \
+	--with-blas-lapack-dir=$MKL_ROOT \
+	--with-mpi-dir="/optnfs/el7/mpich/3.3-intel19.3/" \
+	--known-mpi-shared-libraries=1 \
+	--known-mpi-long-double=1 \
+	--known-mpi-int64_t=1 \
+	--known-mpi-c-double-complex=1 \
+	--with-debugging=0 \
+	--with-valgrind=0 \
+	--with-x=0 \
+	--with-ssl=0 \
+	--with-pic=1 \
+	--download-metis=1 \
+	--download-parmetis=1 \
+	--download-scalapack=1 \
+	--download-mumps=1
 
 # Compile and install
Index: sm/trunk/externalpackages/petsc/install-3.15-mac-arm.sh
===================================================================
--- /issm/trunk/externalpackages/petsc/install-3.15-mac-arm.sh	(revision 27034)
+++ 	(revision )
@@ -1,56 +1,0 @@
-#!/bin/bash
-set -eu
-
-
-## Constants
-VER="3.15.2"
-
-# Download source
-$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-lite-${VER}.tar.gz" "petsc-${VER}.tar.gz"
-
-# Unpack source
-tar -zxvf petsc-${VER}.tar.gz
-
-# Cleanup
-rm -rf install src
-mkdir install src
-
-# Move source to 'src' directory
-mv petsc-${VER}/* src/
-rm -rf petsc-${VER}
-
-# Configure
-#
-# NOTE:
-# - Added -fallow-argument-mismatch to FFLAGS in order to clear,
-#
-#		error: The Fortran compiler gfortran will not compile files that call 
-#		the same routine with arguments of different types.
-#
-#	for gfortran 10 or later (may need to remove it for earlier versions).
-# - Added -Wno-error=implicit-function-declaration to CFLAGS for Clang >= 12. 
-#	(may need to remove it for earlier versions not using the C99 standard).
-#
-cd src
-./config/configure.py \
-	--prefix="${ISSM_DIR}/externalpackages/petsc/install" \
-	--PETSC_DIR="${ISSM_DIR}/externalpackages/petsc/src" \
-	--CFLAGS="-Wno-error=implicit-function-declaration" \
-	--FFLAGS="-fallow-argument-mismatch" \
-	--LDFLAGS="-Wl,-no_compact_unwind" \
-	--with-debugging=0 \
-	--with-valgrind=0 \
-	--with-x=0 \
-	--with-ssl=0 \
-	--with-pic=1 \
-	--download-fblaslapack=1 \
-	--download-mpich=1 \
-	--download-metis=1 \
-	--download-parmetis=1 \
-	--download-scalapack=1 \
-	--download-mumps=1 \
-	--download-zlib=1 
-
-# Compile and install
-make
-make install
Index: /issm/trunk/externalpackages/petsc/install-3.15-pleiades.sh
===================================================================
--- /issm/trunk/externalpackages/petsc/install-3.15-pleiades.sh	(revision 27034)
+++ /issm/trunk/externalpackages/petsc/install-3.15-pleiades.sh	(revision 27035)
@@ -7,6 +7,9 @@
 VER="3.15.0"
 
+PETSC_DIR="${ISSM_DIR}/externalpackages/petsc/src" # DO NOT CHANGE THIS
+PREFIX="${ISSM_DIR}/externalpackages/petsc/install" # Set to location where external package should be installed
+
 # Download source
-$ISSM_DIR/scripts/DownloadExternalPackage.sh 'https://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-3.15.0.tar.gz' 'petsc-3.15.0.tar.gz'
+$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/petsc-lite-${VER}.tar.gz" "petsc-${VER}.tar.gz"
 
 # Unpack source
@@ -28,10 +31,10 @@
 cd src
 ./config/configure.py \
-	--prefix="${ISSM_DIR}/externalpackages/petsc/install" \
-	--PETSC_DIR="${ISSM_DIR}/externalpackages/petsc/src" \
-	--with-cc=icc --with-cxx=icpc --with-fc=ifort --with-f77=ifort\
-	-COPTFLAGS="-g -O3 -axCORE-AVX2,AVX -xSSE4.2" -CXXOPTFLAGS="-g -O3 -axCORE-AVX2,AVX -xSSE4.2" -FOPTFLAGS="-g -O3 -axCORE-AVX2,AVX -xSSE4.2" \
+	--prefix="${PREFIX}" \
+	--PETSC_DIR="${PETSC_DIR}" \
+	--with-blas-lapack-dir="/nasa/intel/Compiler/2018.3.222/compilers_and_libraries_2018.3.222/linux/mkl" \
+	--with-scalapack-include=/nasa/intel/Compiler/2018.3.222/mkl/include \
+	--with-scalapack-lib="/nasa/intel/Compiler/2018.3.222/mkl/lib/intel64/libmkl_scalapack_lp64.so /nasa/intel/Compiler/2018.3.222/mkl/lib/intel64/libmkl_blacs_intelmpi_lp64.so" \
 	--with-make-np=10 \
-	--with-blas-lapack-dir="/nasa/intel/Compiler/2016.2.181/compilers_and_libraries_2016.2.181/linux/mkl/" \
 	--known-mpi-shared-libraries=1 \
 	--with-debugging=0 \
@@ -44,5 +47,5 @@
 	--download-parmetis=1 \
 	--download-mumps=1 \
-	--download-scalapack=1
+	--download-scalapack=0
 
 # Compile and install
Index: /issm/trunk/externalpackages/petsc/install-3.16-pleiades.sh
===================================================================
--- /issm/trunk/externalpackages/petsc/install-3.16-pleiades.sh	(revision 27035)
+++ /issm/trunk/externalpackages/petsc/install-3.16-pleiades.sh	(revision 27035)
@@ -0,0 +1,53 @@
+#!/bin/bash
+set -eu
+
+
+## Constants
+#
+VER="3.16.4"
+
+PETSC_DIR="${ISSM_DIR}/externalpackages/petsc/src" # DO NOT CHANGE THIS
+PREFIX="${ISSM_DIR}/externalpackages/petsc/install" # Set to location where external package should be installed
+
+# Download source
+$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/petsc-lite-${VER}.tar.gz" "petsc-${VER}.tar.gz"
+
+# Unpack source
+tar -zxvf petsc-${VER}.tar.gz
+
+# Cleanup
+rm -rf install src
+mkdir install src
+
+# Move source to $PETSC_DIR
+mv petsc-${VER}/* src/
+rm -rf petsc-${VER}
+
+
+# Configure
+#
+# NOTE: Based on /nasa/petsc/3.7.5/intel_mpt/lib/petsc/conf/petscvariables; look for CONFIGURE_OPTIONS
+#
+cd src
+./config/configure.py \
+	--prefix="${PREFIX}" \
+	--PETSC_DIR="${PETSC_DIR}" \
+	--with-blas-lapack-dir="/nasa/intel/Compiler/2018.3.222/compilers_and_libraries_2018.3.222/linux/mkl" \
+	--with-scalapack-include=/nasa/intel/Compiler/2018.3.222/mkl/include \
+	--with-scalapack-lib="/nasa/intel/Compiler/2018.3.222/mkl/lib/intel64/libmkl_scalapack_lp64.so /nasa/intel/Compiler/2018.3.222/mkl/lib/intel64/libmkl_blacs_intelmpi_lp64.so" \
+	--with-make-np=10 \
+	--known-mpi-shared-libraries=1 \
+	--with-debugging=0 \
+	--with-valgrind=0 \
+	--with-x=0 \
+	--with-ssl=0 \
+	--with-batch=1  \
+	--with-shared-libraries=1 \
+	--download-metis=1 \
+	--download-parmetis=1 \
+	--download-mumps=1 \
+	--download-scalapack=0
+
+# Compile and install
+make
+make install
Index: /issm/trunk/externalpackages/petsc/install-3.17-mac-m1.sh
===================================================================
--- /issm/trunk/externalpackages/petsc/install-3.17-mac-m1.sh	(revision 27035)
+++ /issm/trunk/externalpackages/petsc/install-3.17-mac-m1.sh	(revision 27035)
@@ -0,0 +1,42 @@
+#!/bin/bash
+set -eu
+
+
+## Constants
+VER="3.17.0"
+
+# Download source
+$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-lite-${VER}.tar.gz" "petsc-${VER}.tar.gz"
+
+# Unpack source
+tar -zxvf petsc-${VER}.tar.gz
+
+# Cleanup
+rm -rf install src
+mkdir install src
+
+# Move source to 'src' directory
+mv petsc-${VER}/* src/
+rm -rf petsc-${VER}
+
+cd src
+./config/configure.py \
+	--prefix="${ISSM_DIR}/externalpackages/petsc/install" \
+	--PETSC_DIR="${ISSM_DIR}/externalpackages/petsc/src" \
+	--LDFLAGS="-Wl,-no_compact_unwind" \
+	--with-debugging=0 \
+	--with-valgrind=0 \
+	--with-x=0 \
+	--with-ssl=0 \
+	--with-pic=1 \
+	--download-fblaslapack=1 \
+	--download-mpich=1 \
+	--download-metis=1 \
+	--download-parmetis=1 \
+	--download-scalapack=1 \
+	--download-mumps=1 \
+	--download-zlib=1 
+
+# Compile and install
+make
+make install
Index: /issm/trunk/externalpackages/proj/install-6-static.sh
===================================================================
--- /issm/trunk/externalpackages/proj/install-6-static.sh	(revision 27035)
+++ /issm/trunk/externalpackages/proj/install-6-static.sh	(revision 27035)
@@ -0,0 +1,57 @@
+#!/bin/bash
+set -eu
+
+
+# Constants
+#
+VER="6.2.1"
+
+PREFIX="${ISSM_DIR}/externalpackages/proj/install" # Set to location where external package should be installed
+
+## Environment
+#
+export CC=mpicc
+export CXX=mpicxx
+
+# NOTE: On macOS, SQLite3 should be installed by default, but PROJ currently
+# requires,
+#
+#	SQLITE3_LIBS="-lsqlite3".
+#
+# On Ubuntu Linux, install the SQLite3 binary, libraries and headers with,
+#
+#	apt-get install sqlite3 libsqlite3-dev
+#
+export SQLITE3_LIBS="-lsqlite3"
+
+# Cleanup
+rm -rf ${PREFIX} src
+mkdir -p ${PREFIX} src
+
+# Download source
+$ISSM_DIR/scripts/DownloadExternalPackage.sh "https://issm.ess.uci.edu/files/externalpackages/proj-${VER}.tar.gz" "proj-${VER}.tar.gz"
+
+# Unpack source
+tar -zxvf proj-${VER}.tar.gz
+
+# Move source into 'src' directory
+mv proj-${VER}/* src
+rm -rf proj-${VER}
+
+# Configure
+cd src
+./configure \
+	--prefix="${PREFIX}" \
+	--disable-dependency-tracking \
+	--enable-fast-install \
+	--disable-shared \
+	--disable-tiff
+
+# Compile and install
+if [ $# -eq 0 ]; then
+	make
+	make install
+else
+	make -j $1
+	make -j $1 install
+fi
Index: /issm/trunk/externalpackages/proj/install-6.sh
===================================================================
--- /issm/trunk/externalpackages/proj/install-6.sh	(revision 27034)
+++ /issm/trunk/externalpackages/proj/install-6.sh	(revision 27035)
@@ -13,13 +13,13 @@
 export CC=mpicc
 export CXX=mpicxx
+
 # NOTE: On macOS, SQLite3 should be installed by default, but PROJ currently
-#		requires,
+# requires,
 #
-#			SQLITE3_LIBS="-lsqlite3".
+#	SQLITE3_LIBS="-lsqlite3".
 #
-#		On Ubuntu Linux, install the SQLite3 binary, libraries and headers
-#		with,
+# On Ubuntu Linux, install the SQLite3 binary, libraries and headers with,
 #
-#			`apt-get install sqlite3 libsqlite3-dev`
+#	apt-get install sqlite3 libsqlite3-dev
 #
 export SQLITE3_LIBS="-lsqlite3"
Index: /issm/trunk/externalpackages/proj/install-8-static-with_tests.sh
===================================================================
--- /issm/trunk/externalpackages/proj/install-8-static-with_tests.sh	(revision 27034)
+++ /issm/trunk/externalpackages/proj/install-8-static-with_tests.sh	(revision 27035)
@@ -7,5 +7,5 @@
 VER="8.1.0"
 
-PREFIX="${ISSM_EXT_STATIC_DIR}/proj/install" # Set to location where external package should be installed
+PREFIX="${ISSM_DIR}/externalpackages/proj/install" # Set to location where external package should be installed
 
 ## Environment
@@ -21,5 +21,5 @@
 # On Ubuntu Linux, install the SQLite3 binary, libraries and headers with,
 #
-#	`apt-get install sqlite3 libsqlite3-dev`
+#	apt-get install sqlite3 libsqlite3-dev
 #
 export SQLITE3_LIBS="-lsqlite3"
Index: /issm/trunk/externalpackages/proj/install-8-static.sh
===================================================================
--- /issm/trunk/externalpackages/proj/install-8-static.sh	(revision 27034)
+++ /issm/trunk/externalpackages/proj/install-8-static.sh	(revision 27035)
@@ -7,5 +7,5 @@
 VER="8.1.0"
 
-PREFIX="${ISSM_EXT_STATIC_DIR}/proj/install" # Set to location where external package should be installed
+PREFIX="${ISSM_DIR}/externalpackages/proj/install" # Set to location where external package should be installed
 
 ## Environment
@@ -21,5 +21,5 @@
 # On Ubuntu Linux, install the SQLite3 binary, libraries and headers with,
 #
-#	`apt-get install sqlite3 libsqlite3-dev`
+#	apt-get install sqlite3 libsqlite3-dev
 #
 export SQLITE3_LIBS="-lsqlite3"
Index: /issm/trunk/externalpackages/proj/install-8-with_tests.sh
===================================================================
--- /issm/trunk/externalpackages/proj/install-8-with_tests.sh	(revision 27034)
+++ /issm/trunk/externalpackages/proj/install-8-with_tests.sh	(revision 27035)
@@ -7,5 +7,5 @@
 VER="8.1.0"
 
-PREFIX="${ISSM_EXT_SHARED_DIR}/proj/install" # Set to location where external package should be installed
+PREFIX="${ISSM_DIR}/externalpackages/proj/install" # Set to location where external package should be installed
 
 ## Environment
@@ -21,5 +21,5 @@
 # On Ubuntu Linux, install the SQLite3 binary, libraries and headers with,
 #
-#	`apt-get install sqlite3 libsqlite3-dev`
+#	apt-get install sqlite3 libsqlite3-dev
 #
 export SQLITE3_LIBS="-lsqlite3"
Index: /issm/trunk/externalpackages/proj/install-8.sh
===================================================================
--- /issm/trunk/externalpackages/proj/install-8.sh	(revision 27034)
+++ /issm/trunk/externalpackages/proj/install-8.sh	(revision 27035)
@@ -21,5 +21,5 @@
 # On Ubuntu Linux, install the SQLite3 binary, libraries and headers with,
 #
-#	`apt-get install sqlite3 libsqlite3-dev`
+#	apt-get install sqlite3 libsqlite3-dev
 #
 export SQLITE3_LIBS="-lsqlite3"
Index: /issm/trunk/externalpackages/python/install-2-linux.sh
===================================================================
--- /issm/trunk/externalpackages/python/install-2-linux.sh	(revision 27035)
+++ /issm/trunk/externalpackages/python/install-2-linux.sh	(revision 27035)
@@ -0,0 +1,33 @@
+#!/bin/bash
+set -eu
+
+#Some cleanup
+rm -rf install src
+rm -rf Python-2.7.3
+mkdir install src
+
+#Download from ISSM server
+$ISSM_DIR/scripts/DownloadExternalPackage.sh https://issm.ess.uci.edu/files/externalpackages/Python-2.7.3.tgz Python-2.7.3.tgz
+
+#Untar and move python into install directory
+tar -zxvf  Python-2.7.3.tgz
+mv Python-2.7.3/* src
+rm -rf Python-2.7.3
+
+#Configure python
+cd src 
+./configure \
+ --prefix="$ISSM_DIR/externalpackages/python/install" \
+ --enable-shared
+
+if [ $# -eq 0 ]; then
+	make
+else
+	make -j $1
+fi
+make install
+
+cd ../install/include
+cp python2.7/* ./
+cd ../lib
+ln -s  libpython2.7.so.1.0 libpython.so
Index: /issm/trunk/externalpackages/python/install-2-mac-snowleopard.sh
===================================================================
--- /issm/trunk/externalpackages/python/install-2-mac-snowleopard.sh	(revision 27035)
+++ /issm/trunk/externalpackages/python/install-2-mac-snowleopard.sh	(revision 27035)
@@ -0,0 +1,41 @@
+#!/bin/bash
+set -eu
+
+#Some cleanup
+rm -rf install src
+rm -rf Python-2.7.3
+mkdir install src
+
+#Download from ISSM server
+$ISSM_DIR/scripts/DownloadExternalPackage.sh https://issm.ess.uci.edu/files/externalpackages/Python-2.7.3.tgz Python-2.7.3.tgz
+
+#exports
+export MACOSX_DEPLOYMENT_TARGET=10.6
+
+#Untar and move python into install directory
+tar -zxvf  Python-2.7.3.tgz
+mv Python-2.7.3/* src
+rm -rf Python-2.7.3
+
+#Configure doxygen
+cd src 
+# --enable-framework needs to have the form "$SOME_PATH/Library/Frameworks" to avoid installing components in /Applications directory
+# --prefix is recognized as $SOME_PATH as long as this form is taken, so it's not necessary to include
+./configure --enable-framework="$ISSM_DIR/externalpackages/python/install/Library/Frameworks" \
+	LDFLAGS="-L/usr/local/gfortran/lib/gcc/x86_64-apple-darwin10/4.6.2/ -lgfortran "
+
+#make
+if [ $# -eq 0 ]; then
+	make
+else
+	make -j $1
+fi
+make install
+
+cd ../install
+ln -s Library/Frameworks/Python.framework/Headers include
+ln -s Library/Frameworks/Python.framework/Versions/2.7/lib lib
+
+#Patch pyport.h:
+cd include
+patch pyport.h $ISSM_DIR/externalpackages/python/patches/pyport.h.patch
Index: /issm/trunk/externalpackages/python/install-2-mac.sh
===================================================================
--- /issm/trunk/externalpackages/python/install-2-mac.sh	(revision 27035)
+++ /issm/trunk/externalpackages/python/install-2-mac.sh	(revision 27035)
@@ -0,0 +1,40 @@
+#!/bin/bash
+set -eu
+
+#Some cleanup
+rm -rf install src
+rm -rf Python-2.7.3
+mkdir install src
+
+#Download from ISSM server
+$ISSM_DIR/scripts/DownloadExternalPackage.sh https://issm.ess.uci.edu/files/externalpackages/Python-2.7.3.tgz Python-2.7.3.tgz
+
+#Untar and move python into install directory
+tar -zxvf  Python-2.7.3.tgz
+mv Python-2.7.3/* src
+rm -rf Python-2.7.3
+
+#Configure and compile
+cd src 
+./configure \
+ --enable-framework="$ISSM_DIR/externalpackages/python/install/Library/Frameworks" 
+if [ $# -eq 0 ]; then
+	make
+else
+	make -j $1
+fi
+make install
+
+cd ../install
+
+#get rid of bin, because it's just a copy of
+#Library/Frameworks/Python.framework/Versions/2.7/bin, and will not reflect
+#new changes being made
+rm -rf bin
+ln -s Library/Frameworks/Python.framework/Headers include
+ln -s Library/Frameworks/Python.framework/Versions/2.7/lib lib
+ln -s Library/Frameworks/Python.framework/Versions/2.7/bin bin
+
+#Patch pyport.h:
+cd include
+patch pyport.h $ISSM_DIR/externalpackages/python/patches/pyport.h.patch
Index: sm/trunk/externalpackages/python/install-2.7.3-linux64.sh
===================================================================
--- /issm/trunk/externalpackages/python/install-2.7.3-linux64.sh	(revision 27034)
+++ 	(revision )
@@ -1,33 +1,0 @@
-#!/bin/bash
-set -eu
-
-#Some cleanup
-rm -rf install src
-rm -rf Python-2.7.3
-mkdir install src
-
-#Download from ISSM server
-$ISSM_DIR/scripts/DownloadExternalPackage.sh https://issm.ess.uci.edu/files/externalpackages/Python-2.7.3.tgz Python-2.7.3.tgz
-
-#Untar and move python into install directory
-tar -zxvf  Python-2.7.3.tgz
-mv Python-2.7.3/* src
-rm -rf Python-2.7.3
-
-#Configure python
-cd src 
-./configure \
- --prefix="$ISSM_DIR/externalpackages/python/install" \
- --enable-shared
-
-if [ $# -eq 0 ]; then
-	make
-else
-	make -j $1
-fi
-make install
-
-cd ../install/include
-cp python2.7/* ./
-cd ../lib
-ln -s  libpython2.7.so.1.0 libpython.so
Index: sm/trunk/externalpackages/python/install-2.7.3-macosx-snowleopard.sh
===================================================================
--- /issm/trunk/externalpackages/python/install-2.7.3-macosx-snowleopard.sh	(revision 27034)
+++ 	(revision )
@@ -1,41 +1,0 @@
-#!/bin/bash
-set -eu
-
-#Some cleanup
-rm -rf install src
-rm -rf Python-2.7.3
-mkdir install src
-
-#Download from ISSM server
-$ISSM_DIR/scripts/DownloadExternalPackage.sh https://issm.ess.uci.edu/files/externalpackages/Python-2.7.3.tgz Python-2.7.3.tgz
-
-#exports
-export MACOSX_DEPLOYMENT_TARGET=10.6
-
-#Untar and move python into install directory
-tar -zxvf  Python-2.7.3.tgz
-mv Python-2.7.3/* src
-rm -rf Python-2.7.3
-
-#Configure doxygen
-cd src 
-# --enable-framework needs to have the form "$SOME_PATH/Library/Frameworks" to avoid installing components in /Applications directory
-# --prefix is recognized as $SOME_PATH as long as this form is taken, so it's not necessary to include
-./configure --enable-framework="$ISSM_DIR/externalpackages/python/install/Library/Frameworks" \
-	LDFLAGS="-L/usr/local/gfortran/lib/gcc/x86_64-apple-darwin10/4.6.2/ -lgfortran "
-
-#make
-if [ $# -eq 0 ]; then
-	make
-else
-	make -j $1
-fi
-make install
-
-cd ../install
-ln -s Library/Frameworks/Python.framework/Headers include
-ln -s Library/Frameworks/Python.framework/Versions/2.7/lib lib
-
-#Patch pyport.h:
-cd include
-patch pyport.h $ISSM_DIR/externalpackages/python/patches/pyport.h.patch
Index: sm/trunk/externalpackages/python/install-2.7.3-macosx.sh
===================================================================
--- /issm/trunk/externalpackages/python/install-2.7.3-macosx.sh	(revision 27034)
+++ 	(revision )
@@ -1,40 +1,0 @@
-#!/bin/bash
-set -eu
-
-#Some cleanup
-rm -rf install src
-rm -rf Python-2.7.3
-mkdir install src
-
-#Download from ISSM server
-$ISSM_DIR/scripts/DownloadExternalPackage.sh https://issm.ess.uci.edu/files/externalpackages/Python-2.7.3.tgz Python-2.7.3.tgz
-
-#Untar and move python into install directory
-tar -zxvf  Python-2.7.3.tgz
-mv Python-2.7.3/* src
-rm -rf Python-2.7.3
-
-#Configure and compile
-cd src 
-./configure \
- --enable-framework="$ISSM_DIR/externalpackages/python/install/Library/Frameworks" 
-if [ $# -eq 0 ]; then
-	make
-else
-	make -j $1
-fi
-make install
-
-cd ../install
-
-#get rid of bin, because it's just a copy of
-#Library/Frameworks/Python.framework/Versions/2.7/bin, and will not reflect
-#new changes being made
-rm -rf bin
-ln -s Library/Frameworks/Python.framework/Headers include
-ln -s Library/Frameworks/Python.framework/Versions/2.7/lib lib
-ln -s Library/Frameworks/Python.framework/Versions/2.7/bin bin
-
-#Patch pyport.h:
-cd include
-patch pyport.h $ISSM_DIR/externalpackages/python/patches/pyport.h.patch
Index: /issm/trunk/externalpackages/python/install-3-linux.sh
===================================================================
--- /issm/trunk/externalpackages/python/install-3-linux.sh	(revision 27035)
+++ /issm/trunk/externalpackages/python/install-3-linux.sh	(revision 27035)
@@ -0,0 +1,37 @@
+#!/bin/bash
+set -eu
+
+#Some cleanup
+rm -rf install src
+rm -rf Python-3.2.2
+mkdir install src
+
+#Download from ISSM server
+$ISSM_DIR/scripts/DownloadExternalPackage.sh https://issm.ess.uci.edu/files/externalpackages/Python-3.2.2.tgz Python-3.2.2.tgz
+
+#exports
+export CC
+
+#Untar and move python into install directory
+tar -zxvf  Python-3.2.2.tgz
+mv Python-3.2.2/* src
+rm -rf Python-3.2.2
+
+#Configure python
+cd src 
+./configure \
+ --prefix="$ISSM_DIR/externalpackages/python/install" \
+ --enable-shared
+
+if [ $# -eq 0 ]; then
+	make
+else
+	make -j $1
+fi
+make install
+
+cd ../install/bin
+ln -s python3.2 python 
+cd ../
+ln -s Python.framework/Versions/3.2/include/python3.2m include
+ln -s Python.framework/Versions/3.2/lib/ lib
Index: /issm/trunk/externalpackages/python/install-3-mac-snowleopard.sh
===================================================================
--- /issm/trunk/externalpackages/python/install-3-mac-snowleopard.sh	(revision 27035)
+++ /issm/trunk/externalpackages/python/install-3-mac-snowleopard.sh	(revision 27035)
@@ -0,0 +1,41 @@
+#!/bin/bash
+set -eu
+
+#Some cleanup
+rm -rf install src
+rm -rf Python-3.2.2
+mkdir install src
+
+#Download from ISSM server
+$ISSM_DIR/scripts/DownloadExternalPackage.sh https://issm.ess.uci.edu/files/externalpackages/Python-3.2.2.tgz Python-3.2.2.tgz
+
+#exports
+export CC
+export MACOSX_DEPLOYMENT_TARGET=10.6
+
+#Untar and move python into install directory
+tar -zxvf  Python-3.2.2.tgz
+mv Python-3.2.2/* src
+rm -rf Python-3.2.2
+
+#Configure doxygen
+cd src 
+# --enable-framework needs to have the form "$SOME_PATH/Library/Frameworks" to avoid installing components in /Applications directory
+# --prefix is recognized as $SOME_PATH as long as this form is taken, so it's not necessary to include
+./configure \
+ --enable-framework="$ISSM_DIR/externalpackages/python/install/Library/Frameworks" 
+
+#make
+if [ $# -eq 0 ]; then
+	make
+else
+	make -j $1
+fi
+make install
+cd ..
+
+cd install/bin
+ln -s python3.2 python 
+cd ../
+ln -s Python.framework/Versions/3.2/include/python3.2m include
+ln -s Python.framework/Versions/3.2/lib/ lib
Index: /issm/trunk/externalpackages/python/install-3-mac.sh
===================================================================
--- /issm/trunk/externalpackages/python/install-3-mac.sh	(revision 27035)
+++ /issm/trunk/externalpackages/python/install-3-mac.sh	(revision 27035)
@@ -0,0 +1,40 @@
+#!/bin/bash
+set -eu
+
+#Some cleanup
+rm -rf install src
+rm -rf Python-3.2.2
+mkdir install src
+
+#Download from ISSM server
+$ISSM_DIR/scripts/DownloadExternalPackage.sh https://issm.ess.uci.edu/files/externalpackages/Python-3.2.2.tgz Python-3.2.2.tgz
+
+#exports
+export CC
+
+#Untar and move python into install directory
+tar -zxvf  Python-3.2.2.tgz
+mv Python-3.2.2/* src
+rm -rf Python-3.2.2
+
+#Configure doxygen
+cd src 
+./configure \
+ --enable-framework="$ISSM_DIR/externalpackages/python/install/Library/Frameworks" 
+
+#obsolete? 
+#./configure --prefix="$ISSM_DIR/externalpackages/python/install" --enable-framework="$ISSM_DIR/externalpackages/python/install"
+
+#make
+if [ $# -eq 0 ]; then
+	make
+else
+	make -j $1
+fi
+make install
+
+cd install/bin
+ln -s python3.2 python 
+cd ../
+ln -s Python.framework/Versions/3.2/include/python3.2m include
+ln -s Python.framework/Versions/3.2/lib/ lib
Index: sm/trunk/externalpackages/python/install-3.2.2-linux64.sh
===================================================================
--- /issm/trunk/externalpackages/python/install-3.2.2-linux64.sh	(revision 27034)
+++ 	(revision )
@@ -1,37 +1,0 @@
-#!/bin/bash
-set -eu
-
-#Some cleanup
-rm -rf install src
-rm -rf Python-3.2.2
-mkdir install src
-
-#Download from ISSM server
-$ISSM_DIR/scripts/DownloadExternalPackage.sh https://issm.ess.uci.edu/files/externalpackages/Python-3.2.2.tgz Python-3.2.2.tgz
-
-#exports
-export CC
-
-#Untar and move python into install directory
-tar -zxvf  Python-3.2.2.tgz
-mv Python-3.2.2/* src
-rm -rf Python-3.2.2
-
-#Configure python
-cd src 
-./configure \
- --prefix="$ISSM_DIR/externalpackages/python/install" \
- --enable-shared
-
-if [ $# -eq 0 ]; then
-	make
-else
-	make -j $1
-fi
-make install
-
-cd ../install/bin
-ln -s python3.2 python 
-cd ../
-ln -s Python.framework/Versions/3.2/include/python3.2m include
-ln -s Python.framework/Versions/3.2/lib/ lib
Index: sm/trunk/externalpackages/python/install-3.2.2-macosx-snowleopard.sh
===================================================================
--- /issm/trunk/externalpackages/python/install-3.2.2-macosx-snowleopard.sh	(revision 27034)
+++ 	(revision )
@@ -1,41 +1,0 @@
-#!/bin/bash
-set -eu
-
-#Some cleanup
-rm -rf install src
-rm -rf Python-3.2.2
-mkdir install src
-
-#Download from ISSM server
-$ISSM_DIR/scripts/DownloadExternalPackage.sh https://issm.ess.uci.edu/files/externalpackages/Python-3.2.2.tgz Python-3.2.2.tgz
-
-#exports
-export CC
-export MACOSX_DEPLOYMENT_TARGET=10.6
-
-#Untar and move python into install directory
-tar -zxvf  Python-3.2.2.tgz
-mv Python-3.2.2/* src
-rm -rf Python-3.2.2
-
-#Configure doxygen
-cd src 
-# --enable-framework needs to have the form "$SOME_PATH/Library/Frameworks" to avoid installing components in /Applications directory
-# --prefix is recognized as $SOME_PATH as long as this form is taken, so it's not necessary to include
-./configure \
- --enable-framework="$ISSM_DIR/externalpackages/python/install/Library/Frameworks" 
-
-#make
-if [ $# -eq 0 ]; then
-	make
-else
-	make -j $1
-fi
-make install
-cd ..
-
-cd install/bin
-ln -s python3.2 python 
-cd ../
-ln -s Python.framework/Versions/3.2/include/python3.2m include
-ln -s Python.framework/Versions/3.2/lib/ lib
Index: sm/trunk/externalpackages/python/install-3.2.2-macosx.sh
===================================================================
--- /issm/trunk/externalpackages/python/install-3.2.2-macosx.sh	(revision 27034)
+++ 	(revision )
@@ -1,40 +1,0 @@
-#!/bin/bash
-set -eu
-
-#Some cleanup
-rm -rf install src
-rm -rf Python-3.2.2
-mkdir install src
-
-#Download from ISSM server
-$ISSM_DIR/scripts/DownloadExternalPackage.sh https://issm.ess.uci.edu/files/externalpackages/Python-3.2.2.tgz Python-3.2.2.tgz
-
-#exports
-export CC
-
-#Untar and move python into install directory
-tar -zxvf  Python-3.2.2.tgz
-mv Python-3.2.2/* src
-rm -rf Python-3.2.2
-
-#Configure doxygen
-cd src 
-./configure \
- --enable-framework="$ISSM_DIR/externalpackages/python/install/Library/Frameworks" 
-
-#obsolete? 
-#./configure --prefix="$ISSM_DIR/externalpackages/python/install" --enable-framework="$ISSM_DIR/externalpackages/python/install"
-
-#make
-if [ $# -eq 0 ]; then
-	make
-else
-	make -j $1
-fi
-make install
-
-cd install/bin
-ln -s python3.2 python 
-cd ../
-ln -s Python.framework/Versions/3.2/include/python3.2m include
-ln -s Python.framework/Versions/3.2/lib/ lib
Index: /issm/trunk/externalpackages/sqlite/install.sh
===================================================================
--- /issm/trunk/externalpackages/sqlite/install.sh	(revision 27034)
+++ /issm/trunk/externalpackages/sqlite/install.sh	(revision 27035)
@@ -3,9 +3,13 @@
 
 
+# Constants
+#
 VER="3300100"
 
+PREFIX="${ISSM_DIR}/externalpackages/sqlite/install" # Set to location where external package should be installed
+
 # Cleanup
-rm -rf install src
-mkdir install src
+rm -rf ${PREFIX} src
+mkdir -p ${PREFIX} src
 
 # Download source
@@ -13,14 +17,14 @@
 
 # Unpack source
-tar -zxvf sqlite-autoconf-$VER.tar.gz
+tar -zxvf sqlite-autoconf-${VER}.tar.gz
 
 # Move source into 'src' directory
-mv sqlite-autoconf-$VER/* src
-rm -rf sqlite-autoconf-$VER
+mv sqlite-autoconf-${VER}/* src
+rm -rf sqlite-autoconf-${VER}
 
 # Configure
 cd src
 ./configure \
-	--prefix="${ISSM_DIR}/externalpackages/sqlite/install"
+	--prefix="${PREFIX}"
 
 # Compile and install
Index: /issm/trunk/jenkins/aws-amazon_linux-solid_earth
===================================================================
--- /issm/trunk/jenkins/aws-amazon_linux-solid_earth	(revision 27034)
+++ /issm/trunk/jenkins/aws-amazon_linux-solid_earth	(revision 27035)
@@ -42,5 +42,5 @@
 	curl			install-7-linux.sh
 	netcdf			install-4.7-parallel.sh
-	proj			install-8.sh
+	proj			install-6.sh
 	gdal			install-3-python.sh
 	gshhg			install.sh
Index: /issm/trunk/jenkins/jenkins.sh
===================================================================
--- /issm/trunk/jenkins/jenkins.sh	(revision 27034)
+++ /issm/trunk/jenkins/jenkins.sh	(revision 27035)
@@ -345,8 +345,10 @@
 EOF
 		cd $ISSM_DIR/test/NightlyRun
+
+		# NOTE: We redirect all output to logfile in order to catch certain errors. For some reason, this does not work under Windows: the logifle option must be used and process must be run in background
 		if [[ "${OS}" == CYGWIN* || ${MINGW} -eq 1 ]]; then
 			$MATLAB_PATH/bin/matlab -nodesktop -nosplash -nojvm -r "addpath ${ISSM_DIR_WIN}/src/m/dev; devpath; addpath ${ISSM_DIR_WIN}/nightlylog; matlab_run$i" -logfile ${ISSM_DIR_WIN}/nightlylog/matlab_log$i.log &
 		else
-			$MATLAB_PATH/bin/matlab -nodisplay -nosplash -r "addpath ${ISSM_DIR}/src/m/dev; devpath; addpath ${ISSM_DIR}/nightlylog; matlab_run$i" -logfile ${ISSM_DIR}/nightlylog/matlab_log$i.log &
+			$MATLAB_PATH/bin/matlab -nodisplay -nosplash -r "addpath ${ISSM_DIR}/src/m/dev; devpath; addpath ${ISSM_DIR}/nightlylog; matlab_run$i" &> ${ISSM_DIR}/nightlylog/matlab_log$i.log &
 		fi
 	done
@@ -377,8 +379,22 @@
 		echo "pid: ${pid}"
 		echo '-----------------------------'
-		while [ -n "${pid}" ]; do
+
+		# Time out after $max_time seconds because sometimes multiple MATLAB processes get locked in race condition
+		timer=0
+		max_time=7200
+		while [[ $timer -lt $max_time && -n "${pid}" ]]; do
 			pid=$(ps -W | grep MATLAB | awk '{print $1}')
+			timer=$((timer + 1))
 			sleep 1;
 		done
+
+		# Check if timer hit $max_time
+		if [ $timer -eq $max_time ]; then
+			echo "Testing timed out at ${timer} seconds"
+			# Kill MATLAB processes
+			pid=$(ps -W | grep MATLAB | awk '{print $1}')
+			echo "${pid}" | xargs /bin/kill -f
+			exit 1
+		fi
 	else
 		wait
Index: /issm/trunk/jenkins/pine_island-mac-adolc-ampion
===================================================================
--- /issm/trunk/jenkins/pine_island-mac-adolc-ampion	(revision 27034)
+++ /issm/trunk/jenkins/pine_island-mac-adolc-ampion	(revision 27035)
@@ -18,5 +18,5 @@
 	--with-python-dir=/System/Library/Frameworks/Python.framework/Versions/2.7 \
 	--with-python-numpy-dir=/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy \
-	--with-fortran-lib="-L/usr/local/Cellar/gcc/10.3.0/lib/gcc/10 -lgfortran" \
+	--with-fortran-lib="-L/usr/local/Cellar/gcc/11.3.0/lib/gcc/11 -lgfortran" \
 	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include  \
 	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
Index: /issm/trunk/jenkins/pine_island-mac-basic
===================================================================
--- /issm/trunk/jenkins/pine_island-mac-basic	(revision 27034)
+++ /issm/trunk/jenkins/pine_island-mac-basic	(revision 27035)
@@ -12,5 +12,5 @@
 	--with-numthreads=4 \
 	--with-matlab-dir=${MATLAB_PATH} \
-	--with-fortran-lib="-L/usr/local/Cellar/gcc/10.3.0/lib/gcc/10 -lgfortran" \
+	--with-fortran-lib="-L/usr/local/Cellar/gcc/11.3.0/lib/gcc/11 -lgfortran" \
 	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
 	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
Index: /issm/trunk/jenkins/pine_island-mac-binaries-matlab
===================================================================
--- /issm/trunk/jenkins/pine_island-mac-binaries-matlab	(revision 27034)
+++ /issm/trunk/jenkins/pine_island-mac-binaries-matlab	(revision 27035)
@@ -19,5 +19,5 @@
 	--disable-dependency-tracking \
 	--with-matlab-dir=${MATLAB_PATH} \
-	--with-fortran-lib="/usr/local/Cellar/gcc/10.3.0/lib/gcc/10/libgfortran.a /usr/local/Cellar/gcc/10.3.0/lib/gcc/10/libquadmath.a /usr/local/Cellar/gcc/10.3.0/lib/gcc/10/gcc/x86_64-apple-darwin15/10.3.0/libgcc.a" \
+	--with-fortran-lib="/usr/local/Cellar/gcc/11.3.0/lib/gcc/11/libgfortran.a /usr/local/Cellar/gcc/11.3.0/lib/gcc/11/libquadmath.a /usr/local/Cellar/gcc/11.3.0/lib/gcc/11/gcc/x86_64-apple-darwin15/11/libgcc.a" \
 	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
 	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
@@ -52,5 +52,5 @@
 	curl		install-7-mac-static.sh
 	netcdf		install-4.7-parallel-static.sh
-	proj		install-8-static.sh
+	proj		install-6-static.sh
 	gdal		install-3-static.sh
 	gshhg		install.sh
Index: sm/trunk/jenkins/pine_island-mac-binaries-python
===================================================================
--- /issm/trunk/jenkins/pine_island-mac-binaries-python	(revision 27034)
+++ 	(revision )
@@ -1,89 +1,0 @@
-#--------------------#
-# ISSM Configuration #
-#--------------------#
-
-# NOTE:
-# - We can disable dependency tracking in the Autotools because the binaries
-#	should always be a one-time build.
-#
-
-# ISSM CONFIGURATION
-ISSM_CONFIG='\
-	--prefix=${ISSM_DIR} \
-	--enable-standalone-executables \
-	--enable-standalone-modules \
-	--enable-standalone-libraries \
-	--disable-dependency-tracking \
-	--with-python-dir=/System/Library/Frameworks/Python.framework/Versions/2.7 \
-	--with-python-numpy-dir=/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy \
-	--with-fortran-lib="/usr/local/Cellar/gcc/10.3.0/lib/gcc/10/libgfortran.a /usr/local/Cellar/gcc/10.3.0/lib/gcc/10/libquadmath.a /usr/local/Cellar/gcc/10.3.0/lib/gcc/10/gcc/x86_64-apple-darwin15/10.3.0/libgcc.a" \
-	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
-	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
-	--with-blas-lapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-metis-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-parmetis-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-scalapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-mumps-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-hdf5-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-petsc-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-gsl-dir=${ISSM_DIR}/externalpackages/gsl/install \
-	--with-boost-dir=${ISSM_DIR}/externalpackages/boost/install \
-	--with-dakota-dir=${ISSM_DIR}/externalpackages/dakota/install \
-	--with-proj-dir=${ISSM_DIR}/externalpackages/proj/install \
-	--with-triangle-dir=${ISSM_DIR}/externalpackages/triangle/install \
-	--with-chaco-dir=${ISSM_DIR}/externalpackages/chaco/install \
-	--with-m1qn3-dir=${ISSM_DIR}/externalpackages/m1qn3/install \
-	--with-semic-dir=${ISSM_DIR}/externalpackages/semic/install \
-'
-
-#-------------------#
-# External Packages #
-#-------------------#
-
-EXTERNALPACKAGES="
-	autotools	install-mac.sh
-	cmake		install.sh
-	petsc		install-3.12-mac-static.sh
-	gsl			install-static.sh
-	boost		install-1.7-mac-static.sh
-	dakota		install-6.2-mac-static.sh
-	curl		install-7-mac-static.sh
-	netcdf		install-4.7-parallel-static.sh
-	proj		install-8-static.sh
-	gdal		install-3-python-static.sh
-	gshhg		install.sh
-	gmt			install-6-mac-static.sh
-	gmsh		install-4-static.sh
-	triangle	install-mac-static.sh
-	chaco		install.sh
-	m1qn3		install.sh
-	semic		install.sh
-	shell2junit	install.sh
-"
-
-#---------#
-# Testing #
-#---------#
-
-# Test suites
-MATLAB_TEST=0
-PYTHON_TEST=0
-JAVASCRIPT_TEST=0
-EXAMPLES_TEST=0
-
-# Number of CPUs used in ISSM compilation
-#
-# NOTE: One is usually safer as some packages are very sensitive to parallel
-# 		compilation
-#
-NUMCPUS_INSTALL=8
-
-# Number of CPUs used in the nightly runs
-NUMCPUS_RUN=1
-
-# Nightly run options
-#
-# See documentation in test/NightlyRun/runme.* for more information.
-#
-PYTHON_NROPTIONS=""
-MATLAB_NROPTIONS=""
Index: /issm/trunk/jenkins/pine_island-mac-binaries-python-2
===================================================================
--- /issm/trunk/jenkins/pine_island-mac-binaries-python-2	(revision 27035)
+++ /issm/trunk/jenkins/pine_island-mac-binaries-python-2	(revision 27035)
@@ -0,0 +1,89 @@
+#--------------------#
+# ISSM Configuration #
+#--------------------#
+
+# NOTE:
+# - We can disable dependency tracking in the Autotools because the binaries
+#	should always be a one-time build.
+#
+
+# ISSM CONFIGURATION
+ISSM_CONFIG='\
+	--prefix=${ISSM_DIR} \
+	--enable-standalone-executables \
+	--enable-standalone-modules \
+	--enable-standalone-libraries \
+	--disable-dependency-tracking \
+	--with-python-dir=/System/Library/Frameworks/Python.framework/Versions/2.7 \
+	--with-python-numpy-dir=/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy \
+	--with-fortran-lib="/usr/local/Cellar/gcc/11.3.0/lib/gcc/11/libgfortran.a /usr/local/Cellar/gcc/11.3.0/lib/gcc/11/libquadmath.a /usr/local/Cellar/gcc/11.3.0/lib/gcc/11/gcc/x86_64-apple-darwin15/11/libgcc.a" \
+	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
+	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
+	--with-blas-lapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-metis-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-parmetis-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-scalapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-mumps-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-hdf5-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-petsc-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-gsl-dir=${ISSM_DIR}/externalpackages/gsl/install \
+	--with-boost-dir=${ISSM_DIR}/externalpackages/boost/install \
+	--with-dakota-dir=${ISSM_DIR}/externalpackages/dakota/install \
+	--with-proj-dir=${ISSM_DIR}/externalpackages/proj/install \
+	--with-triangle-dir=${ISSM_DIR}/externalpackages/triangle/install \
+	--with-chaco-dir=${ISSM_DIR}/externalpackages/chaco/install \
+	--with-m1qn3-dir=${ISSM_DIR}/externalpackages/m1qn3/install \
+	--with-semic-dir=${ISSM_DIR}/externalpackages/semic/install \
+'
+
+#-------------------#
+# External Packages #
+#-------------------#
+
+EXTERNALPACKAGES="
+	autotools	install-mac.sh
+	cmake		install.sh
+	petsc		install-3.12-mac-static.sh
+	gsl			install-static.sh
+	boost		install-1.7-mac-static.sh
+	dakota		install-6.2-mac-static.sh
+	curl		install-7-mac-static.sh
+	netcdf		install-4.7-parallel-static.sh
+	proj		install-6-static.sh
+	gdal		install-3-python-static.sh
+	gshhg		install.sh
+	gmt			install-6-mac-static.sh
+	gmsh		install-4-static.sh
+	triangle	install-mac-static.sh
+	chaco		install.sh
+	m1qn3		install.sh
+	semic		install.sh
+	shell2junit	install.sh
+"
+
+#---------#
+# Testing #
+#---------#
+
+# Test suites
+MATLAB_TEST=0
+PYTHON_TEST=0
+JAVASCRIPT_TEST=0
+EXAMPLES_TEST=0
+
+# Number of CPUs used in ISSM compilation
+#
+# NOTE: One is usually safer as some packages are very sensitive to parallel
+# 		compilation
+#
+NUMCPUS_INSTALL=8
+
+# Number of CPUs used in the nightly runs
+NUMCPUS_RUN=1
+
+# Nightly run options
+#
+# See documentation in test/NightlyRun/runme.* for more information.
+#
+PYTHON_NROPTIONS=""
+MATLAB_NROPTIONS=""
Index: /issm/trunk/jenkins/pine_island-mac-binaries-python-3
===================================================================
--- /issm/trunk/jenkins/pine_island-mac-binaries-python-3	(revision 27035)
+++ /issm/trunk/jenkins/pine_island-mac-binaries-python-3	(revision 27035)
@@ -0,0 +1,90 @@
+#--------------------#
+# ISSM Configuration #
+#--------------------#
+
+# NOTE:
+# - We can disable dependency tracking in the Autotools because the binaries
+#	should always be a one-time build.
+#
+
+# ISSM CONFIGURATION
+ISSM_CONFIG='\
+	--prefix=${ISSM_DIR} \
+	--enable-standalone-executables \
+	--enable-standalone-modules \
+	--enable-standalone-libraries \
+	--disable-dependency-tracking \
+	--with-python-version=3.4 \
+	--with-python-dir=/Library/Frameworks/Python.framework/Versions/3.4 \
+	--with-python-numpy-dir=/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/numpy \
+	--with-fortran-lib="/usr/local/Cellar/gcc/11.3.0/lib/gcc/11/libgfortran.a /usr/local/Cellar/gcc/11.3.0/lib/gcc/11/libquadmath.a /usr/local/Cellar/gcc/11.3.0/lib/gcc/11/gcc/x86_64-apple-darwin15/11/libgcc.a" \
+	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
+	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
+	--with-blas-lapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-metis-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-parmetis-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-scalapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-mumps-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-hdf5-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-petsc-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-gsl-dir=${ISSM_DIR}/externalpackages/gsl/install \
+	--with-boost-dir=${ISSM_DIR}/externalpackages/boost/install \
+	--with-dakota-dir=${ISSM_DIR}/externalpackages/dakota/install \
+	--with-proj-dir=${ISSM_DIR}/externalpackages/proj/install \
+	--with-triangle-dir=${ISSM_DIR}/externalpackages/triangle/install \
+	--with-chaco-dir=${ISSM_DIR}/externalpackages/chaco/install \
+	--with-m1qn3-dir=${ISSM_DIR}/externalpackages/m1qn3/install \
+	--with-semic-dir=${ISSM_DIR}/externalpackages/semic/install \
+'
+
+#-------------------#
+# External Packages #
+#-------------------#
+
+EXTERNALPACKAGES="
+	autotools	install-mac.sh
+	cmake		install.sh
+	petsc		install-3.12-mac-static.sh
+	gsl			install-static.sh
+	boost		install-1.7-mac-static.sh
+	dakota		install-6.2-mac-static.sh
+	curl		install-7-mac-static.sh
+	netcdf		install-4.7-parallel-static.sh
+	proj		install-6-static.sh
+	gdal		install-3-python-static.sh
+	gshhg		install.sh
+	gmt			install-6-mac-static.sh
+	gmsh		install-4-static.sh
+	triangle	install-mac-static.sh
+	chaco		install.sh
+	m1qn3		install.sh
+	semic		install.sh
+	shell2junit	install.sh
+"
+
+#---------#
+# Testing #
+#---------#
+
+# Test suites
+MATLAB_TEST=0
+PYTHON_TEST=0
+JAVASCRIPT_TEST=0
+EXAMPLES_TEST=0
+
+# Number of CPUs used in ISSM compilation
+#
+# NOTE: One is usually safer as some packages are very sensitive to parallel
+# 		compilation
+#
+NUMCPUS_INSTALL=8
+
+# Number of CPUs used in the nightly runs
+NUMCPUS_RUN=1
+
+# Nightly run options
+#
+# See documentation in test/NightlyRun/runme.* for more information.
+#
+PYTHON_NROPTIONS=""
+MATLAB_NROPTIONS=""
Index: /issm/trunk/jenkins/pine_island-mac-dakota
===================================================================
--- /issm/trunk/jenkins/pine_island-mac-dakota	(revision 27034)
+++ /issm/trunk/jenkins/pine_island-mac-dakota	(revision 27035)
@@ -18,5 +18,5 @@
 	--with-python-dir=/System/Library/Frameworks/Python.framework/Versions/2.7 \
 	--with-python-numpy-dir=/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy \
-	--with-fortran-lib="-L/usr/local/Cellar/gcc/10.3.0/lib/gcc/10 -lgfortran" \
+	--with-fortran-lib="-L/usr/local/Cellar/gcc/11.3.0/lib/gcc/11 -lgfortran" \
 	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
 	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
Index: /issm/trunk/jenkins/pine_island-mac-examples
===================================================================
--- /issm/trunk/jenkins/pine_island-mac-examples	(revision 27034)
+++ /issm/trunk/jenkins/pine_island-mac-examples	(revision 27035)
@@ -20,5 +20,5 @@
 	--with-python-dir=/System/Library/Frameworks/Python.framework/Versions/2.7 \
 	--with-python-numpy-dir=/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy \
-	--with-fortran-lib="-L/usr/local/Cellar/gcc/10.3.0/lib/gcc/10 -lgfortran" \
+	--with-fortran-lib="-L/usr/local/Cellar/gcc/11.3.0/lib/gcc/11 -lgfortran" \
 	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
 	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
Index: /issm/trunk/jenkins/pine_island-mac-full
===================================================================
--- /issm/trunk/jenkins/pine_island-mac-full	(revision 27034)
+++ /issm/trunk/jenkins/pine_island-mac-full	(revision 27035)
@@ -17,5 +17,5 @@
 	--with-python-dir=/System/Library/Frameworks/Python.framework/Versions/2.7 \
 	--with-python-numpy-dir=/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy \
-	--with-fortran-lib="-L/usr/local/Cellar/gcc/10.3.0/lib/gcc/10 -lgfortran" \
+	--with-fortran-lib="-L/usr/local/Cellar/gcc/11.3.0/lib/gcc/11 -lgfortran" \
 	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
 	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
@@ -50,5 +50,5 @@
 	curl		install-7-mac.sh
 	netcdf		install-4.7-parallel.sh
-	proj		install-8.sh
+	proj		install-6.sh
 	gdal		install-3-python.sh
 	gshhg		install.sh
Index: /issm/trunk/jenkins/pine_island-mac-full-valgrind
===================================================================
--- /issm/trunk/jenkins/pine_island-mac-full-valgrind	(revision 27034)
+++ /issm/trunk/jenkins/pine_island-mac-full-valgrind	(revision 27035)
@@ -17,5 +17,5 @@
 	--with-python-dir=/System/Library/Frameworks/Python.framework/Versions/2.7 \
 	--with-python-numpy-dir=/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy \
-	--with-fortran-lib="-L/usr/local/Cellar/gcc/10.3.0/lib/gcc/10 -lgfortran" \
+	--with-fortran-lib="-L/usr/local/Cellar/gcc/11.3.0/lib/gcc/11 -lgfortran" \
 	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
 	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
@@ -50,5 +50,5 @@
 	curl		install-7-mac.sh
 	netcdf		install-4.7-parallel.sh
-	proj		install-8.sh
+	proj		install-6.sh
 	gdal		install-3-python.sh
 	gshhg		install.sh
Index: sm/trunk/jenkins/pine_island-mac-python
===================================================================
--- /issm/trunk/jenkins/pine_island-mac-python	(revision 27034)
+++ 	(revision )
@@ -1,90 +1,0 @@
-#--------------------#
-# ISSM Configuration #
-#--------------------#
-
-ISSM_CONFIG='\
-	--prefix=${ISSM_DIR} \
-	--disable-static \
-	--enable-development \
-	--enable-debugging \
-	--with-numthreads=4 \
-	--with-python-dir=/System/Library/Frameworks/Python.framework/Versions/2.7 \
-	--with-python-numpy-dir=/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy \
-	--with-fortran-lib="-L/usr/local/Cellar/gcc/10.3.0/lib/gcc/10 -lgfortran" \
-	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
-	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
-	--with-blas-lapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-metis-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-parmetis-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-scalapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-mumps-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-hdf5-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-petsc-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-gsl-dir=${ISSM_DIR}/externalpackages/gsl/install \
-	--with-boost-dir=${ISSM_DIR}/externalpackages/boost/install \
-	--with-dakota-dir=${ISSM_DIR}/externalpackages/dakota/install \
-	--with-proj-dir=${ISSM_DIR}/externalpackages/proj/install \
-	--with-triangle-dir=${ISSM_DIR}/externalpackages/triangle/install \
-	--with-chaco-dir=${ISSM_DIR}/externalpackages/chaco/install \
-	--with-m1qn3-dir=${ISSM_DIR}/externalpackages/m1qn3/install \
-	--with-semic-dir=${ISSM_DIR}/externalpackages/semic/install \
-'
-
-#-------------------#
-# External Packages #
-#-------------------#
-
-# List of external pakages to be installed and their installation scripts
-EXTERNALPACKAGES="
-	autotools	install-mac.sh
-	cmake		install.sh
-	petsc		install-3.12-mac.sh
-	gsl			install.sh
-	boost		install-1.7-mac.sh
-	dakota		install-6.2-mac.sh
-	curl		install-7-mac.sh
-	netcdf		install-4.7-parallel.sh
-	proj		install-8.sh
-	gdal		install-3-python.sh
-	gshhg		install.sh
-	gmt			install-6-mac.sh
-	gmsh		install-4.sh
-	triangle	install-mac.sh
-	chaco		install.sh
-	m1qn3		install.sh
-	semic		install.sh
-	shell2junit	install.sh
-"
-
-#---------#
-# Testing #
-#---------#
-
-# Test suites
-MATLAB_TEST=0
-PYTHON_TEST=1
-JAVASCRIPT_TEST=0
-EXAMPLES_TEST=0
-
-# Number of CPUs used in ISSM compilation
-#
-# NOTE: One is usually safer as some packages are very sensitive to parallel
-# 		compilation
-#
-NUMCPUS_INSTALL=4
-
-# Number of CPUs used in the nightly runs
-NUMCPUS_RUN=2
-
-# Nightly run options
-#
-# See documentation in test/NightlyRun/runme.* for more information.
-#
-# NOTE:
-# - Errors are large for tests 234 418 and 420 under Python
-# - See test417.py for why it is excluded
-# - Test 444 fails intermittently under Python with "IndexError: list index out of range"
-# - Tests 701, 702, and 703 are skipped because they use full Stokes equations
-#
-MATLAB_NROPTIONS=""
-PYTHON_NROPTIONS="--exclude 234 417 418 420 435 444 445 701 702 703"
Index: /issm/trunk/jenkins/pine_island-mac-solid_earth
===================================================================
--- /issm/trunk/jenkins/pine_island-mac-solid_earth	(revision 27034)
+++ /issm/trunk/jenkins/pine_island-mac-solid_earth	(revision 27035)
@@ -18,5 +18,5 @@
 	--with-python-dir=/System/Library/Frameworks/Python.framework/Versions/2.7 \
 	--with-python-numpy-dir=/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy \
-	--with-fortran-lib="-L/usr/local/Cellar/gcc/10.3.0/lib/gcc/10 -lgfortran" \
+	--with-fortran-lib="-L/usr/local/Cellar/gcc/11.3.0/lib/gcc/11 -lgfortran" \
 	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
 	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
@@ -90,5 +90,7 @@
 # NOTE:
 # - Excluding 2006 until it can be debugged (file I/O)
+# - Excluding 2012 until it can be looked at by Eric ("FindParam error message: Parameter HydrologyModel not set")
+# - Excluding 2091 until it can be debugged (resource starvation)
 #
-MATLAB_NROPTIONS="'benchmark','slc','exclude',[2004 2006 2051 2052 2053 2084 2085 2424 2425]"
-PYTHON_NROPTIONS="--benchmark slc --exclude 2004 2006 2051 2052 2053 2084 2085 2424 2425"
+MATLAB_NROPTIONS="'benchmark','slc','exclude',[2004 2006 2012 2051 2052 2053 2085 2091 2424 2425]"
+PYTHON_NROPTIONS="--benchmark slc --exclude 2004 2006 2012 2051 2052 2053 2085 2091 2424 2425"
Index: /issm/trunk/jenkins/pine_island-mac-solid_earth-lambert
===================================================================
--- /issm/trunk/jenkins/pine_island-mac-solid_earth-lambert	(revision 27034)
+++ /issm/trunk/jenkins/pine_island-mac-solid_earth-lambert	(revision 27035)
@@ -18,5 +18,5 @@
 	--with-python-dir=/System/Library/Frameworks/Python.framework/Versions/2.7 \
 	--with-python-numpy-dir=/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy \
-	--with-fortran-lib="-L/usr/local/Cellar/gcc/10.3.0/lib/gcc/10 -lgfortran" \
+	--with-fortran-lib="-L/usr/local/Cellar/gcc/11.3.0/lib/gcc/11 -lgfortran" \
 	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
 	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
@@ -90,5 +90,6 @@
 # NOTE:
 # - Excluding 2006 until it can be debugged (file I/O)
+# - Excluding 2091 until it can be debugged (resource starvation)
 #
-MATLAB_NROPTIONS="'benchmark','slc','exclude',[2006]"
-PYTHON_NROPTIONS="--benchmark slc --exclude 2005 2006"
+MATLAB_NROPTIONS="'benchmark','slc','exclude',[2006 2091]"
+PYTHON_NROPTIONS="--benchmark slc --exclude 2006 2091"
Index: /issm/trunk/jenkins/pleiades-dakota
===================================================================
--- /issm/trunk/jenkins/pleiades-dakota	(revision 27035)
+++ /issm/trunk/jenkins/pleiades-dakota	(revision 27035)
@@ -0,0 +1,67 @@
+#--------------------#
+# ISSM Configuration #
+#--------------------#
+
+ISSM_CONFIG='\
+	--prefix=$ISSM_DIR \
+	--enable-development \
+	--enable-standalone-libraries \
+	--with-wrappers=no \
+	--with-vendor="intel-pleiades-mpi" \
+	--with-cxxoptflags="-O3 " \
+	--with-petsc-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-m1qn3-dir="${ISSM_DIR}/externalpackages/m1qn3/install" \
+	--with-boost-dir="${ISSM_DIR}/externalpackages/boost/install" \
+	--with-dakota-dir="${ISSM_DIR}/externalpackages/dakota/install" \
+	--with-gsl-dir=${ISSM_DIR}/externalpackages/gsl/install \
+	--with-mpi-include=" " \
+	--with-mpi-libflags=" -lmpi" \
+	--with-mkl-libflags="-L/nasa/intel/Compiler/2018.3.222/compilers_and_libraries_2018.3.222/linux/mkl/lib/intel64 -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm" \
+	--with-metis-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-parmetis-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-mumps-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-scalapack-lib="-L/nasa/intel/Compiler/2018.3.222/compilers_and_libraries_2018.3.222/linux/mkl/lib/intel64/libmkl_scalapack_lp64.so" \
+	--with-graphics-lib="/usr/lib64/libX11.so" \
+	--with-fortran-lib="-L/nasa/intel/Compiler/2018.3.222/compilers_and_libraries_2018.3.222/linux/compiler/lib/intel64_lin/ -lifcore -lifport -lgfortran" \
+'
+
+#-------------------#
+# External Packages #
+#-------------------#
+
+# NOTE: Python 3 is installed only as a build system for GSL
+EXTERNALPACKAGES="
+	python	install-3-linux.sh
+	petsc	install-3.14-pleiades.sh
+	gsl		install-pleiades.sh
+	boost	install-1.55-pleiades.sh
+	dakota	install-6.2-pleiades.sh
+	m1qn3	install.sh
+"
+
+#---------#
+# Testing #
+#---------#
+
+# Test suites
+MATLAB_TEST=0
+PYTHON_TEST=0
+JAVASCRIPT_TEST=0
+EXAMPLES_TEST=0
+
+# Number of CPUs used in ISSM compilation
+#
+# NOTE: One is usually safer as some packages are very sensitive to parallel
+# 		compilation.
+#
+NUMCPUS_INSTALL=8
+
+# Number of CPUs used in the nightly runs
+NUMCPUS_RUN=1
+
+# Nightly run options
+#
+# See documentation in test/NightlyRun/runme.* for more information.
+#
+MATLAB_NROPTIONS=""
+PYTHON_NROPTIONS=""
Index: /issm/trunk/jenkins/pleiades-solid_earth
===================================================================
--- /issm/trunk/jenkins/pleiades-solid_earth	(revision 27035)
+++ /issm/trunk/jenkins/pleiades-solid_earth	(revision 27035)
@@ -0,0 +1,83 @@
+#--------------------#
+# ISSM Configuration #
+#--------------------#
+
+ISSM_CONFIG='\
+	--prefix=$ISSM_DIR \
+	--enable-development \
+	--enable-standalone-libraries \
+	--with-wrappers=no \
+	--with-vendor="intel-pleiades-mpi" \
+	--with-cxxoptflags="-O3 " \
+	--with-petsc-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-m1qn3-dir="${ISSM_DIR}/externalpackages/m1qn3/install" \
+	--with-boost-dir="${ISSM_DIR}/externalpackages/boost/install" \
+	--with-dakota-dir="${ISSM_DIR}/externalpackages/dakota/install" \
+	--with-gsl-dir=${ISSM_DIR}/externalpackages/gsl/install \
+	--with-mpi-include=" " \
+	--with-mpi-libflags=" -lmpi" \
+	--with-mkl-libflags="-L/nasa/intel/Compiler/2018.3.222/compilers_and_libraries_2018.3.222/linux/mkl/lib/intel64 -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm" \
+	--with-metis-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-parmetis-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-mumps-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-scalapack-lib="-L/nasa/intel/Compiler/2018.3.222/compilers_and_libraries_2018.3.222/linux/mkl/lib/intel64/libmkl_scalapack_lp64.so" \
+	--with-graphics-lib="/usr/lib64/libX11.so" \
+	--with-fortran-lib="-L/nasa/intel/Compiler/2018.3.222/compilers_and_libraries_2018.3.222/linux/compiler/lib/intel64_lin/ -lifcore -lifport -lgfortran" \
+'
+
+#-------------------#
+# External Packages #
+#-------------------#
+
+# NOTE:
+# - Python 3 is installed only as a build system for GSL
+# - shell2junit is included to run test suites via jenkins.sh
+#
+EXTERNALPACKAGES="
+	python		install-3-linux.sh
+	petsc		install-3.14-pleiades.sh
+	zlib		install-1.sh
+	hdf5		install-1-parallel.sh
+	gsl			install-pleiades.sh
+	boost		install-1.55-pleiades.sh
+	dakota		install-6.2-pleiades.sh
+	curl		install-7-linux.sh
+	netcdf		install-4.7-parallel.sh
+	sqlite		install.sh
+	proj		install-6.sh
+	gdal		install-3.sh
+	gshhg		install.sh
+	gmt			install-6-linux.sh
+	gmsh		install-4.sh
+	triangle	install-linux.sh
+	chaco		install.sh
+	m1qn3		install.sh
+	semic		install.sh
+"
+
+#---------#
+# Testing #
+#---------#
+
+# Test suites
+MATLAB_TEST=0
+PYTHON_TEST=0
+JAVASCRIPT_TEST=0
+EXAMPLES_TEST=0
+
+# Number of CPUs used in ISSM compilation
+#
+# NOTE: One is usually safer as some packages are very sensitive to parallel
+# 		compilation.
+#
+NUMCPUS_INSTALL=8
+
+# Number of CPUs used in the nightly runs
+NUMCPUS_RUN=1
+
+# Nightly run options
+#
+# See documentation in test/NightlyRun/runme.* for more information.
+#
+MATLAB_NROPTIONS=""
+PYTHON_NROPTIONS=""
Index: /issm/trunk/jenkins/ross-debian_linux-binaries-matlab
===================================================================
--- /issm/trunk/jenkins/ross-debian_linux-binaries-matlab	(revision 27034)
+++ /issm/trunk/jenkins/ross-debian_linux-binaries-matlab	(revision 27035)
@@ -50,5 +50,5 @@
 	curl		install-7-linux-static.sh
 	netcdf		install-4.7-parallel-static.sh
-	proj		install-8-static.sh
+	proj		install-6-static.sh
 	gdal		install-3-static.sh
 	gshhg		install.sh
Index: sm/trunk/jenkins/ross-debian_linux-binaries-python
===================================================================
--- /issm/trunk/jenkins/ross-debian_linux-binaries-python	(revision 27034)
+++ 	(revision )
@@ -1,89 +1,0 @@
-#--------------------#
-# ISSM Configuration #
-#--------------------#
-
-# NOTE:
-# - We can disable dependency tracking in the Autotools because the binaries
-#	should always be a one-time build.
-# - libgfortran will not be available in $ISSM_DIR/lib at compile time: it is
-#	copied by packaging script.
-#
-ISSM_CONFIG='\
-	--prefix=${ISSM_DIR} \
-	--enable-standalone-executables \
-	--enable-standalone-modules \
-	--enable-standalone-libraries \
-	--disable-dependency-tracking \
-	--with-pic \
-	--with-python-dir=/usr \
-	--with-python-numpy-dir=/usr/local/lib/python2.7/dist-packages/numpy \
-	--with-fortran-lib="-L${ISSM_DIR}/lib -lgfortran" \
-	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
-	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
-	--with-blas-lapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-metis-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-parmetis-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-scalapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-mumps-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-hdf5-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-petsc-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-gsl-dir=${ISSM_DIR}/externalpackages/gsl/install \
-	--with-boost-dir=${ISSM_DIR}/externalpackages/boost/install \
-	--with-dakota-dir=${ISSM_DIR}/externalpackages/dakota/install \
-	--with-proj-dir=${ISSM_DIR}/externalpackages/proj/install \
-	--with-triangle-dir=${ISSM_DIR}/externalpackages/triangle/install \
-	--with-chaco-dir=${ISSM_DIR}/externalpackages/chaco/install \
-	--with-m1qn3-dir=${ISSM_DIR}/externalpackages/m1qn3/install \
-	--with-semic-dir=${ISSM_DIR}/externalpackages/semic/install \
-'
-#-------------------#
-# External Packages #
-#-------------------#
-
-EXTERNALPACKAGES="
-	autotools	install-linux.sh
-	cmake		install.sh
-	petsc		install-3.12-linux-static.sh
-	gsl			install-static.sh
-	boost		install-1.7-linux-static.sh
-	dakota		install-6.2-linux-static.sh
-	curl		install-7-linux-static.sh
-	netcdf		install-4.7-parallel-static.sh
-	proj		install-8-static.sh
-	gdal		install-3-python-static.sh
-	gshhg		install.sh
-	gmt			install-6-linux-static.sh
-	gmsh		install-4-static.sh
-	triangle	install-linux-static.sh
-	chaco		install.sh
-	m1qn3		install.sh
-	semic		install.sh
-	shell2junit	install.sh
-"
-
-#---------#
-# Testing #
-#---------#
-
-# Test suites
-MATLAB_TEST=0
-PYTHON_TEST=0
-JAVASCRIPT_TEST=0
-EXAMPLES_TEST=0
-
-# Number of CPUs used in ISSM compilation
-#
-# NOTE: One is usually safer as some packages are very sensitive to parallel
-# 		compilation.
-#
-NUMCPUS_INSTALL=8
-
-# Number of CPUs used in the nightly runs
-NUMCPUS_RUN=1
-
-# Nightly run options
-#
-# See documentation in test/NightlyRun/runme.* for more information.
-#
-MATLAB_NROPTIONS=""
-PYTHON_NROPTIONS=""
Index: /issm/trunk/jenkins/ross-debian_linux-binaries-python-2
===================================================================
--- /issm/trunk/jenkins/ross-debian_linux-binaries-python-2	(revision 27035)
+++ /issm/trunk/jenkins/ross-debian_linux-binaries-python-2	(revision 27035)
@@ -0,0 +1,89 @@
+#--------------------#
+# ISSM Configuration #
+#--------------------#
+
+# NOTE:
+# - We can disable dependency tracking in the Autotools because the binaries
+#	should always be a one-time build.
+# - libgfortran will not be available in $ISSM_DIR/lib at compile time: it is
+#	copied by packaging script.
+#
+ISSM_CONFIG='\
+	--prefix=${ISSM_DIR} \
+	--enable-standalone-executables \
+	--enable-standalone-modules \
+	--enable-standalone-libraries \
+	--disable-dependency-tracking \
+	--with-pic \
+	--with-python-dir=/usr \
+	--with-python-numpy-dir=/usr/local/lib/python2.7/dist-packages/numpy \
+	--with-fortran-lib="-L${ISSM_DIR}/lib -lgfortran" \
+	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
+	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
+	--with-blas-lapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-metis-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-parmetis-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-scalapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-mumps-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-hdf5-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-petsc-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-gsl-dir=${ISSM_DIR}/externalpackages/gsl/install \
+	--with-boost-dir=${ISSM_DIR}/externalpackages/boost/install \
+	--with-dakota-dir=${ISSM_DIR}/externalpackages/dakota/install \
+	--with-proj-dir=${ISSM_DIR}/externalpackages/proj/install \
+	--with-triangle-dir=${ISSM_DIR}/externalpackages/triangle/install \
+	--with-chaco-dir=${ISSM_DIR}/externalpackages/chaco/install \
+	--with-m1qn3-dir=${ISSM_DIR}/externalpackages/m1qn3/install \
+	--with-semic-dir=${ISSM_DIR}/externalpackages/semic/install \
+'
+#-------------------#
+# External Packages #
+#-------------------#
+
+EXTERNALPACKAGES="
+	autotools	install-linux.sh
+	cmake		install.sh
+	petsc		install-3.12-linux-static.sh
+	gsl			install-static.sh
+	boost		install-1.7-linux-static.sh
+	dakota		install-6.2-linux-static.sh
+	curl		install-7-linux-static.sh
+	netcdf		install-4.7-parallel-static.sh
+	proj		install-6-static.sh
+	gdal		install-3-python-static.sh
+	gshhg		install.sh
+	gmt			install-6-linux-static.sh
+	gmsh		install-4-static.sh
+	triangle	install-linux-static.sh
+	chaco		install.sh
+	m1qn3		install.sh
+	semic		install.sh
+	shell2junit	install.sh
+"
+
+#---------#
+# Testing #
+#---------#
+
+# Test suites
+MATLAB_TEST=0
+PYTHON_TEST=0
+JAVASCRIPT_TEST=0
+EXAMPLES_TEST=0
+
+# Number of CPUs used in ISSM compilation
+#
+# NOTE: One is usually safer as some packages are very sensitive to parallel
+# 		compilation.
+#
+NUMCPUS_INSTALL=8
+
+# Number of CPUs used in the nightly runs
+NUMCPUS_RUN=1
+
+# Nightly run options
+#
+# See documentation in test/NightlyRun/runme.* for more information.
+#
+MATLAB_NROPTIONS=""
+PYTHON_NROPTIONS=""
Index: /issm/trunk/jenkins/ross-debian_linux-binaries-python-3
===================================================================
--- /issm/trunk/jenkins/ross-debian_linux-binaries-python-3	(revision 27035)
+++ /issm/trunk/jenkins/ross-debian_linux-binaries-python-3	(revision 27035)
@@ -0,0 +1,90 @@
+#--------------------#
+# ISSM Configuration #
+#--------------------#
+
+# NOTE:
+# - We can disable dependency tracking in the Autotools because the binaries
+#	should always be a one-time build.
+# - libgfortran will not be available in $ISSM_DIR/lib at compile time: it is
+#	copied by packaging script.
+#
+ISSM_CONFIG='\
+	--prefix=${ISSM_DIR} \
+	--enable-standalone-executables \
+	--enable-standalone-modules \
+	--enable-standalone-libraries \
+	--disable-dependency-tracking \
+	--with-pic \
+	--with-python-dir=/usr \
+	--with-python-version=3.7 \
+	--with-python-numpy-dir=/usr/local/lib/python3.7/dist-packages/numpy \
+	--with-fortran-lib="-L${ISSM_DIR}/lib -lgfortran" \
+	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
+	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
+	--with-blas-lapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-metis-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-parmetis-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-scalapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-mumps-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-hdf5-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-petsc-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-gsl-dir=${ISSM_DIR}/externalpackages/gsl/install \
+	--with-boost-dir=${ISSM_DIR}/externalpackages/boost/install \
+	--with-dakota-dir=${ISSM_DIR}/externalpackages/dakota/install \
+	--with-proj-dir=${ISSM_DIR}/externalpackages/proj/install \
+	--with-triangle-dir=${ISSM_DIR}/externalpackages/triangle/install \
+	--with-chaco-dir=${ISSM_DIR}/externalpackages/chaco/install \
+	--with-m1qn3-dir=${ISSM_DIR}/externalpackages/m1qn3/install \
+	--with-semic-dir=${ISSM_DIR}/externalpackages/semic/install \
+'
+#-------------------#
+# External Packages #
+#-------------------#
+
+EXTERNALPACKAGES="
+	autotools	install-linux.sh
+	cmake		install.sh
+	petsc		install-3.12-linux-static.sh
+	gsl			install-static.sh
+	boost		install-1.7-linux-static.sh
+	dakota		install-6.2-linux-static.sh
+	curl		install-7-linux-static.sh
+	netcdf		install-4.7-parallel-static.sh
+	proj		install-6-static.sh
+	gdal		install-3-python-static.sh
+	gshhg		install.sh
+	gmt			install-6-linux-static.sh
+	gmsh		install-4-static.sh
+	triangle	install-linux-static.sh
+	chaco		install.sh
+	m1qn3		install.sh
+	semic		install.sh
+	shell2junit	install.sh
+"
+
+#---------#
+# Testing #
+#---------#
+
+# Test suites
+MATLAB_TEST=0
+PYTHON_TEST=0
+JAVASCRIPT_TEST=0
+EXAMPLES_TEST=0
+
+# Number of CPUs used in ISSM compilation
+#
+# NOTE: One is usually safer as some packages are very sensitive to parallel
+# 		compilation.
+#
+NUMCPUS_INSTALL=8
+
+# Number of CPUs used in the nightly runs
+NUMCPUS_RUN=1
+
+# Nightly run options
+#
+# See documentation in test/NightlyRun/runme.* for more information.
+#
+MATLAB_NROPTIONS=""
+PYTHON_NROPTIONS=""
Index: /issm/trunk/jenkins/ross-debian_linux-codipack
===================================================================
--- /issm/trunk/jenkins/ross-debian_linux-codipack	(revision 27034)
+++ /issm/trunk/jenkins/ross-debian_linux-codipack	(revision 27035)
@@ -74,4 +74,4 @@
 # See documentation in test/NightlyRun/runme.* for more information.
 #
-MATLAB_NROPTIONS="'benchmark','all','id',[3015,3119,3480,3201,3202]"
+MATLAB_NROPTIONS="'benchmark','all','id',[3015,3119,3480,3201:3205]"
 PYTHON_NROPTIONS="--benchmark='all' -i 3015 3119 3480"
Index: /issm/trunk/jenkins/ross-debian_linux-dakota
===================================================================
--- /issm/trunk/jenkins/ross-debian_linux-dakota	(revision 27034)
+++ /issm/trunk/jenkins/ross-debian_linux-dakota	(revision 27035)
@@ -49,5 +49,5 @@
 	curl			install-7-linux.sh
 	netcdf			install-4.7-parallel.sh
-	proj			install-8.sh
+	proj			install-6.sh
 	gdal			install-3-python.sh
 	gshhg			install.sh
Index: /issm/trunk/jenkins/ross-debian_linux-full
===================================================================
--- /issm/trunk/jenkins/ross-debian_linux-full	(revision 27034)
+++ /issm/trunk/jenkins/ross-debian_linux-full	(revision 27035)
@@ -18,21 +18,21 @@
 	--with-python-numpy-dir=/usr/local/lib/python2.7/dist-packages/numpy \
 	--with-fortran-lib="-L/usr/lib/x86_64-linux-gnu -lgfortran" \
-	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
+	--with-mpi-include="${ISSM_DIR}/externalpackages/petsc/install/include" \
 	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
-	--with-blas-lapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-metis-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-parmetis-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-scalapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-mumps-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-hdf5-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-petsc-dir=${ISSM_DIR}/externalpackages/petsc/install \
-	--with-gsl-dir=${ISSM_DIR}/externalpackages/gsl/install \
-	--with-boost-dir=${ISSM_DIR}/externalpackages/boost/install \
-	--with-dakota-dir=${ISSM_DIR}/externalpackages/dakota/install \
-	--with-proj-dir=${ISSM_DIR}/externalpackages/proj/install \
-	--with-triangle-dir=${ISSM_DIR}/externalpackages/triangle/install \
-	--with-chaco-dir=${ISSM_DIR}/externalpackages/chaco/install \
-	--with-m1qn3-dir=${ISSM_DIR}/externalpackages/m1qn3/install \
-	--with-semic-dir=${ISSM_DIR}/externalpackages/semic/install \
+	--with-blas-lapack-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-metis-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-parmetis-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-scalapack-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-mumps-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-hdf5-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-petsc-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-gsl-dir="${ISSM_DIR}/externalpackages/gsl/install" \
+	--with-boost-dir="${ISSM_DIR}/externalpackages/boost/install" \
+	--with-dakota-dir="${ISSM_DIR}/externalpackages/dakota/install" \
+	--with-proj-dir="${ISSM_DIR}/externalpackages/proj/install" \
+	--with-triangle-dir="${ISSM_DIR}/externalpackages/triangle/install" \
+	--with-chaco-dir="${ISSM_DIR}/externalpackages/chaco/install" \
+	--with-m1qn3-dir="${ISSM_DIR}/externalpackages/m1qn3/install" \
+	--with-semic-dir="${ISSM_DIR}/externalpackages/semic/install" \
 '
 
@@ -50,5 +50,5 @@
 	curl		install-7-linux.sh
 	netcdf		install-4.7-parallel.sh
-	proj		install-8.sh
+	proj		install-6.sh
 	gdal		install-3-python.sh
 	gshhg		install.sh
Index: /issm/trunk/jenkins/ross-debian_linux-full-mplapack
===================================================================
--- /issm/trunk/jenkins/ross-debian_linux-full-mplapack	(revision 27035)
+++ /issm/trunk/jenkins/ross-debian_linux-full-mplapack	(revision 27035)
@@ -0,0 +1,89 @@
+# NOTE: This configuration adds solid earth and Dakota capabilities to the 
+#		basic build.
+
+#--------------------#
+# ISSM Configuration #
+#--------------------#
+
+MATLAB_PATH="/usr/local/MATLAB/R2019b"
+
+ISSM_CONFIG='\
+	--prefix=${ISSM_DIR} \
+	--disable-static \
+	--enable-development \
+	--enable-debugging \
+	--with-cxxoptflags="-g -O2 -fPIC -std=gnu++11" \
+	--with-numthreads=4 \
+	--with-matlab-dir=${MATLAB_PATH} \
+	--with-python-dir=/usr \
+	--with-python-numpy-dir=/usr/local/lib/python2.7/dist-packages/numpy \
+	--with-fortran-lib="-L/usr/lib/x86_64-linux-gnu -lgfortran" \
+	--with-mpi-include="${ISSM_DIR}/externalpackages/petsc/install/include" \
+	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
+	--with-blas-lapack-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-metis-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-parmetis-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-scalapack-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-mumps-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-hdf5-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-petsc-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-mplapack-dir="${ISSM_DIR}/externalpackages/mplapack/install" \
+	--with-gsl-dir="${ISSM_DIR}/externalpackages/gsl/install" \
+	--with-boost-dir="${ISSM_DIR}/externalpackages/boost/install" \
+	--with-dakota-dir="${ISSM_DIR}/externalpackages/dakota/install" \
+	--with-proj-dir="${ISSM_DIR}/externalpackages/proj/install" \
+	--with-triangle-dir="${ISSM_DIR}/externalpackages/triangle/install" \
+	--with-chaco-dir="${ISSM_DIR}/externalpackages/chaco/install" \
+	--with-m1qn3-dir="${ISSM_DIR}/externalpackages/m1qn3/install" \
+	--with-semic-dir="${ISSM_DIR}/externalpackages/semic/install" \
+'
+
+#-------------------#
+# External Packages #
+#-------------------#
+
+EXTERNALPACKAGES="
+	autotools	install-linux.sh
+	cmake		install.sh
+	petsc		install-3.12-linux.sh
+	mplapack	install-1-linux.sh
+	gsl			install.sh
+	boost		install-1.7-linux.sh
+	dakota		install-6.2-linux.sh
+	curl		install-7-linux.sh
+	netcdf		install-4.7-parallel.sh
+	proj		install-6.sh
+	gdal		install-3-python.sh
+	gshhg		install.sh
+	gmt			install-6-linux.sh
+	gmsh		install-4.sh
+	triangle	install-linux.sh
+	chaco		install.sh
+	m1qn3		install.sh
+	semic		install.sh
+	shell2junit	install.sh
+"
+
+#---------#
+# Testing #
+#---------#
+
+# Test suites
+MATLAB_TEST=0
+PYTHON_TEST=0
+JAVASCRIPT_TEST=0
+EXAMPLES_TEST=0
+
+# Number of CPUs used in ISSM compilation
+#
+# NOTE: One is usually safer as some packages are very sensitive to parallel
+# 		compilation
+#
+NUMCPUS_INSTALL=8
+
+# Number of CPUs used in the nightly runs
+NUMCPUS_RUN=1
+
+# Nightly run options
+MATLAB_NROPTIONS=""
+PYTHON_NROPTIONS=""
Index: /issm/trunk/jenkins/ross-debian_linux-full-valgrind
===================================================================
--- /issm/trunk/jenkins/ross-debian_linux-full-valgrind	(revision 27034)
+++ /issm/trunk/jenkins/ross-debian_linux-full-valgrind	(revision 27035)
@@ -50,5 +50,5 @@
 	curl		install-7-linux.sh
 	netcdf		install-4.7-parallel.sh
-	proj		install-8.sh
+	proj		install-6.sh
 	gdal		install-3-python.sh
 	gshhg		install.sh
Index: /issm/trunk/jenkins/ross-debian_linux-python
===================================================================
--- /issm/trunk/jenkins/ross-debian_linux-python	(revision 27034)
+++ /issm/trunk/jenkins/ross-debian_linux-python	(revision 27035)
@@ -10,5 +10,6 @@
 	--with-numthreads=4 \
 	--with-python-dir=/usr \
-	--with-python-numpy-dir=/usr/local/lib/python2.7/dist-packages/numpy \
+	--with-python-version=3.7 \
+	--with-python-numpy-dir=/usr/local/lib/python3.7/dist-packages/numpy \
 	--with-fortran-lib="-L/usr/lib/x86_64-linux-gnu -lgfortran" \
 	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
@@ -44,5 +45,5 @@
 	curl		install-7-linux.sh
 	netcdf		install-4.7-parallel.sh
-	proj		install-8.sh
+	proj		install-6.sh
 	gdal		install-3-python.sh
 	gshhg		install.sh
Index: /issm/trunk/jenkins/ross-debian_linux-solid_earth
===================================================================
--- /issm/trunk/jenkins/ross-debian_linux-solid_earth	(revision 27034)
+++ /issm/trunk/jenkins/ross-debian_linux-solid_earth	(revision 27035)
@@ -47,5 +47,5 @@
 	curl			install-7-linux.sh
 	netcdf			install-4.7-parallel.sh
-	proj			install-8.sh
+	proj			install-6.sh
 	gdal			install-3-python.sh
 	gshhg			install.sh
@@ -88,8 +88,6 @@
 # NOTE:
 # - Excluding 2006 until it can be debugged (PETSc crash)
-# - Tests 2002, 2003, 2005, 2008, 2010, 2011, 2021, 2090, and 2101, are 
-#   excluded as Gmsh produces different meshes on macOS and Linux for (archives 
-#   are generated on macOS).
+# - Excluding 2012 until it can be looked at by Eric ("FindParam error message: Parameter HydrologyModel not set")
 #
-MATLAB_NROPTIONS="'benchmark','slc','exclude',[2002 2003 2004 2005 2006 2007 2008 2010 2011 2021 2051 2052 2053 2084 2085 2090 2101 2424 2425]"
-PYTHON_NROPTIONS="--benchmark slc --exclude 2002 2003 2004 2005 2006 2007 2008 2010 2011 2021 2051 2052 2053 2084 2085 2090 2101 2424 2425"
+MATLAB_NROPTIONS="'benchmark','slc','exclude',[2004 2006 2012 2021 2051 2052 2053 2085 2090 2101 2424 2425]"
+PYTHON_NROPTIONS="--benchmark slc --exclude 2004 2006 2012 2021 2051 2052 2053 2085 2090 2101 2424 2425"
Index: /issm/trunk/jenkins/ross-win-msys2-mingw-msmpi-basic
===================================================================
--- /issm/trunk/jenkins/ross-win-msys2-mingw-msmpi-basic	(revision 27034)
+++ /issm/trunk/jenkins/ross-win-msys2-mingw-msmpi-basic	(revision 27035)
@@ -7,5 +7,5 @@
 	--with-numthreads=4 \
 	--with-vendor="win-msys2" \
-	--with-matlab-dir=${MATLAB_PATH} \
+	--with-matlab-dir="${MATLAB_PATH}" \
 	--with-mpi-include="${MSMPI_ROOT}/include" \
 	--with-mpi-libdir="${MSMPI_ROOT}/lib" \
@@ -15,11 +15,11 @@
 	--with-parmetis-dir="${ISSM_DIR}/externalpackages/petsc/install" \
 	--with-blas-lapack-dir="${ISSM_DIR}/externalpackages/petsc/install" \
-	--with-scalapack-dir=$ISSM_DIR/externalpackages/petsc/install \
-	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
+	--with-scalapack-dir="${ISSM_DIR}/externalpackages/petsc/install" \
+	--with-mumps-dir="${ISSM_DIR}/externalpackages/petsc/install" \
 	--with-petsc-dir="${ISSM_DIR}/externalpackages/petsc/install" \
 	--with-triangle-dir="${ISSM_DIR}/externalpackages/triangle/install" \
-	--with-chaco-dir=${ISSM_DIR}/externalpackages/chaco/install \
-	--with-m1qn3-dir=${ISSM_DIR}/externalpackages/m1qn3/install \
-	--with-semic-dir=${ISSM_DIR}/externalpackages/semic/install \
+	--with-chaco-dir="${ISSM_DIR}/externalpackages/chaco/install" \
+	--with-m1qn3-dir="${ISSM_DIR}/externalpackages/m1qn3/install" \
+	--with-semic-dir="${ISSM_DIR}/externalpackages/semic/install" \
 '
 
Index: /issm/trunk/m4/issm_options.m4
===================================================================
--- /issm/trunk/m4/issm_options.m4	(revision 27034)
+++ /issm/trunk/m4/issm_options.m4	(revision 27035)
@@ -205,10 +205,11 @@
 	AC_MSG_RESULT([${IS_MAC}])
 
-	dnl If macOS, check if system copy of libc has fmemopen (if it is not 
+	dnl If macOS, check if system copy of libc has fmemopen (if it is not
 	dnl macOS, we do not check, but still must set SYSTEM_HAS_FMEMOPEN)
 	AC_MSG_CHECKING([if system copy of libc has fmemopen])
 	SYSTEM_FMEMOPEN=1
 	if test "${IS_MAC}" == "yes"; then
-		if [[ $(system_profiler SPSoftwareDataType | grep "System Version:" | sed -e "s/[[:space:]]*System Version: macOS //" | cut -d "." -f 2) -lt 13 ]]; then
+		sys_ver=$(sw_vers -productVersion)
+		if test $(echo ${sys_ver} | cut -d "." -f 1) -eq 10 && test $(echo ${sys_ver} | cut -d "." -f 2) -lt 13; then
 			SYSTEM_FMEMOPEN=0
 		fi
@@ -291,6 +292,6 @@
 			export CFLAGS="-O3 -D_INTEL_LINUX_ -DMPICH_IGNORE_CXX_SEEK"
 		elif test "${VENDOR}" == "intel-discover"; then
-		   export CC=mpicc
-		   export CXX=mpicxx
+			export CC=mpicc
+			export CXX=mpicxx
 			export CXXFLAGS="-O3 -D_INTEL_LINUX_ -DMPICH_IGNORE_CXX_SEEK -std=c++11"
 			export CFLAGS="-O3 -D_INTEL_LINUX_ -DMPICH_IGNORE_CXX_SEEK"
@@ -313,5 +314,5 @@
 			export CC=mpicc
 			export CXX=mpicxx
-			export CXXFLAGS="-O3 -march=corei7-avx -std=c++11"
+			export CXXFLAGS="-O3 -march=corei7-avx -std=c++11 -lirc -lsvml -limf"
 			export CFLAGS="-O3 -march=corei7-avx"
 		elif test "${VENDOR}" == "intel-pleiades-icpc"; then
@@ -603,9 +604,9 @@
 		AC_MSG_CHECKING(for Dakota version)
 		dnl TODO:
-		dnl - Check if this method applies to all other versions of Dakota (it 
-		dnl   should as long as the Dakota binaries have been compiled). If so, 
+		dnl - Check if this method applies to all other versions of Dakota (it
+		dnl   should as long as the Dakota binaries have been compiled). If so,
 		dnl   we can remove the other methods of getting the version.
-		dnl - Modify src/wrappers/IssmConfig/IssmConfig.cpp so that strlen is 
-		dnl   not called with _DAKOTA_VERSION_ as an argument so that we can 
+		dnl - Modify src/wrappers/IssmConfig/IssmConfig.cpp so that strlen is
+		dnl   not called with _DAKOTA_VERSION_ as an argument so that we can
 		dnl   do,
 		dnl
@@ -817,4 +818,6 @@
 		fi
 		AC_MSG_RESULT([found])
+
+		AC_MSG_CHECKING([for Python library libpython])
 		if ls ${PYTHON_ROOT}/lib/x86_64-linux-gnu/libpython${PYTHON_VERSION}m.* 1> /dev/null 2>&1; then
 			PYTHONLIB="-L${PYTHON_ROOT}/lib/x86_64-linux-gnu -lpython${PYTHON_VERSION}m"
@@ -823,7 +826,13 @@
 		elif ls ${PYTHON_ROOT}/lib/libpython${PYTHON_VERSION}m.* 1> /dev/null 2>&1; then
 			PYTHONLIB="-L${PYTHON_ROOT}/lib -lpython${PYTHON_VERSION}m"
+		elif ls ${PYTHON_ROOT}/lib64/libpython${PYTHON_VERSION}m.* 1> /dev/null 2>&1; then
+			PYTHONLIB="-L${PYTHON_ROOT}/lib64 -lpython${PYTHON_VERSION}m"
+		elif ls ${PYTHON_ROOT}/lib/libpython${PYTHON_VERSION}.* 1> /dev/null 2>&1; then
+			PYTHONLIB="-L${PYTHON_ROOT}/lib -lpython${PYTHON_VERSION}"
 		else
-			PYTHONLIB="-L${PYTHON_ROOT}/lib -lpython${PYTHON_VERSION}"
-		fi
+			AC_MSG_ERROR([libpython not found! Please locate this file and contact ISSM developers via forum or email.]);
+		fi
+		AC_MSG_RESULT([found])
+
 		PYTHONEXT=.so
 		case "${host_os}" in
@@ -1774,5 +1783,9 @@
 	if test "x${HAVE_SHAPELIB}" == "xyes"; then
 		SHAPELIBINCL="-I${SHAPELIB_ROOT}/include"
-		SHAPELIBLIB="-L${SHAPELIB_ROOT}/lib -lshape"
+		if test -f "${SHAPELIB_ROOT}/lib/libshp.a"; then
+			SHAPELIBLIB="-L${SHAPELIB_ROOT}/lib -lshp"
+		else
+			SHAPELIBLIB="-L${SHAPELIB_ROOT}/lib -lshape"
+		fi
 		AC_DEFINE([_HAVE_SHAPELIB_], [1], [with shapelib in ISSM src])
 		AC_SUBST([SHAPELIBINCL])
@@ -1974,4 +1987,32 @@
 	fi
 	AC_MSG_RESULT([${HAVE_PLAPACK}])
+	dnl }}}
+	dnl MPLAPACK{{{
+	AC_MSG_CHECKING([for MPLAPACK])
+	AC_ARG_WITH(
+		[mplapack-dir],
+		AS_HELP_STRING([--with-mplapack-dir=DIR], [MPLAPACK root directory]),
+		[MPLAPACK_ROOT=${withval}],
+		[MPLAPACK_ROOT="no"]
+	)
+	if test "x${MPLAPACK_ROOT}" == "xno"; then
+		HAVE_MPLAPACK=no
+	else
+		HAVE_MPLAPACK=yes
+		if ! test -d "${MPLAPACK_ROOT}"; then
+			AC_MSG_ERROR([MPLAPACK directory provided (${MPLAPACK_ROOT}) does not exist!]);
+		fi
+	fi
+	AC_MSG_RESULT([${HAVE_MPLAPACK}])
+
+	dnl MPLAPACK libraries and header files
+	if test "x${HAVE_MPLAPACK}" == "xyes"; then
+		MPLAPACKINCL="-I${MPLAPACK_ROOT}/include/mplapack -I${MPLAPACK_ROOT}/include"
+		MPLAPACKLIB="-L${MPLAPACK_ROOT}/lib -lmpblas__Float128 -lmplapack__Float128 -lgomp -lquadmath"
+		AC_DEFINE([_HAVE_MPLAPACK_], [1], [with MPLAPACK in ISSM src])
+		AC_SUBST([MPLAPACKINCL])
+		AC_SUBST([MPLAPACKLIB])
+	fi
+	AM_CONDITIONAL([MPLAPACK], [test "x${HAVE_MPLAPACK}" == "xyes"])
 	dnl }}}
 	dnl MUMPS{{{
@@ -2567,5 +2608,5 @@
 		AC_MSG_RESULT([${GMSH_VERSION_MAJOR}])
 		AC_DEFINE_UNQUOTED([_GMSH_VERSION_MAJOR_], ${GMSH_VERSION_MAJOR}, [Gmsh major version])
-	fi	
+	fi
 	dnl }}}
 	dnl Capabilities
@@ -2721,5 +2762,5 @@
 	)
 	dnl Check that supplied value is an integer
-	if [[ "${NUMTHREADS_VALUE}" != "${NUMTHREADS_VALUE}" 2> /dev/null ]]; then
+	if test "${NUMTHREADS_VALUE}" != "${NUMTHREADS_VALUE}"; then
 		AC_MSG_ERROR([Number of threads provided (${NUMTHREADS_VALUE}) is not an integer!]);
 	elif test "${NUMTHREADS_VALUE}" == "0"; then
Index: /issm/trunk/packagers/linux/complete-issm-linux-binaries-python-2.sh
===================================================================
--- /issm/trunk/packagers/linux/complete-issm-linux-binaries-python-2.sh	(revision 27035)
+++ /issm/trunk/packagers/linux/complete-issm-linux-binaries-python-2.sh	(revision 27035)
@@ -0,0 +1,94 @@
+#!/bin/bash
+
+################################################################################
+# Wrapper script to build, package, and transfer to ISSM Web site ISSM 
+# distributable package for Linux with Python 2 API.
+#
+# Normally, we would put this directly into the project configuration under 
+# 'Build' -> 'Excute shell', but becasue it is a bit more involved, it is a 
+# good idea to version it.
+#
+# When no failures/errors occur, performs the following:
+# - Builds ISSM according to configuration.
+# - Packages executables and libraries.
+# - Runs test suite against package.
+# - Transmits package to ISSM Web site for distribution.
+#
+# Options:
+# -b/--skipbuild		Skip ISSM compilation.
+# -s/--skiptests		Skip ISSM compilation and testing during packaging 
+#						step. Use if packaging fails for some reason but build 
+#						is valid.
+# -t/--transferonly		Transfer package to ISSM Web site only. Use if transfer 
+#						fails for some reason to skip building, packaging, and 
+#						signing.
+#
+# NOTE:
+# - Use only *one* of the above options at a time, and make sure it is removed 
+#	again after a single run.
+# - Builds will fail when any of the above options are used on a clean 
+#	workspace. For example, if 'Source Code Management' -> 'Check-out Strategy' 
+#	select menu is set to "Always check out a fresh copy".
+################################################################################
+
+## Constants
+#
+PKG="ISSM-Linux-Python-2" # Name of directory to copy distributable files to
+
+COMPRESSED_PKG="${PKG}.tar.gz"
+
+## Environment
+#
+export COMPRESSED_PKG
+export PKG
+
+## Parse options
+#
+if [ $# -gt 1 ]; then
+	echo "Can use only one option at a time"
+	exit 1
+fi
+
+# NOTE: We could do this with binary switching (i.e. 0011 to sign and transfer, 
+#		but the following is self-documenting).
+#
+build=1
+package=1
+transfer=1
+
+if [ $# -eq 1 ]; then
+	case $1 in
+		-b|--skipbuild)		build=0;				shift	;;
+		-s|--skiptests)		build=0;						;;
+		-t|--transferonly)	build=0;	package=0;			;;
+		*) echo "Unknown parameter passed: $1"; exit 1 		;;
+	esac
+fi
+
+# Build
+if [ ${build} -eq 1 ]; then
+	./jenkins/jenkins.sh ./jenkins/ross-debian_linux-binaries-python-2
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
+# Package
+if [ ${package} -eq 1 ]; then
+	./packagers/linux/package-issm-linux-binaries-python-2.sh $1
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
+# Transfer distributable package to ISSM Web site
+if [ ${transfer} -eq 1 ]; then
+	./packagers/linux/transfer-issm-linux-binaries.sh
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
Index: /issm/trunk/packagers/linux/complete-issm-linux-binaries-python-3.sh
===================================================================
--- /issm/trunk/packagers/linux/complete-issm-linux-binaries-python-3.sh	(revision 27035)
+++ /issm/trunk/packagers/linux/complete-issm-linux-binaries-python-3.sh	(revision 27035)
@@ -0,0 +1,94 @@
+#!/bin/bash
+
+################################################################################
+# Wrapper script to build, package, and transfer to ISSM Web site ISSM 
+# distributable package for Linux with Python 3 API.
+#
+# Normally, we would put this directly into the project configuration under 
+# 'Build' -> 'Excute shell', but becasue it is a bit more involved, it is a 
+# good idea to version it.
+#
+# When no failures/errors occur, performs the following:
+# - Builds ISSM according to configuration.
+# - Packages executables and libraries.
+# - Runs test suite against package.
+# - Transmits package to ISSM Web site for distribution.
+#
+# Options:
+# -b/--skipbuild		Skip ISSM compilation.
+# -s/--skiptests		Skip ISSM compilation and testing during packaging 
+#						step. Use if packaging fails for some reason but build 
+#						is valid.
+# -t/--transferonly		Transfer package to ISSM Web site only. Use if transfer 
+#						fails for some reason to skip building, packaging, and 
+#						signing.
+#
+# NOTE:
+# - Use only *one* of the above options at a time, and make sure it is removed 
+#	again after a single run.
+# - Builds will fail when any of the above options are used on a clean 
+#	workspace. For example, if 'Source Code Management' -> 'Check-out Strategy' 
+#	select menu is set to "Always check out a fresh copy".
+################################################################################
+
+## Constants
+#
+PKG="ISSM-Linux-Python-3" # Name of directory to copy distributable files to
+
+COMPRESSED_PKG="${PKG}.tar.gz"
+
+## Environment
+#
+export COMPRESSED_PKG
+export PKG
+
+## Parse options
+#
+if [ $# -gt 1 ]; then
+	echo "Can use only one option at a time"
+	exit 1
+fi
+
+# NOTE: We could do this with binary switching (i.e. 0011 to sign and transfer, 
+#		but the following is self-documenting).
+#
+build=1
+package=1
+transfer=1
+
+if [ $# -eq 1 ]; then
+	case $1 in
+		-b|--skipbuild)		build=0;				shift	;;
+		-s|--skiptests)		build=0;						;;
+		-t|--transferonly)	build=0;	package=0;			;;
+		*) echo "Unknown parameter passed: $1"; exit 1 		;;
+	esac
+fi
+
+# Build
+if [ ${build} -eq 1 ]; then
+	./jenkins/jenkins.sh ./jenkins/ross-debian_linux-binaries-python-3
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
+# Package
+if [ ${package} -eq 1 ]; then
+	./packagers/linux/package-issm-linux-binaries-python-3.sh $1
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
+# Transfer distributable package to ISSM Web site
+if [ ${transfer} -eq 1 ]; then
+	./packagers/linux/transfer-issm-linux-binaries.sh
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
Index: sm/trunk/packagers/linux/complete-issm-linux-binaries-python.sh
===================================================================
--- /issm/trunk/packagers/linux/complete-issm-linux-binaries-python.sh	(revision 27034)
+++ 	(revision )
@@ -1,94 +1,0 @@
-#!/bin/bash
-
-################################################################################
-# Wrapper script to build, package, and transfer to ISSM Web site ISSM 
-# distributable package for Linux with Python API.
-#
-# Normally, we would put this directly into the project configuration under 
-# 'Build' -> 'Excute shell', but becasue it is a bit more involved, it is a 
-# good idea to version it.
-#
-# When no failures/errors occur, performs the following:
-# - Builds ISSM according to configuration.
-# - Packages executables and libraries.
-# - Runs test suite against package.
-# - Transmits package to ISSM Web site for distribution.
-#
-# Options:
-# -b/--skipbuild		Skip ISSM compilation.
-# -s/--skiptests		Skip ISSM compilation and testing during packaging 
-#						step. Use if packaging fails for some reason but build 
-#						is valid.
-# -t/--transferonly		Transfer package to ISSM Web site only. Use if transfer 
-#						fails for some reason to skip building, packaging, and 
-#						signing.
-#
-# NOTE:
-# - Use only *one* of the above options at a time, and make sure it is removed 
-#	again after a single run.
-# - Builds will fail when any of the above options are used on a clean 
-#	workspace. For example, if 'Source Code Management' -> 'Check-out Strategy' 
-#	select menu is set to "Always check out a fresh copy".
-################################################################################
-
-## Constants
-#
-PKG="ISSM-Linux-Python" # Name of directory to copy distributable files to
-
-COMPRESSED_PKG="${PKG}.tar.gz"
-
-## Environment
-#
-export COMPRESSED_PKG
-export PKG
-
-## Parse options
-#
-if [ $# -gt 1 ]; then
-	echo "Can use only one option at a time"
-	exit 1
-fi
-
-# NOTE: We could do this with binary switching (i.e. 0011 to sign and transfer, 
-#		but the following is self-documenting).
-#
-build=1
-package=1
-transfer=1
-
-if [ $# -eq 1 ]; then
-	case $1 in
-		-b|--skipbuild)		build=0;				shift	;;
-		-s|--skiptests)		build=0;						;;
-		-t|--transferonly)	build=0;	package=0;			;;
-		*) echo "Unknown parameter passed: $1"; exit 1 		;;
-	esac
-fi
-
-# Build
-if [ ${build} -eq 1 ]; then
-	./jenkins/jenkins.sh ./jenkins/ross-debian_linux-binaries-python
-
-	if [ $? -ne 0 ]; then 
-		exit 1
-	fi
-fi
-
-# Package
-if [ ${package} -eq 1 ]; then
-	./packagers/linux/package-issm-linux-binaries-python.sh $1
-
-	if [ $? -ne 0 ]; then 
-		exit 1
-	fi
-fi
-
-# Transfer distributable package to ISSM Web site
-if [ ${transfer} -eq 1 ]; then
-	./packagers/linux/transfer-issm-linux-binaries.sh
-
-	if [ $? -ne 0 ]; then 
-		exit 1
-	fi
-fi
-
Index: /issm/trunk/packagers/linux/package-issm-linux-binaries-matlab.sh
===================================================================
--- /issm/trunk/packagers/linux/package-issm-linux-binaries-matlab.sh	(revision 27034)
+++ /issm/trunk/packagers/linux/package-issm-linux-binaries-matlab.sh	(revision 27035)
@@ -119,11 +119,10 @@
 
 	# Run tests, redirecting output to logfile and suppressing output to console
-	${MATLAB_PATH}/bin/matlab -nojvm -nosplash -r "try, addpath ${ISSM_DIR}/bin ${ISSM_DIR}/lib; runme(${MATLAB_NROPTIONS}); exit; catch me,fprintf('%s',getReport(me)); exit; end" -logfile matlab.log &> /dev/null
+	${MATLAB_PATH}/bin/matlab -nojvm -nosplash -nojvm -r "try, addpath ${ISSM_DIR}/bin ${ISSM_DIR}/lib; runme(${MATLAB_NROPTIONS}); exit; catch me,fprintf('%s',getReport(me)); exit; end" &> matlab.log
 
 	# Check that MATLAB did not exit in error
-	matlabExitCode=`echo $?`
-	matlabExitedInError=`grep -E "Activation cannot proceed|Error in matlab_run" matlab.log | wc -l`
+	matlabExitedInError=`grep -E "Activation cannot proceed|Error in matlab_run|Illegal use of reserved keyword" matlab.log | wc -l`
 
-	if [[ ${matlabExitCode} -ne 0 || ${matlabExitedInError} -ne 0 ]]; then
+	if [ ${matlabExitedInError} -ne 0 ]; then
 		echo "----------MATLAB exited in error!----------"
 		cat matlab.log
@@ -139,5 +138,5 @@
 	numTestsFailed=`cat matlab.log | grep -c -e "FAILED|ERROR"`
 
-	if [[ ${numTestsFailed} -ne 0 ]]; then
+	if [ ${numTestsFailed} -ne 0 ]; then
 		echo "One or more tests FAILED"
 		exit 1
Index: /issm/trunk/packagers/linux/package-issm-linux-binaries-python-2.sh
===================================================================
--- /issm/trunk/packagers/linux/package-issm-linux-binaries-python-2.sh	(revision 27035)
+++ /issm/trunk/packagers/linux/package-issm-linux-binaries-python-2.sh	(revision 27035)
@@ -0,0 +1,166 @@
+#!/bin/bash
+
+################################################################################
+# Packages and tests ISSM distributable package for Linux with Python 2 API.
+#
+# Options:
+# -s/--skiptests		Skip testing during packaging Use if packaging fails 
+#						for some reason but build is valid.
+#
+# NOTE:
+# - Assumes that the following constants are defined,
+#
+#		COMPRESSED_PKG
+#		ISSM_DIR
+#		PKG
+#
+# See also:
+# - packagers/linux/complete-issm-linux-binaries-python-2.sh
+################################################################################
+
+# Expand aliases within the context of this script
+shopt -s expand_aliases
+
+## Override certain aliases
+#
+alias grep=$(which grep)
+
+## Constants
+#
+LIBGFORTRAN="/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0" # Important that this is the library itself
+LIBGFORTRAN_DIST="${ISSM_DIR}/lib/libgfortran.so.5" # Important the file name matches the SONAME entry in the binaries and other shared libraries which link to it
+PYTHON_NROPTIONS="--benchmark all --exclude 125 126 234 235 418 420 435 444 445 701 702 703 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1201 1202 1203 1204 1205 1206 1207 1208 1301 1302 1303 1304 1401 1402 1601 1602 2002 2003 2004 2005 2006 2007 2008 2010 2011 2021 2051 2052 2053 2084 2085 2090 2101 2424 2425 3001:3200 3201 3202 3300 3480 3481 4001 4002 4003" # NOTE: Combination of test suites from basic, Dakota, and Solid Earth builds, with tests that require a restart and those that require the JVM excluded
+
+## Environment
+#
+export PATH="${ISSM_DIR}/bin:$(getconf PATH)" # Ensure that we pick up binaries from 'bin' directory rather than 'externalpackages'
+
+## Parse options
+#
+if [ $# -gt 1 ]; then
+	echo "Can use only one option at a time"
+	exit 1
+fi
+
+skip_tests=0
+
+if [ $# -eq 1 ]; then
+	case $1 in
+		-s|--skiptests) skip_tests=1;					;;
+		*) echo "Unknown parameter passed: $1"; exit 1	;;
+	esac
+fi
+
+# Clean up from previous packaging
+echo "Cleaning up existing assets"
+cd ${ISSM_DIR}
+rm -rf ${PKG} ${COMPRESSED_PKG}
+mkdir ${PKG}
+
+# Add required binaries and libraries to package and modify them where needed
+cd ${ISSM_DIR}/bin
+
+echo "Modify generic"
+cat generic_static.py | sed -e "s/generic_static/generic/g" > generic.py
+
+echo "Moving MPICH binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec ]; then
+	cp ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec .
+	cp ${ISSM_DIR}/externalpackages/petsc/install/bin/hydra_pmi_proxy .
+elif [ -f ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec ]; then
+	cp ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec .
+	cp ${ISSM_DIR}/externalpackages/mpich/install/bin/hydra_pmi_proxy .
+else
+	echo "MPICH not found"
+	exit 1
+fi
+
+echo "Moving GDAL binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/gdal/install/bin/gdal-config ]; then
+	cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdalsrsinfo .
+	cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdaltransform .
+else
+	echo "GDAL not found"
+	exit 1
+fi
+
+echo "Moving GMT binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt-config ]; then
+	cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt .
+	cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmtselect .
+else
+	echo "GMT not found"
+	exit 1
+fi
+
+echo "Moving Gmsh binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh ]; then
+	cp ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh .
+else
+	echo "Gmsh not found"
+	exit 1
+fi
+
+echo "Moving libgfortran to lib/"
+cp ${LIBGFORTRAN} ${LIBGFORTRAN_DIST} 2> /dev/null
+
+
+# Run tests
+if [ ${skip_tests} -eq 0 ]; then
+	echo "Running tests"
+	cd ${ISSM_DIR}/test/NightlyRun
+	rm python.log 2> /dev/null
+
+	# Set Python environment
+	export PYTHONPATH="${ISSM_DIR}/src/m/dev"
+	export PYTHONSTARTUP="${PYTHONPATH}/devpath.py"
+	export PYTHONUNBUFFERED=1 # We don't want Python to buffer output, otherwise issm.exe output is not captured
+
+	# Run tests, redirecting output to logfile and suppressing output to console
+	./runme.py ${PYTHON_NROPTIONS} &> python.log 2>&1
+
+	# Check that Python did not exit in error
+	pythonExitCode=`echo $?`
+	pythonExitedInError=`grep -E "Error|Standard exception|Traceback|bad interpreter" python.log | wc -l`
+
+	if [[ ${pythonExitCode} -ne 0 || ${pythonExitedInError} -ne 0 ]]; then
+		echo "----------Python exited in error!----------"
+		cat python.log
+		echo "-----------End of python.log-----------"
+
+		# Clean up execution directory
+		rm -rf ${ISSM_DIR}/execution/*
+
+		exit 1
+	fi
+
+	# Check that all tests passed
+	numTestsFailed=`cat python.log | grep -c -e "FAILED|ERROR"`
+
+	if [[ ${numTestsFailed} -ne 0 ]]; then
+		echo "One or more tests FAILED"
+		exit 1
+	else
+		echo "All tests PASSED"
+	fi
+else
+	echo "Skipping tests"
+fi
+
+# Create package
+cd ${ISSM_DIR}
+svn cleanup --remove-ignored --remove-unversioned test # Clean up test directory (before copying to package)
+echo "Copying assets to package: ${PKG}"
+cp -rf bin examples lib scripts test ${PKG}
+mkdir ${PKG}/execution
+${ISSM_DIR}/scripts/py_to_pyc.sh ${PKG}/bin # Compile Python source files
+echo "Cleaning up unneeded/unwanted files"
+rm -f ${PKG}/bin/*.py # Remove all Python scripts
+rm -f ${PKG}/bin/generic_static.* # Remove static versions of generic cluster classes
+rm -f ${PKG}/lib/*.a # Remove static libraries from package
+rm -f ${PKG}/lib/*.la # Remove libtool libraries from package
+rm -rf ${PKG}/test/SandBox # Remove testing sandbox from package
+
+# Compress package
+echo "Compressing package"
+tar -czf ${COMPRESSED_PKG} ${PKG}
Index: /issm/trunk/packagers/linux/package-issm-linux-binaries-python-3.sh
===================================================================
--- /issm/trunk/packagers/linux/package-issm-linux-binaries-python-3.sh	(revision 27035)
+++ /issm/trunk/packagers/linux/package-issm-linux-binaries-python-3.sh	(revision 27035)
@@ -0,0 +1,169 @@
+#!/bin/bash
+
+################################################################################
+# Packages and tests ISSM distributable package for Linux with Python 3 API.
+#
+# Options:
+# -s/--skiptests		Skip testing during packaging Use if packaging fails 
+#						for some reason but build is valid.
+#
+# NOTE:
+# - Assumes that the following constants are defined,
+#
+#		COMPRESSED_PKG
+#		ISSM_DIR
+#		PKG
+#
+# See also:
+# - packagers/linux/complete-issm-linux-binaries-python-3.sh
+################################################################################
+
+# Expand aliases within the context of this script
+shopt -s expand_aliases
+
+## Override certain aliases
+#
+alias grep=$(which grep)
+
+## Constants
+#
+LIBGFORTRAN="/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0" # Important that this is the library itself
+LIBGFORTRAN_DIST="${ISSM_DIR}/lib/libgfortran.so.5" # Important the file name matches the SONAME entry in the binaries and other shared libraries which link to it
+PYTHON_NROPTIONS="--benchmark all --exclude 125 126 234 235 418 420 435 444 445 701 702 703 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1201 1202 1203 1204 1205 1206 1207 1208 1301 1302 1303 1304 1401 1402 1601 1602 2002 2003 2004 2005 2006 2007 2008 2010 2011 2021 2051 2052 2053 2084 2085 2090 2101 2424 2425 3001:3200 3201 3202 3300 3480 3481 4001 4002 4003" # NOTE: Combination of test suites from basic, Dakota, and Solid Earth builds, with tests that require a restart and those that require the JVM excluded
+
+## Environment
+#
+export PATH="${ISSM_DIR}/bin:$(getconf PATH)" # Ensure that we pick up binaries from 'bin' directory rather than 'externalpackages'
+
+## Parse options
+#
+if [ $# -gt 1 ]; then
+	echo "Can use only one option at a time"
+	exit 1
+fi
+
+skip_tests=0
+
+if [ $# -eq 1 ]; then
+	case $1 in
+		-s|--skiptests) skip_tests=1;					;;
+		*) echo "Unknown parameter passed: $1"; exit 1	;;
+	esac
+fi
+
+# Clean up from previous packaging
+echo "Cleaning up existing assets"
+cd ${ISSM_DIR}
+rm -rf ${PKG} ${COMPRESSED_PKG}
+mkdir ${PKG}
+
+# Add required binaries and libraries to package and modify them where needed
+cd ${ISSM_DIR}/bin
+
+echo "Modify generic"
+cat generic_static.py | sed -e "s/generic_static/generic/g" > generic.py
+
+echo "Moving MPICH binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec ]; then
+	cp ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec .
+	cp ${ISSM_DIR}/externalpackages/petsc/install/bin/hydra_pmi_proxy .
+elif [ -f ${ISSM_DIR}/mpich/install/bin/mpiexec ]; then
+	cp ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec .
+	cp ${ISSM_DIR}/externalpackages/mpich/install/bin/hydra_pmi_proxy .
+else
+	echo "MPICH not found"
+	exit 1
+fi
+
+echo "Moving GDAL binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/gdal/install/bin/gdal-config ]; then
+	cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdalsrsinfo .
+	cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdaltransform .
+else
+	echo "GDAL not found"
+	exit 1
+fi
+
+echo "Moving GMT binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt-config ]; then
+	cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt .
+	cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmtselect .
+else
+	echo "GMT not found"
+	exit 1
+fi
+
+echo "Moving Gmsh binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh ]; then
+	cp ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh .
+else
+	echo "Gmsh not found"
+	exit 1
+fi
+
+echo "Moving libgfortran to lib/"
+cp ${LIBGFORTRAN} ${LIBGFORTRAN_DIST} 2> /dev/null
+
+
+# Run tests
+if [ ${skip_tests} -eq 0 ]; then
+	echo "Running tests"
+	cd ${ISSM_DIR}/test/NightlyRun
+	rm python.log 2> /dev/null
+
+	# Set Python environment
+	export PYTHONPATH="${ISSM_DIR}/src/m/dev"
+	export PYTHONSTARTUP="${PYTHONPATH}/devpath.py"
+	export PYTHONUNBUFFERED=1 # We don't want Python to buffer output, otherwise issm.exe output is not captured
+
+	# Ensure that runme.py uses Python 3 interpreter
+	sed -i "s|/usr/bin/env python|/usr/bin/python3|g" ./runme.py
+
+	# Run tests, redirecting output to logfile and suppressing output to console
+	./runme.py ${PYTHON_NROPTIONS} &> python.log 2>&1
+
+	# Check that Python did not exit in error
+	pythonExitCode=`echo $?`
+	pythonExitedInError=`grep -E "Error|Standard exception|Traceback|bad interpreter" python.log | wc -l`
+
+	if [[ ${pythonExitCode} -ne 0 || ${pythonExitedInError} -ne 0 ]]; then
+		echo "----------Python exited in error!----------"
+		cat python.log
+		echo "-----------End of python.log-----------"
+
+		# Clean up execution directory
+		rm -rf ${ISSM_DIR}/execution/*
+
+		exit 1
+	fi
+
+	# Check that all tests passed
+	numTestsFailed=`cat python.log | grep -c -e "FAILED|ERROR"`
+
+	if [[ ${numTestsFailed} -ne 0 ]]; then
+		echo "One or more tests FAILED"
+		exit 1
+	else
+		echo "All tests PASSED"
+	fi
+else
+	echo "Skipping tests"
+fi
+
+# Create package
+cd ${ISSM_DIR}
+svn cleanup --remove-ignored --remove-unversioned test # Clean up test directory (before copying to package)
+echo "Copying assets to package: ${PKG}"
+cp -rf bin examples lib scripts test ${PKG}
+mkdir ${PKG}/execution
+${ISSM_DIR}/scripts/py_to_pyc.sh ${PKG}/bin # Compile Python source files
+echo "Cleaning up unneeded/unwanted files"
+rm -f ${PKG}/bin/*.py # Remove all Python scripts
+rm -f ${PKG}/bin/generic_static.* # Remove static versions of generic cluster classes
+rm -f ${PKG}/lib/*.a # Remove static libraries from package
+rm -f ${PKG}/lib/*.la # Remove libtool libraries from package
+rm -rf ${PKG}/test/SandBox # Remove testing sandbox from package
+
+# Compress package
+echo "Compressing package"
+tar -czf ${COMPRESSED_PKG} ${PKG}
Index: sm/trunk/packagers/linux/package-issm-linux-binaries-python.sh
===================================================================
--- /issm/trunk/packagers/linux/package-issm-linux-binaries-python.sh	(revision 27034)
+++ 	(revision )
@@ -1,166 +1,0 @@
-#!/bin/bash
-
-################################################################################
-# Packages and tests ISSM distributable package for Linux with Python API.
-#
-# Options:
-# -s/--skiptests		Skip testing during packaging Use if packaging fails 
-#						for some reason but build is valid.
-#
-# NOTE:
-# - Assumes that the following constants are defined,
-#
-#		COMPRESSED_PKG
-#		ISSM_DIR
-#		PKG
-#
-# See also:
-# - packagers/linux/complete-issm-linux-binaries-python.sh
-################################################################################
-
-# Expand aliases within the context of this script
-shopt -s expand_aliases
-
-## Override certain aliases
-#
-alias grep=$(which grep)
-
-## Constants
-#
-LIBGFORTRAN="/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0" # Important that this is the library itself
-LIBGFORTRAN_DIST="${ISSM_DIR}/lib/libgfortran.so.5" # Important the file name matches the SONAME entry in the binaries and other shared libraries which link to it
-PYTHON_NROPTIONS="--benchmark all --exclude 125 126 234 235 418 420 435 444 445 701 702 703 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1201 1202 1203 1204 1205 1206 1207 1208 1301 1302 1303 1304 1401 1402 1601 1602 2002 2003 2004 2005 2006 2007 2008 2010 2011 2021 2051 2052 2053 2084 2085 2090 2101 2424 2425 3001:3200 3201 3202 3300 3480 3481 4001 4002 4003" # NOTE: Combination of test suites from basic, Dakota, and Solid Earth builds, with tests that require a restart and those that require the JVM excluded
-
-## Environment
-#
-export PATH="${ISSM_DIR}/bin:$(getconf PATH)" # Ensure that we pick up binaries from 'bin' directory rather than 'externalpackages'
-
-## Parse options
-#
-if [ $# -gt 1 ]; then
-	echo "Can use only one option at a time"
-	exit 1
-fi
-
-skip_tests=0
-
-if [ $# -eq 1 ]; then
-	case $1 in
-		-s|--skiptests) skip_tests=1;					;;
-		*) echo "Unknown parameter passed: $1"; exit 1	;;
-	esac
-fi
-
-# Clean up from previous packaging
-echo "Cleaning up existing assets"
-cd ${ISSM_DIR}
-rm -rf ${PKG} ${COMPRESSED_PKG}
-mkdir ${PKG}
-
-# Add required binaries and libraries to package and modify them where needed
-cd ${ISSM_DIR}/bin
-
-echo "Modify generic"
-cat generic_static.py | sed -e "s/generic_static/generic/g" > generic.py
-
-echo "Moving MPICH binaries to bin/"
-if [ -f ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec ]; then
-	cp ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec .
-	cp ${ISSM_DIR}/externalpackages/petsc/install/bin/hydra_pmi_proxy .
-elif [ -f ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec ]; then
-	cp ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec .
-	cp ${ISSM_DIR}/externalpackages/mpich/install/bin/hydra_pmi_proxy .
-else
-	echo "MPICH not found"
-	exit 1
-fi
-
-echo "Moving GDAL binaries to bin/"
-if [ -f ${ISSM_DIR}/externalpackages/gdal/install/bin/gdal-config ]; then
-	cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdalsrsinfo .
-	cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdaltransform .
-else
-	echo "GDAL not found"
-	exit 1
-fi
-
-echo "Moving GMT binaries to bin/"
-if [ -f ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt-config ]; then
-	cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt .
-	cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmtselect .
-else
-	echo "GMT not found"
-	exit 1
-fi
-
-echo "Moving Gmsh binaries to bin/"
-if [ -f ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh ]; then
-	cp ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh .
-else
-	echo "Gmsh not found"
-	exit 1
-fi
-
-echo "Moving libgfortran to lib/"
-cp ${LIBGFORTRAN} ${LIBGFORTRAN_DIST} 2> /dev/null
-
-
-# Run tests
-if [ ${skip_tests} -eq 0 ]; then
-	echo "Running tests"
-	cd ${ISSM_DIR}/test/NightlyRun
-	rm python.log 2> /dev/null
-
-	# Set Python environment
-	export PYTHONPATH="${ISSM_DIR}/src/m/dev"
-	export PYTHONSTARTUP="${PYTHONPATH}/devpath.py"
-	export PYTHONUNBUFFERED=1 # We don't want Python to buffer output, otherwise issm.exe output is not captured
-
-	# Run tests, redirecting output to logfile and suppressing output to console
-	./runme.py ${PYTHON_NROPTIONS} &> python.log 2>&1
-
-	# Check that Python did not exit in error
-	pythonExitCode=`echo $?`
-	pythonExitedInError=`grep -E "Error|Standard exception|Traceback|bad interpreter" python.log | wc -l`
-
-	if [[ ${pythonExitCode} -ne 0 || ${pythonExitedInError} -ne 0 ]]; then
-		echo "----------Python exited in error!----------"
-		cat python.log
-		echo "-----------End of python.log-----------"
-
-		# Clean up execution directory
-		rm -rf ${ISSM_DIR}/execution/*
-
-		exit 1
-	fi
-
-	# Check that all tests passed
-	numTestsFailed=`cat python.log | grep -c -e "FAILED|ERROR"`
-
-	if [[ ${numTestsFailed} -ne 0 ]]; then
-		echo "One or more tests FAILED"
-		exit 1
-	else
-		echo "All tests PASSED"
-	fi
-else
-	echo "Skipping tests"
-fi
-
-# Create package
-cd ${ISSM_DIR}
-svn cleanup --remove-ignored --remove-unversioned test # Clean up test directory (before copying to package)
-echo "Copying assets to package: ${PKG}"
-cp -rf bin examples lib scripts test ${PKG}
-mkdir ${PKG}/execution
-${ISSM_DIR}/scripts/py_to_pyc.sh ${PKG}/bin # Compile Python source files
-echo "Cleaning up unneeded/unwanted files"
-rm -f ${PKG}/bin/*.py # Remove all Python scripts
-rm -f ${PKG}/bin/generic_static.* # Remove static versions of generic cluster classes
-rm -f ${PKG}/lib/*.a # Remove static libraries from package
-rm -f ${PKG}/lib/*.la # Remove libtool libraries from package
-rm -rf ${PKG}/test/SandBox # Remove testing sandbox from package
-
-# Compress package
-echo "Compressing package"
-tar -czf ${COMPRESSED_PKG} ${PKG}
Index: /issm/trunk/packagers/linux/transfer-issm-linux-binaries.sh
===================================================================
--- /issm/trunk/packagers/linux/transfer-issm-linux-binaries.sh	(revision 27034)
+++ /issm/trunk/packagers/linux/transfer-issm-linux-binaries.sh	(revision 27035)
@@ -2,6 +2,5 @@
 
 ################################################################################
-# Transfers ISSM distributable package for Linux with MATLAB API to ISSM Web 
-# site.
+# Transfers ISSM distributable package for Linux to ISSM website.
 #
 # NOTE:
@@ -12,5 +11,6 @@
 # See also:
 # - packagers/linux/complete-issm-linux-binaries-matlab.sh
-# - packagers/linux/complete-issm-linux-binaries-python.sh
+# - packagers/linux/complete-issm-linux-binaries-python-2.sh
+# - packagers/linux/complete-issm-linux-binaries-python-3.sh
 ################################################################################
 
Index: /issm/trunk/packagers/mac/commit_for_signing-issm-mac-binaries-matlab.sh
===================================================================
--- /issm/trunk/packagers/mac/commit_for_signing-issm-mac-binaries-matlab.sh	(revision 27034)
+++ /issm/trunk/packagers/mac/commit_for_signing-issm-mac-binaries-matlab.sh	(revision 27035)
@@ -50,5 +50,5 @@
 # NOTE: May be able to remove this after updating macOS.
 #
-alias svn='/usr/local/bin/svn'
+#alias svn='/usr/local/bin/svn'
 
 ## Override certain other aliases
@@ -242,2 +242,7 @@
 	fi
 done
+
+if [ ! -f ${SIGNED_REPO_COPY}/${NOTARIZATION_LOGFILE} ]; then
+	echo "Signing timed out!"
+	exit 1
+fi
Index: /issm/trunk/packagers/mac/commit_for_signing-issm-mac-binaries-python-2.sh
===================================================================
--- /issm/trunk/packagers/mac/commit_for_signing-issm-mac-binaries-python-2.sh	(revision 27035)
+++ /issm/trunk/packagers/mac/commit_for_signing-issm-mac-binaries-python-2.sh	(revision 27035)
@@ -0,0 +1,248 @@
+#!/bin/bash
+
+################################################################################
+# Commits ISSM distributable package for macOS with Python 2 API to repository 
+# for signing. This repository is polled by a project running on a JPL 
+# Cybersecurity Jenkins server and performs the actual signing and 
+# notarization.
+#
+# Options:
+# -r/--resign			Skip ISSM compilation and packaging. Use to retrigger 
+#						signing/notarization if it fails but build and package 
+#						are valid.
+# -u/--unlock			Remove lock file from signed package repository. Use if 
+#						build is aborted to allow for subsequent fresh build.
+#
+# NOTE:
+# - Assumes that the following constants are defined,
+#
+#		COMPRESSED_PKG
+#		ISSM_BINARIES_REPO_PASS
+#		ISSM_BINARIES_REPO_USER
+#		SIGNED_REPO_COPY
+#		SIGNED_REPO_URL
+#
+# See also:
+# - packagers/mac/complete-issm-mac-binaries-python-2.sh
+# - packagers/mac/sign-issm-mac-binaries-python-2.sh
+#
+# TODO:
+# - Generalize checkout_*_repo_copy and validate_*_repo_copy functions (e.g. 
+#	pass 'signed' or 'unsigned' as argument)
+################################################################################
+
+# Expand aliases within the context of this script
+shopt -s expand_aliases
+
+# From https://developer.apple.com/documentation/macos-release-notes/macos-catalina-10_15-release-notes,
+#
+#	Command line tool support for Subversion — including svn, git-svn, and 
+#	related commands — is no longer provided by Xcode. (50266910)
+#
+# which results in,
+#
+#	svn: error: The subversion command line tools are no longer provided by 
+#	Xcode.
+#
+# when calling svn, even when subversion is installed via Homebrew and its path 
+# is available in PATH.
+#
+# NOTE: May be able to remove this after updating macOS.
+#
+#alias svn='/usr/local/bin/svn'
+
+## Override certain other aliases
+#
+alias cp=$(which cp)
+alias grep=$(which grep)
+
+## Constants
+#
+MAX_SIGNING_CHECK_ATTEMPTS=30
+NOTARIZATION_LOGFILE="notarization.log"
+RETRIGGER_SIGNING_FILE="retrigger.txt"
+SIGNING_CHECK_PERIOD=60 # in seconds
+SIGNING_LOCK_FILE="signing.lock"
+UNSIGNED_REPO_COPY="./unsigned"
+UNSIGNED_REPO_URL="https://issm.ess.uci.edu/svn/issm-binaries/mac/python/2/unsigned"
+
+## Functions
+#
+checkout_signed_repo_copy(){
+	echo "Checking out copy of repository for signed packages"
+
+	# NOTE: Get empty copy because we do not want to have to check out package 
+	#		from previous signing.
+	#
+	svn checkout \
+		--trust-server-cert \
+		--non-interactive \
+		--depth empty \
+		--username ${ISSM_BINARIES_REPO_USER} \
+		--password ${ISSM_BINARIES_REPO_PASS} \
+		${SIGNED_REPO_URL} \
+		${SIGNED_REPO_COPY} > /dev/null 2>&1
+}
+checkout_unsigned_repo_copy(){
+	echo "Checking out copy of repository for unsigned packages"
+	svn checkout \
+		--trust-server-cert \
+		--non-interactive \
+		--username ${ISSM_BINARIES_REPO_USER} \
+		--password ${ISSM_BINARIES_REPO_PASS} \
+		${UNSIGNED_REPO_URL} \
+		${UNSIGNED_REPO_COPY} > /dev/null 2>&1
+}
+validate_signed_repo_copy(){
+	# Validate copy of repository for signed binaries (e.g. 
+	# 'Check-out Strategy' was set to 'Use 'svn update' as much as possible'; 
+	# initial checkout failed)
+	if [[ ! -d ${SIGNED_REPO_COPY} || ! -d ${SIGNED_REPO_COPY}/.svn ]]; then
+		rm -rf ${SIGNED_REPO_COPY}
+		checkout_signed_repo_copy
+	fi
+}
+validate_unsigned_repo_copy(){
+	# Validate copy of repository for unsigned binaries (e.g. 
+	# 'Check-out Strategy' was set to 'Use 'svn update' as much as possible'; 
+	# initial checkout failed)
+	if [[ ! -d ${UNSIGNED_REPO_COPY} || ! -d ${UNSIGNED_REPO_COPY}/.svn ]]; then
+		rm -rf ${UNSIGNED_REPO_COPY}
+		checkout_unsigned_repo_copy
+	fi
+}
+
+## Parse options
+#
+if [ $# -gt 1 ]; then
+	echo "Can use only one option at a time"
+	exit 1
+fi
+
+retrigger_signing=0
+unlock=0
+
+if [ $# -eq 1 ]; then
+	case $1 in
+		-r|--resign)	retrigger_signing=1;	;;
+		-u|--unlock)	unlock=1;				;;
+		*) echo "Unknown parameter passed: $1"; exit 1	;;
+	esac
+fi
+
+validate_signed_repo_copy
+
+if [ ${unlock} -eq 1 ]; then
+	# Remove signing lock file from signed package repository so that a new 
+	# build can run
+	echo "Removing lock file from repository for signed packages"
+	svn update \
+		--username ${ISSM_BINARIES_REPO_USER} \
+		--password ${ISSM_BINARIES_REPO_PASS} \
+		${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} > /dev/null 2>&1
+	svn delete ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} > /dev/null 2>&1
+	svn commit \
+		--trust-server-cert \
+		--non-interactive \
+		--username ${ISSM_BINARIES_REPO_USER} \
+		--password ${ISSM_BINARIES_REPO_PASS} \
+		--message "DEL: Removing lock file after failed build" ${SIGNED_REPO_COPY} > /dev/null 2>&1
+	svn cleanup ${SIGNED_REPO_COPY} > /dev/null 2>&1
+
+	echo "Remove -u/--unlock option from configuration and run again"
+	exit 1
+fi
+
+# If lock file exists, a signing build is still in process by JPL Cybersecurity
+svn update \
+	--username ${ISSM_BINARIES_REPO_USER} \
+	--password ${ISSM_BINARIES_REPO_PASS} \
+	${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} > /dev/null 2>&1
+
+if [ -f ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} ]; then
+	echo "Previous signing job still in process by JPL Cybersecurity. Please try again later."
+	exit 1
+fi
+
+# Commit lock file to repository for signed packages
+echo "Committing lock file to repository for signed packages"
+touch ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE}
+svn add ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} > /dev/null 2>&1
+svn commit \
+	--trust-server-cert \
+	--non-interactive \
+	--username ${ISSM_BINARIES_REPO_USER} \
+	--password ${ISSM_BINARIES_REPO_PASS} \
+	--message "ADD: New lock file" ${SIGNED_REPO_COPY} > /dev/null 2>&1
+
+# Check out copy of repository for unsigned packages
+validate_unsigned_repo_copy
+
+if [ ${retrigger_signing} -eq 0 ]; then
+	# Commit new compressed package to repository for unsigned binaries
+	echo "Committing package to repository for unsigned packages"
+	cp ${COMPRESSED_PKG} ${UNSIGNED_REPO_COPY}
+	svn add ${UNSIGNED_REPO_COPY}/${COMPRESSED_PKG} > /dev/null 2>&1
+	svn commit \
+		--trust-server-cert \
+		--non-interactive \
+		--username ${ISSM_BINARIES_REPO_USER} \
+		--password ${ISSM_BINARIES_REPO_PASS} \
+		--message "CHG: New unsigned package" ${UNSIGNED_REPO_COPY} > /dev/null 2>&1
+else
+	# NOTE: If notarize_only == 1, we commit a dummy file as we do not want to 
+	#		have to commit the entire compressed package again simply to 
+	#		retrigger the signing build on the remote JPL Cybersecurity Jenkins 
+	#		server.
+	#
+	echo "Attempting to sign existing package again"
+	echo $(date +'%Y-%m-%d-%H-%M-%S') > ${UNSIGNED_REPO_COPY}/${RETRIGGER_SIGNING_FILE} # Write datetime stamp to file to ensure modification is made
+	svn add ${UNSIGNED_REPO_COPY}/${RETRIGGER_SIGNING_FILE} > /dev/null 2>&1
+	svn commit \
+		--trust-server-cert \
+		--non-interactive \
+		--username ${ISSM_BINARIES_REPO_USER} \
+		--password ${ISSM_BINARIES_REPO_PASS} \
+		--message "ADD: Retriggering signing with same package (previous attempt failed)" ${UNSIGNED_REPO_COPY} > /dev/null 2>&1
+fi
+
+# Check status of signing
+echo "Checking progress of signing..."
+SIGNING_CHECK_ATTEMPT=0
+while [ ${SIGNING_CHECK_ATTEMPT} -lt ${MAX_SIGNING_CHECK_ATTEMPTS} ]; do
+	echo "...in progress still; checking again in ${SIGNING_CHECK_PERIOD} seconds"
+	sleep ${SIGNING_CHECK_PERIOD}
+	svn update \
+		--username ${ISSM_BINARIES_REPO_USER} \
+		--password ${ISSM_BINARIES_REPO_PASS} \
+		${SIGNED_REPO_COPY} > /dev/null 2>&1
+
+	if [ ! -f ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} ]; then
+		# Retrieve notarization lock file
+		svn update \
+			--username ${ISSM_BINARIES_REPO_USER} \
+			--password ${ISSM_BINARIES_REPO_PASS} \
+			${SIGNED_REPO_COPY}/${NOTARIZATION_LOGFILE}
+
+		# Check status
+		STATUS=$(grep 'Status:' ${SIGNED_REPO_COPY}/${NOTARIZATION_LOGFILE} | sed -e 's/[[:space:]]*Status: //')
+		if [[ "${STATUS}" == "success" ]]; then
+			echo "Notarization successful!"
+			break
+		else
+			echo "Notarization failed!"
+			echo "----------------------- Contents of notarization logfile -----------------------"
+			cat ${SIGNED_REPO_COPY}/${NOTARIZATION_LOGFILE}
+			echo "--------------------------------------------------------------------------------"
+
+			exit 1
+		fi
+	else
+		((++SIGNING_CHECK_ATTEMPT))
+	fi
+done
+
+if [ ! -f ${SIGNED_REPO_COPY}/${NOTARIZATION_LOGFILE} ]; then
+	echo "Signing timed out!"
+	exit 1
+fi
Index: /issm/trunk/packagers/mac/commit_for_signing-issm-mac-binaries-python-3.sh
===================================================================
--- /issm/trunk/packagers/mac/commit_for_signing-issm-mac-binaries-python-3.sh	(revision 27035)
+++ /issm/trunk/packagers/mac/commit_for_signing-issm-mac-binaries-python-3.sh	(revision 27035)
@@ -0,0 +1,248 @@
+#!/bin/bash
+
+################################################################################
+# Commits ISSM distributable package for macOS with Python 3 API to repository 
+# for signing. This repository is polled by a project running on a JPL 
+# Cybersecurity Jenkins server and performs the actual signing and 
+# notarization.
+#
+# Options:
+# -r/--resign			Skip ISSM compilation and packaging. Use to retrigger 
+#						signing/notarization if it fails but build and package 
+#						are valid.
+# -u/--unlock			Remove lock file from signed package repository. Use if 
+#						build is aborted to allow for subsequent fresh build.
+#
+# NOTE:
+# - Assumes that the following constants are defined,
+#
+#		COMPRESSED_PKG
+#		ISSM_BINARIES_REPO_PASS
+#		ISSM_BINARIES_REPO_USER
+#		SIGNED_REPO_COPY
+#		SIGNED_REPO_URL
+#
+# See also:
+# - packagers/mac/complete-issm-mac-binaries-python-3.sh
+# - packagers/mac/sign-issm-mac-binaries-python-3.sh
+#
+# TODO:
+# - Generalize checkout_*_repo_copy and validate_*_repo_copy functions (e.g. 
+#	pass 'signed' or 'unsigned' as argument)
+################################################################################
+
+# Expand aliases within the context of this script
+shopt -s expand_aliases
+
+# From https://developer.apple.com/documentation/macos-release-notes/macos-catalina-10_15-release-notes,
+#
+#	Command line tool support for Subversion — including svn, git-svn, and 
+#	related commands — is no longer provided by Xcode. (50266910)
+#
+# which results in,
+#
+#	svn: error: The subversion command line tools are no longer provided by 
+#	Xcode.
+#
+# when calling svn, even when subversion is installed via Homebrew and its path 
+# is available in PATH.
+#
+# NOTE: May be able to remove this after updating macOS.
+#
+#alias svn='/usr/local/bin/svn'
+
+## Override certain other aliases
+#
+alias cp=$(which cp)
+alias grep=$(which grep)
+
+## Constants
+#
+MAX_SIGNING_CHECK_ATTEMPTS=30
+NOTARIZATION_LOGFILE="notarization.log"
+RETRIGGER_SIGNING_FILE="retrigger.txt"
+SIGNING_CHECK_PERIOD=60 # in seconds
+SIGNING_LOCK_FILE="signing.lock"
+UNSIGNED_REPO_COPY="./unsigned"
+UNSIGNED_REPO_URL="https://issm.ess.uci.edu/svn/issm-binaries/mac/python/3/unsigned"
+
+## Functions
+#
+checkout_signed_repo_copy(){
+	echo "Checking out copy of repository for signed packages"
+
+	# NOTE: Get empty copy because we do not want to have to check out package 
+	#		from previous signing.
+	#
+	svn checkout \
+		--trust-server-cert \
+		--non-interactive \
+		--depth empty \
+		--username ${ISSM_BINARIES_REPO_USER} \
+		--password ${ISSM_BINARIES_REPO_PASS} \
+		${SIGNED_REPO_URL} \
+		${SIGNED_REPO_COPY} > /dev/null 2>&1
+}
+checkout_unsigned_repo_copy(){
+	echo "Checking out copy of repository for unsigned packages"
+	svn checkout \
+		--trust-server-cert \
+		--non-interactive \
+		--username ${ISSM_BINARIES_REPO_USER} \
+		--password ${ISSM_BINARIES_REPO_PASS} \
+		${UNSIGNED_REPO_URL} \
+		${UNSIGNED_REPO_COPY} > /dev/null 2>&1
+}
+validate_signed_repo_copy(){
+	# Validate copy of repository for signed binaries (e.g. 
+	# 'Check-out Strategy' was set to 'Use 'svn update' as much as possible'; 
+	# initial checkout failed)
+	if [[ ! -d ${SIGNED_REPO_COPY} || ! -d ${SIGNED_REPO_COPY}/.svn ]]; then
+		rm -rf ${SIGNED_REPO_COPY}
+		checkout_signed_repo_copy
+	fi
+}
+validate_unsigned_repo_copy(){
+	# Validate copy of repository for unsigned binaries (e.g. 
+	# 'Check-out Strategy' was set to 'Use 'svn update' as much as possible'; 
+	# initial checkout failed)
+	if [[ ! -d ${UNSIGNED_REPO_COPY} || ! -d ${UNSIGNED_REPO_COPY}/.svn ]]; then
+		rm -rf ${UNSIGNED_REPO_COPY}
+		checkout_unsigned_repo_copy
+	fi
+}
+
+## Parse options
+#
+if [ $# -gt 1 ]; then
+	echo "Can use only one option at a time"
+	exit 1
+fi
+
+retrigger_signing=0
+unlock=0
+
+if [ $# -eq 1 ]; then
+	case $1 in
+		-r|--resign)	retrigger_signing=1;	;;
+		-u|--unlock)	unlock=1;				;;
+		*) echo "Unknown parameter passed: $1"; exit 1	;;
+	esac
+fi
+
+validate_signed_repo_copy
+
+if [ ${unlock} -eq 1 ]; then
+	# Remove signing lock file from signed package repository so that a new 
+	# build can run
+	echo "Removing lock file from repository for signed packages"
+	svn update \
+		--username ${ISSM_BINARIES_REPO_USER} \
+		--password ${ISSM_BINARIES_REPO_PASS} \
+		${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} > /dev/null 2>&1
+	svn delete ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} > /dev/null 2>&1
+	svn commit \
+		--trust-server-cert \
+		--non-interactive \
+		--username ${ISSM_BINARIES_REPO_USER} \
+		--password ${ISSM_BINARIES_REPO_PASS} \
+		--message "DEL: Removing lock file after failed build" ${SIGNED_REPO_COPY} > /dev/null 2>&1
+	svn cleanup ${SIGNED_REPO_COPY} > /dev/null 2>&1
+
+	echo "Remove -u/--unlock option from configuration and run again"
+	exit 1
+fi
+
+# If lock file exists, a signing build is still in process by JPL Cybersecurity
+svn update \
+	--username ${ISSM_BINARIES_REPO_USER} \
+	--password ${ISSM_BINARIES_REPO_PASS} \
+	${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} > /dev/null 2>&1
+
+if [ -f ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} ]; then
+	echo "Previous signing job still in process by JPL Cybersecurity. Please try again later."
+	exit 1
+fi
+
+# Commit lock file to repository for signed packages
+echo "Committing lock file to repository for signed packages"
+touch ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE}
+svn add ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} > /dev/null 2>&1
+svn commit \
+	--trust-server-cert \
+	--non-interactive \
+	--username ${ISSM_BINARIES_REPO_USER} \
+	--password ${ISSM_BINARIES_REPO_PASS} \
+	--message "ADD: New lock file" ${SIGNED_REPO_COPY} > /dev/null 2>&1
+
+# Check out copy of repository for unsigned packages
+validate_unsigned_repo_copy
+
+if [ ${retrigger_signing} -eq 0 ]; then
+	# Commit new compressed package to repository for unsigned binaries
+	echo "Committing package to repository for unsigned packages"
+	cp ${COMPRESSED_PKG} ${UNSIGNED_REPO_COPY}
+	svn add ${UNSIGNED_REPO_COPY}/${COMPRESSED_PKG} > /dev/null 2>&1
+	svn commit \
+		--trust-server-cert \
+		--non-interactive \
+		--username ${ISSM_BINARIES_REPO_USER} \
+		--password ${ISSM_BINARIES_REPO_PASS} \
+		--message "CHG: New unsigned package" ${UNSIGNED_REPO_COPY} > /dev/null 2>&1
+else
+	# NOTE: If notarize_only == 1, we commit a dummy file as we do not want to 
+	#		have to commit the entire compressed package again simply to 
+	#		retrigger the signing build on the remote JPL Cybersecurity Jenkins 
+	#		server.
+	#
+	echo "Attempting to sign existing package again"
+	echo $(date +'%Y-%m-%d-%H-%M-%S') > ${UNSIGNED_REPO_COPY}/${RETRIGGER_SIGNING_FILE} # Write datetime stamp to file to ensure modification is made
+	svn add ${UNSIGNED_REPO_COPY}/${RETRIGGER_SIGNING_FILE} > /dev/null 2>&1
+	svn commit \
+		--trust-server-cert \
+		--non-interactive \
+		--username ${ISSM_BINARIES_REPO_USER} \
+		--password ${ISSM_BINARIES_REPO_PASS} \
+		--message "ADD: Retriggering signing with same package (previous attempt failed)" ${UNSIGNED_REPO_COPY} > /dev/null 2>&1
+fi
+
+# Check status of signing
+echo "Checking progress of signing..."
+SIGNING_CHECK_ATTEMPT=0
+while [ ${SIGNING_CHECK_ATTEMPT} -lt ${MAX_SIGNING_CHECK_ATTEMPTS} ]; do
+	echo "...in progress still; checking again in ${SIGNING_CHECK_PERIOD} seconds"
+	sleep ${SIGNING_CHECK_PERIOD}
+	svn update \
+		--username ${ISSM_BINARIES_REPO_USER} \
+		--password ${ISSM_BINARIES_REPO_PASS} \
+		${SIGNED_REPO_COPY} > /dev/null 2>&1
+
+	if [ ! -f ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} ]; then
+		# Retrieve notarization lock file
+		svn update \
+			--username ${ISSM_BINARIES_REPO_USER} \
+			--password ${ISSM_BINARIES_REPO_PASS} \
+			${SIGNED_REPO_COPY}/${NOTARIZATION_LOGFILE}
+
+		# Check status
+		STATUS=$(grep 'Status:' ${SIGNED_REPO_COPY}/${NOTARIZATION_LOGFILE} | sed -e 's/[[:space:]]*Status: //')
+		if [[ "${STATUS}" == "success" ]]; then
+			echo "Notarization successful!"
+			break
+		else
+			echo "Notarization failed!"
+			echo "----------------------- Contents of notarization logfile -----------------------"
+			cat ${SIGNED_REPO_COPY}/${NOTARIZATION_LOGFILE}
+			echo "--------------------------------------------------------------------------------"
+
+			exit 1
+		fi
+	else
+		((++SIGNING_CHECK_ATTEMPT))
+	fi
+done
+
+if [ ! -f ${SIGNED_REPO_COPY}/${NOTARIZATION_LOGFILE} ]; then
+	echo "Signing timed out!"
+	exit 1
+fi
Index: sm/trunk/packagers/mac/commit_for_signing-issm-mac-binaries-python.sh
===================================================================
--- /issm/trunk/packagers/mac/commit_for_signing-issm-mac-binaries-python.sh	(revision 27034)
+++ 	(revision )
@@ -1,243 +1,0 @@
-#!/bin/bash
-
-################################################################################
-# Commits ISSM distributable package for macOS with Python API to repository 
-# for signing. This repository is polled by a project running on a JPL 
-# Cybersecurity Jenkins server and performs the actual signing and 
-# notarization.
-#
-# Options:
-# -r/--resign			Skip ISSM compilation and packaging. Use to retrigger 
-#						signing/notarization if it fails but build and package 
-#						are valid.
-# -u/--unlock			Remove lock file from signed package repository. Use if 
-#						build is aborted to allow for subsequent fresh build.
-#
-# NOTE:
-# - Assumes that the following constants are defined,
-#
-#		COMPRESSED_PKG
-#		ISSM_BINARIES_REPO_PASS
-#		ISSM_BINARIES_REPO_USER
-#		SIGNED_REPO_COPY
-#		SIGNED_REPO_URL
-#
-# See also:
-# - packagers/mac/complete-issm-mac-binaries-python.sh
-# - packagers/mac/sign-issm-mac-binaries-python.sh
-#
-# TODO:
-# - Generalize checkout_*_repo_copy and validate_*_repo_copy functions (e.g. 
-#	pass 'signed' or 'unsigned' as argument)
-################################################################################
-
-# Expand aliases within the context of this script
-shopt -s expand_aliases
-
-# From https://developer.apple.com/documentation/macos-release-notes/macos-catalina-10_15-release-notes,
-#
-#	Command line tool support for Subversion — including svn, git-svn, and 
-#	related commands — is no longer provided by Xcode. (50266910)
-#
-# which results in,
-#
-#	svn: error: The subversion command line tools are no longer provided by 
-#	Xcode.
-#
-# when calling svn, even when subversion is installed via Homebrew and its path 
-# is available in PATH.
-#
-# NOTE: May be able to remove this after updating macOS.
-#
-alias svn='/usr/local/bin/svn'
-
-## Override certain other aliases
-#
-alias cp=$(which cp)
-alias grep=$(which grep)
-
-## Constants
-#
-MAX_SIGNING_CHECK_ATTEMPTS=30
-NOTARIZATION_LOGFILE="notarization.log"
-RETRIGGER_SIGNING_FILE="retrigger.txt"
-SIGNING_CHECK_PERIOD=60 # in seconds
-SIGNING_LOCK_FILE="signing.lock"
-UNSIGNED_REPO_COPY="./unsigned"
-UNSIGNED_REPO_URL="https://issm.ess.uci.edu/svn/issm-binaries/mac/python/unsigned"
-
-## Functions
-#
-checkout_signed_repo_copy(){
-	echo "Checking out copy of repository for signed packages"
-
-	# NOTE: Get empty copy because we do not want to have to check out package 
-	#		from previous signing.
-	#
-	svn checkout \
-		--trust-server-cert \
-		--non-interactive \
-		--depth empty \
-		--username ${ISSM_BINARIES_REPO_USER} \
-		--password ${ISSM_BINARIES_REPO_PASS} \
-		${SIGNED_REPO_URL} \
-		${SIGNED_REPO_COPY} > /dev/null 2>&1
-}
-checkout_unsigned_repo_copy(){
-	echo "Checking out copy of repository for unsigned packages"
-	svn checkout \
-		--trust-server-cert \
-		--non-interactive \
-		--username ${ISSM_BINARIES_REPO_USER} \
-		--password ${ISSM_BINARIES_REPO_PASS} \
-		${UNSIGNED_REPO_URL} \
-		${UNSIGNED_REPO_COPY} > /dev/null 2>&1
-}
-validate_signed_repo_copy(){
-	# Validate copy of repository for signed binaries (e.g. 
-	# 'Check-out Strategy' was set to 'Use 'svn update' as much as possible'; 
-	# initial checkout failed)
-	if [[ ! -d ${SIGNED_REPO_COPY} || ! -d ${SIGNED_REPO_COPY}/.svn ]]; then
-		rm -rf ${SIGNED_REPO_COPY}
-		checkout_signed_repo_copy
-	fi
-}
-validate_unsigned_repo_copy(){
-	# Validate copy of repository for unsigned binaries (e.g. 
-	# 'Check-out Strategy' was set to 'Use 'svn update' as much as possible'; 
-	# initial checkout failed)
-	if [[ ! -d ${UNSIGNED_REPO_COPY} || ! -d ${UNSIGNED_REPO_COPY}/.svn ]]; then
-		rm -rf ${UNSIGNED_REPO_COPY}
-		checkout_unsigned_repo_copy
-	fi
-}
-
-## Parse options
-#
-if [ $# -gt 1 ]; then
-	echo "Can use only one option at a time"
-	exit 1
-fi
-
-retrigger_signing=0
-unlock=0
-
-if [ $# -eq 1 ]; then
-	case $1 in
-		-r|--resign)	retrigger_signing=1;	;;
-		-u|--unlock)	unlock=1;				;;
-		*) echo "Unknown parameter passed: $1"; exit 1	;;
-	esac
-fi
-
-validate_signed_repo_copy
-
-if [ ${unlock} -eq 1 ]; then
-	# Remove signing lock file from signed package repository so that a new 
-	# build can run
-	echo "Removing lock file from repository for signed packages"
-	svn update \
-		--username ${ISSM_BINARIES_REPO_USER} \
-		--password ${ISSM_BINARIES_REPO_PASS} \
-		${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} > /dev/null 2>&1
-	svn delete ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} > /dev/null 2>&1
-	svn commit \
-		--trust-server-cert \
-		--non-interactive \
-		--username ${ISSM_BINARIES_REPO_USER} \
-		--password ${ISSM_BINARIES_REPO_PASS} \
-		--message "DEL: Removing lock file after failed build" ${SIGNED_REPO_COPY} > /dev/null 2>&1
-	svn cleanup ${SIGNED_REPO_COPY} > /dev/null 2>&1
-
-	echo "Remove -u/--unlock option from configuration and run again"
-	exit 1
-fi
-
-# If lock file exists, a signing build is still in process by JPL Cybersecurity
-svn update \
-	--username ${ISSM_BINARIES_REPO_USER} \
-	--password ${ISSM_BINARIES_REPO_PASS} \
-	${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} > /dev/null 2>&1
-
-if [ -f ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} ]; then
-	echo "Previous signing job still in process by JPL Cybersecurity. Please try again later."
-	exit 1
-fi
-
-# Commit lock file to repository for signed packages
-echo "Committing lock file to repository for signed packages"
-touch ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE}
-svn add ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} > /dev/null 2>&1
-svn commit \
-	--trust-server-cert \
-	--non-interactive \
-	--username ${ISSM_BINARIES_REPO_USER} \
-	--password ${ISSM_BINARIES_REPO_PASS} \
-	--message "ADD: New lock file" ${SIGNED_REPO_COPY} > /dev/null 2>&1
-
-# Check out copy of repository for unsigned packages
-validate_unsigned_repo_copy
-
-if [ ${retrigger_signing} -eq 0 ]; then
-	# Commit new compressed package to repository for unsigned binaries
-	echo "Committing package to repository for unsigned packages"
-	cp ${COMPRESSED_PKG} ${UNSIGNED_REPO_COPY}
-	svn add ${UNSIGNED_REPO_COPY}/${COMPRESSED_PKG} > /dev/null 2>&1
-	svn commit \
-		--trust-server-cert \
-		--non-interactive \
-		--username ${ISSM_BINARIES_REPO_USER} \
-		--password ${ISSM_BINARIES_REPO_PASS} \
-		--message "CHG: New unsigned package" ${UNSIGNED_REPO_COPY} > /dev/null 2>&1
-else
-	# NOTE: If notarize_only == 1, we commit a dummy file as we do not want to 
-	#		have to commit the entire compressed package again simply to 
-	#		retrigger the signing build on the remote JPL Cybersecurity Jenkins 
-	#		server.
-	#
-	echo "Attempting to sign existing package again"
-	echo $(date +'%Y-%m-%d-%H-%M-%S') > ${UNSIGNED_REPO_COPY}/${RETRIGGER_SIGNING_FILE} # Write datetime stamp to file to ensure modification is made
-	svn add ${UNSIGNED_REPO_COPY}/${RETRIGGER_SIGNING_FILE} > /dev/null 2>&1
-	svn commit \
-		--trust-server-cert \
-		--non-interactive \
-		--username ${ISSM_BINARIES_REPO_USER} \
-		--password ${ISSM_BINARIES_REPO_PASS} \
-		--message "ADD: Retriggering signing with same package (previous attempt failed)" ${UNSIGNED_REPO_COPY} > /dev/null 2>&1
-fi
-
-# Check status of signing
-echo "Checking progress of signing..."
-SIGNING_CHECK_ATTEMPT=0
-while [ ${SIGNING_CHECK_ATTEMPT} -lt ${MAX_SIGNING_CHECK_ATTEMPTS} ]; do
-	echo "...in progress still; checking again in ${SIGNING_CHECK_PERIOD} seconds"
-	sleep ${SIGNING_CHECK_PERIOD}
-	svn update \
-		--username ${ISSM_BINARIES_REPO_USER} \
-		--password ${ISSM_BINARIES_REPO_PASS} \
-		${SIGNED_REPO_COPY} > /dev/null 2>&1
-
-	if [ ! -f ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE} ]; then
-		# Retrieve notarization lock file
-		svn update \
-			--username ${ISSM_BINARIES_REPO_USER} \
-			--password ${ISSM_BINARIES_REPO_PASS} \
-			${SIGNED_REPO_COPY}/${NOTARIZATION_LOGFILE}
-
-		# Check status
-		STATUS=$(grep 'Status:' ${SIGNED_REPO_COPY}/${NOTARIZATION_LOGFILE} | sed -e 's/[[:space:]]*Status: //')
-		if [[ "${STATUS}" == "success" ]]; then
-			echo "Notarization successful!"
-			break
-		else
-			echo "Notarization failed!"
-			echo "----------------------- Contents of notarization logfile -----------------------"
-			cat ${SIGNED_REPO_COPY}/${NOTARIZATION_LOGFILE}
-			echo "--------------------------------------------------------------------------------"
-
-			exit 1
-		fi
-	else
-		((++SIGNING_CHECK_ATTEMPT))
-	fi
-done
Index: /issm/trunk/packagers/mac/complete-issm-mac-binaries-matlab.sh
===================================================================
--- /issm/trunk/packagers/mac/complete-issm-mac-binaries-matlab.sh	(revision 27034)
+++ /issm/trunk/packagers/mac/complete-issm-mac-binaries-matlab.sh	(revision 27035)
@@ -99,5 +99,6 @@
 	./jenkins/jenkins.sh ./jenkins/pine_island-mac-binaries-matlab
 
-	if [ $? -ne 0 ]; then 
+	if [ $? -ne 0 ]; then
+		echo "Failure while compiling"
 		exit 1
 	fi
@@ -107,9 +108,11 @@
 if [ ${package} -eq 1 ]; then
 	./packagers/mac/package-issm-mac-binaries-matlab.sh $1
-	shift # Clear $1 so that it is not passed to commit_for_signing script
 
-	if [ $? -ne 0 ]; then 
+	if [ $? -ne 0 ]; then
+		echo "Failure during packaging"
 		exit 1
 	fi
+
+	shift # Clear $1 so that it is not passed to commit_for_signing script
 fi
 
@@ -118,5 +121,6 @@
 	./packagers/mac/commit_for_signing-issm-mac-binaries-matlab.sh $1
 
-	if [ $? -ne 0 ]; then 
+	if [ $? -ne 0 ]; then
+		echo "Failure while committing package for signing"
 		exit 1
 	fi
@@ -127,5 +131,6 @@
 	./packagers/mac/transfer-issm-mac-binaries.sh
 
-	if [ $? -ne 0 ]; then 
+	if [ $? -ne 0 ]; then
+		echo "Failure while transferring package to ISSM server"
 		exit 1
 	fi
Index: /issm/trunk/packagers/mac/complete-issm-mac-binaries-python-2.sh
===================================================================
--- /issm/trunk/packagers/mac/complete-issm-mac-binaries-python-2.sh	(revision 27035)
+++ /issm/trunk/packagers/mac/complete-issm-mac-binaries-python-2.sh	(revision 27035)
@@ -0,0 +1,134 @@
+#!/bin/bash
+
+################################################################################
+# Wrapper script to build, package, send for signing, and transfer to ISSM Web 
+# site ISSM distributable package for macOS with Python 2 API.
+#
+# Normally, we would put this directly into the project configuration under 
+# 'Build' -> 'Excute shell', but becasue it is a bit more involved, it is a 
+# good idea to version it.
+#
+# When no failures/errors occur, performs the following:
+# - Builds ISSM according to configuration.
+# - Packages executables and libraries.
+# - Runs test suite against package.
+# - Commits compressed package to repository to be signed by JPL Cybersecurity.
+# - Retrieves signed package and transmits it to ISSM Web site for 
+#	distribution.
+#
+# Options:
+# -b/--skipbuild		Skip ISSM compilation.
+# -r/--resign			Skip ISSM compilation and packaging. Use to retrigger 
+#						signing/notarization if it fails but build and package 
+#						are valid.
+# -s/--skiptests		Skip ISSM compilation and testing during packaging 
+#						step. Use if packaging fails for some reason but build 
+#						is valid.
+# -t/--transferonly		Transfer package to ISSM Web site only. Use if transfer 
+#						fails for some reason to skip building, packaging, and 
+#						signing.
+# -u/--unlock			Remove lock file from signed package repository. Use if 
+#						build is aborted to allow for subsequent fresh build.
+#
+# Debugging:
+# - Relies on a very tight handshake with project on remote JPL Cybersecurity 
+#	Jenkins server. Debugging may be perfomed locally by running,
+#
+#		packagers/mac/sign-issm-mac-binaries-python-2.sh
+#
+#	with "ISSM_BINARIES_USER" and "ISSM_BINARIES_PASS" hardcoded to Apple 
+#	Developer credentials.
+# - Removing stdout/stderr redirections to null device (> /dev/null 2>&1) can 
+#	help debug potential SVN issues.
+#
+# NOTE:
+# - Use only *one* of the above options at a time, and make sure it is removed 
+#	again after a single run.
+# - Builds will fail when any of the above options are used on a clean 
+#	workspace. For example, if 'Source Code Management' -> 'Check-out Strategy' 
+#	select menu is set to "Always check out a fresh copy".
+# - Assumes that "ISSM_BINARIES_USER" and "ISSM_BINARIES_PASS" are set up in 
+#	the 'Bindings' section under a 'Username and password (separated)' binding 
+#	(requires 'Credentials Binding Plugin') with 'Credentials' select menu set 
+#	to "jenkins/****** (SVN repository for ISSM binaries)".
+################################################################################
+
+## Constants
+#
+PKG="ISSM-macOS-Python-2" # Name of directory to copy distributable files to
+SIGNED_REPO_COPY="./signed"
+SIGNED_REPO_URL="https://issm.ess.uci.edu/svn/issm-binaries/mac/python/2/signed"
+
+COMPRESSED_PKG="${PKG}.zip"
+
+## Environment
+#
+export COMPRESSED_PKG
+export PKG
+export SIGNED_REPO_COPY
+export SIGNED_REPO_URL
+
+## Parse options
+#
+if [ $# -gt 1 ]; then
+	echo "Can use only one option at a time"
+	exit 1
+fi
+
+# NOTE: We could do this with binary switching (i.e. 0011 to sign and transfer, 
+#		but the following is self-documenting).
+#
+build=1
+package=1
+sign=1
+transfer=1
+
+if [ $# -eq 1 ]; then
+	case $1 in
+		-b|--skipbuild)		build=0;							shift	;;
+		-r|--resign)		build=0;	package=0;						;;
+		-s|--skiptests)		build=0;									;;
+		-t|--transferonly)	build=0;	package=0;	sign=0;				;;
+		-u|--unlock)		build=0;	package=0;	transfer=0;			;;
+		*) echo "Unknown parameter passed: $1"; exit 1 					;;
+	esac
+fi
+
+# Build
+if [ ${build} -eq 1 ]; then
+	./jenkins/jenkins.sh ./jenkins/pine_island-mac-binaries-python-2
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
+# Package
+if [ ${package} -eq 1 ]; then
+	./packagers/mac/package-issm-mac-binaries-python-2.sh $1
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+
+	shift # Clear $1 so that it is not passed to commit_for_signing script
+fi
+
+# Commit for signing
+if [ ${sign} -eq 1 ]; then
+	./packagers/mac/commit_for_signing-issm-mac-binaries-python-2.sh $1
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
+# Transfer distributable package to ISSM Web site
+if [ ${transfer} -eq 1 ]; then
+	./packagers/mac/transfer-issm-mac-binaries.sh
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
Index: /issm/trunk/packagers/mac/complete-issm-mac-binaries-python-3.sh
===================================================================
--- /issm/trunk/packagers/mac/complete-issm-mac-binaries-python-3.sh	(revision 27035)
+++ /issm/trunk/packagers/mac/complete-issm-mac-binaries-python-3.sh	(revision 27035)
@@ -0,0 +1,134 @@
+#!/bin/bash
+
+################################################################################
+# Wrapper script to build, package, send for signing, and transfer to ISSM Web 
+# site ISSM distributable package for macOS with Python 3 API.
+#
+# Normally, we would put this directly into the project configuration under 
+# 'Build' -> 'Excute shell', but becasue it is a bit more involved, it is a 
+# good idea to version it.
+#
+# When no failures/errors occur, performs the following:
+# - Builds ISSM according to configuration.
+# - Packages executables and libraries.
+# - Runs test suite against package.
+# - Commits compressed package to repository to be signed by JPL Cybersecurity.
+# - Retrieves signed package and transmits it to ISSM Web site for 
+#	distribution.
+#
+# Options:
+# -b/--skipbuild		Skip ISSM compilation.
+# -r/--resign			Skip ISSM compilation and packaging. Use to retrigger 
+#						signing/notarization if it fails but build and package 
+#						are valid.
+# -s/--skiptests		Skip ISSM compilation and testing during packaging 
+#						step. Use if packaging fails for some reason but build 
+#						is valid.
+# -t/--transferonly		Transfer package to ISSM Web site only. Use if transfer 
+#						fails for some reason to skip building, packaging, and 
+#						signing.
+# -u/--unlock			Remove lock file from signed package repository. Use if 
+#						build is aborted to allow for subsequent fresh build.
+#
+# Debugging:
+# - Relies on a very tight handshake with project on remote JPL Cybersecurity 
+#	Jenkins server. Debugging may be perfomed locally by running,
+#
+#		packagers/mac/sign-issm-mac-binaries-python-3.sh
+#
+#	with "ISSM_BINARIES_USER" and "ISSM_BINARIES_PASS" hardcoded to Apple 
+#	Developer credentials.
+# - Removing stdout/stderr redirections to null device (> /dev/null 2>&1) can 
+#	help debug potential SVN issues.
+#
+# NOTE:
+# - Use only *one* of the above options at a time, and make sure it is removed 
+#	again after a single run.
+# - Builds will fail when any of the above options are used on a clean 
+#	workspace. For example, if 'Source Code Management' -> 'Check-out Strategy' 
+#	select menu is set to "Always check out a fresh copy".
+# - Assumes that "ISSM_BINARIES_USER" and "ISSM_BINARIES_PASS" are set up in 
+#	the 'Bindings' section under a 'Username and password (separated)' binding 
+#	(requires 'Credentials Binding Plugin') with 'Credentials' select menu set 
+#	to "jenkins/****** (SVN repository for ISSM binaries)".
+################################################################################
+
+## Constants
+#
+PKG="ISSM-macOS-Python-3" # Name of directory to copy distributable files to
+SIGNED_REPO_COPY="./signed"
+SIGNED_REPO_URL="https://issm.ess.uci.edu/svn/issm-binaries/mac/python/3/signed"
+
+COMPRESSED_PKG="${PKG}.zip"
+
+## Environment
+#
+export COMPRESSED_PKG
+export PKG
+export SIGNED_REPO_COPY
+export SIGNED_REPO_URL
+
+## Parse options
+#
+if [ $# -gt 1 ]; then
+	echo "Can use only one option at a time"
+	exit 1
+fi
+
+# NOTE: We could do this with binary switching (i.e. 0011 to sign and transfer, 
+#		but the following is self-documenting).
+#
+build=1
+package=1
+sign=1
+transfer=1
+
+if [ $# -eq 1 ]; then
+	case $1 in
+		-b|--skipbuild)		build=0;							shift	;;
+		-r|--resign)		build=0;	package=0;						;;
+		-s|--skiptests)		build=0;									;;
+		-t|--transferonly)	build=0;	package=0;	sign=0;				;;
+		-u|--unlock)		build=0;	package=0;	transfer=0;			;;
+		*) echo "Unknown parameter passed: $1"; exit 1 					;;
+	esac
+fi
+
+# Build
+if [ ${build} -eq 1 ]; then
+	./jenkins/jenkins.sh ./jenkins/pine_island-mac-binaries-python-3
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
+# Package
+if [ ${package} -eq 1 ]; then
+	./packagers/mac/package-issm-mac-binaries-python-3.sh $1
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+
+	shift # Clear $1 so that it is not passed to commit_for_signing script
+fi
+
+# Commit for signing
+if [ ${sign} -eq 1 ]; then
+	./packagers/mac/commit_for_signing-issm-mac-binaries-python-3.sh $1
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
+# Transfer distributable package to ISSM Web site
+if [ ${transfer} -eq 1 ]; then
+	./packagers/mac/transfer-issm-mac-binaries.sh
+
+	if [ $? -ne 0 ]; then 
+		exit 1
+	fi
+fi
+
Index: sm/trunk/packagers/mac/complete-issm-mac-binaries-python.sh
===================================================================
--- /issm/trunk/packagers/mac/complete-issm-mac-binaries-python.sh	(revision 27034)
+++ 	(revision )
@@ -1,133 +1,0 @@
-#!/bin/bash
-
-################################################################################
-# Wrapper script to build, package, send for signing, and transfer to ISSM Web 
-# site ISSM distributable package for macOS with Python API.
-#
-# Normally, we would put this directly into the project configuration under 
-# 'Build' -> 'Excute shell', but becasue it is a bit more involved, it is a 
-# good idea to version it.
-#
-# When no failures/errors occur, performs the following:
-# - Builds ISSM according to configuration.
-# - Packages executables and libraries.
-# - Runs test suite against package.
-# - Commits compressed package to repository to be signed by JPL Cybersecurity.
-# - Retrieves signed package and transmits it to ISSM Web site for 
-#	distribution.
-#
-# Options:
-# -b/--skipbuild		Skip ISSM compilation.
-# -r/--resign			Skip ISSM compilation and packaging. Use to retrigger 
-#						signing/notarization if it fails but build and package 
-#						are valid.
-# -s/--skiptests		Skip ISSM compilation and testing during packaging 
-#						step. Use if packaging fails for some reason but build 
-#						is valid.
-# -t/--transferonly		Transfer package to ISSM Web site only. Use if transfer 
-#						fails for some reason to skip building, packaging, and 
-#						signing.
-# -u/--unlock			Remove lock file from signed package repository. Use if 
-#						build is aborted to allow for subsequent fresh build.
-#
-# Debugging:
-# - Relies on a very tight handshake with project on remote JPL Cybersecurity 
-#	Jenkins server. Debugging may be perfomed locally by running,
-#
-#		packagers/mac/sign-issm-mac-binaries-python.sh
-#
-#	with "ISSM_BINARIES_USER" and "ISSM_BINARIES_PASS" hardcoded to Apple 
-#	Developer credentials.
-# - Removing stdout/stderr redirections to null device (> /dev/null 2>&1) can 
-#	help debug potential SVN issues.
-#
-# NOTE:
-# - Use only *one* of the above options at a time, and make sure it is removed 
-#	again after a single run.
-# - Builds will fail when any of the above options are used on a clean 
-#	workspace. For example, if 'Source Code Management' -> 'Check-out Strategy' 
-#	select menu is set to "Always check out a fresh copy".
-# - Assumes that "ISSM_BINARIES_USER" and "ISSM_BINARIES_PASS" are set up in 
-#	the 'Bindings' section under a 'Username and password (separated)' binding 
-#	(requires 'Credentials Binding Plugin') with 'Credentials' select menu set 
-#	to "jenkins/****** (SVN repository for ISSM binaries)".
-################################################################################
-
-## Constants
-#
-PKG="ISSM-macOS-Python" # Name of directory to copy distributable files to
-SIGNED_REPO_COPY="./signed"
-SIGNED_REPO_URL="https://issm.ess.uci.edu/svn/issm-binaries/mac/python/signed"
-
-COMPRESSED_PKG="${PKG}.zip"
-
-## Environment
-#
-export COMPRESSED_PKG
-export PKG
-export SIGNED_REPO_COPY
-export SIGNED_REPO_URL
-
-## Parse options
-#
-if [ $# -gt 1 ]; then
-	echo "Can use only one option at a time"
-	exit 1
-fi
-
-# NOTE: We could do this with binary switching (i.e. 0011 to sign and transfer, 
-#		but the following is self-documenting).
-#
-build=1
-package=1
-sign=1
-transfer=1
-
-if [ $# -eq 1 ]; then
-	case $1 in
-		-b|--skipbuild)		build=0;							shift	;;
-		-r|--resign)		build=0;	package=0;						;;
-		-s|--skiptests)		build=0;									;;
-		-t|--transferonly)	build=0;	package=0;	sign=0;				;;
-		-u|--unlock)		build=0;	package=0;	transfer=0;			;;
-		*) echo "Unknown parameter passed: $1"; exit 1 					;;
-	esac
-fi
-
-# Build
-if [ ${build} -eq 1 ]; then
-	./jenkins/jenkins.sh ./jenkins/pine_island-mac-binaries-python
-
-	if [ $? -ne 0 ]; then 
-		exit 1
-	fi
-fi
-
-# Package
-if [ ${package} -eq 1 ]; then
-	./packagers/mac/package-issm-mac-binaries-python.sh $1
-	shift # Clear $1 so that it is not passed to commit_for_signing script
-
-	if [ $? -ne 0 ]; then 
-		exit 1
-	fi
-fi
-
-# Commit for signing
-if [ ${sign} -eq 1 ]; then
-	./packagers/mac/commit_for_signing-issm-mac-binaries-python.sh $1
-
-	if [ $? -ne 0 ]; then 
-		exit 1
-	fi
-fi
-
-# Transfer distributable package to ISSM Web site
-if [ ${transfer} -eq 1 ]; then
-	./packagers/mac/transfer-issm-mac-binaries.sh
-
-	if [ $? -ne 0 ]; then 
-		exit 1
-	fi
-fi
-
Index: /issm/trunk/packagers/mac/package-issm-mac-binaries-matlab.sh
===================================================================
--- /issm/trunk/packagers/mac/package-issm-mac-binaries-matlab.sh	(revision 27034)
+++ /issm/trunk/packagers/mac/package-issm-mac-binaries-matlab.sh	(revision 27035)
@@ -38,5 +38,5 @@
 # NOTE: May be able to remove this after updating macOS.
 #
-alias svn='/usr/local/bin/svn'
+#alias svn='/usr/local/bin/svn'
 
 ## Override certain other aliases
@@ -47,5 +47,5 @@
 ## Constants
 #
-MATLAB_NROPTIONS="'benchmark','all','exclude',[125,126,234,235,418,420,435,444,445,701,702,703,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1201,1202,1203,1204,1205,1206,1207,1208,1301,1302,1303,1304,1401,1402,1601,1602,2006,2020,2021,2051,2052,2053,3001:3200,3201,3202,3300,3480,3481,4001,4002,4003]" # NOTE: Combination of test suites from basic, Dakota, and Solid Earth builds, with tests that require a restart and those that require the JVM excluded
+MATLAB_NROPTIONS="'benchmark','all','exclude',[125,126,234,235,418,420,435,444,445,701,702,703,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1201,1202,1203,1204,1205,1206,1207,1208,1301,1302,1303,1304,1401,1402,1601,1602,2002,2003,2004,2006,2007,2008,2010,2011,2021,2051,2052,2053,2084,2085,2090,2101,2424,2425,3001:3200,3201,3202,3300,3480,3481,4001,4002,4003]" # NOTE: Combination of test suites from basic, Dakota, and Solid Earth builds, with tests that require a restart and those that require the JVM excluded
 MATLAB_PATH="/Applications/MATLAB_R2018a.app"
 
@@ -133,11 +133,10 @@
 
 	# Run tests, redirecting output to logfile and suppressing output to console
-	${MATLAB_PATH}/bin/matlab -nojvm -nosplash -r "try, addpath ${ISSM_DIR}/bin ${ISSM_DIR}/lib; runme(${MATLAB_NROPTIONS}); exit; catch me,fprintf('%s',getReport(me)); exit; end" -logfile matlab.log &> /dev/null
+	${MATLAB_PATH}/bin/matlab -nojvm -nosplash -nojvm -r "try, addpath ${ISSM_DIR}/bin ${ISSM_DIR}/lib; runme(${MATLAB_NROPTIONS}); exit; catch me,fprintf('%s',getReport(me)); exit; end" &> matlab.log
 
 	# Check that MATLAB did not exit in error
-	matlabExitCode=`echo $?`
-	matlabExitedInError=`grep -E "Activation cannot proceed|Error in matlab_run" matlab.log | wc -l`
+	matlabExitedInError=`grep -E "Activation cannot proceed|Error in matlab_run|Illegal use of reserved keyword" matlab.log | wc -l`
 
-	if [[ ${matlabExitCode} -ne 0 || ${matlabExitedInError} -ne 0 ]]; then
+	if [ ${matlabExitedInError} -ne 0 ]; then
 		echo "----------MATLAB exited in error!----------"
 		cat matlab.log
Index: /issm/trunk/packagers/mac/package-issm-mac-binaries-python-2.sh
===================================================================
--- /issm/trunk/packagers/mac/package-issm-mac-binaries-python-2.sh	(revision 27035)
+++ /issm/trunk/packagers/mac/package-issm-mac-binaries-python-2.sh	(revision 27035)
@@ -0,0 +1,179 @@
+#!/bin/bash
+
+################################################################################
+# Packages and tests ISSM distributable package for macOS with Python 2 API.
+#
+# Options:
+# -s/--skiptests		Skip testing during packaging Use if packaging fails 
+#						for some reason but build is valid.
+#
+# NOTE:
+# - Assumes that the following constants are defined,
+#
+#		COMPRESSED_PKG
+#		ISSM_DIR
+#		PKG
+#
+# See also:
+# - packagers/mac/complete-issm-mac-binaries-python-2.sh
+# - packagers/mac/sign-issm-mac-binaries-python-2.sh
+################################################################################
+
+# Expand aliases within the context of this script
+shopt -s expand_aliases
+
+# From https://developer.apple.com/documentation/macos-release-notes/macos-catalina-10_15-release-notes,
+#
+#	Command line tool support for Subversion — including svn, git-svn, and 
+#	related commands — is no longer provided by Xcode. (50266910)
+#
+# which results in,
+#
+#	svn: error: The subversion command line tools are no longer provided by 
+#	Xcode.
+#
+# when calling svn, even when subversion is installed via Homebrew and its path 
+# is available in PATH.
+#
+# NOTE: May be able to remove this after updating macOS.
+#
+#alias svn='/usr/local/bin/svn'
+
+## Override certain other aliases
+#
+alias grep=$(which grep)
+
+## Constants
+#
+PYTHON_NROPTIONS="--benchmark all --exclude 125 126 234 235 418 420 435 444 445 701 702 703 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1201 1202 1203 1204 1205 1206 1207 1208 1301 1302 1303 1304 1401 1402 1601 1602 2002 2003 2004 2005 2006 2007 2008 2010 2011 2021 2051 2052 2053 2084 2085 2090 2101 2424 2425 3001:3200 3201 3202 3300 3480 3481 4001 4002 4003" # NOTE: Combination of test suites from basic, Dakota, and Solid Earth builds, with tests that require a restart and those that require the JVM excluded
+
+## Environment
+#
+export PATH="${ISSM_DIR}/bin:$(getconf PATH)" # Ensure that we pick up binaries from 'bin' directory rather than 'externalpackages'
+
+## Parse options
+#
+if [ $# -gt 1 ]; then
+	echo "Can use only one option at a time"
+	exit 1
+fi
+
+skip_tests=0
+
+if [ $# -eq 1 ]; then
+	case $1 in
+		-s|--skiptests)	skip_tests=1;					;;
+		*) echo "Unknown parameter passed: $1"; exit 1	;;
+	esac
+fi
+
+# Clean up from previous packaging
+echo "Cleaning up existing assets"
+cd ${ISSM_DIR}
+rm -rf ${PKG} ${COMPRESSED_PKG}
+mkdir ${PKG}
+
+# Add required binaries and libraries to package and modify them where needed
+cd ${ISSM_DIR}/bin
+
+echo "Modify generic"
+cat generic_static.py | sed -e "s/generic_static/generic/g" > generic.py
+
+echo "Moving MPICH binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec ]; then
+	cp ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec .
+	cp ${ISSM_DIR}/externalpackages/petsc/install/bin/hydra_pmi_proxy .
+elif [ -f ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec ]; then
+	cp ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec .
+	cp ${ISSM_DIR}/externalpackages/mpich/install/bin/hydra_pmi_proxy .
+else
+	echo "MPICH not found"
+	exit 1
+fi
+
+echo "Moving GDAL binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/gdal/install/bin/gdal-config ]; then
+	cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdalsrsinfo .
+	cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdaltransform .
+else
+	echo "GDAL not found"
+	exit 1
+fi
+
+echo "Moving GMT binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt-config ]; then
+	cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt .
+	cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmtselect .
+else
+	echo "GMT not found"
+	exit 1
+fi
+
+echo "Moving Gmsh binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh ]; then
+	cp ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh .
+else
+	echo "Gmsh not found"
+	exit 1
+fi
+
+# Run tests
+if [ ${skip_tests} -eq 0 ]; then
+	echo "Running tests"
+	cd ${ISSM_DIR}/test/NightlyRun
+	rm python.log 2> /dev/null
+
+	# Set Python environment
+	export PYTHONPATH="${ISSM_DIR}/src/m/dev"
+	export PYTHONSTARTUP="${PYTHONPATH}/devpath.py"
+	export PYTHONUNBUFFERED=1 # We don't want Python to buffer output, otherwise issm.exe output is not captured
+
+	# Run tests, redirecting output to logfile and suppressing output to console
+	./runme.py ${PYTHON_NROPTIONS} &> python.log 2>&1
+
+	# Check that Python did not exit in error
+	pythonExitCode=`echo $?`
+	pythonExitedInError=`grep -E "Error|Standard exception|Traceback|bad interpreter" python.log | wc -l`
+
+	if [[ ${pythonExitCode} -ne 0 || ${pythonExitedInError} -ne 0 ]]; then
+		echo "----------Python exited in error!----------"
+		cat python.log
+		echo "-----------End of python.log-----------"
+
+		# Clean up execution directory
+		rm -rf ${ISSM_DIR}/execution/*
+
+		exit 1
+	fi
+
+	# Check that all tests passed
+	numTestsFailed=`cat python.log | grep -c -e "FAILED|ERROR"`
+
+	if [ ${numTestsFailed} -ne 0 ]; then
+		echo "One or more tests FAILED"
+		exit 1
+	else
+		echo "All tests PASSED"
+	fi
+else
+	echo "Skipping tests"
+fi
+
+# Create package
+cd ${ISSM_DIR}
+svn cleanup --remove-ignored --remove-unversioned test # Clean up test directory (before copying to package)
+echo "Copying assets to package: ${PKG}"
+cp -rf bin examples lib scripts test ${PKG}
+mkdir ${PKG}/execution
+cp packagers/mac/issm-executable_entitlements.plist ${PKG}/bin/entitlements.plist
+${ISSM_DIR}/scripts/py_to_pyc.sh ${PKG}/bin # Compile Python source files
+echo "Cleaning up unneeded/unwanted files"
+rm -f ${PKG}/bin/*.py # Remove all Python scripts
+rm -f ${PKG}/bin/generic_static.* # Remove static versions of generic cluster classes
+rm -f ${PKG}/lib/*.a # Remove static libraries from package
+rm -f ${PKG}/lib/*.la # Remove libtool libraries from package
+rm -rf ${PKG}/test/SandBox # Remove testing sandbox from package
+
+# Compress package
+echo "Compressing package"
+ditto -ck --sequesterRsrc --keepParent ${PKG} ${COMPRESSED_PKG}
Index: /issm/trunk/packagers/mac/package-issm-mac-binaries-python-3.sh
===================================================================
--- /issm/trunk/packagers/mac/package-issm-mac-binaries-python-3.sh	(revision 27035)
+++ /issm/trunk/packagers/mac/package-issm-mac-binaries-python-3.sh	(revision 27035)
@@ -0,0 +1,182 @@
+#!/bin/bash
+
+################################################################################
+# Packages and tests ISSM distributable package for macOS with Python 3 API.
+#
+# Options:
+# -s/--skiptests		Skip testing during packaging Use if packaging fails 
+#						for some reason but build is valid.
+#
+# NOTE:
+# - Assumes that the following constants are defined,
+#
+#		COMPRESSED_PKG
+#		ISSM_DIR
+#		PKG
+#
+# See also:
+# - packagers/mac/complete-issm-mac-binaries-python-3.sh
+# - packagers/mac/sign-issm-mac-binaries-python-3.sh
+################################################################################
+
+# Expand aliases within the context of this script
+shopt -s expand_aliases
+
+# From https://developer.apple.com/documentation/macos-release-notes/macos-catalina-10_15-release-notes,
+#
+#	Command line tool support for Subversion — including svn, git-svn, and 
+#	related commands — is no longer provided by Xcode. (50266910)
+#
+# which results in,
+#
+#	svn: error: The subversion command line tools are no longer provided by 
+#	Xcode.
+#
+# when calling svn, even when subversion is installed via Homebrew and its path 
+# is available in PATH.
+#
+# NOTE: May be able to remove this after updating macOS.
+#
+#alias svn='/usr/local/bin/svn'
+
+## Override certain other aliases
+#
+alias grep=$(which grep)
+
+## Constants
+#
+PYTHON_NROPTIONS="--benchmark all --exclude 125 126 234 235 418 420 435 444 445 701 702 703 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1201 1202 1203 1204 1205 1206 1207 1208 1301 1302 1303 1304 1401 1402 1601 1602 2002 2003 2004 2005 2006 2007 2008 2010 2011 2021 2051 2052 2053 2084 2085 2090 2101 2424 2425 3001:3200 3201 3202 3300 3480 3481 4001 4002 4003" # NOTE: Combination of test suites from basic, Dakota, and Solid Earth builds, with tests that require a restart and those that require the JVM excluded
+
+## Environment
+#
+export PATH="${ISSM_DIR}/bin:$(getconf PATH)" # Ensure that we pick up binaries from 'bin' directory rather than 'externalpackages'
+
+## Parse options
+#
+if [ $# -gt 1 ]; then
+	echo "Can use only one option at a time"
+	exit 1
+fi
+
+skip_tests=0
+
+if [ $# -eq 1 ]; then
+	case $1 in
+		-s|--skiptests)	skip_tests=1;					;;
+		*) echo "Unknown parameter passed: $1"; exit 1	;;
+	esac
+fi
+
+# Clean up from previous packaging
+echo "Cleaning up existing assets"
+cd ${ISSM_DIR}
+rm -rf ${PKG} ${COMPRESSED_PKG}
+mkdir ${PKG}
+
+# Add required binaries and libraries to package and modify them where needed
+cd ${ISSM_DIR}/bin
+
+echo "Modify generic"
+cat generic_static.py | sed -e "s/generic_static/generic/g" > generic.py
+
+echo "Moving MPICH binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec ]; then
+	cp ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec .
+	cp ${ISSM_DIR}/externalpackages/petsc/install/bin/hydra_pmi_proxy .
+elif [ -f ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec ]; then
+	cp ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec .
+	cp ${ISSM_DIR}/externalpackages/mpich/install/bin/hydra_pmi_proxy .
+else
+	echo "MPICH not found"
+	exit 1
+fi
+
+echo "Moving GDAL binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/gdal/install/bin/gdal-config ]; then
+	cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdalsrsinfo .
+	cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdaltransform .
+else
+	echo "GDAL not found"
+	exit 1
+fi
+
+echo "Moving GMT binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt-config ]; then
+	cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt .
+	cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmtselect .
+else
+	echo "GMT not found"
+	exit 1
+fi
+
+echo "Moving Gmsh binaries to bin/"
+if [ -f ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh ]; then
+	cp ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh .
+else
+	echo "Gmsh not found"
+	exit 1
+fi
+
+# Run tests
+if [ ${skip_tests} -eq 0 ]; then
+	echo "Running tests"
+	cd ${ISSM_DIR}/test/NightlyRun
+	rm python.log 2> /dev/null
+
+	# Set Python environment
+	export PYTHONPATH="${ISSM_DIR}/src/m/dev"
+	export PYTHONSTARTUP="${PYTHONPATH}/devpath.py"
+	export PYTHONUNBUFFERED=1 # We don't want Python to buffer output, otherwise issm.exe output is not captured
+
+	# Ensure that runme.py uses Python 3 interpreter
+	sed -i '' "s|/usr/bin/env python|/usr/local/bin/python3|g" ./runme.py
+
+	# Run tests, redirecting output to logfile and suppressing output to console
+	./runme.py ${PYTHON_NROPTIONS} &> python.log 2>&1
+
+	# Check that Python did not exit in error
+	pythonExitCode=`echo $?`
+	pythonExitedInError=`grep -E "Error|Standard exception|Traceback|bad interpreter" python.log | wc -l`
+
+	if [[ ${pythonExitCode} -ne 0 || ${pythonExitedInError} -ne 0 ]]; then
+		echo "----------Python exited in error!----------"
+		cat python.log
+		echo "-----------End of python.log-----------"
+
+		# Clean up execution directory
+		rm -rf ${ISSM_DIR}/execution/*
+
+		exit 1
+	fi
+
+	# Check that all tests passed
+	numTestsFailed=`cat python.log | grep -c -e "FAILED|ERROR"`
+
+	if [ ${numTestsFailed} -ne 0 ]; then
+		echo "One or more tests FAILED"
+		exit 1
+	else
+		echo "All tests PASSED"
+	fi
+else
+	echo "Skipping tests"
+fi
+
+# Create package
+cd ${ISSM_DIR}
+svn cleanup --remove-ignored --remove-unversioned test # Clean up test directory (before copying to package)
+echo "Copying assets to package: ${PKG}"
+cp -rf bin examples lib scripts test ${PKG}
+mkdir ${PKG}/execution
+cp packagers/mac/issm-executable_entitlements.plist ${PKG}/bin/entitlements.plist
+${ISSM_DIR}/scripts/py_to_pyc.sh ${PKG}/bin # Compile Python source files
+echo "Cleaning up unneeded/unwanted files"
+rm -f ${PKG}/bin/*.py # Remove all Python scripts
+rm -f ${PKG}/bin/generic_static.* # Remove static versions of generic cluster classes
+rm -f ${PKG}/lib/*.a # Remove static libraries from package
+rm -f ${PKG}/lib/*.la # Remove libtool libraries from package
+rm -rf ${PKG}/test/SandBox # Remove testing sandbox from package
+
+# Compress package
+echo "Compressing package"
+ditto -ck --sequesterRsrc --keepParent ${PKG} ${COMPRESSED_PKG}
Index: sm/trunk/packagers/mac/package-issm-mac-binaries-python.sh
===================================================================
--- /issm/trunk/packagers/mac/package-issm-mac-binaries-python.sh	(revision 27034)
+++ 	(revision )
@@ -1,179 +1,0 @@
-#!/bin/bash
-
-################################################################################
-# Packages and tests ISSM distributable package for macOS with Python API.
-#
-# Options:
-# -s/--skiptests		Skip testing during packaging Use if packaging fails 
-#						for some reason but build is valid.
-#
-# NOTE:
-# - Assumes that the following constants are defined,
-#
-#		COMPRESSED_PKG
-#		ISSM_DIR
-#		PKG
-#
-# See also:
-# - packagers/mac/complete-issm-mac-binaries-python.sh
-# - packagers/mac/sign-issm-mac-binaries-python.sh
-################################################################################
-
-# Expand aliases within the context of this script
-shopt -s expand_aliases
-
-# From https://developer.apple.com/documentation/macos-release-notes/macos-catalina-10_15-release-notes,
-#
-#	Command line tool support for Subversion — including svn, git-svn, and 
-#	related commands — is no longer provided by Xcode. (50266910)
-#
-# which results in,
-#
-#	svn: error: The subversion command line tools are no longer provided by 
-#	Xcode.
-#
-# when calling svn, even when subversion is installed via Homebrew and its path 
-# is available in PATH.
-#
-# NOTE: May be able to remove this after updating macOS.
-#
-alias svn='/usr/local/bin/svn'
-
-## Override certain other aliases
-#
-alias grep=$(which grep)
-
-## Constants
-#
-PYTHON_NROPTIONS="--benchmark all --exclude 125 126 234 235 418 420 435 444 445 701 702 703 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1201 1202 1203 1204 1205 1206 1207 1208 1301 1302 1303 1304 1401 1402 1601 1602 2006 2020 2021 2051 2052 2053 3001:3200 3201 3202 3300 3480 3481 4001 4002 4003" # NOTE: Combination of test suites from basic, Dakota, and Solid Earth builds, with tests that require a restart and those that require the JVM excluded
-
-## Environment
-#
-export PATH="${ISSM_DIR}/bin:$(getconf PATH)" # Ensure that we pick up binaries from 'bin' directory rather than 'externalpackages'
-
-## Parse options
-#
-if [ $# -gt 1 ]; then
-	echo "Can use only one option at a time"
-	exit 1
-fi
-
-skip_tests=0
-
-if [ $# -eq 1 ]; then
-	case $1 in
-		-s|--skiptests)	skip_tests=1;					;;
-		*) echo "Unknown parameter passed: $1"; exit 1	;;
-	esac
-fi
-
-# Clean up from previous packaging
-echo "Cleaning up existing assets"
-cd ${ISSM_DIR}
-rm -rf ${PKG} ${COMPRESSED_PKG}
-mkdir ${PKG}
-
-# Add required binaries and libraries to package and modify them where needed
-cd ${ISSM_DIR}/bin
-
-echo "Modify generic"
-cat generic_static.py | sed -e "s/generic_static/generic/g" > generic.py
-
-echo "Moving MPICH binaries to bin/"
-if [ -f ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec ]; then
-	cp ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec .
-	cp ${ISSM_DIR}/externalpackages/petsc/install/bin/hydra_pmi_proxy .
-elif [ -f ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec ]; then
-	cp ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec .
-	cp ${ISSM_DIR}/externalpackages/mpich/install/bin/hydra_pmi_proxy .
-else
-	echo "MPICH not found"
-	exit 1
-fi
-
-echo "Moving GDAL binaries to bin/"
-if [ -f ${ISSM_DIR}/externalpackages/gdal/install/bin/gdal-config ]; then
-	cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdalsrsinfo .
-	cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdaltransform .
-else
-	echo "GDAL not found"
-	exit 1
-fi
-
-echo "Moving GMT binaries to bin/"
-if [ -f ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt-config ]; then
-	cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt .
-	cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmtselect .
-else
-	echo "GMT not found"
-	exit 1
-fi
-
-echo "Moving Gmsh binaries to bin/"
-if [ -f ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh ]; then
-	cp ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh .
-else
-	echo "Gmsh not found"
-	exit 1
-fi
-
-# Run tests
-if [ ${skip_tests} -eq 0 ]; then
-	echo "Running tests"
-	cd ${ISSM_DIR}/test/NightlyRun
-	rm python.log 2> /dev/null
-
-	# Set Python environment
-	export PYTHONPATH="${ISSM_DIR}/src/m/dev"
-	export PYTHONSTARTUP="${PYTHONPATH}/devpath.py"
-	export PYTHONUNBUFFERED=1 # We don't want Python to buffer output, otherwise issm.exe output is not captured
-
-	# Run tests, redirecting output to logfile and suppressing output to console
-	./runme.py ${PYTHON_NROPTIONS} &> python.log 2>&1
-
-	# Check that Python did not exit in error
-	pythonExitCode=`echo $?`
-	pythonExitedInError=`grep -E "Error|Standard exception|Traceback|bad interpreter" python.log | wc -l`
-
-	if [[ ${pythonExitCode} -ne 0 || ${pythonExitedInError} -ne 0 ]]; then
-		echo "----------Python exited in error!----------"
-		cat python.log
-		echo "-----------End of python.log-----------"
-
-		# Clean up execution directory
-		rm -rf ${ISSM_DIR}/execution/*
-
-		exit 1
-	fi
-
-	# Check that all tests passed
-	numTestsFailed=`cat python.log | grep -c -e "FAILED|ERROR"`
-
-	if [ ${numTestsFailed} -ne 0 ]; then
-		echo "One or more tests FAILED"
-		exit 1
-	else
-		echo "All tests PASSED"
-	fi
-else
-	echo "Skipping tests"
-fi
-
-# Create package
-cd ${ISSM_DIR}
-svn cleanup --remove-ignored --remove-unversioned test # Clean up test directory (before copying to package)
-echo "Copying assets to package: ${PKG}"
-cp -rf bin examples lib scripts test ${PKG}
-mkdir ${PKG}/execution
-cp packagers/mac/issm-executable_entitlements.plist ${PKG}/bin/entitlements.plist
-${ISSM_DIR}/scripts/py_to_pyc.sh ${PKG}/bin # Compile Python source files
-echo "Cleaning up unneeded/unwanted files"
-rm -f ${PKG}/bin/*.py # Remove all Python scripts
-rm -f ${PKG}/bin/generic_static.* # Remove static versions of generic cluster classes
-rm -f ${PKG}/lib/*.a # Remove static libraries from package
-rm -f ${PKG}/lib/*.la # Remove libtool libraries from package
-rm -rf ${PKG}/test/SandBox # Remove testing sandbox from package
-
-# Compress package
-echo "Compressing package"
-ditto -ck --sequesterRsrc --keepParent ${PKG} ${COMPRESSED_PKG}
Index: /issm/trunk/packagers/mac/sign-issm-mac-binaries-matlab.sh
===================================================================
--- /issm/trunk/packagers/mac/sign-issm-mac-binaries-matlab.sh	(revision 27034)
+++ /issm/trunk/packagers/mac/sign-issm-mac-binaries-matlab.sh	(revision 27035)
@@ -67,5 +67,5 @@
 # NOTE: May be able to remove this after updating macOS.
 #
-alias svn='/usr/local/bin/svn'
+#alias svn='/usr/local/bin/svn'
 
 ## Override certain other aliases
Index: /issm/trunk/packagers/mac/sign-issm-mac-binaries-python-2.sh
===================================================================
--- /issm/trunk/packagers/mac/sign-issm-mac-binaries-python-2.sh	(revision 27035)
+++ /issm/trunk/packagers/mac/sign-issm-mac-binaries-python-2.sh	(revision 27035)
@@ -0,0 +1,348 @@
+#!/bin/bash
+
+################################################################################
+# Intended to be run in the context of a Jenkins project on a JPL 
+# Cybersecurity server for signing macOS applications. Polls SCM of the 
+# Subversion repository hosted at 
+# https://issm.ess.uci.edu/svn/issm-binaries/mac/python/2/unsigned to trigger 
+# new builds.
+#
+# In order to replicate the requried Jenkins project configuration:
+# - First, navigate to 'Manage Jenkins' -> 'Manage Plugins' and install the 
+#	'Credentials Bindings Plugin' if it is not already installed.
+# - Contact one of the members of the ISSM development team for crendentials 
+#	for the ISSM binaries repository (mention that the credentials are stored 
+#	in ISSM-Infrastructure.pdf).
+# - Navigate to 'Manage Jenkins' -> 'Manage Credentials' -> <domain> -> 
+#	'Add Credentials' and enter the crendentials from above.
+# - From the 'Dashboard', select 'New Item' -> 'Freestyle project'.
+# - Under 'Source Code Management', select 'Subversion'.
+#		- The 'Repository URL' text field should be set to 
+#		"https://issm.ess.uci.edu/svn/issm-binaries/mac/matlab/unsigned".
+#		- The 'Credentials' select menu should be set to the new credentials 
+#		created previously.
+#		- The 'Local module directory' text field should be set to the same 
+#		value as the constant UNSIGNED_REPO_COPY (set below to './unsigned').
+# - Under 'Build Trigggers', check the box for 'Poll SCM' and set the 
+#	'Schedule' text area to "H/5 * * * *".
+# - Under 'Build Environment', check the box for 'Use secret text(s) or 
+#	file(s)', then under 'Bindings' click the 'Add...' button and select 
+#	'Username and password (separated)'.
+#		- Set 'Username Variable' to "ISSM_BINARIES_USER".
+#		- Set 'Password Variable' to "ISSM_BINARIES_PASS".
+# - Under 'Credentials', select the same, new credentials that created 
+#	previously.
+# - The contents of this script can be copied/pasted directly into the ‘Build' 
+#	-> 'Execute Shell' -> ‘Command' textarea of the project configuration (or 
+#	you can simply store the script on disk and call it from there).
+# - Make sure to click the 'Save' button.
+#
+# Current point of contact at JPL Cybersecurity:
+#	Alex Coward, alexander.g.coward@jpl.nasa.gov
+#
+# NOTE:
+# - Assumes that "ISSM_BINARIES_USER" and "ISSM_BINARIES_PASS" are set up in 
+#	the 'Bindings' section under a 'Username and password (separated)' binding 
+#	(requires 'Credentials Binding Plugin').
+# - For local debugging, the aformentioned credentials can be hardcoded into 
+#	the 'USERNAME' and 'PASSWORD' constants below.
+################################################################################
+
+# Expand aliases within the context of this script
+shopt -s expand_aliases
+
+# From https://developer.apple.com/documentation/macos-release-notes/macos-catalina-10_15-release-notes,
+#
+#	Command line tool support for Subversion — including svn, git-svn, and 
+#	related commands — is no longer provided by Xcode. (50266910)
+#
+# which results in,
+#
+#	svn: error: The subversion command line tools are no longer provided by 
+#	Xcode.
+#
+# when calling svn, even when subversion is installed via Homebrew and its path 
+# is available in PATH.
+#
+# NOTE: May be able to remove this after updating macOS.
+#
+#alias svn='/usr/local/bin/svn'
+
+## Override certain other aliases
+#
+alias cp=$(which cp)
+alias grep=$(which grep)
+
+## Constants
+#
+AD_IDENTITY="**********" # Apple Developer identity
+AD_USERNAME="**********" # Apple Developer username
+ALTOOL_PASSWORD="@keychain:**********" # altool password (assumed to be stored in keychain)
+ASC_PROVIDER="**********"
+MAX_SVN_ATTEMPTS=10
+NOTARIZATION_CHECK_ATTEMPTS=20
+NOTARIZATION_CHECK_PERIOD=60
+NOTARIZATION_LOGFILE="notarization.log"
+NOTARIZATION_LOGFILE_PATH="."
+PASSWORD=${ISSM_BINARIES_PASS}
+PKG="ISSM-macOS-Python-2"
+PRIMARY_BUNDLE_ID="gov.nasa.jpl.issm.python"
+SIGNED_REPO_COPY="./signed"
+SIGNED_REPO_URL="https://issm.ess.uci.edu/svn/issm-binaries/mac/python/2/signed"
+SIGNING_LOCK_FILE="signing.lock"
+SUCCESS_LOGFILE="${SIGNED_REPO_COPY}/success.log"
+UNSIGNED_REPO_COPY="./unsigned"
+UNSIGNED_REPO_URL="https://issm.ess.uci.edu/svn/issm-binaries/mac/python/2/unsigned"
+USERNAME=${ISSM_BINARIES_USER}
+
+COMPRESSED_PKG="${PKG}.zip"
+EXE_ENTITLEMENTS_PLIST="${PKG}/bin/entitlements.plist"
+
+# NOTE: Uncomment the following for local testing (Jenkins checks out copy of 
+#		repository for unsigned packages to working directory)
+#
+
+# # Clean up from previous packaging (not necessary for single builds on Jenkins, 
+# # but useful when testing packaging locally)
+# echo "Cleaning up existing assets"
+# rm -rf ${COMPRESSED_PKG} ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE} ${UNSIGNED_REPO_COPY}
+
+# # Check out copy of repository for unsigned packages
+# echo "Checking out copy of respository for unsigned packages"
+# svn checkout \
+# 	--trust-server-cert \
+# 	--non-interactive \
+# 	--username ${USERNAME} \
+# 	--password ${PASSWORD} \
+# 	${UNSIGNED_REPO_URL} \
+# 	${UNSIGNED_REPO_COPY}
+
+rm -rf ${PKG} ${SIGNED_REPO_COPY}
+
+
+# Extract package contents
+echo "Extracting package contents"
+ditto -xk ${UNSIGNED_REPO_COPY}/${COMPRESSED_PKG} .
+
+# Clear extended attributes on all files
+xattr -cr ${PKG}
+
+# Build list of ISSM executables
+ISSM_BINS=$(\
+	find ${PKG}/bin -type f -name *.exe; \
+	find ${PKG}/bin -type f -name *.pyc; \
+)
+
+# Build list of third party executables
+THIRD_PARTY_BINS=$(\
+	echo ${PKG}/bin/mpiexec; \
+	echo ${PKG}/bin/hydra_pmi_proxy; \
+	echo ${PKG}/bin/gdalsrsinfo; \
+	echo ${PKG}/bin/gdaltransform; \
+	echo ${PKG}/bin/gmt; \
+	echo ${PKG}/bin/gmtselect; \
+	echo ${PKG}/bin/gmsh; \
+)
+
+# Sign all executables in package
+echo "Signing all executables in package"
+codesign -s ${AD_IDENTITY} --timestamp --options=runtime --entitlements ${EXE_ENTITLEMENTS_PLIST} ${ISSM_BINS}
+codesign -s ${AD_IDENTITY} --timestamp --options=runtime ${THIRD_PARTY_BINS}
+
+# Build list of ISSM libraries
+ISSM_LIBS=$(\
+	find ${PKG}/lib -type f -name *.so; \
+)
+
+# Sign all libraries in package
+echo "Signing all libraries in package"
+codesign -s ${AD_IDENTITY} --timestamp --options=runtime ${ISSM_LIBS}
+
+# NOTE: Skipping signature validation because this is not a true package nor app
+
+# Compress signed package
+echo "Compressing signed package"
+ditto -ck --sequesterRsrc --keepParent ${PKG} ${COMPRESSED_PKG}
+
+# Submit compressed package for notarization
+echo "Submitting signed package to Apple for notarization"
+xcrun altool --notarize-app --primary-bundle-id ${PRIMARY_BUNDLE_ID} --username ${AD_USERNAME} --password ${ALTOOL_PASSWORD} --asc-provider ${ASC_PROVIDER} --file ${COMPRESSED_PKG} &> ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE}
+
+# Sleep until notarization request response is received
+echo "Waiting for notarizaion request response"
+while [[ ! -f ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE} || ! -z $(find ${NOTARIZATION_LOGFILE_PATH} -empty -name ${NOTARIZATION_LOGFILE}) ]]; do
+	sleep 30
+done
+
+echo "Notarizaion request response received"
+
+# Check if UUID exists in response
+HAS_UUID=$(grep 'RequestUUID = ' ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE}) # NOTE: Checking for "RequestUUID = " because "RequestUUID" shows up in some error messages
+if [ -z "${HAS_UUID}" ]; then
+	echo "Notarization failed!"
+	echo "----------------------- Contents of notarization logfile -----------------------"
+	cat ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE}
+	echo "--------------------------------------------------------------------------------"
+
+	# Clean up
+	rm -rf ${PKG} ${COMPRESSED_PKG}
+
+	exit 1
+fi
+
+# Get UUID from notarization request response
+UUID=$(echo ${HAS_UUID} | sed 's/[[:space:]]*RequestUUID = //')
+echo "UUID: ${UUID}" 
+
+# Check notarization status
+#
+# NOTE: Currently, this checks if notarization was successful, but we are not 
+#		able to staple notarization as this is not a true package nor app and, 
+#		at the very least, MATLAB Mex files cannot be stapled. As such, clients 
+#		will not be able to clear Gatekeeper if they are offline.
+#
+echo "Checking notarization status"
+SUCCESS=0
+for ATTEMPT in $(seq 1 ${NOTARIZATION_CHECK_ATTEMPTS}); do
+	echo "    Attempt #${ATTEMPT}..."
+	xcrun altool --notarization-info ${UUID} --username ${AD_USERNAME} --password ${ALTOOL_PASSWORD} &> ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE}
+	if [[ -f ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE} && -z $(find ${NOTARIZATION_LOGFILE_PATH} -empty -name ${NOTARIZATION_LOGFILE}) ]]; then
+
+		# First, check if there is an error
+		ERROR_CHECK=$(grep 'Error' ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE})
+		if [ ! -z "${ERROR_CHECK}" ]; then
+			break
+		fi
+
+		# No error, so check status
+		STATUS=$(grep 'Status:' ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE} | sed -e 's/[[:space:]]*Status: //')
+		if [[ "${STATUS}" == "success" ]]; then
+			# Staple notarization to all elements of package that were previously signed
+			#xcrun stapler staple ${THIRD_PARTY_BINS} # NOTE: Fails with "Stapler is incapable of working with MATLAB Mex files."
+
+			# Validate stapling of notarization
+			#xcrun stapler validation ${THIRD_PARTY_BINS} # NOTE: Skipping notarization stapling validation because this is not a true package nor app
+
+			# Compress signed and notarized package
+			ditto -ck --sequesterRsrc --keepParent ${PKG} ${COMPRESSED_PKG}
+
+			# Set flag indicating notarization was successful
+			SUCCESS=1
+
+			break
+		elif [[ "${STATUS}" == "in progress" ]]; then
+			echo "    ...in progress still; checking again in ${NOTARIZATION_CHECK_PERIOD} seconds."
+			sleep ${NOTARIZATION_CHECK_PERIOD}
+		elif [[ "${STATUS}" == "invalid" ]]; then
+			break
+		fi
+	else
+		if [ ${ATTEMPT} -lt ${NOTARIZATION_CHECK_ATTEMPTS} ]; then
+			echo "    ...not ready yet; checking again in ${NOTARIZATION_CHECK_PERIOD} seconds"
+			sleep ${NOTARIZATION_CHECK_PERIOD}
+		else
+			echo "    ...maximum attempts reached, but no response, or something else went wrong"
+			echo "    If contents of notarization status check logfile appear to be valid, increase NOTARIZATION_CHECK_ATTEMPTS and run again"
+			break
+		fi
+	fi
+done
+
+if [ ${SUCCESS} -eq 1 ]; then
+	echo "Notarization successful!"
+else
+	echo "Notarization failed!"
+	echo "----------------------- Contents of notarization logfile -----------------------"
+	cat ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE}
+	echo "--------------------------------------------------------------------------------"
+fi
+
+# Check out copy of repository for signed packages
+echo "Checking out copy of respository for signed packages"
+SVN_ATTEMPT=0
+SVN_SUCCESS=0
+while [[ ${SVN_ATTEMPT} -lt ${MAX_SVN_ATTEMPTS} && ${SVN_SUCCESS} -eq 0 ]]; do
+	rm -rf ${SIGNED_REPO_COPY}
+	svn checkout \
+		--trust-server-cert \
+		--non-interactive \
+		--username ${USERNAME} \
+		--password ${PASSWORD} \
+		${SIGNED_REPO_URL} \
+		${SIGNED_REPO_COPY} > /dev/null 2>&1
+	if [ $? -eq 0 ]; then
+		SVN_SUCCESS=1
+		break
+	else
+		((++SVN_ATTEMPT))
+		sleep 5
+	fi
+done
+
+if [ ${SVN_SUCCESS} -eq 0 ]; then
+	echo "Checkout of respository for signed packages failed"
+	exit 1
+fi
+
+# Copy notarization file to repository for signed packages
+cp ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE} ${SIGNED_REPO_COPY}
+svn add ${SIGNED_REPO_COPY}/${NOTARIZATION_LOGFILE} > /dev/null 2>&1
+
+# Remove lock file from repository for signed packages
+svn delete ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE}
+
+SVN_ATTEMPT=0
+SVN_SUCCESS=0
+if [ ${SUCCESS} -eq 1 ]; then
+	# Copy signed package to repository for signed packages
+	cp ${COMPRESSED_PKG} ${SIGNED_REPO_COPY}
+	svn add ${SIGNED_REPO_COPY}/${COMPRESSED_PKG} > /dev/null 2>&1
+
+	# Commit changes
+	echo "Committing changes to repository for signed packages"
+	while [[ ${SVN_ATTEMPT} -lt ${MAX_SVN_ATTEMPTS} && ${SVN_SUCCESS} -eq 0 ]]; do
+		svn commit \
+			--trust-server-cert \
+			--non-interactive \
+			--username ${USERNAME} \
+			--password ${PASSWORD} \
+			--message "CHG: New signed package (success)" ${SIGNED_REPO_COPY} > /dev/null 2>&1
+		if [ $? -eq 0 ]; then
+			SVN_SUCCESS=1
+			break
+		else
+			((++SVN_ATTEMPT))
+			sleep 5
+		fi
+	done
+
+	if [ ${SVN_SUCCESS} -eq 0 ]; then
+		echo "Commit to respository for signed packages failed"
+		exit 1
+	fi
+else
+	# Commit changes
+	echo "Committing changes to repository for signed packages"
+	while [[ ${SVN_ATTEMPT} -lt ${MAX_SVN_ATTEMPTS} && ${SVN_SUCCESS} -eq 0 ]]; do
+		svn commit \
+			--trust-server-cert \
+			--non-interactive \
+			--username ${USERNAME} \
+			--password ${PASSWORD} \
+			--message "CHG: New signed package (failure)" ${SIGNED_REPO_COPY} > /dev/null 2>&1
+		if [ $? -eq 0 ]; then
+			SVN_SUCCESS=1
+			break
+		else
+			((++SVN_ATTEMPT))
+			sleep 5
+		fi
+	done
+
+	if [ ${SVN_SUCCESS} -eq 0 ]; then
+		echo "Commit to respository for signed packages failed"
+		exit 1
+	fi
+
+	exit 1
+fi
Index: /issm/trunk/packagers/mac/sign-issm-mac-binaries-python-3.sh
===================================================================
--- /issm/trunk/packagers/mac/sign-issm-mac-binaries-python-3.sh	(revision 27035)
+++ /issm/trunk/packagers/mac/sign-issm-mac-binaries-python-3.sh	(revision 27035)
@@ -0,0 +1,348 @@
+#!/bin/bash
+
+################################################################################
+# Intended to be run in the context of a Jenkins project on a JPL 
+# Cybersecurity server for signing macOS applications. Polls SCM of the 
+# Subversion repository hosted at 
+# https://issm.ess.uci.edu/svn/issm-binaries/mac/python/3/unsigned to trigger 
+# new builds.
+#
+# In order to replicate the requried Jenkins project configuration:
+# - First, navigate to 'Manage Jenkins' -> 'Manage Plugins' and install the 
+#	'Credentials Bindings Plugin' if it is not already installed.
+# - Contact one of the members of the ISSM development team for crendentials 
+#	for the ISSM binaries repository (mention that the credentials are stored 
+#	in ISSM-Infrastructure.pdf).
+# - Navigate to 'Manage Jenkins' -> 'Manage Credentials' -> <domain> -> 
+#	'Add Credentials' and enter the crendentials from above.
+# - From the 'Dashboard', select 'New Item' -> 'Freestyle project'.
+# - Under 'Source Code Management', select 'Subversion'.
+#		- The 'Repository URL' text field should be set to 
+#		"https://issm.ess.uci.edu/svn/issm-binaries/mac/matlab/unsigned".
+#		- The 'Credentials' select menu should be set to the new credentials 
+#		created previously.
+#		- The 'Local module directory' text field should be set to the same 
+#		value as the constant UNSIGNED_REPO_COPY (set below to './unsigned').
+# - Under 'Build Trigggers', check the box for 'Poll SCM' and set the 
+#	'Schedule' text area to "H/5 * * * *".
+# - Under 'Build Environment', check the box for 'Use secret text(s) or 
+#	file(s)', then under 'Bindings' click the 'Add...' button and select 
+#	'Username and password (separated)'.
+#		- Set 'Username Variable' to "ISSM_BINARIES_USER".
+#		- Set 'Password Variable' to "ISSM_BINARIES_PASS".
+# - Under 'Credentials', select the same, new credentials that created 
+#	previously.
+# - The contents of this script can be copied/pasted directly into the ‘Build' 
+#	-> 'Execute Shell' -> ‘Command' textarea of the project configuration (or 
+#	you can simply store the script on disk and call it from there).
+# - Make sure to click the 'Save' button.
+#
+# Current point of contact at JPL Cybersecurity:
+#	Alex Coward, alexander.g.coward@jpl.nasa.gov
+#
+# NOTE:
+# - Assumes that "ISSM_BINARIES_USER" and "ISSM_BINARIES_PASS" are set up in 
+#	the 'Bindings' section under a 'Username and password (separated)' binding 
+#	(requires 'Credentials Binding Plugin').
+# - For local debugging, the aformentioned credentials can be hardcoded into 
+#	the 'USERNAME' and 'PASSWORD' constants below.
+################################################################################
+
+# Expand aliases within the context of this script
+shopt -s expand_aliases
+
+# From https://developer.apple.com/documentation/macos-release-notes/macos-catalina-10_15-release-notes,
+#
+#	Command line tool support for Subversion — including svn, git-svn, and 
+#	related commands — is no longer provided by Xcode. (50266910)
+#
+# which results in,
+#
+#	svn: error: The subversion command line tools are no longer provided by 
+#	Xcode.
+#
+# when calling svn, even when subversion is installed via Homebrew and its path 
+# is available in PATH.
+#
+# NOTE: May be able to remove this after updating macOS.
+#
+#alias svn='/usr/local/bin/svn'
+
+## Override certain other aliases
+#
+alias cp=$(which cp)
+alias grep=$(which grep)
+
+## Constants
+#
+AD_IDENTITY="**********" # Apple Developer identity
+AD_USERNAME="**********" # Apple Developer username
+ALTOOL_PASSWORD="@keychain:**********" # altool password (assumed to be stored in keychain)
+ASC_PROVIDER="**********"
+MAX_SVN_ATTEMPTS=10
+NOTARIZATION_CHECK_ATTEMPTS=20
+NOTARIZATION_CHECK_PERIOD=60
+NOTARIZATION_LOGFILE="notarization.log"
+NOTARIZATION_LOGFILE_PATH="."
+PASSWORD=${ISSM_BINARIES_PASS}
+PKG="ISSM-macOS-Python-3"
+PRIMARY_BUNDLE_ID="gov.nasa.jpl.issm.python"
+SIGNED_REPO_COPY="./signed"
+SIGNED_REPO_URL="https://issm.ess.uci.edu/svn/issm-binaries/mac/python/3/signed"
+SIGNING_LOCK_FILE="signing.lock"
+SUCCESS_LOGFILE="${SIGNED_REPO_COPY}/success.log"
+UNSIGNED_REPO_COPY="./unsigned"
+UNSIGNED_REPO_URL="https://issm.ess.uci.edu/svn/issm-binaries/mac/python/3/unsigned"
+USERNAME=${ISSM_BINARIES_USER}
+
+COMPRESSED_PKG="${PKG}.zip"
+EXE_ENTITLEMENTS_PLIST="${PKG}/bin/entitlements.plist"
+
+# NOTE: Uncomment the following for local testing (Jenkins checks out copy of 
+#		repository for unsigned packages to working directory)
+#
+
+# # Clean up from previous packaging (not necessary for single builds on Jenkins, 
+# # but useful when testing packaging locally)
+# echo "Cleaning up existing assets"
+# rm -rf ${COMPRESSED_PKG} ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE} ${UNSIGNED_REPO_COPY}
+
+# # Check out copy of repository for unsigned packages
+# echo "Checking out copy of respository for unsigned packages"
+# svn checkout \
+# 	--trust-server-cert \
+# 	--non-interactive \
+# 	--username ${USERNAME} \
+# 	--password ${PASSWORD} \
+# 	${UNSIGNED_REPO_URL} \
+# 	${UNSIGNED_REPO_COPY}
+
+rm -rf ${PKG} ${SIGNED_REPO_COPY}
+
+
+# Extract package contents
+echo "Extracting package contents"
+ditto -xk ${UNSIGNED_REPO_COPY}/${COMPRESSED_PKG} .
+
+# Clear extended attributes on all files
+xattr -cr ${PKG}
+
+# Build list of ISSM executables
+ISSM_BINS=$(\
+	find ${PKG}/bin -type f -name *.exe; \
+	find ${PKG}/bin -type f -name *.pyc; \
+)
+
+# Build list of third party executables
+THIRD_PARTY_BINS=$(\
+	echo ${PKG}/bin/mpiexec; \
+	echo ${PKG}/bin/hydra_pmi_proxy; \
+	echo ${PKG}/bin/gdalsrsinfo; \
+	echo ${PKG}/bin/gdaltransform; \
+	echo ${PKG}/bin/gmt; \
+	echo ${PKG}/bin/gmtselect; \
+	echo ${PKG}/bin/gmsh; \
+)
+
+# Sign all executables in package
+echo "Signing all executables in package"
+codesign -s ${AD_IDENTITY} --timestamp --options=runtime --entitlements ${EXE_ENTITLEMENTS_PLIST} ${ISSM_BINS}
+codesign -s ${AD_IDENTITY} --timestamp --options=runtime ${THIRD_PARTY_BINS}
+
+# Build list of ISSM libraries
+ISSM_LIBS=$(\
+	find ${PKG}/lib -type f -name *.so; \
+)
+
+# Sign all libraries in package
+echo "Signing all libraries in package"
+codesign -s ${AD_IDENTITY} --timestamp --options=runtime ${ISSM_LIBS}
+
+# NOTE: Skipping signature validation because this is not a true package nor app
+
+# Compress signed package
+echo "Compressing signed package"
+ditto -ck --sequesterRsrc --keepParent ${PKG} ${COMPRESSED_PKG}
+
+# Submit compressed package for notarization
+echo "Submitting signed package to Apple for notarization"
+xcrun altool --notarize-app --primary-bundle-id ${PRIMARY_BUNDLE_ID} --username ${AD_USERNAME} --password ${ALTOOL_PASSWORD} --asc-provider ${ASC_PROVIDER} --file ${COMPRESSED_PKG} &> ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE}
+
+# Sleep until notarization request response is received
+echo "Waiting for notarizaion request response"
+while [[ ! -f ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE} || ! -z $(find ${NOTARIZATION_LOGFILE_PATH} -empty -name ${NOTARIZATION_LOGFILE}) ]]; do
+	sleep 30
+done
+
+echo "Notarizaion request response received"
+
+# Check if UUID exists in response
+HAS_UUID=$(grep 'RequestUUID = ' ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE}) # NOTE: Checking for "RequestUUID = " because "RequestUUID" shows up in some error messages
+if [ -z "${HAS_UUID}" ]; then
+	echo "Notarization failed!"
+	echo "----------------------- Contents of notarization logfile -----------------------"
+	cat ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE}
+	echo "--------------------------------------------------------------------------------"
+
+	# Clean up
+	rm -rf ${PKG} ${COMPRESSED_PKG}
+
+	exit 1
+fi
+
+# Get UUID from notarization request response
+UUID=$(echo ${HAS_UUID} | sed 's/[[:space:]]*RequestUUID = //')
+echo "UUID: ${UUID}" 
+
+# Check notarization status
+#
+# NOTE: Currently, this checks if notarization was successful, but we are not 
+#		able to staple notarization as this is not a true package nor app and, 
+#		at the very least, MATLAB Mex files cannot be stapled. As such, clients 
+#		will not be able to clear Gatekeeper if they are offline.
+#
+echo "Checking notarization status"
+SUCCESS=0
+for ATTEMPT in $(seq 1 ${NOTARIZATION_CHECK_ATTEMPTS}); do
+	echo "    Attempt #${ATTEMPT}..."
+	xcrun altool --notarization-info ${UUID} --username ${AD_USERNAME} --password ${ALTOOL_PASSWORD} &> ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE}
+	if [[ -f ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE} && -z $(find ${NOTARIZATION_LOGFILE_PATH} -empty -name ${NOTARIZATION_LOGFILE}) ]]; then
+
+		# First, check if there is an error
+		ERROR_CHECK=$(grep 'Error' ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE})
+		if [ ! -z "${ERROR_CHECK}" ]; then
+			break
+		fi
+
+		# No error, so check status
+		STATUS=$(grep 'Status:' ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE} | sed -e 's/[[:space:]]*Status: //')
+		if [[ "${STATUS}" == "success" ]]; then
+			# Staple notarization to all elements of package that were previously signed
+			#xcrun stapler staple ${THIRD_PARTY_BINS} # NOTE: Fails with "Stapler is incapable of working with MATLAB Mex files."
+
+			# Validate stapling of notarization
+			#xcrun stapler validation ${THIRD_PARTY_BINS} # NOTE: Skipping notarization stapling validation because this is not a true package nor app
+
+			# Compress signed and notarized package
+			ditto -ck --sequesterRsrc --keepParent ${PKG} ${COMPRESSED_PKG}
+
+			# Set flag indicating notarization was successful
+			SUCCESS=1
+
+			break
+		elif [[ "${STATUS}" == "in progress" ]]; then
+			echo "    ...in progress still; checking again in ${NOTARIZATION_CHECK_PERIOD} seconds."
+			sleep ${NOTARIZATION_CHECK_PERIOD}
+		elif [[ "${STATUS}" == "invalid" ]]; then
+			break
+		fi
+	else
+		if [ ${ATTEMPT} -lt ${NOTARIZATION_CHECK_ATTEMPTS} ]; then
+			echo "    ...not ready yet; checking again in ${NOTARIZATION_CHECK_PERIOD} seconds"
+			sleep ${NOTARIZATION_CHECK_PERIOD}
+		else
+			echo "    ...maximum attempts reached, but no response, or something else went wrong"
+			echo "    If contents of notarization status check logfile appear to be valid, increase NOTARIZATION_CHECK_ATTEMPTS and run again"
+			break
+		fi
+	fi
+done
+
+if [ ${SUCCESS} -eq 1 ]; then
+	echo "Notarization successful!"
+else
+	echo "Notarization failed!"
+	echo "----------------------- Contents of notarization logfile -----------------------"
+	cat ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE}
+	echo "--------------------------------------------------------------------------------"
+fi
+
+# Check out copy of repository for signed packages
+echo "Checking out copy of respository for signed packages"
+SVN_ATTEMPT=0
+SVN_SUCCESS=0
+while [[ ${SVN_ATTEMPT} -lt ${MAX_SVN_ATTEMPTS} && ${SVN_SUCCESS} -eq 0 ]]; do
+	rm -rf ${SIGNED_REPO_COPY}
+	svn checkout \
+		--trust-server-cert \
+		--non-interactive \
+		--username ${USERNAME} \
+		--password ${PASSWORD} \
+		${SIGNED_REPO_URL} \
+		${SIGNED_REPO_COPY} > /dev/null 2>&1
+	if [ $? -eq 0 ]; then
+		SVN_SUCCESS=1
+		break
+	else
+		((++SVN_ATTEMPT))
+		sleep 5
+	fi
+done
+
+if [ ${SVN_SUCCESS} -eq 0 ]; then
+	echo "Checkout of respository for signed packages failed"
+	exit 1
+fi
+
+# Copy notarization file to repository for signed packages
+cp ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE} ${SIGNED_REPO_COPY}
+svn add ${SIGNED_REPO_COPY}/${NOTARIZATION_LOGFILE} > /dev/null 2>&1
+
+# Remove lock file from repository for signed packages
+svn delete ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE}
+
+SVN_ATTEMPT=0
+SVN_SUCCESS=0
+if [ ${SUCCESS} -eq 1 ]; then
+	# Copy signed package to repository for signed packages
+	cp ${COMPRESSED_PKG} ${SIGNED_REPO_COPY}
+	svn add ${SIGNED_REPO_COPY}/${COMPRESSED_PKG} > /dev/null 2>&1
+
+	# Commit changes
+	echo "Committing changes to repository for signed packages"
+	while [[ ${SVN_ATTEMPT} -lt ${MAX_SVN_ATTEMPTS} && ${SVN_SUCCESS} -eq 0 ]]; do
+		svn commit \
+			--trust-server-cert \
+			--non-interactive \
+			--username ${USERNAME} \
+			--password ${PASSWORD} \
+			--message "CHG: New signed package (success)" ${SIGNED_REPO_COPY} > /dev/null 2>&1
+		if [ $? -eq 0 ]; then
+			SVN_SUCCESS=1
+			break
+		else
+			((++SVN_ATTEMPT))
+			sleep 5
+		fi
+	done
+
+	if [ ${SVN_SUCCESS} -eq 0 ]; then
+		echo "Commit to respository for signed packages failed"
+		exit 1
+	fi
+else
+	# Commit changes
+	echo "Committing changes to repository for signed packages"
+	while [[ ${SVN_ATTEMPT} -lt ${MAX_SVN_ATTEMPTS} && ${SVN_SUCCESS} -eq 0 ]]; do
+		svn commit \
+			--trust-server-cert \
+			--non-interactive \
+			--username ${USERNAME} \
+			--password ${PASSWORD} \
+			--message "CHG: New signed package (failure)" ${SIGNED_REPO_COPY} > /dev/null 2>&1
+		if [ $? -eq 0 ]; then
+			SVN_SUCCESS=1
+			break
+		else
+			((++SVN_ATTEMPT))
+			sleep 5
+		fi
+	done
+
+	if [ ${SVN_SUCCESS} -eq 0 ]; then
+		echo "Commit to respository for signed packages failed"
+		exit 1
+	fi
+
+	exit 1
+fi
Index: sm/trunk/packagers/mac/sign-issm-mac-binaries-python.sh
===================================================================
--- /issm/trunk/packagers/mac/sign-issm-mac-binaries-python.sh	(revision 27034)
+++ 	(revision )
@@ -1,348 +1,0 @@
-#!/bin/bash
-
-################################################################################
-# Intended to be run in the context of a Jenkins project on a JPL 
-# Cybersecurity server for signing macOS applications. Polls SCM of the 
-# Subversion repository hosted at 
-# https://issm.ess.uci.edu/svn/issm-binaries/mac/matlab/unsigned to trigger new 
-# builds.
-#
-# In order to replicate the requried Jenkins project configuration:
-# - First, navigate to 'Manage Jenkins' -> 'Manage Plugins' and install the 
-#	'Credentials Bindings Plugin' if it is not already installed.
-# - Contact one of the members of the ISSM development team for crendentials 
-#	for the ISSM binaries repository (mention that the credentials are stored 
-#	in ISSM-Infrastructure.pdf).
-# - Navigate to 'Manage Jenkins' -> 'Manage Credentials' -> <domain> -> 
-#	'Add Credentials' and enter the crendentials from above.
-# - From the 'Dashboard', select 'New Item' -> 'Freestyle project'.
-# - Under 'Source Code Management', select 'Subversion'.
-#		- The 'Repository URL' text field should be set to 
-#		"https://issm.ess.uci.edu/svn/issm-binaries/mac/matlab/unsigned".
-#		- The 'Credentials' select menu should be set to the new credentials 
-#		created previously.
-#		- The 'Local module directory' text field should be set to the same 
-#		value as the constant UNSIGNED_REPO_COPY (set below to './unsigned').
-# - Under 'Build Trigggers', check the box for 'Poll SCM' and set the 
-#	'Schedule' text area to "H/5 * * * *".
-# - Under 'Build Environment', check the box for 'Use secret text(s) or 
-#	file(s)', then under 'Bindings' click the 'Add...' button and select 
-#	'Username and password (separated)'.
-#		- Set 'Username Variable' to "ISSM_BINARIES_USER".
-#		- Set 'Password Variable' to "ISSM_BINARIES_PASS".
-# - Under 'Credentials', select the same, new credentials that created 
-#	previously.
-# - The contents of this script can be copied/pasted directly into the ‘Build' 
-#	-> 'Execute Shell' -> ‘Command' textarea of the project configuration (or 
-#	you can simply store the script on disk and call it from there).
-# - Make sure to click the 'Save' button.
-#
-# Current point of contact at JPL Cybersecurity:
-#	Alex Coward, alexander.g.coward@jpl.nasa.gov
-#
-# NOTE:
-# - Assumes that "ISSM_BINARIES_USER" and "ISSM_BINARIES_PASS" are set up in 
-#	the 'Bindings' section under a 'Username and password (separated)' binding 
-#	(requires 'Credentials Binding Plugin').
-# - For local debugging, the aformentioned credentials can be hardcoded into 
-#	the 'USERNAME' and 'PASSWORD' constants below.
-################################################################################
-
-# Expand aliases within the context of this script
-shopt -s expand_aliases
-
-# From https://developer.apple.com/documentation/macos-release-notes/macos-catalina-10_15-release-notes,
-#
-#	Command line tool support for Subversion — including svn, git-svn, and 
-#	related commands — is no longer provided by Xcode. (50266910)
-#
-# which results in,
-#
-#	svn: error: The subversion command line tools are no longer provided by 
-#	Xcode.
-#
-# when calling svn, even when subversion is installed via Homebrew and its path 
-# is available in PATH.
-#
-# NOTE: May be able to remove this after updating macOS.
-#
-alias svn='/usr/local/bin/svn'
-
-## Override certain other aliases
-#
-alias cp=$(which cp)
-alias grep=$(which grep)
-
-## Constants
-#
-AD_IDENTITY="**********" # Apple Developer identity
-AD_USERNAME="**********" # Apple Developer username
-ALTOOL_PASSWORD="@keychain:**********" # altool password (assumed to be stored in keychain)
-ASC_PROVIDER="**********"
-MAX_SVN_ATTEMPTS=10
-NOTARIZATION_CHECK_ATTEMPTS=20
-NOTARIZATION_CHECK_PERIOD=60
-NOTARIZATION_LOGFILE="notarization.log"
-NOTARIZATION_LOGFILE_PATH="."
-PASSWORD=${ISSM_BINARIES_PASS}
-PKG="ISSM-macOS-Python"
-PRIMARY_BUNDLE_ID="gov.nasa.jpl.issm.python"
-SIGNED_REPO_COPY="./signed"
-SIGNED_REPO_URL="https://issm.ess.uci.edu/svn/issm-binaries/mac/python/signed"
-SIGNING_LOCK_FILE="signing.lock"
-SUCCESS_LOGFILE="${SIGNED_REPO_COPY}/success.log"
-UNSIGNED_REPO_COPY="./unsigned"
-UNSIGNED_REPO_URL="https://issm.ess.uci.edu/svn/issm-binaries/mac/python/unsigned"
-USERNAME=${ISSM_BINARIES_USER}
-
-COMPRESSED_PKG="${PKG}.zip"
-EXE_ENTITLEMENTS_PLIST="${PKG}/bin/entitlements.plist"
-
-# NOTE: Uncomment the following for local testing (Jenkins checks out copy of 
-#		repository for unsigned packages to working directory)
-#
-
-# # Clean up from previous packaging (not necessary for single builds on Jenkins, 
-# # but useful when testing packaging locally)
-# echo "Cleaning up existing assets"
-# rm -rf ${COMPRESSED_PKG} ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE} ${UNSIGNED_REPO_COPY}
-
-# # Check out copy of repository for unsigned packages
-# echo "Checking out copy of respository for unsigned packages"
-# svn checkout \
-# 	--trust-server-cert \
-# 	--non-interactive \
-# 	--username ${USERNAME} \
-# 	--password ${PASSWORD} \
-# 	${UNSIGNED_REPO_URL} \
-# 	${UNSIGNED_REPO_COPY}
-
-rm -rf ${PKG} ${SIGNED_REPO_COPY}
-
-
-# Extract package contents
-echo "Extracting package contents"
-ditto -xk ${UNSIGNED_REPO_COPY}/${COMPRESSED_PKG} .
-
-# Clear extended attributes on all files
-xattr -cr ${PKG}
-
-# Build list of ISSM executables
-ISSM_BINS=$(\
-	find ${PKG}/bin -type f -name *.exe; \
-	find ${PKG}/bin -type f -name *.pyc; \
-)
-
-# Build list of third party executables
-THIRD_PARTY_BINS=$(\
-	echo ${PKG}/bin/mpiexec; \
-	echo ${PKG}/bin/hydra_pmi_proxy; \
-	echo ${PKG}/bin/gdalsrsinfo; \
-	echo ${PKG}/bin/gdaltransform; \
-	echo ${PKG}/bin/gmt; \
-	echo ${PKG}/bin/gmtselect; \
-	echo ${PKG}/bin/gmsh; \
-)
-
-# Sign all executables in package
-echo "Signing all executables in package"
-codesign -s ${AD_IDENTITY} --timestamp --options=runtime --entitlements ${EXE_ENTITLEMENTS_PLIST} ${ISSM_BINS}
-codesign -s ${AD_IDENTITY} --timestamp --options=runtime ${THIRD_PARTY_BINS}
-
-# Build list of ISSM libraries
-ISSM_LIBS=$(\
-	find ${PKG}/lib -type f -name *.so; \
-)
-
-# Sign all libraries in package
-echo "Signing all libraries in package"
-codesign -s ${AD_IDENTITY} --timestamp --options=runtime ${ISSM_LIBS}
-
-# NOTE: Skipping signature validation because this is not a true package nor app
-
-# Compress signed package
-echo "Compressing signed package"
-ditto -ck --sequesterRsrc --keepParent ${PKG} ${COMPRESSED_PKG}
-
-# Submit compressed package for notarization
-echo "Submitting signed package to Apple for notarization"
-xcrun altool --notarize-app --primary-bundle-id ${PRIMARY_BUNDLE_ID} --username ${AD_USERNAME} --password ${ALTOOL_PASSWORD} --asc-provider ${ASC_PROVIDER} --file ${COMPRESSED_PKG} &> ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE}
-
-# Sleep until notarization request response is received
-echo "Waiting for notarizaion request response"
-while [[ ! -f ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE} || ! -z $(find ${NOTARIZATION_LOGFILE_PATH} -empty -name ${NOTARIZATION_LOGFILE}) ]]; do
-	sleep 30
-done
-
-echo "Notarizaion request response received"
-
-# Check if UUID exists in response
-HAS_UUID=$(grep 'RequestUUID = ' ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE}) # NOTE: Checking for "RequestUUID = " because "RequestUUID" shows up in some error messages
-if [ -z "${HAS_UUID}" ]; then
-	echo "Notarization failed!"
-	echo "----------------------- Contents of notarization logfile -----------------------"
-	cat ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE}
-	echo "--------------------------------------------------------------------------------"
-
-	# Clean up
-	rm -rf ${PKG} ${COMPRESSED_PKG}
-
-	exit 1
-fi
-
-# Get UUID from notarization request response
-UUID=$(echo ${HAS_UUID} | sed 's/[[:space:]]*RequestUUID = //')
-echo "UUID: ${UUID}" 
-
-# Check notarization status
-#
-# NOTE: Currently, this checks if notarization was successful, but we are not 
-#		able to staple notarization as this is not a true package nor app and, 
-#		at the very least, MATLAB Mex files cannot be stapled. As such, clients 
-#		will not be able to clear Gatekeeper if they are offline.
-#
-echo "Checking notarization status"
-SUCCESS=0
-for ATTEMPT in $(seq 1 ${NOTARIZATION_CHECK_ATTEMPTS}); do
-	echo "    Attempt #${ATTEMPT}..."
-	xcrun altool --notarization-info ${UUID} --username ${AD_USERNAME} --password ${ALTOOL_PASSWORD} &> ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE}
-	if [[ -f ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE} && -z $(find ${NOTARIZATION_LOGFILE_PATH} -empty -name ${NOTARIZATION_LOGFILE}) ]]; then
-
-		# First, check if there is an error
-		ERROR_CHECK=$(grep 'Error' ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE})
-		if [ ! -z "${ERROR_CHECK}" ]; then
-			break
-		fi
-
-		# No error, so check status
-		STATUS=$(grep 'Status:' ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE} | sed -e 's/[[:space:]]*Status: //')
-		if [[ "${STATUS}" == "success" ]]; then
-			# Staple notarization to all elements of package that were previously signed
-			#xcrun stapler staple ${THIRD_PARTY_BINS} # NOTE: Fails with "Stapler is incapable of working with MATLAB Mex files."
-
-			# Validate stapling of notarization
-			#xcrun stapler validation ${THIRD_PARTY_BINS} # NOTE: Skipping notarization stapling validation because this is not a true package nor app
-
-			# Compress signed and notarized package
-			ditto -ck --sequesterRsrc --keepParent ${PKG} ${COMPRESSED_PKG}
-
-			# Set flag indicating notarization was successful
-			SUCCESS=1
-
-			break
-		elif [[ "${STATUS}" == "in progress" ]]; then
-			echo "    ...in progress still; checking again in ${NOTARIZATION_CHECK_PERIOD} seconds."
-			sleep ${NOTARIZATION_CHECK_PERIOD}
-		elif [[ "${STATUS}" == "invalid" ]]; then
-			break
-		fi
-	else
-		if [ ${ATTEMPT} -lt ${NOTARIZATION_CHECK_ATTEMPTS} ]; then
-			echo "    ...not ready yet; checking again in ${NOTARIZATION_CHECK_PERIOD} seconds"
-			sleep ${NOTARIZATION_CHECK_PERIOD}
-		else
-			echo "    ...maximum attempts reached, but no response, or something else went wrong"
-			echo "    If contents of notarization status check logfile appear to be valid, increase NOTARIZATION_CHECK_ATTEMPTS and run again"
-			break
-		fi
-	fi
-done
-
-if [ ${SUCCESS} -eq 1 ]; then
-	echo "Notarization successful!"
-else
-	echo "Notarization failed!"
-	echo "----------------------- Contents of notarization logfile -----------------------"
-	cat ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE}
-	echo "--------------------------------------------------------------------------------"
-fi
-
-# Check out copy of repository for signed packages
-echo "Checking out copy of respository for signed packages"
-SVN_ATTEMPT=0
-SVN_SUCCESS=0
-while [[ ${SVN_ATTEMPT} -lt ${MAX_SVN_ATTEMPTS} && ${SVN_SUCCESS} -eq 0 ]]; do
-	rm -rf ${SIGNED_REPO_COPY}
-	svn checkout \
-		--trust-server-cert \
-		--non-interactive \
-		--username ${USERNAME} \
-		--password ${PASSWORD} \
-		${SIGNED_REPO_URL} \
-		${SIGNED_REPO_COPY} > /dev/null 2>&1
-	if [ $? -eq 0 ]; then
-		SVN_SUCCESS=1
-		break
-	else
-		((++SVN_ATTEMPT))
-		sleep 5
-	fi
-done
-
-if [ ${SVN_SUCCESS} -eq 0 ]; then
-	echo "Checkout of respository for signed packages failed"
-	exit 1
-fi
-
-# Copy notarization file to repository for signed packages
-cp ${NOTARIZATION_LOGFILE_PATH}/${NOTARIZATION_LOGFILE} ${SIGNED_REPO_COPY}
-svn add ${SIGNED_REPO_COPY}/${NOTARIZATION_LOGFILE} > /dev/null 2>&1
-
-# Remove lock file from repository for signed packages
-svn delete ${SIGNED_REPO_COPY}/${SIGNING_LOCK_FILE}
-
-SVN_ATTEMPT=0
-SVN_SUCCESS=0
-if [ ${SUCCESS} -eq 1 ]; then
-	# Copy signed package to repository for signed packages
-	cp ${COMPRESSED_PKG} ${SIGNED_REPO_COPY}
-	svn add ${SIGNED_REPO_COPY}/${COMPRESSED_PKG} > /dev/null 2>&1
-
-	# Commit changes
-	echo "Committing changes to repository for signed packages"
-	while [[ ${SVN_ATTEMPT} -lt ${MAX_SVN_ATTEMPTS} && ${SVN_SUCCESS} -eq 0 ]]; do
-		svn commit \
-			--trust-server-cert \
-			--non-interactive \
-			--username ${USERNAME} \
-			--password ${PASSWORD} \
-			--message "CHG: New signed package (success)" ${SIGNED_REPO_COPY} > /dev/null 2>&1
-		if [ $? -eq 0 ]; then
-			SVN_SUCCESS=1
-			break
-		else
-			((++SVN_ATTEMPT))
-			sleep 5
-		fi
-	done
-
-	if [ ${SVN_SUCCESS} -eq 0 ]; then
-		echo "Commit to respository for signed packages failed"
-		exit 1
-	fi
-else
-	# Commit changes
-	echo "Committing changes to repository for signed packages"
-	while [[ ${SVN_ATTEMPT} -lt ${MAX_SVN_ATTEMPTS} && ${SVN_SUCCESS} -eq 0 ]]; do
-		svn commit \
-			--trust-server-cert \
-			--non-interactive \
-			--username ${USERNAME} \
-			--password ${PASSWORD} \
-			--message "CHG: New signed package (failure)" ${SIGNED_REPO_COPY} > /dev/null 2>&1
-		if [ $? -eq 0 ]; then
-			SVN_SUCCESS=1
-			break
-		else
-			((++SVN_ATTEMPT))
-			sleep 5
-		fi
-	done
-
-	if [ ${SVN_SUCCESS} -eq 0 ]; then
-		echo "Commit to respository for signed packages failed"
-		exit 1
-	fi
-
-	exit 1
-fi
Index: /issm/trunk/packagers/mac/test-issm-mac-binaries-matlab.sh
===================================================================
--- /issm/trunk/packagers/mac/test-issm-mac-binaries-matlab.sh	(revision 27034)
+++ /issm/trunk/packagers/mac/test-issm-mac-binaries-matlab.sh	(revision 27035)
@@ -11,5 +11,5 @@
 #
 INSTALL_DIR=.
-MATLAB_NROPTIONS="'benchmark','all','exclude',[125,126,234,235,418,420,435,444,445,701,702,703,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1201,1202,1203,1204,1205,1206,1207,1208,1301,1302,1303,1304,1401,1402,1601,1602,2004,2006,2051,2052,2053,2084,2085,2424,2425,3001:3200,3201,3202,3300,3480,3481,4001,4002,4003]" # NOTE: Combination of test suites from basic, Dakota, and Solid Earth builds, with tests that require a restart and those that require the JVM excluded
+MATLAB_NROPTIONS="'benchmark','all','exclude',[125,126,234,235,418,420,435,444,445,701,702,703,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1201,1202,1203,1204,1205,1206,1207,1208,1301,1302,1303,1304,1401,1402,1601,1602,2002,2003,2004,2006,2007,2008,2010,2011,2021,2051,2052,2053,2084,2085,2090,2101,2424,2425,3001:3200,3201,3202,3300,3480,3481,4001,4002,4003]" # NOTE: Combination of test suites from basic, Dakota, and Solid Earth builds, with tests that require a restart and those that require the JVM excluded
 MATLAB_PATH="/Applications/MATLAB_R2018a.app"
 PKG="ISSM-macOS-MATLAB"
Index: /issm/trunk/packagers/mac/test-issm-mac-binaries-python-2.sh
===================================================================
--- /issm/trunk/packagers/mac/test-issm-mac-binaries-python-2.sh	(revision 27035)
+++ /issm/trunk/packagers/mac/test-issm-mac-binaries-python-2.sh	(revision 27035)
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+################################################################################
+# This script is intended to test ISSM macOS Python 2 binaries on an end-user 
+# machine after successful packaging and signing.
+#
+# NOTE: Tarball must already exist in INSTALL_DIR
+################################################################################
+
+## Constants
+#
+INSTALL_DIR=.
+PKG="ISSM-macOS-Python-2"
+PYTHON_NROPTIONS="--benchmark all --exclude 125 126 234 235 418 420 435 444 445 701 702 703 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1201 1202 1203 1204 1205 1206 1207 1208 1301 1302 1303 1304 1401 1402 1601 1602 2002 2003 2004 2005 2006 2007 2008 2010 2011 2021 2051 2052 2053 2084 2085 2090 2101 2424 2425 3001:3200 3201 3202 3300 3480 3481 4001 4002 4003" # NOTE: Combination of test suites from basic, Dakota, and Solid Earth builds, with tests that require a restart and those that require the JVM excluded
+
+COMPRESSED_PKG="${PKG}.zip"
+
+export ISSM_DIR="${INSTALL_DIR}/${PKG}"
+export PATH="${PATH}:${ISSM_DIR}/bin:${ISSM_DIR}/scripts"
+export PYTHONPATH="${ISSM_DIR}/scripts"
+export PYTHONSTARTUP="${PYTHONPATH}/devpath.py"
+export PYTHONUNBUFFERED=1 # We don't want Python to buffer output, otherwise issm.exe output is not captured
+
+cd ${INSTALL_DIR}
+rm -rf ${PKG}
+ditto -xk ${COMPRESSED_PKG} .
+cd ${PKG}/test/NightlyRun
+
+# Run tests, redirecting output to logfile and suppressing output to console
+echo "Running tests"
+rm python.log 2> /dev/null
+./runme.py ${PYTHON_NROPTIONS} &> python.log 2>&1
+
+# Check that Python did not exit in error
+pythonExitCode=`echo $?`
+pythonExitedInError=`grep -E "runme.py: error" python.log | wc -l`
+
+if [[ ${pythonExitCode} -ne 0 || ${pythonExitedInError} -ne 0 ]]; then
+	echo "----------Python exited in error!----------"
+	cat python.log
+	echo "-----------End of python.log-----------"
+	exit 1
+fi
+
+# Check that all tests passed
+numTestsFailed=`cat python.log | grep -c -e "FAILED|ERROR"`
+
+if [[ ${numTestsFailed} -ne 0 ]]; then
+	echo "One or more tests FAILED"
+	exit 1
+else
+	echo "All tests PASSED"
+fi
Index: /issm/trunk/packagers/mac/test-issm-mac-binaries-python-3.sh
===================================================================
--- /issm/trunk/packagers/mac/test-issm-mac-binaries-python-3.sh	(revision 27035)
+++ /issm/trunk/packagers/mac/test-issm-mac-binaries-python-3.sh	(revision 27035)
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+################################################################################
+# This script is intended to test ISSM macOS Python 3 binaries on an end-user 
+# machine after successful packaging and signing.
+#
+# NOTE: Tarball must already exist in INSTALL_DIR
+################################################################################
+
+## Constants
+#
+INSTALL_DIR=.
+PKG="ISSM-macOS-Python-3"
+PYTHON_NROPTIONS="--benchmark all --exclude 125 126 234 235 418 420 435 444 445 701 702 703 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1201 1202 1203 1204 1205 1206 1207 1208 1301 1302 1303 1304 1401 1402 1601 1602 2002 2003 2004 2005 2006 2007 2008 2010 2011 2021 2051 2052 2053 2084 2085 2090 2101 2424 2425 3001:3200 3201 3202 3300 3480 3481 4001 4002 4003" # NOTE: Combination of test suites from basic, Dakota, and Solid Earth builds, with tests that require a restart and those that require the JVM excluded
+
+COMPRESSED_PKG="${PKG}.zip"
+
+export ISSM_DIR="${INSTALL_DIR}/${PKG}"
+export PATH="${PATH}:${ISSM_DIR}/bin:${ISSM_DIR}/scripts"
+export PYTHONPATH="${ISSM_DIR}/scripts"
+export PYTHONSTARTUP="${PYTHONPATH}/devpath.py"
+export PYTHONUNBUFFERED=1 # We don't want Python to buffer output, otherwise issm.exe output is not captured
+
+cd ${INSTALL_DIR}
+rm -rf ${PKG}
+ditto -xk ${COMPRESSED_PKG} .
+cd ${PKG}/test/NightlyRun
+
+# Run tests, redirecting output to logfile and suppressing output to console
+echo "Running tests"
+rm python.log 2> /dev/null
+./runme.py ${PYTHON_NROPTIONS} &> python.log 2>&1
+
+# Check that Python did not exit in error
+pythonExitCode=`echo $?`
+pythonExitedInError=`grep -E "runme.py: error" python.log | wc -l`
+
+if [[ ${pythonExitCode} -ne 0 || ${pythonExitedInError} -ne 0 ]]; then
+	echo "----------Python exited in error!----------"
+	cat python.log
+	echo "-----------End of python.log-----------"
+	exit 1
+fi
+
+# Check that all tests passed
+numTestsFailed=`cat python.log | grep -c -e "FAILED|ERROR"`
+
+if [[ ${numTestsFailed} -ne 0 ]]; then
+	echo "One or more tests FAILED"
+	exit 1
+else
+	echo "All tests PASSED"
+fi
Index: sm/trunk/packagers/mac/test-issm-mac-binaries-python.sh
===================================================================
--- /issm/trunk/packagers/mac/test-issm-mac-binaries-python.sh	(revision 27034)
+++ 	(revision )
@@ -1,53 +1,0 @@
-#!/bin/bash
-
-################################################################################
-# This script is intended to test ISSM macOS MATLAB binaries on an end-user 
-# machine after successful packaging and signing.
-#
-# NOTE: Tarball must already exist in INSTALL_DIR
-################################################################################
-
-## Constants
-#
-INSTALL_DIR=.
-PKG="ISSM-macOS-Python"
-PYTHON_NROPTIONS="--benchmark all --exclude 125 126 234 235 418 420 435 444 445 701 702 703 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1201 1202 1203 1204 1205 1206 1207 1208 1301 1302 1303 1304 1401 1402 1601 1602 2004 2006 2007 2051 2052 2053 2084 2085 2424 2425 3001:3200 3201 3202 3300 3480 3481 4001 4002 4003" # NOTE: Combination of test suites from basic, Dakota, and Solid Earth builds, with tests that require a restart and those that require the JVM excluded
-
-COMPRESSED_PKG="${PKG}.zip"
-
-export ISSM_DIR="${INSTALL_DIR}/${PKG}"
-export PATH="${PATH}:${ISSM_DIR}/bin:${ISSM_DIR}/scripts"
-export PYTHONPATH="${ISSM_DIR}/scripts"
-export PYTHONSTARTUP="${PYTHONPATH}/devpath.py"
-export PYTHONUNBUFFERED=1 # We don't want Python to buffer output, otherwise issm.exe output is not captured
-
-cd ${INSTALL_DIR}
-rm -rf ${PKG}
-ditto -xk ${COMPRESSED_PKG} .
-cd ${PKG}/test/NightlyRun
-
-# Run tests, redirecting output to logfile and suppressing output to console
-echo "Running tests"
-rm python.log 2> /dev/null
-./runme.py ${PYTHON_NROPTIONS} &> python.log 2>&1
-
-# Check that Python did not exit in error
-pythonExitCode=`echo $?`
-pythonExitedInError=`grep -E "runme.py: error" python.log | wc -l`
-
-if [[ ${pythonExitCode} -ne 0 || ${pythonExitedInError} -ne 0 ]]; then
-	echo "----------Python exited in error!----------"
-	cat python.log
-	echo "-----------End of python.log-----------"
-	exit 1
-fi
-
-# Check that all tests passed
-numTestsFailed=`cat python.log | grep -c -e "FAILED|ERROR"`
-
-if [[ ${numTestsFailed} -ne 0 ]]; then
-	echo "One or more tests FAILED"
-	exit 1
-else
-	echo "All tests PASSED"
-fi
Index: /issm/trunk/packagers/mac/transfer-issm-mac-binaries.sh
===================================================================
--- /issm/trunk/packagers/mac/transfer-issm-mac-binaries.sh	(revision 27034)
+++ /issm/trunk/packagers/mac/transfer-issm-mac-binaries.sh	(revision 27035)
@@ -2,6 +2,5 @@
 
 ################################################################################
-# Transfers ISSM distributable package for macOS with MATLAB API to ISSM Web 
-# site.
+# Transfers ISSM distributable package for macOS to ISSM website.
 #
 # NOTE:
@@ -16,5 +15,6 @@
 # See also:
 # - packagers/mac/complete-issm-mac-binaries-matlab.sh
-# - packagers/mac/complete-issm-mac-binaries-python.sh
+# - packagers/mac/complete-issm-mac-binaries-python-2.sh
+# - packagers/mac/complete-issm-mac-binaries-python-3.sh
 ################################################################################
 
@@ -37,5 +37,5 @@
 # NOTE: May be able to remove this after updating macOS.
 #
-alias svn='/usr/local/bin/svn'
+#alias svn='/usr/local/bin/svn'
 
 ## Override certain other aliases
Index: /issm/trunk/scripts/DownloadExternalPackage.sh
===================================================================
--- /issm/trunk/scripts/DownloadExternalPackage.sh	(revision 27034)
+++ /issm/trunk/scripts/DownloadExternalPackage.sh	(revision 27035)
@@ -42,15 +42,25 @@
 
 ## Download file
+#
+if [ ! -z `which curl` ]; then
+	curl --silent $URL -o $OUT_FILE
 
-if [ ! -z `which curl` ]
-then
-	curl --silent $URL -o $OUT_FILE
-elif [ ! -z `which wget` ]
-then
+	# Try wget if curl exists but fails
+	if [ $? -ne 0 ]; then
+		if [ ! -z `which wget` ]; then
+			wget --quiet -O $OUT_FILE $URL
+
+			if [ $? -ne 0 ]; then
+				echo "Error: both curl and wget failed. To debug, download package manually using curl without '--silent' option and/or wget without '--quiet' option."
+				exit 0
+			fi
+		else
+			echo $MSG_ERR_NO_GET_CMD
+			exit 0
+		fi
+	fi
+elif [ ! -z `which wget` ]; then
 	wget --quiet -O $OUT_FILE $URL
 else
 	echo $MSG_ERR_NO_GET_CMD
-	exit 0
 fi
-
-exit 0
Index: /issm/trunk/src/c/Makefile.am
===================================================================
--- /issm/trunk/src/c/Makefile.am	(revision 27034)
+++ /issm/trunk/src/c/Makefile.am	(revision 27035)
@@ -1,3 +1,3 @@
-AM_CPPFLAGS = @NEOPZINCL@ @DAKOTAINCL@ @SHAPELIBINCL@ @TRIANGLEINCL@ @PETSCINCL@ @SLEPCINCL@ @AMPIINCL@ @ADJOINTMPIINCL@ @MEDIPACKINCL@ @MPIINCL@ @PARMETISINCL@ @METISINCL@ @CHACOINCL@ @SCOTCHINCL@ @PLAPACKINCL@ @MKLINCL@ @MUMPSINCL@ @SPAIINCL@ @HYPREINCL@ @PROMETHEUSINCL@ @SUPERLUINCL@ @SPOOLESINCL@ @PASTIXINCL@ @MLINCL@ @TAOINCL@ @ADIC2INCL@ @ADOLCINCL@ @CODIPACKINCL@ @GSLINCL@ @BOOSTINCL@ @ANDROID_NDKINCL@ @METEOIOINCL@ @SNOWPACKINCL@ @PROJINCL@ @ESMFINCL@ @PROJINCL@
+AM_CPPFLAGS = @NEOPZINCL@ @DAKOTAINCL@ @SHAPELIBINCL@ @TRIANGLEINCL@ @PETSCINCL@ @SLEPCINCL@ @AMPIINCL@ @ADJOINTMPIINCL@ @MEDIPACKINCL@ @MPIINCL@ @PARMETISINCL@ @METISINCL@ @CHACOINCL@ @SCOTCHINCL@ @PLAPACKINCL@ @MKLINCL@ @MUMPSINCL@ @SPAIINCL@ @HYPREINCL@ @PROMETHEUSINCL@ @SUPERLUINCL@ @SPOOLESINCL@ @PASTIXINCL@ @MLINCL@ @TAOINCL@ @ADIC2INCL@ @ADOLCINCL@ @CODIPACKINCL@ @GSLINCL@ @BOOSTINCL@ @ANDROID_NDKINCL@ @METEOIOINCL@ @SNOWPACKINCL@ @PROJINCL@ @ESMFINCL@ @PROJINCL@ @MPLAPACKINCL@
 AM_FCFLAGS = @SEMICINCL@
 
@@ -273,4 +273,5 @@
 	./classes/RiftStruct.cpp \
 	./modules/ModelProcessorx/Transient/UpdateElementsTransient.cpp \
+	./modules/ModelProcessorx/Transient/UpdateParametersTransient.cpp \
 	./cores/transient_core.cpp \
 	./cores/steadystate_core.cpp \
@@ -714,5 +715,5 @@
 if !WINDOWS
 if !STANDALONE_LIBRARIES
-libISSMCore_la_LIBADD = $(CHACOLIB) $(DAKOTALIB) $(PETSCLIB) $(MUMPSLIB) $(SCALAPACKLIB) $(BLASLAPACKLIB) $(PARMETISLIB) $(METISLIB) $(HDF5LIB) $(TAOLIB) $(M1QN3LIB) $(SEMICLIB) $(PLAPACKLIB) $(SUPERLULIB) $(SPOOLESLIB) $(BLACSLIB) $(HYPRELIB) $(SPAILIB) $(PROMETHEUSLIB) $(PASTIXLIB) $(MLLIB) $(SCOTCHLIB) $(MKLLIB) $(MPILIB) $(MATHLIB) $(GRAPHICSLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(ADOLCLIB) $(AMPILIB) $(ADJOINTMPILIB) $(METEOIOLIB) $(SNOWPACKLIB) $(PROJLIB) $(OSLIBS)
+libISSMCore_la_LIBADD = $(CHACOLIB) $(DAKOTALIB) $(PETSCLIB) $(MUMPSLIB) $(SCALAPACKLIB) $(BLASLAPACKLIB) $(PARMETISLIB) $(METISLIB) $(HDF5LIB) $(TAOLIB) $(M1QN3LIB) $(SEMICLIB) $(PLAPACKLIB) $(MPLAPACKLIB) $(SUPERLULIB) $(SPOOLESLIB) $(BLACSLIB) $(HYPRELIB) $(SPAILIB) $(PROMETHEUSLIB) $(PASTIXLIB) $(MLLIB) $(SCOTCHLIB) $(MKLLIB) $(MPILIB) $(MATHLIB) $(GRAPHICSLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(ADOLCLIB) $(AMPILIB) $(ADJOINTMPILIB) $(METEOIOLIB) $(SNOWPACKLIB) $(PROJLIB) $(OSLIBS)
 if FORTRAN
 libISSMCore_la_LIBADD += $(FLIBS) $(FORTRANLIB)
@@ -830,5 +831,5 @@
 
 # External packages
-LDADD += $(CHACOLIB) $(DAKOTALIB) $(PETSCLIB) $(MUMPSLIB) $(SCALAPACKLIB) $(BLASLAPACKLIB) $(PARMETISLIB) $(METISLIB) $(NEOPZLIB) $(TAOLIB) $(M1QN3LIB) $(SEMICLIB) $(PLAPACKLIB) $(SUPERLULIB) $(SPOOLESLIB) $(BLACSLIB) $(HDF5LIB) $(HYPRELIB) $(SPAILIB) $(PROMETHEUSLIB) $(PASTIXLIB) $(MLLIB) $(SCOTCHLIB) $(MKLLIB) $(MPILIB) $(MATHLIB) $(GRAPHICSLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(AMPILIB) $(ADJOINTMPILIB) $(ADOLCLIB) $(MPILIB) $(METEOIOLIB) $(SNOWPACKLIB) $(PROJLIB) $(ESMFLIB) $(OSLIBS)
+LDADD += $(CHACOLIB) $(DAKOTALIB) $(PETSCLIB) $(MUMPSLIB) $(SCALAPACKLIB) $(BLASLAPACKLIB) $(PARMETISLIB) $(METISLIB) $(NEOPZLIB) $(TAOLIB) $(M1QN3LIB) $(SEMICLIB) $(PLAPACKLIB) $(MPLAPACKLIB) $(SUPERLULIB) $(SPOOLESLIB) $(BLACSLIB) $(HDF5LIB) $(HYPRELIB) $(SPAILIB) $(PROMETHEUSLIB) $(PASTIXLIB) $(MLLIB) $(SCOTCHLIB) $(MKLLIB) $(MPILIB) $(MATHLIB) $(GRAPHICSLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(AMPILIB) $(ADJOINTMPILIB) $(ADOLCLIB) $(MPILIB) $(METEOIOLIB) $(SNOWPACKLIB) $(PROJLIB) $(ESMFLIB) $(OSLIBS)
 
 if FORTRAN
Index: /issm/trunk/src/c/analyses/AdjointHorizAnalysis.cpp
===================================================================
--- /issm/trunk/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 27034)
+++ /issm/trunk/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 27035)
@@ -52,8 +52,8 @@
 		case FSApproximationEnum: 
 			return CreateKMatrixFS(element);
-      case MLHOApproximationEnum:
+      case MOLHOApproximationEnum:
 		// a more accurate option, but integrate in the vertical direction numerically.
-		//	return CreateKMatrixMLHOVerticalIntergrated(element);
-			return CreateKMatrixMLHO(element);
+		//	return CreateKMatrixMOLHOVerticalIntergrated(element);
+			return CreateKMatrixMOLHO(element);
 		case NoneApproximationEnum:
 			return NULL;
@@ -220,5 +220,5 @@
 	return Ke;
 }/*}}}*/
-ElementMatrix* AdjointHorizAnalysis::CreateKMatrixMLHO(Element* element){/*{{{*/
+ElementMatrix* AdjointHorizAnalysis::CreateKMatrixMOLHO(Element* element){/*{{{*/
 
 	/* Check if ice in element */
@@ -226,5 +226,4 @@
 
 	/*Intermediaries */
-	bool        incomplete_adjoint;
 	IssmDouble  Jdet,mu_prime,n,thickness,mu,effmu;
 	IssmDouble *xyz_list = NULL;
@@ -238,5 +237,137 @@
 	IssmDouble  vxshear, vyshear;
 
-   Element* basalelement;
+   /*Get basal element*/
+	Element* basalelement = NULL;
+   element->FindParam(&domaintype,DomainTypeEnum);
+   switch(domaintype){
+      case Domain2DhorizontalEnum:
+         basalelement = element;
+         break;
+      case Domain3DEnum: case Domain2DverticalEnum:
+         _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+         break;
+      default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+   }
+
+	/*Initialize Jacobian with regular HO (first part of the Gateau derivative)*/
+	bool        incomplete_adjoint;
+	element->FindParam(&incomplete_adjoint,InversionIncompleteAdjointEnum);
+	StressbalanceAnalysis* analysis = new StressbalanceAnalysis();
+	ElementMatrix* Ke=analysis->CreateKMatrix(basalelement);
+	delete analysis;
+	if(incomplete_adjoint) return Ke;
+
+	/*Second part of the Gateau derivative if requested*/
+
+	/*Fetch number of nodes and dof for this finite element*/
+   int numnodes = basalelement->GetNumberOfNodes();
+   IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes); // like SSA
+   IssmDouble* basis  = xNew<IssmDouble>(numnodes); // like SSA
+
+	/*Retrieve all inputs and parameters*/
+	element->GetVerticesCoordinates(&xyz_list);
+   Input* vx_input       = element->GetInput(VxEnum);        _assert_(vx_input); //vertically integrated vx
+   Input* vy_input       = element->GetInput(VyEnum);        _assert_(vy_input); //vertically integrated vy
+   Input* vxbase_input   = element->GetInput(VxBaseEnum);    _assert_(vxbase_input);
+   Input* vybase_input   = element->GetInput(VyBaseEnum);    _assert_(vybase_input);
+   Input* vxshear_input  = element->GetInput(VxShearEnum);   _assert_(vxshear_input);
+   Input* vyshear_input  = element->GetInput(VyShearEnum);   _assert_(vyshear_input);
+   Input* thickness_input= element->GetInput(ThicknessEnum); _assert_(thickness_input);
+   Input* n_input        = element->GetInput(MaterialsRheologyNEnum); _assert_(n_input);
+
+	/* Start  looping on the number of gaussian points: */
+   Gauss* gauss      = element->NewGauss(5);
+   Gauss* gauss_base = basalelement->NewGauss();
+   while(gauss->next()){
+      gauss->SynchronizeGaussBase(gauss_base);
+
+      element->JacobianDeterminant(&Jdet,xyz_list,gauss_base);
+      basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss_base);
+      basalelement->NodalFunctions(basis, gauss_base);
+
+      thickness_input->GetInputValue(&thickness, gauss);
+      n_input->GetInputValue(&n,gauss);
+
+      vxshear_input->GetInputValue(&vxshear,gauss);
+      vyshear_input->GetInputValue(&vyshear,gauss);
+
+		element->material->ViscosityMOLHOAdjoint(&viscosity[0],dim,xyz_list,gauss,vxbase_input,vybase_input,vxshear_input,vyshear_input,thickness_input,n_input);
+
+		effmu = 2.0*(1-n)/2.0/n;
+
+		element->StrainRateHO(&epsilonbase[0],xyz_list,gauss,vxbase_input, vybase_input);
+		element->StrainRateHO(&epsilonshear[0],xyz_list,gauss,vxshear_input, vyshear_input);
+
+		e1b[0] = 2*epsilonbase[0]+epsilonbase[1];		e1b[1] = epsilonbase[2];
+		e2b[1] = epsilonbase[0]+2*epsilonbase[1];		e2b[0] = epsilonbase[2];
+
+		e1sh[0] = 2*epsilonshear[0]+epsilonshear[1];		e1sh[1] = epsilonshear[2];
+		e2sh[1] = epsilonshear[0]+2*epsilonshear[1];		e2sh[0] = epsilonshear[2];
+
+		for(int i=0;i<numnodes;i++){
+			for(int j=0;j<numnodes;j++){
+				eb1i = e1b[0]*dbasis[0*numnodes+i]+e1b[1]*dbasis[1*numnodes+i];
+				eb1j = e1b[0]*dbasis[0*numnodes+j]+e1b[1]*dbasis[1*numnodes+j];
+				eb2i = e2b[0]*dbasis[0*numnodes+i]+e2b[1]*dbasis[1*numnodes+i];
+				eb2j = e2b[0]*dbasis[0*numnodes+j]+e2b[1]*dbasis[1*numnodes+j];
+            esh1i = e1sh[0]*dbasis[0*numnodes+i]+e1sh[1]*dbasis[1*numnodes+i];
+            esh1j = e1sh[0]*dbasis[0*numnodes+j]+e1sh[1]*dbasis[1*numnodes+j];
+            esh2i = e2sh[0]*dbasis[0*numnodes+i]+e2sh[1]*dbasis[1*numnodes+i];
+            esh2j = e2sh[0]*dbasis[0*numnodes+j]+e2sh[1]*dbasis[1*numnodes+j];
+
+				Ke->values[4*numnodes*(4*i+0)+4*j+0]+=gauss->weight*Jdet*effmu*(viscosity[0]*eb1j*eb1i+viscosity[1]*(esh1j*eb1i+eb1j*esh1i)+viscosity[2]*esh1j*esh1i);
+				Ke->values[4*numnodes*(4*i+1)+4*j+0]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb1j*eb1i+viscosity[2]*(esh1j*eb1i+eb1j*esh1i)+viscosity[4]*esh1j*esh1i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*eb1j*basis[i]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*esh1j*basis[i]);
+				Ke->values[4*numnodes*(4*i+2)+4*j+0]+=gauss->weight*Jdet*effmu*(viscosity[0]*eb1j*eb2i+viscosity[1]*(esh1j*eb2i+eb1j*esh2i)+viscosity[2]*esh1j*esh2i);
+				Ke->values[4*numnodes*(4*i+3)+4*j+0]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb1j*eb2i+viscosity[2]*(esh1j*eb2i+eb1j*esh2i)+viscosity[4]*esh1j*esh2i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*eb1j*basis[i]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*esh1j*basis[i]);
+
+				Ke->values[4*numnodes*(4*i+0)+4*j+1]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb1j*eb1i+viscosity[2]*(esh1j*eb1i+eb1j*esh1i)+viscosity[4]*esh1j*esh1i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*eb1i*basis[j]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*esh1i*basis[j]);
+				Ke->values[4*numnodes*(4*i+1)+4*j+1]+=gauss->weight*Jdet*effmu*(viscosity[2]*eb1j*eb1i+viscosity[4]*(esh1j*eb1i+eb1j*esh1i)+viscosity[5]*esh1j*esh1i+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*(eb1i*basis[j]+eb1j*basis[i])+viscosity[7]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*(esh1i*basis[j]+esh1j*basis[i])+viscosity[8]*(n+1)*(n+1)*(n+1)*(n+1)/4.0/thickness/thickness/thickness/thickness*vxshear*vxshear*basis[j]*basis[i]);
+				Ke->values[4*numnodes*(4*i+2)+4*j+1]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb1j*eb2i+viscosity[2]*(esh1j*eb2i+eb1j*esh2i)+viscosity[4]*esh1j*esh2i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*eb2i*basis[j]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*esh2i*basis[j]);
+				Ke->values[4*numnodes*(4*i+3)+4*j+1]+=gauss->weight*Jdet*effmu*(viscosity[2]*eb1j*eb2i+viscosity[4]*(esh1j*eb2i+eb1j*esh2i)+viscosity[5]*esh1j*esh2i+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*(vxshear*eb2i*basis[j]+vyshear*eb1j*basis[i])+viscosity[7]*(n+1)*(n+1)/2.0/thickness/thickness*(vxshear*esh2i*basis[j]+vyshear*esh1j*basis[i])+viscosity[8]*(n+1)*(n+1)*(n+1)*(n+1)/4.0/thickness/thickness/thickness/thickness*vxshear*vyshear*basis[j]*basis[i]);
+				
+
+				Ke->values[4*numnodes*(4*i+0)+4*j+2]+=gauss->weight*Jdet*effmu*(viscosity[0]*eb2j*eb1i+viscosity[1]*(esh2j*eb1i+eb2j*esh1i)+viscosity[2]*esh2j*esh1i);
+				Ke->values[4*numnodes*(4*i+1)+4*j+2]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb2j*eb1i+viscosity[2]*(esh2j*eb1i+eb2j*esh1i)+viscosity[4]*esh2j*esh1i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*eb2j*basis[i]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*esh2j*basis[i]);
+				Ke->values[4*numnodes*(4*i+2)+4*j+2]+=gauss->weight*Jdet*effmu*(viscosity[0]*eb2j*eb2i+viscosity[1]*(esh2j*eb2i+eb2j*esh2i)+viscosity[2]*esh2j*esh2i);
+				Ke->values[4*numnodes*(4*i+3)+4*j+2]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb2j*eb2i+viscosity[2]*(esh2j*eb2i+eb2j*esh2i)+viscosity[4]*esh2j*esh2i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*eb2j*basis[i]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*esh2j*basis[i]);
+
+
+				Ke->values[4*numnodes*(4*i+0)+4*j+3]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb2j*eb1i+viscosity[2]*(esh2j*eb1i+eb2j*esh1i)+viscosity[4]*esh2j*esh1i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*eb1i*basis[j]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*esh1i*basis[j]);
+				Ke->values[4*numnodes*(4*i+1)+4*j+3]+=gauss->weight*Jdet*effmu*(viscosity[2]*eb2j*eb1i+viscosity[4]*(esh2j*eb1i+eb2j*esh1i)+viscosity[5]*esh2j*esh1i+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*(vyshear*eb1i*basis[j]+vxshear*eb2j*basis[i])+viscosity[7]*(n+1)*(n+1)/2.0/thickness/thickness*(vxshear*esh2j*basis[i]+vyshear*esh1i*basis[j])+viscosity[8]*(n+1)*(n+1)*(n+1)*(n+1)/4.0/thickness/thickness/thickness/thickness*vxshear*vxshear*basis[j]*basis[i]);
+				Ke->values[4*numnodes*(4*i+2)+4*j+3]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb2j*eb2i+viscosity[2]*(esh2j*eb2i+eb2j*esh2i)+viscosity[4]*esh2j*esh2i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*eb2i*basis[j]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*esh2i*basis[j]);
+				Ke->values[4*numnodes*(4*i+3)+4*j+3]+=gauss->weight*Jdet*effmu*(viscosity[2]*eb2j*eb2i+viscosity[4]*(esh2j*eb2i+eb2j*esh2i)+viscosity[5]*esh2j*esh2i+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*(eb2i*basis[j]+eb1j*basis[i])+viscosity[7]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*(esh2i*basis[j]+esh1j*basis[i])+viscosity[8]*(n+1)*(n+1)*(n+1)*(n+1)/4.0/thickness/thickness/thickness/thickness*vyshear*vyshear*basis[j]*basis[i]);
+			}
+		}
+	}
+
+	/*Transform Coordinate System*/
+	/*element->TransformStiffnessMatrixCoord(Ke,XYEnum);*/
+
+   /*Clean up and return*/
+   delete gauss;
+   delete gauss_base;
+   if(basalelement->IsSpawnedElement()){basalelement->DeleteMaterials(); delete basalelement;};
+   xDelete<IssmDouble>(xyz_list);
+   xDelete<IssmDouble>(dbasis);
+   xDelete<IssmDouble>(basis);
+   return Ke;
+}/*}}}*/
+ElementMatrix* AdjointHorizAnalysis::CreateKMatrixMOLHOVerticalIntergrated(Element* element){/*{{{*/
+
+	/* Check if ice in element */
+	if(!element->IsIceInElement()) return NULL;
+
+	/*Intermediaries */
+	IssmDouble  Jdet,mu_prime,n,thickness,mu,effmu;
+	IssmDouble *xyz_list = NULL;
+	IssmDouble	zeta, epsilon_eff;
+   int			domaintype;
+	int			dim=2;
+
+	IssmDouble  e1phi1i, e1phi1j, e2phi1i, e2phi1j, e1phi2i, e1phi2j, e2phi2i, e2phi2j;
+	IssmDouble  epsilon[5];/* epsilon=[exx,eyy,exy,exz,eyz];*/
+	IssmDouble	e1[3],e2[3];
+
+   Element* basalelement = NULL;
 
    /*Get basal element*/
@@ -251,10 +382,7 @@
       default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
    }
-	/*Fetch number of nodes and dof for this finite element*/
-   int numnodes = basalelement->GetNumberOfNodes();
-   IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes); // like SSA
-   IssmDouble* basis  = xNew<IssmDouble>(numnodes); // like SSA
 
 	/*Initialize Jacobian with regular HO (first part of the Gateau derivative)*/
+	bool incomplete_adjoint;
 	element->FindParam(&incomplete_adjoint,InversionIncompleteAdjointEnum);
 	StressbalanceAnalysis* analysis = new StressbalanceAnalysis();
@@ -263,133 +391,11 @@
 	if(incomplete_adjoint) return Ke;
 
-	/*Retrieve all inputs and parameters*/
-	element->GetVerticesCoordinates(&xyz_list);
-   Input* vx_input       = element->GetInput(VxEnum);        _assert_(vx_input); //vertically integrated vx
-   Input* vy_input       = element->GetInput(VyEnum);        _assert_(vy_input); //vertically integrated vy
-   Input* vxbase_input   = element->GetInput(VxBaseEnum);    _assert_(vxbase_input);
-   Input* vybase_input   = element->GetInput(VyBaseEnum);    _assert_(vybase_input);
-   Input* vxshear_input  = element->GetInput(VxShearEnum);   _assert_(vxshear_input);
-   Input* vyshear_input  = element->GetInput(VyShearEnum);   _assert_(vyshear_input);
-   Input* thickness_input= element->GetInput(ThicknessEnum); _assert_(thickness_input);
-   Input* n_input        = element->GetInput(MaterialsRheologyNEnum); _assert_(n_input);
-
-	/* Start  looping on the number of gaussian points: */
-   Gauss* gauss      = element->NewGauss(5);
-   Gauss* gauss_base = basalelement->NewGauss();
-   while(gauss->next()){
-      gauss->SynchronizeGaussBase(gauss_base);
-
-      element->JacobianDeterminant(&Jdet,xyz_list,gauss_base);
-      basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss_base);
-      basalelement->NodalFunctions(basis, gauss_base);
-
-      thickness_input->GetInputValue(&thickness, gauss);
-      n_input->GetInputValue(&n,gauss);
-
-      vxshear_input->GetInputValue(&vxshear,gauss);
-      vyshear_input->GetInputValue(&vyshear,gauss);
-
-		element->material->ViscosityMLHOAdjoint(&viscosity[0],dim,xyz_list,gauss,vxbase_input,vybase_input,vxshear_input,vyshear_input,thickness_input,n_input);
-
-		effmu = 2.0*(1-n)/2.0/n;
-
-		element->StrainRateHO(&epsilonbase[0],xyz_list,gauss,vxbase_input, vybase_input);
-		element->StrainRateHO(&epsilonshear[0],xyz_list,gauss,vxshear_input, vyshear_input);
-
-		e1b[0] = 2*epsilonbase[0]+epsilonbase[1];		e1b[1] = epsilonbase[2];
-		e2b[1] = epsilonbase[0]+2*epsilonbase[1];		e2b[0] = epsilonbase[2];
-
-		e1sh[0] = 2*epsilonshear[0]+epsilonshear[1];		e1sh[1] = epsilonshear[2];
-		e2sh[1] = epsilonshear[0]+2*epsilonshear[1];		e2sh[0] = epsilonshear[2];
-
-		for(int i=0;i<numnodes;i++){
-			for(int j=0;j<numnodes;j++){
-				eb1i = e1b[0]*dbasis[0*numnodes+i]+e1b[1]*dbasis[1*numnodes+i];
-				eb1j = e1b[0]*dbasis[0*numnodes+j]+e1b[1]*dbasis[1*numnodes+j];
-				eb2i = e2b[0]*dbasis[0*numnodes+i]+e2b[1]*dbasis[1*numnodes+i];
-				eb2j = e2b[0]*dbasis[0*numnodes+j]+e2b[1]*dbasis[1*numnodes+j];
-            esh1i = e1sh[0]*dbasis[0*numnodes+i]+e1sh[1]*dbasis[1*numnodes+i];
-            esh1j = e1sh[0]*dbasis[0*numnodes+j]+e1sh[1]*dbasis[1*numnodes+j];
-            esh2i = e2sh[0]*dbasis[0*numnodes+i]+e2sh[1]*dbasis[1*numnodes+i];
-            esh2j = e2sh[0]*dbasis[0*numnodes+j]+e2sh[1]*dbasis[1*numnodes+j];
-
-				Ke->values[4*numnodes*(4*i+0)+4*j+0]+=gauss->weight*Jdet*effmu*(viscosity[0]*eb1j*eb1i+viscosity[1]*(esh1j*eb1i+eb1j*esh1i)+viscosity[2]*esh1j*esh1i);
-				Ke->values[4*numnodes*(4*i+1)+4*j+0]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb1j*eb1i+viscosity[2]*(esh1j*eb1i+eb1j*esh1i)+viscosity[4]*esh1j*esh1i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*eb1j*basis[i]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*esh1j*basis[i]);
-				Ke->values[4*numnodes*(4*i+2)+4*j+0]+=gauss->weight*Jdet*effmu*(viscosity[0]*eb1j*eb2i+viscosity[1]*(esh1j*eb2i+eb1j*esh2i)+viscosity[2]*esh1j*esh2i);
-				Ke->values[4*numnodes*(4*i+3)+4*j+0]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb1j*eb2i+viscosity[2]*(esh1j*eb2i+eb1j*esh2i)+viscosity[4]*esh1j*esh2i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*eb1j*basis[i]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*esh1j*basis[i]);
-
-				Ke->values[4*numnodes*(4*i+0)+4*j+1]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb1j*eb1i+viscosity[2]*(esh1j*eb1i+eb1j*esh1i)+viscosity[4]*esh1j*esh1i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*eb1i*basis[j]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*esh1i*basis[j]);
-				Ke->values[4*numnodes*(4*i+1)+4*j+1]+=gauss->weight*Jdet*effmu*(viscosity[2]*eb1j*eb1i+viscosity[4]*(esh1j*eb1i+eb1j*esh1i)+viscosity[5]*esh1j*esh1i+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*(eb1i*basis[j]+eb1j*basis[i])+viscosity[7]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*(esh1i*basis[j]+esh1j*basis[i])+viscosity[8]*(n+1)*(n+1)*(n+1)*(n+1)/4.0/thickness/thickness/thickness/thickness*vxshear*vxshear*basis[j]*basis[i]);
-				Ke->values[4*numnodes*(4*i+2)+4*j+1]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb1j*eb2i+viscosity[2]*(esh1j*eb2i+eb1j*esh2i)+viscosity[4]*esh1j*esh2i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*eb2i*basis[j]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*esh2i*basis[j]);
-				Ke->values[4*numnodes*(4*i+3)+4*j+1]+=gauss->weight*Jdet*effmu*(viscosity[2]*eb1j*eb2i+viscosity[4]*(esh1j*eb2i+eb1j*esh2i)+viscosity[5]*esh1j*esh2i+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*(vxshear*eb2i*basis[j]+vyshear*eb1j*basis[i])+viscosity[7]*(n+1)*(n+1)/2.0/thickness/thickness*(vxshear*esh2i*basis[j]+vyshear*esh1j*basis[i])+viscosity[8]*(n+1)*(n+1)*(n+1)*(n+1)/4.0/thickness/thickness/thickness/thickness*vxshear*vyshear*basis[j]*basis[i]);
-				
-
-				Ke->values[4*numnodes*(4*i+0)+4*j+2]+=gauss->weight*Jdet*effmu*(viscosity[0]*eb2j*eb1i+viscosity[1]*(esh2j*eb1i+eb2j*esh1i)+viscosity[2]*esh2j*esh1i);
-				Ke->values[4*numnodes*(4*i+1)+4*j+2]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb2j*eb1i+viscosity[2]*(esh2j*eb1i+eb2j*esh1i)+viscosity[4]*esh2j*esh1i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*eb2j*basis[i]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*esh2j*basis[i]);
-				Ke->values[4*numnodes*(4*i+2)+4*j+2]+=gauss->weight*Jdet*effmu*(viscosity[0]*eb2j*eb2i+viscosity[1]*(esh2j*eb2i+eb2j*esh2i)+viscosity[2]*esh2j*esh2i);
-				Ke->values[4*numnodes*(4*i+3)+4*j+2]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb2j*eb2i+viscosity[2]*(esh2j*eb2i+eb2j*esh2i)+viscosity[4]*esh2j*esh2i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*eb2j*basis[i]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*esh2j*basis[i]);
-
-
-				Ke->values[4*numnodes*(4*i+0)+4*j+3]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb2j*eb1i+viscosity[2]*(esh2j*eb1i+eb2j*esh1i)+viscosity[4]*esh2j*esh1i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*eb1i*basis[j]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*esh1i*basis[j]);
-				Ke->values[4*numnodes*(4*i+1)+4*j+3]+=gauss->weight*Jdet*effmu*(viscosity[2]*eb2j*eb1i+viscosity[4]*(esh2j*eb1i+eb2j*esh1i)+viscosity[5]*esh2j*esh1i+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*(vyshear*eb1i*basis[j]+vxshear*eb2j*basis[i])+viscosity[7]*(n+1)*(n+1)/2.0/thickness/thickness*(vxshear*esh2j*basis[i]+vyshear*esh1i*basis[j])+viscosity[8]*(n+1)*(n+1)*(n+1)*(n+1)/4.0/thickness/thickness/thickness/thickness*vxshear*vxshear*basis[j]*basis[i]);
-				Ke->values[4*numnodes*(4*i+2)+4*j+3]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb2j*eb2i+viscosity[2]*(esh2j*eb2i+eb2j*esh2i)+viscosity[4]*esh2j*esh2i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*eb2i*basis[j]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*esh2i*basis[j]);
-				Ke->values[4*numnodes*(4*i+3)+4*j+3]+=gauss->weight*Jdet*effmu*(viscosity[2]*eb2j*eb2i+viscosity[4]*(esh2j*eb2i+eb2j*esh2i)+viscosity[5]*esh2j*esh2i+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*(eb2i*basis[j]+eb1j*basis[i])+viscosity[7]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*(esh2i*basis[j]+esh1j*basis[i])+viscosity[8]*(n+1)*(n+1)*(n+1)*(n+1)/4.0/thickness/thickness/thickness/thickness*vyshear*vyshear*basis[j]*basis[i]);
-			}
-		}
-	}
-
-	/*Transform Coordinate System*/
-	/*element->TransformStiffnessMatrixCoord(Ke,XYEnum);*/
-
-   /*Clean up and return*/
-   delete gauss;
-   delete gauss_base;
-   if(basalelement->IsSpawnedElement()){basalelement->DeleteMaterials(); delete basalelement;};
-   xDelete<IssmDouble>(xyz_list);
-   xDelete<IssmDouble>(dbasis);
-   xDelete<IssmDouble>(basis);
-   return Ke;
-}/*}}}*/
-ElementMatrix* AdjointHorizAnalysis::CreateKMatrixMLHOVerticalIntergrated(Element* element){/*{{{*/
-
-	/* Check if ice in element */
-	if(!element->IsIceInElement()) return NULL;
-
-	/*Intermediaries */
-	bool        incomplete_adjoint;
-	IssmDouble  Jdet,mu_prime,n,thickness,mu,effmu;
-	IssmDouble *xyz_list = NULL;
-	IssmDouble	zeta, epsilon_eff;
-   int			domaintype;
-	int			dim=2;
-
-	IssmDouble  e1phi1i, e1phi1j, e2phi1i, e2phi1j, e1phi2i, e1phi2j, e2phi2i, e2phi2j;
-	IssmDouble  epsilon[5];/* epsilon=[exx,eyy,exy,exz,eyz];*/
-	IssmDouble	e1[3],e2[3];
-
-   Element* basalelement;
-
-   /*Get basal element*/
-   element->FindParam(&domaintype,DomainTypeEnum);
-   switch(domaintype){
-      case Domain2DhorizontalEnum:
-         basalelement = element;
-         break;
-      case Domain3DEnum: case Domain2DverticalEnum:
-         _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
-         break;
-      default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
-   }
+	/*Second part of the Gateau derivative if requested*/
+
+
 	/*Fetch number of nodes and dof for this finite element*/
    int numnodes = basalelement->GetNumberOfNodes();
    IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes); // like SSA
    IssmDouble* basis  = xNew<IssmDouble>(numnodes); // like SSA
-
-	/*Initialize Jacobian with regular HO (first part of the Gateau derivative)*/
-	element->FindParam(&incomplete_adjoint,InversionIncompleteAdjointEnum);
-	StressbalanceAnalysis* analysis = new StressbalanceAnalysis();
-	ElementMatrix* Ke=analysis->CreateKMatrix(basalelement);
-	delete analysis;
-	if(incomplete_adjoint) return Ke;
 
 	/*Retrieve all inputs and parameters*/
@@ -427,5 +433,5 @@
 
 		   /* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy (for a given zeta)*/
-			element->StrainRateMLHO(&epsilon[0],xyz_list,gauss,
+			element->StrainRateMOLHO(&epsilon[0],xyz_list,gauss,
                   vxbase_input,vybase_input,vxshear_input,vyshear_input,thickness_input,n_input,zeta);
 			epsilon_eff=sqrt(epsilon[0]*epsilon[0] + epsilon[1]*epsilon[1] + epsilon[2]*epsilon[2]
@@ -612,6 +618,6 @@
 		case FSApproximationEnum: 
 			return CreatePVectorFS(element);
-      case MLHOApproximationEnum:
-			return CreatePVectorMLHO(element);
+      case MOLHOApproximationEnum:
+			return CreatePVectorMOLHO(element);
 		case NoneApproximationEnum:
 			return NULL;
@@ -1099,5 +1105,5 @@
 
 }/*}}}*/
-ElementVector* AdjointHorizAnalysis::CreatePVectorMLHO(Element* element){/*{{{*/
+ElementVector* AdjointHorizAnalysis::CreatePVectorMOLHO(Element* element){/*{{{*/
 
 	/*Intermediaries*/
@@ -1137,5 +1143,5 @@
 
 	/*Initialize Element vector and vectors*/
-	ElementVector* pe    = basalelement->NewElementVector(MLHOApproximationEnum);
+	ElementVector* pe    = basalelement->NewElementVector(MOLHOApproximationEnum);
 	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
 
@@ -1206,5 +1212,5 @@
 						}
 						else {
-							_error_("2D vertical is not implemented for MLHO");
+							_error_("2D vertical is not implemented for MOLHO");
 						}
 					}
@@ -1234,5 +1240,5 @@
 						}
 						else{
-							_error_("2D vertical is not implemented for MLHO");
+							_error_("2D vertical is not implemented for MOLHO");
 						}
 					}
@@ -1263,5 +1269,5 @@
 						}
 						else{
-							_error_("2D vertical is not implemented for MLHO");
+							_error_("2D vertical is not implemented for MOLHO");
 						}
 					}
@@ -1289,5 +1295,5 @@
 						}
 						else{
-							_error_("2D vertical is not implemented for MLHO");
+							_error_("2D vertical is not implemented for MOLHO");
 						}
 					}
@@ -1313,5 +1319,5 @@
 						}
 						else{
-							_error_("2D vertical is not implemented for MLHO");
+							_error_("2D vertical is not implemented for MOLHO");
 						}
 					}
@@ -1663,5 +1669,5 @@
 				case L1L2ApproximationEnum:GradientJDragL1L2(element,gradient,control_interp,control_index); break;
 				case HOApproximationEnum:  GradientJDragHO( element,gradient,control_interp,control_index); break;
-				case MLHOApproximationEnum:  GradientJDragMLHO( element,gradient,control_interp,control_index); break;
+				case MOLHOApproximationEnum:  GradientJDragMOLHO( element,gradient,control_interp,control_index); break;
 				case FSApproximationEnum:  GradientJDragFS( element,gradient,control_interp,control_index); break;
 				case NoneApproximationEnum: /*Gradient is 0*/                    break;
@@ -1684,5 +1690,5 @@
 				case L1L2ApproximationEnum:GradientJBbarL1L2(element,gradient,control_interp,control_index); break;
 				case HOApproximationEnum:  GradientJBbarHO( element,gradient,control_interp,control_index); break;
-				case MLHOApproximationEnum:  GradientJBbarMLHO( element,gradient,control_interp,control_index); break;
+				case MOLHOApproximationEnum:  GradientJBbarMOLHO( element,gradient,control_interp,control_index); break;
 				case FSApproximationEnum:  GradientJBbarFS( element,gradient,control_interp,control_index); break;
 				case NoneApproximationEnum: /*Gradient is 0*/                    break;
@@ -1694,5 +1700,5 @@
 				case SSAApproximationEnum: GradientJBSSA(element,gradient,control_interp,control_index); break;
 				case HOApproximationEnum:  GradientJBHO( element,gradient,control_interp,control_index); break;
-			//	case MLHOApproximationEnum:  GradientJBMLHO( element,gradient,control_interp,control_index); break;
+			//	case MOLHOApproximationEnum:  GradientJBMOLHO( element,gradient,control_interp,control_index); break;
 				case FSApproximationEnum:  GradientJBFS( element,gradient,control_interp,control_index); break;
 				case NoneApproximationEnum: /*Gradient is 0*/                    break;
@@ -1804,5 +1810,5 @@
 	this->GradientJBbarSSA(element,gradient,control_interp,control_index);
 }/*}}}*/
-void           AdjointHorizAnalysis::GradientJBbarMLHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/
+void           AdjointHorizAnalysis::GradientJBbarMOLHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/
 
    if(control_interp!=P1Enum) _error_("not implemented yet...");
@@ -1887,8 +1893,8 @@
 			zeta=0.5*(gauss_seg->coord1+1);
 
-			basalelement->StrainRateMLHO(&epsilon[0],xyz_list,gauss,
+			basalelement->StrainRateMOLHO(&epsilon[0],xyz_list,gauss,
                   vxbase_input,vybase_input,vxshear_input,vyshear_input,thickness_input,n_input,zeta);
 
-			basalelement->dViscositydBMLHO(&dmudB,dim,xyz_list,gauss,vxbase_input,vybase_input,vxshear_input,vyshear_input,thickness_input,n_input,zeta);
+			basalelement->dViscositydBMOLHO(&dmudB,dim,xyz_list,gauss,vxbase_input,vybase_input,vxshear_input,vyshear_input,thickness_input,n_input,zeta);
 
 			e1[0] = 2.0*epsilon[0]+epsilon[1];
@@ -2245,5 +2251,5 @@
 	delete gauss;
 }/*}}}*/
-void           AdjointHorizAnalysis::GradientJBMLHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/
+void           AdjointHorizAnalysis::GradientJBMOLHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/
 	_error_("not implemented yet...");
 }/*}}}*/
@@ -2645,5 +2651,5 @@
 	delete friction;
 }/*}}}*/
-void           AdjointHorizAnalysis::GradientJDragMLHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/
+void           AdjointHorizAnalysis::GradientJDragMOLHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index){/*{{{*/
 
 	/*return if floating (gradient is 0)*/
@@ -3266,6 +3272,6 @@
 		InputUpdateFromSolutionFS(solution,element);
 	}
-	else if (approximation==MLHOApproximationEnum) {
-		InputUpdateFromSolutionMLHO(solution, element);
+	else if (approximation==MOLHOApproximationEnum) {
+		InputUpdateFromSolutionMOLHO(solution, element);
 	}
 	else{
@@ -3414,5 +3420,5 @@
 	xDelete<int>(doflist);
 }/*}}}*/
-void           AdjointHorizAnalysis::InputUpdateFromSolutionMLHO(IssmDouble* solution,Element* element){/*{{{*/
+void           AdjointHorizAnalysis::InputUpdateFromSolutionMOLHO(IssmDouble* solution,Element* element){/*{{{*/
 	int  i;
 	int* doflist=NULL;
@@ -3427,13 +3433,13 @@
 
 	/*Fetch dof list and allocate solution vectors*/
-	element->GetDofListLocal(&doflist,MLHOApproximationEnum,GsetEnum);
-	IssmDouble* values  = xNew<IssmDouble>(numdof);
-	IssmDouble* lambdax = xNew<IssmDouble>(numnodes);
-	IssmDouble* lambday = xNew<IssmDouble>(numnodes);
-	IssmDouble* lambdabx = xNew<IssmDouble>(numnodes);
-	IssmDouble* lambdaby = xNew<IssmDouble>(numnodes);
+	element->GetDofListLocal(&doflist,MOLHOApproximationEnum,GsetEnum);
+	IssmDouble* values    = xNew<IssmDouble>(numdof);
+	IssmDouble* lambdax   = xNew<IssmDouble>(numnodes);
+	IssmDouble* lambday   = xNew<IssmDouble>(numnodes);
+	IssmDouble* lambdabx  = xNew<IssmDouble>(numnodes);
+	IssmDouble* lambdaby  = xNew<IssmDouble>(numnodes);
 	IssmDouble* lambdashx = xNew<IssmDouble>(numnodes);
 	IssmDouble* lambdashy = xNew<IssmDouble>(numnodes);
-	IssmDouble* n			 = xNew<IssmDouble>(numnodes);
+	IssmDouble* n         = xNew<IssmDouble>(numnodes);
 
 	/*Use the dof list to index into the solution vector: */
@@ -3485,4 +3491,5 @@
 	xDelete<IssmDouble>(lambdashx);
 	xDelete<IssmDouble>(lambdashy);
+   xDelete<IssmDouble>(n);
 	xDelete<int>(doflist);
 }/*}}}*/
Index: /issm/trunk/src/c/analyses/AdjointHorizAnalysis.h
===================================================================
--- /issm/trunk/src/c/analyses/AdjointHorizAnalysis.h	(revision 27034)
+++ /issm/trunk/src/c/analyses/AdjointHorizAnalysis.h	(revision 27035)
@@ -28,6 +28,6 @@
 		ElementMatrix* CreateKMatrixFS(Element* element);
 		ElementMatrix* CreateKMatrixHO(Element* element);
-		ElementMatrix* CreateKMatrixMLHO(Element* element);
-		ElementMatrix* CreateKMatrixMLHOVerticalIntergrated(Element* element);
+		ElementMatrix* CreateKMatrixMOLHO(Element* element);
+		ElementMatrix* CreateKMatrixMOLHOVerticalIntergrated(Element* element);
 		ElementMatrix* CreateKMatrixL1L2(Element* element);
 		ElementMatrix* CreateKMatrixSSA(Element* element);
@@ -36,5 +36,5 @@
 		ElementVector* CreatePVectorL1L2(Element* element);
 		ElementVector* CreatePVectorHO(Element* element);
-		ElementVector* CreatePVectorMLHO(Element* element);
+		ElementVector* CreatePVectorMOLHO(Element* element);
 		ElementVector* CreatePVectorSSA(Element* element);
 		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
@@ -45,10 +45,10 @@
 		void           GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
 		void           GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
-		void           GradientJBbarMLHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
+		void           GradientJBbarMOLHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
 		void           GradientJBbarSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
 		void           GradientJBFS(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
 		void           GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
 		void           GradientJBHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
-		void           GradientJBMLHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
+		void           GradientJBMOLHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
 		void           GradientJBSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
 		void           GradientJDragFS(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
@@ -56,5 +56,5 @@
 		void           GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
 		void           GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
-		void           GradientJDragMLHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
+		void           GradientJDragMOLHO(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
 		void           GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
 		void           GradientJDragHydroFS(Element* element,Vector<IssmDouble>* gradient,int control_interp,int control_index);
@@ -66,5 +66,5 @@
 		void           InputUpdateFromSolutionFS(IssmDouble* solution,Element* element);
 		void           InputUpdateFromSolutionHoriz(IssmDouble* solution,Element* element);
-		void           InputUpdateFromSolutionMLHO(IssmDouble* solution,Element* element);
+		void           InputUpdateFromSolutionMOLHO(IssmDouble* solution,Element* element);
 		void           UpdateConstraints(FemModel* femmodel);
 };
Index: /issm/trunk/src/c/analyses/BalancethicknessAnalysis.cpp
===================================================================
--- /issm/trunk/src/c/analyses/BalancethicknessAnalysis.cpp	(revision 27034)
+++ /issm/trunk/src/c/analyses/BalancethicknessAnalysis.cpp	(revision 27035)
@@ -552,5 +552,4 @@
 }/*}}}*/
 void           BalancethicknessAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
-	/*Default, do nothing*/
-	return;
-}/*}}}*/
+	SetActiveNodesLSMx(femmodel);
+}/*}}}*/
Index: /issm/trunk/src/c/analyses/FreeSurfaceBaseAnalysis.cpp
===================================================================
--- /issm/trunk/src/c/analyses/FreeSurfaceBaseAnalysis.cpp	(revision 27034)
+++ /issm/trunk/src/c/analyses/FreeSurfaceBaseAnalysis.cpp	(revision 27035)
@@ -73,5 +73,5 @@
 	}
 
-	iomodel->FetchDataToInput(inputs,elements,"md.geometry.surface",SurfaceEnum);
+	iomodel->FetchDataToInput(inputs,elements,"md.geometry.base",BaseEnum);
 	iomodel->FetchDataToInput(inputs,elements,"md.initialization.sealevel",SealevelEnum,0);
 	iomodel->FetchDataToInput(inputs,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
@@ -96,7 +96,7 @@
 			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.floatingice_melting_rate",BasalforcingsFloatingiceMeltingRateEnum);
 			if(isstochastic){
-            iomodel->FetchDataToInput(inputs,elements,"md.stochasticforcing.default_id",StochasticForcingDefaultIdEnum);
-            iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.floatingice_melting_rate",BaselineBasalforcingsFloatingiceMeltingRateEnum);
-         }
+				iomodel->FetchDataToInput(inputs,elements,"md.stochasticforcing.default_id",StochasticForcingDefaultIdEnum);
+				iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.floatingice_melting_rate",BaselineBasalforcingsFloatingiceMeltingRateEnum);
+			}
 			break;
 		case LinearFloatingMeltRateEnum:
@@ -108,7 +108,12 @@
 			break;
 		case SpatialLinearFloatingMeltRateEnum:
-			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_melting_rate",BasalforcingsDeepwaterMeltingRateEnum);
-			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_elevation",BasalforcingsDeepwaterElevationEnum);
-			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.upperwater_elevation",BasalforcingsUpperwaterElevationEnum);
+			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_melting_rate",BasalforcingsSpatialDeepwaterMeltingRateEnum);
+			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_elevation",BasalforcingsSpatialDeepwaterElevationEnum);
+			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.upperwater_melting_rate",BasalforcingsSpatialUpperwaterMeltingRateEnum);
+			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.upperwater_elevation",BasalforcingsSpatialUpperwaterElevationEnum);
+			if(isstochastic){
+				iomodel->FetchDataToInput(inputs,elements,"md.stochasticforcing.default_id",StochasticForcingDefaultIdEnum);
+				iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_melting_rate",BaselineBasalforcingsSpatialDeepwaterMeltingRateEnum);
+			}
 			break;
 		case BasalforcingsPicoEnum:
@@ -143,5 +148,5 @@
 }/*}}}*/
 ElementMatrix* FreeSurfaceBaseAnalysis::CreateJacobianMatrix(Element* element){/*{{{*/
-_error_("Not implemented");
+	_error_("Not implemented");
 }/*}}}*/
 ElementMatrix* FreeSurfaceBaseAnalysis::CreateKMatrix(Element* element){/*{{{*/
@@ -152,5 +157,5 @@
 	IssmDouble *xyz_list  = NULL;
 	IssmDouble  Jdet,D_scalar,dt,h;
-	IssmDouble  vel,vx,vy;
+	IssmDouble  vel,vx,vy,tau;
 
 	/*Get basal element*/
@@ -225,19 +230,5 @@
 		}
 
-		if(stabilization==2){
-			/*Streamline upwinding*/
-			if(dim==1){
-			 vel=fabs(vx)+1.e-8;
-			 D[0] = h/(2.*vel)*vx*vx;
-			}
-			else{
-			 vel=sqrt(vx*vx+vy*vy)+1.e-8;
-			 D[0*dim+0]=h/(2*vel)*vx*vx;
-			 D[1*dim+0]=h/(2*vel)*vy*vx;
-			 D[0*dim+1]=h/(2*vel)*vx*vy;
-			 D[1*dim+1]=h/(2*vel)*vy*vy;
-			}
-		}
-		else if(stabilization==1){
+		if(stabilization==1){
 			/*SSA*/
 			if(dim==1){
@@ -250,4 +241,31 @@
 				D[0*dim+0]=h/2.0*fabs(vx);
 				D[1*dim+1]=h/2.0*fabs(vy);
+			}
+		}
+		else if(stabilization==2){
+			/*Streamline upwinding*/
+			if(dim==1){
+				vel=fabs(vx)+1.e-8;
+				D[0] = h/(2.*vel)*vx*vx;
+			}
+			else{
+				vel=sqrt(vx*vx+vy*vy)+1.e-8;
+				D[0*dim+0]=h/(2*vel)*vx*vx;
+				D[1*dim+0]=h/(2*vel)*vy*vx;
+				D[0*dim+1]=h/(2*vel)*vx*vy;
+				D[1*dim+1]=h/(2*vel)*vy*vy;
+			}
+
+		}
+		else if(stabilization==5){
+			/*SUPG*/
+			if(dim==1){
+				vx_input->GetInputAverage(&vx);
+				tau=h/(2.*fabs(vx)+1e-10);
+			}
+			else{
+				vx_input->GetInputAverage(&vx);
+				vy_input->GetInputAverage(&vy);
+				tau=1*h/(2.*pow(vx*vx+vy*vy,0.5)+1e-10);
 			}
 		}
@@ -258,7 +276,7 @@
 					for(int j=0;j<numnodes;j++){
 						Ke->values[i*numnodes+j] += (
-									dbasis[0*numnodes+i] *(D[0*dim+0]*dbasis[0*numnodes+j] + D[0*dim+1]*dbasis[1*numnodes+j]) +
-									dbasis[1*numnodes+i] *(D[1*dim+0]*dbasis[0*numnodes+j] + D[1*dim+1]*dbasis[1*numnodes+j]) 
-									);
+								dbasis[0*numnodes+i] *(D[0*dim+0]*dbasis[0*numnodes+j] + D[0*dim+1]*dbasis[1*numnodes+j]) +
+								dbasis[1*numnodes+i] *(D[1*dim+0]*dbasis[0*numnodes+j] + D[1*dim+1]*dbasis[1*numnodes+j]) 
+								);
 					}
 				}
@@ -266,4 +284,19 @@
 			else{
 				for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += dbasis[0*numnodes+i]*D[0]*dbasis[0*numnodes+j];
+			}
+		}
+		else if(stabilization==5){
+			D_scalar=gauss->weight*Jdet*dt;
+			if(dim==2){
+				for(int i=0;i<numnodes;i++){
+					for(int j=0;j<numnodes;j++){
+						Ke->values[i*numnodes+j]+=tau*D_scalar*
+							(vx*dbasis[0*numnodes+i]+vy*dbasis[1*numnodes+i])*
+							(vx*dbasis[0*numnodes+j]+vy*dbasis[1*numnodes+j]);
+					}
+				}
+			}
+			else{
+				for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j]+=tau*D_scalar*(vx*dbasis[0*numnodes+i])*(vx*dbasis[0*numnodes+j]);
 			}
 		}
@@ -280,8 +313,9 @@
 }/*}}}*/
 ElementVector* FreeSurfaceBaseAnalysis::CreatePVector(Element* element){/*{{{*/
+
 	/*Intermediaries*/
-	int         domaintype,dim;
+	int         domaintype,dim,stabilization;
 	IssmDouble  Jdet,dt;
-	IssmDouble  gmb,fmb,mb,bed,phi,vz;
+	IssmDouble  gmb,fmb,mb,bed,vx,vy,vz,tau;
 	Element*    basalelement = NULL;
 	IssmDouble *xyz_list  = NULL;
@@ -309,25 +343,52 @@
 	/*Fetch number of nodes and dof for this finite element*/
 	int numnodes = basalelement->GetNumberOfNodes();
+	int         melt_style,point1;
+	IssmDouble  fraction1,fraction2;
+	bool        mainlyfloating;
 
 	/*Initialize Element vector and other vectors*/
 	ElementVector* pe    = basalelement->NewElementVector();
 	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
+	IssmDouble*    dbasis = xNew<IssmDouble>(dim*numnodes);
+	IssmDouble  gllevelset,phi=1.;
 
 	/*Retrieve all inputs and parameters*/
-	basalelement->GetVerticesCoordinates(&xyz_list);
 	basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
+	basalelement->FindParam(&melt_style,GroundinglineMeltInterpolationEnum);
 	Input* groundedice_input   = basalelement->GetInput(MaskOceanLevelsetEnum);              _assert_(groundedice_input);
 	Input* gmb_input           = basalelement->GetInput(BasalforcingsGroundediceMeltingRateEnum);  _assert_(gmb_input);
 	Input* fmb_input           = basalelement->GetInput(BasalforcingsFloatingiceMeltingRateEnum);  _assert_(fmb_input);
 	Input* base_input          = basalelement->GetInput(BaseEnum);                                 _assert_(base_input);
-	Input* vz_input      = NULL;
+	Input* gllevelset_input = basalelement->GetInput(MaskOceanLevelsetEnum);              _assert_(gllevelset_input);
+	Input* vz_input = NULL;
+	Input* vx_input = NULL;
+	Input* vy_input = NULL;
 	switch(dim){
-		case 1: vz_input = basalelement->GetInput(VyEnum); _assert_(vz_input); break;
-		case 2: vz_input = basalelement->GetInput(VzEnum); _assert_(vz_input); break;
+		case 1: 
+			vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input);
+			vz_input=basalelement->GetInput(VyEnum) ; _assert_(vz_input); 
+			break;
+		case 2: 
+			vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input);
+			vy_input=basalelement->GetInput(VyEnum); _assert_(vy_input);
+			vz_input=basalelement->GetInput(VzEnum); _assert_(vz_input); 
+			break;
 		default: _error_("not implemented");
 	}
+	IssmDouble h = basalelement->CharacteristicLength();
+
+	/*Recover portion of element that is grounded*/
+	basalelement->GetVerticesCoordinates(&xyz_list);
+	phi=basalelement->GetGroundedPortion(xyz_list);
+	Gauss*      gauss     = NULL;
+	if(melt_style==SubelementMelt2Enum){
+		basalelement->GetGroundedPart(&point1,&fraction1,&fraction2,&mainlyfloating);
+		gauss = basalelement->NewGauss(point1,fraction1,fraction2,3);
+	}
+	else{
+		gauss = basalelement->NewGauss(3);   
+	}
 
 	/* Start  looping on the number of gaussian points: */
-	Gauss* gauss=basalelement->NewGauss(2);
 	while(gauss->next()){
 
@@ -335,13 +396,48 @@
 		basalelement->NodalFunctions(basis,gauss);
 
-		vz_input->GetInputValue(&vz,gauss);
+
+		vz_input->GetInputValue(&vz,gauss);  
 		gmb_input->GetInputValue(&gmb,gauss);
 		fmb_input->GetInputValue(&fmb,gauss);
 		base_input->GetInputValue(&bed,gauss);
 		groundedice_input->GetInputValue(&phi,gauss);
-		if(phi>0) mb=gmb;
-		else mb=fmb;
+		gllevelset_input->GetInputValue(&gllevelset,gauss);
+		if(melt_style==SubelementMelt1Enum){ 
+			//if (phi>0.999999999) mb=gmb;
+			//else mb=(1-phi)*fmb+phi*gmb; // phi is the fraction of grounded ice so (1-phi) is floating
+			if(phi>0) mb=gmb;
+			else mb=fmb;
+		}
+		else if(melt_style==SubelementMelt2Enum){
+			if(gllevelset>0.) mb=gmb;
+			else mb=fmb;
+		}
+		else if(melt_style==NoMeltOnPartiallyFloatingEnum){
+			if (phi<0.00000001) mb=fmb;  
+			else mb=gmb;
+		}
+		else if(melt_style==FullMeltOnPartiallyFloatingEnum){
+			if (phi<0.99999999) mb=fmb;  
+			else mb=gmb;
+		}
+		else  _error_("melt interpolation "<<EnumToStringx(melt_style)<<" not implemented yet");
 
 		for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(bed+dt*(mb) + dt*vz)*basis[i];
+
+		if(stabilization==5){
+			/*SUPG*/
+			basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+			if(dim==1){
+				vx_input->GetInputAverage(&vx);
+				tau=h/(2.*fabs(vx)+1e-10);
+				for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(dt*mb+dt*vz)*tau*(vx*dbasis[0*numnodes+i]);
+			}
+			else{ 
+				vx_input->GetInputAverage(&vx);
+				vy_input->GetInputAverage(&vy);
+				tau=1*h/(2.*pow(vx*vx+vy*vy,0.5)+1e-10);
+				for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(bed*0.+dt*mb+dt*vz)*tau*(vx*dbasis[0*numnodes+i]+vy*dbasis[1*numnodes+i]);
+			}
+		}
 	}
 
@@ -349,4 +445,5 @@
 	xDelete<IssmDouble>(xyz_list);
 	xDelete<IssmDouble>(basis);
+	xDelete<IssmDouble>(dbasis);
 	delete gauss;
 	if(basalelement->IsSpawnedElement()){basalelement->DeleteMaterials(); delete basalelement;};
@@ -355,5 +452,5 @@
 }/*}}}*/
 void           FreeSurfaceBaseAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
-	   _error_("not implemented yet");
+	_error_("not implemented yet");
 }/*}}}*/
 void           FreeSurfaceBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element*  element,int control_type,int control_interp,int control_index){/*{{{*/
Index: /issm/trunk/src/c/analyses/FreeSurfaceTopAnalysis.cpp
===================================================================
--- /issm/trunk/src/c/analyses/FreeSurfaceTopAnalysis.cpp	(revision 27034)
+++ /issm/trunk/src/c/analyses/FreeSurfaceTopAnalysis.cpp	(revision 27035)
@@ -80,4 +80,5 @@
 	iomodel->FetchDataToInput(inputs,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
 	iomodel->FetchDataToInput(inputs,elements,"md.initialization.vx",VxEnum);
+	iomodel->FetchDataToInput(inputs,elements,"md.initialization.vy",VyEnum);
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
 		iomodel->FetchDataToInput(inputs,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
@@ -111,5 +112,5 @@
 }/*}}}*/
 ElementMatrix* FreeSurfaceTopAnalysis::CreateJacobianMatrix(Element* element){/*{{{*/
-_error_("Not implemented");
+	_error_("Not implemented");
 }/*}}}*/
 ElementMatrix* FreeSurfaceTopAnalysis::CreateKMatrix(Element* element){/*{{{*/
@@ -120,5 +121,5 @@
 	IssmDouble *xyz_list  = NULL;
 	IssmDouble  Jdet,D_scalar,dt,h;
-	IssmDouble  vel,vx,vy;
+	IssmDouble  vel,vx,vy,tau;
 
 	/*Get top element*/
@@ -195,5 +196,19 @@
 		}
 
-		if(stabilization==2){
+		if(stabilization==1){
+			/*artifical diffusion*/
+			if(dim==1){
+				vx_input->GetInputAverage(&vx);
+				D[0]=h/2.*fabs(vx);
+			}
+			else{
+				vx_input->GetInputAverage(&vx);
+				vy_input->GetInputAverage(&vy);
+
+				D[0*dim+0]=h/2.0*fabs(vx);
+				D[1*dim+1]=h/2.0*fabs(vy);
+			}
+		}
+		else if(stabilization==2){
 			/*Streamline upwinding*/
 			if(dim==1){
@@ -209,16 +224,14 @@
 			}
 		}
-		else if(stabilization==1){
-			/*SSA*/
+		else if(stabilization==5){
+			/*SUPG*/
 			if(dim==1){
 				vx_input->GetInputAverage(&vx);
-				D[0]=h/2.*fabs(vx);
+				tau=h/(2.*fabs(vx)+1e-10);
 			}
 			else{
 				vx_input->GetInputAverage(&vx);
 				vy_input->GetInputAverage(&vy);
-
-				D[0*dim+0]=h/2.0*fabs(vx);
-				D[1*dim+1]=h/2.0*fabs(vy);
+				tau=1*h/(2.*pow(vx*vx+vy*vy,0.5)+1e-10);
 			}
 		}
@@ -229,7 +242,7 @@
 					for(int j=0;j<numnodes;j++){
 						Ke->values[i*numnodes+j] += (
-									dbasis[0*numnodes+i] *(D[0*dim+0]*dbasis[0*numnodes+j] + D[0*dim+1]*dbasis[1*numnodes+j]) +
-									dbasis[1*numnodes+i] *(D[1*dim+0]*dbasis[0*numnodes+j] + D[1*dim+1]*dbasis[1*numnodes+j]) 
-									);
+								dbasis[0*numnodes+i] *(D[0*dim+0]*dbasis[0*numnodes+j] + D[0*dim+1]*dbasis[1*numnodes+j]) +
+								dbasis[1*numnodes+i] *(D[1*dim+0]*dbasis[0*numnodes+j] + D[1*dim+1]*dbasis[1*numnodes+j]) 
+								);
 					}
 				}
@@ -237,4 +250,19 @@
 			else{
 				for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += dbasis[0*numnodes+i]*D[0]*dbasis[0*numnodes+j];
+			}
+		}
+		else if(stabilization==5){
+			D_scalar=gauss->weight*Jdet*dt;
+			if(dim==2){
+				for(int i=0;i<numnodes;i++){
+					for(int j=0;j<numnodes;j++){
+						Ke->values[i*numnodes+j]+=tau*D_scalar*
+							(vx*dbasis[0*numnodes+i]+vy*dbasis[1*numnodes+i])*
+							(vx*dbasis[0*numnodes+j]+vy*dbasis[1*numnodes+j]);
+					}
+				}
+			}
+			else{
+				for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j]+=tau*D_scalar*(vx*dbasis[0*numnodes+i])*(vx*dbasis[0*numnodes+j]);
 			}
 		}
@@ -251,8 +279,9 @@
 }/*}}}*/
 ElementVector* FreeSurfaceTopAnalysis::CreatePVector(Element* element){/*{{{*/
+
 	/*Intermediaries*/
-	int         domaintype,dim;
+	int         domaintype,dim,stabilization;
 	IssmDouble  Jdet,dt;
-	IssmDouble  ms,surface,vz;
+	IssmDouble  ms,surface,vx,vy,vz,tau;
 	Element*    topelement = NULL;
 	IssmDouble *xyz_list  = NULL;
@@ -284,16 +313,27 @@
 	ElementVector* pe    = topelement->NewElementVector();
 	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
+	IssmDouble*    dbasis = xNew<IssmDouble>(dim*numnodes);
 
 	/*Retrieve all inputs and parameters*/
 	topelement->GetVerticesCoordinates(&xyz_list);
 	topelement->FindParam(&dt,TimesteppingTimeStepEnum);
-	Input* ms_input      = topelement->GetInput(SmbMassBalanceEnum);  _assert_(ms_input);
-	Input* surface_input = topelement->GetInput(SurfaceEnum);                     _assert_(surface_input);
-	Input* vz_input      = NULL;
+	Input *ms_input      = topelement->GetInput(SmbMassBalanceEnum); _assert_(ms_input);
+	Input *surface_input = topelement->GetInput(SurfaceEnum);        _assert_(surface_input);
+	Input *vz_input      = NULL;
+	Input *vx_input      = NULL;
+	Input *vy_input      = NULL;
 	switch(dim){
-		case 1: vz_input = topelement->GetInput(VyEnum); _assert_(vz_input); break;
-		case 2: vz_input = topelement->GetInput(VzEnum); _assert_(vz_input); break;
+		case 1: 
+			vx_input=topelement->GetInput(VxEnum); _assert_(vx_input);
+			vz_input = topelement->GetInput(VyEnum)	; _assert_(vz_input); 
+			break;
+		case 2: 
+			vx_input=topelement->GetInput(VxEnum); _assert_(vx_input);
+			vy_input = topelement->GetInput(VyEnum); _assert_(vy_input);
+			vz_input = topelement->GetInput(VzEnum); _assert_(vz_input); 
+			break;
 		default: _error_("not implemented");
 	}
+	IssmDouble h = topelement->CharacteristicLength();
 
 	/*Initialize mb_correction to 0, do not forget!:*/
@@ -312,7 +352,24 @@
 	}
 
+	if(stabilization==5){
+		/*SUPG*/
+		topelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+		if(dim==1){
+			vx_input->GetInputAverage(&vx);
+			tau=h/(2.*fabs(vx)+1e-10);
+			for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(dt*ms+dt*vz)*tau*(vx*dbasis[0*numnodes+i]);
+		}
+		else{
+			vx_input->GetInputAverage(&vx);
+			vy_input->GetInputAverage(&vy);
+			tau=h/(2.*pow(vx*vx+vy*vy,0.5)+1e-10);
+			for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(dt*ms+dt*vz)*tau*(vx*dbasis[0*numnodes+i]+vy*dbasis[1*numnodes+i]);
+		}
+	}
+
 	/*Clean up and return*/
 	xDelete<IssmDouble>(xyz_list);
 	xDelete<IssmDouble>(basis);
+	xDelete<IssmDouble>(dbasis);
 	delete gauss;
 	if(topelement->IsSpawnedElement()){topelement->DeleteMaterials(); delete topelement;};
@@ -321,5 +378,5 @@
 }/*}}}*/
 void           FreeSurfaceTopAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
-	   _error_("not implemented yet");
+	_error_("not implemented yet");
 }/*}}}*/
 void           FreeSurfaceTopAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element*  element,int control_type,int control_interp,int control_index){/*{{{*/
@@ -329,4 +386,71 @@
 
 	element->InputUpdateFromSolutionOneDof(solution,SurfaceEnum);
+
+	/*Now, we need to do some "processing"*/
+	int numvertices = element->GetNumberOfVertices();
+	int        migration_style;
+
+	IssmDouble* surface = xNew<IssmDouble>(numvertices);
+	IssmDouble* newsurface = xNew<IssmDouble>(numvertices);
+	IssmDouble* thickness = xNew<IssmDouble>(numvertices);
+	IssmDouble* base = xNew<IssmDouble>(numvertices);
+	IssmDouble* bed = xNew<IssmDouble>(numvertices);
+	IssmDouble* phi = xNew<IssmDouble>(numvertices);
+	IssmDouble* sealevel = xNew<IssmDouble>(numvertices);
+
+	IssmDouble minthickness = element->FindParam(MasstransportMinThicknessEnum);
+	IssmDouble rho_ice      = element->FindParam(MaterialsRhoIceEnum);
+	IssmDouble rho_water    = element->FindParam(MaterialsRhoSeawaterEnum);
+
+	bool isgroundingline;
+	element->FindParam(&isgroundingline,TransientIsgroundinglineEnum);
+	element->FindParam(&migration_style,GroundinglineMigrationEnum);
+	if(isgroundingline) element->GetInputListOnVertices(&bed[0],BedEnum);
+
+	element->GetInputListOnVertices(&base[0],BaseEnum);
+	element->GetInputListOnVertices(&surface[0],SurfaceEnum);
+	element->GetInputListOnVertices(&phi[0],MaskOceanLevelsetEnum);
+	element->GetInputListOnVertices(&sealevel[0],SealevelEnum);
+
+	for(int i=0;i<numvertices;i++){
+		newsurface[i]=surface[i];
+		thickness[i]=surface[i]-base[i];
+		/*Check solution*/
+		if(xIsNan<IssmDouble>(thickness[i])) _error_("NaN found in solution vector");
+		if(xIsInf<IssmDouble>(thickness[i])) _error_("Inf found in solution vector");
+
+		/* check for thickness<minthickness */
+		if(thickness[i]<minthickness){ 
+			thickness[i]=minthickness;
+			if(phi[i]>0.){
+				if(base[i]<=bed[i]) base[i] = bed[i];
+				newsurface[i] = base[i]+minthickness;
+			}else{
+				// assume floatation condition
+				newsurface[i] = (1.-rho_ice/rho_water)*minthickness;
+				base[i] = -rho_ice/rho_water*minthickness;
+			}
+		}
+
+		/* update thickness */
+		thickness[i]=newsurface[i]-base[i];
+		/* some checks */
+		if(thickness[i]<0.) _error_("thickness<0");
+		if(newsurface[i]<base[i]) _error_("surface<base");
+	}
+
+	/* update inputs */
+	element->AddInput(BaseEnum,base,element->GetElementType());
+	element->AddInput(SurfaceEnum,newsurface,element->GetElementType());
+	element->AddInput(ThicknessEnum,thickness,element->GetElementType());
+
+	/* Free resources */
+	xDelete<IssmDouble>(newsurface);
+	xDelete<IssmDouble>(surface);
+	xDelete<IssmDouble>(thickness);
+	xDelete<IssmDouble>(base);
+	xDelete<IssmDouble>(bed);
+	xDelete<IssmDouble>(phi);
+	xDelete<IssmDouble>(sealevel);
 }/*}}}*/
 void           FreeSurfaceTopAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
Index: /issm/trunk/src/c/analyses/HydrologyGlaDSAnalysis.cpp
===================================================================
--- /issm/trunk/src/c/analyses/HydrologyGlaDSAnalysis.cpp	(revision 27034)
+++ /issm/trunk/src/c/analyses/HydrologyGlaDSAnalysis.cpp	(revision 27035)
@@ -472,5 +472,5 @@
 
 	/*Skip if water or ice shelf element*/
-	if(element->IsAllFloating()) return;
+	//if(element->IsAllFloating()) return;
 
 	/*Intermediaries */
@@ -543,4 +543,9 @@
 		if(h_new[iv]<AEPS) h_new[iv] = AEPS;
 	}
+	
+	/*Force floating ice to have zero sheet thickness*/
+	if(element->IsAllFloating()){
+		for(int iv=0;iv<numvertices;iv++) h_new[iv] = 0.;
+	}
 
 	element->AddInput(HydrologySheetThicknessEnum,h_new,P1Enum);
@@ -561,5 +566,5 @@
 
 	/*Skip if water or ice shelf element*/
-	if(element->IsAllFloating()) return;
+	//if(element->IsAllFloating()) return;
 
 	/*Intermediary*/
@@ -604,6 +609,11 @@
 	}
 
+   /*Force floating ice to have zero effective pressure*/
+   if(element->IsAllFloating()){
+		for(int iv=0;iv<numnodes;iv++) N[iv] = 0.;
+	}
+
 	element->AddInput(EffectivePressureEnum,N,element->FiniteElement());
-
+	
 	/*Clean up and return*/
 	delete gauss;
Index: /issm/trunk/src/c/analyses/HydrologyShaktiAnalysis.cpp
===================================================================
--- /issm/trunk/src/c/analyses/HydrologyShaktiAnalysis.cpp	(revision 27034)
+++ /issm/trunk/src/c/analyses/HydrologyShaktiAnalysis.cpp	(revision 27035)
@@ -286,5 +286,5 @@
 	IssmDouble  lr,br,vx,vy,beta,lc;
 	IssmDouble  alpha2,frictionheat;
-   IssmDouble  PMPheat,dpressure_water[2],dbed[2];	
+   IssmDouble  PMPheat,dissipation,dpressure_water[2],dbed[2];	
 	IssmDouble* xyz_list = NULL;
 //        IssmDouble dgapxx; /***/
@@ -381,8 +381,8 @@
    	dpressure_water[0] = rho_water*g*(dh[0] - dbed[0]);
 		dpressure_water[1] = rho_water*g*(dh[1] - dbed[1]);
-		PMPheat=-CT*CW*conductivity*(dh[0]*dpressure_water[0]+dh[1]*dpressure_water[1]);
+		PMPheat=CT*CW*conductivity*rho_water*(dh[0]*dpressure_water[0]+dh[1]*dpressure_water[1]);
+		PMPheat=0; /*** TEST no PMPheat***/
 
    	meltrate = 1/latentheat*(G+frictionheat+rho_water*g*conductivity*(dh[0]*dh[0]+dh[1]*dh[1])-PMPheat);
-		_assert_(meltrate>0.);
 
                   for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*
@@ -549,5 +549,5 @@
 	IssmDouble  alpha2,frictionheat;
 	IssmDouble* xyz_list = NULL;
-   IssmDouble  dpressure_water[2],dbed[2],PMPheat;
+   IssmDouble  dpressure_water[2],dbed[2],PMPheat,dissipation;
 	IssmDouble q = 0.;
    IssmDouble channelization = 0.;
@@ -629,8 +629,15 @@
 	   dpressure_water[0] = rho_water*g*(dh[0] - dbed[0]);
 		dpressure_water[1] = rho_water*g*(dh[1] - dbed[1]);
-		PMPheat=-CT*CW*conductivity*(dh[0]*dpressure_water[0]+dh[1]*dpressure_water[1]);
+		PMPheat=CT*CW*conductivity*rho_water*(dh[0]*dpressure_water[0]+dh[1]*dpressure_water[1]);
+PMPheat=0; /*** TEST no PMPheat***/
+		dissipation=rho_water*g*conductivity*(dh[0]*dh[0]+dh[1]*dh[1]);
 
 		meltrate = 1/latentheat*(G+frictionheat+rho_water*g*conductivity*(dh[0]*dh[0]+dh[1]*dh[1])-PMPheat);
-		_assert_(meltrate>0.);
+
+		element->AddInput(DummyEnum,&meltrate,P0Enum);
+		element->AddInput(EsaEmotionEnum,&frictionheat,P0Enum);
+		element->AddInput(EsaNmotionEnum,&dissipation,P0Enum);
+		element->AddInput(EsaUmotionEnum,&PMPheat,P0Enum);
+
 
 		newgap += gauss->weight*Jdet*(gap+dt*(
@@ -664,6 +671,8 @@
 
 	/*Limit gap height to grow to surface*/
-	if(newgap>thickness)
-	 newgap = thickness;
+//	if(newgap>thickness)
+//	 newgap = thickness;
+	if(newgap>1)
+	 newgap = 1;
 
 	/*Add new gap as an input*/
Index: /issm/trunk/src/c/analyses/HydrologyTwsAnalysis.cpp
===================================================================
--- /issm/trunk/src/c/analyses/HydrologyTwsAnalysis.cpp	(revision 27034)
+++ /issm/trunk/src/c/analyses/HydrologyTwsAnalysis.cpp	(revision 27035)
@@ -44,4 +44,21 @@
 }/*}}}*/
 void HydrologyTwsAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+
+	/*retrieve some parameters: */
+	int    hydrology_model;
+	int    numoutputs;
+	char** requestedoutputs = NULL;
+	iomodel->FindConstant(&hydrology_model,"md.hydrology.model");
+
+	/*Now, do we really want Tws?*/
+	if(hydrology_model!=HydrologyTwsEnum) return;
+
+	parameters->AddObject(new IntParam(HydrologyModelEnum,hydrology_model));
+
+	/*Requested outputs*/
+	iomodel->FindConstant(&requestedoutputs,&numoutputs,"md.hydrology.requested_outputs");
+	parameters->AddObject(new IntParam(HydrologyNumRequestedOutputsEnum,numoutputs));
+	if(numoutputs)parameters->AddObject(new StringArrayParam(HydrologyRequestedOutputsEnum,requestedoutputs,numoutputs));
+	iomodel->DeleteData(&requestedoutputs,numoutputs,"md.hydrology.requested_outputs");
 
 }/*}}}*/
Index: /issm/trunk/src/c/analyses/LevelsetAnalysis.cpp
===================================================================
--- /issm/trunk/src/c/analyses/LevelsetAnalysis.cpp	(revision 27034)
+++ /issm/trunk/src/c/analyses/LevelsetAnalysis.cpp	(revision 27035)
@@ -10,4 +10,5 @@
 #include "../modules/modules.h"
 #include "../solutionsequences/solutionsequences.h"
+#include <math.h>
 
 void LevelsetAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
@@ -79,4 +80,5 @@
 
 	iomodel->FetchDataToInput(inputs,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs,elements,"md.mask.ocean_levelset",MaskOceanLevelsetEnum);
 	iomodel->FetchDataToInput(inputs,elements,"md.initialization.vx",VxEnum);
 	iomodel->FetchDataToInput(inputs,elements,"md.initialization.vy",VyEnum);
@@ -88,4 +90,6 @@
    iomodel->FindConstant(&isstochastic,"md.stochasticforcing.isstochasticforcing");
    switch(calvinglaw){
+
+		/*"Continuous" calving laws*/
       case DefaultCalvingEnum:
          iomodel->FetchDataToInput(inputs,elements,"md.calving.calvingrate",CalvingCalvingrateEnum);
@@ -103,17 +107,33 @@
 			iomodel->FetchDataToInput(inputs,elements,"md.geometry.bed",BedEnum);
 			break;
-		case CalvingMinthicknessEnum:
-			iomodel->FetchDataToInput(inputs,elements,"md.geometry.bed",BedEnum);
-			break;
-		case CalvingHabEnum:
-			iomodel->FetchDataToInput(inputs,elements,"md.calving.flotation_fraction",CalvingHabFractionEnum);
-			break;
-		case CalvingCrevasseDepthEnum:
-			iomodel->FetchDataToInput(inputs,elements,"md.calving.water_height",WaterheightEnum);
-			break;
 		case CalvingDev2Enum:
 			iomodel->FetchDataToInput(inputs,elements,"md.calving.stress_threshold_groundedice",CalvingStressThresholdGroundediceEnum);
 			iomodel->FetchDataToInput(inputs,elements,"md.calving.stress_threshold_floatingice",CalvingStressThresholdFloatingiceEnum);
 			break;
+		case CalvingTestEnum:
+			break;
+		case CalvingParameterizationEnum:
+			iomodel->FetchDataToInput(inputs,elements,"md.calving.stress_threshold_groundedice",CalvingStressThresholdGroundediceEnum);
+			iomodel->FetchDataToInput(inputs,elements,"md.calving.stress_threshold_floatingice",CalvingStressThresholdFloatingiceEnum);
+			iomodel->FetchDataToInput(inputs,elements,"md.geometry.bed",BedEnum);
+			break;
+
+		/*"Discrete" calving laws (need to specify rate as 0 so that we can still solve the level set equation)*/
+		case CalvingMinthicknessEnum:
+			iomodel->FetchDataToInput(inputs,elements,"md.geometry.bed",BedEnum);
+			iomodel->ConstantToInput(inputs,elements,0.,CalvingratexEnum,P1Enum);
+			iomodel->ConstantToInput(inputs,elements,0.,CalvingrateyEnum,P1Enum);
+			break;
+		case CalvingHabEnum:
+			iomodel->FetchDataToInput(inputs,elements,"md.calving.flotation_fraction",CalvingHabFractionEnum);
+			iomodel->ConstantToInput(inputs,elements,0.,CalvingratexEnum,P1Enum);
+			iomodel->ConstantToInput(inputs,elements,0.,CalvingrateyEnum,P1Enum);
+			break;
+		case CalvingCrevasseDepthEnum:
+			iomodel->FetchDataToInput(inputs,elements,"md.calving.water_height",WaterheightEnum);
+			iomodel->ConstantToInput(inputs,elements,0.,CalvingratexEnum,P1Enum);
+			iomodel->ConstantToInput(inputs,elements,0.,CalvingrateyEnum,P1Enum);
+			break;
+
 		default:
 			_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
@@ -126,4 +146,7 @@
 		case FrontalForcingsDefaultEnum:
 			iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.meltingrate",CalvingMeltingrateEnum);
+			if (calvinglaw == CalvingParameterizationEnum) {
+				iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.ablationrate",CalvingAblationrateEnum);
+			}
 			break;
 		case FrontalForcingsRignotEnum:
@@ -148,4 +171,9 @@
 
 	int  calvinglaw;
+   IssmDouble *transparam = NULL;
+   IssmDouble  yts;
+   int         N,M;
+   bool        interp,cycle;
+
 	iomodel->FindConstant(&calvinglaw,"md.calving.law");
 	switch(calvinglaw){
@@ -168,4 +196,36 @@
 			parameters->AddObject(iomodel->CopyConstantObject("md.calving.height_above_floatation",CalvingHeightAboveFloatationEnum));
 			break;
+		case CalvingTestEnum:
+			iomodel->FindConstant(&interp,"md.timestepping.interp_forcing");
+			iomodel->FindConstant(&cycle,"md.timestepping.cycle_forcing");
+			iomodel->FetchData(&transparam,&N,&M,"md.calving.speedfactor");
+			if(N==1){
+				_assert_(M==1);
+				parameters->AddObject(new DoubleParam(CalvingTestSpeedfactorEnum,transparam[0]));
+         }
+         else{
+            _assert_(N==2);
+            parameters->AddObject(new TransientParam(CalvingTestSpeedfactorEnum,&transparam[0],&transparam[M],interp,cycle,M));
+         }
+			xDelete<IssmDouble>(transparam);
+			iomodel->FetchData(&transparam,&N,&M,"md.calving.independentrate");
+			if(N==1){
+				_assert_(M==1);
+				parameters->AddObject(new DoubleParam(CalvingTestIndependentRateEnum,transparam[0]));
+         }
+         else{
+            _assert_(N==2);
+            parameters->AddObject(new TransientParam(CalvingTestIndependentRateEnum,&transparam[0],&transparam[M],interp,cycle,M));
+         }
+			xDelete<IssmDouble>(transparam);
+			break;
+		case CalvingParameterizationEnum:
+			parameters->AddObject(iomodel->CopyConstantObject("md.calving.min_thickness",CalvingMinthicknessEnum));
+			parameters->AddObject(iomodel->CopyConstantObject("md.calving.use_param",CalvingUseParamEnum));
+			parameters->AddObject(iomodel->CopyConstantObject("md.calving.scale_theta",CalvingScaleThetaEnum));
+			parameters->AddObject(iomodel->CopyConstantObject("md.calving.amp_alpha",CalvingAmpAlphaEnum));
+			parameters->AddObject(iomodel->CopyConstantObject("md.calving.midp",CalvingMidpointEnum));
+			parameters->AddObject(iomodel->CopyConstantObject("md.calving.nonlinearlaw",CalvingNonlinearLawEnum));
+			break;
 		default:
 			_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
@@ -175,6 +235,4 @@
 	int melt_parameterization;
 	iomodel->FindConstant(&melt_parameterization,"md.frontalforcings.parameterization");
-	int M,N;
-	IssmDouble* transparam = NULL;
 	switch(melt_parameterization){
 		case FrontalForcingsDefaultEnum:
@@ -209,6 +267,4 @@
 	/*parameters: */
 	int  stabilization;
-	bool save_results;
-	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
 	femmodel->parameters->FindParam(&stabilization,LevelsetStabilizationEnum);
 
@@ -222,9 +278,4 @@
 	else{
 		solutionsequence_linear(femmodel);
-	}
-
-	if(save_results){
-		int outputs[1] = {MaskIceLevelsetEnum};
-		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],1);
 	}
 }/*}}}*/
@@ -400,4 +451,71 @@
 				break;
 			}
+			case 6:{
+				/*SUPG*/
+				IssmDouble vx,vy;
+				mf_vx_input->GetInputAverage(&vx);
+				mf_vy_input->GetInputAverage(&vy);
+				vel=sqrt(vx*vx+vy*vy)+1.e-8;
+				IssmDouble ECN, K;
+				ECN = vel *dt /h;
+				K = 1./tanh(ECN) - 1./ECN;
+//				if (ECN<1e-6) K = ECN /3.0;
+
+				/*According to Hilmar, xi=K is too large*/
+				IssmDouble xi=0.1*K;
+
+				IssmDouble  tau=xi*h/(2*vel);
+				Input* levelset_input = NULL;
+
+
+				IssmDouble kappa;
+				IssmDouble p=4, q=4;
+				IssmDouble phi[3];
+
+			   levelset_input=basalelement->GetInput(MaskIceLevelsetEnum); _assert_(levelset_input);
+				levelset_input->GetInputValue(&phi[0], gauss);
+
+				IssmDouble dphidx=0., dphidy=0.;
+				IssmDouble nphi;
+
+				for(int i=0;i<numnodes;i++){
+					dphidx += phi[i]*dbasis[0*numnodes+i];
+					dphidy += phi[i]*dbasis[1*numnodes+i];
+				}
+				nphi = sqrt(dphidx*dphidx+dphidy*dphidy);
+			
+				if (nphi >= 1) {
+					kappa = 1 - 1.0/nphi;
+				}
+				else {
+					kappa = 0.5/M_PI *sin(2*M_PI*nphi)/nphi;
+				}
+
+				kappa = kappa * vel / h;
+
+				/*Mass matrix - part 2*/
+				for(int i=0;i<numnodes;i++){
+					for(int j=0;j<numnodes;j++){
+						Ke->values[i*numnodes+j]+=gauss->weight*Jdet*tau*basis[j]*(vx*dbasis[0*numnodes+i]+vy*dbasis[1*numnodes+i]);
+					}
+				}
+
+				/*Advection matrix - part 2, A*/
+				for(int i=0;i<numnodes;i++){
+					for(int j=0;j<numnodes;j++){
+						Ke->values[i*numnodes+j]+=dt*gauss->weight*Jdet*tau*(vx*dbasis[0*numnodes+j]+vy*dbasis[1*numnodes+j])*(vx*dbasis[0*numnodes+i]+vy*dbasis[1*numnodes+i]);
+					}
+				}
+				/*Add the pertubation term \nabla\cdot(\kappa*\nabla\phi)*/
+				for(int i=0;i<numnodes;i++){
+					for(int j=0;j<numnodes;j++){
+						for(int k=0;k<dim;k++){
+								Ke->values[i*numnodes+j]+= dt*gauss->weight*Jdet*kappa*dbasis[k*numnodes+j]*dbasis[k*numnodes+i];
+						}
+					}
+				}
+
+				break;
+			}
 			default:
 				_error_("unknown type of stabilization in LevelsetAnalysis.cpp");
@@ -435,5 +553,5 @@
 	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
 	IssmDouble*    dbasis = NULL;
-	if(stabilization==5) dbasis= xNew<IssmDouble>(2*numnodes);
+	if((stabilization==5) |(stabilization == 6)) dbasis= xNew<IssmDouble>(2*numnodes);
 
 	/*Retrieve all inputs and parameters*/
@@ -456,5 +574,5 @@
 
 		if(stabilization==5){ /*SUPG*/
-         IssmDouble vx,vy,vel;
+			IssmDouble vx,vy,vel;
 			basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
 			mf_vx_input->GetInputAverage(&vx);
@@ -469,4 +587,26 @@
 			}
 		}
+		else if (stabilization ==6) {
+			IssmDouble vx,vy,vel;
+			basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+			mf_vx_input->GetInputAverage(&vx);
+			mf_vy_input->GetInputAverage(&vy);
+			vel=sqrt(vx*vx+vy*vy)+1.e-8;
+
+			IssmDouble ECN, K;
+			ECN = vel *dt /h;
+			K = 1./tanh(ECN) - 1./ECN;
+	//		if (ECN<1e-6) K = ECN /3.0;
+
+			/*According to Hilmar, xi=K is too large*/
+			IssmDouble xi=0.1*K;
+
+			IssmDouble  tau=xi*h/(2*vel);
+
+			/*Force vector - part 2*/
+			for(int i=0;i<numnodes;i++){
+				pe->values[i]+=Jdet*gauss->weight*lsf*tau*(vx*dbasis[0*numnodes+i]+vy*dbasis[1*numnodes+i]);
+			}
+		}
 	}
 
@@ -474,5 +614,5 @@
 	xDelete<IssmDouble>(xyz_list);
 	xDelete<IssmDouble>(basis);
-   xDelete<IssmDouble>(dbasis);
+	xDelete<IssmDouble>(dbasis);
 	basalelement->FindParam(&domaintype,DomainTypeEnum);
 	if(basalelement->IsSpawnedElement()){basalelement->DeleteMaterials(); delete basalelement;};
@@ -525,4 +665,66 @@
 	}
 }/*}}}*/
+void           LevelsetAnalysis::PostProcess(FemModel* femmodel){/*{{{*/
+
+	/*This function is only used by "discrete calving laws" for which we change
+	 * the value of the levelset after the advection step (level set equation
+	 * solve) based on the law*/
+
+	/*Intermediaries*/
+	int  calvinglaw;
+	IssmDouble newlevelset[6];
+	femmodel->parameters->FindParam(&calvinglaw,CalvingLawEnum);
+
+	/*Apply minimum thickness criterion*/
+	if(calvinglaw==CalvingMinthicknessEnum || calvinglaw==CalvingVonmisesEnum || calvinglaw==CalvingParameterizationEnum){
+
+		IssmDouble mig_max = femmodel->parameters->FindParam(MigrationMaxEnum);
+		IssmDouble dt      = femmodel->parameters->FindParam(TimesteppingTimeStepEnum);
+
+		/*Get current distance to terminus*/
+		InputDuplicatex(femmodel,MaskIceLevelsetEnum,DistanceToCalvingfrontEnum);
+		femmodel->DistanceToFieldValue(MaskIceLevelsetEnum,0,DistanceToCalvingfrontEnum);
+
+		/*Intermediaries*/
+		IssmDouble thickness,bed,sealevel,distance,levelset;
+		IssmDouble min_thickness = femmodel->parameters->FindParam(CalvingMinthicknessEnum);
+
+		/*Loop over all elements of this partition*/
+		for(Object* & object : femmodel->elements->objects){
+			Element* element  = xDynamicCast<Element*>(object);
+
+			/*no need to postprocess an ice free element*/
+			if(!element->IsIceInElement()) continue;
+
+			int      numnodes     = element->GetNumberOfNodes(); _assert_(numnodes<7);
+			Gauss*   gauss        = element->NewGauss();
+			Input *H_input        = element->GetInput(ThicknessEnum);              _assert_(H_input);
+			Input *b_input        = element->GetInput(BedEnum);                    _assert_(b_input);
+			Input *sl_input       = element->GetInput(SealevelEnum);               _assert_(sl_input);
+			Input *dis_input      = element->GetInput(DistanceToCalvingfrontEnum); _assert_(dis_input);
+			Input *levelset_input = element->GetInput(MaskIceLevelsetEnum);        _assert_(levelset_input);
+
+			/*Potentially constrain nodes of this element*/
+			for(int in=0;in<numnodes;in++){
+				gauss->GaussNode(element->GetElementType(),in);
+
+				levelset_input->GetInputValue(&levelset,gauss);
+				H_input->GetInputValue(&thickness,gauss);
+				b_input->GetInputValue(&bed,gauss);
+				sl_input->GetInputValue(&sealevel,gauss);
+				dis_input->GetInputValue(&distance,gauss);
+
+				if(thickness<min_thickness && bed<sealevel && fabs(distance)<mig_max*dt && levelset<0){
+					newlevelset[in] = +400.; //Arbitrary > 0 number (i.e. deactivate this node)
+				}
+				else{
+					newlevelset[in] = levelset;
+				}
+			}
+			element->AddInput(MaskIceLevelsetEnum,&newlevelset[0],element->GetElementType());
+			delete gauss;
+		}
+	}
+}/*}}}*/
 void           LevelsetAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
 
@@ -530,10 +732,15 @@
 	int  calvinglaw;
 	femmodel->parameters->FindParam(&calvinglaw,CalvingLawEnum);
-
-	if(calvinglaw==CalvingMinthicknessEnum || calvinglaw==CalvingVonmisesEnum){
+	IssmDouble mig_max = femmodel->parameters->FindParam(MigrationMaxEnum);
+	IssmDouble dt      = femmodel->parameters->FindParam(TimesteppingTimeStepEnum);
+
+   /*Get current distance to terminus*/
+   InputDuplicatex(femmodel,MaskIceLevelsetEnum,DistanceToCalvingfrontEnum);
+   femmodel->DistanceToFieldValue(MaskIceLevelsetEnum,0,DistanceToCalvingfrontEnum);
+
+   if(calvinglaw==CalvingHabEnum){
 
 		/*Intermediaries*/
-		IssmDouble thickness,bed,sealevel;
-		IssmDouble min_thickness = femmodel->parameters->FindParam(CalvingMinthicknessEnum);
+		IssmDouble  thickness,water_depth,distance,hab_fraction;
 
 		/*Loop over all elements of this partition*/
@@ -541,9 +748,13 @@
 			Element* element  = xDynamicCast<Element*>(object);
 
-			int      numnodes = element->GetNumberOfNodes();
-			Gauss*   gauss    = element->NewGauss();
-			Input*   H_input  = element->GetInput(ThicknessEnum); _assert_(H_input);
-			Input*   b_input = element->GetInput(BedEnum); _assert_(b_input);
-			Input*   sl_input = element->GetInput(SealevelEnum); _assert_(sl_input);
+			IssmDouble rho_ice   = element->FindParam(MaterialsRhoIceEnum);
+			IssmDouble rho_water = element->FindParam(MaterialsRhoSeawaterEnum);
+
+			int      numnodes           = element->GetNumberOfNodes();
+			Gauss*   gauss              = element->NewGauss();
+			Input*   H_input            = element->GetInput(ThicknessEnum); _assert_(H_input);
+			Input*   bed_input          = element->GetInput(BedEnum); _assert_(bed_input);
+			Input*   hab_fraction_input = element->GetInput(CalvingHabFractionEnum); _assert_(hab_fraction_input);
+			Input*   dis_input           = element->GetInput(DistanceToCalvingfrontEnum); _assert_(dis_input);
 
 			/*Potentially constrain nodes of this element*/
@@ -554,52 +765,9 @@
 
 				H_input->GetInputValue(&thickness,gauss);
-				b_input->GetInputValue(&bed,gauss);
-				sl_input->GetInputValue(&sealevel,gauss);
-				if(thickness<min_thickness && bed<sealevel){
-					node->ApplyConstraint(0,+1.);
-				}
-				else {
-					/* no ice, set no spc */
-					node->DofInFSet(0);
-				}
-			}
-			delete gauss;
-		}
-	}
-   else if(calvinglaw==CalvingHabEnum){
-
-		/*Intermediaries*/
-		IssmDouble  thickness,water_depth,levelset,hab_fraction;
-
-		/*Get the fraction of the flotation thickness at the terminus*/
-		InputDuplicatex(femmodel,MaskIceLevelsetEnum,DistanceToCalvingfrontEnum);
-		femmodel->DistanceToFieldValue(MaskIceLevelsetEnum,0,DistanceToCalvingfrontEnum);
-
-		/*Loop over all elements of this partition*/
-		for(Object* & object : femmodel->elements->objects){
-			Element* element  = xDynamicCast<Element*>(object);
-
-			IssmDouble rho_ice   = element->FindParam(MaterialsRhoIceEnum);
-			IssmDouble rho_water = element->FindParam(MaterialsRhoSeawaterEnum);
-
-			int      numnodes           = element->GetNumberOfNodes();
-			Gauss*   gauss              = element->NewGauss();
-			Input*   H_input            = element->GetInput(ThicknessEnum); _assert_(H_input);
-			Input*   bed_input          = element->GetInput(BedEnum); _assert_(bed_input);
-			Input*   hab_fraction_input = element->GetInput(CalvingHabFractionEnum); _assert_(hab_fraction_input);
-			Input*   ls_input           = element->GetInput(DistanceToCalvingfrontEnum); _assert_(ls_input);
-
-			/*Potentially constrain nodes of this element*/
-			for(int in=0;in<numnodes;in++){
-				gauss->GaussNode(element->GetElementType(),in);
-				Node* node=element->GetNode(in);
-				if(!node->IsActive()) continue;
-
-				H_input->GetInputValue(&thickness,gauss);
 				bed_input->GetInputValue(&water_depth,gauss);
-				ls_input->GetInputValue(&levelset,gauss);
+				dis_input->GetInputValue(&distance,gauss);
 				hab_fraction_input->GetInputValue(&hab_fraction,gauss);
 
-				if(thickness<((rho_water/rho_ice)*(1+hab_fraction)*-water_depth) && levelset>-300. && levelset<0.){
+				if(thickness<((rho_water/rho_ice)*(1+hab_fraction)*-water_depth) && fabs(distance)<mig_max*dt){
 					node->ApplyConstraint(0,+1.);
 				}
@@ -628,6 +796,5 @@
 
 		IssmDouble crevasse_threshold = femmodel->parameters->FindParam(CalvingCrevasseThresholdEnum);
-		IssmDouble mig_max            = femmodel->parameters->FindParam(MigrationMaxEnum);
-		IssmDouble dt                 = femmodel->parameters->FindParam(TimesteppingTimeStepEnum);
+
 
 		for(Object* & object : femmodel->elements->objects){
@@ -704,4 +871,5 @@
 						surface_input->GetInputValue(&surface,gauss);
 
+                  /*FIXME: not sure about levelset<0. && fabs(levelset)>-mig_max*dt! SHould maybe be distance<mig_max*dt*/
                   if((surface_crevasse>surface || crevassedepth>crevasse_threshold*thickness) && bed<0. && levelset<0. && levelset>-mig_max*dt && constraint_nodes[node->Lid()]==0.){
 							local_nflipped++;
Index: /issm/trunk/src/c/analyses/LevelsetAnalysis.h
===================================================================
--- /issm/trunk/src/c/analyses/LevelsetAnalysis.h	(revision 27034)
+++ /issm/trunk/src/c/analyses/LevelsetAnalysis.h	(revision 27035)
@@ -32,4 +32,7 @@
 		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
 		void           UpdateConstraints(FemModel* femmodel);
+
+		/*Specific methods to LevelsetAnalysis*/
+		void  PostProcess(FemModel* femmodel);
 };
 #endif
Index: /issm/trunk/src/c/analyses/LoveAnalysis.cpp
===================================================================
--- /issm/trunk/src/c/analyses/LoveAnalysis.cpp	(revision 27034)
+++ /issm/trunk/src/c/analyses/LoveAnalysis.cpp	(revision 27035)
@@ -33,6 +33,8 @@
 	parameters->AddObject(iomodel->CopyConstantObject("md.love.mu0",LoveMu0Enum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.love.Gravitational_Constant",LoveGravitationalConstantEnum));
+	parameters->AddObject(iomodel->CopyConstantObject("md.love.chandler_wobble",LoveChandlerWobbleEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.love.allow_layer_deletion",LoveAllowLayerDeletionEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.love.underflow_tol",LoveUnderflowTolEnum));
+	parameters->AddObject(iomodel->CopyConstantObject("md.love.pw_threshold",LovePostWidderThresholdEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.love.integration_steps_per_layer",LoveIntStepsPerLayerEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.love.istemporal",LoveIsTemporalEnum));
@@ -43,4 +45,8 @@
 	parameters->AddObject(iomodel->CopyConstantObject("md.love.core_mantle_boundary",LoveCoreMantleBoundaryEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.love.complex_computation",LoveComplexComputationEnum));
+	parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.rotational.equatorialmoi",RotationalEquatorialMoiEnum));
+	parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.rotational.polarmoi",RotationalPolarMoiEnum));
+	parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.rotational.angularvelocity",RotationalAngularVelocityEnum));
+	parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.lovenumbers.tk2secular",TidalLoveK2SecularEnum));
 }/*}}}*/
 void LoveAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
Index: /issm/trunk/src/c/analyses/MasstransportAnalysis.cpp
===================================================================
--- /issm/trunk/src/c/analyses/MasstransportAnalysis.cpp	(revision 27034)
+++ /issm/trunk/src/c/analyses/MasstransportAnalysis.cpp	(revision 27035)
@@ -182,7 +182,13 @@
 			break;
 		case SpatialLinearFloatingMeltRateEnum:
-			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_melting_rate",BasalforcingsDeepwaterMeltingRateEnum);
-			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_elevation",BasalforcingsDeepwaterElevationEnum);
-			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.upperwater_elevation",BasalforcingsUpperwaterElevationEnum);
+			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_melting_rate",BasalforcingsSpatialDeepwaterMeltingRateEnum);
+			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_elevation",BasalforcingsSpatialDeepwaterElevationEnum);
+			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.upperwater_melting_rate",BasalforcingsSpatialUpperwaterMeltingRateEnum);
+			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.upperwater_elevation",BasalforcingsSpatialUpperwaterElevationEnum);
+			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.perturbation_melting_rate",BasalforcingsPerturbationMeltingRateEnum,0.);
+			if(isstochastic){
+            iomodel->FetchDataToInput(inputs,elements,"md.stochasticforcing.default_id",StochasticForcingDefaultIdEnum);
+            iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_melting_rate",BaselineBasalforcingsSpatialDeepwaterMeltingRateEnum);
+         }
 			break;
 		case BasalforcingsPicoEnum:
@@ -212,4 +218,8 @@
 			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_salinity",BasalforcingsOceanSalinityEnum);
 			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_temp",BasalforcingsOceanTempEnum);
+			break;
+		case AutoregressionLinearFloatingMeltRateEnum:
+			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.basin_id",BasalforcingsLinearBasinIdEnum);
+			if(isstochastic) iomodel->FetchDataToInput(inputs,elements,"md.stochasticforcing.default_id",StochasticForcingDefaultIdEnum);
 			break;
 		default:
Index: /issm/trunk/src/c/analyses/SamplingAnalysis.cpp
===================================================================
--- /issm/trunk/src/c/analyses/SamplingAnalysis.cpp	(revision 27034)
+++ /issm/trunk/src/c/analyses/SamplingAnalysis.cpp	(revision 27035)
@@ -76,5 +76,8 @@
   iomodel->FetchDataToInput(inputs,elements,"md.sampling.kappa",SamplingKappaEnum);
 	iomodel->FetchDataToInput(inputs,elements,"md.sampling.beta",SamplingBetaEnum,0.);
+	iomodel->FetchDataToInput(inputs,elements,"md.sampling.tau",SamplingTauEnum);
 	iomodel->FetchDataToInput(inputs,elements,"md.initialization.sample",SampleEnum,0.);
+	iomodel->FetchDataToInput(inputs,elements,"md.initialization.sample",SampleNoiseEnum,0.);
+	if(iomodel->solution_enum==TransientSolutionEnum) iomodel->FetchDataToInput(inputs,elements,"md.sampling.phi",SamplingPhiEnum,0.);
 
 }/*}}}*/
@@ -84,8 +87,6 @@
 	char**  requestedoutputs = NULL;
 
-	parameters->AddObject(iomodel->CopyConstantObject("md.sampling.tau",SamplingTauEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.sampling.alpha",SamplingAlphaEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.sampling.robin",SamplingRobinEnum));
-	if(solution_enum==TransientSolutionEnum) parameters->AddObject(iomodel->CopyConstantObject("md.sampling.phi",SamplingPhiEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.sampling.seed",SamplingSeedEnum));
 
@@ -273,8 +274,11 @@
     element->GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum);
     IssmDouble* newsample = xNew<IssmDouble>(numnodes);
+		IssmDouble* tau = xNew<IssmDouble>(numnodes);
+		element->GetInputListOnNodes(&tau[0],SamplingTauEnum);
 
     /*Use the dof list to index into the solution vector: */
     for(int i=0;i<numnodes;i++){
-			newsample[i]=solution[doflist[i]];
+			newsample[i]=solution[doflist[i]] / tau[i]; // new
+
 			/*Check solution*/
 			if(xIsNan<IssmDouble>(newsample[i])) _error_("NaN found in solution vector");
@@ -287,4 +291,5 @@
     /*Free ressources:*/
     xDelete<IssmDouble>(newsample);
+		xDelete<IssmDouble>(tau);
     xDelete<int>(doflist);
  }/*}}}*/
@@ -418,2 +423,48 @@
 	*pMff=Mff;
 }/*}}}*/
+void 						SamplingAnalysis::UpdateTransientSample(FemModel *	femmodel){
+
+	for(int j=0;j<femmodel->elements->Size();j++){
+			Element* element=(Element*)femmodel->elements->GetObjectByOffset(j);
+			UpdateTransientSample(element);
+	 }
+
+}
+void 						SamplingAnalysis::UpdateTransientSample(Element *  	element){
+
+	/*Intermediaries */
+	IssmDouble phi, sample, noise;
+
+	/*Fetch number vertices for this element*/
+	int numvertices = element->GetNumberOfVertices();
+
+	/*Initialize new sample*/
+	IssmDouble* sample_new = xNew<IssmDouble>(numvertices);
+
+	/*Retrieve all inputs and parameters*/
+	Input*	sample_input=element->GetInput(SampleOldEnum); _assert_(sample_input);
+	Input*	noise_input=element->GetInput(SampleNoiseEnum); _assert_(noise_input);
+	Input*	phi_input=element->GetInput(SamplingPhiEnum); _assert_(phi_input);
+
+	/* Start  looping on the number of gaussian points: */
+	Gauss* gauss=element->NewGauss();
+  for(int iv=0;iv<numvertices;iv++){
+  	gauss->GaussVertex(iv);
+
+		/*Get input values at gauss points*/
+		sample_input->GetInputValue(&sample,gauss);
+		noise_input->GetInputValue(&noise,gauss);
+		phi_input->GetInputValue(&phi,gauss);
+
+		/*Get new sample*/
+		sample_new[iv] = phi*sample + noise;
+
+  }
+
+  element->AddInput(SampleEnum,sample_new,element->GetElementType());
+
+  /*Clean up and return*/
+  xDelete<IssmDouble>(sample_new);
+  delete gauss;
+
+}
Index: /issm/trunk/src/c/analyses/SamplingAnalysis.h
===================================================================
--- /issm/trunk/src/c/analyses/SamplingAnalysis.h	(revision 27034)
+++ /issm/trunk/src/c/analyses/SamplingAnalysis.h	(revision 27035)
@@ -40,4 +40,7 @@
 		void           MassMatrix(Matrix<IssmDouble>** pMff,FemModel* femmodel);
 
+		void 					UpdateTransientSample(FemModel* femmodel);
+		void 					UpdateTransientSample(Element *  	element);
+
 };
 #endif
Index: /issm/trunk/src/c/analyses/SealevelchangeAnalysis.cpp
===================================================================
--- /issm/trunk/src/c/analyses/SealevelchangeAnalysis.cpp	(revision 27034)
+++ /issm/trunk/src/c/analyses/SealevelchangeAnalysis.cpp	(revision 27035)
@@ -85,4 +85,6 @@
 	IssmDouble* love_tk=NULL;
 	IssmDouble* love_tl=NULL;
+	IssmDouble* love_pmtf_colinear=NULL;
+	IssmDouble* love_pmtf_ortho=NULL;
 	IssmDouble* love_timefreq=NULL;
 	bool        love_istime=true;
@@ -101,4 +103,11 @@
 	IssmDouble* H_viscoelastic_interpolated= NULL;
 	IssmDouble* H_viscoelastic_local = NULL;
+	IssmDouble* Pmtf_col_interpolated = NULL;
+	IssmDouble* Pmtf_ortho_interpolated = NULL;
+	IssmDouble* Pmtf_z_interpolated = NULL;
+	IssmDouble* Love_th2_interpolated = NULL;
+	IssmDouble* Love_tk2_interpolated = NULL;
+	IssmDouble* Love_tl2_interpolated = NULL;
+
 	int         M,m,lower_row,upper_row;
 	IssmDouble  degacc=.01;
@@ -166,5 +175,5 @@
 	/*compute planet area and plug into parameters:*/
 	iomodel->FetchData(&planetradius,"md.solidearth.planetradius");
-	planetarea=4*PI*planetradius*planetradius;
+	planetarea=4*M_PI*planetradius*planetradius;
 	parameters->AddObject(new DoubleParam(SolidearthPlanetAreaEnum,planetarea));
 
@@ -253,7 +262,4 @@
 			iomodel->FetchData(&love_k,&ndeg,&precomputednt,"md.solidearth.lovenumbers.k");
 			iomodel->FetchData(&love_l,&ndeg,&precomputednt,"md.solidearth.lovenumbers.l");
-			iomodel->FetchData(&love_th,&ndeg,&precomputednt,"md.solidearth.lovenumbers.th");
-			iomodel->FetchData(&love_tk,&ndeg,&precomputednt,"md.solidearth.lovenumbers.tk");
-			iomodel->FetchData(&love_tl,&ndeg,&precomputednt,"md.solidearth.lovenumbers.tl");
 
 			parameters->AddObject(new DoubleParam(SolidearthSettingsTimeAccEnum,timeacc));
@@ -261,7 +267,19 @@
 			parameters->AddObject(new DoubleMatParam(LoadLoveKEnum,love_k,ndeg,precomputednt));
 			parameters->AddObject(new DoubleMatParam(LoadLoveLEnum,love_l,ndeg,precomputednt));
-			parameters->AddObject(new DoubleMatParam(TidalLoveHEnum,love_th,ndeg,precomputednt));
-			parameters->AddObject(new DoubleMatParam(TidalLoveKEnum,love_tk,ndeg,precomputednt));
-			parameters->AddObject(new DoubleMatParam(TidalLoveLEnum,love_tl,ndeg,precomputednt));
+
+			if (rotation){
+				iomodel->FetchData(&love_th,&ndeg,&precomputednt,"md.solidearth.lovenumbers.th");
+				iomodel->FetchData(&love_tk,&ndeg,&precomputednt,"md.solidearth.lovenumbers.tk");
+				iomodel->FetchData(&love_tl,&ndeg,&precomputednt,"md.solidearth.lovenumbers.tl");
+				iomodel->FetchData(&love_pmtf_colinear,&dummy,&precomputednt,"md.solidearth.lovenumbers.pmtf_colinear");
+				iomodel->FetchData(&love_pmtf_ortho,&dummy,&precomputednt,"md.solidearth.lovenumbers.pmtf_ortho");
+
+				parameters->AddObject(new DoubleMatParam(LovePolarMotionTransferFunctionColinearEnum,love_pmtf_colinear,1,precomputednt));
+				parameters->AddObject(new DoubleMatParam(LovePolarMotionTransferFunctionOrthogonalEnum,love_pmtf_ortho,1,precomputednt));
+				parameters->AddObject(new DoubleMatParam(TidalLoveHEnum,love_th,ndeg,precomputednt));
+				parameters->AddObject(new DoubleMatParam(TidalLoveKEnum,love_tk,ndeg,precomputednt));
+				parameters->AddObject(new DoubleMatParam(TidalLoveLEnum,love_tl,ndeg,precomputednt));
+			}
+
 			parameters->AddObject(new DoubleMatParam(LoveTimeFreqEnum,love_timefreq,precomputednt,1));
 			parameters->AddObject(new BoolParam(LoveIsTimeEnum,love_istime));
@@ -283,4 +301,10 @@
 				parameters->AddObject(new IntParam(SealevelchangeViscousIndexEnum,0));
 				xDelete<IssmDouble>(viscoustimes);
+				if (rotation){
+					IssmDouble* viscouspolarmotion=NULL;
+					viscouspolarmotion=xNewZeroInit<IssmDouble>(3*nt);
+					parameters->AddObject(new DoubleMatParam(SealevelchangeViscousPolarMotionEnum,viscouspolarmotion,3,nt));
+					xDelete<IssmDouble>(viscouspolarmotion);
+				}
 			}
 			else {
@@ -307,9 +331,8 @@
 		}
 
-		if(rotation)parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.lovenumbers.tk2secular",TidalLoveK2SecularEnum));
-
+		if(rotation) parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.lovenumbers.tk2secular",TidalLoveK2SecularEnum));
 		if(selfattraction){
 
-			/*compute combined legendre + love number (elastic green function:*/
+			/*compute combined legendre + love number (elastic green function):*/
 			m=DetermineLocalSize(M,IssmComm::GetComm());
 			GetOwnershipBoundariesFromRange(&lower_row,&upper_row,m,IssmComm::GetComm());
@@ -441,8 +464,24 @@
 				U_viscoelastic_interpolated=xNew<IssmDouble>(M*nt,"t");
 				if(horiz)H_viscoelastic_interpolated=xNew<IssmDouble>(M*nt,"t");
+				if(rotation){
+					Pmtf_col_interpolated=xNew<IssmDouble>(nt,"t");
+					Pmtf_ortho_interpolated=xNew<IssmDouble>(nt,"t");
+					Pmtf_z_interpolated=xNew<IssmDouble>(nt,"t");
+					Love_tk2_interpolated=xNew<IssmDouble>(nt,"t");
+					Love_th2_interpolated=xNew<IssmDouble>(nt,"t");
+					if (horiz) Love_tl2_interpolated=xNew<IssmDouble>(nt,"t");
+				}
 #else
 				G_viscoelastic_interpolated=xNew<IssmDouble>(M*nt);
 				U_viscoelastic_interpolated=xNew<IssmDouble>(M*nt);
 				if(horiz)H_viscoelastic_interpolated=xNew<IssmDouble>(M*nt);
+				if(rotation){
+					Pmtf_col_interpolated=xNew<IssmDouble>(nt);
+					Pmtf_ortho_interpolated=xNew<IssmDouble>(nt);
+					Pmtf_z_interpolated=xNew<IssmDouble>(nt);
+					Love_tk2_interpolated=xNew<IssmDouble>(nt);
+					Love_th2_interpolated=xNew<IssmDouble>(nt);
+					if (horiz) Love_tl2_interpolated=xNew<IssmDouble>(nt);
+				}
 #endif
 
@@ -477,4 +516,14 @@
 						if(horiz)H_viscoelastic_interpolated[timeindex]=(1-lincoeff)*H_viscoelastic[timepreindex]+lincoeff*H_viscoelastic[timepreindex+1];
 					}
+
+					if(rotation){
+						int timepreindex= 2*precomputednt+timeindex2;
+						Pmtf_col_interpolated[t]=(1.0-lincoeff)*love_pmtf_colinear[timeindex2]+lincoeff*love_pmtf_colinear[timeindex2+1];
+						Pmtf_ortho_interpolated[t]=(1.0-lincoeff)*love_pmtf_ortho[timeindex2]+lincoeff*love_pmtf_ortho[timeindex2+1];
+						Pmtf_z_interpolated[t]=1.0+(1.0-lincoeff)*love_k[timepreindex]+lincoeff*love_k[timepreindex+1];
+						Love_tk2_interpolated[t]=(1.0-lincoeff)*love_tk[timepreindex]+lincoeff*love_tk[timepreindex+1];
+						Love_th2_interpolated[t]=(1.0-lincoeff)*love_th[timepreindex]+lincoeff*love_th[timepreindex+1];
+						if (horiz) Love_tl2_interpolated[t]=(1.0-lincoeff)*love_tl[timepreindex]+lincoeff*love_tl[timepreindex+1];
+					}
 				}
 
@@ -491,4 +540,29 @@
 				if(horiz)H_viscoelastic_interpolated=H_viscoelastic;
 #endif
+
+				if(rotation){ //if this cpu handles degree 2
+#ifdef _HAVE_AD_
+					Pmtf_col_interpolated=xNew<IssmDouble>(1,"t");
+					Pmtf_ortho_interpolated=xNew<IssmDouble>(1,"t");
+					Pmtf_z_interpolated=xNew<IssmDouble>(1,"t");
+					Love_tk2_interpolated=xNew<IssmDouble>(1,"t");
+					Love_th2_interpolated=xNew<IssmDouble>(1,"t");
+					if (horiz) Love_tl2_interpolated=xNew<IssmDouble>(1,"t");
+#else
+					Pmtf_col_interpolated=xNew<IssmDouble>(1);
+					Pmtf_ortho_interpolated=xNew<IssmDouble>(1);
+					Pmtf_z_interpolated=xNew<IssmDouble>(1);
+					Love_tk2_interpolated=xNew<IssmDouble>(1);
+					Love_th2_interpolated=xNew<IssmDouble>(1);
+					if (horiz) Love_tl2_interpolated=xNew<IssmDouble>(1);
+#endif
+
+					Pmtf_col_interpolated=love_pmtf_colinear;
+					Pmtf_ortho_interpolated=love_pmtf_ortho;
+					Pmtf_z_interpolated[0]=1.0+love_k[2];
+					Love_tk2_interpolated[0]=love_tk[2];
+					Love_th2_interpolated[0]=love_th[2];
+					if (horiz) Love_tl2_interpolated[0]=love_tl[2];
+				}
 			}	
 
@@ -499,4 +573,12 @@
 				parameters->AddObject(new DoubleVecParam(SealevelchangeUViscoElasticEnum,U_viscoelastic_interpolated,M*nt));
 				if(horiz)parameters->AddObject(new DoubleVecParam(SealevelchangeHViscoElasticEnum,H_viscoelastic_interpolated,M*nt));
+				if(rotation){
+					parameters->AddObject(new DoubleVecParam(SealevelchangePolarMotionTransferFunctionColinearEnum,Pmtf_col_interpolated,nt));
+					parameters->AddObject(new DoubleVecParam(SealevelchangePolarMotionTransferFunctionOrthogonalEnum,Pmtf_ortho_interpolated,nt));
+					parameters->AddObject(new DoubleVecParam(SealevelchangePolarMotionTransferFunctionZEnum,Pmtf_z_interpolated,nt));
+					parameters->AddObject(new DoubleVecParam(SealevelchangeTidalH2Enum,Love_th2_interpolated,nt));
+					parameters->AddObject(new DoubleVecParam(SealevelchangeTidalK2Enum,Love_tk2_interpolated,nt));
+					if (horiz) parameters->AddObject(new DoubleVecParam(SealevelchangeTidalL2Enum,Love_tl2_interpolated,nt));
+				}
 			}
 
@@ -519,4 +601,9 @@
 					xDelete<IssmDouble>(H_viscoelastic_local);
 				}
+				if(rotation){
+					xDelete<IssmDouble>(love_pmtf_colinear);
+					xDelete<IssmDouble>(love_pmtf_ortho);
+
+				}
 			}
 		} /*}}}*/
@@ -545,5 +632,4 @@
 	iomodel->DeleteData(&requestedoutputs,numoutputs,"md.solidearth.requested_outputs");
 	/*}}}*/
-
 }/*}}}*/
 
Index: /issm/trunk/src/c/analyses/SmbAnalysis.cpp
===================================================================
--- /issm/trunk/src/c/analyses/SmbAnalysis.cpp	(revision 27034)
+++ /issm/trunk/src/c/analyses/SmbAnalysis.cpp	(revision 27035)
@@ -24,5 +24,5 @@
 
 	int    smb_model;
-	bool   isdelta18o,ismungsm,isd18opd,issetpddfac,isprecipscaled,istemperaturescaled,isfirnwarming;
+	bool   isdelta18o,ismungsm,isd18opd,issetpddfac,isprecipscaled,istemperaturescaled,isfirnwarming,isstochastic;
 
 	/*Update elements: */
@@ -38,7 +38,12 @@
 	/*Figure out smb model: */
 	iomodel->FindConstant(&smb_model,"md.smb.model");
+	iomodel->FindConstant(&isstochastic,"md.stochasticforcing.isstochasticforcing");
 	switch(smb_model){
 		case SMBforcingEnum:
 			iomodel->FetchDataToInput(inputs,elements,"md.smb.mass_balance",SmbMassBalanceEnum,0.);
+			if(isstochastic){
+				iomodel->FetchDataToInput(inputs,elements,"md.stochasticforcing.default_id",StochasticForcingDefaultIdEnum);
+				iomodel->FetchDataToInput(inputs,elements,"md.smb.mass_balance",BaselineSmbMassBalanceEnum,0.);
+			}
 			break;
 		case SMBgembEnum:
Index: /issm/trunk/src/c/analyses/StressbalanceAnalysis.cpp
===================================================================
--- /issm/trunk/src/c/analyses/StressbalanceAnalysis.cpp	(revision 27034)
+++ /issm/trunk/src/c/analyses/StressbalanceAnalysis.cpp	(revision 27035)
@@ -31,5 +31,5 @@
 	IssmDouble rho_ice;
 	IssmDouble FSreconditioning;
-	bool       isSIA,isSSA,isL1L2,isMLHO,isHO,isFS,iscoupling;
+	bool       isSIA,isSSA,isL1L2,isMOLHO,isHO,isFS,iscoupling;
 	bool       spcpresent = false;
 	int        Mx,Nx;
@@ -59,13 +59,13 @@
 	iomodel->FindConstant(&isSSA,"md.flowequation.isSSA");
 	iomodel->FindConstant(&isL1L2,"md.flowequation.isL1L2");
-	iomodel->FindConstant(&isMLHO,"md.flowequation.isMLHO");
+	iomodel->FindConstant(&isMOLHO,"md.flowequation.isMOLHO");
 	iomodel->FindConstant(&isHO,"md.flowequation.isHO");
 	iomodel->FindConstant(&isFS,"md.flowequation.isFS");
 
 	/*Is this model only SIA??*/
-	if(!isSSA && !isHO && !isFS && !isL1L2 && !isMLHO) return;
+	if(!isSSA && !isHO && !isFS && !isL1L2 && !isMOLHO) return;
 
 	/*Do we have coupling*/
-	if((isSIA?1.:0.) + (isSSA?1.:0.) + (isL1L2?1.:0.) + (isMLHO?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
+	if((isSIA?1.:0.) + (isSSA?1.:0.) + (isL1L2?1.:0.) + (isMOLHO?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
 	 iscoupling = true;
 	else
@@ -78,5 +78,5 @@
 		if(isSSA)       iomodel->FindConstant(&finiteelement,"md.flowequation.fe_SSA");
 		else if(isL1L2) finiteelement = P1Enum;
-		else if(isMLHO) finiteelement = P1Enum;
+		else if(isMOLHO) finiteelement = P1Enum;
 		else if(isHO)   iomodel->FindConstant(&finiteelement,"md.flowequation.fe_HO");
 		else if(isFS){  iomodel->FindConstant(&finiteelement,"md.flowequation.fe_FS");
@@ -188,5 +188,5 @@
 		}
 		else{
-			if(!isMLHO){
+			if(!isMOLHO){
 				IoModelToConstraintsx(constraints,iomodel,"md.stressbalance.spcvx",StressbalanceAnalysisEnum,finiteelement,0);
 				if(iomodel->domaintype!=Domain2DverticalEnum){
@@ -194,5 +194,5 @@
 				}
 			}
-			else{//MLHO 
+			else{//MOLHO 
 				IoModelToConstraintsx(constraints,iomodel,"md.stressbalance.spcvx_base",StressbalanceAnalysisEnum,finiteelement,0);
 				IoModelToConstraintsx(constraints,iomodel,"md.stressbalance.spcvx_shear",StressbalanceAnalysisEnum,finiteelement,1);
@@ -462,5 +462,5 @@
 	int         count;
 	int         penpair_ids[2];
-	bool        isSSA,isL1L2,isMLHO,isHO,isFS;
+	bool        isSSA,isL1L2,isMOLHO,isHO,isFS;
 	int         numpenalties,numrifts,numriftsegments;
 	IssmDouble *riftinfo       = NULL;
@@ -470,5 +470,5 @@
 	/*Fetch parameters: */
 	iomodel->FindConstant(&isL1L2,"md.flowequation.isL1L2");
-	iomodel->FindConstant(&isMLHO,"md.flowequation.isMLHO");
+	iomodel->FindConstant(&isMOLHO,"md.flowequation.isMOLHO");
 	iomodel->FindConstant(&isFS,"md.flowequation.isFS");
 	iomodel->FindConstant(&isSSA,"md.flowequation.isSSA");
@@ -477,5 +477,5 @@
 
 	/*Is this SIA only?*/
-	if(!isSSA && !isHO && !isFS && !isL1L2 && !isMLHO) return;
+	if(!isSSA && !isHO && !isFS && !isL1L2 && !isMOLHO) return;
 
 	/*Initialize counter: */
@@ -522,5 +522,5 @@
 
 	/*Intermediary*/
-	bool isSSA,isL1L2,isMLHO,isHO,isFS,iscoupling;
+	bool isSSA,isL1L2,isMOLHO,isHO,isFS,iscoupling;
 	int  finiteelement=-1,approximation=-1;
 
@@ -528,13 +528,13 @@
 	iomodel->FindConstant(&isSSA,"md.flowequation.isSSA");
 	iomodel->FindConstant(&isL1L2,"md.flowequation.isL1L2");
-	iomodel->FindConstant(&isMLHO,"md.flowequation.isMLHO");
+	iomodel->FindConstant(&isMOLHO,"md.flowequation.isMOLHO");
 	iomodel->FindConstant(&isHO,"md.flowequation.isHO");
 	iomodel->FindConstant(&isFS,"md.flowequation.isFS");
 
 	/*Now, check that we have non SIA elements */
-	if(!isSSA && !isL1L2 && !isMLHO && !isHO && !isFS) return;
+	if(!isSSA && !isL1L2 && !isMOLHO && !isHO && !isFS) return;
 
 	/*Do we have coupling*/
-	if( (isSSA?1.:0.) + (isL1L2?1.:0.) + (isMLHO?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
+	if( (isSSA?1.:0.) + (isL1L2?1.:0.) + (isMOLHO?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
 	 iscoupling = true;
 	else
@@ -553,6 +553,6 @@
 			finiteelement = P1Enum;
 		}
-		else if(isMLHO){
-			approximation = MLHOApproximationEnum;
+		else if(isMOLHO){
+			approximation = MOLHOApproximationEnum;
 			finiteelement = P1Enum;
 		}
@@ -630,5 +630,5 @@
 			 break;
 		case L1L2ApproximationEnum: numdofs = 2; break;
-		case MLHOApproximationEnum: numdofs = 4; break;
+		case MOLHOApproximationEnum: numdofs = 4; break;
 		case HOApproximationEnum:
 			 switch(domaintype){
@@ -695,5 +695,5 @@
 	int    FrictionCoupling;
 	int*   finiteelement_list=NULL;
-	bool   isSSA,isL1L2,isMLHO,isHO,isFS,iscoupling;
+	bool   isSSA,isL1L2,isMOLHO,isHO,isFS,iscoupling;
 	bool   control_analysis;
 	bool   dakota_analysis;
@@ -703,5 +703,5 @@
 	iomodel->FindConstant(&isSSA,"md.flowequation.isSSA");
 	iomodel->FindConstant(&isL1L2,"md.flowequation.isL1L2");
-	iomodel->FindConstant(&isMLHO,"md.flowequation.isMLHO");
+	iomodel->FindConstant(&isMOLHO,"md.flowequation.isMOLHO");
 	iomodel->FindConstant(&isHO,"md.flowequation.isHO");
 	iomodel->FindConstant(&isFS,"md.flowequation.isFS");
@@ -713,5 +713,5 @@
 
 	/*return if no processing required*/
-	if(!isSSA && !isL1L2 && !isMLHO && !isHO && !isFS) return;
+	if(!isSSA && !isL1L2 && !isMOLHO && !isHO && !isFS) return;
 
 	/*Fetch data needed and allocate vectors: */
@@ -720,5 +720,5 @@
 
 	/*Do we have coupling*/
-	if( (isSSA?1.:0.) + (isL1L2?1.:0.) + (isMLHO?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
+	if( (isSSA?1.:0.) + (isL1L2?1.:0.) + (isMOLHO?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
 	 iscoupling = true;
 	else
@@ -729,5 +729,5 @@
 		if(isSSA)       iomodel->FindConstant(&finiteelement,"md.flowequation.fe_SSA");
 		else if(isL1L2) finiteelement = P1Enum;
-		else if(isMLHO) finiteelement = P1Enum;
+		else if(isMOLHO) finiteelement = P1Enum;
 		else if(isHO)   iomodel->FindConstant(&finiteelement,"md.flowequation.fe_HO");
 		else if(isFS)   iomodel->FindConstant(&finiteelement,"md.flowequation.fe_FS");
@@ -781,9 +781,9 @@
 	iomodel->FetchDataToInput(inputs,elements,"md.initialization.vx",VxEnum,0.);
 	iomodel->FetchDataToInput(inputs,elements,"md.initialization.vy",VyEnum,0.);
-	/*MLHO*/
-	if(isMLHO){
+	/*MOLHO*/
+	if(isMOLHO){
 		iomodel->FetchDataToInput(inputs,elements,"md.initialization.vx",VxShearEnum,0.);
 		iomodel->FetchDataToInput(inputs,elements,"md.initialization.vy",VyShearEnum,0.);
-		/*3D MLHO also need to have VxBase and VyBase for reconstruting Vx and Vy*/
+		/*3D MOLHO also need to have VxBase and VyBase for reconstruting Vx and Vy*/
 		if (iomodel->domaintype==Domain3DEnum) {
 			iomodel->FetchDataToInput(inputs,elements,"md.initialization.vx",VxBaseEnum,0.);
@@ -836,7 +836,12 @@
 				break;
 			case SpatialLinearFloatingMeltRateEnum:
-				iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_melting_rate",BasalforcingsDeepwaterMeltingRateEnum);
-				iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_elevation",BasalforcingsDeepwaterElevationEnum);
-				iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.upperwater_elevation",BasalforcingsUpperwaterElevationEnum);
+				iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_melting_rate",BasalforcingsSpatialDeepwaterMeltingRateEnum);
+				iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_elevation",BasalforcingsSpatialDeepwaterElevationEnum);
+				iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.upperwater_melting_rate",BasalforcingsSpatialUpperwaterMeltingRateEnum);
+				iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.upperwater_elevation",BasalforcingsSpatialUpperwaterElevationEnum);
+				if(isstochastic){
+					iomodel->FetchDataToInput(inputs,elements,"md.stochasticforcing.default_id",StochasticForcingDefaultIdEnum);
+					iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_melting_rate",BaselineBasalforcingsSpatialDeepwaterMeltingRateEnum);
+				}
 				break;
 			case BasalforcingsPicoEnum:
@@ -985,5 +990,5 @@
 	parameters->AddObject(iomodel->CopyConstantObject("md.flowequation.isSSA",FlowequationIsSSAEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.flowequation.isL1L2",FlowequationIsL1L2Enum));
-	parameters->AddObject(iomodel->CopyConstantObject("md.flowequation.isMLHO",FlowequationIsMLHOEnum));
+	parameters->AddObject(iomodel->CopyConstantObject("md.flowequation.isMOLHO",FlowequationIsMOLHOEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.flowequation.isHO",FlowequationIsHOEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.flowequation.isFS",FlowequationIsFSEnum));
@@ -1088,5 +1093,5 @@
 
 	/*Intermediaries*/
-	bool isSSA,isL1L2,isMLHO,isHO,isFS;
+	bool isSSA,isL1L2,isMOLHO,isHO,isFS;
 	bool conserve_loads = true;
 	int  newton,domaintype,fe_FS;
@@ -1095,5 +1100,5 @@
 	femmodel->parameters->FindParam(&isSSA,FlowequationIsSSAEnum);
 	femmodel->parameters->FindParam(&isL1L2,FlowequationIsL1L2Enum);
-	femmodel->parameters->FindParam(&isMLHO,FlowequationIsMLHOEnum);
+	femmodel->parameters->FindParam(&isMOLHO,FlowequationIsMOLHOEnum);
 	femmodel->parameters->FindParam(&isHO,FlowequationIsHOEnum);
 	femmodel->parameters->FindParam(&isFS,FlowequationIsFSEnum);
@@ -1102,5 +1107,5 @@
 	femmodel->parameters->FindParam(&newton,StressbalanceIsnewtonEnum);
 
-	if(isFS && !(isSSA || isHO || isL1L2 || isMLHO)){
+	if(isFS && !(isSSA || isHO || isL1L2 || isMOLHO)){
 		femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum);
 
@@ -1124,5 +1129,5 @@
 		 solutionsequence_nonlinear(femmodel,conserve_loads);
 	}
-	else if(!isFS && (isSSA || isHO || isL1L2 || isMLHO)){
+	else if(!isFS && (isSSA || isHO || isL1L2 || isMOLHO)){
 		femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum);
 		if(newton>0)
@@ -1138,5 +1143,5 @@
 		}
 	}
-	else if ((isSSA || isL1L2 || isMLHO || isHO) && isFS){
+	else if ((isSSA || isL1L2 || isMOLHO || isHO) && isFS){
 		if(VerboseSolution()) _printf0_("   computing coupling between lower order models and FS\n");
 		solutionsequence_FScoupling_nonlinear(femmodel,conserve_loads);
@@ -1190,6 +1195,6 @@
 		case L1L2ApproximationEnum:
 			return CreateKMatrixL1L2(element);
-		case MLHOApproximationEnum:
-			return CreateKMatrixMLHO(element);
+		case MOLHOApproximationEnum:
+			return CreateKMatrixMOLHO(element);
 		case HOApproximationEnum:
 			return CreateKMatrixHO(element);
@@ -1219,6 +1224,6 @@
 		case L1L2ApproximationEnum:
 			return CreatePVectorL1L2(element);
-		case MLHOApproximationEnum:
-			return CreatePVectorMLHO(element);
+		case MOLHOApproximationEnum:
+			return CreatePVectorMOLHO(element);
 		case HOApproximationEnum:
 			return CreatePVectorHO(element);
@@ -1248,6 +1253,6 @@
 			GetSolutionFromInputsHoriz(solution,element);
 			return;
-		case MLHOApproximationEnum:
-			GetSolutionFromInputsMLHO(solution,element);
+		case MOLHOApproximationEnum:
+			GetSolutionFromInputsMOLHO(solution,element);
 			return;
 		case SSAHOApproximationEnum: case HOFSApproximationEnum: case SSAFSApproximationEnum:
@@ -1330,6 +1335,6 @@
 			InputUpdateFromSolutionL1L2(solution,element);
 			return;
-		case MLHOApproximationEnum:
-			InputUpdateFromSolutionMLHO(solution,element);
+		case MOLHOApproximationEnum:
+			InputUpdateFromSolutionMOLHO(solution,element);
 			return;
 		case SSAHOApproximationEnum:
@@ -2755,6 +2760,6 @@
 }/*}}}*/
 
-/*MLHO*/
-ElementMatrix* StressbalanceAnalysis::CreateKMatrixMLHO(Element* element){/*{{{*/
+/*MOLHO*/
+ElementMatrix* StressbalanceAnalysis::CreateKMatrixMOLHO(Element* element){/*{{{*/
 
 	/* Check if ice in element */
@@ -2779,6 +2784,6 @@
 
 	/*compute all stiffness matrices for this element*/
-	ElementMatrix* Ke1=CreateKMatrixMLHOViscous(basalelement);
-	ElementMatrix* Ke2=CreateKMatrixMLHOFriction(basalelement);
+	ElementMatrix* Ke1=CreateKMatrixMOLHOViscous(basalelement);
+	ElementMatrix* Ke2=CreateKMatrixMOLHOFriction(basalelement);
 	ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2);
 
@@ -2789,5 +2794,5 @@
 	return Ke;
 }/*}}}*/
-ElementMatrix* StressbalanceAnalysis::CreateKMatrixMLHOFriction(Element* element){/*{{{*/
+ElementMatrix* StressbalanceAnalysis::CreateKMatrixMOLHOFriction(Element* element){/*{{{*/
 
 	if(element->IsAllFloating()) return NULL;
@@ -2816,5 +2821,5 @@
 
 	/*Initialize Element matrix and vectors*/
-	ElementMatrix* Ke = element->NewElementMatrix(MLHOApproximationEnum);
+	ElementMatrix* Ke = element->NewElementMatrix(MOLHOApproximationEnum);
 	IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
 
@@ -2871,5 +2876,5 @@
 	return Ke;
 }/*}}}*/
-ElementMatrix* StressbalanceAnalysis::CreateKMatrixMLHOViscous(Element* element){/*{{{*/
+ElementMatrix* StressbalanceAnalysis::CreateKMatrixMOLHOViscous(Element* element){/*{{{*/
 
 	/* Check if ice in element */
@@ -2886,5 +2891,5 @@
 
 	/*Initialize Element matrix and vectors*/
-	ElementMatrix* Ke     = element->NewElementMatrix(MLHOApproximationEnum);
+	ElementMatrix* Ke     = element->NewElementMatrix(MOLHOApproximationEnum);
 	IssmDouble*    dbasis = xNew<IssmDouble>(2*numnodes); // like SSA
 	IssmDouble*    basis  = xNew<IssmDouble>(numnodes); // like SSA
@@ -2910,5 +2915,5 @@
 		thickness_input->GetInputValue(&thickness, gauss);
 		n_input->GetInputValue(&n,gauss);
-		element->material->ViscosityMLHO(&viscosity[0],dim,xyz_list,gauss,vxbase_input,vybase_input,vxshear_input,vyshear_input,thickness_input,n_input);
+		element->material->ViscosityMOLHO(&viscosity[0],dim,xyz_list,gauss,vxbase_input,vybase_input,vxshear_input,vyshear_input,thickness_input,n_input);
 
 		for(int i=0;i<numnodes;i++){//shape functions on tria element
@@ -2976,5 +2981,5 @@
 
 	/*Transform Coordinate System*/
-	//basalelement->TransformStiffnessMatrixCoord(Ke,XYMLHOEnum);
+	//basalelement->TransformStiffnessMatrixCoord(Ke,XYMOLHOEnum);
 
 	/*Clean up and return*/
@@ -2985,5 +2990,5 @@
 	return Ke;
 }/*}}}*/
-ElementVector* StressbalanceAnalysis::CreatePVectorMLHO(Element* element){/*{{{*/
+ElementVector* StressbalanceAnalysis::CreatePVectorMOLHO(Element* element){/*{{{*/
 
 	/* Check if ice in element */
@@ -3008,6 +3013,6 @@
 
 	/*compute all load vectors for this element*/
-	ElementVector* pe1=CreatePVectorMLHODrivingStress(basalelement);
-	ElementVector* pe2=CreatePVectorMLHOFront(basalelement);
+	ElementVector* pe1=CreatePVectorMOLHODrivingStress(basalelement);
+	ElementVector* pe2=CreatePVectorMOLHOFront(basalelement);
 	ElementVector* pe =new ElementVector(pe1,pe2);
 
@@ -3018,5 +3023,5 @@
 	return pe;
 }/*}}}*/
-ElementVector* StressbalanceAnalysis::CreatePVectorMLHODrivingStress(Element* element){/*{{{*/
+ElementVector* StressbalanceAnalysis::CreatePVectorMOLHODrivingStress(Element* element){/*{{{*/
 
 	/*Intermediaries */
@@ -3028,5 +3033,5 @@
 
 	/*Initialize Element vector and vectors*/
-	ElementVector* pe    = element->NewElementVector(MLHOApproximationEnum);
+	ElementVector* pe    = element->NewElementVector(MOLHOApproximationEnum);
 	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
 
@@ -3057,5 +3062,5 @@
 
 	/*Transform coordinate system*/
-	//element->TransformLoadVectorCoord(pe,XYMLHOEnum);
+	//element->TransformLoadVectorCoord(pe,XYMOLHOEnum);
 
 	/*Clean up and return*/
@@ -3065,5 +3070,5 @@
 	return pe;
 }/*}}}*/
-ElementVector* StressbalanceAnalysis::CreatePVectorMLHOFront(Element* element){/*{{{*/
+ElementVector* StressbalanceAnalysis::CreatePVectorMOLHOFront(Element* element){/*{{{*/
 
 	/*If no front, return NULL*/
@@ -3081,5 +3086,5 @@
 
 	/*Initialize Element vector and other vectors*/
-	ElementVector* pe    = element->NewElementVector(MLHOApproximationEnum);
+	ElementVector* pe    = element->NewElementVector(MOLHOApproximationEnum);
 	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
 
@@ -3130,5 +3135,5 @@
 
 	/*Transform coordinate system*/
-	//element->TransformLoadVectorCoord(pe,XYMLHOEnum);
+	//element->TransformLoadVectorCoord(pe,XYMOLHOEnum);
 
 	/*Clean up and return*/
@@ -3139,5 +3144,5 @@
 	return pe;
 }/*}}}*/
-void           StressbalanceAnalysis::InputUpdateFromSolutionMLHO(IssmDouble* solution,Element* element){/*{{{*/
+void           StressbalanceAnalysis::InputUpdateFromSolutionMOLHO(IssmDouble* solution,Element* element){/*{{{*/
 
 	int         i,dim,domaintype;
@@ -3192,5 +3197,5 @@
 
 	/*Fetch dof list and allocate solution vectors*/
-	basalelement->GetDofListLocal(&doflist,MLHOApproximationEnum,GsetEnum); 
+	basalelement->GetDofListLocal(&doflist,MOLHOApproximationEnum,GsetEnum); 
 	IssmDouble* values    = xNew<IssmDouble>(numdof);
 	IssmDouble* vbx       = xNew<IssmDouble>(numnodes);
@@ -3215,5 +3220,5 @@
 
    /*Ok, we have vx and vy in values, fill in vx and vy arrays: */
-   for(i=0;i<numnodes;i++){ //numnodes of the 2D mesh in which the MLHO is written
+   for(i=0;i<numnodes;i++){ //numnodes of the 2D mesh in which the MOLHO is written
       vbx[i] =values[i*4+0]; //base vx
       vshx[i]=values[i*4+1]; //shear vx
@@ -3252,5 +3257,5 @@
    switch(domaintype){
       case Domain2DhorizontalEnum:
-			for(i=0;i<numnodes;i++){ //numnodes of the 2D mesh in which the MLHO is written
+			for(i=0;i<numnodes;i++){ //numnodes of the 2D mesh in which the MOLHO is written
 				vx[i]=vbx[i]+vshx[i]*(n[i]+1)/(n[i]+2);
 				vy[i]=vby[i]+vshy[i]*(n[i]+1)/(n[i]+2);
@@ -3264,6 +3269,6 @@
 		   basalelement->GetInputListOnNodes(&H[0],ThicknessEnum,0.);
 		   basalelement->GetInputListOnNodes(&s[0],SurfaceEnum,0.);
-			element->Recover3DMLHOInput(VxEnum, numnodes, vbx, vshx, n, H, s);
-			element->Recover3DMLHOInput(VyEnum, numnodes, vby, vshy, n, H, s);
+			element->Recover3DMOLHOInput(VxEnum, numnodes, vbx, vshx, n, H, s);
+			element->Recover3DMOLHOInput(VyEnum, numnodes, vby, vshy, n, H, s);
 			break;
 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
@@ -3289,5 +3294,5 @@
 	if(basalelement->IsSpawnedElement()){basalelement->DeleteMaterials(); delete basalelement;};
 }/*}}}*/
-void           StressbalanceAnalysis::GetSolutionFromInputsMLHO(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+void           StressbalanceAnalysis::GetSolutionFromInputsMOLHO(Vector<IssmDouble>* solution,Element* element){/*{{{*/
 
 	IssmDouble   vbx,vby,vshx,vshy;
@@ -3308,5 +3313,5 @@
 	int numdof   = numnodes*dofpernode;
 	element->GetInputValue(&approximation,ApproximationEnum);
-	if(approximation!=MLHOApproximationEnum) _error_("mesh "<<EnumToStringx(approximation)<<" not supported here");
+	if(approximation!=MOLHOApproximationEnum) _error_("mesh "<<EnumToStringx(approximation)<<" not supported here");
 
 	/*Fetch dof list and allocate solution vector*/
Index: /issm/trunk/src/c/analyses/StressbalanceAnalysis.h
===================================================================
--- /issm/trunk/src/c/analyses/StressbalanceAnalysis.h	(revision 27034)
+++ /issm/trunk/src/c/analyses/StressbalanceAnalysis.h	(revision 27035)
@@ -57,13 +57,13 @@
 		ElementVector* CreatePVectorL1L2DrivingStress(Element* element);
 		void           InputUpdateFromSolutionL1L2(IssmDouble* solution,Element* element);
-		/*MLHO*/
-		ElementMatrix* CreateKMatrixMLHO(Element* element);
-		ElementMatrix* CreateKMatrixMLHOFriction(Element* element);
-		ElementMatrix* CreateKMatrixMLHOViscous(Element* element);
-		ElementVector* CreatePVectorMLHO(Element* element);
-		ElementVector* CreatePVectorMLHOFront(Element* element);
-		ElementVector* CreatePVectorMLHODrivingStress(Element* element);
-		void           InputUpdateFromSolutionMLHO(IssmDouble* solution,Element* element);
-		void           GetSolutionFromInputsMLHO(Vector<IssmDouble>* solution,Element* element);
+		/*MOLHO*/
+		ElementMatrix* CreateKMatrixMOLHO(Element* element);
+		ElementMatrix* CreateKMatrixMOLHOFriction(Element* element);
+		ElementMatrix* CreateKMatrixMOLHOViscous(Element* element);
+		ElementVector* CreatePVectorMOLHO(Element* element);
+		ElementVector* CreatePVectorMOLHOFront(Element* element);
+		ElementVector* CreatePVectorMOLHODrivingStress(Element* element);
+		void           InputUpdateFromSolutionMOLHO(IssmDouble* solution,Element* element);
+		void           GetSolutionFromInputsMOLHO(Vector<IssmDouble>* solution,Element* element);
 		/*HO*/
 		ElementMatrix* CreateJacobianMatrixHO(Element* element);
Index: /issm/trunk/src/c/analyses/StressbalanceSIAAnalysis.cpp
===================================================================
--- /issm/trunk/src/c/analyses/StressbalanceSIAAnalysis.cpp	(revision 27034)
+++ /issm/trunk/src/c/analyses/StressbalanceSIAAnalysis.cpp	(revision 27035)
@@ -10,5 +10,5 @@
 
 	/*Intermediaries*/
-	bool       isSIA,isSSA,isL1L2,isMLHO,isHO,isFS,iscoupling;
+	bool       isSIA,isSSA,isL1L2,isMOLHO,isHO,isFS,iscoupling;
 
 	/*Fetch parameters: */
@@ -16,5 +16,5 @@
 	iomodel->FindConstant(&isSSA,"md.flowequation.isSSA");
 	iomodel->FindConstant(&isL1L2,"md.flowequation.isL1L2");
-	iomodel->FindConstant(&isMLHO,"md.flowequation.isMLHO");
+	iomodel->FindConstant(&isMOLHO,"md.flowequation.isMOLHO");
 	iomodel->FindConstant(&isHO,"md.flowequation.isHO");
 	iomodel->FindConstant(&isFS,"md.flowequation.isFS");
@@ -24,5 +24,5 @@
 
 	/*Do we have coupling*/
-	if((isSIA?1.:0.) + (isSSA?1.:0.) + (isL1L2?1.:0.) + (isMLHO?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
+	if((isSIA?1.:0.) + (isSSA?1.:0.) + (isL1L2?1.:0.) + (isMOLHO?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
 	 iscoupling = true;
 	else
Index: /issm/trunk/src/c/analyses/StressbalanceVerticalAnalysis.cpp
===================================================================
--- /issm/trunk/src/c/analyses/StressbalanceVerticalAnalysis.cpp	(revision 27034)
+++ /issm/trunk/src/c/analyses/StressbalanceVerticalAnalysis.cpp	(revision 27035)
@@ -12,5 +12,5 @@
 
 	/*Intermediary*/
-	bool        isSIA,isSSA,isL1L2,isMLHO,isHO,isFS,iscoupling;
+	bool        isSIA,isSSA,isL1L2,isMOLHO,isHO,isFS,iscoupling;
 	int         Mz,Nz;
 	IssmDouble *spcvz = NULL;
@@ -23,10 +23,10 @@
 	iomodel->FindConstant(&isSSA,"md.flowequation.isSSA");
 	iomodel->FindConstant(&isL1L2,"md.flowequation.isL1L2");
-	iomodel->FindConstant(&isMLHO,"md.flowequation.isMLHO");
+	iomodel->FindConstant(&isMOLHO,"md.flowequation.isMOLHO");
 	iomodel->FindConstant(&isHO,"md.flowequation.isHO");
 	iomodel->FindConstant(&isFS,"md.flowequation.isFS");
 
 	/*Do we have coupling*/
-	if((isSIA?1.:0.) + (isSSA?1.:0.) + (isL1L2?1.:0.) + (isMLHO?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
+	if((isSIA?1.:0.) + (isSSA?1.:0.) + (isL1L2?1.:0.) + (isMOLHO?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
 	 iscoupling = true;
 	else
@@ -139,7 +139,12 @@
 			break;
 		case SpatialLinearFloatingMeltRateEnum:
-			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_melting_rate",BasalforcingsDeepwaterMeltingRateEnum);
-			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_elevation",BasalforcingsDeepwaterElevationEnum);
-			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.upperwater_elevation",BasalforcingsUpperwaterElevationEnum);
+			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_melting_rate",BasalforcingsSpatialDeepwaterMeltingRateEnum);
+			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_elevation",BasalforcingsSpatialDeepwaterElevationEnum);
+			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.upperwater_melting_rate",BasalforcingsSpatialUpperwaterMeltingRateEnum);
+			iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.upperwater_elevation",BasalforcingsSpatialUpperwaterElevationEnum);
+			if(isstochastic){
+            iomodel->FetchDataToInput(inputs,elements,"md.stochasticforcing.default_id",StochasticForcingDefaultIdEnum);
+            iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.deepwater_melting_rate",BaselineBasalforcingsSpatialDeepwaterMeltingRateEnum);
+         }
 			break;
 		case BasalforcingsPicoEnum:
Index: /issm/trunk/src/c/classes/Cfdragcoeffabsgrad.cpp
===================================================================
--- /issm/trunk/src/c/classes/Cfdragcoeffabsgrad.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/Cfdragcoeffabsgrad.cpp	(revision 27035)
@@ -30,5 +30,4 @@
 	this->name = NULL;
 	this->weights_enum = UNDEF;
-	this->misfit=0;
 	this->timepassedflag = false;
 }
@@ -43,11 +42,8 @@
 	this->weights_enum=in_weights_enum;
 	this->timepassedflag=in_timepassedflag;
-
-	this->misfit=0;
 }
 /*}}}*/
 Cfdragcoeffabsgrad::~Cfdragcoeffabsgrad(){/*{{{*/
 	if(this->name)xDelete(this->name);
-	this->misfit=0;
 }
 /*}}}*/
@@ -55,5 +51,4 @@
 Object* Cfdragcoeffabsgrad::copy() {/*{{{*/
 	Cfdragcoeffabsgrad* mf = new Cfdragcoeffabsgrad(this->name,this->definitionenum, this->weights_enum,this->timepassedflag);
-	mf->misfit=this->misfit;
 	return (Object*) mf;
 }
@@ -115,5 +110,5 @@
 	int        domaintype,numcomponents;
 	IssmDouble Jelem=0.;
-	IssmDouble misfit,Jdet;
+	IssmDouble Jdet;
 	IssmDouble dp[2],weight;
 	IssmDouble* xyz_list = NULL;
Index: /issm/trunk/src/c/classes/Cfdragcoeffabsgrad.h
===================================================================
--- /issm/trunk/src/c/classes/Cfdragcoeffabsgrad.h	(revision 27034)
+++ /issm/trunk/src/c/classes/Cfdragcoeffabsgrad.h	(revision 27035)
@@ -11,5 +11,4 @@
 
 IssmDouble OutputDefinitionsResponsex(FemModel* femmodel,int output_enum);
-void  GetVectorFromInputsx( IssmDouble** pvector, int* pvector_size, FemModel* femmodel,int name);
 
 class Cfdragcoeffabsgrad: public Object, public Definition{
@@ -21,6 +20,4 @@
 		int         weights_enum;
 		bool			timepassedflag;
-
-		IssmDouble  misfit; //value carried over in time.
 
 		/*Cfdragcoeffabsgrad constructors, destructors :*/
Index: /issm/trunk/src/c/classes/Cflevelsetmisfit.cpp
===================================================================
--- /issm/trunk/src/c/classes/Cflevelsetmisfit.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/Cflevelsetmisfit.cpp	(revision 27035)
@@ -32,5 +32,4 @@
 	this->observation_enum = UNDEF;
 	this->weights_enum = UNDEF;
-	this->misfit=0;
 	this->datatime=0.;
 	this->timepassedflag = false;
@@ -49,11 +48,8 @@
 	this->datatime=in_datatime;
 	this->timepassedflag=in_timepassedflag;
-
-	this->misfit=0;
 }
 /*}}}*/
 Cflevelsetmisfit::~Cflevelsetmisfit(){/*{{{*/
 	if(this->name)xDelete(this->name);
-	this->misfit=0;
 }
 /*}}}*/
@@ -61,5 +57,4 @@
 Object* Cflevelsetmisfit::copy() {/*{{{*/
 	Cflevelsetmisfit* mf = new Cflevelsetmisfit(this->name,this->definitionenum, this->model_enum,this->observation_enum,this->weights_enum,this->datatime,this->timepassedflag);
-	mf->misfit=this->misfit;
 	return (Object*) mf;
 }
@@ -95,5 +90,4 @@
 	marshallhandle->call(this->datatime);
 	marshallhandle->call(this->timepassedflag);
-	marshallhandle->call(this->misfit);
 } 
 /*}}}*/
Index: /issm/trunk/src/c/classes/Cflevelsetmisfit.h
===================================================================
--- /issm/trunk/src/c/classes/Cflevelsetmisfit.h	(revision 27034)
+++ /issm/trunk/src/c/classes/Cflevelsetmisfit.h	(revision 27035)
@@ -11,5 +11,4 @@
 
 IssmDouble OutputDefinitionsResponsex(FemModel* femmodel,int output_enum);
-void  GetVectorFromInputsx( IssmDouble** pvector, int* pvector_size, FemModel* femmodel,int name);
 
 class Cflevelsetmisfit: public Object, public Definition{
@@ -24,6 +23,4 @@
 		IssmDouble	datatime;
 		bool			timepassedflag;
-
-		IssmDouble  misfit; //value carried over in time.
 
 		/*Cflevelsetmisfit constructors, destructors :*/
Index: /issm/trunk/src/c/classes/Cfsurfacelogvel.cpp
===================================================================
--- /issm/trunk/src/c/classes/Cfsurfacelogvel.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/Cfsurfacelogvel.cpp	(revision 27035)
@@ -29,5 +29,4 @@
 	this->definitionenum = -1;
 	this->name = NULL;
-	this->misfit=0;
 	this->datatime=0.;
 	this->timepassedflag = false;
@@ -45,10 +44,8 @@
 	this->timepassedflag=in_timepassedflag;
 
-	this->misfit=0;
 }
 /*}}}*/
 Cfsurfacelogvel::~Cfsurfacelogvel(){/*{{{*/
 	if(this->name)xDelete(this->name);
-	this->misfit=0;
 }
 /*}}}*/
@@ -56,5 +53,4 @@
 Object* Cfsurfacelogvel::copy() {/*{{{*/
 	Cfsurfacelogvel* mf = new Cfsurfacelogvel(this->name,this->definitionenum,this->datatime,this->timepassedflag);
-	mf->misfit=this->misfit;
 	return (Object*) mf;
 }
@@ -75,5 +71,11 @@
 /*}}}*/
 void Cfsurfacelogvel::Marshall(MarshallHandle* marshallhandle){/*{{{*/
-	_error_("not implemented yet!"); 
+	int object_enum=CfsurfacelogvelEnum;
+	marshallhandle->call(object_enum);
+
+	marshallhandle->call(this->definitionenum);
+	marshallhandle->call(this->name);
+	marshallhandle->call(this->datatime);
+	marshallhandle->call(this->timepassedflag);
 } 
 /*}}}*/
@@ -100,7 +102,9 @@
 	femmodel->parameters->FindParam(&time,TimeEnum);
 
-	IssmDouble J=0.;
-	IssmDouble J_sum=0.;
-	if(this->datatime<=time && !timepassedflag){
+	if(this->datatime<=time && !this->timepassedflag){
+
+		IssmDouble J=0.;
+		IssmDouble J_sum=0.;
+
 		for(Object* & object : femmodel->elements->objects){
 			Element* element=xDynamicCast<Element*>(object);
@@ -113,6 +117,9 @@
 
 		this->timepassedflag = true;
-	}
-	return J;
+		return J_sum;
+	}
+	else{
+		return 0.;
+	}
 }/*}}}*/
 IssmDouble Cfsurfacelogvel::Cfsurfacelogvel_Calculation(Element* element, int definitionenum){/*{{{*/
Index: /issm/trunk/src/c/classes/Cfsurfacelogvel.h
===================================================================
--- /issm/trunk/src/c/classes/Cfsurfacelogvel.h	(revision 27034)
+++ /issm/trunk/src/c/classes/Cfsurfacelogvel.h	(revision 27035)
@@ -11,5 +11,4 @@
 
 IssmDouble OutputDefinitionsResponsex(FemModel* femmodel,int output_enum);
-void  GetVectorFromInputsx( IssmDouble** pvector, int* pvector_size, FemModel* femmodel,int name);
 
 class Cfsurfacelogvel: public Object, public Definition{
@@ -21,6 +20,4 @@
 		IssmDouble	datatime;
 		bool			timepassedflag;
-
-		IssmDouble  misfit; //value carried over in time.
 
 		/*Cfsurfacelogvel constructors, destructors :*/
Index: /issm/trunk/src/c/classes/Cfsurfacesquare.cpp
===================================================================
--- /issm/trunk/src/c/classes/Cfsurfacesquare.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/Cfsurfacesquare.cpp	(revision 27035)
@@ -6,5 +6,5 @@
 /*{{{*/
 #ifdef HAVE_CONFIG_H
-   #include <config.h>
+#include <config.h>
 #else
 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
@@ -27,12 +27,11 @@
 Cfsurfacesquare::Cfsurfacesquare(){/*{{{*/
 
-	this->definitionenum = -1;
-	this->name = NULL;
-	this->model_enum = UNDEF;
+	this->definitionenum   = -1;
+	this->name             = NULL;
+	this->model_enum       = UNDEF;
 	this->observation_enum = UNDEF;
-	this->weights_enum = UNDEF;
-	this->misfit=0;
-	this->datatime=0.;
-	this->timepassedflag = false;
+	this->weights_enum     = UNDEF;
+	this->datatime         = 0.;
+	this->timepassedflag   = false;
 }
 /*}}}*/
@@ -49,17 +48,14 @@
 	this->datatime=in_datatime;
 	this->timepassedflag=in_timepassedflag;
-
-	this->misfit=0;
 }
 /*}}}*/
 Cfsurfacesquare::~Cfsurfacesquare(){/*{{{*/
 	if(this->name)xDelete(this->name);
-	this->misfit=0;
-}
-/*}}}*/
+}
+/*}}}*/
+
 /*Object virtual function resolutoin: */
 Object* Cfsurfacesquare::copy() {/*{{{*/
 	Cfsurfacesquare* mf = new Cfsurfacesquare(this->name,this->definitionenum, this->model_enum,this->observation_enum,this->weights_enum,this->datatime,this->timepassedflag);
-	mf->misfit=this->misfit;
 	return (Object*) mf;
 }
@@ -95,5 +91,4 @@
 	marshallhandle->call(this->datatime);
 	marshallhandle->call(this->timepassedflag);
-	marshallhandle->call(this->misfit);
 } 
 /*}}}*/
@@ -102,4 +97,5 @@
 }
 /*}}}*/
+
 /*Definition virtual function resolutoin: */
 int Cfsurfacesquare::DefinitionEnum(){/*{{{*/
@@ -115,29 +111,31 @@
 /*}}}*/
 IssmDouble Cfsurfacesquare::Response(FemModel* femmodel){/*{{{*/
-	 /*diverse: */
-	 IssmDouble time;
-
-	 /*recover time parameters: */
-	 femmodel->parameters->FindParam(&time,TimeEnum);
-
-	 IssmDouble J=0.;
-	 IssmDouble J_sum=0.;
-
-	 if(datatime<=time && !timepassedflag){
-		 for(Object* & object : femmodel->elements->objects){
-			 Element* element=xDynamicCast<Element*>(object);
-			 J+=this->Cfsurfacesquare_Calculation(element,model_enum,observation_enum,weights_enum);
-		 }
-
-		 ISSM_MPI_Allreduce ( (void*)&J,(void*)&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
-		 ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
-		 J=J_sum;
-
-		 timepassedflag = true;
-		 return J;
-	 }
-	 else return J;
- }
-	/*}}}*/
+
+	/*recover time parameters: */
+	IssmDouble time;
+	femmodel->parameters->FindParam(&time,TimeEnum);
+
+	/*Do the calculation only if this is the first time we are passed datatime*/
+	if(this->datatime<=time && !this->timepassedflag){
+
+		IssmDouble J=0.;
+		IssmDouble J_sum=0.;
+
+		for(Object* & object : femmodel->elements->objects){
+			Element* element=xDynamicCast<Element*>(object);
+			J+=this->Cfsurfacesquare_Calculation(element,model_enum,observation_enum,weights_enum);
+		}
+
+		ISSM_MPI_Allreduce ( (void*)&J,(void*)&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
+		ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
+
+		this->timepassedflag = true;
+		return J_sum;
+	}
+	else{
+		return 0.;
+	}
+}
+/*}}}*/
 IssmDouble Cfsurfacesquare::Cfsurfacesquare_Calculation(Element* element, int model_enum, int observation_enum, int weights_enum){/*{{{*/
 
Index: /issm/trunk/src/c/classes/Cfsurfacesquare.h
===================================================================
--- /issm/trunk/src/c/classes/Cfsurfacesquare.h	(revision 27034)
+++ /issm/trunk/src/c/classes/Cfsurfacesquare.h	(revision 27035)
@@ -11,5 +11,4 @@
 
 IssmDouble OutputDefinitionsResponsex(FemModel* femmodel,int output_enum);
-void  GetVectorFromInputsx( IssmDouble** pvector, int* pvector_size, FemModel* femmodel,int name);
 
 class Cfsurfacesquare: public Object, public Definition{
@@ -25,6 +24,4 @@
 		IssmDouble	datatime;
 		bool			timepassedflag;
-
-		IssmDouble  misfit; //value carried over in time.
 
 		/*Cfsurfacesquare constructors, destructors :*/
Index: /issm/trunk/src/c/classes/Elements/Element.cpp
===================================================================
--- /issm/trunk/src/c/classes/Elements/Element.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/Elements/Element.cpp	(revision 27035)
@@ -69,6 +69,7 @@
 
    /*Get Basin ID and Basin coefficients*/
-   if(enum_type==SMBautoregressionEnum)                   this->GetInputValue(&basinid,SmbBasinsIdEnum);
-   if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->GetInputValue(&basinid,FrontalForcingsBasinIdEnum);
+   if(enum_type==SMBautoregressionEnum)                               this->GetInputValue(&basinid,SmbBasinsIdEnum);
+   if(enum_type==FrontalForcingsRignotAutoregressionEnum)             this->GetInputValue(&basinid,FrontalForcingsBasinIdEnum);
+   if(enum_type==BasalforcingsDeepwaterMeltingRateAutoregressionEnum) this->GetInputValue(&basinid,BasalforcingsLinearBasinIdEnum);
    for(int i=0;i<arorder;i++) phi_basin[i] = phi[basinid*arorder+i];
    beta0_basin   = beta0[basinid];
@@ -92,6 +93,7 @@
       xDelete<IssmDouble>(oldvarspin);
    }
-   if(enum_type==SMBautoregressionEnum)                   this->inputs->SetArrayInput(SmbValuesAutoregressionEnum,this->lid,varspin,numvertices*arorder);
-   if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->inputs->SetArrayInput(ThermalforcingValuesAutoregressionEnum,this->lid,varspin,numvertices*arorder);
+   if(enum_type==SMBautoregressionEnum)                               this->inputs->SetArrayInput(SmbValuesAutoregressionEnum,this->lid,varspin,numvertices*arorder);
+   if(enum_type==FrontalForcingsRignotAutoregressionEnum)             this->inputs->SetArrayInput(ThermalforcingValuesAutoregressionEnum,this->lid,varspin,numvertices*arorder);
+   if(enum_type==BasalforcingsDeepwaterMeltingRateAutoregressionEnum) this->inputs->SetArrayInput(BasalforcingsDeepwaterMeltingRateValuesAutoregressionEnum,this->lid,varspin,numvertices*arorder);
 
    /*Cleanup and return*/
@@ -123,4 +125,10 @@
          outenum_type   = FrontalForcingsThermalForcingEnum;
          break;
+		case(BasalforcingsDeepwaterMeltingRateAutoregressionEnum):
+         arenum_type    = BasalforcingsDeepwaterMeltingRateValuesAutoregressionEnum;
+         basinenum_type = BasalforcingsLinearBasinIdEnum;
+         noiseenum_type = BasalforcingsDeepwaterMeltingRateNoiseEnum;
+         outenum_type   = BasalforcingsSpatialDeepwaterMeltingRateEnum;
+         break;
    }
 
@@ -172,4 +180,108 @@
    xDelete<IssmDouble>(varlist);
    xDelete<IssmDouble>(valuesautoregression);
+}/*}}}*/
+void       Element::BasinLinearFloatingiceMeltingRate(IssmDouble* deepwaterel,IssmDouble* upperwatermelt,IssmDouble* upperwaterel,IssmDouble* perturbation){/*{{{*/
+
+	const int NUM_VERTICES = this->GetNumberOfVertices();
+
+	int basinid;
+   IssmDouble alpha;
+   IssmDouble base[MAXVERTICES];
+   IssmDouble values[MAXVERTICES];
+   IssmDouble deepwatermelt[MAXVERTICES];
+
+	/*Get element-specific values*/
+	this->GetInputValue(&basinid,BasalforcingsLinearBasinIdEnum);
+	this->GetInputListOnVertices(&base[0],BaseEnum);
+   this->GetInputListOnVertices(&deepwatermelt[0],BasalforcingsSpatialDeepwaterMeltingRateEnum);
+
+	/*Compute melt rate at vertices according to basin-specific values of input arguments*/
+   for(int i=0;i<NUM_VERTICES;i++){
+		if(base[i]>=upperwaterel[basinid]){
+         values[i]=upperwatermelt[basinid];
+      }
+      else if (base[i]<deepwaterel[basinid]){
+         values[i]=deepwatermelt[i];
+      }
+      else{
+         alpha = (base[i]-upperwaterel[basinid])/(deepwaterel[basinid]-upperwaterel[basinid]);
+         values[i]=deepwatermelt[i]*alpha+(1.-alpha)*upperwatermelt[basinid];
+      }
+   }
+
+   this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,&values[0],P1Enum);
+}/*}}}*/
+void       Element::CalvingFromRate(){/*{{{*/
+
+	/*We are provided a calving rate, figure out the x/y components*/
+	int         dim,domaintype;
+	IssmDouble  vx,vy,vel,dphidx,dphidy,dphi,c;
+	IssmDouble  calvingratex[MAXVERTICES];
+	IssmDouble  calvingratey[MAXVERTICES];
+
+	/*Get problem dimension and whether there is moving front or not*/
+	this->FindParam(&domaintype,DomainTypeEnum);
+
+	switch(domaintype){
+		case Domain2DverticalEnum:   dim = 1; break;
+		case Domain2DhorizontalEnum: dim = 2; break;
+		case Domain3DEnum:           dim = 2; break;
+		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+	}
+	if(dim==1) _error_("not implemented in 1D...");
+
+	Input *calvingrate_input = this->GetInput(CalvingCalvingrateEnum);     _assert_(calvingrate_input);
+	Input *vx_input          = this->GetInput(VxEnum);  _assert_(vx_input);
+	Input *vy_input          = this->GetInput(VyEnum); _assert_(vy_input);
+	Input *lsf_slopex_input  = this->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
+	Input *lsf_slopey_input  = this->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
+
+	/*Allocate arrays*/
+	const int NUM_VERTICES = this->GetNumberOfVertices();
+
+	/* Start looping on the number of vertices: */
+	Gauss* gauss=this->NewGauss();
+	for (int iv=0;iv<NUM_VERTICES;iv++){
+		gauss->GaussVertex(iv);
+
+      calvingrate_input->GetInputValue(&c,gauss);
+		vx_input->GetInputValue(&vx,gauss);
+		vy_input->GetInputValue(&vy,gauss);
+		lsf_slopex_input->GetInputValue(&dphidx,gauss);
+		lsf_slopey_input->GetInputValue(&dphidy,gauss);
+
+		vel=sqrt(vx*vx + vy*vy) + 1e-14;
+		dphi=sqrt(dphidx*dphidx+dphidy*dphidy)+ 1e-14;
+
+		if(false){
+			/*Velocity direction*/
+			calvingratex[iv] = c*vx/vel;
+         calvingratey[iv] = c*vy/vel;
+		}
+		else{
+			/*Lelvelset gradient (perpendicular to ice front)*/
+         calvingratex[iv] = c*dphidx/dphi;
+         calvingratey[iv] = c*dphidy/dphi;
+		}
+	}
+
+
+	/*Add to inputs*/
+	this->AddInput(CalvingratexEnum,&calvingratex[0],P1DGEnum);
+	this->AddInput(CalvingrateyEnum,&calvingratey[0],P1DGEnum);
+	//this->AddInput(CalvingCalvingrateEnum,&calvingrate[0],P1DGEnum); /*Do not change calving rate, that's our input!*/
+
+	/*Clean up and return*/
+	delete gauss;
+}/*}}}*/
+void       Element::CalvingSetZeroRate(){/*{{{*/
+
+	/*Set calving rate as 0, this is probably because we are  dealing with discrete calving laws*/
+	IssmDouble  calvingratex[MAXVERTICES] = {0.};
+	IssmDouble  calvingratey[MAXVERTICES] = {0.};
+	IssmDouble  calvingrate[MAXVERTICES]  = {0.};
+	this->AddInput(CalvingratexEnum,&calvingratex[0],P1DGEnum);
+	this->AddInput(CalvingrateyEnum,&calvingratey[0],P1DGEnum);
+	this->AddInput(CalvingCalvingrateEnum,&calvingrate[0],P1DGEnum);
 }/*}}}*/
 void       Element::ComputeLambdaS(){/*{{{*/
@@ -929,5 +1041,5 @@
 }
 /*}}}*/
-void       Element::dViscositydBMLHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vxbase_input,Input* vybase_input, Input* vxshear_input ,Input* vyshear_input,Input* thickness_input,Input* n_input, IssmDouble zeta){/*{{{*/
+void       Element::dViscositydBMOLHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vxbase_input,Input* vybase_input, Input* vxshear_input ,Input* vyshear_input,Input* thickness_input,Input* n_input, IssmDouble zeta){/*{{{*/
 
 	/*Intermediaries*/
@@ -939,5 +1051,5 @@
 
 	/* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
-   this->StrainRateMLHO(&epsilon[0],xyz_list,gauss,
+   this->StrainRateMOLHO(&epsilon[0],xyz_list,gauss,
 				vxbase_input,vybase_input,vxshear_input,vyshear_input,thickness_input,n_input,zeta);
    eps_eff=sqrt(epsilon[0]*epsilon[0] + epsilon[1]*epsilon[1] + epsilon[2]*epsilon[2]
@@ -2158,4 +2270,14 @@
 	return shelf;
 }/*}}}*/
+bool       Element::IsAllGrounded(){/*{{{*/
+
+	Input* input=this->GetInput(MaskOceanLevelsetEnum); _assert_(input);
+	if(input->GetInputMin() < 0.){
+		return false;
+	}
+	else{
+		return true;
+	}
+}/*}}}*/
 bool       Element::IsGrounded(){/*{{{*/
 
@@ -2257,4 +2379,70 @@
 
 }/*}}}*/
+void       Element::LapseRateBasinSMB(int numelevbins, IssmDouble* lapserates, IssmDouble* elevbins,IssmDouble* refelevation){/*{{{*/
+
+	/*Variable declaration*/
+   const int numvertices = this->GetNumberOfVertices();
+   bool isadjustsmb = false;
+	int basinid,bb1,bb2;
+   IssmDouble ela,refelevation_b;
+   IssmDouble* surfacelist  = xNew<IssmDouble>(numvertices);
+   IssmDouble* smblist      = xNew<IssmDouble>(numvertices);
+   /* numelevbins values of lapse rates */
+	IssmDouble* lapserates_b = xNew<IssmDouble>(numelevbins);
+   /* (numelevbins-1) limits between elevation bins (be cautious with indexing) */
+	IssmDouble* elevbins_b   = xNew<IssmDouble>(numelevbins-1);
+
+   /*Retrieve SMB values non-adjusted for SMB lapse rate*/
+   this->GetInputListOnVertices(smblist,SmbMassBalanceEnum);
+	/*Get surface elevation on vertices*/
+	this->GetInputListOnVertices(surfacelist,SurfaceEnum);
+   /*Get basin-specific parameters of the element*/
+   this->GetInputValue(&basinid,SmbBasinsIdEnum);
+   refelevation_b = refelevation[basinid];
+	for(int ii=0;ii<(numelevbins-1);ii++) elevbins_b[ii] = elevbins[basinid*(numelevbins-1)+ii];
+	for(int ii=0;ii<numelevbins;ii++){
+		lapserates_b[ii] = lapserates[basinid*numelevbins+ii];
+		if(lapserates_b[ii]!=0) isadjustsmb=true;
+	}
+	/*Adjust SMB if any lapse rate value is non-zero*/
+	if(isadjustsmb){
+	
+	   for(int v=0;v<numvertices;v++){
+	      /*Find elevation bin of Reference elevation and of Vertex*/
+			for(int ii=0;ii<(numelevbins-1);ii++){
+				if(surfacelist[v]<=elevbins_b[ii]) bb1 = ii;	
+				if(refelevation_b<=elevbins_b[ii]) bb2 = ii;
+			}
+			/*Check for elevations above highest bin limit */
+			if(surfacelist[v]>elevbins_b[numelevbins-1-1]) bb1 = numelevbins-1;
+			if(refelevation_b>elevbins_b[numelevbins-1-1]) bb2 = numelevbins-1;
+			/*Vertex and Reference elevation in same elevation bin*/
+			if(bb1==bb2){
+				smblist[v] = smblist[v]+(surfacelist[v]-refelevation_b)*lapserates_b[bb2];
+			}
+			/*Vertex in lower elevation bin than Reference elevation*/
+			if(bb1<bb2){
+				smblist[v] = smblist[v]+(elevbins_b[bb2-1]-refelevation_b)*lapserates_b[bb2];
+				for(int ii=bb2-1;ii>bb1;ii--) smblist[v] = smblist[v]+(elevbins_b[ii-1]-elevbins_b[ii])*lapserates_b[ii];
+				smblist[v] = smblist[v]+(surfacelist[v]-elevbins_b[bb1])*lapserates_b[bb1];
+			}
+			/*Vertex in higher elevation bin than Reference elevation*/
+			if(bb1>bb2){
+				smblist[v] = smblist[v]+(elevbins_b[bb2]-refelevation_b)*lapserates_b[bb2];
+				for(int ii=bb2+1;ii<bb1;ii++) smblist[v] = smblist[v]+(elevbins_b[ii]-elevbins_b[ii-1])*lapserates_b[ii];
+				smblist[v] = smblist[v]+(surfacelist[v]-elevbins_b[bb1-1])*lapserates_b[bb1];
+			}
+		}
+	}
+
+   /*Add input to element*/
+   this->AddInput(SmbMassBalanceEnum,smblist,P1Enum);
+
+   /*Cleanup*/
+   xDelete<IssmDouble>(lapserates_b);
+   xDelete<IssmDouble>(elevbins_b);
+   xDelete<IssmDouble>(surfacelist);
+   xDelete<IssmDouble>(smblist);
+}/*}}}*/
 void       Element::LinearFloatingiceMeltingRate(){/*{{{*/
 
@@ -2264,5 +2452,4 @@
 	IssmDouble base[MAXVERTICES];
 	IssmDouble values[MAXVERTICES];
-	IssmDouble perturbation[MAXVERTICES];
 	IssmDouble time;
 
@@ -2275,5 +2462,4 @@
 
 	this->GetInputListOnVertices(&base[0],BaseEnum);
-   this->GetInputListOnVertices(&perturbation[0],BasalforcingsPerturbationMeltingRateEnum);
 	for(int i=0;i<NUM_VERTICES;i++){
 		if(base[i]>=upperwaterel){
@@ -2287,6 +2473,4 @@
 			values[i]=deepwatermelt*alpha+(1.-alpha)*upperwatermelt;
 		}
-
-      values[i]+=perturbation[i];
 	}
 
@@ -2298,19 +2482,32 @@
 	const int NUM_VERTICES = this->GetNumberOfVertices();
 
+	IssmDouble alpha;
 	IssmDouble deepwatermelt[MAXVERTICES];
-	IssmDouble deepwaterel[MAXVERTICES];;
+	IssmDouble deepwaterel[MAXVERTICES];
+	IssmDouble upperwatermelt[MAXVERTICES];
 	IssmDouble upperwaterel[MAXVERTICES];
+	IssmDouble perturbation[MAXVERTICES];
 	IssmDouble base[MAXVERTICES];
 	IssmDouble values[MAXVERTICES];
 
 	this->GetInputListOnVertices(&base[0],BaseEnum);
-	this->GetInputListOnVertices(&deepwatermelt[0],BasalforcingsDeepwaterMeltingRateEnum);
-	this->GetInputListOnVertices(&deepwaterel[0],BasalforcingsDeepwaterElevationEnum);
-	this->GetInputListOnVertices(&upperwaterel[0],BasalforcingsUpperwaterElevationEnum);
+	this->GetInputListOnVertices(&deepwatermelt[0],BasalforcingsSpatialDeepwaterMeltingRateEnum);
+	this->GetInputListOnVertices(&deepwaterel[0],BasalforcingsSpatialDeepwaterElevationEnum);
+	this->GetInputListOnVertices(&upperwatermelt[0],BasalforcingsSpatialUpperwaterMeltingRateEnum);
+	this->GetInputListOnVertices(&upperwaterel[0],BasalforcingsSpatialUpperwaterElevationEnum);
+   this->GetInputListOnVertices(&perturbation[0],BasalforcingsPerturbationMeltingRateEnum);
 
 	for(int i=0;i<NUM_VERTICES;i++){
-		if(base[i]>upperwaterel[i])      values[i]=0;
-		else if (base[i]<deepwaterel[i]) values[i]=deepwatermelt[i];
-		else values[i]=deepwatermelt[i]*(base[i]-upperwaterel[i])/(deepwaterel[i]-upperwaterel[i]);
+		if(base[i]>=upperwaterel[i]){
+			values[i]=upperwatermelt[i];
+		}
+		else if (base[i]<deepwaterel[i]){
+			values[i]=deepwatermelt[i];
+		}
+		else{
+			alpha = (base[i]-upperwaterel[i])/(deepwaterel[i]-upperwaterel[i]);
+			values[i]=deepwatermelt[i]*alpha+(1.-alpha)*upperwatermelt[i];
+		}
+		values[i] += perturbation[i];
 	}
 
@@ -3050,4 +3247,5 @@
 						case P1xP3Enum:
 						case P1xP4Enum:
+						case P1DGEnum:
 							temp_input->element_values[3] = yearlytemperatures[3];
 							temp_input->element_values[4] = yearlytemperatures[4];
@@ -3074,4 +3272,5 @@
 							case P1xP3Enum:
 							case P1xP4Enum:
+							case P1DGEnum:
 								ThermalToEnthalpy(&enth_input->element_values[3],yearlytemperatures[3],0.,0.);
 								ThermalToEnthalpy(&enth_input->element_values[4],yearlytemperatures[4],0.,0.);
@@ -3355,4 +3554,10 @@
 														  this->CalvingCrevasseDepth();
 														  break;
+													  case CalvingParameterizationEnum:
+														  this->CalvingRateParameterization();
+														  break;
+													  case CalvingTestEnum:
+														  this->CalvingRateTest();
+														  break;
 													  default:
 														  _error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
@@ -3364,5 +3569,5 @@
 		case StrainRateperpendicularEnum: this->StrainRateperpendicular(); break;
 		case SurfaceCrevasseEnum: this->CalvingCrevasseDepth(); break;
-		case SigmaVMEnum: this->CalvingRateVonmises(); break;
+		case SigmaVMEnum: this->ComputeSigmaVM(); break;
 		case PartitioningEnum: this->inputs->SetInput(PartitioningEnum,this->lid,IssmComm::GetRank()); break;
 	}
@@ -4414,6 +4619,6 @@
 
 }/*}}}*/
-void       Element::StrainRateMLHO(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vxbase_input,Input* vybase_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input,IssmDouble zeta){/*{{{*/
-	/*Compute the 2d Blatter/MLHO Strain Rate (5 components) for a given vertical coordinate (zeta):
+void       Element::StrainRateMOLHO(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vxbase_input,Input* vybase_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input,IssmDouble zeta){/*{{{*/
+	/*Compute the 2d Blatter/MOLHO Strain Rate (5 components) for a given vertical coordinate (zeta):
 	 *
 	 * epsilon=[exx eyy exy exz eyz]
Index: /issm/trunk/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk/src/c/classes/Elements/Element.h	(revision 27034)
+++ /issm/trunk/src/c/classes/Elements/Element.h	(revision 27035)
@@ -70,4 +70,7 @@
 		void					 AutoregressionInit(int numbasins,int arorder,int nspin,IssmDouble starttime,IssmDouble tstep_ar,IssmDouble tinit_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,int enum_type);
       void               Autoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,bool isfieldstochastic,int enum_type);
+		void               BasinLinearFloatingiceMeltingRate(IssmDouble* deepwaterel,IssmDouble* upperwatermelt,IssmDouble* upperwaterel,IssmDouble* perturbation);
+		void               CalvingSetZeroRate(void);
+		void               CalvingFromRate(void);
 		void               ComputeLambdaS(void);
 		void               ComputeNewDamage();
@@ -83,5 +86,5 @@
 		void               dViscositydBHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
 		void               dViscositydBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
-		void               dViscositydBMLHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vxbase_input,Input* vybase_input, Input* vxshear_input ,Input* vyshear_input,Input* thickness_input,Input* n_input, IssmDouble zeta);
+		void               dViscositydBMOLHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vxbase_input,Input* vybase_input, Input* vxshear_input ,Input* vyshear_input,Input* thickness_input,Input* n_input, IssmDouble zeta);
 		void               dViscositydDSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
 		void               Echo();
@@ -144,4 +147,5 @@
 
 		bool               IsAllFloating();
+		bool               IsAllGrounded();
 		bool               IsGrounded();
 		bool               IsOnBase();
@@ -153,4 +157,5 @@
 		bool               IsLandInElement();
 		void               Ismip6FloatingiceMeltingRate();
+		void               LapseRateBasinSMB(int numelevbins, IssmDouble* lapserates, IssmDouble* elevbins,IssmDouble* refelevation);
 		void               LinearFloatingiceMeltingRate();
 		void               SpatialLinearFloatingiceMeltingRate();
@@ -185,5 +190,5 @@
 		void               StrainRateHO(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
 		void               StrainRateHO2dvertical(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
-		void               StrainRateMLHO(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input,IssmDouble zeta);
+		void               StrainRateMOLHO(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input,IssmDouble zeta);
 		void               StrainRateSSA(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
 		void               StrainRateSSA1d(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input);
@@ -227,5 +232,7 @@
 		virtual void       AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part)=0;
 		virtual void		 BasalNodeIndices(int* pnumindices,int** pindices,int finiteelement){_error_("not implemented yet");};
+		virtual void       CalvingRateParameterization(void){_error_("not implemented yet");};
 		virtual void       CalvingRateVonmises(void){_error_("not implemented yet");};
+		virtual void       CalvingRateTest(void){_error_("not implemented yet");};
 		virtual void       CalvingCrevasseDepth(void){_error_("not implemented yet");};
 		virtual void	    CalvingRateLevermann(void)=0;
@@ -236,4 +243,5 @@
 		virtual void       ComputeDeviatoricStressTensor(void)=0;
 		virtual void       ComputeSigmaNN(void)=0;
+		virtual void       ComputeSigmaVM(void){_error_("not implemented yet");};
 		virtual void       ComputeStressTensor(void)=0;
 		virtual void       ComputeEsaStrainAndVorticity(void)=0;
@@ -343,5 +351,5 @@
 		virtual void       PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding)=0;
 		virtual int        PressureInterpolation()=0;
-      virtual void       Recover3DMLHOInput(int targetVel_enum, int numnodes, IssmDouble* vb,  IssmDouble* vsh, IssmDouble* n, IssmDouble* H, IssmDouble* s){_error_("not implemented yet");};
+      virtual void       Recover3DMOLHOInput(int targetVel_enum, int numnodes, IssmDouble* vb,  IssmDouble* vsh, IssmDouble* n, IssmDouble* H, IssmDouble* s){_error_("not implemented yet");};
 		virtual void       ReduceMatrices(ElementMatrix* Ke,ElementVector* pe)=0;
 		virtual void       ResetFSBasalBoundaryCondition()=0;
@@ -395,5 +403,4 @@
 
 		virtual void       SealevelchangeGeometrySubElementKernel(SealevelGeometry* slgeom)=0;
-		virtual void       SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom)=0;
 		virtual void       SealevelchangeShift(GrdLoads* loads, IssmDouble offset, SealevelGeometry* slgeom)=0;
 		virtual void       SealevelchangeGeometryInitial(IssmDouble* xxe, IssmDouble* yye, IssmDouble* zze, IssmDouble* areae)=0;
@@ -404,6 +411,5 @@
 		virtual void       SealevelchangeOceanAverage(GrdLoads* loads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble* sealevelpercpu, SealevelGeometry* slgeom)=0;
 		virtual void       SealevelchangeDeformationConvolution(IssmDouble* sealevelpercpu, GrdLoads* loads, IssmDouble* rotationvector,SealevelGeometry* slgeom)=0;
-		virtual void       SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom)=0;
-		virtual void       SealevelchangeUpdateViscousFields()=0;
+		virtual void       SealevelchangeUpdateViscousFields(IssmDouble lincoeff, int newindex, int offset)=0;
 		#endif
 
Index: /issm/trunk/src/c/classes/Elements/Penta.cpp
===================================================================
--- /issm/trunk/src/c/classes/Elements/Penta.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/Elements/Penta.cpp	(revision 27035)
@@ -271,20 +271,12 @@
 
 	if(!this->IsOnBase()) return;
-
-	IssmDouble  xyz_list[NUMVERTICES][3];
-	IssmDouble  epsilon[3]; /* epsilon=[exx,eyy,exy];*/
-	IssmDouble  calvingratex[NUMVERTICES];
-	IssmDouble  calvingratey[NUMVERTICES];
+	this->ComputeSigmaVM();
+
 	IssmDouble  calvingrate[NUMVERTICES];
-	IssmDouble  lambda1,lambda2,ex,ey,vx,vy,vel;
-	IssmDouble  B,sigma_max,sigma_max_floating,sigma_max_grounded,n;
-	IssmDouble  epse_2,groundedice,bed,sealevel;
-	IssmDouble  sigma_vm[NUMVERTICES];
-
-	/* Get node coordinates and dof list: */
-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+	IssmDouble  vx,vy;
+	IssmDouble  sigma_vm,sigma_max,sigma_max_floating,sigma_max_grounded;
+	IssmDouble  groundedice,bed,sealevel;
 
 	/*Depth average B for stress calculation*/
-	this->InputDepthAverageAtBase(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
 	this->InputDepthAverageAtBase(VxEnum,VxAverageEnum);
 	this->InputDepthAverageAtBase(VyEnum,VyAverageEnum);
@@ -295,9 +287,8 @@
 	Input* gr_input = this->GetInput(MaskOceanLevelsetEnum); _assert_(gr_input);
 	Input* bs_input = this->GetInput(BaseEnum);                    _assert_(bs_input);
-	Input* B_input  = this->GetInput(MaterialsRheologyBbarEnum);   _assert_(B_input);
-	Input* n_input  = this->GetInput(MaterialsRheologyNEnum);   _assert_(n_input);
 	Input* smax_fl_input = this->GetInput(CalvingStressThresholdFloatingiceEnum); _assert_(smax_fl_input);
 	Input* smax_gr_input = this->GetInput(CalvingStressThresholdGroundediceEnum); _assert_(smax_gr_input);
 	Input* sl_input  = this->GetInput(SealevelEnum); _assert_(sl_input);
+	Input* sigma_vm_input = this->GetInput(SigmaVMEnum); _assert_(sigma_vm_input);
 
 	/* Start looping on the number of vertices: */
@@ -307,30 +298,12 @@
 
 		/*Get velocity components and thickness*/
-		B_input->GetInputValue(&B,&gauss);
-		n_input->GetInputValue(&n,&gauss);
 		vx_input->GetInputValue(&vx,&gauss);
 		vy_input->GetInputValue(&vy,&gauss);
+		sigma_vm_input->GetInputValue(&sigma_vm,&gauss);
 		gr_input->GetInputValue(&groundedice,&gauss);
 		bs_input->GetInputValue(&bed,&gauss);
 		smax_fl_input->GetInputValue(&sigma_max_floating,&gauss);
 		smax_gr_input->GetInputValue(&sigma_max_grounded,&gauss);
-		vel=sqrt(vx*vx+vy*vy)+1.e-14;
 		sl_input->GetInputValue(&sealevel,&gauss);
-
-		/*Compute strain rate and viscosity: */
-		this->StrainRateSSA(&epsilon[0],&xyz_list[0][0],&gauss,vx_input,vy_input);
-
-		/*Get Eigen values*/
-		Matrix2x2Eigen(&lambda1,&lambda2,&ex,&ey,epsilon[0],epsilon[2],epsilon[1]);
-		_assert_(!xIsNan<IssmDouble>(lambda1));
-		_assert_(!xIsNan<IssmDouble>(lambda2));
-
-		/*Process Eigen values (only account for extension)*/
-		lambda1 = max(lambda1,0.);
-		lambda2 = max(lambda2,0.);
-
-		/*Calculate sigma_vm*/
-		epse_2    = 1./2. *(lambda1*lambda1 + lambda2*lambda2);
-		sigma_vm[iv] = sqrt(3.) * B * pow(epse_2,1./(2.*n));
 
 		/*Tensile stress threshold*/
@@ -342,24 +315,19 @@
 		/*Assign values*/
 		if(bed>sealevel){
-			calvingratex[iv]=0.;
-			calvingratey[iv]=0.;
+			calvingrate[iv] = 0.;
 		}
 		else{
-			calvingratex[iv]=vx*sigma_vm[iv]/sigma_max;
-			calvingratey[iv]=vy*sigma_vm[iv]/sigma_max;
-		}
-		calvingrate[iv] =sqrt(calvingratex[iv]*calvingratex[iv] + calvingratey[iv]*calvingratey[iv]);
+			calvingrate[iv] = sqrt(vx*vx+vy*vy)*sigma_vm/sigma_max;
+		}
 	}
 
 	/*Add input*/
-	this->AddBasalInput(CalvingratexEnum,&calvingratex[0],P1DGEnum);
-	this->AddBasalInput(CalvingrateyEnum,&calvingratey[0],P1DGEnum);
 	this->AddBasalInput(CalvingCalvingrateEnum,&calvingrate[0],P1DGEnum);
-	this->AddBasalInput(SigmaVMEnum,&sigma_vm[0],P1DGEnum);
-
+	this->CalvingFromRate();
+
+	/*Extrude*/
+	this->InputExtrude(CalvingCalvingrateEnum,-1);
 	this->InputExtrude(CalvingratexEnum,-1);
 	this->InputExtrude(CalvingrateyEnum,-1);
-	this->InputExtrude(CalvingCalvingrateEnum,-1);
-	this->InputExtrude(SigmaVMEnum,-1);
 }
 /*}}}*/
@@ -847,4 +815,62 @@
 	this->AddInput(StressTensoryzEnum,&sigma_yz[0],P1DGEnum);
 	this->AddInput(StressTensorzzEnum,&sigma_zz[0],P1DGEnum);
+}
+/*}}}*/
+void       Penta::ComputeSigmaVM(){/*{{{*/
+
+	if(!this->IsOnBase()) return;
+
+	IssmDouble  xyz_list[NUMVERTICES][3];
+	IssmDouble  epsilon[3]; /* epsilon=[exx,eyy,exy];*/
+	IssmDouble  lambda1,lambda2,ex,ey,vx,vy,vel;
+	IssmDouble  B,n;
+	IssmDouble  sigma_vm[NUMVERTICES];
+
+	/* Get node coordinates and dof list: */
+	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+
+	/*Depth average B for stress calculation*/
+	this->InputDepthAverageAtBase(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
+	this->InputDepthAverageAtBase(VxEnum,VxAverageEnum);
+	this->InputDepthAverageAtBase(VyEnum,VyAverageEnum);
+
+	/*Retrieve all inputs and parameters we will need*/
+	Input* vx_input = this->GetInput(VxAverageEnum); _assert_(vx_input);
+	Input* vy_input = this->GetInput(VyAverageEnum); _assert_(vy_input);
+	Input* B_input  = this->GetInput(MaterialsRheologyBbarEnum);   _assert_(B_input);
+	Input* n_input  = this->GetInput(MaterialsRheologyNEnum);   _assert_(n_input);
+
+	/* Start looping on the number of vertices: */
+	GaussPenta gauss;
+	for(int iv=0;iv<3;iv++){
+		gauss.GaussVertex(iv);
+
+		/*Get velocity components and thickness*/
+		B_input->GetInputValue(&B,&gauss);
+		n_input->GetInputValue(&n,&gauss);
+		vx_input->GetInputValue(&vx,&gauss);
+		vy_input->GetInputValue(&vy,&gauss);
+		vel=sqrt(vx*vx+vy*vy)+1.e-14;
+
+		/*Compute strain rate and viscosity: */
+		this->StrainRateSSA(&epsilon[0],&xyz_list[0][0],&gauss,vx_input,vy_input);
+
+		/*Get Eigen values*/
+		Matrix2x2Eigen(&lambda1,&lambda2,&ex,&ey,epsilon[0],epsilon[2],epsilon[1]);
+		_assert_(!xIsNan<IssmDouble>(lambda1));
+		_assert_(!xIsNan<IssmDouble>(lambda2));
+
+		/*Process Eigen values (only account for extension)*/
+		lambda1 = max(lambda1,0.);
+		lambda2 = max(lambda2,0.);
+
+		/*Calculate sigma_vm*/
+		IssmDouble epse_2    = 1./2. *(lambda1*lambda1 + lambda2*lambda2);
+		sigma_vm[iv] = sqrt(3.) * B * pow(epse_2,1./(2.*n));
+	}
+
+	/*Add input*/
+	this->AddBasalInput(SigmaVMEnum,&sigma_vm[0],P1DGEnum);
+	this->InputExtrude(SigmaVMEnum,-1);
 }
 /*}}}*/
@@ -2840,100 +2866,48 @@
 }
 /*}}}*/
-void	   Penta::MovingFrontalVelocity(void){/*{{{*/
+void	      Penta::MovingFrontalVelocity(void){/*{{{*/
+
 	if(!this->IsOnBase()) return;
-	int  dim, domaintype, calvinglaw, i;
+	int        domaintype, calvinglaw, i;
 	IssmDouble v[3],w[3],c[3],m[3],dlsf[3];
 	IssmDouble norm_dlsf, norm_calving, calvingrate, meltingrate, groundedice;
 	IssmDouble migrationmax, calvinghaf, heaviside, haf_eps;
-	IssmDouble  xyz_list[NUMVERTICES][3];
-	IssmDouble  movingfrontvx[NUMVERTICES];
-	IssmDouble  movingfrontvy[NUMVERTICES];
-	IssmDouble  vel;
+	IssmDouble xyz_list[NUMVERTICES][3];
+	IssmDouble movingfrontvx[NUMVERTICES];
+	IssmDouble movingfrontvy[NUMVERTICES];
+	IssmDouble vel;
+	int        dim=2;
 
 	/* Get node coordinates and dof list: */
 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
-
-	Input* vx_input           = NULL;
-	Input* vy_input           = NULL;
 	Input* calvingratex_input = NULL;
 	Input* calvingratey_input = NULL;
-	Input* lsf_slopex_input   = NULL;
-	Input* lsf_slopey_input   = NULL;
 	Input* calvingrate_input  = NULL;
 	Input* meltingrate_input  = NULL;
-	Input* gr_input           = NULL;
+
+	/*Load levelset function gradients*/
+	Input *lsf_slopex_input = this->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
+	Input *lsf_slopey_input = this->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
+	Input *vx_input         = this->GetInput(VxAverageEnum);              _assert_(vx_input);
+	Input *vy_input         = this->GetInput(VyAverageEnum);              _assert_(vy_input);
+	Input *gr_input         = this->GetInput(MaskOceanLevelsetEnum);      _assert_(gr_input);
 
 	/*Get problem dimension and whether there is moving front or not*/
-	this->FindParam(&domaintype,DomainTypeEnum);
 	this->FindParam(&calvinglaw,CalvingLawEnum);
-
-	switch(domaintype){
-		case Domain2DverticalEnum:   dim = 1; break;
-		case Domain2DhorizontalEnum: dim = 2; break;
-		case Domain3DEnum:           dim = 2; break;
-		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
-	}
-	/*Load velocities*/
-	switch(domaintype){
-		case Domain2DverticalEnum:
-			vx_input=this->GetInput(VxEnum); _assert_(vx_input);
-			break;
-		case Domain2DhorizontalEnum:
-			vx_input=this->GetInput(VxEnum); _assert_(vx_input);
-			vy_input=this->GetInput(VyEnum); _assert_(vy_input);
-			gr_input=this->GetInput(MaskOceanLevelsetEnum); _assert_(gr_input);
-			break;
-		case Domain3DEnum:
-			vx_input=this->GetInput(VxAverageEnum); _assert_(vx_input);
-			vy_input=this->GetInput(VyAverageEnum); _assert_(vy_input);
-			gr_input=this->GetInput(MaskOceanLevelsetEnum); _assert_(gr_input);
-			break;
-		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
-	}
-
 	switch(calvinglaw){
 		case DefaultCalvingEnum:
 		case CalvingVonmisesEnum:
-			lsf_slopex_input  = this->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
-			if(dim==2) lsf_slopey_input  = this->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
-			calvingrate_input = this->GetInput(CalvingCalvingrateEnum);     _assert_(calvingrate_input);
-			meltingrate_input = this->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
-			break;
 		case CalvingLevermannEnum:
-			switch(domaintype){
-				case Domain2DverticalEnum:
-					calvingratex_input=this->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
-					break;
-				case Domain2DhorizontalEnum:
-					calvingratex_input=this->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
-					calvingratey_input=this->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
-					break;
-				case Domain3DEnum:
-					calvingratex_input=this->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
-					calvingratey_input=this->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
-					break;
-				default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
-			}
+			calvingratex_input=this->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
+			calvingratey_input=this->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
 			meltingrate_input = this->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
 			break;
 		case CalvingMinthicknessEnum:
-			lsf_slopex_input  = this->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
-			if(dim==2) lsf_slopey_input  = this->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
-			meltingrate_input = this->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
-			break;
 		case CalvingHabEnum:
-			lsf_slopex_input  = this->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
-			if(dim==2) lsf_slopey_input  = this->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
-			meltingrate_input = this->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
-			break;
 		case CalvingCrevasseDepthEnum:
-			lsf_slopex_input  = this->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
-			if(dim==2) lsf_slopey_input  = this->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
 			meltingrate_input = this->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
 			break;
 		case CalvingDev2Enum:
 			this->FindParam(&calvinghaf,CalvingHeightAboveFloatationEnum);
-			lsf_slopex_input  = this->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
-			if(dim==2) lsf_slopey_input  = this->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
 			calvingrate_input = this->GetInput(CalvingCalvingrateEnum);     _assert_(calvingrate_input);
 			meltingrate_input = this->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
@@ -2952,4 +2926,7 @@
 		vy_input->GetInputValue(&v[1],&gauss);
 		gr_input->GetInputValue(&groundedice,&gauss);
+      lsf_slopex_input->GetInputValue(&dlsf[0],&gauss);
+      lsf_slopey_input->GetInputValue(&dlsf[1],&gauss);
+      norm_dlsf=sqrt(dlsf[0]*dlsf[0] + dlsf[1]*dlsf[1]);
 
 		/*Get calving speed*/
@@ -2957,43 +2934,18 @@
 			case DefaultCalvingEnum:
 			case CalvingVonmisesEnum:
-				lsf_slopex_input->GetInputValue(&dlsf[0],&gauss);
-				if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],&gauss);
-				calvingrate_input->GetInputValue(&calvingrate,&gauss);
-				meltingrate_input->GetInputValue(&meltingrate,&gauss);
-
-				if(groundedice<0) meltingrate = 0.;
-
-				norm_dlsf=0.;
-				for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
-				norm_dlsf=sqrt(norm_dlsf);
-
-				if(norm_dlsf>1.e-10)
-				 for(i=0;i<dim;i++){
-					 c[i]=calvingrate*dlsf[i]/norm_dlsf; m[i]=meltingrate*dlsf[i]/norm_dlsf;
-				 }
-				else
-				 for(i=0;i<dim;i++){
-					 c[i]=0.; m[i]=0.;
-				 }
-				break;
-
 			case CalvingLevermannEnum:
 				calvingratex_input->GetInputValue(&c[0],&gauss);
-				if(dim==2) calvingratey_input->GetInputValue(&c[1],&gauss);
+				calvingratey_input->GetInputValue(&c[1],&gauss);
 				meltingrate_input->GetInputValue(&meltingrate,&gauss);
-				norm_calving=0.;
-				for(i=0;i<dim;i++) norm_calving+=pow(c[i],2);
-				norm_calving=sqrt(norm_calving)+1.e-14;
-				for(i=0;i<dim;i++) m[i]=meltingrate*c[i]/norm_calving;
+				if(groundedice<0) meltingrate = 0.;
+				m[0]=meltingrate*dlsf[0]/norm_dlsf;
+				m[1]=meltingrate*dlsf[1]/norm_dlsf;
 				break;
 
 			case CalvingMinthicknessEnum:
-				lsf_slopex_input->GetInputValue(&dlsf[0],&gauss);
-				if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],&gauss);
+			case CalvingHabEnum:
+			case CalvingCrevasseDepthEnum:
 				meltingrate_input->GetInputValue(&meltingrate,&gauss);
-
-				norm_dlsf=0.;
-				for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
-				norm_dlsf=sqrt(norm_dlsf);
+				if(groundedice<0) meltingrate = 0.;
 
 				if(norm_dlsf>1.e-10)
@@ -3009,52 +2961,6 @@
 				break;
 
-			case CalvingHabEnum:
-				lsf_slopex_input->GetInputValue(&dlsf[0],&gauss);
-				if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],&gauss);
-				meltingrate_input->GetInputValue(&meltingrate,&gauss);
-
-				norm_dlsf=0.;
-				for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
-				norm_dlsf=sqrt(norm_dlsf);
-
-				if(norm_dlsf>1.e-10)
-				 for(i=0;i<dim;i++){
-					 c[i]=0.;
-					 m[i]=meltingrate*dlsf[i]/norm_dlsf;
-				 }
-				else
-				 for(i=0;i<dim;i++){
-					 c[i]=0.;
-					 m[i]=0.;
-				 }
-				break;
-
-			case CalvingCrevasseDepthEnum:
-				lsf_slopex_input->GetInputValue(&dlsf[0],&gauss);
-				if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],&gauss);
-				meltingrate_input->GetInputValue(&meltingrate,&gauss);
-
-				if(groundedice<0) meltingrate = 0.;
-
-				norm_dlsf=0.;
-				for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
-				norm_dlsf=sqrt(norm_dlsf);
-
-				if(norm_dlsf>1.e-10)
-				 for(i=0;i<dim;i++){
-					 c[i]=0.;
-					 m[i]=meltingrate*dlsf[i]/norm_dlsf;
-				 }
-				else
-				 for(i=0;i<dim;i++){
-					 c[i]=0.;
-					 m[i]=0.;
-				 }
-				break;
-
 			case CalvingDev2Enum:
 				  {
-					lsf_slopex_input->GetInputValue(&dlsf[0],&gauss);
-					if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],&gauss);
 					calvingrate_input->GetInputValue(&calvingrate,&gauss);
 					meltingrate_input->GetInputValue(&meltingrate,&gauss);
@@ -3081,8 +2987,4 @@
 					}
 
-					norm_dlsf=0.;
-					for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
-					norm_dlsf=sqrt(norm_dlsf);
-
 					if(norm_dlsf>1.e-10)
 					 for(i=0;i<dim;i++){
@@ -3111,5 +3013,4 @@
 	this->AddInput(MovingFrontalVxEnum,&movingfrontvx[0],P1DGEnum);
 	this->AddInput(MovingFrontalVyEnum,&movingfrontvy[0],P1DGEnum);
-
 	this->InputExtrude(MovingFrontalVxEnum,-1);
 	this->InputExtrude(MovingFrontalVyEnum,-1);
@@ -3296,5 +3197,5 @@
 	norm=sqrt(normal[0]*normal[0]+normal[1]*normal[1]+normal[2]*normal[2]);
 
-	for(int i=0;i<3;i++) normal[i]=normal[i]/norm;
+	for(int i=0;i<3;i++) normal[i]=normal[i]/(norm+1e-10);
 }
 /*}}}*/
@@ -3381,5 +3282,5 @@
 }
 /*}}}*/
-void       Penta::Recover3DMLHOInput(int targetVel_enum, int numnodes, IssmDouble* vb,  IssmDouble* vsh, IssmDouble* n, IssmDouble* H, IssmDouble* s){/*{{{*/
+void       Penta::Recover3DMOLHOInput(int targetVel_enum, int numnodes, IssmDouble* vb,  IssmDouble* vsh, IssmDouble* n, IssmDouble* H, IssmDouble* s){/*{{{*/
    /* Recover the velocity acording to v=vb+(1-\zeta^{n+1})vsh, where \zeta=(s-z)/H
     * The variables vb, vsh, n, H and s are all from the 2D horizontal mesh(Tria), with "numnodes" DOFs
Index: /issm/trunk/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/trunk/src/c/classes/Elements/Penta.h	(revision 27034)
+++ /issm/trunk/src/c/classes/Elements/Penta.h	(revision 27035)
@@ -49,4 +49,5 @@
 		void           AddControlInput(int input_enum,Inputs* inputs,IoModel* iomodel,IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max, int interpolation_enum,int id);
 		void           ControlInputExtrude(int enum_type,int start);
+		void           ComputeSigmaVM(void);
 		void           DatasetInputExtrude(int enum_type,int start);
 		void           DatasetInputCreate(IssmDouble* array,int M,int N,int* individual_enums,int num_inputs,Inputs* inputs,IoModel* iomodel,int input_enum);
@@ -169,5 +170,5 @@
 		void           PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding);
 		int            PressureInterpolation();
-      void           Recover3DMLHOInput(int targetVel_enum, int numnodes, IssmDouble* vb,  IssmDouble* vsh, IssmDouble* n, IssmDouble* H, IssmDouble* s);
+      void           Recover3DMOLHOInput(int targetVel_enum, int numnodes, IssmDouble* vb,  IssmDouble* vsh, IssmDouble* n, IssmDouble* H, IssmDouble* s);
 		void           ReduceMatrices(ElementMatrix* Ke,ElementVector* pe);
 		void           ResetFSBasalBoundaryCondition(void);
@@ -225,5 +226,4 @@
 		void       GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,Matlitho* litho, IssmDouble* x,IssmDouble* y){_error_("not implemented yet");};
 		void       SealevelchangeGeometrySubElementKernel(SealevelGeometry* slgeom){_error_("not implemented yet");};
-		void       SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, GrdLoads* loads,  SealevelGeometry* slgeom){_error_("not implemented yet");};
 		void       SealevelchangeShift(GrdLoads* loads,  IssmDouble offset, SealevelGeometry* slgeom){_error_("not implemented yet");};
 		void       SealevelchangeGeometryInitial(IssmDouble* xxe, IssmDouble* yye, IssmDouble* zze, IssmDouble* areae){_error_("not implemented yet");};
@@ -234,6 +234,5 @@
 		void       SealevelchangeOceanAverage(GrdLoads* loads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble* sealevelpercpu, SealevelGeometry* slgeom){_error_("not implemented yet");};
 		void       SealevelchangeDeformationConvolution(IssmDouble* sealevelpercpu, GrdLoads* loads,  IssmDouble* rotationvector,SealevelGeometry* slgeom){_error_("not implemented yet");};
-		void       SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom){_error_("not implemented yet");};
-		void       SealevelchangeUpdateViscousFields(){_error_("not implemented yet");};
+		void       SealevelchangeUpdateViscousFields(IssmDouble lincoeff, int newindex, int offset){_error_("not implemented yet");};
 		#endif
 
Index: /issm/trunk/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/trunk/src/c/classes/Elements/Seg.h	(revision 27034)
+++ /issm/trunk/src/c/classes/Elements/Seg.h	(revision 27035)
@@ -179,5 +179,4 @@
 		void       GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,Matlitho* litho, IssmDouble* x,IssmDouble* y){_error_("not implemented yet");};
 		void       SealevelchangeGeometrySubElementKernel(SealevelGeometry* slgeom){_error_("not implemented yet");};
-		void       SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, GrdLoads* loads,  SealevelGeometry* slgeom){_error_("not implemented yet");};
 		void       SealevelchangeShift(GrdLoads* loads, IssmDouble offset, SealevelGeometry* slgeom){_error_("not implemented yet");};
 		void       SealevelchangeGeometryInitial(IssmDouble* xxe, IssmDouble* yye, IssmDouble* zze, IssmDouble* areae){_error_("not implemented yet");};
@@ -188,6 +187,5 @@
 		void       SealevelchangeOceanAverage(GrdLoads* loads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble* sealevelpercpu, SealevelGeometry* slgeom){_error_("not implemented yet");};
 		void       SealevelchangeDeformationConvolution(IssmDouble* sealevelpercpu, GrdLoads* loads, IssmDouble* rotationvector,SealevelGeometry* slgeom){_error_("not implemented yet");};
-		void       SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom){_error_("not implemented yet");};
-		void       SealevelchangeUpdateViscousFields(){_error_("not implemented yet");};
+		void       SealevelchangeUpdateViscousFields(IssmDouble lincoeff, int newindex, int offset){_error_("not implemented yet");};
 #endif
 
Index: /issm/trunk/src/c/classes/Elements/Tetra.cpp
===================================================================
--- /issm/trunk/src/c/classes/Elements/Tetra.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/Elements/Tetra.cpp	(revision 27035)
@@ -605,5 +605,5 @@
 	norm=sqrt(normal[0]*normal[0]+normal[1]*normal[1]+normal[2]*normal[2]);
 
-	for(int i=0;i<3;i++) normal[i]=normal[i]/norm;
+	for(int i=0;i<3;i++) normal[i]=normal[i]/(norm+1e-10);
 }
 /*}}}*/
Index: /issm/trunk/src/c/classes/Elements/Tetra.h
===================================================================
--- /issm/trunk/src/c/classes/Elements/Tetra.h	(revision 27034)
+++ /issm/trunk/src/c/classes/Elements/Tetra.h	(revision 27035)
@@ -186,5 +186,4 @@
 		void       GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt, Matlitho* litho, IssmDouble* x,IssmDouble* y){_error_("not implemented yet");};
 		void       SealevelchangeGeometrySubElementKernel(SealevelGeometry* slgeom){_error_("not implemented yet");};
-		void       SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, GrdLoads* loads,  SealevelGeometry* slgeom){_error_("not implemented yet");};
 		void       SealevelchangeShift(GrdLoads* loads,  IssmDouble offset, SealevelGeometry* slgeom){_error_("not implemented yet");};
 		void       SealevelchangeGeometryInitial(IssmDouble* xxe, IssmDouble* yye, IssmDouble* zze, IssmDouble* areae){_error_("not implemented yet");};
@@ -195,6 +194,5 @@
 		void       SealevelchangeOceanAverage(GrdLoads* loads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble* sealevelpercpu, SealevelGeometry* slgeom){_error_("not implemented yet");};
 		void       SealevelchangeDeformationConvolution(IssmDouble* sealevelpercpu, GrdLoads* loads,  IssmDouble* rotationvector,SealevelGeometry* slgeom){_error_("not implemented yet");};
-		void       SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom){_error_("not implemented yet");};
-		void       SealevelchangeUpdateViscousFields(){_error_("not implemented yet");};
+		void       SealevelchangeUpdateViscousFields(IssmDouble lincoeff, int newindex, int offset){_error_("not implemented yet");};
 #endif
 
Index: /issm/trunk/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk/src/c/classes/Elements/Tria.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/Elements/Tria.cpp	(revision 27035)
@@ -29,5 +29,5 @@
 #define NUMVERTICES   3
 #define NUMVERTICES1D 2
-//#define ISMICI        1
+//#define MICI          1 //1 = DeConto & Pollard, 2 = DOMINOS
 
 /*Constructors/destructor/copy*/
@@ -313,27 +313,22 @@
 void       Tria::CalvingRateVonmises(){/*{{{*/
 
-	IssmDouble  xyz_list[NUMVERTICES][3];
-	IssmDouble  epsilon[3]; /* epsilon=[exx,eyy,exy];*/
-	IssmDouble  calvingratex[NUMVERTICES];
-	IssmDouble  calvingratey[NUMVERTICES];
+	/*First, compute Von Mises Stress*/
+	this->ComputeSigmaVM();
+
+	/*Now compute calving rate*/
 	IssmDouble  calvingrate[NUMVERTICES];
-	IssmDouble  lambda1,lambda2,ex,ey,vx,vy,vel;
-	IssmDouble  sigma_vm[NUMVERTICES];
-	IssmDouble  B,sigma_max,sigma_max_floating,sigma_max_grounded,n;
-	IssmDouble  epse_2,groundedice,bed,sealevel;		// added sealevel
-
-	/* Get node coordinates and dof list: */
-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+	IssmDouble  sigma_vm,vx,vy;
+	IssmDouble  sigma_max,sigma_max_floating,sigma_max_grounded,n;
+	IssmDouble  groundedice,bed,sealevel;
 
 	/*Retrieve all inputs and parameters we will need*/
-	Input* vx_input = this->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input = this->GetInput(VyEnum); _assert_(vy_input);
-	Input* B_input  = this->GetInput(MaterialsRheologyBbarEnum);   _assert_(B_input);
-	Input* gr_input = this->GetInput(MaskOceanLevelsetEnum); _assert_(gr_input);
-	Input* bs_input = this->GetInput(BaseEnum);                    _assert_(bs_input);
-	Input* smax_fl_input = this->GetInput(CalvingStressThresholdFloatingiceEnum); _assert_(smax_fl_input);
-	Input* smax_gr_input = this->GetInput(CalvingStressThresholdGroundediceEnum); _assert_(smax_gr_input);
-	Input* n_input  = this->GetInput(MaterialsRheologyNEnum); _assert_(n_input);
-	Input* sl_input  = this->GetInput(SealevelEnum); _assert_(sl_input);
+	Input* vx_input       = this->GetInput(VxEnum); _assert_(vx_input);
+	Input* vy_input       = this->GetInput(VyEnum); _assert_(vy_input);
+	Input* gr_input       = this->GetInput(MaskOceanLevelsetEnum); _assert_(gr_input);
+	Input* bs_input       = this->GetInput(BaseEnum);                    _assert_(bs_input);
+	Input* smax_fl_input  = this->GetInput(CalvingStressThresholdFloatingiceEnum); _assert_(smax_fl_input);
+	Input* smax_gr_input  = this->GetInput(CalvingStressThresholdGroundediceEnum); _assert_(smax_gr_input);
+	Input* sl_input       = this->GetInput(SealevelEnum); _assert_(sl_input);
+	Input* sigma_vm_input = this->GetInput(SigmaVMEnum); _assert_(sigma_vm_input);
 
 	/* Start looping on the number of vertices: */
@@ -343,6 +338,5 @@
 
 		/*Get velocity components and thickness*/
-		B_input->GetInputValue(&B,&gauss);
-		n_input->GetInputValue(&n,&gauss);
+		sigma_vm_input->GetInputValue(&sigma_vm,&gauss);
 		vx_input->GetInputValue(&vx,&gauss);
 		vy_input->GetInputValue(&vy,&gauss);
@@ -351,27 +345,5 @@
 		smax_fl_input->GetInputValue(&sigma_max_floating,&gauss);
 		smax_gr_input->GetInputValue(&sigma_max_grounded,&gauss);
-		vel=sqrt(vx*vx+vy*vy)+1.e-14;
 		sl_input->GetInputValue(&sealevel,&gauss);
-
-		/*Compute strain rate and viscosity: */
-		this->StrainRateSSA(&epsilon[0],&xyz_list[0][0],&gauss,vx_input,vy_input);
-
-		/*Get Eigen values*/
-		Matrix2x2Eigen(&lambda1,&lambda2,&ex,&ey,epsilon[0],epsilon[2],epsilon[1]);
-		_assert_(!xIsNan<IssmDouble>(lambda1));
-		_assert_(!xIsNan<IssmDouble>(lambda2));
-
-		/*Process Eigen values (only account for extension)*/
-		lambda1 = max(lambda1,0.);
-		lambda2 = max(lambda2,0.);
-
-		/*Calculate sigma_vm*/
-		epse_2    = 1./2. *(lambda1*lambda1 + lambda2*lambda2);
-		sigma_vm[iv]  = sqrt(3.) * B * pow(epse_2,1./(2.*n));
-
-		/*OLD (keep for a little bit)*/
-		//sigma_max = 800.e+3; //IUGG previous test
-		//sigma_max = 1000.e+3; //GRL
-		//if(groundedice<0) sigma_max=150.e+3;
 
 		/*Tensile stress threshold*/
@@ -380,15 +352,57 @@
 		else
 		 sigma_max = sigma_max_grounded;
+
 		/*Assign values*/
-		if(bed>sealevel){		// Changed 0. to sealevel
-			calvingratex[iv]=0.;
-			calvingratey[iv]=0.;
+		if(bed>sealevel){
+			calvingrate[iv] = 0.;
 		}
 		else{
-			calvingratex[iv]=vx*sigma_vm[iv]/sigma_max;
-			calvingratey[iv]=vy*sigma_vm[iv]/sigma_max;
-		}
-		calvingrate[iv] =sqrt(calvingratex[iv]*calvingratex[iv] + calvingratey[iv]*calvingratey[iv]);
-
+			calvingrate[iv] = sqrt(vx*vx+vy*vy)*sigma_vm/sigma_max;
+		}
+	}
+
+	/*Add input*/
+	this->AddInput(CalvingCalvingrateEnum,&calvingrate[0],P1DGEnum);
+   this->CalvingFromRate();
+}
+/*}}}*/
+void       Tria::CalvingRateTest(){/*{{{*/
+
+	IssmDouble  calvingratex[NUMVERTICES];
+	IssmDouble  calvingratey[NUMVERTICES];
+	IssmDouble  calvingrate[NUMVERTICES];
+	IssmDouble  vx,vy,vel;
+	IssmDouble  dphidx, dphidy, dphi;
+	IssmDouble  time;
+	IssmDouble  coeff, indrate;
+
+	/*Retrieve all inputs and parameters we will need*/
+	parameters->FindParam(&time,TimeEnum);
+	parameters->FindParam(&coeff,CalvingTestSpeedfactorEnum,time);
+	parameters->FindParam(&indrate,CalvingTestIndependentRateEnum,time);
+
+	Input* vx_input = this->GetInput(VxEnum); _assert_(vx_input);
+	Input* vy_input = this->GetInput(VyEnum); _assert_(vy_input);
+	Input *lsf_slopex_input  = this->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
+   Input *lsf_slopey_input  = this->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
+
+	/* Start looping on the number of vertices: */
+	GaussTria gauss;
+	for(int iv=0;iv<NUMVERTICES;iv++){
+		gauss.GaussVertex(iv);
+
+		/*Get velocity components and thickness*/
+		vx_input->GetInputValue(&vx,&gauss);
+		vy_input->GetInputValue(&vy,&gauss);
+
+		lsf_slopex_input->GetInputValue(&dphidx,&gauss);
+      lsf_slopey_input->GetInputValue(&dphidy,&gauss);
+
+      vel=sqrt(vx*vx + vy*vy) + 1e-14;
+      dphi=sqrt(dphidx*dphidx+dphidy*dphidy)+ 1e-14;
+
+		calvingratex[iv]= coeff*vx + indrate*dphidx/dphi;
+		calvingratey[iv]= coeff*vy + indrate*dphidy/dphi;
+		calvingrate[iv] = sqrt(calvingratex[iv]*calvingratex[iv] + calvingratey[iv]*calvingratey[iv]);
 	}
 
@@ -397,5 +411,4 @@
 	this->AddInput(CalvingrateyEnum,&calvingratey[0],P1DGEnum);
 	this->AddInput(CalvingCalvingrateEnum,&calvingrate[0],P1DGEnum);
-	this->AddInput(SigmaVMEnum,&sigma_vm[0],P1DGEnum);
 }
 /*}}}*/
@@ -655,15 +668,7 @@
 		IssmDouble calvingratex,calvingratey,thickness,Jdet,flux_per_area;
 		IssmDouble rho_ice=FindParam(MaterialsRhoIceEnum);
-		Input* thickness_input=this->GetInput(ThicknessEnum); _assert_(thickness_input);
-		Input* calvingratex_input=NULL;
-		Input* calvingratey_input=NULL;
-		if(domaintype==Domain2DhorizontalEnum){
-			calvingratex_input=this->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
-			calvingratey_input=this->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
-		}
-		else{
-			calvingratex_input=this->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
-			calvingratey_input=this->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
-		}
+		Input* thickness_input    = this->GetInput(ThicknessEnum); _assert_(thickness_input);
+		Input* calvingratex_input = this->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
+		Input* calvingratey_input = this->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
 
 		/*Start looping on Gaussian points*/
@@ -789,21 +794,10 @@
 		IssmDouble calvingratex,calvingratey,vx,vy,vel,meltingrate,meltingratex,meltingratey,thickness,Jdet,flux_per_area;
 		IssmDouble rho_ice=FindParam(MaterialsRhoIceEnum);
-		Input* thickness_input=this->GetInput(ThicknessEnum); _assert_(thickness_input);
-		Input* calvingratex_input=NULL;
-		Input* calvingratey_input=NULL;
-		Input* vx_input=NULL;
-		Input* vy_input=NULL;
-		Input* meltingrate_input=NULL;
-		if(domaintype==Domain2DhorizontalEnum){
-			calvingratex_input=this->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
-			calvingratey_input=this->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
-			vx_input=this->GetInput(VxEnum); _assert_(vx_input);
-			vy_input=this->GetInput(VyEnum); _assert_(vy_input);
-			meltingrate_input=this->GetInput(CalvingMeltingrateEnum); _assert_(meltingrate_input);
-		}
-		else{
-			calvingratex_input=this->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
-			calvingratey_input=this->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
-		}
+		Input* thickness_input    = this->GetInput(ThicknessEnum); _assert_(thickness_input);
+		Input* calvingratex_input = this->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
+		Input* calvingratey_input = this->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
+		Input* vx_input           = this->GetInput(VxEnum); _assert_(vx_input);
+		Input* vy_input           = this->GetInput(VyEnum); _assert_(vy_input);
+		Input* meltingrate_input  = this->GetInput(CalvingMeltingrateEnum); _assert_(meltingrate_input);
 
 		/*Start looping on Gaussian points*/
@@ -832,4 +826,148 @@
 		delete gauss;
 	}
+}
+/*}}}*/
+void       Tria::CalvingRateParameterization(){/*{{{*/
+
+	IssmDouble  xyz_list[NUMVERTICES][3];
+	IssmDouble  epsilon[3]; /* epsilon=[exx,eyy,exy];*/
+	IssmDouble  calvingrate[NUMVERTICES];
+	IssmDouble  lambda1,lambda2,ex,ey,vx,vy,vel;
+	IssmDouble  sigma_vm[NUMVERTICES];
+	IssmDouble  B,sigma_max,sigma_max_floating,sigma_max_grounded,n;
+	IssmDouble  epse_2,groundedice,bed,sealevel;
+	IssmDouble  arate, rho_ice, rho_water, thickness, paramX, Hab;
+	int			use_parameter=0;
+	int			nonlinear_law=0;
+	IssmDouble  theta, alpha, midp, gamma;
+
+	/* Get node coordinates and dof list: */
+	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+
+	/*Retrieve all inputs and parameters we will need*/
+	Input *vx_input      = this->GetInput(VxEnum);                                _assert_(vx_input);
+	Input *vy_input      = this->GetInput(VyEnum);                                _assert_(vy_input);
+	Input *B_input       = this->GetInput(MaterialsRheologyBbarEnum);             _assert_(B_input);
+	Input *gr_input      = this->GetInput(MaskOceanLevelsetEnum);                 _assert_(gr_input);
+	Input *bs_input      = this->GetInput(BedEnum);                               _assert_(bs_input);
+	Input *H_input       = this->GetInput(ThicknessEnum);                         _assert_(H_input);
+	Input *smax_fl_input = this->GetInput(CalvingStressThresholdFloatingiceEnum); _assert_(smax_fl_input);
+	Input *smax_gr_input = this->GetInput(CalvingStressThresholdGroundediceEnum); _assert_(smax_gr_input);
+	Input *n_input       = this->GetInput(MaterialsRheologyNEnum);                _assert_(n_input);
+	Input *sl_input      = this->GetInput(SealevelEnum);                          _assert_(sl_input);
+	Input *arate_input   = this->GetInput(CalvingAblationrateEnum);               _assert_(arate_input);
+
+	/* Ice and sea water density */
+	this->FindParam(&rho_ice,MaterialsRhoIceEnum);
+	this->FindParam(&rho_water,MaterialsRhoSeawaterEnum);
+
+	/* Use which parameter  */
+	this->FindParam(&use_parameter, CalvingUseParamEnum);
+	this->FindParam(&theta, CalvingScaleThetaEnum);
+	this->FindParam(&alpha, CalvingAmpAlphaEnum);
+	this->FindParam(&midp, CalvingMidpointEnum);
+	this->FindParam(&nonlinear_law, CalvingNonlinearLawEnum);
+
+	/* Start looping on the number of vertices: */
+	GaussTria* gauss=new GaussTria();
+	for(int iv=0;iv<NUMVERTICES;iv++){
+		gauss->GaussVertex(iv);
+
+		/*Get velocity components and thickness*/
+		B_input->GetInputValue(&B,gauss);
+		n_input->GetInputValue(&n,gauss);
+		vx_input->GetInputValue(&vx,gauss);
+		vy_input->GetInputValue(&vy,gauss);
+		gr_input->GetInputValue(&groundedice,gauss);
+		bs_input->GetInputValue(&bed,gauss);
+		H_input->GetInputValue(&thickness,gauss);
+		smax_fl_input->GetInputValue(&sigma_max_floating,gauss);
+		smax_gr_input->GetInputValue(&sigma_max_grounded,gauss);
+		vel=sqrt(vx*vx+vy*vy)+1.e-14;
+		sl_input->GetInputValue(&sealevel,gauss);
+		arate_input->GetInputValue(&arate,gauss);
+
+		/*Compute strain rate and viscosity: */
+		this->StrainRateSSA(&epsilon[0],&xyz_list[0][0],gauss,vx_input,vy_input);
+
+		/*Get Eigen values*/
+		Matrix2x2Eigen(&lambda1,&lambda2,&ex,&ey,epsilon[0],epsilon[2],epsilon[1]);
+		_assert_(!xIsNan<IssmDouble>(lambda1));
+		_assert_(!xIsNan<IssmDouble>(lambda2));
+
+		/*Process Eigen values (only account for extension)*/
+		lambda1 = max(lambda1,0.);
+		lambda2 = max(lambda2,0.);
+
+		/*Calculate sigma_vm*/
+		epse_2    = 1./2. *(lambda1*lambda1 + lambda2*lambda2);
+		sigma_vm[iv]  = sqrt(3.) * B * pow(epse_2,1./(2.*n));
+
+		/*Tensile stress threshold*/
+		if(groundedice<0)
+		 sigma_max = sigma_max_floating;
+		else
+		 sigma_max = sigma_max_grounded;
+
+		switch (use_parameter) { 
+			case 0:
+				/* bed elevation */
+				paramX = bed;
+				break;
+			case 1:
+				/* Height above floatation */
+				if (bed>sealevel)	paramX = 0.0;
+				else paramX = thickness - (rho_water/rho_ice) * (sealevel-bed);
+				break;
+			case 2:
+				/* Thicknese */
+				paramX = thickness;
+				break;
+			case 4:
+				/* bed elevation+linear curve fitting */
+				paramX = bed;
+				break;
+			case -1:
+				/* use nothing, just the arate*/
+				break;
+			default:
+				_error_("The parameter is not supported yet!");
+		}
+
+		/* Compute the hyperbolic tangent function */
+		if ((use_parameter>-0.5) & (use_parameter<3)) {
+			gamma = 0.5*theta*(1.0-tanh((paramX+midp)/alpha))+(1.0-theta);
+			if (gamma<0.0) gamma =0.0;
+		}
+		else if (use_parameter>=3) {
+			gamma = alpha*paramX + theta;
+			if (gamma > 1.0) gamma = 1.0;
+			if (gamma < 0.0) gamma = 0.0;
+		}
+		else gamma = 1;
+
+		/*-------------------------------------------*/
+		if (nonlinear_law) {
+			/*This von Mises type has too strong positive feedback with vel included
+			 * calvingrate[iv] = (arate+sigma_vm[iv]*vel/sigma_max)*gamma;
+			 */
+			Hab = thickness - (rho_water/rho_ice) * (sealevel-bed);
+			if (Hab < 0.) Hab = 0.;
+			if (bed > sealevel) Hab = 0.;
+
+			calvingrate[iv] = (arate+Hab/sigma_max)*gamma;
+		}
+		else {
+			calvingrate[iv] = arate*gamma;
+		}
+	}
+
+	/*Add input*/
+	this->AddInput(CalvingCalvingrateEnum,&calvingrate[0],P1DGEnum);
+	this->AddInput(SigmaVMEnum,&sigma_vm[0],P1DGEnum);
+	this->CalvingFromRate();
+
+	/*Clean up and return*/
+	delete gauss;
 }
 /*}}}*/
@@ -914,5 +1052,5 @@
 }
 /*}}}*/
-void	     Tria::ComputeEsaStrainAndVorticity(){ /*{{{*/
+void	      Tria::ComputeEsaStrainAndVorticity(){ /*{{{*/
 
 	IssmDouble  xyz_list[NUMVERTICES][3];
@@ -1010,4 +1148,54 @@
 		delete gauss;
 	}
+}
+/*}}}*/
+void       Tria::ComputeSigmaVM(){/*{{{*/
+
+	IssmDouble  xyz_list[NUMVERTICES][3];
+	IssmDouble  epsilon[3]; /* epsilon=[exx,eyy,exy];*/
+	IssmDouble  lambda1,lambda2,ex,ey,vx,vy,vel;
+	IssmDouble  sigma_vm[NUMVERTICES];
+	IssmDouble  B,n;
+
+	/* Get node coordinates and dof list: */
+	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+
+	/*Retrieve all inputs and parameters we will need*/
+	Input* vx_input = this->GetInput(VxEnum); _assert_(vx_input);
+	Input* vy_input = this->GetInput(VyEnum); _assert_(vy_input);
+	Input* B_input  = this->GetInput(MaterialsRheologyBbarEnum);   _assert_(B_input);
+	Input* n_input  = this->GetInput(MaterialsRheologyNEnum); _assert_(n_input);
+
+	/* Start looping on the number of vertices: */
+	GaussTria gauss;
+	for(int iv=0;iv<NUMVERTICES;iv++){
+		gauss.GaussVertex(iv);
+
+		/*Get velocity components and thickness*/
+		B_input->GetInputValue(&B,&gauss);
+		n_input->GetInputValue(&n,&gauss);
+		vx_input->GetInputValue(&vx,&gauss);
+		vy_input->GetInputValue(&vy,&gauss);
+		vel=sqrt(vx*vx+vy*vy)+1.e-14;
+
+		/*Compute strain rate and viscosity: */
+		this->StrainRateSSA(&epsilon[0],&xyz_list[0][0],&gauss,vx_input,vy_input);
+
+		/*Get Eigen values*/
+		Matrix2x2Eigen(&lambda1,&lambda2,&ex,&ey,epsilon[0],epsilon[2],epsilon[1]);
+		_assert_(!xIsNan<IssmDouble>(lambda1));
+		_assert_(!xIsNan<IssmDouble>(lambda2));
+
+		/*Process Eigen values (only account for extension)*/
+		lambda1 = max(lambda1,0.);
+		lambda2 = max(lambda2,0.);
+
+		/*Calculate sigma_vm*/
+		IssmDouble epse_2 = 1./2. *(lambda1*lambda1 + lambda2*lambda2);
+		sigma_vm[iv]  = sqrt(3.) * B * pow(epse_2,1./(2.*n));
+	}
+
+	/*Add input*/
+	this->AddInput(SigmaVMEnum,&sigma_vm[0],P1DGEnum);
 }
 /*}}}*/
@@ -1937,5 +2125,5 @@
 	//compute sea level load weights
 	this->GetFractionGeometry(loadweights,&phi,&point1,&fraction1,&fraction2,&istrapeze1,levelset);
-
+	for (int i=0;i<NUMVERTICES;i++) loadweights[i]/=phi;
 	this->GetBarycenterFromLevelset(platbar,plongbar, phi, fraction1, fraction2, late, longe, point1,istrapeze1,planetradius);
 
@@ -2028,4 +2216,5 @@
 		this->GetFractionGeometry(loadweights,&phi2,&point2,&f,&g,&istrapeze2,levelset2);
 		this->GetBarycenterFromLevelset(platbar,plongbar, phi2, f, g, late, longe, point2,istrapeze2,planetradius);
+		for (int i=0;i<NUMVERTICES;i++) loadweights[i]/=phi2;
 		*ploadarea=area*phi2;
 		return;
@@ -2034,4 +2223,5 @@
 		this->GetFractionGeometry(loadweights,&phi1,&point1,&d,&e,&istrapeze1,levelset1);
 		this->GetBarycenterFromLevelset(platbar,plongbar, phi1, d, e, late, longe, point1,istrapeze1,planetradius);
+		for (int i=0;i<NUMVERTICES;i++) loadweights[i]/=phi1;
 		*ploadarea=area*phi1;
 		return;
@@ -2046,5 +2236,5 @@
 		this->GetBarycenterFromLevelset(platbar,plongbar, phi1, d, e, late, longe, point1,istrapeze1,planetradius);
 		*ploadarea=area*phi1;
-		for (int i=0;i<NUMVERTICES;i++) loadweights[i]=weights1[i];
+		for (int i=0;i<NUMVERTICES;i++) loadweights[i]=weights1[i]/phi1;
 		return;
 	}
@@ -2107,7 +2297,7 @@
 
 	//interpolant weights of each point. Any field F[0,1,2] provided at the original vertices [0,1,2] will be equal on point k to sum_i (F[i] * w[k][i])
-	w[0][0]=1; //A
-	w[1][1]=1; //B
-	w[2][2]=1; //C
+	w[i0][i0]=1; //A
+	w[i1][i1]=1; //B
+	w[i2][i2]=1; //C
 	w[3][i0]=1.0-d; w[3][i1]=d; //D
 	w[4][i0]=1.0-e; w[4][i2]=e; //E
@@ -2331,8 +2521,8 @@
 		for (int j=0;j<3;j++){
 			for (int i=0;i<NUMVERTICES;i++) {
-				loadweights[j]=w1[i][j]*area1 + w2[i][j]*area2 + w3[i][j]*area3;
+				loadweights[j]+=w1[i][j]*area1 + w2[i][j]*area2 + w3[i][j]*area3;
 				barycenter[j]+=xyz1[i][j]*area1+xyz2[i][j]*area2+xyz3[i][j]*area3;
 			}
-			loadweights[j]/=area;
+			loadweights[j]/=areasub*3.0;
 			barycenter[j]/=areasub *3.0;
 		}
@@ -2604,4 +2794,6 @@
 				input->Serve(numindices,&indices[0]);
 				break;
+			case P1xP2Enum:
+			case P1xP3Enum:
 			case P1xP4Enum:
 			case P1DGEnum:
@@ -3596,5 +3788,4 @@
 	}
 
-	
 	/*Cleanup & return: */
 	xDelete<int>(indices);
@@ -4101,21 +4292,16 @@
 	IssmDouble norm_dlsf, norm_calving, calvingrate, meltingrate, groundedice;
 	IssmDouble migrationmax, calvinghaf, heaviside, haf_eps;
-	IssmDouble  xyz_list[NUMVERTICES][3];
-	IssmDouble  movingfrontvx[NUMVERTICES];
-	IssmDouble  movingfrontvy[NUMVERTICES];
-	IssmDouble  vel;
+	IssmDouble xyz_list[NUMVERTICES][3];
+	IssmDouble movingfrontvx[NUMVERTICES];
+	IssmDouble movingfrontvy[NUMVERTICES];
+	IssmDouble vel;
 
 	/* Get node coordinates and dof list: */
 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
 
-	Input* vx_input           = NULL;
-	Input* vy_input           = NULL;
 	Input* calvingratex_input = NULL;
 	Input* calvingratey_input = NULL;
-	Input* lsf_slopex_input   = NULL;
-	Input* lsf_slopey_input   = NULL;
 	Input* calvingrate_input  = NULL;
 	Input* meltingrate_input  = NULL;
-	Input* gr_input           = NULL;
 
 	/*Get problem dimension and whether there is moving front or not*/
@@ -4129,66 +4315,29 @@
 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
 	}
-	/*Load velocities*/
-	switch(domaintype){
-		case Domain2DverticalEnum:
-			vx_input=this->GetInput(VxEnum); _assert_(vx_input);
-			break;
-		case Domain2DhorizontalEnum:
-			vx_input=this->GetInput(VxEnum); _assert_(vx_input);
-			vy_input=this->GetInput(VyEnum); _assert_(vy_input);
-			gr_input=this->GetInput(MaskOceanLevelsetEnum); _assert_(gr_input);
-			break;
-		case Domain3DEnum:
-			vx_input=this->GetInput(VxAverageEnum); _assert_(vx_input);
-			vy_input=this->GetInput(VyAverageEnum); _assert_(vy_input);
-			gr_input=this->GetInput(MaskOceanLevelsetEnum); _assert_(gr_input);
-			break;
-		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
-	}
+
+	/*Load levelset function gradients*/
+   Input *gr_input         = this->GetInput(MaskOceanLevelsetEnum); _assert_(gr_input);
+	Input *lsf_slopex_input = this->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
+	Input *lsf_slopey_input = this->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
+	Input *vx_input         = this->GetInput(VxEnum);                     _assert_(vx_input);
+	Input *vy_input         = this->GetInput(VyEnum); _assert_(vy_input);
 
 	switch(calvinglaw){
 		case DefaultCalvingEnum:
 		case CalvingVonmisesEnum:
-			lsf_slopex_input  = this->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
-			if(dim==2) lsf_slopey_input  = this->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
-			calvingrate_input = this->GetInput(CalvingCalvingrateEnum);     _assert_(calvingrate_input);
-			meltingrate_input = this->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
-			break;
 		case CalvingLevermannEnum:
-			switch(domaintype){
-				case Domain2DverticalEnum:
-					calvingratex_input=this->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
-					break;
-				case Domain2DhorizontalEnum:
-					calvingratex_input=this->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
-					calvingratey_input=this->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
-					break;
-				case Domain3DEnum:
-					calvingratex_input=this->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
-					calvingratey_input=this->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
-					break;
-				default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
-			}
+		case CalvingTestEnum:
+		case CalvingParameterizationEnum:
+			calvingratex_input=this->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
+			calvingratey_input=this->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
 			meltingrate_input = this->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
 			break;
 		case CalvingMinthicknessEnum:
-			lsf_slopex_input  = this->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
-			if(dim==2) lsf_slopey_input  = this->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
-			meltingrate_input = this->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
-			break;
 		case CalvingHabEnum:
-			lsf_slopex_input  = this->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
-			if(dim==2) lsf_slopey_input  = this->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
-			meltingrate_input = this->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
-			break;
 		case CalvingCrevasseDepthEnum:
-			lsf_slopex_input  = this->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
-			if(dim==2) lsf_slopey_input  = this->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
 			meltingrate_input = this->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
 			break;
 		case CalvingDev2Enum:
 			this->FindParam(&calvinghaf,CalvingHeightAboveFloatationEnum);
-			lsf_slopex_input  = this->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
-			if(dim==2) lsf_slopey_input  = this->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
 			calvingrate_input = this->GetInput(CalvingCalvingrateEnum);     _assert_(calvingrate_input);
 			meltingrate_input = this->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
@@ -4207,4 +4356,10 @@
 		vy_input->GetInputValue(&v[1],&gauss);
 		gr_input->GetInputValue(&groundedice,&gauss);
+		lsf_slopex_input->GetInputValue(&dlsf[0],&gauss);
+		if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],&gauss);
+
+		norm_dlsf=0.;
+		for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
+		norm_dlsf=sqrt(norm_dlsf);
 
 		/*Get calving speed*/
@@ -4212,22 +4367,18 @@
 			case DefaultCalvingEnum:
 			case CalvingVonmisesEnum:
-				lsf_slopex_input->GetInputValue(&dlsf[0],&gauss);
-				if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],&gauss);
-				calvingrate_input->GetInputValue(&calvingrate,&gauss);
+			case CalvingTestEnum:
+			case CalvingParameterizationEnum:
+				calvingratex_input->GetInputValue(&c[0],&gauss);
+				calvingratey_input->GetInputValue(&c[1],&gauss);
 				meltingrate_input->GetInputValue(&meltingrate,&gauss);
 				if(groundedice<0) meltingrate = 0.;
-
-				norm_dlsf=0.;
-				for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
-				norm_dlsf=sqrt(norm_dlsf);
-
-				if(norm_dlsf>1.e-10)
-				 for(i=0;i<dim;i++){
-					 c[i]=calvingrate*dlsf[i]/norm_dlsf; m[i]=meltingrate*dlsf[i]/norm_dlsf;
-				 }
-				else
-				 for(i=0;i<dim;i++){
-					 c[i]=0.; m[i]=0.;
-				 }
+				m[0]=meltingrate*dlsf[0]/norm_dlsf;
+				m[1]=meltingrate*dlsf[1]/norm_dlsf;
+
+				if(norm_dlsf<1.e-10){
+					for(i=0;i<dim;i++){
+						c[i]=0.; m[i]=0.;
+					}
+				}
 				break;
 
@@ -4243,11 +4394,7 @@
 
 			case CalvingMinthicknessEnum:
-				lsf_slopex_input->GetInputValue(&dlsf[0],&gauss);
-				if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],&gauss);
+			case CalvingHabEnum:
+			case CalvingCrevasseDepthEnum:
 				meltingrate_input->GetInputValue(&meltingrate,&gauss);
-
-				norm_dlsf=0.;
-				for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
-				norm_dlsf=sqrt(norm_dlsf);
 
 				if(norm_dlsf>1.e-10)
@@ -4263,52 +4410,6 @@
 				break;
 
-			case CalvingHabEnum:
-				lsf_slopex_input->GetInputValue(&dlsf[0],&gauss);
-				if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],&gauss);
-				meltingrate_input->GetInputValue(&meltingrate,&gauss);
-
-				norm_dlsf=0.;
-				for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
-				norm_dlsf=sqrt(norm_dlsf);
-
-				if(norm_dlsf>1.e-10)
-				 for(i=0;i<dim;i++){
-					 c[i]=0.;
-					 m[i]=meltingrate*dlsf[i]/norm_dlsf;
-				 }
-				else
-				 for(i=0;i<dim;i++){
-					 c[i]=0.;
-					 m[i]=0.;
-				 }
-				break;
-
-			case CalvingCrevasseDepthEnum:
-				lsf_slopex_input->GetInputValue(&dlsf[0],&gauss);
-				if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],&gauss);
-				meltingrate_input->GetInputValue(&meltingrate,&gauss);
-
-				if(groundedice<0) meltingrate = 0.;
-
-				norm_dlsf=0.;
-				for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
-				norm_dlsf=sqrt(norm_dlsf);
-
-				if(norm_dlsf>1.e-10)
-				 for(i=0;i<dim;i++){
-					 c[i]=0.;
-					 m[i]=meltingrate*dlsf[i]/norm_dlsf;
-				 }
-				else
-				 for(i=0;i<dim;i++){
-					 c[i]=0.;
-					 m[i]=0.;
-				 }
-				break;
-
 			case CalvingDev2Enum:
 				  {
-					lsf_slopex_input->GetInputValue(&dlsf[0],&gauss);
-					if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],&gauss);
 					calvingrate_input->GetInputValue(&calvingrate,&gauss);
 					meltingrate_input->GetInputValue(&meltingrate,&gauss);
@@ -4335,8 +4436,4 @@
 					}
 
-					norm_dlsf=0.;
-					for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
-					norm_dlsf=sqrt(norm_dlsf);
-
 					if(norm_dlsf>1.e-10)
 					 for(i=0;i<dim;i++){
@@ -4351,4 +4448,8 @@
 					break;
 				  }
+				calvingratex_input->GetInputValue(&c[0],&gauss);
+				if(dim==2) calvingratey_input->GetInputValue(&c[1],&gauss);
+				for(i=0;i<dim;i++) m[i]=0.;
+				break;
 
 			default:
@@ -4381,23 +4482,26 @@
 		ls_input->GetInputValue(&ls,&gauss);
 
-		/*Do we assume that the calving front does not move?*/
-		//movingfrontvx[iv] = 0.;
-		//movingfrontvy[iv] = 0.;
-
-		//if(Hc>80. && bed<0. && fabs(ls)<100.e3){ //Pollard & De Conto
-		if(Hc>135. && bed<0. && fabs(ls)<100.e3){ // Crawford et all
-
-			lsf_slopex_input->GetInputValue(&dlsf[0],&gauss);
-			norm_dlsf=0.;
-			for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
-			norm_dlsf=sqrt(norm_dlsf);
-
-			/*use vel direction instead of LSF*/
-			vx_input->GetInputValue(&v[0],&gauss);
-			vy_input->GetInputValue(&v[1],&gauss);
-			vel=sqrt(v[0]*v[0] + v[1]*v[1]);
-			norm_dlsf = max(vel,1.e-10);
-			dlsf[0] = v[0];
-			dlsf[1] = v[1];
+		/*use vel direction instead of LSF*/
+		vx_input->GetInputValue(&v[0],&gauss);
+		vy_input->GetInputValue(&v[1],&gauss);
+		vel=sqrt(v[0]*v[0] + v[1]*v[1]);
+		norm_dlsf = max(vel,1.e-10);
+		dlsf[0] = v[0];
+		dlsf[1] = v[1];
+
+		/*Do we assume that the calving front does not move if MICI is not engaged?*/
+		movingfrontvx[iv] = 0.;
+		movingfrontvy[iv] = 0.;
+		//movingfrontvx[iv] = -2000./(365*24*3600.)*dlsf[0]/norm_dlsf;
+		//movingfrontvy[iv] = -2000./(365*24*3600.)*dlsf[1]/norm_dlsf;
+
+		if(MICI==1 && Hc>80. && bed<0. && fabs(ls)<100.e3){ //Pollard & De Conto
+			IssmDouble C = (min(max(Hc,80.),100.) - 80.)/20. * 10./(24*3600.); /*Original MICI! convert from m/day to m/s*/
+
+			/*Front motion = ice speed (v) - calving rate*/
+			movingfrontvx[iv] = v[0]-C*dlsf[0]/norm_dlsf;
+			movingfrontvy[iv] = v[1]-C*dlsf[1]/norm_dlsf;
+		}
+		else if (MICI==2 && Hc>135. && bed<0. && fabs(ls)<100.e3){ // Crawford et all
 
 			/*5C Bn (worst case scenario)*/
@@ -4405,7 +4509,8 @@
 			IssmDouble alpha = 7.3;
 			IssmDouble C = min(2000.,I*pow(Hc,alpha))/(24*3600.); /*convert from m/day to m/s*/
-			//IssmDouble C = (min(max(Hc,80.),100.) - 80.)/20. * 10./(24*3600.); /*Original MICI! convert from m/day to m/s*/
-			movingfrontvx[iv] = -C*dlsf[0]/norm_dlsf;
-			movingfrontvy[iv] = -C*dlsf[1]/norm_dlsf;
+
+			/*Front motion = ice speed (v) - calving rate*/
+			movingfrontvx[iv] = v[0] -C*dlsf[0]/norm_dlsf;
+			movingfrontvy[iv] = v[1] -C*dlsf[1]/norm_dlsf;
 		}
 	}
@@ -4587,6 +4692,6 @@
 	norm=sqrt(vector[0]*vector[0] + vector[1]*vector[1]);
 
-	normal[0]= + vector[1]/norm;
-	normal[1]= - vector[0]/norm;
+	normal[0]= + vector[1]/(norm+1e-10);
+	normal[1]= - vector[0]/(norm+1e-10);
 }
 /*}}}*/
@@ -5214,15 +5319,7 @@
 	IssmDouble calvingratex,calvingratey,thickness,Jdet;
 	IssmDouble rho_ice=FindParam(MaterialsRhoIceEnum);
-	Input* thickness_input=this->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input* calvingratex_input=NULL;
-	Input* calvingratey_input=NULL;
-	if(domaintype==Domain2DhorizontalEnum){
-		calvingratex_input=this->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
-		calvingratey_input=this->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
-	}
-	else{
-		calvingratex_input=this->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
-		calvingratey_input=this->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
-	}
+	Input* thickness_input    = this->GetInput(ThicknessEnum); _assert_(thickness_input);
+	Input* calvingratex_input = this->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
+	Input* calvingratey_input = this->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
 
 	/*Start looping on Gaussian points*/
@@ -5340,23 +5437,13 @@
 	/*Get inputs*/
 	IssmDouble flux = 0.;
-	IssmDouble calvingratex,calvingratey,vx,vy,vel,meltingrate,meltingratex,meltingratey,thickness,Jdet;
+	IssmDouble calvingratex,calvingratey,vx,vy,vel,meltingrate,meltingratex,meltingratey,thickness,Jdet,groundedice;
 	IssmDouble rho_ice=FindParam(MaterialsRhoIceEnum);
-	Input* thickness_input=this->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input* calvingratex_input=NULL;
-	Input* calvingratey_input=NULL;
-	Input* vx_input=NULL;
-	Input* vy_input=NULL;
-	Input* meltingrate_input=NULL;
-	if(domaintype==Domain2DhorizontalEnum){
-		calvingratex_input=this->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
-		calvingratey_input=this->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
-		vx_input=this->GetInput(VxEnum); _assert_(vx_input);
-		vy_input=this->GetInput(VyEnum); _assert_(vy_input);
-		meltingrate_input=this->GetInput(CalvingMeltingrateEnum); _assert_(meltingrate_input);
-	}
-	else{
-		calvingratex_input=this->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
-		calvingratey_input=this->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
-	}
+	Input* thickness_input    = this->GetInput(ThicknessEnum); _assert_(thickness_input);
+	Input *gr_input           = this->GetInput(MaskOceanLevelsetEnum); _assert_(gr_input);
+	Input* calvingratex_input = this->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
+	Input* calvingratey_input = this->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
+	Input* vx_input           = this->GetInput(VxEnum); _assert_(vx_input);
+	Input* vy_input           = this->GetInput(VyEnum); _assert_(vy_input);
+	Input* meltingrate_input  = this->GetInput(CalvingMeltingrateEnum); _assert_(meltingrate_input);
 
 	/*Start looping on Gaussian points*/
@@ -5366,8 +5453,10 @@
 		calvingratex_input->GetInputValue(&calvingratex,gauss);
 		calvingratey_input->GetInputValue(&calvingratey,gauss);
+		gr_input->GetInputValue(&groundedice,gauss);
 		vx_input->GetInputValue(&vx,gauss);
 		vy_input->GetInputValue(&vy,gauss);
 		vel=vx*vx+vy*vy;
 		meltingrate_input->GetInputValue(&meltingrate,gauss);
+		if(groundedice<0) meltingrate = 0.;
 		meltingratex=meltingrate*vx/(sqrt(vel)+1.e-14);
 		meltingratey=meltingrate*vy/(sqrt(vel)+1.e-14);
@@ -6237,8 +6326,7 @@
 	IssmDouble area,planetarea,planetradius;
 	IssmDouble constant,ratioe;
-	IssmDouble I;  //change in ice thickness or water level(Farrel and Clarke, Equ. 4)
 	IssmDouble rho_earth;
 	IssmDouble NewtonG;
-	IssmDouble g;
+	IssmDouble g, cent_scaling;
 	IssmDouble lati,longi;
 	IssmDouble latitude[NUMVERTICES];
@@ -6291,15 +6379,32 @@
 
 	/*Rotational:*/
+	#ifdef _HAVE_RESTRICT_
+	IssmDouble* __restrict__ tide_love_h  = NULL;
+	IssmDouble* __restrict__ tide_love_k  = NULL;
+	IssmDouble* __restrict__ tide_love_l  = NULL;
+	IssmDouble* __restrict__ LoveRotRSL   = NULL;
+	IssmDouble* __restrict__ LoveRotU     = NULL;
+	IssmDouble* __restrict__ LoveRothoriz = NULL;
+	IssmDouble* __restrict__  Grot        = NULL;
+	IssmDouble* __restrict__ GUrot        = NULL;
+	IssmDouble* __restrict__ GNrot        = NULL;
+	IssmDouble* __restrict__ GErot        = NULL;
+	#else
 	IssmDouble* tide_love_h  = NULL;
 	IssmDouble* tide_love_k  = NULL;
 	IssmDouble* tide_love_l  = NULL;
+	IssmDouble* LoveRotRSL   = NULL;
+	IssmDouble* LoveRotU     = NULL;
+	IssmDouble* LoveRothoriz = NULL;
+	IssmDouble*  Grot        = NULL;
+	IssmDouble* GUrot        = NULL;
+	IssmDouble* GNrot        = NULL;
+	IssmDouble* GErot        = NULL;
+	#endif
+
 	IssmDouble  moi_e, moi_p, omega;
-	IssmDouble  Grotm1[3],GUrotm1[3],GNrotm1[3],GErotm1[3];
-	IssmDouble  Grotm2[3],GUrotm2[3],GNrotm2[3],GErotm2[3];
-	IssmDouble  Grotm3[3],GUrotm3[3],GNrotm3[3],GErotm3[3];
 	IssmDouble  Y21cos     , Y21sin     , Y20;
 	IssmDouble dY21cos_dlat,dY21sin_dlat,dY20_dlat;
 	IssmDouble dY21cos_dlon,dY21sin_dlon;
-	IssmDouble LoveRotRSL,LoveRotU,LoveRothoriz;
 	IssmDouble polenudge;
 	/*}}}*/
@@ -6324,10 +6429,10 @@
 
 	if(computerotation){
-		parameters->FindParam(&tide_love_h,NULL,NULL,TidalLoveHEnum);
-		parameters->FindParam(&tide_love_k,NULL,NULL,TidalLoveKEnum);
-		parameters->FindParam(&tide_love_l,NULL,NULL,TidalLoveLEnum);
 		parameters->FindParam(&moi_e,RotationalEquatorialMoiEnum);
 		parameters->FindParam(&moi_p,RotationalPolarMoiEnum);
 		parameters->FindParam(&omega,RotationalAngularVelocityEnum);
+		//parameters->FindParam(&tide_love_h,NULL,NULL,SealevelchangeTidalH2Enum);
+		//parameters->FindParam(&tide_love_k,NULL,NULL,SealevelchangeTidalK2Enum);
+		//if(horiz) parameters->FindParam(&tide_love_l,NULL,NULL,SealevelchangeTidalL2Enum);
 	}
 	/*}}}*/
@@ -6347,4 +6452,17 @@
 			parameter = static_cast<DoubleVecParam*>(this->parameters->FindParamObject(SealevelchangeHViscoElasticEnum)); _assert_(parameter);
 			parameter->GetParameterValueByPointer((IssmDouble**)&H_viscoelastic_precomputed,NULL);
+		}
+
+		if(computerotation){
+			parameter = static_cast<DoubleVecParam*>(this->parameters->FindParamObject(SealevelchangeTidalH2Enum)); _assert_(parameter);
+			parameter->GetParameterValueByPointer((IssmDouble**)&tide_love_h,NULL);
+
+			parameter = static_cast<DoubleVecParam*>(this->parameters->FindParamObject(SealevelchangeTidalK2Enum)); _assert_(parameter);
+			parameter->GetParameterValueByPointer((IssmDouble**)&tide_love_k,NULL);
+
+			if (horiz) {
+				parameter = static_cast<DoubleVecParam*>(this->parameters->FindParamObject(SealevelchangeTidalL2Enum)); _assert_(parameter);
+				parameter->GetParameterValueByPointer((IssmDouble**)&tide_love_l,NULL);
+			}
 		}
 	}
@@ -6387,5 +6505,5 @@
 			IssmDouble alpha;
 			IssmDouble delPhi,delLambda;
-			/*recover info for this element and vertex:*/
+			/*recovers info for this element and vertex:*/
 			IssmDouble late= asin(zze[e]/sqrt( pow(xxe[e],2.0)+ pow(yye[e],2.0)+ pow(zze[e],2.0)));
 			IssmDouble longe= atan2(yye[e],xxe[e]);
@@ -6394,5 +6512,5 @@
 			longi=longitude[i];
 
-			/*Compute alpha angle between centroid and current vertex and index into precomputed tables: */
+			/*Computes alpha angle between centroid and current vertex, and indexes alpha in precomputed tables: */
 			delPhi=fabs(lati-late); delLambda=fabs(longi-longe); if (delLambda>M_PI)delLambda=2*M_PI-delLambda;
 			alpha=2.*asin(sqrt(pow(sin(delPhi/2),2)+cos(lati)*cos(late)*pow(sin(delLambda/2),2)));
@@ -6462,13 +6580,26 @@
 	/*Compute rotation kernel:{{{*/
 	if(computerotation){
+		//initialization
+		LoveRotRSL  = xNewZeroInit<IssmDouble>(nt);
+		LoveRotU    = xNewZeroInit<IssmDouble>(nt);
+		LoveRothoriz= xNewZeroInit<IssmDouble>(nt);
+		Grot        = xNewZeroInit<IssmDouble>(3*3*nt); //3 polar motion components * 3 vertices * number of time steps
+		GUrot       = xNewZeroInit<IssmDouble>(3*3*nt);
+
+		if (horiz){
+			GErot=xNewZeroInit<IssmDouble>(3*3*nt);
+			GNrot=xNewZeroInit<IssmDouble>(3*3*nt);
+		}
 
 		/*What is the gravity at planet's surface: */
 		g=4.0/3.0*M_PI*rho_earth*NewtonG*planetradius;
-
-		//Amplitude of the rotational feedback
-		LoveRotRSL=((1.0+tide_love_k[2]-tide_love_h[2])/g)*pow(omega*planetradius,2.0);
-		LoveRotU=(tide_love_h[2]/g)*pow(omega*planetradius,2.0);
-		LoveRothoriz=(tide_love_l[2]/g)*pow(omega*planetradius,2.0);
-
+		cent_scaling=pow(omega*planetradius,2.0); //centrifugal potential dimensioning constant
+		for(int t=0;t<nt;t++){
+			//Amplitude of the rotational feedback
+			//to speed up calculation we include the dimension constant r^2*Omega^2/g, so all 3 of these are in meters
+			LoveRotRSL[t]=((1.0+tide_love_k[t]-tide_love_h[t])/g)*cent_scaling;
+			LoveRotU[t]=(tide_love_h[t]/g)*cent_scaling;
+			if (horiz) LoveRothoriz[t]=(tide_love_l[t]/g)*cent_scaling;
+		}
 		for(int i=0;i<3;i++){
 
@@ -6489,25 +6620,14 @@
 			longi=longitude[i];
 
-			//Spherical harmonic functions of degree 2
+			//Spherical harmonic functions of degree 2 (spatial pattern of rotation)
 			Y21cos= -0.5*sin(2.*lati)*cos(longi);
 			Y21sin= -0.5*sin(2.*lati)*sin(longi);
 			Y20   = -(1.0/6.0 - 0.5*cos(2.0*lati));
 
-			Grotm1[i]= LoveRotRSL*Y21cos;
-			Grotm2[i]= LoveRotRSL*Y21sin;
-			Grotm3[i]= LoveRotRSL*Y20;
-
-			if (computeelastic){
-				GUrotm1[i]= LoveRotU*Y21cos;
-				GUrotm2[i]= LoveRotU*Y21sin;
-				GUrotm3[i]= LoveRotU*Y20;
-				if (horiz){
+			if (computeelastic && horiz){
 				//bed_N = Love_l * d(Y)/dlat ;
 				dY21cos_dlat=-cos(2.*lati)*cos(longi);
 				dY21sin_dlat=-cos(2.*lati)*sin(longi);
 				dY20_dlat=   -sin(2.*lati);
-				GNrotm1[i]= LoveRothoriz*dY21cos_dlat;
-				GNrotm2[i]= LoveRothoriz*dY21sin_dlat;
-				GNrotm3[i]= LoveRothoriz*dY20_dlat;
 
 				//bed_E = Love_l * 1/cos(lat) * d(Y)/dlon ;
@@ -6515,25 +6635,36 @@
 				dY21sin_dlon=Y21cos/cos(lati);
 				//dY20_dlon=0.;
-
-				GErotm1[i]= LoveRothoriz*dY21cos_dlon;
-				GErotm2[i]= LoveRothoriz*dY21sin_dlon;
-				GErotm3[i]= 0.0;
+			}
+
+			for(int t=0;t<nt;t++){
+
+				Grot[0*3*nt+i*nt+t]= LoveRotRSL[t]*Y21cos; //x component of polar motion
+				Grot[1*3*nt+i*nt+t]= LoveRotRSL[t]*Y21sin; //y
+				Grot[2*3*nt+i*nt+t]= LoveRotRSL[t]*Y20;    //z
+
+				if (computeelastic){
+					GUrot[0*3*nt+i*nt+t]= LoveRotU[t]*Y21cos;
+					GUrot[1*3*nt+i*nt+t]= LoveRotU[t]*Y21sin;
+					GUrot[2*3*nt+i*nt+t]= LoveRotU[t]*Y20;
+					if (horiz){
+						//bed_N = Love_l * d(Y)/dlat ;
+						GNrot[0*3*nt+i*nt+t]= LoveRothoriz[t]*dY21cos_dlat;
+						GNrot[1*3*nt+i*nt+t]= LoveRothoriz[t]*dY21sin_dlat;
+						GNrot[2*3*nt+i*nt+t]= LoveRothoriz[t]*dY20_dlat;
+
+						//bed_E = Love_l * 1/cos(lat) * d(Y)/dlon ;
+						GErot[0*3*nt+i*nt+t]= LoveRothoriz[t]*dY21cos_dlon;
+						GErot[1*3*nt+i*nt+t]= LoveRothoriz[t]*dY21sin_dlon;
+						GErot[2*3*nt+i*nt+t]= 0.0;
+					}
 				}
 			}
 		}
-		this->AddInput(SealevelGrotm1Enum,&Grotm1[0],P1Enum);
-		this->AddInput(SealevelGrotm2Enum,&Grotm2[0],P1Enum);
-		this->AddInput(SealevelGrotm3Enum,&Grotm3[0],P1Enum);
+		this->inputs->SetArrayInput(SealevelchangeGrotEnum,this->lid,Grot,3*3*nt);
 		if (computeelastic){
-			this->AddInput(SealevelGUrotm1Enum,&GUrotm1[0],P1Enum);
-			this->AddInput(SealevelGUrotm2Enum,&GUrotm2[0],P1Enum);
-			this->AddInput(SealevelGUrotm3Enum,&GUrotm3[0],P1Enum);
+			this->inputs->SetArrayInput(SealevelchangeGUrotEnum,this->lid,GUrot,3*3*nt);
 			if(horiz){
-				this->AddInput(SealevelGNrotm1Enum,&GNrotm1[0],P1Enum);
-				this->AddInput(SealevelGNrotm2Enum,&GNrotm2[0],P1Enum);
-				this->AddInput(SealevelGNrotm3Enum,&GNrotm3[0],P1Enum);
-				this->AddInput(SealevelGErotm1Enum,&GErotm1[0],P1Enum);
-				this->AddInput(SealevelGErotm2Enum,&GErotm2[0],P1Enum);
-				this->AddInput(SealevelGErotm3Enum,&GErotm3[0],P1Enum);
+				this->inputs->SetArrayInput(SealevelchangeGNrotEnum,this->lid,GNrot,3*3*nt);
+				this->inputs->SetArrayInput(SealevelchangeGErotEnum,this->lid,GErot,3*3*nt);
 			}
 		}
@@ -6551,6 +6682,6 @@
 			viscousN=xNewZeroInit<IssmDouble>(3*nt);
 			viscousE=xNewZeroInit<IssmDouble>(3*nt);
-			this->inputs->SetArrayInput(SealevelchangeViscousNEnum,this->lid,viscousRSL,3*nt);
-			this->inputs->SetArrayInput(SealevelchangeViscousEEnum,this->lid,viscousU,3*nt);
+			this->inputs->SetArrayInput(SealevelchangeViscousNEnum,this->lid,viscousN,3*nt);
+			this->inputs->SetArrayInput(SealevelchangeViscousEEnum,this->lid,viscousE,3*nt);
 		}
 	}
@@ -6566,4 +6697,12 @@
 			delete GE;
 		}
+		if(computerotation){
+			delete Grot;
+			delete GUrot;
+			if (horiz){
+				delete GNrot;
+				delete GErot;
+			}
+		}
 	}
 	#else
@@ -6574,4 +6713,12 @@
 			xDelete(GN);
 			xDelete(GE);
+		}
+		if(computerotation){
+			xDelete(Grot);
+			xDelete(GUrot);
+			if (horiz){
+				xDelete(GNrot);
+				xDelete(GErot);
+			}
 		}
 	}
@@ -7127,5 +7274,5 @@
 }
 /*}}}*/
-void       Tria::SealevelchangeUpdateViscousFields(){ /*{{{*/
+void       Tria::SealevelchangeUpdateViscousFields(IssmDouble lincoeff, int newindex, int offset){ /*{{{*/
 
 	/*Inputs:*/
@@ -7134,13 +7281,8 @@
 	IssmDouble* viscousN=NULL;
 	IssmDouble* viscousE=NULL;
-	IssmDouble* viscoustimes=NULL;
 	int         viscousnumsteps;
-	int         viscousindex=0; 
-	int         newindex=0; 
 	int         dummy;
 	bool        viscous=false;
-	IssmDouble  currenttime;
-	IssmDouble  lincoeff=0;
-	int horiz;
+	int	    horiz=0;
 
 	this->parameters->FindParam(&viscous,SolidearthSettingsViscousEnum);
@@ -7148,9 +7290,5 @@
 	if(viscous){
 		this->parameters->FindParam(&horiz,SolidearthSettingsHorizEnum);
-
 		this->parameters->FindParam(&viscousnumsteps,SealevelchangeViscousNumStepsEnum);
-		this->parameters->FindParam(&viscoustimes,NULL,SealevelchangeViscousTimesEnum);
-		this->parameters->FindParam(&viscousindex,SealevelchangeViscousIndexEnum);
-		this->parameters->FindParam(&currenttime,TimeEnum);
 
 		this->inputs->GetArrayPtr(SealevelchangeViscousRSLEnum,this->lid,&viscousRSL,&dummy);
@@ -7161,21 +7299,4 @@
 		}
 
-		bool foundtime=false;
-		int offset=1;
-		lincoeff=0;
-		newindex=viscousnumsteps-2;
-
-		for(int t=viscousindex;t<viscousnumsteps;t++){
-			if (viscoustimes[t]>currenttime){
-				newindex=t-1;
-				lincoeff=(currenttime-viscoustimes[newindex])/(viscoustimes[t]-viscoustimes[newindex]);
-				foundtime=true;
-				offset=0;
-				break;
-			}
-		}
-
-		if(!foundtime) lincoeff=1;
-		viscoustimes[newindex]=currenttime;
 		for(int i=0;i<NUMVERTICES;i++){
 			viscousRSL[i*viscousnumsteps+newindex+offset]=(1-lincoeff)*viscousRSL[i*viscousnumsteps+newindex]+lincoeff*viscousRSL[i*viscousnumsteps+newindex+1];
@@ -7186,11 +7307,5 @@
 			}
 		}
-		viscousindex=newindex+offset;
-
-		this->parameters->SetParam(viscousindex,SealevelchangeViscousIndexEnum);
-		this->parameters->SetParam(viscoustimes,viscousnumsteps,SealevelchangeViscousTimesEnum);
-
-		/*free allocations:*/
-		xDelete<IssmDouble>(viscoustimes);
+
 	}
 
@@ -7198,4 +7313,6 @@
 /*}}}*/
 void       Tria::SealevelchangeBarystaticLoads(GrdLoads* loads,  BarystaticContributions* barycontrib, SealevelGeometry* slgeom){ /*{{{*/
+
+	int nel;
 
 	/*Inputs:*/
@@ -7203,4 +7320,5 @@
 	IssmDouble W[NUMVERTICES];
 	IssmDouble BP[NUMVERTICES];
+	IssmDouble* areae=NULL;
 
 	/*output: */
@@ -7219,4 +7337,5 @@
 	this->parameters->FindParam(&rho_water,MaterialsRhoSeawaterEnum);
 	this->parameters->FindParam(&rho_freshwater,MaterialsRhoFreshwaterEnum);
+	this->parameters->FindParam(&areae,&nel,AreaeEnum);
 
 	/*Retrieve inputs:*/
@@ -7243,4 +7362,5 @@
 
 	/*Compute barystatic component in kg:*/
+	// Note: Iavg, etc, already include partial area factor phi for subelement loading
 	bslcice =   -slgeom->LoadArea[SLGEOM_ICE][this->lid]*Iavg;
 	bslchydro = -slgeom->LoadArea[SLGEOM_WATER][this->lid]*Wavg;
@@ -7267,5 +7387,5 @@
 		BPavg=0;
 	}
-	/*Plug remaining values into centroi load vector:*/
+	/*Plug remaining values into centroid load vector:*/
 	loads->vloads->SetValue(this->sid,Iavg+Wavg+BPavg,INS_VAL);
 
@@ -7279,4 +7399,5 @@
 	/*sal green function:*/
 	IssmDouble* G=NULL;
+	IssmDouble* Grot=NULL;
 	IssmDouble* Gsub[SLGEOM_NUMLOADS];
 	bool computefuture=false;
@@ -7288,7 +7409,5 @@
 	int  size;
 	int  nel,nbar;
-	IssmDouble Grotm1[3];
-	IssmDouble Grotm2[3];
-	IssmDouble Grotm3[3];
+
 
 	this->parameters->FindParam(&sal,SolidearthSettingsSelfAttractionEnum);
@@ -7302,24 +7421,13 @@
 		this->inputs->GetArrayPtr(SealevelchangeGsubelHydroEnum,this->lid,&Gsub[SLGEOM_WATER],&size);
 		this->inputs->GetArrayPtr(SealevelchangeGsubelOceanEnum,this->lid,&Gsub[SLGEOM_OCEAN],&size);
-
-		this->SealevelchangeGxL(sealevelpercpu, G, Gsub, loads, slgeom, nel,percpu=true,SealevelchangeViscousRSLEnum,computefuture=false);
-	}
-
-	if(rotation){
-		Element::GetInputListOnVertices(&Grotm1[0],SealevelGrotm1Enum);
-		Element::GetInputListOnVertices(&Grotm2[0],SealevelGrotm2Enum);
-		Element::GetInputListOnVertices(&Grotm3[0],SealevelGrotm3Enum);
-
-		for(int i=0;i<NUMVERTICES;i++){
-			if(slgeom->lids[this->vertices[i]->lid]==this->lid){
-				sealevelpercpu[this->vertices[i]->lid]+=Grotm1[i]*polarmotionvector[0]+Grotm2[i]*polarmotionvector[1]+Grotm3[i]*polarmotionvector[2];
-			}
-		}
-	}
+		if (rotation)	this->inputs->GetArrayPtr(SealevelchangeGrotEnum,this->lid,&Grot,&size);
+
+		this->SealevelchangeGxL(sealevelpercpu, G, Gsub, Grot, loads, polarmotionvector, slgeom, nel,percpu=true,SealevelchangeViscousRSLEnum,computefuture=false);
+	}
+
 	return;
 } /*}}}*/
 void       Tria::SealevelchangeOceanAverage(GrdLoads* loads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble* sealevelpercpu, SealevelGeometry* slgeom){ /*{{{*/
 
-	/*sal green function:*/
 	IssmDouble oceanaverage=0;
 	IssmDouble oceanarea=0;
@@ -7369,4 +7477,8 @@
 	IssmDouble* GE=NULL;
 	IssmDouble* GN=NULL;
+	IssmDouble* Grot=NULL;
+	IssmDouble* GUrot=NULL;
+	IssmDouble* GNrot=NULL;
+	IssmDouble* GErot=NULL;
 	IssmDouble* Gsub[SLGEOM_NUMLOADS];
 	IssmDouble* GUsub[SLGEOM_NUMLOADS];
@@ -7377,16 +7489,5 @@
 	int horiz;
 	int size;
-	IssmDouble Grotm1[3];
-	IssmDouble Grotm2[3];
-	IssmDouble Grotm3[3];
-	IssmDouble GUrotm1[3];
-	IssmDouble GUrotm2[3];
-	IssmDouble GUrotm3[3];
-	IssmDouble GNrotm1[3];
-	IssmDouble GNrotm2[3];
-	IssmDouble GNrotm3[3];
-	IssmDouble GErotm1[3];
-	IssmDouble GErotm2[3];
-	IssmDouble GErotm3[3];
+
 	bool rotation= false;
 	bool elastic=false;
@@ -7424,51 +7525,20 @@
 				this->inputs->GetArrayPtr(SealevelchangeGEsubelOceanEnum,this->lid,&GEsub[SLGEOM_OCEAN],&size);
 			}
-		}
-		this->SealevelchangeGxL(&RSLGrd[0],G, Gsub, loads, slgeom, nel,percpu=false,SealevelchangeViscousRSLEnum,computefuture=true);
+			if (rotation) {
+				this->inputs->GetArrayPtr(SealevelchangeGrotEnum,this->lid,&Grot,&size);
+				this->inputs->GetArrayPtr(SealevelchangeGUrotEnum,this->lid,&GUrot,&size);
+				if (horiz){
+					this->inputs->GetArrayPtr(SealevelchangeGErotEnum,this->lid,&GErot,&size);
+					this->inputs->GetArrayPtr(SealevelchangeGNrotEnum,this->lid,&GNrot,&size);
+				}
+			}
+		}
+		this->SealevelchangeGxL(&RSLGrd[0],G, Gsub, Grot, loads, polarmotionvector, slgeom, nel,percpu=false,SealevelchangeViscousRSLEnum,computefuture=true);
 
 		if(elastic){
-			this->SealevelchangeGxL(&UGrd[0],GU, GUsub, loads, slgeom, nel,percpu=false,SealevelchangeViscousUEnum,computefuture=true);
-			if(horiz ){
-				this->SealevelchangeGxL(&NGrd[0],GN, GNsub, loads, slgeom, nel,percpu=false,SealevelchangeViscousNEnum,computefuture=true);
-				this->SealevelchangeGxL(&EGrd[0],GE, GEsub, loads, slgeom, nel,percpu=false,SealevelchangeViscousEEnum,computefuture=true);
-			}
-		}
-	}
-
-	if(rotation){
-		Element::GetInputListOnVertices(&Grotm1[0],SealevelGrotm1Enum);
-		Element::GetInputListOnVertices(&Grotm2[0],SealevelGrotm2Enum);
-		Element::GetInputListOnVertices(&Grotm3[0],SealevelGrotm3Enum);
-
-		for(int i=0;i<NUMVERTICES;i++){
-			if(slgeom->lids[this->vertices[i]->lid]==this->lid){
-				RSLGrd[i]+=Grotm1[i]*polarmotionvector[0]+Grotm2[i]*polarmotionvector[1]+Grotm3[i]*polarmotionvector[2];
-			}
-		}
-
-		if (elastic){
-			Element::GetInputListOnVertices(&GUrotm1[0],SealevelGUrotm1Enum);
-			Element::GetInputListOnVertices(&GUrotm2[0],SealevelGUrotm2Enum);
-			Element::GetInputListOnVertices(&GUrotm3[0],SealevelGUrotm3Enum);
-
-			for(int i=0;i<NUMVERTICES;i++){
-				if(slgeom->lids[this->vertices[i]->lid]==this->lid){
-					UGrd[i]+=GUrotm1[i]*polarmotionvector[0]+GUrotm2[i]*polarmotionvector[1]+GUrotm3[i]*polarmotionvector[2];
-				}
-			}
-			if (horiz){
-				Element::GetInputListOnVertices(&GNrotm1[0],SealevelGNrotm1Enum);
-				Element::GetInputListOnVertices(&GNrotm2[0],SealevelGNrotm2Enum);
-				Element::GetInputListOnVertices(&GNrotm3[0],SealevelGNrotm3Enum);
-				Element::GetInputListOnVertices(&GErotm1[0],SealevelGErotm1Enum);
-				Element::GetInputListOnVertices(&GErotm2[0],SealevelGErotm2Enum);
-				Element::GetInputListOnVertices(&GErotm3[0],SealevelGErotm3Enum);
-
-				for(int i=0;i<NUMVERTICES;i++){
-					if(slgeom->lids[this->vertices[i]->lid]==this->lid){
-						NGrd[i]+=GNrotm1[i]*polarmotionvector[0]+GNrotm2[i]*polarmotionvector[1]+GNrotm3[i]*polarmotionvector[2];
-						EGrd[i]+=GErotm1[i]*polarmotionvector[0]+GErotm2[i]*polarmotionvector[1]+GErotm3[i]*polarmotionvector[2];
-					}
-				}
+			this->SealevelchangeGxL(&UGrd[0],GU, GUsub, GUrot, loads, polarmotionvector, slgeom, nel,percpu=false,SealevelchangeViscousUEnum,computefuture=true);
+			if(horiz){
+				this->SealevelchangeGxL(&NGrd[0],GN, GNsub, GNrot, loads, polarmotionvector, slgeom, nel,percpu=false,SealevelchangeViscousNEnum,computefuture=true);
+				this->SealevelchangeGxL(&EGrd[0],GE, GEsub, GErot, loads, polarmotionvector, slgeom, nel,percpu=false,SealevelchangeViscousEEnum,computefuture=true);
 			}
 		}
@@ -7495,27 +7565,46 @@
 
 } /*}}}*/
-void       Tria::SealevelchangeGxL(IssmDouble* grdfieldout, IssmDouble* G, IssmDouble** Gsub, GrdLoads* loads, SealevelGeometry* slgeom, int nel, bool percpu, int viscousenum, bool computefuture) { /*{{{*/
+void       Tria::SealevelchangeGxL(IssmDouble* grdfieldout, IssmDouble* G, IssmDouble** Gsub, IssmDouble* Grot, GrdLoads* loads, IssmDouble* polarmotionvector, SealevelGeometry* slgeom, int nel, bool percpu, int viscousenum, bool computefuture) { /*{{{*/
+
+	//This function performs the actual convolution between Green functions and surface Loads for a particular grd field
 
 	IssmDouble* grdfield=NULL;
 	int i,e,l,t,nbar;
 	bool computeviscous=false;
+	bool rotation=false;
 	IssmDouble* viscousfield=NULL;
-	int nt=1; //important
+	int nt=1; //important, ensures there is a defined value if computeviscous is false
 	int viscousindex=0; //important
 	int viscousnumsteps=1; //important
 
 	this->parameters->FindParam(&computeviscous,SolidearthSettingsViscousEnum);
+	this->parameters->FindParam(&rotation,SolidearthSettingsRotationEnum);
 	if(computeviscous){
 		this->parameters->FindParam(&viscousnumsteps,SealevelchangeViscousNumStepsEnum);
-		if(computefuture) nt=viscousnumsteps;
+		this->parameters->FindParam(&viscousindex,SealevelchangeViscousIndexEnum);
+		if(computefuture) {
+			nt=viscousnumsteps-viscousindex+2; //number of time steps remaining to reach final_time, +1 is sufficient with no adaptative time stepping, +2 necessary otherwise; we assume the safe choice here for the sake of simplicity
+			if (nt>viscousnumsteps) nt=viscousnumsteps;
+		}
 		else nt=1;
-
-		//allocate
-		grdfield=xNewZeroInit<IssmDouble>(3*nt);
-	}
-	else grdfield=xNewZeroInit<IssmDouble>(3*nt);
-
-	if(loads->sealevelloads){
-
+	}
+	//allocate
+	grdfield=xNewZeroInit<IssmDouble>(3*nt);
+
+	if(rotation){ //add rotational feedback
+		for(int i=0;i<NUMVERTICES;i++){ //vertices
+			if(slgeom->lids[this->vertices[i]->lid]==this->lid){
+				for (int m=0;m<3;m++){ //polar motion components
+					for(t=0;t<nt;t++){ //time
+						int index=m*3*viscousnumsteps+i*viscousnumsteps+t;
+						grdfield[i*nt+t]+=Grot[index]*polarmotionvector[m];
+					}
+				}
+			}
+		}
+	}
+
+
+	if(loads->sealevelloads){ // general case: loads + sealevel loads
 		for(i=0;i<NUMVERTICES;i++) {
 			if(slgeom->lids[this->vertices[i]->lid]!=this->lid)continue;
@@ -7546,5 +7635,4 @@
 	}
 	else{  //this is the initial convolution where only loads are provided
-
 		for(i=0;i<NUMVERTICES;i++) {
 			if(slgeom->lids[this->vertices[i]->lid]!=this->lid)continue;
@@ -7567,5 +7655,10 @@
 	}
 
-	if(computeviscous){
+	if(computeviscous){ /*{{{*/
+		// we need to do up to 3 things (* = only if computefuture)
+		// 1*: add new grdfield contribution to the viscous stack for future time steps
+		// 2: collect viscous grdfield from past loads due at present-day and add it to grdfield[current_time]
+		// 3*: subtract from viscous stack the grdfield that has already been accounted for so we don't add it again at the next time step
+
 		IssmDouble* grdfieldinterp=NULL;
 		IssmDouble* viscoustimes=NULL;
@@ -7574,25 +7667,23 @@
 		IssmDouble  timeacc;
 
-		this->parameters->FindParam(&viscousindex,SealevelchangeViscousIndexEnum);
 		this->parameters->FindParam(&viscoustimes,NULL,SealevelchangeViscousTimesEnum);
 		this->parameters->FindParam(&final_time,TimesteppingFinalTimeEnum);
 		this->parameters->FindParam(&timeacc,SolidearthSettingsTimeAccEnum);
 		this->inputs->GetArrayPtr(viscousenum,this->lid,&viscousfield,NULL);
+		/* Map new grdfield generated by present-day loads onto viscous time vector*/
 		if(computefuture){
-			grdfieldinterp=xNew<IssmDouble>(3*nt); 
+			grdfieldinterp=xNewZeroInit<IssmDouble>(3*viscousnumsteps); 
+			//viscousindex time and first time step of grdfield coincide, so just copy that value
+			for(int i=0;i<NUMVERTICES;i++){
+				if(slgeom->lids[this->vertices[i]->lid]!=this->lid)continue;
+				grdfieldinterp[i*viscousnumsteps+viscousindex]=  grdfield[i*nt+0];
+			}
 			if(viscoustimes[viscousindex]<final_time){
+				//And interpolate the rest of the points in the future
 				lincoeff=(viscoustimes[viscousindex+1]-viscoustimes[viscousindex])/timeacc;
-				for(int t=viscousindex;t<nt;t++){
-					if(t==viscousindex){
-						for(int i=0;i<NUMVERTICES;i++){
-							if(slgeom->lids[this->vertices[i]->lid]!=this->lid)continue;
-							grdfieldinterp[i*nt+t]=  grdfield[i*nt+0];
-						}
-					}
-					else{
-						for(int i=0;i<NUMVERTICES;i++){
-							if(slgeom->lids[this->vertices[i]->lid]!=this->lid)continue;
-							grdfieldinterp[i*nt+t]=  (1-lincoeff)*grdfield[i*nt+(t-viscousindex-1)]+lincoeff*grdfield[i*nt+(t-viscousindex)];
-						}
+				for(int t=viscousindex+1;t<viscousnumsteps;t++){
+					for(int i=0;i<NUMVERTICES;i++){
+						if(slgeom->lids[this->vertices[i]->lid]!=this->lid)continue;
+						grdfieldinterp[i*viscousnumsteps+t]=  (1-lincoeff)*grdfield[i*nt+(t-viscousindex-1)]+lincoeff*grdfield[i*nt+(t-viscousindex)];
 					}
 				}
@@ -7606,14 +7697,14 @@
 		}
 
-		if(computefuture){ /*update viscous stack with future deformation from present load: */
-
-			for(int t=nt-1;t>=viscousindex;t--){
+		/*update viscous stack with future deformation from present load: */
+		if(computefuture){
+			for(int t=viscousnumsteps-1;t>=viscousindex;t--){
 				for(int i=0;i<NUMVERTICES;i++){
 					if(slgeom->lids[this->vertices[i]->lid]!=this->lid)continue;
 					//offset viscousfield to remove all deformation that has already been added
-					viscousfield[i*viscousnumsteps+t]+=grdfieldinterp[i*nt+t]-grdfieldinterp[i*nt+viscousindex]-viscousfield[i*viscousnumsteps+viscousindex];
+					viscousfield[i*viscousnumsteps+t]+=grdfieldinterp[i*viscousnumsteps+t]-grdfieldinterp[i*viscousnumsteps+viscousindex]-viscousfield[i*viscousnumsteps+viscousindex];
 				}
 			}
-			/*Re-add viscous stack now that we updated:*/
+			/*Save viscous stack now that we updated the values:*/
 			this->inputs->SetArrayInput(viscousenum,this->lid,viscousfield,3*viscousnumsteps);
 		}
@@ -7621,5 +7712,6 @@
 		/*Free allocatoins:*/
 		xDelete<IssmDouble>(viscoustimes);
-	}
+	} 
+	/*}}}*/
 
 	/*store values computed on vertices, but don't repeat the computation if another element already computed it!:*/
@@ -7636,77 +7728,5 @@
 
 } /*}}}*/
-void       Tria::SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom){/*{{{*/
-
-	IssmDouble S=0;
-
-	/*Compute area of element:*/
-	IssmDouble area,planetarea,re;
-	IssmDouble late,longe;
-	this->Element::GetInputValue(&area,AreaEnum);
-
-	/*recover parameters: */
-	this->parameters->FindParam(&planetarea,SolidearthPlanetAreaEnum);
-	this->parameters->FindParam(&re,SolidearthPlanetRadiusEnum);
-	late=slgeom->late[this->lid]/180*M_PI;
-	longe=slgeom->longe[this->lid]/180*M_PI;
-
-	/*recover total load: */
-	if(loads->loads) S+=loads->loads[this->Sid()];
-	if(loads->sealevelloads) S+=loads->sealevelloads[this->Sid()];
-
-	/* Perturbation terms for moment of inertia (moi_list):
-	 * computed analytically (see Wu & Peltier, eqs 10 & 32)
-	 * also consistent with my GMD formulation!
-	 * ALL in geographic coordinates
-	 * */
-	dI_list[0] = -4*M_PI*(S*area)*pow(re,4)*(sin(late)*cos(late)*cos(longe))/planetarea;
-	dI_list[1] = -4*M_PI*(S*area)*pow(re,4)*(sin(late)*cos(late)*sin(longe))/planetarea;
-	dI_list[2] = +4*M_PI*(S*area)*pow(re,4)*(1-pow(sin(late),2))/planetarea;
-	return;
-}/*}}}*/
-void       Tria::SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, GrdLoads* grdloads,  SealevelGeometry* slgeom){/*{{{*/
-
-	IssmDouble  SA=0;
-	IssmDouble* loads=NULL;
-	IssmDouble* sealevelloads=NULL;
-	IssmDouble  late,longe,re;
-	int         intj;
-	IssmDouble  area;
-	IssmDouble  planetarea;
-
-	/*recover parameters: */
-	this->parameters->FindParam(&planetarea,SolidearthPlanetAreaEnum);
-	this->parameters->FindParam(&re,SolidearthPlanetRadiusEnum);
-
-	/*Initalize:*/
-	for(int i=0;i<3;i++)dI_list[i]=0;
-
-	/*Go through our loads:*/
-	for(int i=0;i<SLGEOM_NUMLOADS;i++){
-		if(slgeom->issubelement[i][this->lid]){
-			loads=grdloads->subloads[i];
-			if(i==SLGEOM_OCEAN) sealevelloads=grdloads->subsealevelloads;
-			intj=slgeom->subelementmapping[i][this->lid];
-			late=slgeom->latbarycentre[i][intj]/180*M_PI;
-			longe=slgeom->longbarycentre[i][intj]/180*M_PI;
-			area=slgeom->area_subel[i][intj];
-
-			/*recover total load: */
-			if(loads) SA+=loads[intj]*area;
-			if(sealevelloads) SA+=sealevelloads[intj]*area;
-		}
-	}
-
-	/* Perturbation terms for moment of inertia (moi_list):
-	 * computed analytically (see Wu & Peltier, eqs 10 & 32)
-	 * also consistent with my GMD formulation!
-	 * ALL in geographic coordinates
-	 * */
-	dI_list[0] += -4*M_PI*(SA)*pow(re,4)*(sin(late)*cos(late)*cos(longe))/planetarea;
-	dI_list[1] += -4*M_PI*(SA)*pow(re,4)*(sin(late)*cos(late)*sin(longe))/planetarea;
-	dI_list[2] += +4*M_PI*(SA)*pow(re,4)*(1-pow(sin(late),2))/planetarea;
-
-	return;
-}/*}}}*/
+
 void       Tria::SealevelchangeShift(GrdLoads* loads,  IssmDouble offset, SealevelGeometry* slgeom){ /*{{{*/
 
Index: /issm/trunk/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk/src/c/classes/Elements/Tria.h	(revision 27034)
+++ /issm/trunk/src/c/classes/Elements/Tria.h	(revision 27035)
@@ -55,8 +55,10 @@
 		void        AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part);
 		void			CalvingRateVonmises();
+		void			CalvingRateTest();
 		void        CalvingCrevasseDepth();
 		void			CalvingRateLevermann();
 		void			CalvingFluxLevelset();
 		void			CalvingMeltingFluxLevelset();
+		void			CalvingRateParameterization();
 		IssmDouble  CharacteristicLength(void);
 		void        ComputeBasalStress(void);
@@ -64,4 +66,5 @@
 		void        ComputeEsaStrainAndVorticity();
 		void        ComputeSigmaNN();
+		void        ComputeSigmaVM();
 		void        ComputeStressTensor();
 		void        ComputeSurfaceNormalVelocity();
@@ -177,7 +180,5 @@
 		void       SealevelchangeDeformationConvolution(IssmDouble* sealevelpercpu, GrdLoads* loads, IssmDouble* rotationvector,SealevelGeometry* slgeom);
 		void       SealevelchangeShift(GrdLoads* loads,  IssmDouble offset, SealevelGeometry* slgeom);
-		void       SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, GrdLoads* loads,  SealevelGeometry* slgeom);
-		void       SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom);
-		void       SealevelchangeUpdateViscousFields();
+		void       SealevelchangeUpdateViscousFields(IssmDouble lincoeff, int newindex, int offset);
 		#endif
 		/*}}}*/
@@ -243,5 +244,5 @@
 		void           UpdateConstraintsExtrudeFromBase(void);
 		void           UpdateConstraintsExtrudeFromTop(void);
-		void           SealevelchangeGxL(IssmDouble* sealevel, IssmDouble* G, IssmDouble** Gsub, GrdLoads* loads, SealevelGeometry* slgeom, int nel, bool percpu,int stackenum,bool computefuture);
+		void           SealevelchangeGxL(IssmDouble* sealevel, IssmDouble* G, IssmDouble** Gsub, IssmDouble* Grot, GrdLoads* loads, IssmDouble* polarmotionvector,SealevelGeometry* slgeom, int nel, bool percpu,int stackenum,bool computefuture);
 		/*}}}*/
 
Index: /issm/trunk/src/c/classes/ExternalResults/GenericExternalResult.h
===================================================================
--- /issm/trunk/src/c/classes/ExternalResults/GenericExternalResult.h	(revision 27034)
+++ /issm/trunk/src/c/classes/ExternalResults/GenericExternalResult.h	(revision 27035)
@@ -227,5 +227,4 @@
 } /*}}}*/
 template <> inline void GenericExternalResult<bool>::Marshall(MarshallHandle* marshallhandle){/*{{{*/
-	printf("-------------- file: GenericExternalResult.h line: %i\n",__LINE__); 
 	this->GenericMarshall(marshallhandle);
 
@@ -331,5 +330,4 @@
 } /*}}}*/
 template <> inline void GenericExternalResult<char*>::Marshall(MarshallHandle* marshallhandle){/*{{{*/
-	printf("-------------- file: GenericExternalResult.h line: %i\n",__LINE__); 
 	marshallhandle->call(this->id);
 	marshallhandle->call(this->result_name);
@@ -456,5 +454,4 @@
 } /*}}}*/
 template <> inline void GenericExternalResult<int*>::Marshall(MarshallHandle* marshallhandle){/*{{{*/
-	printf("-------------- file: GenericExternalResult.h line: %i\n",__LINE__);
 
 	int object_enum = this->ObjectEnum();
@@ -590,5 +587,4 @@
 } /*}}}*/
 template <> inline void GenericExternalResult<IssmPDouble*>::Marshall(MarshallHandle* marshallhandle){/*{{{*/
-	printf("-------------- file: GenericExternalResult.h line: %i\n",__LINE__); 
 
 	int object_enum = this->ObjectEnum();
Index: /issm/trunk/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk/src/c/classes/FemModel.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/FemModel.cpp	(revision 27035)
@@ -576,12 +576,12 @@
 }
 /*}}}*/
-void FemModel::Restart(){ /*{{{*/
-
-	FILE* restartfid=NULL;
-	char* restartfilename = NULL;
-	int   femmodel_size=0;
-	int   fread_return=0;
-	char* femmodel_buffer=NULL;
-	char* femmodel_buffer_ini=NULL;
+void FemModel::Restart(int verboselevel){ /*{{{*/
+
+	FILE *restartfid          = NULL;
+	char *restartfilename     = NULL;
+	int   femmodel_size       = 0;
+	int   fread_return        = 0;
+	char *femmodel_buffer     = NULL;
+	char *femmodel_buffer_ini = NULL;
 
 	/*First, recover the name of the restart file: */
@@ -597,9 +597,17 @@
 
 	/*Print banner*/
-	_printf0_("                                                                    \n");
-	_printf0_("====================================================================\n");
-	_printf0_(" RESTART DETECTED: "<<restartfilename<<                            "\n");
-	_printf0_("====================================================================\n");
-	_printf0_("                                                                    \n");
+   if(verboselevel>1){
+      _printf0_("                                                                    \n");
+      _printf0_("====================================================================\n");
+      _printf0_(" RESTART DETECTED: "<<restartfilename<<                            "\n");
+      _printf0_("====================================================================\n");
+      _printf0_("                                                                    \n");
+   }
+   else if(verboselevel==1){
+      _printf0_("    == restarting from "<<restartfilename<<"\n");
+   }
+   else{
+      /*Do not print anything*/
+   }
 
 	/*Figure out size of buffer to be read: */
@@ -645,5 +653,5 @@
 
 	/*Read files*/
-	this->Restart();
+	this->Restart(1);
 
 	/*Clean up and return*/
@@ -3097,5 +3105,5 @@
 void FemModel::UpdateConstraintsx(void){ /*{{{*/
 
-	IssmDouble time;
+	IssmDouble time,yts;
 	int        analysis_type,config_type;
 
@@ -3104,4 +3112,5 @@
 	parameters->FindParam(&config_type,ConfigurationTypeEnum);
 	parameters->FindParam(&time,TimeEnum);
+	parameters->FindParam(&yts,ConstantsYtsEnum);
 
 	int index=AnalysisIndex(config_type);
@@ -3109,5 +3118,5 @@
 
 	/*start module: */
-	if(VerboseModule()) _printf0_("   Updating constraints and active domain of analysis " << EnumToStringx(analysis_type)  << " for time: " << time << "\n");
+	if(VerboseModule()) _printf0_("   Updating constraints and active domain of analysis " << EnumToStringx(analysis_type)  << " for time: " << time/yts << "\n");
 
 	Analysis* analysis= EnumToAnalysis(analysis_type);
@@ -3121,6 +3130,5 @@
 	NodesDofx(nodes,parameters);
 
-}
-/*}}}*/
+}/*}}}*/
 int  FemModel::UpdateVertexPositionsx(void){ /*{{{*/
 
@@ -3211,5 +3219,5 @@
 	this->parameters->FindParam(&temp,FlowequationIsSSAEnum); iomodel->AddConstant(new IoConstant(temp,"md.flowequation.isSSA"));
 	this->parameters->FindParam(&temp,FlowequationIsL1L2Enum); iomodel->AddConstant(new IoConstant(temp,"md.flowequation.isL1L2"));
-	this->parameters->FindParam(&temp,FlowequationIsMLHOEnum); iomodel->AddConstant(new IoConstant(temp,"md.flowequation.isMLHO"));
+	this->parameters->FindParam(&temp,FlowequationIsMOLHOEnum); iomodel->AddConstant(new IoConstant(temp,"md.flowequation.isMOLHO"));
 	this->parameters->FindParam(&temp,FlowequationIsHOEnum); iomodel->AddConstant(new IoConstant(temp,"md.flowequation.isHO"));
 	this->parameters->FindParam(&temp,FlowequationIsFSEnum); iomodel->AddConstant(new IoConstant(temp,"md.flowequation.isFS"));
Index: /issm/trunk/src/c/classes/FemModel.h
===================================================================
--- /issm/trunk/src/c/classes/FemModel.h	(revision 27034)
+++ /issm/trunk/src/c/classes/FemModel.h	(revision 27035)
@@ -83,5 +83,5 @@
 		void InitFromFids(char* rootpath, FILE* IOMODEL, FILE* toolkitsoptionsfid, int in_solution_type, bool trace, IssmPDouble* X=NULL);
 		void Marshall(MarshallHandle* marshallhandle);
-		void Restart(void);
+		void Restart(int verboselevel=2);
 		void RestartAD(int step);
 		void SetCurrentConfiguration(int configuration_type);
Index: /issm/trunk/src/c/classes/GrdLoads.cpp
===================================================================
--- /issm/trunk/src/c/classes/GrdLoads.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/GrdLoads.cpp	(revision 27035)
@@ -68,2 +68,54 @@
 
 } /*}}}*/
+void GrdLoads::SHDegree2Coefficients(IssmDouble* deg2coeff, FemModel* femmodel, SealevelGeometry* slgeom){
+
+	IssmDouble area,re, S;
+	int ylmindex, intj;
+	IssmDouble deg2coeff_local[5];
+
+	femmodel->parameters->FindParam(&re,SolidearthPlanetRadiusEnum);
+
+	for (int c=0;c<5;c++) deg2coeff_local[c]=0;
+
+	for(Object* & object : femmodel->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
+		//first, loads on centroids
+		S=0;
+		S+=loads[element->Sid()];
+
+		if(sealevelloads) S+=sealevelloads[element->Sid()];
+		if(S!=0){
+			element->Element::GetInputValue(&area,AreaEnum);
+
+			for (int c=0;c<5;c++){ //degree l=2 has 2*l+1=5 coefficients: 2,0; 2,1cos; 2,1sin; 2,2cos; 2,2sin
+				ylmindex=(4+c)*slgeom->localnel+element->lid; // starting at index=l^2
+				deg2coeff_local[c] += S*area/re/re*slgeom->Ylm[ylmindex];
+			}
+		}
+		//add loads on subelement barycenters
+		for (int i=0;i<SLGEOM_NUMLOADS;i++){
+			if (slgeom->issubelement[i][element->lid]){
+				intj=slgeom->subelementmapping[i][element->lid];
+				S=0;
+				S+=subloads[i][intj];
+				if(i==SLGEOM_OCEAN && sealevelloads) S+=subsealevelloads[intj];
+				if(S!=0){
+					area=slgeom->area_subel[i][intj];
+					for (int c=0;c<5;c++){ //degree l=2 has 2*l+1=5 coefficients
+						ylmindex=(4+c)*slgeom->localnel+element->lid; // starting at index=l^2
+						deg2coeff_local[c] += S*area/re/re*slgeom->Ylm_subel[i][ylmindex];
+					}
+				}
+			}
+		}
+	}
+
+	//sum each degree 2 coefficient across all cpus to get global total
+	ISSM_MPI_Reduce (&deg2coeff_local[0],&deg2coeff[0],1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+	ISSM_MPI_Bcast(&deg2coeff[0],1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
+	ISSM_MPI_Reduce (&deg2coeff_local[1],&deg2coeff[1],1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+	ISSM_MPI_Bcast(&deg2coeff[1],1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
+	ISSM_MPI_Reduce (&deg2coeff_local[2],&deg2coeff[2],1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+	ISSM_MPI_Bcast(&deg2coeff[2],1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
+
+} 
Index: /issm/trunk/src/c/classes/GrdLoads.h
===================================================================
--- /issm/trunk/src/c/classes/GrdLoads.h	(revision 27034)
+++ /issm/trunk/src/c/classes/GrdLoads.h	(revision 27035)
@@ -29,4 +29,5 @@
 		void BroadcastLoads(void);
 		void BroadcastSealevelLoads(void);
+		void SHDegree2Coefficients(IssmDouble* deg2coeff, FemModel* femmodel, SealevelGeometry* slgeom);
 };
 #endif  /* _SEALEVELGRDLOADS_H_ */
Index: /issm/trunk/src/c/classes/Inputs/TransientInput.cpp
===================================================================
--- /issm/trunk/src/c/classes/Inputs/TransientInput.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/Inputs/TransientInput.cpp	(revision 27035)
@@ -125,4 +125,6 @@
 void TransientInput::Marshall(MarshallHandle* marshallhandle){ /*{{{*/
 
+	bool isnull;
+
 	int object_enum = TransientInputEnum;
    marshallhandle->call(object_enum);
@@ -149,26 +151,36 @@
 	if(marshallhandle->OperationNumber()!=MARSHALLING_LOAD){
 		for(int i=0;i<this->numtimesteps;i++){
-			_assert_(this->inputs[i]);
-			object_enum = this->inputs[i]->ObjectEnum();
-			marshallhandle->call(object_enum);
-			this->inputs[i]->Marshall(marshallhandle);
+
+			//_assert_(this->inputs[i]);
+			isnull = false;
+			if(!this->inputs[i]) isnull = true;
+			marshallhandle->call(isnull);
+
+			if(!isnull){
+				object_enum = this->inputs[i]->ObjectEnum();
+				marshallhandle->call(object_enum);
+				this->inputs[i]->Marshall(marshallhandle);
+			}
 		}
 	}
 	else{
 		for(int i=0;i<this->numtimesteps;i++){
-			marshallhandle->call(object_enum);
-
-			if(object_enum==TriaInputEnum){
-				TriaInput* triainput2=new TriaInput();
-				triainput2->Marshall(marshallhandle);
-				this->inputs[i]=triainput2;
-			}
-			else if(object_enum==PentaInputEnum){
-				PentaInput* pentainput2=new PentaInput();
-				pentainput2->Marshall(marshallhandle);
-				this->inputs[i]=pentainput2;
-			}
-			else{
-				_error_("input "<<EnumToStringx(object_enum)<<" not supported");
+			marshallhandle->call(isnull);
+			if(!isnull){
+				marshallhandle->call(object_enum);
+
+				if(object_enum==TriaInputEnum){
+					TriaInput* triainput2=new TriaInput();
+					triainput2->Marshall(marshallhandle);
+					this->inputs[i]=triainput2;
+				}
+				else if(object_enum==PentaInputEnum){
+					PentaInput* pentainput2=new PentaInput();
+					pentainput2->Marshall(marshallhandle);
+					this->inputs[i]=pentainput2;
+				}
+				else{
+					_error_("input "<<EnumToStringx(object_enum)<<" not supported");
+				}
 			}
 		}
Index: /issm/trunk/src/c/classes/Loads/Channel.cpp
===================================================================
--- /issm/trunk/src/c/classes/Loads/Channel.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/Loads/Channel.cpp	(revision 27035)
@@ -603,5 +603,5 @@
 	/*Initialize Element matrix and return if necessary*/
 	Tria*  tria=(Tria*)element;
-	if(!tria->IsIceInElement() || this->boundary){
+	if(!tria->IsIceInElement() || tria->IsAllFloating() || this->boundary){
 		this->S = 0.;
 		return;
Index: /issm/trunk/src/c/classes/Loads/Penpair.cpp
===================================================================
--- /issm/trunk/src/c/classes/Loads/Penpair.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/Loads/Penpair.cpp	(revision 27035)
@@ -355,7 +355,7 @@
 				default: _error_("Approximation "<<EnumToStringx(approximation1)<<" not supported yet");
 			}
-		case MLHOApproximationEnum:
-			switch(approximation1){
-				case MLHOApproximationEnum:   return PenaltyCreateKMatrixStressbalanceSSAHO(kmax); 
+		case MOLHOApproximationEnum:
+			switch(approximation1){
+				case MOLHOApproximationEnum:   return PenaltyCreateKMatrixStressbalanceSSAHO(kmax); 
 				default: _error_("Approximation "<<EnumToStringx(approximation1)<<" not supported yet");
 			}
Index: /issm/trunk/src/c/classes/Materials/Material.h
===================================================================
--- /issm/trunk/src/c/classes/Materials/Material.h	(revision 27034)
+++ /issm/trunk/src/c/classes/Materials/Material.h	(revision 27035)
@@ -51,6 +51,6 @@
 		virtual void       ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input)=0;
 		virtual void       ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input)=0;
-		virtual void       ViscosityMLHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input)=0;
-		virtual void       ViscosityMLHOAdjoint(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input)=0;
+		virtual void       ViscosityMOLHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input)=0;
+		virtual void       ViscosityMOLHOAdjoint(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input)=0;
 		virtual void       ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* surf)=0;
 		virtual void       ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input)=0;
Index: /issm/trunk/src/c/classes/Materials/Matestar.cpp
===================================================================
--- /issm/trunk/src/c/classes/Materials/Matestar.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/Materials/Matestar.cpp	(revision 27035)
@@ -567,8 +567,8 @@
 	*pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
 }/*}}}*/
-void  Matestar::ViscosityMLHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input){/*{{{*/
-	_error_("not implemented yet");
-}/*}}}*/
-void  Matestar::ViscosityMLHOAdjoint(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input){/*{{{*/
+void  Matestar::ViscosityMOLHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input){/*{{{*/
+	_error_("not implemented yet");
+}/*}}}*/
+void  Matestar::ViscosityMOLHOAdjoint(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input){/*{{{*/
 	_error_("not implemented yet");
 }/*}}}*/
Index: /issm/trunk/src/c/classes/Materials/Matestar.h
===================================================================
--- /issm/trunk/src/c/classes/Materials/Matestar.h	(revision 27034)
+++ /issm/trunk/src/c/classes/Materials/Matestar.h	(revision 27035)
@@ -76,6 +76,6 @@
 		void       ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
 		void       ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
-		void       ViscosityMLHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input);
-		void       ViscosityMLHOAdjoint(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input);
+		void       ViscosityMOLHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input);
+		void       ViscosityMOLHOAdjoint(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input);
 		void       ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* surf);
 		void       ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
Index: /issm/trunk/src/c/classes/Materials/Matice.cpp
===================================================================
--- /issm/trunk/src/c/classes/Materials/Matice.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/Materials/Matice.cpp	(revision 27035)
@@ -394,12 +394,10 @@
 	}
 	else{
-
-		/*if no strain rate, return maximum viscosity*/
-		if(eps_eff==0.){
-			viscosity = 1.e+14/2.;
-			//viscosity=2.5*pow(10.,17);
-		}
-
+		/*if strain rate is 0., it is probably our initial guess, use an average
+		 * viscosity instead of a large one*/
+		if(eps_eff==0.) viscosity = 1.e+14/2.;
 		else{
+			/*if no strain rate, return maximum viscosity*/
+			//if(eps_eff<1.e-6) eps_eff = 1e-6;
 			viscosity=(1.-D)*B/(2.*pow(E,1./n)*pow(eps_eff,(n-1.)/n));
 		}
@@ -736,5 +734,5 @@
 	*pviscosity=viscosity;
 }/*}}}*/
-void  Matice::ViscosityMLHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vxbase_input,Input* vybase_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input){/*{{{*/
+void  Matice::ViscosityMOLHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vxbase_input,Input* vybase_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input){/*{{{*/
 
 	/*Intermediaries*/
@@ -757,5 +755,5 @@
 
 		/* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy (for a given zeta)*/
-		element->StrainRateMLHO(&epsilon[0],xyz_list,gauss,
+		element->StrainRateMOLHO(&epsilon[0],xyz_list,gauss,
 						vxbase_input,vybase_input,vxshear_input,vyshear_input,thickness_input,n_input,zeta);
 		epsilon_eff=sqrt(epsilon[0]*epsilon[0] + epsilon[1]*epsilon[1] + epsilon[2]*epsilon[2] 
@@ -797,5 +795,5 @@
 	delete gauss_seg;
 }/*}}}*/
-void  Matice::ViscosityMLHOAdjoint(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vxbase_input,Input* vybase_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input){/*{{{*/
+void  Matice::ViscosityMOLHOAdjoint(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vxbase_input,Input* vybase_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input){/*{{{*/
 
 	/* To compute the additional 5 terms in the viscosity appear in the adjoint equation*/
@@ -819,5 +817,5 @@
 
 		/* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy (for a given zeta)*/
-		element->StrainRateMLHO(&epsilon[0],xyz_list,gauss,
+		element->StrainRateMOLHO(&epsilon[0],xyz_list,gauss,
 						vxbase_input,vybase_input,vxshear_input,vyshear_input,thickness_input,n_input,zeta);
 		epsilon_eff=sqrt(epsilon[0]*epsilon[0] + epsilon[1]*epsilon[1] + epsilon[2]*epsilon[2] 
Index: /issm/trunk/src/c/classes/Materials/Matice.h
===================================================================
--- /issm/trunk/src/c/classes/Materials/Matice.h	(revision 27034)
+++ /issm/trunk/src/c/classes/Materials/Matice.h	(revision 27035)
@@ -78,6 +78,6 @@
 		void       ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
 		void       ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
-		void       ViscosityMLHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input);
-		void       ViscosityMLHOAdjoint(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input);
+		void       ViscosityMOLHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input);
+		void       ViscosityMOLHOAdjoint(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input);
 		void       ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* surf);
 		void       ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
Index: /issm/trunk/src/c/classes/Materials/Matlitho.h
===================================================================
--- /issm/trunk/src/c/classes/Materials/Matlitho.h	(revision 27034)
+++ /issm/trunk/src/c/classes/Materials/Matlitho.h	(revision 27035)
@@ -72,6 +72,6 @@
 		void       ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){_error_("not supported");};
 		void       ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){_error_("not supported");};
-		void       ViscosityMLHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input){_error_("not supported");};
-		void       ViscosityMLHOAdjoint(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input){_error_("not supported");};
+		void       ViscosityMOLHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input){_error_("not supported");};
+		void       ViscosityMOLHOAdjoint(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vxshear_input,Input* vyshear_input,Input* thickness_input,Input* n_input){_error_("not supported");};
 		void       ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* surf){_error_("not supported");};
 		void       ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){_error_("not supported");};
Index: /issm/trunk/src/c/classes/Node.cpp
===================================================================
--- /issm/trunk/src/c/classes/Node.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/Node.cpp	(revision 27035)
@@ -118,5 +118,5 @@
 				this->HardDeactivate();
 			}
-			if(in_approximation==MLHOApproximationEnum && !reCast<int>(iomodel->Data("md.mesh.vertexonbase")[io_index])){
+			if(in_approximation==MOLHOApproximationEnum && !reCast<int>(iomodel->Data("md.mesh.vertexonbase")[io_index])){
 				this->HardDeactivate();
 			}
Index: /issm/trunk/src/c/classes/Radar.h
===================================================================
--- /issm/trunk/src/c/classes/Radar.h	(revision 27034)
+++ /issm/trunk/src/c/classes/Radar.h	(revision 27035)
@@ -11,5 +11,4 @@
 
 IssmDouble OutputDefinitionsResponsex(FemModel* femmodel,int output_enum);
-void  GetVectorFromInputsx( IssmDouble** pvector, int* pvector_size, FemModel* femmodel,int name);
 
 class Radar: public Object, public Definition{
Index: /issm/trunk/src/c/classes/SealevelGeometry.cpp
===================================================================
--- /issm/trunk/src/c/classes/SealevelGeometry.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/SealevelGeometry.cpp	(revision 27035)
@@ -35,4 +35,5 @@
 		nsubel[i]=0;
 		nbar[i]=0;
+		Ylm_subel[i]= xNewZeroInit<IssmDouble>(localnel*9);
 	}
 	late=xNew<IssmDouble>(localnel);
@@ -40,4 +41,5 @@
 	isoceanin=xNew<bool>(localnel);
 	lids=xNew<int>(localnodsin);
+	Ylm=xNewZeroInit<IssmDouble>(localnel*9); // (degmax+1)^2 terms, degmax=2 
 
 }; /*}}}*/
@@ -56,5 +58,7 @@
 		xDelete<IssmDouble>(longbarycentre[i]);
 		xDelete<IssmDouble>(area_subel[i]);
-	}
+		xDelete<IssmDouble>(Ylm_subel[i]);
+	}
+	xDelete<IssmDouble>(Ylm);
 	xDelete<IssmDouble>(late);
 	xDelete<IssmDouble>(longe);
@@ -71,5 +75,9 @@
 	for (int i=0;i<SLGEOM_NUMLOADS;i++){
 		subelementmapping[i]=xNew<int>(localnel);
+		#ifdef _HAVE_PETSC_
 		GetOwnershipBoundariesFromRange(&lower_row,&dummy,nsubel[i],IssmComm::GetComm());
+		#else
+		_error_("not supported without PETSc compiled");
+		#endif
 
 		int count=0;
@@ -155,2 +163,62 @@
 
 } /*}}}*/
+void SealevelGeometry::BuildSphericalHarmonics(){ /*{{{*/
+	//builds spherical harmonics functions for degrees 0, 1, 2 on centroids/barycenters
+	//0: used for global average
+	//1: used for geocenter motion
+	//2: used for rotational feedback
+	int intj, count;
+
+	IssmDouble YlmNorm[9];
+
+	//YlmNormalization: N^2=(2*l+1)/4/pi * factorial(l-m)/factorial(l+m) if m==0
+	//             : 2*N^2 if m>0
+	// such that integral(Ylm * Ylm *YlmNorm dS) = 1 on the unit sphere.
+	YlmNorm[0]=(0.25/M_PI); //Y00
+	YlmNorm[1]=(0.75/M_PI); //Y10
+	YlmNorm[2]=(0.75/M_PI); //Y11c
+	YlmNorm[3]=YlmNorm[2];	 //Y11s
+	YlmNorm[4]=(1.25/M_PI); //Y20
+	YlmNorm[5]=(1.25/3./M_PI); //Y21c
+	YlmNorm[6]=YlmNorm[5]; //Y21s
+	YlmNorm[7]=(1.25/12./M_PI); //Y22c
+	YlmNorm[8]=YlmNorm[7]; //Y22s
+
+	for (int e=0;e<localnel;e++){
+		IssmDouble lat=late[e]*M_PI/180.;
+		IssmDouble lon=longe[e]*M_PI/180.;
+		Ylm[0*localnel+e] = 1.0 *YlmNorm[0]; //Y00
+
+		Ylm[1*localnel+e] = sin(lat)*YlmNorm[1]; //Y10
+		Ylm[2*localnel+e] = cos(lat)*cos(lon)*YlmNorm[2]; //Y11cos
+		Ylm[3*localnel+e] = cos(lat)*sin(lon)*YlmNorm[3]; //Y11sin
+
+		//Ylm[4*localnel+e] = 0.25 - 0.75*cos(2.0*lat) ; //Y20
+		Ylm[4*localnel+e] = (1.5*pow(sin(lat),2.)-0.5)*YlmNorm[4]; //Y20
+		Ylm[5*localnel+e] = 1.5*sin(2.*lat)*cos(lon)*YlmNorm[5]; //Y21cos
+		Ylm[6*localnel+e] = 1.5*sin(2.*lat)*sin(lon)*YlmNorm[6]; //Y21sin
+		Ylm[7*localnel+e] = 1.5*(1.+cos(2.*lat))*cos(2.*lon)*YlmNorm[7]; //Y22cos
+		Ylm[8*localnel+e] = 1.5*(1.+cos(2.*lat))*sin(2.*lon)*YlmNorm[8]; //Y22sin
+	}
+
+	for (int i=0;i<SLGEOM_NUMLOADS;i++){
+		for (int e=0;e<localnel;e++){
+			if (issubelement[i][e]){
+				intj=subelementmapping[i][e];
+				IssmDouble lat=latbarycentre[i][intj]*M_PI/180.;
+				IssmDouble lon=longbarycentre[i][intj]*M_PI/180.;
+				Ylm_subel[i][0*localnel+e] = 1.0*YlmNorm[0]; //Y00
+
+				Ylm_subel[i][1*localnel+e] = sin(lat)*YlmNorm[1]; //Y10
+				Ylm_subel[i][2*localnel+e] = cos(lat)*cos(lon)*YlmNorm[2]; //Y11cos
+				Ylm_subel[i][3*localnel+e] = cos(lat)*sin(lon)*YlmNorm[3]; //Y11sin
+
+				Ylm_subel[i][4*localnel+e] = (1.5*pow(sin(lat),2.)-0.5)*YlmNorm[4]; //Y20
+				Ylm_subel[i][5*localnel+e] = 1.5*sin(2.*lat)*cos(lon)*YlmNorm[5]; //Y21cos
+				Ylm_subel[i][6*localnel+e] = 1.5*sin(2.*lat)*sin(lon)*YlmNorm[6]; //Y21sin
+				Ylm_subel[i][7*localnel+e] = 1.5*(1.+cos(2.*lat))*cos(2.*lon)*YlmNorm[7]; //Y22cos
+				Ylm_subel[i][8*localnel+e] = 1.5*(1.+cos(2.*lat))*sin(2.*lon)*YlmNorm[8]; //Y22sin
+			}
+		}
+	}
+} /*}}}*/
Index: /issm/trunk/src/c/classes/SealevelGeometry.h
===================================================================
--- /issm/trunk/src/c/classes/SealevelGeometry.h	(revision 27034)
+++ /issm/trunk/src/c/classes/SealevelGeometry.h	(revision 27035)
@@ -14,4 +14,5 @@
 
 #include "../toolkits/toolkits.h"
+#include "../classes/classes.h"
 
 class SealevelGeometry{ 
@@ -30,4 +31,7 @@
 		IssmDouble* late;
 		IssmDouble* longe;
+		IssmDouble* Ylm;
+		IssmDouble* Ylm_subel[SLGEOM_NUMLOADS];
+		IssmDouble* YlmNorm[9];
 		bool* isoceanin;
 		bool*       issubelement[SLGEOM_NUMLOADS]; 
@@ -45,4 +49,5 @@
 		int GNEnum(int l);
 		int GEEnum(int l);
+		void BuildSphericalHarmonics(void);
 };
 #endif  /* _SEALEVELGEOMETRY_H_ */
Index: /issm/trunk/src/c/classes/matrix/ElementMatrix.cpp
===================================================================
--- /issm/trunk/src/c/classes/matrix/ElementMatrix.cpp	(revision 27034)
+++ /issm/trunk/src/c/classes/matrix/ElementMatrix.cpp	(revision 27035)
@@ -260,4 +260,22 @@
 	_printf_("   sglobaldoflist  (" << sglobaldoflist << "): ");
 	for(i=0;i<nrows;i++)_printf_(" " << sglobaldoflist[i]); _printf_(" \n");
+}
+/*}}}*/
+bool ElementMatrix::HasDof(int dof,int set){/*{{{*/
+
+	if(set==FsetEnum){
+		for(int i=0;i<this->nrows;i++) if(this->fglobaldoflist[i] == dof) return true;
+	}
+	else if(set==GsetEnum){
+		for(int i=0;i<this->nrows;i++) if(this->gglobaldoflist[i] == dof) return true;
+	}
+	else if(set==SsetEnum){
+		for(int i=0;i<this->nrows;i++) if(this->sglobaldoflist[i] == dof) return true;
+	}
+	else{
+		_error_("not supported yet");
+	}
+
+	return false;
 }
 /*}}}*/
Index: /issm/trunk/src/c/classes/matrix/ElementMatrix.h
===================================================================
--- /issm/trunk/src/c/classes/matrix/ElementMatrix.h	(revision 27034)
+++ /issm/trunk/src/c/classes/matrix/ElementMatrix.h	(revision 27035)
@@ -46,4 +46,5 @@
 		void StaticCondensation(int numindices,int* indices);
 		void Transpose(void);
+		bool HasDof(int dof,int set);
 };
 #endif //#ifndef _ELEMENT_MATRIX_H_
Index: /issm/trunk/src/c/cores/ProcessArguments.cpp
===================================================================
--- /issm/trunk/src/c/cores/ProcessArguments.cpp	(revision 27034)
+++ /issm/trunk/src/c/cores/ProcessArguments.cpp	(revision 27035)
@@ -29,10 +29,11 @@
 
 	/*Create all file paths*/
-	char* binfilename      = xNew<char>(strlen(rootpath)+strlen(modelname)+strlen(".bin")      +1); sprintf(binfilename,   "%s%s%s",rootpath,modelname,".bin");
-	char* outbinfilename   = xNew<char>(strlen(rootpath)+strlen(modelname)+strlen(".outbin")   +1); sprintf(outbinfilename,"%s%s%s",rootpath,modelname,".outbin");
-	char* toolkitsfilename = xNew<char>(strlen(rootpath)+strlen(modelname)+strlen(".toolkits") +1); sprintf(toolkitsfilename,"%s%s%s",rootpath,modelname,".toolkits");
-	char* lockfilename     = xNew<char>(strlen(rootpath)+strlen(modelname)+strlen(".lock")     +1); sprintf(lockfilename,  "%s%s%s",rootpath,modelname,".lock");
-	char* restartfilename  = xNew<char>(strlen(rootpath)+strlen(modelname)+strlen(".rst.")+rank_length+1);
-	sprintf(restartfilename,"%s%s%s%i",rootpath,modelname,".rst.",my_rank);
+	int   base_length = strlen(rootpath)+strlen(modelname);
+	char* binfilename      = xNew<char>(base_length+strlen(".bin")     +1); sprintf(binfilename,   "%s%s%s",rootpath,modelname,".bin");
+	char* outbinfilename   = xNew<char>(base_length+strlen(".outbin")  +1); sprintf(outbinfilename,"%s%s%s",rootpath,modelname,".outbin");
+	char* toolkitsfilename = xNew<char>(base_length+strlen(".toolkits")+1); sprintf(toolkitsfilename,"%s%s%s",rootpath,modelname,".toolkits");
+	char* lockfilename     = xNew<char>(base_length+strlen(".lock")    +1); sprintf(lockfilename,  "%s%s%s",rootpath,modelname,".lock");
+	char* restartfilename  = xNew<char>(base_length+strlen("_rank")+rank_length+strlen(".rst")+1);
+	sprintf(restartfilename,"%s%s%s%i%s",rootpath,modelname,"_rank",my_rank,".rst");
 
 	/*Clean up and assign output pointer*/
@@ -44,4 +45,3 @@
 	*prootpath=rootpath;
 	*pmodelname=modelname;
-
 }
Index: /issm/trunk/src/c/cores/bmb_core.cpp
===================================================================
--- /issm/trunk/src/c/cores/bmb_core.cpp	(revision 27034)
+++ /issm/trunk/src/c/cores/bmb_core.cpp	(revision 27035)
@@ -36,6 +36,8 @@
 	FloatingiceMeltingRatex(femmodel);
 
-	/*Extrude basal melt*/
-	femmodel->parameters->SetParam(BasalforcingsFloatingiceMeltingRateEnum,InputToExtrudeEnum);
-	extrudefrombase_core(femmodel);
+	/*Extrude basal melt if not default melting rate (which may be a transient input that can't be extruded)*/
+	if(basalforcing_model!=FloatingMeltRateEnum){
+		femmodel->parameters->SetParam(BasalforcingsFloatingiceMeltingRateEnum,InputToExtrudeEnum);
+		extrudefrombase_core(femmodel);
+	}
 }
Index: /issm/trunk/src/c/cores/controladm1qn3_core.cpp
===================================================================
--- /issm/trunk/src/c/cores/controladm1qn3_core.cpp	(revision 27034)
+++ /issm/trunk/src/c/cores/controladm1qn3_core.cpp	(revision 27035)
@@ -15,5 +15,5 @@
 #include <sstream> // for output of the CoDiPack tape
 #include <fenv.h>
-void transient_ad(FemModel* femmodel);
+double transient_ad(FemModel* femmodel, double* G,double* Jlist);
 #endif
 
@@ -222,4 +222,5 @@
 	int    *N = NULL;
 	int    *control_enum    = NULL;
+	int     checkpoint_frequency;
 	femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
 	femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
@@ -228,4 +229,5 @@
 	femmodel->parameters->FindParam(&M,NULL,ControlInputSizeMEnum);
 	femmodel->parameters->FindParam(&control_enum,NULL,InversionControlParametersEnum);
+	femmodel->parameters->FindParam(&checkpoint_frequency,SettingsCheckpointFrequencyEnum);
 
 	/*Constrain input vector and update controls*/
@@ -236,5 +238,5 @@
 
 	int offset = 0;
-	for (int c=0;c<num_controls;c++){
+	for(int c=0;c<num_controls;c++){
 		for(int i=0;i<M[c]*N[c];i++){
 			int index = offset+i;
@@ -246,78 +248,87 @@
 	}
 
-	/*Start Tracing*/
-	simul_starttrace(femmodel);
-	/*Set X as our new control input and as INDEPENDENT*/
+	/*Special case: do we need to run AD with checkpointing?*/
+	#ifdef _HAVE_CODIPACK_
+	if(checkpoint_frequency && solution_type == TransientSolutionEnum){
+		SetControlInputsFromVectorx(femmodel,X);
+		*pf = transient_ad(femmodel, G, &Jlist[(*Jlisti)*JlistN]);
+	}
+	else
+	#endif
+	  {
+
+		/*Start Tracing*/
+		simul_starttrace(femmodel);
+		/*Set X as our new control input and as INDEPENDENT*/
 #ifdef _HAVE_AD_
-	IssmDouble* aX=xNew<IssmDouble>(intn,"t");
+		IssmDouble* aX=xNew<IssmDouble>(intn,"t");
 #else
-	IssmDouble* aX=xNew<IssmDouble>(intn);
+		IssmDouble* aX=xNew<IssmDouble>(intn);
 #endif
 
-	#if defined(_HAVE_ADOLC_)
-	if(my_rank==0){
-		for(int i=0;i<intn;i++){
-			aX[i]<<=X[i];
-		}
-	}
-	#elif defined(_HAVE_CODIPACK_)
-
-	/*Get tape*/
-	#if _CODIPACK_MAJOR_==2
-	auto& tape_codi = IssmDouble::getTape();
-	#elif _CODIPACK_MAJOR_==1
-	auto& tape_codi = IssmDouble::getGlobalTape();
-	#else
-	#error "_CODIPACK_MAJOR_ not supported"
-	#endif
-
-	codi_global.input_indices.clear();
-	if(my_rank==0){
-		for (int i=0;i<intn;i++) {
-			aX[i]=X[i];
-			tape_codi.registerInput(aX[i]);
-			#if _CODIPACK_MAJOR_==2
-			codi_global.input_indices.push_back(aX[i].getIdentifier());
-			#elif _CODIPACK_MAJOR_==1
-			codi_global.input_indices.push_back(aX[i].getGradientData());
-			#else
-			#error "_CODIPACK_MAJOR_ not supported"
-			#endif
-
-		}
-	}
-	#else
-	_error_("not suppoted");
-	#endif
-
-	ISSM_MPI_Bcast(aX,intn,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
-	SetControlInputsFromVectorx(femmodel,aX);
-	xDelete<IssmDouble>(aX);
-
-	/*Compute solution (forward)*/
-	void (*solutioncore)(FemModel*)=NULL;
-	CorePointerFromSolutionEnum(&solutioncore,femmodel->parameters,solution_type);
-	solutioncore(femmodel);
-
-	/*Get Dependents*/
-	IssmDouble   output_value;
-	int          num_dependents;
-	IssmPDouble *dependents;
-	IssmDouble   J = 0.;
-	DataSet     *dependent_objects = ((DataSetParam*)femmodel->parameters->FindParamObject(AutodiffDependentObjectsEnum))->value;
-	femmodel->parameters->FindParam(&num_dependents,AutodiffNumDependentsEnum);
-
-	/*Go through our dependent variables, and compute the response:*/
-	dependents=xNew<IssmPDouble>(num_dependents);
-	#if defined(_HAVE_CODIPACK_)
-	codi_global.output_indices.clear();
-	#endif
-	int i=-1;
-	for(Object* & object:dependent_objects->objects){
-		i++;
-		DependentObject* dep=xDynamicCast<DependentObject*>(object);
-		if(solution_type==TransientSolutionEnum) output_value = dep->GetValue();
-		if(solution_type!=TransientSolutionEnum) dep->Responsex(&output_value,femmodel);
-		if(my_rank==0) {
+		#if defined(_HAVE_ADOLC_)
+		if(my_rank==0){
+			for(int i=0;i<intn;i++){
+				aX[i]<<=X[i];
+			}
+		}
+		#elif defined(_HAVE_CODIPACK_)
+
+		/*Get tape*/
+		#if _CODIPACK_MAJOR_==2
+		auto& tape_codi = IssmDouble::getTape();
+		#elif _CODIPACK_MAJOR_==1
+		auto& tape_codi = IssmDouble::getGlobalTape();
+		#else
+		#error "_CODIPACK_MAJOR_ not supported"
+		#endif
+
+		codi_global.input_indices.clear();
+		if(my_rank==0){
+			for (int i=0;i<intn;i++) {
+				aX[i]=X[i];
+				tape_codi.registerInput(aX[i]);
+				#if _CODIPACK_MAJOR_==2
+				codi_global.input_indices.push_back(aX[i].getIdentifier());
+				#elif _CODIPACK_MAJOR_==1
+				codi_global.input_indices.push_back(aX[i].getGradientData());
+				#else
+				#error "_CODIPACK_MAJOR_ not supported"
+				#endif
+
+			}
+		}
+		#else
+		_error_("not suppoted");
+		#endif
+
+		ISSM_MPI_Bcast(aX,intn,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
+		SetControlInputsFromVectorx(femmodel,aX);
+		xDelete<IssmDouble>(aX);
+
+		/*Compute solution (forward)*/
+		void (*solutioncore)(FemModel*)=NULL;
+		CorePointerFromSolutionEnum(&solutioncore,femmodel->parameters,solution_type);
+		solutioncore(femmodel);
+
+		/*Get Dependents*/
+		IssmDouble   output_value;
+		int          num_dependents;
+		IssmPDouble *dependents;
+		IssmDouble   J = 0.;
+		DataSet     *dependent_objects = ((DataSetParam*)femmodel->parameters->FindParamObject(AutodiffDependentObjectsEnum))->value;
+		femmodel->parameters->FindParam(&num_dependents,AutodiffNumDependentsEnum);
+
+		/*Go through our dependent variables, and compute the response:*/
+		dependents=xNew<IssmPDouble>(num_dependents);
+		#if defined(_HAVE_CODIPACK_)
+		codi_global.output_indices.clear();
+		#endif
+		int i=-1;
+		for(Object* & object:dependent_objects->objects){
+			i++;
+			DependentObject* dep=xDynamicCast<DependentObject*>(object);
+			if(solution_type==TransientSolutionEnum) output_value = dep->GetValue();
+			if(solution_type!=TransientSolutionEnum) dep->Responsex(&output_value,femmodel);
 
 			#if defined(_HAVE_CODIPACK_)
@@ -340,141 +351,145 @@
 			J+=output_value;
 		}
-	}
-
-	/*Turning off trace tape*/
-	simul_stoptrace();
-
-	/*intermediary: */
-	int          num_independents=intn;
-	IssmPDouble *aWeightVector=NULL;
-	IssmPDouble *weightVectorTimesJac=NULL;
-	IssmPDouble *totalgradient=xNewZeroInit<IssmPDouble>(num_independents);
-
-	/*if no dependents, no point in running a driver: */
-	if(!(num_dependents*num_independents)) _error_("this is not allowed");
-
-	/*for adolc to run in parallel, we 0 out on rank~=0. But we still keep track of num_dependents:*/
-	int num_dependents_old   = num_dependents;
-	int num_independents_old = num_independents;
-
-	#if defined(_HAVE_ADOLC_)
-	/*Get gradient for ADOLC {{{*/
-	if(my_rank!=0){
-		num_dependents   = 0;
-		num_independents = 0;
-	}
-
-	/*get the EDF pointer:*/
-	ext_diff_fct *anEDF_for_solverx_p=xDynamicCast<GenericParam<Adolc_edf> * >(femmodel->parameters->FindParamObject(AdolcParamEnum))->GetParameterValue().myEDF_for_solverx_p;
-
-	/* these are always needed regardless of the interpreter */
-	anEDF_for_solverx_p->dp_x=xNew<double>(anEDF_for_solverx_p->max_n);
-	anEDF_for_solverx_p->dp_y=xNew<double>(anEDF_for_solverx_p->max_m);
-
-	/* Ok, now we are going to call the fos_reverse in a loop on the index, from 0 to num_dependents, so
-	 * as to generate num_dependents gradients: */
-	for(int aDepIndex=0;aDepIndex<num_dependents_old;aDepIndex++){
-
-		/*initialize direction index in the weights vector: */
-		aWeightVector=xNewZeroInit<IssmPDouble>(num_dependents);
-		if (my_rank==0) aWeightVector[aDepIndex]=1.;
-
-		/*initialize output gradient: */
-		weightVectorTimesJac=xNew<IssmPDouble>(num_independents);
-
-		/*set the forward method function pointer: */
-		#ifdef _HAVE_GSL_
-		anEDF_for_solverx_p->fos_reverse=EDF_fos_reverse_for_solverx;
-		#endif
-		#ifdef _HAVE_MUMPS_
-		anEDF_for_solverx_p->fos_reverse_iArr=fos_reverse_mumpsSolveEDF;
-		#endif
-
-		anEDF_for_solverx_p->dp_U=xNew<IssmPDouble>(anEDF_for_solverx_p->max_m);
-		anEDF_for_solverx_p->dp_Z=xNew<IssmPDouble>(anEDF_for_solverx_p->max_n);
-
-		/*call driver: */
-		fos_reverse(my_rank,num_dependents,num_independents, aWeightVector, weightVectorTimesJac );
-
-		/*Add to totalgradient: */
-		if(my_rank==0) for(int i=0;i<num_independents;i++) {
-			totalgradient[i]+=weightVectorTimesJac[i];
-		}
-
-		/*free resources :*/
-		xDelete(weightVectorTimesJac);
-		xDelete(aWeightVector);
-	}
-	/*}}}*/
-	#elif defined(_HAVE_CODIPACK_)
-	/*Get gradient for CoDiPack{{{*/
-	if(VerboseAutodiff())_printf0_("   CoDiPack fos_reverse\n");
-
-	/* call the fos_reverse in a loop on the index, from 0 to num_dependents, so
-	 * as to generate num_dependents gradients: */
-	for(int dep_index=0;dep_index<num_dependents_old;dep_index++){
-
-		/*initialize direction index in the weights vector: */
-		if(my_rank==0){
-			if(dep_index<0 || dep_index>=num_dependents || codi_global.output_indices.size() <= dep_index){
-				_error_("index value for dependent index should be in [0,num_dependents-1]");
+
+		/*Turning off trace tape*/
+		simul_stoptrace();
+
+		/*intermediary: */
+		int          num_independents=intn;
+		IssmPDouble *aWeightVector=NULL;
+		IssmPDouble *weightVectorTimesJac=NULL;
+		IssmPDouble *totalgradient=xNewZeroInit<IssmPDouble>(num_independents);
+
+		/*if no dependents, no point in running a driver: */
+		if(!(num_dependents*num_independents)) _error_("this is not allowed");
+
+		/*for adolc to run in parallel, we 0 out on rank~=0. But we still keep track of num_dependents:*/
+		int num_dependents_old   = num_dependents;
+		int num_independents_old = num_independents;
+
+		#if defined(_HAVE_ADOLC_)
+		/*Get gradient for ADOLC {{{*/
+		if(my_rank!=0){
+			num_dependents   = 0;
+			num_independents = 0;
+		}
+
+		/*get the EDF pointer:*/
+		ext_diff_fct *anEDF_for_solverx_p=xDynamicCast<GenericParam<Adolc_edf> * >(femmodel->parameters->FindParamObject(AdolcParamEnum))->GetParameterValue().myEDF_for_solverx_p;
+
+		/* these are always needed regardless of the interpreter */
+		anEDF_for_solverx_p->dp_x=xNew<double>(anEDF_for_solverx_p->max_n);
+		anEDF_for_solverx_p->dp_y=xNew<double>(anEDF_for_solverx_p->max_m);
+
+		/* Ok, now we are going to call the fos_reverse in a loop on the index, from 0 to num_dependents, so
+		 * as to generate num_dependents gradients: */
+		for(int aDepIndex=0;aDepIndex<num_dependents_old;aDepIndex++){
+
+			/*initialize direction index in the weights vector: */
+			aWeightVector=xNewZeroInit<IssmPDouble>(num_dependents);
+			if (my_rank==0) aWeightVector[aDepIndex]=1.;
+
+			/*initialize output gradient: */
+			weightVectorTimesJac=xNew<IssmPDouble>(num_independents);
+
+			/*set the forward method function pointer: */
+			#ifdef _HAVE_GSL_
+			anEDF_for_solverx_p->fos_reverse=EDF_fos_reverse_for_solverx;
+			#endif
+			#ifdef _HAVE_MUMPS_
+			anEDF_for_solverx_p->fos_reverse_iArr=fos_reverse_mumpsSolveEDF;
+			#endif
+
+			anEDF_for_solverx_p->dp_U=xNew<IssmPDouble>(anEDF_for_solverx_p->max_m);
+			anEDF_for_solverx_p->dp_Z=xNew<IssmPDouble>(anEDF_for_solverx_p->max_n);
+
+			/*call driver: */
+			fos_reverse(my_rank,num_dependents,num_independents, aWeightVector, weightVectorTimesJac );
+
+			/*Add to totalgradient: */
+			if(my_rank==0) for(int i=0;i<num_independents;i++) {
+				totalgradient[i]+=weightVectorTimesJac[i];
 			}
-			tape_codi.setGradient(codi_global.output_indices[dep_index],1.0);
-		}
-		//feclearexcept(FE_ALL_EXCEPT);
-		//feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
-		tape_codi.evaluate();
-
-		/*Get gradient for this dependent */
-		weightVectorTimesJac=xNew<IssmPDouble>(num_independents);
-		auto in_size = codi_global.input_indices.size();
-		for(size_t i = 0; i < in_size; ++i){
-			_assert_(i<num_independents);
-			weightVectorTimesJac[i] = tape_codi.getGradient(codi_global.input_indices[i]);
-		}
-		if(my_rank==0) for(int i=0;i<num_independents;i++){
-			totalgradient[i]+=weightVectorTimesJac[i];
-		}
-		xDelete(weightVectorTimesJac);
-	}
-
-	/*Clear tape*/
-	tape_codi.reset();
-	/*}}}*/
-	#else
-	_error_("not suppoted");
-	#endif
-
-	/*Broadcast gradient to other ranks*/
-	ISSM_MPI_Bcast(totalgradient,num_independents_old,ISSM_MPI_PDOUBLE,0,IssmComm::GetComm());
-	/*Check size of Jlist to avoid crashes*/
-	_assert_((*Jlisti)<JlistM);
-	_assert_(JlistN==num_responses+1);
-
-	/*Compute objective function and broadcast it to other cpus*/
-	*pf = reCast<double>(J);
-	ISSM_MPI_Bcast(pf,1,ISSM_MPI_PDOUBLE,0,IssmComm::GetComm());
-	_printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<"  |  ");
-
-	/*Record cost function values and delete Jtemp*/
-	for(int i=0;i<num_responses;i++) Jlist[(*Jlisti)*JlistN+i] = dependents[i];
-	Jlist[(*Jlisti)*JlistN+num_responses] = reCast<IssmPDouble>(J);
-
-	if(*indic==0){
-		/*dry run, no gradient required*/
-
-		/*Retrieve objective functions independently*/
-		_printf0_("            N/A |\n");
-		for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<Jlist[(*Jlisti)*JlistN+i]);
-		_printf0_("\n");
-
-		*Jlisti = (*Jlisti) +1;
-		xDelete<double>(XU);
-		xDelete<double>(XL);
-		return;
-	}
-
-	/*Compute gradient*/
-	for(long i=0;i<num_independents_old;i++) G[i] = totalgradient[i];
+
+			/*free resources :*/
+			xDelete(weightVectorTimesJac);
+			xDelete(aWeightVector);
+		}
+		/*}}}*/
+		#elif defined(_HAVE_CODIPACK_)
+		/*Get gradient for CoDiPack{{{*/
+		if(VerboseAutodiff())_printf0_("   CoDiPack fos_reverse\n");
+
+		/* call the fos_reverse in a loop on the index, from 0 to num_dependents, so
+		 * as to generate num_dependents gradients: */
+		for(int dep_index=0;dep_index<num_dependents_old;dep_index++){
+
+			/*initialize direction index in the weights vector: */
+			if(my_rank==0){
+				if(dep_index<0 || dep_index>=num_dependents || codi_global.output_indices.size() <= dep_index){
+					_error_("index value for dependent index should be in [0,num_dependents-1]");
+				}
+				tape_codi.setGradient(codi_global.output_indices[dep_index],1.0);
+			}
+			//feclearexcept(FE_ALL_EXCEPT);
+			//feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
+			tape_codi.evaluate();
+
+			/*Get gradient for this dependent */
+			weightVectorTimesJac=xNew<IssmPDouble>(num_independents);
+			auto in_size = codi_global.input_indices.size();
+			for(size_t i = 0; i < in_size; ++i){
+				_assert_(i<num_independents);
+				weightVectorTimesJac[i] = tape_codi.getGradient(codi_global.input_indices[i]);
+			}
+			if(my_rank==0) for(int i=0;i<num_independents;i++){
+				totalgradient[i]+=weightVectorTimesJac[i];
+			}
+			xDelete(weightVectorTimesJac);
+		}
+
+		/*Clear tape*/
+		tape_codi.reset();
+		/*}}}*/
+		#else
+		_error_("not suppoted");
+		#endif
+
+		/*Broadcast gradient to other ranks*/
+		ISSM_MPI_Bcast(totalgradient,num_independents_old,ISSM_MPI_PDOUBLE,0,IssmComm::GetComm());
+
+		/*Check size of Jlist to avoid crashes*/
+		_assert_((*Jlisti)<JlistM);
+		_assert_(JlistN==num_responses+1);
+
+		/*Compute objective function and broadcast it to other cpus*/
+		*pf = reCast<double>(J);
+		ISSM_MPI_Bcast(pf,1,ISSM_MPI_PDOUBLE,0,IssmComm::GetComm());
+
+		/*Record cost function values and delete Jtemp*/
+		for(int i=0;i<num_responses;i++) Jlist[(*Jlisti)*JlistN+i] = dependents[i];
+		Jlist[(*Jlisti)*JlistN+num_responses] = reCast<IssmPDouble>(J);
+
+		if(*indic==0){
+			/*dry run, no gradient required*/
+
+			/*Retrieve objective functions independently*/
+			_printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<"  |  ");
+			_printf0_("            N/A |\n");
+			for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<Jlist[(*Jlisti)*JlistN+i]);
+			_printf0_("\n");
+
+			*Jlisti = (*Jlisti) +1;
+			xDelete<double>(XU);
+			xDelete<double>(XL);
+			return;
+		}
+
+		/*Compute gradient*/
+		for(long i=0;i<num_independents_old;i++) G[i] = totalgradient[i];
+
+		xDelete<IssmPDouble>(dependents);
+		xDelete<IssmPDouble>(totalgradient);
+	  } /*====????*/
 
 	/*Constrain Gradient*/
@@ -496,4 +511,5 @@
 
 	/*Print info*/
+	_printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<"  |  ");
 	_printf0_("       "<<setw(12)<<setprecision(7)<<Gnorm<<" |");
 	for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<Jlist[(*Jlisti)*JlistN+i]);
@@ -509,21 +525,7 @@
 	xDelete<int>(N);
 	xDelete<double>(scaling_factors);
-	xDelete<IssmPDouble>(dependents);
-	xDelete<IssmPDouble>(totalgradient);
 }/*}}}*/
 void controladm1qn3_core(FemModel* femmodel){/*{{{*/
 
-	int checkpoint_frequency;
-	femmodel->parameters->FindParam(&checkpoint_frequency,SettingsCheckpointFrequencyEnum);
-	if(checkpoint_frequency){
-		#ifdef _HAVE_CODIPACK_
-		transient_ad(femmodel);
-		femmodel->OutputControlsx(&femmodel->results);
-		printf("No optimization implemented yet, skipping\n");
-		return;
-		#else
-		_error_("checkpointing not implemented for ADOLC");
-		#endif
-	}
 
 	/*Intermediaries*/
Index: /issm/trunk/src/c/cores/controltao_core.cpp
===================================================================
--- /issm/trunk/src/c/cores/controltao_core.cpp	(revision 27034)
+++ /issm/trunk/src/c/cores/controltao_core.cpp	(revision 27035)
@@ -95,5 +95,10 @@
 	GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
 	GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
+	#if PETSC_VERSION_LT(3,17,0)
 	TaoSetInitialVector(tao,X->pvector->vector);
+	#else
+	//TaoSetSolution(tao,X->pvector->vector);
+	_error_("not implemented yet");
+	#endif
 	TaoSetVariableBounds(tao,XL->pvector->vector,XU->pvector->vector);
 	delete XL;
@@ -110,7 +115,16 @@
 
 	/*Save results*/
+	#if PETSC_VERSION_LT(3,17,0)
 	TaoGetSolutionVector(tao,&X->pvector->vector);
+	#else
+	TaoGetSolution(tao,&X->pvector->vector);
+	#endif
 	G=new Vector<IssmDouble>(0); VecFree(&G->pvector->vector);
+	#if PETSC_VERSION_LT(3,17,0)
 	TaoGetGradientVector(tao,&G->pvector->vector);
+	#else
+	//TaoGetGradient(tao,&G->pvector->vector);
+	_error_("not implemented yet");
+	#endif
 	SetControlInputsFromVectorx(femmodel,X);
 	ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,G);
Index: /issm/trunk/src/c/cores/groundingline_core.cpp
===================================================================
--- /issm/trunk/src/c/cores/groundingline_core.cpp	(revision 27034)
+++ /issm/trunk/src/c/cores/groundingline_core.cpp	(revision 27035)
@@ -16,8 +16,12 @@
 
 	/* intermediaries */
+	int numoutputs;
 	bool save_results;
+	char** requested_outputs = NULL;
 
 	/* recover parameters */
 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+	femmodel->parameters->FindParam(&numoutputs,GroundinglineNumRequestedOutputsEnum);
+	if(numoutputs) femmodel->parameters->FindParam(&requested_outputs,&numoutputs,GroundinglineRequestedOutputsEnum);
 
 	/*Move grounding line*/
@@ -33,8 +37,9 @@
 	extrudefrombase_core(femmodel);
 
-	if(save_results){
-		int outputs[3] = {SurfaceEnum,BaseEnum,MaskOceanLevelsetEnum};
-		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],3);
-	}
+	/*Save results*/
+	if(save_results) femmodel->RequestedOutputsx(&femmodel->results,requested_outputs,numoutputs);
+
+	/*Free ressources:*/
+   if(numoutputs){for(int i=0;i<numoutputs;i++){xDelete<char>(requested_outputs[i]);} xDelete<char*>(requested_outputs);}
 
 	/*Stop profiler*/
Index: /issm/trunk/src/c/cores/love_core.cpp
===================================================================
--- /issm/trunk/src/c/cores/love_core.cpp	(revision 27034)
+++ /issm/trunk/src/c/cores/love_core.cpp	(revision 27035)
@@ -10,4 +10,13 @@
 #include "../solutionsequences/solutionsequences.h"
 #include "petscblaslapack.h"
+#ifdef _HAVE_MPLAPACK_
+#include <quadmath.h>
+#include "mpblas__Float128.h"
+#include "mplapack__Float128.h"
+#endif
+
+#ifdef _HAVE_MPLAPACK_
+_Float128 a = 0.2345234534512079875620048770134538q;
+#endif
 
 /*local definitions:*/
@@ -20,4 +29,5 @@
 		int nyi; 
 		int starting_layer;
+		int* deg_layer_delete;
 
 		LoveVariables(){  /*{{{*/
@@ -27,6 +37,7 @@
 			nyi=0;
 			starting_layer=0;
+			deg_layer_delete=NULL;
 		} /*}}}*/
-		LoveVariables(IssmDouble* EarthMassin,IssmDouble g0in,IssmDouble r0in,int nyiin,int starting_layerin){  /*{{{*/
+		LoveVariables(IssmDouble* EarthMassin,IssmDouble g0in,IssmDouble r0in,int nyiin,int starting_layerin, int* deg_layer_deletein){  /*{{{*/
 			EarthMass=EarthMassin;
 			g0=g0in;
@@ -34,6 +45,87 @@
 			nyi=nyiin;
 			starting_layer=starting_layerin;
+			deg_layer_delete=deg_layer_deletein;
 		} /*}}}*/
 		~LoveVariables(){};
+}; /*}}}*/
+
+template <class doubletype> class LoveNumbers{  /*{{{*/
+
+	public:	
+		doubletype* H;
+		doubletype* K;
+		doubletype* L;
+		doubletype* Kernels;
+		int sh_nmin, sh_nmax, nfreq, nkernels; 
+
+		LoveNumbers(){  /*{{{*/
+			H=NULL;
+			K=NULL;
+			L=NULL;
+			Kernels=NULL;
+			sh_nmin=0;
+			sh_nmax=0;
+			nfreq=0;
+			nkernels=0;
+		} /*}}}*/
+		LoveNumbers(int sh_nminin, int sh_nmaxin, int nfreqin, Matlitho* matlitho){  /*{{{*/
+			sh_nmax=sh_nmaxin;
+			sh_nmin=sh_nminin;
+			nfreq=nfreqin;
+			nkernels=(sh_nmax+1)*(matlitho->numlayers+1)*6;
+			H=xNewZeroInit<doubletype>(nfreq*(sh_nmax+1));
+			K=xNewZeroInit<doubletype>(nfreq*(sh_nmax+1));
+			L=xNewZeroInit<doubletype>(nfreq*(sh_nmax+1));
+			Kernels=xNewZeroInit<doubletype>(nfreq*nkernels);
+		} /*}}}*/
+		void DownCastToDouble(LoveNumbers<IssmDouble>* LoveDouble){
+			for(int i=0;i<(sh_nmax+1)*nfreq;i++){
+				LoveDouble->H[i]=std::real(H[i]);
+				LoveDouble->K[i]=std::real(K[i]);
+				LoveDouble->L[i]=std::real(L[i]);
+			}
+		}
+		void LoveMPI_Gather(LoveNumbers<doubletype>* Love_local, int lower_row){
+			int* recvcounts=xNew<int>(IssmComm::GetSize());
+			int* displs=xNew<int>(IssmComm::GetSize());
+			int  rc;
+			int  offset;
+			int nf_local = Love_local->nfreq;
+
+			/*Deal H, K, L first, as they share the same size*/
+			rc=(sh_nmax+1)*nf_local;
+			offset=(sh_nmax+1)*lower_row;
+			ISSM_MPI_Allgather(&rc,1,ISSM_MPI_INT,recvcounts,1,ISSM_MPI_INT,IssmComm::GetComm());
+			ISSM_MPI_Allgather(&offset,1,ISSM_MPI_INT,displs,1,ISSM_MPI_INT,IssmComm::GetComm());
+			ISSM_MPI_Allgatherv(Love_local->H, rc, ISSM_MPI_DOUBLE, H, recvcounts, displs, ISSM_MPI_DOUBLE,IssmComm::GetComm());
+			ISSM_MPI_Allgatherv(Love_local->K, rc, ISSM_MPI_DOUBLE, K, recvcounts, displs, ISSM_MPI_DOUBLE,IssmComm::GetComm());
+			ISSM_MPI_Allgatherv(Love_local->L, rc, ISSM_MPI_DOUBLE, L, recvcounts, displs, ISSM_MPI_DOUBLE,IssmComm::GetComm());
+
+			/* deal with love kernels now */
+			rc=nf_local*nkernels;
+			offset=lower_row*nkernels;
+			ISSM_MPI_Allgather(&rc,1,ISSM_MPI_INT,recvcounts,1,ISSM_MPI_INT,IssmComm::GetComm());
+			ISSM_MPI_Allgather(&offset,1,ISSM_MPI_INT,displs,1,ISSM_MPI_INT,IssmComm::GetComm());
+			ISSM_MPI_Allgatherv(Love_local->Kernels, rc, ISSM_MPI_DOUBLE, Kernels, recvcounts, displs, ISSM_MPI_DOUBLE,IssmComm::GetComm());
+
+			xDelete<int>(recvcounts);
+			xDelete<int>(displs);
+		}
+		void Copy(LoveNumbers<doubletype>* LoveDup){
+			for(int i=0;i<(sh_nmax+1)*nfreq;i++){
+				H[i]=LoveDup->H[i];
+				K[i]=LoveDup->K[i];
+				L[i]=LoveDup->L[i];
+			}
+			for(int i=0;i<nkernels*nfreq;i++){
+				Kernels[i]=LoveDup->Kernels[i];
+			}
+		}
+		~LoveNumbers(){
+			xDelete<doubletype>(H);
+			xDelete<doubletype>(K);
+			xDelete<doubletype>(L);
+			xDelete<doubletype>(Kernels);
+		};
 }; /*}}}*/
 
@@ -123,13 +215,29 @@
 	return xi;
 }/*}}}*/
-template<typename doubletype> void         postwidder_transform(doubletype* Lovet, doubletype* Lovef,int d, int t, int NTit, doubletype* xi, FemModel* femmodel){ /*{{{*/
+template<typename doubletype> void         postwidder_transform(doubletype* Lovet, doubletype* Lovef,int d, int t, int sh_nmax,int NTit, doubletype* xi, FemModel* femmodel){ /*{{{*/
 	//Computes Lovet for time step t and degree d from the PW coefficients xi and the corresponding 2*NTit frequency samples in Lovef
 
-	int nfreq, indxi, indf;
-	femmodel->parameters->FindParam(&nfreq,LoveNfreqEnum);
-	int nt=nfreq/2/NTit;
-
-	indf=d*nfreq+t*2*NTit;
+	int indxi, indf;
+	IssmDouble PW_test;
+	IssmDouble PW_threshold;
+	femmodel->parameters->FindParam(&PW_threshold,LovePostWidderThresholdEnum);
+
+	indf=(t*2*NTit)*(sh_nmax+1)+d;
 	doubletype* LoveM = xNew<doubletype>(NTit);
+
+
+	// test variation across frequencies tested, something with little frequency dependence is not worth going through PW tranform
+	// that transform would also be numerically unstable
+	PW_test = abs((Lovef[indf+(2*NTit-1)*(sh_nmax+1)]-Lovef[indf])/Lovef[indf]); 
+
+	//if (PW_test < PW_threshold){ //elastic or fluid response: Love(t) = Love(s), we can do an early return
+	//	Lovet[t*(sh_nmax+1)+d]=Lovef[indf];
+	//	return;
+	//}
+
+	if (PW_test==0){ //elastic or fluid response: Love(t) = Love(s), we can do an early return
+		Lovet[t*(sh_nmax+1)+d]=Lovef[indf];
+		return;
+	}
 
 	for (int M=1;M<NTit+1;M++){
@@ -137,5 +245,5 @@
 		for (int k=1;k<2*M+1;k++){
 			indxi=(M-1)*(2*NTit)+k-1;
-			LoveM[M-1]+=xi[indxi]*Lovef[indf+k-1];
+			LoveM[M-1]+=xi[indxi]*Lovef[indf+(k-1)*(sh_nmax+1)];
 		}
 
@@ -146,10 +254,10 @@
 			if ( abs(LoveM[M-1]-LoveM[M-2]) > abs(LoveM[M-2]-LoveM[M-3]) &&
 					abs(LoveM[M-2]-LoveM[M-3]) > abs(LoveM[M-3]-LoveM[M-4]) ){
-				Lovet[d*nt+t]=LoveM[M-3];
+				Lovet[t*(sh_nmax+1)+d]=LoveM[M-3];
 				return;
 			}
 		}
 	}
-	Lovet[d*nt+t]=LoveM[NTit-1];
+	Lovet[t*(sh_nmax+1)+d]=LoveM[NTit-1];
 }/*}}}*/
 template <typename doubletype> void        GetEarthRheology(doubletype* pla, doubletype* pmu, int layer_index, doubletype omega,  Matlitho* matlitho){ /*{{{*/
@@ -726,8 +834,8 @@
 
 }/*}}}*/
-template <typename doubletype> void        yi_boundary_conditions(doubletype* yi_righthandside, int deg, FemModel* femmodel, Matlitho* matlitho,LoveVariables* vars){ /*{{{*/
+template <typename doubletype> void        yi_boundary_conditions(doubletype* yi_righthandside, int deg, FemModel* femmodel, Matlitho* matlitho,LoveVariables* vars, int forcing_type){ /*{{{*/
 
 	IssmDouble  g0,r0,mu0,ra,rb,rc;
-	int nyi, forcing_type,icb,cmb,starting_layer;
+	int nyi,icb,cmb,starting_layer;
 	IssmDouble* EarthMass;
 
@@ -739,5 +847,4 @@
 
 	femmodel->parameters->FindParam(&mu0,LoveMu0Enum);
-	femmodel->parameters->FindParam(&forcing_type,LoveForcingTypeEnum);
 	femmodel->parameters->FindParam(&icb,LoveInnerCoreBoundaryEnum);
 	femmodel->parameters->FindParam(&cmb,LoveCoreMantleBoundaryEnum);
@@ -810,8 +917,8 @@
 	}
 }/*}}}*/
-template <typename doubletype> void        solve_yi_system(doubletype* loveh, doubletype* lovel, doubletype* lovek, int deg, doubletype omega, doubletype* yi, doubletype* rhs, FemModel* femmodel, Matlitho* matlitho, LoveVariables* vars){ /*{{{*/
+template <typename doubletype> void        solve_yi_system(doubletype* loveh, doubletype* lovel, doubletype* lovek, int deg, doubletype omega, IssmDouble* frequencies, doubletype* yi, doubletype* rhs, FemModel* femmodel, Matlitho* matlitho, LoveVariables* vars, bool verbosecpu){ /*{{{*/
 
 	IssmDouble  g0,r0,mu0,loveratio,underflow_tol;
-	IssmDouble* frequencies;
+	//IssmDouble* frequencies;
 	int nyi,starting_layer, dummy;
 	bool allow_layer_deletion;
@@ -827,8 +934,9 @@
 	femmodel->parameters->FindParam(&allow_layer_deletion,LoveAllowLayerDeletionEnum);
 	femmodel->parameters->FindParam(&underflow_tol,LoveUnderflowTolEnum);
-	femmodel->parameters->FindParam(&frequencies,&dummy,LoveFrequenciesEnum);
+	//femmodel->parameters->FindParam(&frequencies,&dummy,LoveFrequenciesEnum);
 	IssmDouble ra=matlitho->radius[matlitho->numlayers];
 	bool exit=false;
 	int lda,ldb;
+
 
 	for(;!exit;){ //cycles of: attempt to solve the yi system, then delete a layer if necessary
@@ -854,6 +962,17 @@
 		xDelete<int>(ipiv);
 
-		if(VerboseModule() && info!=0){ 
-			_printf0_("love core warning in DGESV : LAPACK linear equation solver couldn't resolve the system");
+			/*_printf_("i j yi[i+nyi*j] rhs[i]");
+			for (int i=0;i<nyi;i++){
+					_printf_(i<<" "<<rhs[i]<<"\n");
+			}
+
+			for (int i=0;i<nyi;i++){
+				for (int j=0;j<nyi;j++){
+					_printf_(i<<" "<<j<<" "<<yi[i+nyi*j]<<" "<<rhs[i]<<"\n");
+				}
+			}
+			_error_("love core warning in DGESV : LAPACK linear equation solver couldn't resolve the system");*/
+
+		if(VerboseSolution() && info!=0){ 
 			_printf_("i j yi[i+nyi*j] rhs[i]");
 			for (int i=0;i<nyi;i++){
@@ -862,4 +981,5 @@
 				}
 			}
+			_error_("love core warning in DGESV : LAPACK linear equation solver couldn't resolve the system");
 		}
 
@@ -880,5 +1000,7 @@
 		if (abs(lovek1/lovek1s) < loveratio) loveratio = abs(lovek1/lovek1s);
 
-		if (!allow_layer_deletion || nyi<=12 || omega!=angular_frequency<doubletype>(frequencies[0])){ 
+		
+
+		if (!allow_layer_deletion || nyi<=12 || omega!=angular_frequency<doubletype>(frequencies[0]) || deg==0){ 
 			goto save_results;
 			/*We are not allowed to delete layers, or there is only one layer left. We also don't want to delete 
@@ -887,10 +1009,18 @@
 		}
 
-		if (loveratio<=underflow_tol || xIsNan(loveratio) || xIsInf(loveratio)){//We need to delete a layer and try again if the ratio between deepest love number to surface love number is too low (risk of underflow) or garbage
-			if(VerboseSolution()){
-				_printf_("\n   Degree: " << deg <<", surface/Depth Love number ratio small: "<<loveratio<<"\n");
-				_printf_("    Changing the interface where the integration starts\n");
-				_printf_("    New start interface: r="<< matlitho->radius[starting_layer+1] <<"m\n\n");
-			}
+		if (omega==0){ // if running elastic love_numbers, record at which degree we must delete layers, this way we synch layer deletion between cpus next time we calculate love numbers
+			//We need to delete a layer and try again if the ratio between deepest love number to surface love number is too low (risk of underflow) or garbage
+			if (loveratio<=underflow_tol || xIsNan(loveratio) || xIsInf(loveratio)) {
+				vars->deg_layer_delete[starting_layer]=deg;
+				if(VerboseSolution() && verbosecpu){
+					_printf_("\n   Degree: " << deg <<", surface/Depth Love number ratio small: "<<loveratio<<"\n");
+					_printf_("    Changing the interface where integration starts\n");
+					_printf_("    New start interface: r="<< matlitho->radius[starting_layer+1] <<"m\n\n");
+				}
+			}
+		}
+
+		if (deg==vars->deg_layer_delete[starting_layer]){ // if we are at the degree where we should delete the current layer, proceed to delete the bottom layer
+			if (omega!=0 && VerboseSolution()  && verbosecpu) _printf_(", deleting layer " << starting_layer << "\n");
 			nyi-=6;
 			starting_layer+=1;
@@ -934,27 +1064,173 @@
 		xDelete<doubletype>(rhslocal);
 	}
-	xDelete<IssmDouble>(frequencies);	
+	//xDelete<IssmDouble>(frequencies);	
 
 }/*}}}*/
-template <typename doubletype> void        love_freq_to_temporal(doubletype* LoveHt,doubletype* LoveLt,doubletype* LoveKt,doubletype* LoveHf,doubletype* LoveLf,doubletype* LoveKf, FemModel* femmodel){ /*{{{*/
+template <typename doubletype> void        love_freq_to_temporal(LoveNumbers<doubletype>* Lovet, LoveNumbers<doubletype>* Tidalt, doubletype* pmtf_colineart, doubletype* pmtf_orthot, LoveNumbers<doubletype>* Lovef,LoveNumbers<doubletype>* Tidalf, IssmDouble* frequencies, FemModel* femmodel, bool verbosecpu){ /*{{{*/
 	//Transforms all frequency-dependent love numbers into time-dependent love numbers
-	int nfreq,sh_nmax,sh_nmin,indxi,indf, NTit;
-
-	femmodel->parameters->FindParam(&nfreq,LoveNfreqEnum);
-	femmodel->parameters->FindParam(&sh_nmax,LoveShNmaxEnum);
-	femmodel->parameters->FindParam(&sh_nmin,LoveShNminEnum);
+	int nfreq,sh_nmax,sh_nmin,indxi,indf, NTit, forcing_type, nt;
+	IssmDouble kf,Omega,moi_e,moi_p,alpha;
+	doubletype* pmtf_colinearf=NULL;
+	doubletype* pmtf_orthof=NULL;
+	bool chandler_wobble=false;
+
+	nfreq=Lovef->nfreq;
+	sh_nmin=Lovef->sh_nmin;
+	sh_nmax=Lovef->sh_nmax;
+
 	femmodel->parameters->FindParam(&NTit,LoveNTemporalIterationsEnum);
 
-	int nt=nfreq/2/NTit;
+	//Parameters for the rotationnal feedback
+	femmodel->parameters->FindParam(&chandler_wobble,LoveChandlerWobbleEnum);
+	femmodel->parameters->FindParam(&forcing_type,LoveForcingTypeEnum);
+	femmodel->parameters->FindParam(&kf,TidalLoveK2SecularEnum);
+	femmodel->parameters->FindParam(&Omega,RotationalAngularVelocityEnum);
+	femmodel->parameters->FindParam(&moi_e,RotationalEquatorialMoiEnum);
+	femmodel->parameters->FindParam(&moi_p,RotationalPolarMoiEnum);
+
+	nt=Lovet->nfreq;
 	doubletype* xi=postwidder_coef<doubletype>(NTit);
+
+	if(VerboseSolution()  && verbosecpu) _printf_("   Inverse Laplace Transform... ");
 
 	for (int d=sh_nmin;d<sh_nmax+1;d++){
 		for (int t=0;t<nt;t++){
-			postwidder_transform<doubletype>(LoveHt,LoveHf,d,t,NTit,xi,femmodel);
-			postwidder_transform<doubletype>(LoveLt,LoveLf,d,t,NTit,xi,femmodel);
-			postwidder_transform<doubletype>(LoveKt,LoveKf,d,t,NTit,xi,femmodel);
-		}
-	}
+			postwidder_transform<doubletype>(Lovet->H,Lovef->H,d,t,sh_nmax,NTit,xi,femmodel);
+			postwidder_transform<doubletype>(Lovet->K,Lovef->K,d,t,sh_nmax,NTit,xi,femmodel);
+			postwidder_transform<doubletype>(Lovet->L,Lovef->L,d,t,sh_nmax,NTit,xi,femmodel);
+		}
+	}
+
+	if(VerboseSolution()  && verbosecpu) _printf_("done!\n");
+
+	if (forcing_type==11){ //Let's retrieve the functions necessary for the rotational_feedback
+		if(VerboseSolution()  && verbosecpu) _printf_("     Transforming PMTF and tidal love numbers... ");
+		pmtf_colinearf = xNewZeroInit<doubletype>(3*nfreq);
+		pmtf_orthof = xNewZeroInit<doubletype>(3*nfreq);
+		int d=2;
+		doubletype s,R1,R2;
+		alpha=(moi_p-moi_e)/moi_e; //Earth flattening
+
+		if (chandler_wobble){ //Chandler Wobble is untested yet
+			for (int fr=0;fr<nfreq;fr++){		
+				s=angular_frequency<doubletype>(frequencies[fr]);
+				R1=alpha*Omega*(1.0-Tidalf->K[fr*3+d]/kf);
+				R2=1.0+alpha*Tidalf->K[fr*3+d]/kf;
+				pmtf_colinearf[fr*3+d]=alpha*(1.0+Lovef->K[fr*(sh_nmax+1)+d])*(Omega*R1-pow(s,2)*R2)/(pow(R1,2.0)+pow(s*R2,2.0));
+				pmtf_orthof[fr*3+d]=alpha*(1.0+Lovef->K[fr*(sh_nmax+1)+d])*s*Omega*(1.0+alpha)/(pow(R1,2.0)+pow(s*R2,2.0));
+			}
+		}
+		else {
+			for (int fr=0;fr<nfreq;fr++){		
+				pmtf_colinearf[fr*3+d]=(1.0+Lovef->K[fr*(sh_nmax+1)+d])/(1.0-Tidalf->K[fr*3+d]/kf);
+				pmtf_orthof[fr*3+d]=0.0;
+			}
+		}
+		for (int t=0;t<nt;t++){
+			postwidder_transform<doubletype>(Tidalt->H,Tidalf->H,2,t,2,NTit,xi,femmodel);
+			postwidder_transform<doubletype>(Tidalt->K,Tidalf->K,2,t,2,NTit,xi,femmodel);
+			postwidder_transform<doubletype>(Tidalt->L,Tidalf->L,2,t,2,NTit,xi,femmodel);
+			postwidder_transform<doubletype>(pmtf_colineart,pmtf_colinearf,2,t,2,NTit,xi,femmodel);
+			postwidder_transform<doubletype>(pmtf_orthot,pmtf_orthof,2,t,2,NTit,xi,femmodel);
+		}
+		if(VerboseSolution() && verbosecpu) _printf_("done!\n");
+	}
+
 	xDelete<doubletype>(xi);
+	xDelete<doubletype>(pmtf_colinearf);
+	xDelete<doubletype>(pmtf_orthof);
+}/*}}}*/
+
+template <typename doubletype> void        compute_love_numbers(LoveNumbers<doubletype>* Lovef, LoveNumbers<doubletype>* Elastic, int forcing_type, int sh_cutoff, IssmDouble* frequencies, FemModel* femmodel, Matlitho* matlitho, LoveVariables* vars, bool verbosecpu){
+
+	int nstep, kernel_index,kernel_indexe,deleted_layer_offset, deg, sh_nmin, sh_nmax, nfreq;
+	doubletype  lovek, loveh, lovel, loveratio;
+	doubletype  omega;
+	doubletype* yi_prefactor=NULL;
+	doubletype* yi_righthandside=NULL;
+	doubletype* yi=NULL;
+	IssmDouble  underflow_tol;
+	bool freq_skip, istemporal;
+
+	femmodel->parameters->FindParam(&nstep,LoveIntStepsPerLayerEnum);
+	femmodel->parameters->FindParam(&istemporal,LoveIsTemporalEnum);
+
+	nfreq=Lovef->nfreq;
+	sh_nmin=Lovef->sh_nmin;
+	sh_nmax=Lovef->sh_nmax;
+	if (Elastic==NULL) sh_cutoff=sh_nmax;
+
+	// reset deleted layers in case we have called this function before;
+	vars->starting_layer=0; 
+	vars->nyi=6*(matlitho->numlayers+1);
+
+	yi_prefactor=xNewZeroInit<doubletype>(6*6*nstep*matlitho->numlayers);
+	yi_righthandside=xNewZeroInit<doubletype>(vars->nyi);
+	yi=xNewZeroInit<doubletype>(vars->nyi*vars->nyi);
+
+	//precalculate yi coefficients that do not depend on degree or frequency
+	fill_yi_prefactor<doubletype>(yi_prefactor, NULL, NULL,femmodel, matlitho,vars); 
+
+	if (VerboseSolution() && Elastic  && verbosecpu) _printf_("\n");
+
+	for(int deg=0;deg<2;deg++){ // calculation is in the center of mass reference frame, neutralize degree 0 and 1 mass changes
+		for (int fr=0;fr<nfreq;fr++){
+			Lovef->K[fr*(sh_nmax+1)+deg]=-1.0;
+		}
+	}
+
+	for(int deg=sh_nmin;deg<sh_cutoff+1;deg++){
+		if (VerboseSolution() && Elastic && verbosecpu) {
+			_printf_("\r   Degree: " << deg << "/" << sh_nmax << "    ");
+		}
+
+		//precalculate yi coefficients that depend on degree but not frequency
+		fill_yi_prefactor<doubletype>(yi_prefactor, &deg, NULL,femmodel, matlitho,vars); 
+
+		for (int fr=0;fr<nfreq;fr++){
+			omega=angular_frequency<doubletype>(frequencies[fr]);
+			
+			//precalculate yi coefficients that depend on degree and frequency
+			fill_yi_prefactor<doubletype>(yi_prefactor, &deg,&omega,femmodel, matlitho,vars);
+
+			//solve the system
+			yi_boundary_conditions<doubletype>(yi_righthandside,deg,femmodel,matlitho,vars,forcing_type); 
+			build_yi_system<doubletype>(yi,deg,omega,yi_prefactor,femmodel,matlitho,vars);
+			solve_yi_system<doubletype>(&loveh,&lovel,&lovek, deg, omega, frequencies, yi, yi_righthandside,femmodel, matlitho,vars,verbosecpu);
+			Lovef->H[fr*(sh_nmax+1)+deg]=loveh;
+			Lovef->K[fr*(sh_nmax+1)+deg]=lovek-1.0;
+			Lovef->L[fr*(sh_nmax+1)+deg]=lovel;
+			deleted_layer_offset=(matlitho->numlayers+1)*6-vars->nyi;// =6 per deleted layer
+			kernel_index=fr*(sh_nmax+1)*(matlitho->numlayers+1)*6 + deg*(matlitho->numlayers+1)*6 + deleted_layer_offset;
+			for (int i=0;i<vars->nyi;i++){
+				Lovef->Kernels[kernel_index+i]=yi_righthandside[i];
+			}
+		}
+	}
+
+	if (Elastic) { // if elastic values were provided, we copy elastic love numbers above the cutoff degree instead of calculating them
+		for(int deg=sh_cutoff+1;deg<sh_nmax+1;deg++){
+			if (VerboseSolution() && Elastic  && verbosecpu) {
+				if (deg==sh_nmax || deg%100==0)	_printf_("\r   Degree: " << deg << "/" << Lovef->sh_nmax << "    ");
+			}
+			for (int fr=0;fr<nfreq;fr++){
+				// just copy the elastic values
+				Lovef->H[fr*(sh_nmax+1)+deg]=Elastic->H[deg];
+				Lovef->K[fr*(sh_nmax+1)+deg]=Elastic->K[deg];
+				Lovef->L[fr*(sh_nmax+1)+deg]=Elastic->L[deg];
+				deleted_layer_offset=(matlitho->numlayers+1)*6-vars->nyi;// =6 per deleted layer
+				kernel_index=fr*(sh_nmax+1)*(matlitho->numlayers+1)*6 + deg*(matlitho->numlayers+1)*6 + deleted_layer_offset;
+				kernel_indexe=deg*(matlitho->numlayers+1)*6 + deleted_layer_offset;
+				for (int i=0;i<vars->nyi;i++){
+					Lovef->Kernels[kernel_index+i]=Elastic->Kernels[kernel_indexe+i];
+				}
+			}
+		}
+	}
+
+	if (VerboseSolution() && Elastic  && verbosecpu) _printf_("\n");
+	xDelete<doubletype>(yi);
+	xDelete<doubletype>(yi_righthandside);
+	xDelete<doubletype>(yi_prefactor);
 }/*}}}*/
 
@@ -973,7 +1249,9 @@
 	IssmDouble  g0,r0;
 	int         nyi,starting_layer;
+	int*	    deg_layer_delete;
 
 	femmodel->parameters->FindParam(&GG,LoveGravitationalConstantEnum);
 	EarthMass=xNewZeroInit<IssmDouble>(numlayers+1);
+	deg_layer_delete=xNewZeroInit<int>(numlayers);
 
 	for (int i=0;i<numlayers;i++){
@@ -993,5 +1271,10 @@
 	starting_layer=0;
 
-	return new LoveVariables(EarthMass,g0,r0,nyi,starting_layer);
+	if(VerboseSolution()){
+		_printf_("     Surface gravity: " << g0 << " m.s^-2\n");
+		_printf_("     Mean density: " << EarthMass[numlayers-1]/(4.0/3.0*PI*pow(r0,3.0)) << " kg.m^-3\n");
+	}
+
+	return new LoveVariables(EarthMass,g0,r0,nyi,starting_layer,deg_layer_delete);
 
 } /*}}}*/
@@ -999,27 +1282,32 @@
 
 	Matlitho*   matlitho=NULL;
-	int         nfreq,nyi,starting_layer,nstep,forcing_type,dummy;
+	int         nfreq, NTit,nt, forcing_type,dummy, sh_cutoff;
 	int         sh_nmin,sh_nmax,kernel_index,deleted_layer_offset;
-	bool        allow_layer_deletion,love_kernels, istemporal;
+	bool        allow_layer_deletion,love_kernels, istemporal, freq_skip;
 	bool        verbosemod = (int)VerboseModule();
-	IssmDouble  mu0, underflow_tol;
 	IssmDouble *frequencies = NULL;
+	IssmDouble *frequencies_local=NULL;
 	bool        save_results;
 	bool        complex_computation;
+	bool	    verbosecpu=false;
 
 	doubletype  omega;
 	doubletype  lovek, loveh, lovel, loveratio;
-
-	doubletype*  LoveKf = NULL;
-	doubletype*  LoveHf = NULL;
-	doubletype*  LoveLf = NULL;
-
-	doubletype*  LoveKernels= NULL;
+	IssmDouble pw_threshold, pw_test_h, pw_test_l,pw_test_k;
+
+	LoveNumbers<doubletype>* Lovef=NULL;
+	LoveNumbers<doubletype>* Tidalf=NULL;
+
+	/* parallel computing */
+	LoveNumbers<doubletype>* Lovef_local=NULL;
+	LoveNumbers<doubletype>* Tidalf_local=NULL;
+
+	/*elastic & fluid love numbers*/
+	LoveNumbers<doubletype>* Elastic=NULL;
+	IssmDouble* frequencies_elastic=NULL;
+	LoveNumbers<doubletype>* Fluid=NULL;
+	IssmDouble* frequencies_fluid=NULL;
+
 	LoveVariables* vars=NULL;
-	doubletype* yi_prefactor=NULL;
-	doubletype* yi_righthandside=NULL;
-	doubletype* yi=NULL;
-
-	if(VerboseSolution()) _printf0_("   computing LOVE numbers\n");
 
 	/*recover materials parameters: there is only one Matlitho, chase it down the hard way:*/
@@ -1039,159 +1327,260 @@
 	femmodel->parameters->FindParam(&sh_nmax,LoveShNmaxEnum);
 	femmodel->parameters->FindParam(&sh_nmin,LoveShNminEnum);
-	femmodel->parameters->FindParam(&mu0,LoveMu0Enum);
 	femmodel->parameters->FindParam(&allow_layer_deletion,LoveAllowLayerDeletionEnum);
 	femmodel->parameters->FindParam(&love_kernels,LoveKernelsEnum);
 	femmodel->parameters->FindParam(&forcing_type,LoveForcingTypeEnum);
 	femmodel->parameters->FindParam(&istemporal,LoveIsTemporalEnum);
-	femmodel->parameters->FindParam(&nstep,LoveIntStepsPerLayerEnum);
 	femmodel->parameters->FindParam(&complex_computation,LoveComplexComputationEnum);
-
-	/*Initialize three love matrices: geoid, vertical and horizontal displacement (real and imaginary parts) */
-	LoveKf = xNewZeroInit<doubletype>(nfreq*(sh_nmax+1));
-	LoveHf = xNewZeroInit<doubletype>(nfreq*(sh_nmax+1));
-	LoveLf = xNewZeroInit<doubletype>(nfreq*(sh_nmax+1));
+	femmodel->parameters->FindParam(&pw_threshold,LovePostWidderThresholdEnum);
+	if (istemporal)	femmodel->parameters->FindParam(&NTit,LoveNTemporalIterationsEnum);
+
+	/*Initialize three love matrices: geoid, vertical and horizontal displacement*/
+	Lovef= new LoveNumbers<doubletype>(sh_nmin,sh_nmax,nfreq, matlitho);
+	Tidalf= new LoveNumbers<doubletype>(2,2,nfreq, matlitho);
+	Elastic= new LoveNumbers<doubletype>(sh_nmin,sh_nmax,1,matlitho);
+	Fluid= new LoveNumbers<doubletype>(sh_nmin,sh_nmax,1,matlitho);
 
 	/*Initialize love kernels (real and imaginary parts): */
-	LoveKernels= xNewZeroInit<doubletype>(nfreq*(sh_nmax+1)*(matlitho->numlayers+1)*6);
-
 	vars=love_init(femmodel,matlitho);
 
-	yi_prefactor=xNewZeroInit<doubletype>(6*6*nstep*matlitho->numlayers);
-	yi_righthandside=xNewZeroInit<doubletype>(vars->nyi);
-	yi=xNewZeroInit<doubletype>(vars->nyi*vars->nyi);
-
-	//precalculate yi coefficients that do not depend on degree or frequency
-	fill_yi_prefactor<doubletype>(yi_prefactor, NULL, NULL,femmodel, matlitho,vars); 
-	for(int deg=sh_nmin;deg<sh_nmax+1;deg++){
-
-		//precalculate yi coefficients that depend on degree but not frequency
-		fill_yi_prefactor<doubletype>(yi_prefactor, &deg, NULL,femmodel, matlitho,vars); 
-
-		for (int fr=0;fr<nfreq;fr++){
-			omega=angular_frequency<doubletype>(frequencies[fr]);
-
-			//precalculate yi coefficients that depend on degree and frequency
-			fill_yi_prefactor<doubletype>(yi_prefactor, &deg,&omega,femmodel, matlitho,vars); 
-
-			yi_boundary_conditions<doubletype>(yi_righthandside,deg,femmodel,matlitho,vars); 
-
-			build_yi_system<doubletype>(yi,deg,omega,yi_prefactor,femmodel,matlitho,vars);
-
-			solve_yi_system<doubletype>(&loveh,&lovel,&lovek, deg, omega, yi, yi_righthandside,femmodel, matlitho,vars);
-
-			LoveHf[deg*nfreq+fr]=loveh;
-			LoveKf[deg*nfreq+fr]=lovek-1.0;
-			LoveLf[deg*nfreq+fr]=lovel;
-
-			deleted_layer_offset=(matlitho->numlayers+1)*6-vars->nyi;// =6 per deleted layer
-			kernel_index=deg*nfreq*(matlitho->numlayers+1)*6 + fr*(matlitho->numlayers+1)*6 + deleted_layer_offset;
-			for (int i=0;i<vars->nyi;i++){
-				LoveKernels[kernel_index+i]=yi_righthandside[i];
-			}
-		}
-	}
-
-	xDelete<doubletype>(yi);
-	xDelete<doubletype>(yi_righthandside);
+	//distribute frequencies for parallel computation /*{{{*/
+	int nt_local, nf_local, lower_row, upper_row;
+	if (istemporal){ 
+		//temporal love numbers are obtained via blocks of 2*NTit frequencies samples
+		//here we are making sure no block is split between different cpus, which would make the inverse laplace transform impossible
+		nt=nfreq/2/NTit;
+		nt_local=DetermineLocalSize(nt,IssmComm::GetComm());
+		nf_local=nt_local*2*NTit; // number of local frequencies
+		GetOwnershipBoundariesFromRange(&lower_row,&upper_row,nt_local,IssmComm::GetComm());
+		lower_row*=2*NTit;
+		upper_row*=2*NTit;
+	}
+	else{
+		//in this case frequency samples are completely independent so we can split them evenly across cpus
+		nf_local=DetermineLocalSize(nfreq,IssmComm::GetComm());
+		GetOwnershipBoundariesFromRange(&lower_row,&upper_row,nf_local,IssmComm::GetComm());
+	}
+
+	if (lower_row==0) verbosecpu=true; //let only cpu1 be verbose
+	if(VerboseSolution() && verbosecpu) _printf0_("   computing LOVE numbers\n");
+
+	frequencies_local=xNewZeroInit<IssmDouble>(nf_local);
+	for (int fr=0;fr<nf_local;fr++)	frequencies_local[fr]=frequencies[lower_row+fr];
+
+	Lovef_local= new LoveNumbers<doubletype>(sh_nmin,sh_nmax,nf_local, matlitho);
+	Tidalf_local= new LoveNumbers<doubletype>(2,2,nf_local, matlitho);
+
+	/*}}}*/
+	frequencies_elastic=xNewZeroInit<IssmDouble>(1);
+	frequencies_fluid=xNewZeroInit<IssmDouble>(1);
+	for (int fr=0;fr<nfreq;fr++){ // find the lowest non-zero frequency requested
+		if (frequencies_fluid[0]==0) frequencies_fluid[0]=frequencies[fr];
+		else if(frequencies[fr]!=0 && frequencies_fluid[0]>frequencies[fr]) frequencies_fluid[0]=frequencies[fr];
+	}
+
+	// run elastic and fluid love numbers
+	if(VerboseSolution() && verbosecpu) _printf_("     elastic\n");
+	compute_love_numbers<doubletype>(Elastic, NULL, forcing_type, sh_nmax,frequencies_elastic, femmodel, matlitho, vars,verbosecpu);
+
+	if (nfreq>1){
+		compute_love_numbers<doubletype>(Fluid, NULL, forcing_type, sh_nmax,frequencies_fluid, femmodel, matlitho, vars,verbosecpu);
+		sh_cutoff=sh_nmax;
+		for (int deg=100;deg<sh_nmax+1;deg++){
+			pw_test_h=abs((Fluid->H[deg]-Elastic->H[deg])/Elastic->H[deg]);
+			pw_test_k=abs((Fluid->K[deg]-Elastic->K[deg])/Elastic->K[deg]);
+			pw_test_l=abs((Fluid->L[deg]-Elastic->L[deg])/Elastic->L[deg]);
+			if (pw_test_h<pw_threshold && pw_test_k<pw_threshold && pw_test_l<pw_threshold){
+				sh_cutoff=deg;
+				if(VerboseSolution() && verbosecpu){
+					_printf_("   Degree: " << deg << "/" << sh_nmax << "    ");
+					_printf_("      found negligible variation across frequencies, will copy elastic values after this degree\n");
+					_printf_("      Delta_h/h=" << pw_test_h << "; Delta_k/k="<< pw_test_k << "; Delta_l/l=" << pw_test_l << "; threshold set to " << pw_threshold << "\n");
+				}
+				break;
+			}
+		}
+	} 
+	else sh_cutoff=sh_nmax; 
+		
+
+
+	//Take care of rotationnal feedback love numbers first, if relevant /*{{{*/
+	if (forcing_type==11 && sh_nmin<=2 && sh_nmax>=2){ // if forcing is surface loading and we have degree 2
+		if(VerboseSolution() && verbosecpu) _printf_("     tidal\n");
+		int tidal_forcing_type=9;
+		compute_love_numbers<doubletype>(Tidalf_local, NULL,tidal_forcing_type=9, 2,frequencies_local, femmodel, matlitho, vars,verbosecpu);
+	}
+	/*}}}*/
+
+	//Resume requested forcing_type
+	if (nfreq>1){ // if we are not running just elastic love numbers
+		if(VerboseSolution() && verbosecpu){
+			if (forcing_type==11) _printf_("     loading\n");
+			else if(forcing_type==9) _printf_("     tidal\n");
+			else _printf_("     love\n");
+		}
+		compute_love_numbers<doubletype>(Lovef_local, Elastic, forcing_type, sh_cutoff, frequencies_local, femmodel, matlitho, vars,verbosecpu);
+	}
+	else{
+		Lovef_local->Copy(Elastic);
+	}
+	/*}}}*/
+
 
 	//Temporal love numbers
 	if (istemporal && !complex_computation){
-
-		IssmDouble*  LoveHtDouble=NULL;
-		IssmDouble*  LoveKtDouble=NULL;
-		IssmDouble*  LoveLtDouble=NULL;
-		doubletype*  LoveHt=NULL;
-		doubletype*  LoveLt=NULL;
-		doubletype*  LoveKt=NULL;
-
-		int NTit;
-		femmodel->parameters->FindParam(&NTit,LoveNTemporalIterationsEnum);
-		int nt = nfreq/2/NTit;
-
-		LoveHt=xNewZeroInit<doubletype>((sh_nmax+1)*nt);
-		LoveLt=xNewZeroInit<doubletype>((sh_nmax+1)*nt);
-		LoveKt=xNewZeroInit<doubletype>((sh_nmax+1)*nt);
-
-		love_freq_to_temporal<doubletype>(LoveHt,LoveLt,LoveKt,LoveHf,LoveLf,LoveKf,femmodel);
-
-		/*Downcast and add into parameters:*/
-		LoveHtDouble=xNew<IssmDouble>((sh_nmax+1)*nt);
-		LoveLtDouble=xNew<IssmDouble>((sh_nmax+1)*nt);
-		LoveKtDouble=xNew<IssmDouble>((sh_nmax+1)*nt);
-		for(int i=0;i<(sh_nmax+1)*nt;i++){
-			LoveHtDouble[i]=std::real(LoveHt[i]);
-			LoveLtDouble[i]=std::real(LoveLt[i]);
-			LoveKtDouble[i]=std::real(LoveKt[i]);
-		}
+		/*Initialize*/
+		doubletype*  pmtf_colineart=NULL;
+		doubletype*  pmtf_orthot=NULL;
+		LoveNumbers<doubletype>* Lovet=NULL;
+		LoveNumbers<doubletype>* Tidalt=NULL;
+		/*Downcast arrays to be exported in parameters*/
+		LoveNumbers<IssmDouble>* LovetDouble=NULL;
+		LoveNumbers<IssmDouble>* TidaltDouble=NULL;
+		IssmDouble*  pmtf_colineartDouble=NULL;
+		IssmDouble*  pmtf_orthotDouble=NULL;
+		/* parallel computing */
+		doubletype*  pmtf_colineart_local=NULL;
+		doubletype*  pmtf_orthot_local=NULL;	
+		LoveNumbers<doubletype>* Lovet_local=NULL;
+		LoveNumbers<doubletype>* Tidalt_local=NULL;	
+
+		Lovet= new LoveNumbers<doubletype>(sh_nmin,sh_nmax,nt,matlitho);
+		Tidalt= new LoveNumbers<doubletype>(2,2,nt,matlitho);
+		pmtf_colineart=xNewZeroInit<doubletype>(3*nt);
+		pmtf_orthot=xNewZeroInit<doubletype>(3*nt);	
+
+		Lovet_local= new LoveNumbers<doubletype>(sh_nmin,sh_nmax,nt_local,matlitho);
+		Tidalt_local= new LoveNumbers<doubletype>(2,2,nt_local,matlitho);	
+		pmtf_colineart_local=xNewZeroInit<doubletype>(3*nt_local);
+		pmtf_orthot_local=xNewZeroInit<doubletype>(3*nt_local);
+
+		love_freq_to_temporal<doubletype>(Lovet_local,Tidalt_local,pmtf_colineart_local,pmtf_orthot_local,Lovef_local,Tidalf_local,frequencies_local,femmodel,verbosecpu);
+
+		/* MPI Gather */ /*{{{*/
+		Lovef->LoveMPI_Gather(Lovef_local, lower_row);
+		if (forcing_type==11 && sh_nmin<=2 && sh_nmax>=2){
+			Tidalf->LoveMPI_Gather(Tidalf_local, lower_row);		
+		}
+		Lovet->LoveMPI_Gather(Lovet_local, lower_row/2/NTit);
+		Tidalt->LoveMPI_Gather(Tidalt_local, lower_row/2/NTit);	
+		//pmtf:
+		int* recvcounts=xNew<int>(IssmComm::GetSize());
+		int* displs=xNew<int>(IssmComm::GetSize());
+		int  rc;
+		int  offset;
+		rc=3*nt_local;
+		offset=3*lower_row/2/NTit;
+		ISSM_MPI_Allgather(&rc,1,ISSM_MPI_INT,recvcounts,1,ISSM_MPI_INT,IssmComm::GetComm());
+		ISSM_MPI_Allgather(&offset,1,ISSM_MPI_INT,displs,1,ISSM_MPI_INT,IssmComm::GetComm());
+		ISSM_MPI_Allgatherv(pmtf_colineart_local, rc, ISSM_MPI_DOUBLE, pmtf_colineart, recvcounts, displs, ISSM_MPI_DOUBLE,IssmComm::GetComm());
+		ISSM_MPI_Allgatherv(pmtf_orthot_local, rc, ISSM_MPI_DOUBLE, pmtf_orthot, recvcounts, displs, ISSM_MPI_DOUBLE,IssmComm::GetComm());
+		xDelete<int>(recvcounts);
+		xDelete<int>(displs);
+		/*}}}*/	
+
+		/*Downcast and add into parameters:*/ /*{{{*/
+		LovetDouble= new LoveNumbers<IssmDouble>(sh_nmin,sh_nmax,nt,matlitho);
+		TidaltDouble= new LoveNumbers<IssmDouble>(2,2,nt,matlitho);	
+
+		pmtf_colineartDouble=xNew<IssmDouble>(nt);
+		pmtf_orthotDouble=xNew<IssmDouble>(nt);
+
+		Lovet->DownCastToDouble(LovetDouble);
+		Tidalt->DownCastToDouble(TidaltDouble);
+		for(int i=0;i<nt;i++){
+			pmtf_colineartDouble[i]=std::real(pmtf_colineart[2*nt+i]);
+			pmtf_orthotDouble[i]=std::real(pmtf_orthot[2*nt+i]);
+		}
+
 		if(forcing_type==9){ //tidal loading
-			femmodel->parameters->AddObject(new DoubleMatParam(TidalLoveHEnum,LoveHtDouble,(sh_nmax+1)*nt,1));
-			femmodel->parameters->AddObject(new DoubleMatParam(TidalLoveKEnum,LoveKtDouble,(sh_nmax+1)*nt,1));
-			femmodel->parameters->AddObject(new DoubleMatParam(TidalLoveLEnum,LoveLtDouble,(sh_nmax+1)*nt,1));
+			femmodel->parameters->AddObject(new DoubleMatParam(TidalLoveHEnum,LovetDouble->H,(sh_nmax+1)*nt,1));
+			femmodel->parameters->AddObject(new DoubleMatParam(TidalLoveKEnum,LovetDouble->K,(sh_nmax+1)*nt,1));
+			femmodel->parameters->AddObject(new DoubleMatParam(TidalLoveLEnum,LovetDouble->L,(sh_nmax+1)*nt,1));
 		}
 		else if(forcing_type==11){ //surface loading
-			femmodel->parameters->AddObject(new DoubleMatParam(LoadLoveHEnum,LoveHtDouble,(sh_nmax+1)*nt,1));
-			femmodel->parameters->AddObject(new DoubleMatParam(LoadLoveKEnum,LoveKtDouble,(sh_nmax+1)*nt,1));
-			femmodel->parameters->AddObject(new DoubleMatParam(LoadLoveLEnum,LoveLtDouble,(sh_nmax+1)*nt,1));
-		}
-		xDelete<IssmDouble>(LoveHtDouble);
-		xDelete<IssmDouble>(LoveKtDouble);
-		xDelete<IssmDouble>(LoveLtDouble);
-
+			femmodel->parameters->AddObject(new DoubleMatParam(LoadLoveHEnum,LovetDouble->H,(sh_nmax+1)*nt,1));
+			femmodel->parameters->AddObject(new DoubleMatParam(LoadLoveKEnum,LovetDouble->K,(sh_nmax+1)*nt,1));
+			femmodel->parameters->AddObject(new DoubleMatParam(LoadLoveLEnum,LovetDouble->L,(sh_nmax+1)*nt,1));
+			femmodel->parameters->AddObject(new DoubleMatParam(TidalLoveHEnum,TidaltDouble->H,3*nt,1));
+			femmodel->parameters->AddObject(new DoubleMatParam(TidalLoveKEnum,TidaltDouble->K,3*nt,1));
+			femmodel->parameters->AddObject(new DoubleMatParam(TidalLoveLEnum,TidaltDouble->L,3*nt,1));
+			femmodel->parameters->AddObject(new DoubleMatParam(LovePolarMotionTransferFunctionColinearEnum,pmtf_colineartDouble,nt,1));
+			femmodel->parameters->AddObject(new DoubleMatParam(LovePolarMotionTransferFunctionOrthogonalEnum,pmtf_orthotDouble,nt,1));
+		}
+
+		xDelete<IssmDouble>(pmtf_colineartDouble);
+		xDelete<IssmDouble>(pmtf_orthotDouble);
+		/*}}}*/	
+	
 		/*Add into external results, no need to downcast, we can handle complexes/quad precision: */
-		femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveKrEnum,LoveKt,sh_nmax+1,nt,0,0));
-		femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveHrEnum,LoveHt,sh_nmax+1,nt,0,0));
-		femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveLrEnum,LoveLt,sh_nmax+1,nt,0,0));
-
-		xDelete<doubletype>(LoveHt);
-		xDelete<doubletype>(LoveLt);
-		xDelete<doubletype>(LoveKt);
+		femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveKtEnum,Lovet->K,nt,sh_nmax+1,0,0));
+		femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveHtEnum,Lovet->H,nt,sh_nmax+1,0,0));
+		femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveLtEnum,Lovet->L,nt,sh_nmax+1,0,0));
+
+		femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveTidalKtEnum,Tidalt->K,nt,3,0,0));
+		femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveTidalHtEnum,Tidalt->H,nt,3,0,0));
+		femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveTidalLtEnum,Tidalt->L,nt,3,0,0));
+		femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LovePMTF1tEnum,pmtf_colineart,nt,3,0,0));
+		femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LovePMTF2tEnum,pmtf_orthot,nt,3,0,0));
+
+		delete Lovet;
+		delete Tidalt;
+		delete Lovet_local;
+		delete Tidalt_local;
+		delete LovetDouble;
+		delete TidaltDouble;
+
+		xDelete<doubletype>(pmtf_colineart);
+		xDelete<doubletype>(pmtf_orthot);
 	}
 	else{
-
-		IssmDouble*  LoveHfDouble=NULL;
-		IssmDouble*  LoveKfDouble=NULL;
-		IssmDouble*  LoveLfDouble=NULL;
+		LoveNumbers<IssmDouble>* LovefDouble=NULL;
+		LovefDouble= new LoveNumbers<IssmDouble>(sh_nmin,sh_nmax,nfreq,matlitho);
+
+		/*MPI_Gather*/
+		if (nfreq>1){
+			Lovef->LoveMPI_Gather(Lovef_local, lower_row);
+			if (forcing_type==11 && sh_nmin<=2 && sh_nmax>=2){
+				Tidalf->LoveMPI_Gather(Tidalf_local, lower_row);		
+			}
+		}
+		else{
+			Lovef->Copy(Elastic);
+			Tidalf->Copy(Tidalf_local);
+		}
 
 		/*Add into parameters:*/
-		LoveHfDouble=xNew<IssmDouble>((sh_nmax+1)*nfreq);
-		LoveLfDouble=xNew<IssmDouble>((sh_nmax+1)*nfreq);
-		LoveKfDouble=xNew<IssmDouble>((sh_nmax+1)*nfreq);
-		for(int i=0;i<(sh_nmax+1)*nfreq;i++){
-			LoveHfDouble[i]=std::real(LoveHf[i]);
-			LoveLfDouble[i]=std::real(LoveLf[i]);
-			LoveKfDouble[i]=std::real(LoveKf[i]);
-		}
+		Lovef->DownCastToDouble(LovefDouble);
 		if(forcing_type==9){ //tidal loading
-			femmodel->parameters->AddObject(new DoubleMatParam(TidalLoveHEnum,LoveHfDouble,(sh_nmax+1)*nfreq,1));
-			femmodel->parameters->AddObject(new DoubleMatParam(TidalLoveKEnum,LoveKfDouble,(sh_nmax+1)*nfreq,1));
-			femmodel->parameters->AddObject(new DoubleMatParam(TidalLoveLEnum,LoveLfDouble,(sh_nmax+1)*nfreq,1));
+			femmodel->parameters->AddObject(new DoubleMatParam(TidalLoveHEnum,LovefDouble->H,(sh_nmax+1)*nfreq,1));
+			femmodel->parameters->AddObject(new DoubleMatParam(TidalLoveKEnum,LovefDouble->K,(sh_nmax+1)*nfreq,1));
+			femmodel->parameters->AddObject(new DoubleMatParam(TidalLoveLEnum,LovefDouble->L,(sh_nmax+1)*nfreq,1));
 		}
 		else if(forcing_type==11){ //surface loading
-			femmodel->parameters->AddObject(new DoubleMatParam(LoadLoveHEnum,LoveHfDouble,(sh_nmax+1)*nfreq,1));
-			femmodel->parameters->AddObject(new DoubleMatParam(LoadLoveKEnum,LoveKfDouble,(sh_nmax+1)*nfreq,1));
-			femmodel->parameters->AddObject(new DoubleMatParam(LoadLoveLEnum,LoveLfDouble,(sh_nmax+1)*nfreq,1));
-		}
-		xDelete<IssmDouble>(LoveHfDouble);
-		xDelete<IssmDouble>(LoveKfDouble);
-		xDelete<IssmDouble>(LoveLfDouble);
+			femmodel->parameters->AddObject(new DoubleMatParam(LoadLoveHEnum,LovefDouble->H,(sh_nmax+1)*nfreq,1));
+			femmodel->parameters->AddObject(new DoubleMatParam(LoadLoveKEnum,LovefDouble->K,(sh_nmax+1)*nfreq,1));
+			femmodel->parameters->AddObject(new DoubleMatParam(LoadLoveLEnum,LovefDouble->L,(sh_nmax+1)*nfreq,1));
+		}
+		delete LovefDouble;
 	}
 
 	/*Add into external results:*/
-	femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveKiEnum,LoveKf,sh_nmax+1,nfreq,0,0));
-	femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveHiEnum,LoveHf,sh_nmax+1,nfreq,0,0));
-	femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveLiEnum,LoveLf,sh_nmax+1,nfreq,0,0));
-
+	femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveKfEnum,Lovef->K,nfreq,sh_nmax+1,0,0));
+	femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveHfEnum,Lovef->H,nfreq,sh_nmax+1,0,0));
+	femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveLfEnum,Lovef->L,nfreq,sh_nmax+1,0,0));
 	/*Only when love_kernels is on*/
 	if (love_kernels==1) {
-		femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveKernelsEnum,LoveKernels,(sh_nmax+1)*(matlitho->numlayers+1)*6,nfreq,0,0));
-	}
-
+		femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveKernelsEnum,Lovef->Kernels,nfreq,(sh_nmax+1)*(matlitho->numlayers+1)*6,0,0));
+	}
 	/*Free resources:*/
 	xDelete<IssmDouble>(frequencies);
-	xDelete<doubletype>(LoveKf);
-	xDelete<doubletype>(LoveHf);
-	xDelete<doubletype>(LoveLf);
-	xDelete<doubletype>(LoveKernels);
-
+	xDelete<IssmDouble>(frequencies_local);
+	xDelete<IssmDouble>(frequencies_elastic);
+	delete Lovef;
+	delete Lovef_local;
+	delete Tidalf;
+	delete Tidalf_local;
+	delete Elastic;
 	/* Legacy for fortran core, to be removed after complete validation */
 
@@ -1225,10 +1614,10 @@
 
 	/*Add love matrices to results:*/
-	//femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveKrEnum,LoveKr,sh_nmax+1,nfreq,0,0));
-	//femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveHrEnum,LoveHr,sh_nmax+1,nfreq,0,0));
-	//femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveLrEnum,LoveLr,sh_nmax+1,nfreq,0,0));
-	//femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveKiEnum,LoveKi,sh_nmax+1,nfreq,0,0));
-	//femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveHiEnum,LoveHi,sh_nmax+1,nfreq,0,0));
-	//femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveLiEnum,LoveLi,sh_nmax+1,nfreq,0,0));
+	//femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveKtEnum,LoveKr,sh_nmax+1,nfreq,0,0));
+	//femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveHtEnum,LoveHr,sh_nmax+1,nfreq,0,0));
+	//femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveLtEnum,LoveLr,sh_nmax+1,nfreq,0,0));
+	//femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveKfEnum,LoveKi,sh_nmax+1,nfreq,0,0));
+	//femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveHfEnum,LoveHi,sh_nmax+1,nfreq,0,0));
+	//femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveLfEnum,LoveLi,sh_nmax+1,nfreq,0,0));
 
 	//xDelete<IssmDouble>(LoveKr);
@@ -1251,6 +1640,6 @@
 template void        GetEarthRheology<IssmDouble>(IssmDouble* pla, IssmDouble* pmu, int layer_index, IssmDouble omega,  Matlitho* matlitho);
 template void        GetEarthRheology<IssmComplex>(IssmComplex* pla, IssmComplex* pmu, int layer_index, IssmComplex omega,  Matlitho* matlitho);
-template void        yi_boundary_conditions<IssmDouble>(IssmDouble* yi_righthandside, int deg, FemModel* femmodel, Matlitho* matlitho,LoveVariables* vars);
-template void        yi_boundary_conditions<IssmComplex>(IssmComplex* yi_righthandside, int deg, FemModel* femmodel, Matlitho* matlitho,LoveVariables* vars);
+template void        yi_boundary_conditions<IssmDouble>(IssmDouble* yi_righthandside, int deg, FemModel* femmodel, Matlitho* matlitho,LoveVariables* vars, int forcing_type);
+template void        yi_boundary_conditions<IssmComplex>(IssmComplex* yi_righthandside, int deg, FemModel* femmodel, Matlitho* matlitho,LoveVariables* vars, int forcing_type);
 template void        yi_derivatives<IssmDouble>(IssmDouble* dydx, IssmDouble* y, int layer_index, int n, IssmDouble* yi_prefactor, FemModel* femmodel, Matlitho* matlitho);
 template void        yi_derivatives<IssmComplex>(IssmComplex* dydx, IssmComplex* y, int layer_index, int n, IssmComplex* yi_prefactor, FemModel* femmodel, Matlitho* matlitho);
@@ -1263,10 +1652,12 @@
 template void        build_yi_system<IssmDouble>(IssmDouble* yi, int deg, IssmDouble omega, IssmDouble* yi_prefactor, FemModel* femmodel, Matlitho* matlitho,LoveVariables* vars);
 template void        build_yi_system<IssmComplex>(IssmComplex* yi, int deg, IssmComplex omega, IssmComplex* yi_prefactor, FemModel* femmodel, Matlitho* matlitho,LoveVariables* vars);
-template void        solve_yi_system<IssmDouble>(IssmDouble* loveh, IssmDouble* lovel, IssmDouble* lovek, int deg, IssmDouble omega, IssmDouble* yi, IssmDouble* rhs, FemModel* femmodel, Matlitho* matlitho, LoveVariables* vars);
-template void        solve_yi_system<IssmComplex>(IssmComplex* loveh, IssmComplex* lovel, IssmComplex* lovek, int deg, IssmComplex omega, IssmComplex* yi, IssmComplex* rhs, FemModel* femmodel, Matlitho* matlitho, LoveVariables* vars);
+template void        solve_yi_system<IssmDouble>(IssmDouble* loveh, IssmDouble* lovel, IssmDouble* lovek, int deg, IssmDouble omega, IssmDouble* frequencies, IssmDouble* yi, IssmDouble* rhs, FemModel* femmodel, Matlitho* matlitho, LoveVariables* vars,bool verbosecpu);
+template void        solve_yi_system<IssmComplex>(IssmComplex* loveh, IssmComplex* lovel, IssmComplex* lovek, int deg, IssmComplex omega, IssmDouble* frequencies, IssmComplex* yi, IssmComplex* rhs, FemModel* femmodel, Matlitho* matlitho, LoveVariables* vars,bool verbosecpu);
+template void	     compute_love_numbers<IssmDouble>(LoveNumbers<IssmDouble>* Lovef, LoveNumbers<IssmDouble>* Elastic, int forcing_type, int sh_cutoff,IssmDouble* frequencies, FemModel* femmodel, Matlitho* matlitho, LoveVariables* vars, bool verbosecpu);
+template void	     compute_love_numbers<IssmComplex>(LoveNumbers<IssmComplex>* Lovef, LoveNumbers<IssmComplex>* Elastic, int forcing_type, int sh_cutoff, IssmDouble* frequencies, FemModel* femmodel, Matlitho* matlitho, LoveVariables* vars, bool verbosecpu);
 template IssmDouble  factorial<IssmDouble>(int n);
 template IssmDouble* postwidder_coef<IssmDouble>(int NTit);
 template IssmDouble  n_C_r<IssmDouble>(int n, int r);
-template void         postwidder_transform<IssmDouble>(IssmDouble* Lovet, IssmDouble* Lovef,int d, int t, int NTit, IssmDouble* xi, FemModel* femmodel);
+template void         postwidder_transform<IssmDouble>(IssmDouble* Lovet, IssmDouble* Lovef,int d, int t, int sh_nmax,int NTit, IssmDouble* xi, FemModel* femmodel);
 
 /*}}}*/
Index: /issm/trunk/src/c/cores/masstransport_core.cpp
===================================================================
--- /issm/trunk/src/c/cores/masstransport_core.cpp	(revision 27034)
+++ /issm/trunk/src/c/cores/masstransport_core.cpp	(revision 27035)
@@ -49,4 +49,8 @@
 		solutionsequence_linear(femmodel);
 		femmodel->parameters->SetParam(SurfaceEnum,InputToExtrudeEnum);
+		extrudefromtop_core(femmodel);
+		femmodel->parameters->SetParam(ThicknessEnum,InputToExtrudeEnum);
+		extrudefromtop_core(femmodel);
+		femmodel->parameters->SetParam(BaseEnum,InputToExtrudeEnum);
 		extrudefromtop_core(femmodel);
 	}
Index: /issm/trunk/src/c/cores/movingfront_core.cpp
===================================================================
--- /issm/trunk/src/c/cores/movingfront_core.cpp	(revision 27034)
+++ /issm/trunk/src/c/cores/movingfront_core.cpp	(revision 27035)
@@ -48,4 +48,7 @@
 	}
 
+	/* smoothen slope of lsf for computation of normal on ice domain*/
+	levelsetfunctionslope_core(femmodel);
+
 	/* start the work from here */
 	if(VerboseSolution()) _printf0_("   computing calving and undercutting\n");
@@ -53,7 +56,4 @@
 	FrontalForcingsx(femmodel);
 	if(VerboseSolution()) _printf0_("   computing new ice front position\n");
-
-	/* smoothen slope of lsf for computation of normal on ice domain*/
-	levelsetfunctionslope_core(femmodel);
 
 	/* determine variables for extrapolation */
@@ -114,12 +114,23 @@
 
 	/* solve level set equation */
-	analysis = new LevelsetAnalysis();
-	analysis->Core(femmodel);
-	delete analysis;
+	LevelsetAnalysis lsanalysis;
+	lsanalysis.Core(femmodel);
+	lsanalysis.PostProcess(femmodel);
 
 	/*Kill ice berg to avoid free body motion*/
 	if(killicebergs){
+		int killberg = 0;
 		if(VerboseSolution()) _printf0_("   looking for icebergs to kill\n");
-		KillIcebergsx(femmodel);
+		killberg = KillIcebergsx(femmodel);
+		/*wait for all cores*/
+		int totalkill;
+		ISSM_MPI_Reduce(&killberg,&totalkill,1,ISSM_MPI_INT,ISSM_MPI_SUM,0,IssmComm::GetComm());
+		ISSM_MPI_Bcast(&totalkill,1,ISSM_MPI_INT,0,IssmComm::GetComm());
+
+		if (totalkill > 0) {
+			if(VerboseSolution()) _printf0_("   reinitializing level set after killing " << totalkill << " icebergs\n");
+			femmodel->ResetLevelset();
+			ResetBoundaryConditions(femmodel,LevelsetAnalysisEnum);
+		}
 	}
 
@@ -128,4 +139,5 @@
 		if(VerboseSolution()) _printf0_("   reinitializing level set\n");
 		femmodel->ResetLevelset();
+		ResetBoundaryConditions(femmodel,LevelsetAnalysisEnum);
 	}
 
@@ -133,4 +145,10 @@
 	GetMaskOfIceVerticesLSMx(femmodel);
 
+	/*Save results*/
+	if(save_results){
+		int outputs[1] = {MaskIceLevelsetEnum};
+		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],1);
+	}
+
 	/*End profiler*/
 	femmodel->profiler->Stop(MOVINGFRONTCORE);
Index: /issm/trunk/src/c/cores/sampling_core.cpp
===================================================================
--- /issm/trunk/src/c/cores/sampling_core.cpp	(revision 27034)
+++ /issm/trunk/src/c/cores/sampling_core.cpp	(revision 27035)
@@ -5,4 +5,6 @@
 #include "../classes/classes.h"
 #include "../solutionsequences/solutionsequences.h"
+#include "../analyses/analyses.h" // new
+#include "../modules/modules.h"
 
 void sampling_core(FemModel* femmodel){
@@ -30,6 +32,32 @@
 	/*Generate random sample*/
 	if(VerboseSolution()) _printf0_("   call computational core\n");
+	SamplingAnalysis* analysis = new SamplingAnalysis();
 	femmodel->SetCurrentConfiguration(SamplingAnalysisEnum);
+
+	if(solution_type==TransientSolutionEnum){
+		InputDuplicatex(femmodel,SampleEnum,SampleOldEnum);
+
+    int seed;
+		femmodel->parameters->FindParam(&seed,SamplingSeedEnum);
+		if(seed>=0){
+			int step;
+			femmodel->parameters->FindParam(&step,StepEnum);
+			seed = seed + 13923272*step; // change default seed for transient simulations (by considering an arbitrary shift based on the step number)
+			femmodel->parameters->SetParam(seed,SamplingSeedEnum);
+		}
+
+	}
+
 	solutionsequence_sampling(femmodel);
+
+	if(solution_type==TransientSolutionEnum){
+
+		InputDuplicatex(femmodel,SampleEnum,SampleNoiseEnum);
+
+		analysis->UpdateTransientSample(femmodel);
+
+	}
+
+	delete analysis;
 
 	if(save_results){
@@ -46,3 +74,5 @@
 	/*profiler*/
 	femmodel->profiler->Stop(SAMPLINGCORE);
+
+
 }
Index: /issm/trunk/src/c/cores/sealevelchange_core.cpp
===================================================================
--- /issm/trunk/src/c/cores/sealevelchange_core.cpp	(revision 27034)
+++ /issm/trunk/src/c/cores/sealevelchange_core.cpp	(revision 27035)
@@ -24,5 +24,6 @@
 bool slcconvergence(Vector<IssmDouble>* RSLg,Vector<IssmDouble>* RSLg_old,IssmDouble eps_rel,IssmDouble eps_abs);
 IssmDouble  SealevelloadsOceanAverage(GrdLoads* loads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble totaloceanarea);
-void PolarMotion(IssmDouble* m, FemModel* femmodel,GrdLoads* loads, SealevelGeometry* slgeom);
+void PolarMotion(IssmDouble* m, FemModel* femmodel,GrdLoads* loads, SealevelGeometry* slgeom, bool computefuture);
+void SealevelchangeUpdateViscousTimeSeries(FemModel* femmodel);
 void ConserveOceanMass(FemModel* femmodel,GrdLoads* loads, IssmDouble offset, SealevelGeometry* slgeom);
 void ivins_deformation_core(FemModel* femmodel);
@@ -247,4 +248,5 @@
 	bool rotation=false;
 	bool planethasocean=false;
+	bool computefuture=false;
 	IssmDouble*           sealevelpercpu=NULL;
 
@@ -304,9 +306,6 @@
 	if(VerboseSolution()) _printf0_("	  starting  GRD convolutions\n");
 
-	/*update viscous RSL:*/
-	for(Object* & object : femmodel->elements->objects){
-		Element* element = xDynamicCast<Element*>(object);
-		element->SealevelchangeUpdateViscousFields();
-	}
+	/*update viscous time series to keep up with time stepping:*/
+	SealevelchangeUpdateViscousTimeSeries(femmodel);
 
 	/*buildup loads: */
@@ -319,12 +318,9 @@
 	loads->BroadcastLoads();
 
-	//compute polar motion:
-	PolarMotion(&polarmotionvector[0],femmodel,loads,slgeom);
-
 	/*skip computation of sea level equation if requested, which means sea level loads should be zeroed */
 	if(!sealevelloading){
 		loads->sealevelloads=xNewZeroInit<IssmDouble>(nel);
 		loads->subsealevelloads=xNewZeroInit<IssmDouble>(slgeom->nbar[SLGEOM_OCEAN]);
-
+		PolarMotion(&polarmotionvector[0],femmodel,loads, slgeom, computefuture=true);
 		goto deformation;
 	}
@@ -332,4 +328,7 @@
 	if(VerboseSolution()) _printf0_("	  converging GRD convolutions\n");
 	for(;;){
+
+		//compute polar motion:
+		PolarMotion(&polarmotionvector[0],femmodel,loads,slgeom,computefuture=false);
 
 		oldsealevelloads=loads->vsealevelloads->Duplicate(); loads->vsealevelloads->Copy(oldsealevelloads);
@@ -338,5 +337,5 @@
 		for(Object* & object : femmodel->elements->objects){
 			Element* element = xDynamicCast<Element*>(object);
-			element->SealevelchangeConvolution(sealevelpercpu, loads , polarmotionvector,slgeom);
+			element->SealevelchangeConvolution(sealevelpercpu, loads, polarmotionvector,slgeom);
 		}
 
@@ -364,7 +363,4 @@
 		loads->BroadcastSealevelLoads();
 
-		//compute polar motion:
-		PolarMotion(&polarmotionvector[0],femmodel,loads, slgeom);
-
 		//convergence?
 		if(slcconvergence(loads->vsealevelloads,oldsealevelloads,eps_rel,eps_abs))break;
@@ -374,4 +370,7 @@
 		iterations++;
 	}
+
+	//recompute polar motion one final time, this time updating viscous stacks for future time steps
+	if (viscous)	PolarMotion(&polarmotionvector[0],femmodel,loads, slgeom, computefuture=true);
 
 	deformation:
@@ -418,7 +417,7 @@
 
 	if (rotation) {
-		femmodel->results->AddResult(new GenericExternalResult<IssmDouble>(femmodel->results->Size()+1,SealevelInertiaTensorXZEnum,polarmotionvector[0],step,time));
-		femmodel->results->AddResult(new GenericExternalResult<IssmDouble>(femmodel->results->Size()+1,SealevelInertiaTensorYZEnum,polarmotionvector[1],step,time));
-		femmodel->results->AddResult(new GenericExternalResult<IssmDouble>(femmodel->results->Size()+1,SealevelInertiaTensorZZEnum,polarmotionvector[2],step,time));
+		femmodel->results->AddResult(new GenericExternalResult<IssmDouble>(femmodel->results->Size()+1,SealevelchangePolarMotionXEnum,polarmotionvector[0],step,time));
+		femmodel->results->AddResult(new GenericExternalResult<IssmDouble>(femmodel->results->Size()+1,SealevelchangePolarMotionYEnum,polarmotionvector[1],step,time));
+		femmodel->results->AddResult(new GenericExternalResult<IssmDouble>(femmodel->results->Size()+1,SealevelchangePolarMotionZEnum,polarmotionvector[2],step,time));
 	}
 
@@ -666,4 +665,7 @@
 	}
 
+	/*Compute spherical harmonic functions for spatial integrations of the loads*/
+	slgeom->BuildSphericalHarmonics();
+
 	femmodel->parameters->AddObject(new DoubleVecParam(XxeEnum,xxe,nel));
 	femmodel->parameters->AddObject(new DoubleVecParam(YyeEnum,yye,nel));
@@ -731,5 +733,5 @@
 
 	vsealevelloadsvolume->PointwiseMult(loads->vsealevelloads,oceanareas);
-	vsubsealevelloadsvolume->PointwiseMult(loads->vsubsealevelloads,suboceanareas);
+	vsubsealevelloadsvolume->PointwiseMult(loads->vsubsealevelloads,suboceanareas); 
 
 	vsealevelloadsvolume->Sum(&sealevelloadsaverage);
@@ -740,16 +742,29 @@
 	return (sealevelloadsaverage+subsealevelloadsaverage)/totaloceanarea;
 } /*}}}*/
-void PolarMotion(IssmDouble* polarmotionvector, FemModel* femmodel,GrdLoads* loads, SealevelGeometry* slgeom){ /*{{{*/
-
-	IssmDouble  moi_list[3]={0,0,0};
-	IssmDouble  moi_list_sub[3]={0,0,0};
-	IssmDouble  moi_list_cpu[3]={0,0,0};
-	IssmDouble*	tide_love_h  = NULL;
-	IssmDouble*	tide_love_k  = NULL;
-	IssmDouble*	load_love_k  = NULL;
-	IssmDouble  tide_love_k2secular;
-	IssmDouble  moi_e, moi_p;
-	IssmDouble	m1, m2, m3;
+void PolarMotion(IssmDouble* polarmotionvector, FemModel* femmodel,GrdLoads* loads, SealevelGeometry* slgeom, bool computefuture){ /*{{{*/
+	//The purpose of this routine is to get the polar motion vector m=(m1, m2, m3) induced by the GrdLoads
+	IssmDouble  S2coef[3];
+	IssmDouble*	pmtf_col= NULL;
+	IssmDouble*	pmtf_ortho   = NULL;
+	IssmDouble*	pmtf_z   = NULL;
+	IssmDouble* m1=NULL;
+	IssmDouble* m2=NULL;
+	IssmDouble* m3=NULL;
+	IssmDouble* m1interp=NULL;
+	IssmDouble* m2interp=NULL;
+	IssmDouble* m3interp=NULL;
+
+	IssmDouble  moi_e, moi_p, re;
+	IssmDouble mhprefactor, mzprefactor;
 	bool rotation=false;
+	bool viscous=false;
+	int nt=1;
+
+	IssmDouble* viscoustimes=NULL;
+	IssmDouble* viscouspolarmotion=NULL;
+	int         viscousnumsteps;
+	int         viscousindex=0; 
+	int         dummy;
+	IssmDouble  currenttime, final_time, lincoeff, timeacc;
 
 	/*early return?:*/
@@ -758,43 +773,170 @@
 
 	/*retrieve parameters: */
-	femmodel->parameters->FindParam(&load_love_k,NULL,NULL,LoadLoveKEnum);
-	femmodel->parameters->FindParam(&tide_love_h,NULL,NULL,TidalLoveHEnum);
-	femmodel->parameters->FindParam(&tide_love_k,NULL,NULL,TidalLoveKEnum);
-	femmodel->parameters->FindParam(&tide_love_k2secular,TidalLoveK2SecularEnum);
+	femmodel->parameters->FindParam(&viscous,SolidearthSettingsViscousEnum);
 	femmodel->parameters->FindParam(&moi_e,RotationalEquatorialMoiEnum);
 	femmodel->parameters->FindParam(&moi_p,RotationalPolarMoiEnum);
-
-	for(Object* & object : femmodel->elements->objects){
-		Element* element = xDynamicCast<Element*>(object);
-
-		element->SealevelchangeMomentOfInertiaCentroid(&moi_list[0],loads,slgeom);
-		element->SealevelchangeMomentOfInertiaSubElement(&moi_list_sub[0],loads, slgeom);
-
-		moi_list_cpu[0] += moi_list[0]+moi_list_sub[0];
-		moi_list_cpu[1] += moi_list[1]+moi_list_sub[1];
-		moi_list_cpu[2] += moi_list[2]+moi_list_sub[2];
-	}
-
-	for (int i=0;i<3;i++) moi_list[i]=0;
-
-	ISSM_MPI_Reduce (&moi_list_cpu[0],&moi_list[0],1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
-	ISSM_MPI_Bcast(&moi_list[0],1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
-
-	ISSM_MPI_Reduce (&moi_list_cpu[1],&moi_list[1],1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
-	ISSM_MPI_Bcast(&moi_list[1],1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
-
-	ISSM_MPI_Reduce (&moi_list_cpu[2],&moi_list[2],1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
-	ISSM_MPI_Bcast(&moi_list[2],1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
-
-	/*compute perturbation terms for angular velocity vector: */
-	m1 = 1/(1-tide_love_k[2]/tide_love_k2secular) * (1+load_love_k[2])/(moi_p-moi_e) * moi_list[0];
-	m2 = 1/(1-tide_love_k[2]/tide_love_k2secular) * (1+load_love_k[2])/(moi_p-moi_e) * moi_list[1];
-	m3 = -(1+load_love_k[2])/moi_p * moi_list[2];	// term associated with fluid number (3-order-of-magnitude smaller) is negelected
+	femmodel->parameters->FindParam(&pmtf_col,NULL,SealevelchangePolarMotionTransferFunctionColinearEnum);
+	femmodel->parameters->FindParam(&pmtf_ortho,NULL,SealevelchangePolarMotionTransferFunctionOrthogonalEnum);
+	femmodel->parameters->FindParam(&pmtf_z,NULL,SealevelchangePolarMotionTransferFunctionZEnum);
+	femmodel->parameters->FindParam(&re,SolidearthPlanetRadiusEnum);
+
+	if (viscous){
+		femmodel->parameters->FindParam(&final_time,TimesteppingFinalTimeEnum);
+		femmodel->parameters->FindParam(&timeacc,SolidearthSettingsTimeAccEnum);
+		femmodel->parameters->FindParam(&viscousnumsteps,SealevelchangeViscousNumStepsEnum);
+		femmodel->parameters->FindParam(&viscoustimes,NULL,SealevelchangeViscousTimesEnum);
+		femmodel->parameters->FindParam(&viscousindex,SealevelchangeViscousIndexEnum);
+		femmodel->parameters->FindParam(&currenttime,TimeEnum);
+		femmodel->parameters->FindParam(&viscouspolarmotion,NULL,NULL,SealevelchangeViscousPolarMotionEnum);
+
+		if (computefuture){
+			nt = viscousnumsteps;
+			m1interp=xNewZeroInit<IssmDouble>(nt);
+			m2interp=xNewZeroInit<IssmDouble>(nt);
+			m3interp=xNewZeroInit<IssmDouble>(nt);
+		}
+	}
+
+	m1=xNewZeroInit<IssmDouble>(nt);
+	m2=xNewZeroInit<IssmDouble>(nt);
+	m3=xNewZeroInit<IssmDouble>(nt);
+
+	//Isolate degree 2 load coefficients
+	for (int i=0;i<3;i++) S2coef[i]=0;
+	loads->SHDegree2Coefficients(&S2coef[0],femmodel,slgeom);
+
+	//compute present (& future) polar motion from present loads
+	mhprefactor=-4.*M_PI/5.*pow(re,4.)/(moi_p-moi_e);
+	mzprefactor=8.*M_PI/15.*pow(re,4.)/moi_p;
+	for (int tprime=0;tprime<nt;tprime++){
+		m1[tprime] = mhprefactor * (pmtf_col[tprime] * S2coef[1] + pmtf_ortho[tprime] * S2coef[2]); //x-component
+		m2[tprime] = mhprefactor * (pmtf_col[tprime] * S2coef[2] - pmtf_ortho[tprime] * S2coef[1]); //y-component
+		m3[tprime] = mzprefactor *  pmtf_z[tprime]   * S2coef[0];				    //z-component
+	}
+
+	if(viscous){
+		// we need to do up to 3 things (* = only if computefuture)
+		// 1*: add new PM contribution to the viscous stack for future time steps
+		// 2: collect viscous PM from past loads due at present-day and add it to PM[current_time]
+		// 3*: subtract from viscous stack PM that has already been accounted for so we don't add it again at the next time step
+		if(computefuture){ 
+			if(viscoustimes[viscousindex]<final_time){
+				lincoeff=(viscoustimes[viscousindex+1]-viscoustimes[viscousindex])/timeacc;
+				for(int t=viscousindex;t<nt;t++){ //we resynchronize m from the relative time above to the absolute time where t=0 <=> beginning of the simulation
+					if(t==viscousindex){
+						m1interp[t]=  m1[0];
+						m2interp[t]=  m2[0];
+						m3interp[t]=  m3[0];
+					}
+					else{ //we reinterpolate PM on viscoustimes, so we can handle the case where we are running with adaptative/uneven time steps
+						int tprime=t-viscousindex-1;
+						m1interp[t]=  (1.0-lincoeff)*m1[tprime]+lincoeff*m1[tprime+1];
+						m2interp[t]=  (1.0-lincoeff)*m2[tprime]+lincoeff*m2[tprime+1];
+						m3interp[t]=  (1.0-lincoeff)*m3[tprime]+lincoeff*m3[tprime+1];
+					}
+				}
+			}
+		}
+		/*update PM at present time using viscous stack at present time: */
+		m1[0]+=viscouspolarmotion[0*nt+viscousindex];
+		m2[0]+=viscouspolarmotion[1*nt+viscousindex]; 
+		m3[0]+=viscouspolarmotion[2*nt+viscousindex]; 
+		if(computefuture){ /*update viscous stack with future deformation from present load: */
+			for(int t=nt-1;t>=viscousindex;t--){
+				//offset viscous PM to remove all deformation that has already been added
+				viscouspolarmotion[0*nt+t]+=m1interp[t]-m1interp[viscousindex]-viscouspolarmotion[0*nt+viscousindex];
+				viscouspolarmotion[1*nt+t]+=m2interp[t]-m2interp[viscousindex]-viscouspolarmotion[1*nt+viscousindex];
+				viscouspolarmotion[2*nt+t]+=m3interp[t]-m3interp[viscousindex]-viscouspolarmotion[2*nt+viscousindex];
+			}
+			// save updated viscous PM
+			femmodel->parameters->SetParam(viscouspolarmotion,viscousnumsteps,3,SealevelchangeViscousPolarMotionEnum);
+		}
+	}
+	
 
 	/*Assign output pointers:*/
-	polarmotionvector[0]=m1;
-	polarmotionvector[1]=m2;
-	polarmotionvector[2]=m3;
+	polarmotionvector[0]=m1[0];
+	polarmotionvector[1]=m2[0];
+	polarmotionvector[2]=m3[0];
+
+	/*Free allocations:*/
+	xDelete<IssmDouble>(m1);
+	xDelete<IssmDouble>(m2);
+	xDelete<IssmDouble>(m3);
+	if (viscous){
+		if (computefuture){
+			xDelete<IssmDouble>(m1interp);
+			xDelete<IssmDouble>(m2interp);
+			xDelete<IssmDouble>(m3interp);
+		}
+	}
+
 } /*}}}*/
+void       SealevelchangeUpdateViscousTimeSeries(FemModel* femmodel){ /*{{{*/
+	
+	IssmDouble* viscouspolarmotion=NULL;
+	IssmDouble* viscoustimes=NULL;
+	int         viscousnumsteps;
+	int         viscousindex=0; 
+	int         newindex=0; 
+	int         dummy;
+	bool        viscous=false;
+	bool        rotation=false;
+	IssmDouble  currenttime;
+	IssmDouble  lincoeff=0;
+		
+	femmodel->parameters->FindParam(&viscous,SolidearthSettingsViscousEnum);
+	femmodel->parameters->FindParam(&rotation,SolidearthSettingsRotationEnum);
+	
+	if(viscous){
+		femmodel->parameters->FindParam(&viscousnumsteps,SealevelchangeViscousNumStepsEnum);
+		femmodel->parameters->FindParam(&viscoustimes,NULL,SealevelchangeViscousTimesEnum);
+		femmodel->parameters->FindParam(&viscousindex,SealevelchangeViscousIndexEnum);
+		femmodel->parameters->FindParam(&currenttime,TimeEnum);
+		if (rotation) 	femmodel->parameters->FindParam(&viscouspolarmotion,NULL,NULL,SealevelchangeViscousPolarMotionEnum);
+
+		bool foundtime=false;
+		int offset=1; //handles the egde case where time found = max time in viscoustimes
+		lincoeff=0;
+		newindex=viscousnumsteps-2;
+
+		for(int t=viscousindex;t<viscousnumsteps;t++){
+			if (viscoustimes[t]>=currenttime){
+				newindex=t-1;
+				foundtime=true;
+				lincoeff=(currenttime-viscoustimes[newindex])/(viscoustimes[t]-viscoustimes[newindex]);
+				offset=0;
+				break;
+			}
+		}
+
+		if(rotation){
+			int index=0;
+			for (int i=0;i<3;i++){
+				index=i*viscousnumsteps+newindex;
+				viscouspolarmotion[index+offset]=(1-lincoeff)*viscouspolarmotion[index]+lincoeff*viscouspolarmotion[index+1];
+			}
+			femmodel->parameters->SetParam(viscouspolarmotion,viscousnumsteps,3,SealevelchangeViscousPolarMotionEnum);
+		}
+
+
+		/*update viscous inputs:*/
+		for(Object* & object : femmodel->elements->objects){
+			Element* element = xDynamicCast<Element*>(object);
+			element->SealevelchangeUpdateViscousFields(lincoeff,newindex,offset);
+		}
+
+		viscoustimes[newindex]=currenttime;
+		viscousindex=newindex+offset;
+
+		femmodel->parameters->SetParam(viscousindex,SealevelchangeViscousIndexEnum);
+		femmodel->parameters->SetParam(viscoustimes,viscousnumsteps,SealevelchangeViscousTimesEnum);
+
+		/*free allocations:*/
+		xDelete<IssmDouble>(viscoustimes);
+	}
+
+
+}
 void        ConserveOceanMass(FemModel* femmodel,GrdLoads* loads, IssmDouble offset, SealevelGeometry* slgeom){ /*{{{*/
 
@@ -809,4 +951,5 @@
 IssmDouble* CombineLoads(IssmDouble* load,IssmDouble* subload,FemModel* femmodel, SealevelGeometry* slgeom,int loadtype,int nel){ /*{{{*/
 
+	//merges loads on centroids and subelements onto a single variable loadcopy
 	int* indices=xNew<int>(nel);
 	for(int i=0;i<nel;i++)indices[i]=i;
Index: /issm/trunk/src/c/cores/stressbalance_core.cpp
===================================================================
--- /issm/trunk/src/c/cores/stressbalance_core.cpp	(revision 27034)
+++ /issm/trunk/src/c/cores/stressbalance_core.cpp	(revision 27035)
@@ -19,5 +19,5 @@
 	bool       dakota_analysis,control_analysis;
 	int        domaintype;
-	bool       isSIA,isSSA,isL1L2,isMLHO,isHO,isFS,isNitsche;
+	bool       isSIA,isSSA,isL1L2,isMOLHO,isHO,isFS,isNitsche;
 	bool       save_results;
 	int        solution_type;
@@ -31,5 +31,5 @@
 	femmodel->parameters->FindParam(&isSSA,FlowequationIsSSAEnum);
 	femmodel->parameters->FindParam(&isL1L2,FlowequationIsL1L2Enum);
-	femmodel->parameters->FindParam(&isMLHO,FlowequationIsMLHOEnum);
+	femmodel->parameters->FindParam(&isMOLHO,FlowequationIsMOLHOEnum);
 	femmodel->parameters->FindParam(&isHO,FlowequationIsHOEnum);
 	femmodel->parameters->FindParam(&isFS,FlowequationIsFSEnum);
@@ -75,5 +75,5 @@
 
 	/*Compute stressbalance for SSA L1L2 HO and FS*/
-	if(isSSA || isL1L2 || isMLHO || isHO || isFS){
+	if(isSSA || isL1L2 || isMOLHO || isHO || isFS){
 		analysis = new StressbalanceAnalysis();
 		analysis->Core(femmodel);
@@ -82,5 +82,5 @@
 
 	/*Compute vertical velocities*/
-	if (domaintype==Domain3DEnum && (isSIA || isSSA || isL1L2 || isMLHO || isHO)){
+	if (domaintype==Domain3DEnum && (isSIA || isSSA || isL1L2 || isMOLHO || isHO)){
 
 		/*We need basal melt rates for vertical velocity*/
Index: /issm/trunk/src/c/cores/transient_core.cpp
===================================================================
--- /issm/trunk/src/c/cores/transient_core.cpp	(revision 27034)
+++ /issm/trunk/src/c/cores/transient_core.cpp	(revision 27035)
@@ -16,4 +16,8 @@
 #include "../modules/modules.h"
 #include "../solutionsequences/solutionsequences.h"
+
+#ifdef _HAVE_CODIPACK_
+extern CoDi_global codi_global;
+#endif
 
 /*Prototypes*/
@@ -74,5 +78,5 @@
 		if(VerboseSolution()){
 			_printf0_("iteration " << step << "/" << ceil((finaltime-time)/dt)+step << \
-						"  time [yr]: " << setprecision(4) << time/yts << " (time step: " << dt/yts << ")\n");
+						"  time [yr]: " <<std::fixed<<setprecision(2)<< time/yts << " (time step: " << dt/yts << ")\n");
 		}
 		bool save_results=false;
@@ -150,5 +154,5 @@
 	femmodel->parameters->FindParam(&issampling,TransientIssamplingEnum);
 	femmodel->parameters->FindParam(&numoutputs,TransientNumRequestedOutputsEnum);
-	femmodel->parameters->FindParam(&isstochasticforcing,StochasticForcingIsStochasticForcingEnum);	
+	femmodel->parameters->FindParam(&isstochasticforcing,StochasticForcingIsStochasticForcingEnum);
 
 	#if defined(_HAVE_OCEAN_ )
@@ -275,5 +279,5 @@
 
 #ifdef _HAVE_CODIPACK_
-void transient_ad(FemModel* femmodel){/*{{{*/
+double transient_ad(FemModel* femmodel, double* G, double* Jlist){/*{{{*/
 
 	/*parameters: */
@@ -282,5 +286,5 @@
 	bool       isoceancoupling;
 	int        step,timestepping;
-	int        checkpoint_frequency;
+	int        checkpoint_frequency,num_responses;
 
 	/*Get rank*/
@@ -293,4 +297,5 @@
 	femmodel->parameters->FindParam(&yts,ConstantsYtsEnum);
 	femmodel->parameters->FindParam(&timestepping,TimesteppingTypeEnum);
+	femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
 	femmodel->parameters->FindParam(&checkpoint_frequency,SettingsCheckpointFrequencyEnum); _assert_(checkpoint_frequency>0);
 
@@ -343,11 +348,9 @@
 
 		/*Go through our dependent variables, and compute the response:*/
-		if(finaltime==time){
-			DataSet* dependent_objects=((DataSetParam*)femmodel->parameters->FindParamObject(AutodiffDependentObjectsEnum))->value;
-			for(Object* & object:dependent_objects->objects){
-				DependentObject* dep=(DependentObject*)object;
-				dep->Responsex(&output_value,femmodel);
-				dep->AddValue(output_value);
-			}
+		DataSet* dependent_objects=((DataSetParam*)femmodel->parameters->FindParamObject(AutodiffDependentObjectsEnum))->value;
+		for(Object* & object:dependent_objects->objects){
+			DependentObject* dep=(DependentObject*)object;
+			dep->Responsex(&output_value,femmodel);
+			dep->AddValue(output_value);
 		}
 
@@ -395,15 +398,37 @@
 	SetControlInputsFromVectorx(femmodel,X);
 
-	IssmDouble J = 0.;
+	IssmDouble J     = 0.;
+	int        count = 0;
 	DataSet* dependent_objects=((DataSetParam*)femmodel->parameters->FindParamObject(AutodiffDependentObjectsEnum))->value;
 	for(Object* & object:dependent_objects->objects){
 		DependentObject* dep=(DependentObject*)object;
-		J += dep->GetValue();
-	}
-	tape_codi.registerOutput(J);
+		IssmDouble       output_value = dep->GetValue();
+
+
+		J += output_value;
+
+		tape_codi.registerOutput(J);
+		#if _CODIPACK_MAJOR_==2
+		codi_global.output_indices.push_back(J.getIdentifier());
+		#elif _CODIPACK_MAJOR_==1
+		codi_global.output_indices.push_back(J.getGradientData());
+		#else
+		#error "_CODIPACK_MAJOR_ not supported"
+		#endif
+
+		/*Keep track of output for printing*/
+		Jlist[count] = output_value.getValue();
+      count++;
+	}
+	Jlist[count] = J.getValue();
+	_assert_(count == num_responses);
 
 	tape_codi.setPassive();
-	if(IssmComm::GetRank()==0) J.gradient() = 1.0;
-	tape_codi.evaluate();
+
+	if(VerboseAutodiff())_printf0_("   CoDiPack fos_reverse\n");
+	for(int i=0;i<num_responses;i++){
+		if(my_rank==0) tape_codi.setGradient(codi_global.output_indices[i],1.0);
+		tape_codi.evaluate();
+	}
 
 	/*Initialize Xb and Yb*/
@@ -444,16 +469,18 @@
 			femmodel->parameters->SetParam(thisstep,StepEnum);
 			femmodel->parameters->SetParam(thisdt,TimesteppingTimeStepEnum);
-			_printf0_("step "<<thisstep<<" ("<<ii+1<<"/"<<checkpoint_frequency<<") time [yr]: "\
-						<<std::fixed<<std::setprecision(2)<<thistime/yts<< " (time step: " << thisdt/yts << ")\n");
+
+			if(VerboseSolution()){
+				_printf0_("step "<<thisstep<<" ("<<ii+1<<"/"<<checkpoint_frequency<<") time [yr]: "\
+							<<std::fixed<<std::setprecision(2)<<thistime/yts<< " (time step: " << thisdt/yts << ")\n");
+			}
+
 			transient_step(femmodel);
 
 			/*Go through our dependent variables, and compute the response:*/
-			if(thistime==finaltime){
-				DataSet* dependent_objects=((DataSetParam*)femmodel->parameters->FindParamObject(AutodiffDependentObjectsEnum))->value;
-				for(Object* & object:dependent_objects->objects){
-					DependentObject* dep=(DependentObject*)object;
-					dep->Responsex(&output_value,femmodel);
-					dep->AddValue(output_value);
-				}
+			DataSet* dependent_objects=((DataSetParam*)femmodel->parameters->FindParamObject(AutodiffDependentObjectsEnum))->value;
+			for(Object* & object:dependent_objects->objects){
+				DependentObject* dep=(DependentObject*)object;
+				dep->Responsex(&output_value,femmodel);
+				dep->AddValue(output_value);
 			}
 
@@ -484,22 +511,17 @@
 		for(int i=0; i<Xsize;   i++) Xb[i] += X[i].gradient();
 	}
+
 	/*Clear tape*/
 	tape_codi.reset();
 
 	/*Broadcast gradient to other ranks (make sure to sum all gradients)*/
-	double* gradient=xNew<double>(Xsize);
-	ISSM_MPI_Allreduce(Xb,gradient,Xsize,ISSM_MPI_PDOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
-
-	/*Now set final gradient*/
-	IssmDouble* aG=xNew<IssmDouble>(Xsize);
-	for(int i=0;i<Xsize;i++) aG[i] = reCast<IssmDouble>(gradient[i]);
-	xDelete<double>(gradient);
-	ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,aG);
-	xDelete<IssmDouble>(aG);
-
+	ISSM_MPI_Allreduce(Xb,G,Xsize,ISSM_MPI_PDOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
+
+	/*Cleanup and return misfit*/
 	xDelete<IssmDouble>(X);
 	xDelete<double>(Xb);
 	xDelete<double>(Yb);
 	xDelete<int>(Yin);
+   return J.getValue();
 }/*}}}*/
 #endif
Index: /issm/trunk/src/c/datastructures/DataSet.cpp
===================================================================
--- /issm/trunk/src/c/datastructures/DataSet.cpp	(revision 27034)
+++ /issm/trunk/src/c/datastructures/DataSet.cpp	(revision 27035)
@@ -261,4 +261,9 @@
 				this->AddObject(cfsurf);
 			}
+			else if(obj_enum==CfsurfacelogvelEnum){
+				Cfsurfacelogvel* cfsurf=new Cfsurfacelogvel();
+				cfsurf->Marshall(marshallhandle);
+				this->AddObject(cfsurf);
+			}
 			else if(obj_enum==MassfluxatgateEnum){
 				Massfluxatgate<IssmDouble>* massfluxgate=new Massfluxatgate<IssmDouble>();
Index: /issm/trunk/src/c/modules/Calvingx/Calvingx.cpp
===================================================================
--- /issm/trunk/src/c/modules/Calvingx/Calvingx.cpp	(revision 27034)
+++ /issm/trunk/src/c/modules/Calvingx/Calvingx.cpp	(revision 27035)
@@ -15,9 +15,14 @@
 	/*Calculate calving rate*/
 	switch(calvinglaw){
-		case DefaultCalvingEnum:
 		case CalvingMinthicknessEnum:
 		case CalvingHabEnum:
+			femmodel->ElementOperationx(&Element::CalvingSetZeroRate);
+			break;
+		case DefaultCalvingEnum:
+			femmodel->ElementOperationx(&Element::CalvingFromRate);
 			break;
 		case CalvingCrevasseDepthEnum:
+			femmodel->ElementOperationx(&Element::CalvingSetZeroRate);
+			/*rate is 0 but we need to calculate a few things to determine where it will calve*/
 			femmodel->StrainRateparallelx();
 			femmodel->StrainRateeffectivex();
@@ -35,4 +40,10 @@
 			femmodel->ElementOperationx(&Element::CalvingRateVonmises);
 			break;
+		case CalvingTestEnum:
+			femmodel->ElementOperationx(&Element::CalvingRateTest);
+			break;
+		case CalvingParameterizationEnum:
+			femmodel->ElementOperationx(&Element::CalvingRateParameterization);
+			break;
 		default:
 			_error_("Caving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
Index: /issm/trunk/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp
===================================================================
--- /issm/trunk/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp	(revision 27034)
+++ /issm/trunk/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp	(revision 27035)
@@ -45,4 +45,8 @@
 			if(VerboseSolution())_printf0_("        call BeckmannGoosse Floating melting rate module\n");
 			BeckmannGoosseFloatingiceMeltingRatex(femmodel);
+			break;
+		case AutoregressionLinearFloatingMeltRateEnum:
+			if(VerboseSolution())_printf0_("        call Autoregression Linear Floating melting rate module\n");
+			AutoregressionLinearFloatingiceMeltingRatex(femmodel);
 			break;
 		default:
@@ -206,2 +210,108 @@
 }
 /*}}}*/
+void AutoregressionLinearFloatingiceMeltingRateInitx(FemModel* femmodel){/*{{{*/
+
+	/*Initialization step of AutoregressionLinearFloatingiceMeltingRatex*/
+   int M,N,Nphi,arorder,numbasins,my_rank;
+   IssmDouble starttime,tstep_ar,tinit_ar;
+   femmodel->parameters->FindParam(&numbasins,BasalforcingsLinearNumBasinsEnum);
+   femmodel->parameters->FindParam(&arorder,BasalforcingsAutoregressiveOrderEnum);
+   IssmDouble* beta0    = NULL;
+   IssmDouble* beta1    = NULL;
+   IssmDouble* phi      = NULL;
+   femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
+   femmodel->parameters->FindParam(&tstep_ar,BasalforcingsAutoregressionTimestepEnum);
+   femmodel->parameters->FindParam(&tinit_ar,BasalforcingsAutoregressionInitialTimeEnum);
+   femmodel->parameters->FindParam(&beta0,&M,BasalforcingsBeta0Enum);    _assert_(M==numbasins);
+   femmodel->parameters->FindParam(&beta1,&M,BasalforcingsBeta1Enum);    _assert_(M==numbasins);
+   femmodel->parameters->FindParam(&phi,&M,&Nphi,BasalforcingsPhiEnum);  _assert_(M==numbasins); _assert_(Nphi==arorder);
+	
+	/*AR model spin-up with 0 noise to initialize BasalforcingsDeepwaterMeltingRateValuesAutoregressionEnum (688 = log(0.001)/log(0.99): decaying time of inluence of phi[0]=0.99 to 0.001 of beta_0*/
+   int nspin = 688;
+   for(Object* &object:femmodel->elements->objects){
+      Element* element = xDynamicCast<Element*>(object); //generate element object
+      element->AutoregressionInit(numbasins,arorder,nspin,starttime,tstep_ar,tinit_ar,beta0,beta1,phi,BasalforcingsDeepwaterMeltingRateAutoregressionEnum);
+	}
+	/*Cleanup*/
+   xDelete<IssmDouble>(beta0);
+   xDelete<IssmDouble>(beta1);
+   xDelete<IssmDouble>(phi);
+}/*}}}*/
+void AutoregressionLinearFloatingiceMeltingRatex(FemModel* femmodel){/*{{{*/
+
+	/*Get time parameters*/
+   IssmDouble time,dt,starttime,tstep_ar;
+   femmodel->parameters->FindParam(&time,TimeEnum);
+   femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
+   femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
+   femmodel->parameters->FindParam(&tstep_ar,BasalforcingsAutoregressionTimestepEnum);
+
+   /*Initialize module at first time step*/
+   if(time<=starttime+dt){AutoregressionLinearFloatingiceMeltingRateInitx(femmodel);}
+   /*Determine if this is a time step for the AR model*/
+   bool isstepforar = false;
+
+   #ifndef _HAVE_AD_
+   if((fmod(time,tstep_ar)<fmod((time-dt),tstep_ar)) || (time<=starttime+dt) || tstep_ar==dt) isstepforar = true;
+   #else
+   _error_("not implemented yet");
+   #endif
+
+   /*Load parameters*/
+   bool isstochastic;
+   bool isdeepmeltingstochastic = false;
+   int M,N,Nphi,arorder,numbasins,my_rank;
+   femmodel->parameters->FindParam(&numbasins,BasalforcingsLinearNumBasinsEnum);
+	femmodel->parameters->FindParam(&arorder,BasalforcingsAutoregressiveOrderEnum);
+   IssmDouble tinit_ar;
+   IssmDouble* beta0          = NULL;
+   IssmDouble* beta1          = NULL;
+   IssmDouble* phi            = NULL;
+   IssmDouble* deepwaterel    = NULL;
+   IssmDouble* upperwaterel   = NULL;
+   IssmDouble* upperwatermelt = NULL;
+   IssmDouble* perturbation   = NULL;
+
+	/*Get autoregressive parameters*/
+   femmodel->parameters->FindParam(&tinit_ar,BasalforcingsAutoregressionInitialTimeEnum);
+   femmodel->parameters->FindParam(&beta0,&M,BasalforcingsBeta0Enum);               _assert_(M==numbasins);
+   femmodel->parameters->FindParam(&beta1,&M,BasalforcingsBeta1Enum);               _assert_(M==numbasins);
+   femmodel->parameters->FindParam(&phi,&M,&Nphi,BasalforcingsPhiEnum);             _assert_(M==numbasins); _assert_(Nphi==arorder);
+
+	/*Get basin-specific parameters*/
+   femmodel->parameters->FindParam(&deepwaterel,&M,BasalforcingsDeepwaterElevationEnum);            _assert_(M==numbasins);
+   femmodel->parameters->FindParam(&upperwaterel,&M,BasalforcingsUpperwaterElevationEnum);          _assert_(M==numbasins);
+   femmodel->parameters->FindParam(&upperwatermelt,&M,BasalforcingsUpperwaterMeltingRateEnum);      _assert_(M==numbasins);
+
+	/*Evaluate whether stochasticity on DeepwaterMeltingRate is requested*/
+	femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum);
+   if(isstochastic){
+      int  numstochasticfields;
+      int* stochasticfields;
+      femmodel->parameters->FindParam(&numstochasticfields,StochasticForcingNumFieldsEnum);
+      femmodel->parameters->FindParam(&stochasticfields,&N,StochasticForcingFieldsEnum); _assert_(N==numstochasticfields);
+      for(int i=0;i<numstochasticfields;i++){
+         if(stochasticfields[i]==BasalforcingsDeepwaterMeltingRateAutoregressionEnum) isdeepmeltingstochastic = true;
+      }
+      xDelete<int>(stochasticfields);
+   }
+   /*Time elapsed with respect to AR model initial time*/
+   IssmDouble telapsed_ar = time-tinit_ar;
+
+	/*Loop over each element to compute FloatingiceMeltingRate at vertices*/
+   for(Object* &object:femmodel->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
+      /*Compute autoregression*/
+      element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,isdeepmeltingstochastic,BasalforcingsDeepwaterMeltingRateAutoregressionEnum);
+		element->BasinLinearFloatingiceMeltingRate(deepwaterel,upperwatermelt,upperwaterel,perturbation);
+	}
+
+	/*Cleanup*/
+	xDelete<IssmDouble>(beta0);
+	xDelete<IssmDouble>(beta1);
+	xDelete<IssmDouble>(phi);
+	xDelete<IssmDouble>(deepwaterel);
+	xDelete<IssmDouble>(upperwaterel);
+	xDelete<IssmDouble>(upperwatermelt);
+	xDelete<IssmDouble>(perturbation);
+}/*}}}*/
Index: /issm/trunk/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.h
===================================================================
--- /issm/trunk/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.h	(revision 27034)
+++ /issm/trunk/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.h	(revision 27035)
@@ -16,4 +16,6 @@
 void FloatingiceMeltingRateIsmip6x(FemModel* femmodel);
 void BeckmannGoosseFloatingiceMeltingRatex(FemModel* femmodel);
+void AutoregressionLinearFloatingiceMeltingRateInitx(FemModel* femmodel);
+void AutoregressionLinearFloatingiceMeltingRatex(FemModel* femmodel);
 
 #endif  /* _FloatingiceMeltingRatex_H*/
Index: /issm/trunk/src/c/modules/FrontalForcingsx/FrontalForcingsx.cpp
===================================================================
--- /issm/trunk/src/c/modules/FrontalForcingsx/FrontalForcingsx.cpp	(revision 27034)
+++ /issm/trunk/src/c/modules/FrontalForcingsx/FrontalForcingsx.cpp	(revision 27035)
@@ -46,6 +46,6 @@
    femmodel->parameters->FindParam(&phi,&M,&Nphi,FrontalForcingsPhiEnum);  _assert_(M==numbasins); _assert_(Nphi==arorder);
 
-   /*AR model spin-up with 0 noise to initialize ThermalforcingValuesAutoregressionEnum*/
-	int nspin{2*arorder+5};
+   /*AR model spin-up with 0 noise to initialize ThermalforcingValuesAutoregressionEnum (688 = log(0.001)/log(0.99): decaying time of inluence of phi[0]=0.99 to 0.001 of beta_0*/
+	int nspin = 688;
    for(Object* &object:femmodel->elements->objects){
       Element* element      = xDynamicCast<Element*>(object); //generate element object
Index: /issm/trunk/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.h
===================================================================
--- /issm/trunk/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.h	(revision 27034)
+++ /issm/trunk/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.h	(revision 27035)
@@ -9,9 +9,10 @@
 /* local prototypes: */
 void	GetVectorFromInputsx(Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type);
-void	GetVectoronBaseFromInputsx(Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type);
 void  GetVectorFromInputsx(Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type,IssmDouble time);
 void	GetVectorFromInputsx(IssmDouble** pvector,FemModel* femmodel,int name,int type);
-void	GetVectoronBaseFromInputsx(IssmDouble** pvector,FemModel* femmodel,int name,int type);
 void  GetVectorFromInputsx(IssmDouble** pvector,int* pvector_size, FemModel* femmodel,int name);
 
+void	GetVectoronBaseFromInputsx(IssmDouble** pvector,FemModel* femmodel,int name,int type);
+void	GetVectoronBaseFromInputsx(Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type);
+
 #endif  /* _GETVECTORFROMINPUTSXX_H */
Index: /issm/trunk/src/c/modules/KillIcebergsx/KillIcebergsx.cpp
===================================================================
--- /issm/trunk/src/c/modules/KillIcebergsx/KillIcebergsx.cpp	(revision 27034)
+++ /issm/trunk/src/c/modules/KillIcebergsx/KillIcebergsx.cpp	(revision 27035)
@@ -9,5 +9,5 @@
 #include "../InputUpdateFromVectorx/InputUpdateFromVectorx.h"
 
-void KillIcebergsx(FemModel* femmodel){
+int KillIcebergsx(FemModel* femmodel){
 
 	/*Intermediaries*/
@@ -18,4 +18,5 @@
 	IssmDouble *local_mask   = xNewZeroInit<IssmDouble>(nbv_local);
 	bool       *element_flag = xNewZeroInit<bool>(femmodel->elements->Size());
+	IssmDouble ice;
 
 	/*Step 1, go through all elements and put 1 in local_mask if the element is grounded*/
@@ -27,8 +28,18 @@
 			element_flag[i] = true;
 		}
-		else{
-			if(element->IsGrounded()){
+		else {
+			if(element->IsAllGrounded()){
+				/* only look at element with ice but not fully grounded */
 				int numvertices = element->GetNumberOfVertices();
-				for(int v=0;v<numvertices;v++) local_mask[element->vertices[v]->Lid()] = 1.;
+				Gauss* gauss=element->NewGauss();
+				Input* icelevel_input = element->GetInput(MaskIceLevelsetEnum);				_assert_(icelevel_input);
+
+				for(int v=0;v<numvertices;v++) {
+					gauss->GaussVertex(v);
+					icelevel_input->GetInputValue(&ice,gauss);
+					/* The initial mask is very strict, we look at all grounded elements and set the mask for ice nodes only. */
+					if (ice < 0) local_mask[element->vertices[v]->Lid()] = 1.;
+				}
+				delete gauss;
 			}
 		}
@@ -48,5 +59,4 @@
 		/*Local iterations on partition*/
 		bool keepgoing    = true;
-		int  didsomething = 0;
 		int  iter         = 1;
 		while(keepgoing){
@@ -54,5 +64,4 @@
 
 			keepgoing    = false;
-			didsomething = 0;
 			int i=0;
 			for(Object* & object : femmodel->elements->objects){
@@ -62,7 +71,11 @@
 					int numvertices = element->GetNumberOfVertices();
 					bool found1 = false;
+					IssmDouble sumlocalmask = 0.;
+
 					for(int j=0;j<numvertices;j++){
 						lid = element->vertices[j]->Lid();
-						if(local_mask[lid]>0.){
+						/*we need to have at least a sharing edge, to extend the mask*/
+						sumlocalmask += local_mask[lid];
+						if(sumlocalmask > 1.5){
 							found1 = true;
 							break;
@@ -73,10 +86,7 @@
 						for(int j=0;j<numvertices;j++){
 							lid = element->vertices[j]->Lid();
-							if(local_mask[lid]==0.){
-								local_mask[lid]=1.;
-								keepgoing = true;
-								didsomething = 1;
-							}
+							local_mask[lid]=1.;
 						}
+						keepgoing = true;
 					}
 				}
@@ -99,4 +109,5 @@
 	xDelete<bool>(element_flag);
 
+	int killbergReinit = 0;
 	/*OK, now deactivate iceberg and count the number of deactivated vertices*/
 	for(Object* & object : femmodel->elements->objects){
@@ -120,9 +131,12 @@
 				element->AddInput(MaskIceLevelsetEnum,values,P1Enum);
 				xDelete<IssmDouble>(values);
+				killbergReinit += 1;
 			}
 		}
 	}
-
 	/*cleanup*/
 	xDelete<IssmDouble>(local_mask);
+
+	/*Recompute the sign distance for the levelset function*/
+	return killbergReinit;
 }
Index: /issm/trunk/src/c/modules/KillIcebergsx/KillIcebergsx.h
===================================================================
--- /issm/trunk/src/c/modules/KillIcebergsx/KillIcebergsx.h	(revision 27034)
+++ /issm/trunk/src/c/modules/KillIcebergsx/KillIcebergsx.h	(revision 27035)
@@ -6,5 +6,5 @@
 
 /* local prototypes: */
-void KillIcebergsx(FemModel* femmodel);
+int KillIcebergsx(FemModel* femmodel);
 
 #endif
Index: /issm/trunk/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 27034)
+++ /issm/trunk/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 27035)
@@ -311,27 +311,28 @@
 				/*cfsurfacelogvel variables: */
 				int          num_cfsurfacelogvels;
-				char**       cfsurfacelogvel_name						= NULL;    
-				char**		 cfsurfacelogvel_definitionstring		= NULL;    
-				IssmDouble** cfsurfacelogvel_vxobs			= NULL;
-				IssmDouble** cfsurfacelogvel_vyobs			= NULL;
-				char**		 cfsurfacelogvel_vxobs_string	= NULL;
-				char**		 cfsurfacelogvel_vyobs_string	= NULL;
-				int*         cfsurfacelogvel_observation_M			= NULL;
-				int*         cfsurfacelogvel_observation_N			= NULL;
-				IssmDouble** cfsurfacelogvel_weights					= NULL;
-				int*         cfsurfacelogvel_weights_M				= NULL;
-				int*         cfsurfacelogvel_weights_N				= NULL;
-				char**       cfsurfacelogvel_weightstring		= NULL;
-				IssmDouble*  cfsurfacelogvel_datatime				= NULL;
-
-				/*Fetch name, modeltring, observation, observationtring, etc ... (see src/m/classes/cfsurfacelogvel.m): */
-				iomodel->FetchMultipleData(&cfsurfacelogvel_name,&num_cfsurfacelogvels,                                                        "md.cfsurfacelogvel.name");
-				iomodel->FetchMultipleData(&cfsurfacelogvel_definitionstring,&num_cfsurfacelogvels,                                            "md.cfsurfacelogvel.definitionstring");
-				iomodel->FetchMultipleData(&cfsurfacelogvel_vxobs,&cfsurfacelogvel_observation_M,&cfsurfacelogvel_observation_N,&num_cfsurfacelogvels, "md.cfsurfacelogvel.vxobs");
-				iomodel->FetchMultipleData(&cfsurfacelogvel_vxobs_string,&num_cfsurfacelogvels,                                          "md.cfsurfacelogvel.vxobs_string");
-				iomodel->FetchMultipleData(&cfsurfacelogvel_vyobs,&cfsurfacelogvel_observation_M,&cfsurfacelogvel_observation_N,&num_cfsurfacelogvels, "md.cfsurfacelogvel.vyobs");
-				iomodel->FetchMultipleData(&cfsurfacelogvel_vyobs_string,&num_cfsurfacelogvels,                                          "md.cfsurfacelogvel.vyobs_string");			iomodel->FetchMultipleData(&cfsurfacelogvel_weights,&cfsurfacelogvel_weights_M,&cfsurfacelogvel_weights_N,&num_cfsurfacelogvels,             "md.cfsurfacelogvel.weights");
-				iomodel->FetchMultipleData(&cfsurfacelogvel_weightstring,&num_cfsurfacelogvels,                                              "md.cfsurfacelogvel.weights_string");
-				iomodel->FetchMultipleData(&cfsurfacelogvel_datatime,&num_cfsurfacelogvels,																	 "md.cfsurfacelogvel.datatime");
+				char       **cfsurfacelogvel_name             = NULL;
+				char       **cfsurfacelogvel_definitionstring = NULL;
+				IssmDouble **cfsurfacelogvel_vxobs            = NULL;
+				IssmDouble **cfsurfacelogvel_vyobs            = NULL;
+				char       **cfsurfacelogvel_vxobs_string     = NULL;
+				char       **cfsurfacelogvel_vyobs_string     = NULL;
+				int         *cfsurfacelogvel_observation_M    = NULL;
+				int         *cfsurfacelogvel_observation_N    = NULL;
+				IssmDouble **cfsurfacelogvel_weights          = NULL;
+				int         *cfsurfacelogvel_weights_M        = NULL;
+				int         *cfsurfacelogvel_weights_N        = NULL;
+				char       **cfsurfacelogvel_weightstring     = NULL;
+				IssmDouble  *cfsurfacelogvel_datatime         = NULL;
+
+            /*Fetch name, modeltring, observation, observationtring, etc ... (see src/m/classes/cfsurfacelogvel.m): */
+            iomodel->FetchMultipleData(&cfsurfacelogvel_name,&num_cfsurfacelogvels,"md.cfsurfacelogvel.name");
+            iomodel->FetchMultipleData(&cfsurfacelogvel_definitionstring,&num_cfsurfacelogvels,"md.cfsurfacelogvel.definitionstring");
+            iomodel->FetchMultipleData(&cfsurfacelogvel_vxobs,&cfsurfacelogvel_observation_M,&cfsurfacelogvel_observation_N,&num_cfsurfacelogvels,"md.cfsurfacelogvel.vxobs");
+            iomodel->FetchMultipleData(&cfsurfacelogvel_vxobs_string,&num_cfsurfacelogvels,"md.cfsurfacelogvel.vxobs_string");
+            iomodel->FetchMultipleData(&cfsurfacelogvel_vyobs,NULL,NULL,&num_cfsurfacelogvels,"md.cfsurfacelogvel.vyobs");
+            iomodel->FetchMultipleData(&cfsurfacelogvel_vyobs_string,&num_cfsurfacelogvels,"md.cfsurfacelogvel.vyobs_string");
+            iomodel->FetchMultipleData(&cfsurfacelogvel_weights,&cfsurfacelogvel_weights_M,&cfsurfacelogvel_weights_N,&num_cfsurfacelogvels,"md.cfsurfacelogvel.weights");
+            iomodel->FetchMultipleData(&cfsurfacelogvel_weightstring,&num_cfsurfacelogvels,"md.cfsurfacelogvel.weights_string");
+            iomodel->FetchMultipleData(&cfsurfacelogvel_datatime,&num_cfsurfacelogvels,"md.cfsurfacelogvel.datatime");
 
 				for(j=0;j<num_cfsurfacelogvels;j++){
Index: /issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 27034)
+++ /issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 27035)
@@ -252,4 +252,29 @@
 			break;
 		case BeckmannGoosseFloatingMeltRateEnum:
+			break;
+		case AutoregressionLinearFloatingMeltRateEnum:
+			/*Add parameters that are not in standard nbvertices format*/
+         parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.num_basins",BasalforcingsLinearNumBasinsEnum));
+         parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.ar_order",BasalforcingsAutoregressiveOrderEnum));
+         parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.ar_initialtime",BasalforcingsAutoregressionInitialTimeEnum));
+         parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.ar_timestep",BasalforcingsAutoregressionTimestepEnum));
+			iomodel->FetchData(&transparam,&M,&N,"md.basalforcings.beta0");
+         parameters->AddObject(new DoubleVecParam(BasalforcingsBeta0Enum,transparam,N));
+         xDelete<IssmDouble>(transparam);
+         iomodel->FetchData(&transparam,&M,&N,"md.basalforcings.beta1");
+         parameters->AddObject(new DoubleVecParam(BasalforcingsBeta1Enum,transparam,N));
+         xDelete<IssmDouble>(transparam);
+         iomodel->FetchData(&transparam,&M,&N,"md.basalforcings.phi");
+         parameters->AddObject(new DoubleMatParam(BasalforcingsPhiEnum,transparam,M,N));
+         xDelete<IssmDouble>(transparam);
+			iomodel->FetchData(&transparam,&M,&N,"md.basalforcings.upperwater_melting_rate");
+         parameters->AddObject(new DoubleVecParam(BasalforcingsUpperwaterMeltingRateEnum,transparam,N));
+         xDelete<IssmDouble>(transparam);   
+         iomodel->FetchData(&transparam,&M,&N,"md.basalforcings.upperwater_elevation");
+         parameters->AddObject(new DoubleVecParam(BasalforcingsUpperwaterElevationEnum,transparam,N));
+         xDelete<IssmDouble>(transparam); 
+			iomodel->FetchData(&transparam,&M,&N,"md.basalforcings.deepwater_elevation");
+         parameters->AddObject(new DoubleVecParam(BasalforcingsDeepwaterElevationEnum,transparam,N));
+         xDelete<IssmDouble>(transparam);   
 			break;
 		default:
@@ -403,4 +428,5 @@
          parameters->AddObject(iomodel->CopyConstantObject("md.smb.ar_initialtime",SmbAutoregressionInitialTimeEnum));
          parameters->AddObject(iomodel->CopyConstantObject("md.smb.ar_timestep",SmbAutoregressionTimestepEnum));
+         parameters->AddObject(iomodel->CopyConstantObject("md.smb.num_bins",SmbNumElevationBinsEnum));
          iomodel->FetchData(&transparam,&M,&N,"md.smb.beta0");
          parameters->AddObject(new DoubleVecParam(SmbBeta0Enum,transparam,N));
@@ -412,5 +438,14 @@
          parameters->AddObject(new DoubleMatParam(SmbPhiEnum,transparam,M,N));
          xDelete<IssmDouble>(transparam);
-         break;
+         iomodel->FetchData(&transparam,&M,&N,"md.smb.lapserates");
+         parameters->AddObject(new DoubleMatParam(SmbLapseRatesEnum,transparam,M,N));
+         xDelete<IssmDouble>(transparam);
+         iomodel->FetchData(&transparam,&M,&N,"md.smb.elevationbins");
+         parameters->AddObject(new DoubleMatParam(SmbElevationBinsEnum,transparam,M,N));
+         xDelete<IssmDouble>(transparam);
+			iomodel->FetchData(&transparam,&M,&N,"md.smb.refelevation");
+         parameters->AddObject(new DoubleVecParam(SmbRefElevationEnum,transparam,N));
+         xDelete<IssmDouble>(transparam);
+			break;
 		case SMBgembEnum:
 			parameters->AddObject(iomodel->CopyConstantObject("md.smb.aIce",SmbAIceEnum));
@@ -486,4 +521,7 @@
 	}
 	else if(hydrology_model==HydrologyGlaDSEnum){
+		/*Nothing to add*/
+	}
+	else if(hydrology_model==HydrologyTwsEnum){
 		/*Nothing to add*/
 	}
@@ -508,4 +546,5 @@
       parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.num_fields",StochasticForcingNumFieldsEnum));
       parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.defaultdimension",StochasticForcingDefaultDimensionEnum));
+      parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.stochastictimestep",StochasticForcingTimestepEnum));
       iomodel->FindConstant(&fields,&num_fields,"md.stochasticforcing.fields");
       if(num_fields<1) _error_("no stochasticforcing fields found");
Index: /issm/trunk/src/c/modules/ModelProcessorx/ModelProcessorx.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/ModelProcessorx.cpp	(revision 27034)
+++ /issm/trunk/src/c/modules/ModelProcessorx/ModelProcessorx.cpp	(revision 27035)
@@ -81,6 +81,8 @@
 	UpdateElementsAndMaterialsDakota(elements,inputs,materials,iomodel);
 	#endif
-	if(solution_enum==TransientSolutionEnum) UpdateElementsTransient(elements,parameters,inputs,iomodel);
-
+	if(solution_enum==TransientSolutionEnum){
+		UpdateParametersTransient(parameters,iomodel);
+		UpdateElementsTransient(elements,parameters,inputs,iomodel);
+	}
 	/*Output definitions dataset: */
 	if(VerboseMProcessor()) _printf0_("   creating output definitions" << "\n");
Index: /issm/trunk/src/c/modules/ModelProcessorx/ModelProcessorx.h
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 27034)
+++ /issm/trunk/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 27035)
@@ -24,4 +24,5 @@
 void UpdateElementsAndMaterialsDakota(Elements* elements,Inputs* inputs,Materials* materials, IoModel* iomodel);
 void UpdateElementsTransient(Elements* elements,Parameters* parameters,Inputs* inputs,IoModel* iomodel);
+void UpdateParametersTransient(Parameters* parameters,IoModel* iomodel);
 void CreateNodes(Nodes*nodes, IoModel* iomodel,int analysis,int finite_element,bool isamr=false,int approximation=NoneApproximationEnum,int* approximations=NULL);
 
Index: /issm/trunk/src/c/modules/ModelProcessorx/Transient/UpdateParametersTransient.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Transient/UpdateParametersTransient.cpp	(revision 27035)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Transient/UpdateParametersTransient.cpp	(revision 27035)
@@ -0,0 +1,25 @@
+/*
+ * UpdateParametersTransient.cpp:
+ */
+
+#include "../../../toolkits/toolkits.h"
+#include "../../../classes/classes.h"
+#include "../../../shared/shared.h"
+#include "../../MeshPartitionx/MeshPartitionx.h"
+#include "../ModelProcessorx.h"
+
+void UpdateParametersTransient(Parameters* parameters,IoModel* iomodel){/*{{{*/
+	
+	bool isgroundingline;
+	int numoutputs;
+	char** requestedoutputs;
+	parameters->FindParam(&isgroundingline,TransientIsgroundinglineEnum);
+	if(isgroundingline){
+		iomodel->FindConstant(&requestedoutputs,&numoutputs,"md.groundingline.requested_outputs");
+		parameters->AddObject(new IntParam(GroundinglineNumRequestedOutputsEnum,numoutputs));
+      if(numoutputs)parameters->AddObject(new StringArrayParam(GroundinglineRequestedOutputsEnum,requestedoutputs,numoutputs));
+      iomodel->DeleteData(&requestedoutputs,numoutputs,"md.groundingline.requested_outputs");
+	}
+}/*}}}*/
+
+
Index: /issm/trunk/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.cpp
===================================================================
--- /issm/trunk/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.cpp	(revision 27034)
+++ /issm/trunk/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.cpp	(revision 27035)
@@ -40,2 +40,26 @@
 	xDelete<IssmDouble>(serial_vector);
 }
+#ifdef _HAVE_AD_
+void SetControlInputsFromVectorx(FemModel* femmodel,IssmPDouble* vector){
+
+	/*Get total size and recast*/
+	int  num_controls;
+	int* M = NULL;
+	int* N = NULL;
+	femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
+	femmodel->parameters->FindParam(&M,NULL,ControlInputSizeMEnum);
+	femmodel->parameters->FindParam(&N,NULL,ControlInputSizeNEnum);
+
+	int size = 0;
+	for(int i=0;i<num_controls;i++) size += M[i]*N[i]; 
+
+	IssmDouble* serial_vector=xNew<IssmDouble>(size);
+	for(int i=0;i<size;i++) serial_vector[i] = reCast<IssmDouble>(vector[i]);
+
+	SetControlInputsFromVectorx(femmodel,serial_vector);
+
+	xDelete<IssmDouble>(serial_vector);
+	xDelete<int>(M);
+	xDelete<int>(N);
+}
+#endif
Index: /issm/trunk/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.h
===================================================================
--- /issm/trunk/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.h	(revision 27034)
+++ /issm/trunk/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.h	(revision 27035)
@@ -11,3 +11,7 @@
 void SetControlInputsFromVectorx(FemModel* femmodel,IssmDouble* vector);
 
+#ifdef _HAVE_AD_
+void SetControlInputsFromVectorx(FemModel* femmodel,IssmPDouble* vector);
+#endif
+
 #endif 
Index: /issm/trunk/src/c/modules/Solverx/Solverx.cpp
===================================================================
--- /issm/trunk/src/c/modules/Solverx/Solverx.cpp	(revision 27034)
+++ /issm/trunk/src/c/modules/Solverx/Solverx.cpp	(revision 27035)
@@ -65,5 +65,5 @@
 	/*Check convergence*/
 	if(solver_residue>solver_residue_threshold){
-		_printf0_("solver residue too high!: norm(KU-F)/norm(F)=" << solver_residue << " > "<<solver_residue_threshold<<" (md.settings.solver_residue_threshold)");
+		_printf0_("solver residue too high!: norm(KU-F)/norm(F)=" << solver_residue << " > "<<solver_residue_threshold<<" (md.settings.solver_residue_threshold)\n");
 		return false;
 	}
Index: /issm/trunk/src/c/modules/StochasticForcingx/StochasticForcingx.cpp
===================================================================
--- /issm/trunk/src/c/modules/StochasticForcingx/StochasticForcingx.cpp	(revision 27034)
+++ /issm/trunk/src/c/modules/StochasticForcingx/StochasticForcingx.cpp	(revision 27035)
@@ -11,20 +11,4 @@
 void StochasticForcingx(FemModel* femmodel){/*{{{*/
 
-
-	//VV testing (12Nov)
-	/*
-	IssmDouble timeVV,dtVV,starttimeVV;
-	femmodel->parameters->FindParam(&timeVV,TimeEnum);
-   femmodel->parameters->FindParam(&dtVV,TimesteppingTimeStepEnum);
-   femmodel->parameters->FindParam(&starttimeVV,TimesteppingStartTimeEnum);
-	IssmDouble valMean = 0;
-	IssmDouble valSdev = 0.5;
-	int seed;
-	//seed = reCast<int,IssmDouble>((timeVV-starttimeVV)/dtVV);
-	seed = -1;
-	IssmDouble rdmVV;
-	univariateNormal_test0(&rdmVV,valMean,valSdev,seed);
-	_printf_("VV rdmVV: "<<rdmVV<<'\n');
-	*/
 
    /*Retrieve parameters*/
@@ -42,24 +26,43 @@
    femmodel->parameters->FindParam(&covariance,&M,&N,StochasticForcingCovarianceEnum); _assert_(M==dimtot); _assert_(N==dimtot);
 
+	/*Check if this is a timestep for new noiseterms computation*/
+	bool isstepforstoch = false;
+	IssmDouble time,dt,starttime,tstep_stoch;
+   femmodel->parameters->FindParam(&time,TimeEnum);
+   femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
+   femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
+   femmodel->parameters->FindParam(&tstep_stoch,StochasticForcingTimestepEnum);
+		
+	#ifndef _HAVE_AD_
+   if((fmod(time,tstep_stoch)<fmod((time-dt),tstep_stoch)) || (time<=starttime+dt) || tstep_stoch==dt) isstepforstoch = true;
+   #else
+   _error_("not implemented yet");
+   #endif
+
    /*Compute noise terms*/
-   IssmDouble* noiseterms = xNew<IssmDouble>(dimtot);
-   my_rank=IssmComm::GetRank();
-   if(my_rank==0){
-      int fixedseed;
-      IssmDouble time,dt,starttime;
-      femmodel->parameters->FindParam(&time,TimeEnum);
-      femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
-      femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
-		/*Determine whether random seed is fixed to time step (randomflag==false) or random seed truly random (randomflag==true)*/
-      if(randomflag) fixedseed=-1;
-      else fixedseed = reCast<int,IssmDouble>((time-starttime)/dt);
-		/*multivariateNormal needs to be passed a NULL pointer to avoid memory leak issues*/
-      IssmDouble* temparray = NULL;
-      multivariateNormal(&temparray,dimtot,0.0,covariance,fixedseed);
-      for(int i=0;i<dimtot;i++) noiseterms[i]=temparray[i];
-      xDelete<IssmDouble>(temparray);
-   }
-   ISSM_MPI_Bcast(noiseterms,dimtot,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
-   
+	IssmDouble* noiseterms = xNew<IssmDouble>(dimtot);
+   if(isstepforstoch){
+		my_rank=IssmComm::GetRank();
+   	if(my_rank==0){
+   	   int fixedseed;
+			/*Determine whether random seed is fixed to time step (randomflag==false) or random seed truly random (randomflag==true)*/
+   	   if(randomflag) fixedseed=-1;
+   	   else fixedseed = reCast<int,IssmDouble>((time-starttime)/dt);
+			/*multivariateNormal needs to be passed a NULL pointer to avoid memory leak issues*/
+   	   IssmDouble* temparray = NULL;
+   	   multivariateNormal(&temparray,dimtot,0.0,covariance,fixedseed);
+   	   for(int i=0;i<dimtot;i++) noiseterms[i]=temparray[i];
+			xDelete<IssmDouble>(temparray);
+   	}
+   	ISSM_MPI_Bcast(noiseterms,dimtot,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
+		femmodel->parameters->SetParam(noiseterms,dimtot,StochasticForcingNoisetermsEnum);
+	}
+	else{
+		IssmDouble* temparray = NULL;
+		femmodel->parameters->FindParam(&temparray,&N,StochasticForcingNoisetermsEnum); _assert_(N==dimtot);
+		for(int i=0;i<dimtot;i++) noiseterms[i] = temparray[i];
+		xDelete<IssmDouble>(temparray);
+	}
+
 	int i=0;
    for(int j=0;j<numfields;j++){
@@ -73,5 +76,5 @@
 
 		/*Deal with the autoregressive models*/
-		if(fields[j]==SMBautoregressionEnum || fields[j]==FrontalForcingsRignotAutoregressionEnum){
+		if(fields[j]==SMBautoregressionEnum || fields[j]==FrontalForcingsRignotAutoregressionEnum || fields[j]==BasalforcingsDeepwaterMeltingRateAutoregressionEnum){
 			switch(fields[j]){
 				case SMBautoregressionEnum:
@@ -82,4 +85,8 @@
 					dimenum_type   = FrontalForcingsBasinIdEnum;
 					noiseenum_type = ThermalforcingAutoregressionNoiseEnum;
+					break;
+				case BasalforcingsDeepwaterMeltingRateAutoregressionEnum:
+					dimenum_type   = BasalforcingsLinearBasinIdEnum;
+					noiseenum_type = BasalforcingsDeepwaterMeltingRateNoiseEnum;
 					break;
 			}
@@ -98,6 +105,28 @@
 				case SMBautoregressionEnum:
 				case FrontalForcingsRignotAutoregressionEnum:
+				case BasalforcingsDeepwaterMeltingRateAutoregressionEnum:
 					/*Already done above*/
 					break;
+				case BasalforcingsSpatialDeepwaterMeltingRateEnum:
+               /*Delete BasalforcingsSpatialDeepwaterMeltingRateEnum at previous time step (required if it is transient)*/
+               femmodel->inputs->DeleteInput(BasalforcingsSpatialDeepwaterMeltingRateEnum);
+               for(Object* &object:femmodel->elements->objects){
+                  Element* element = xDynamicCast<Element*>(object);
+                  int numvertices  = element->GetNumberOfVertices();
+                  IssmDouble baselinedeepwatermelt;
+                  IssmDouble deepwatermelt_tot[numvertices];
+                  Input* baselinedeepwatermelt_input  = NULL;
+                  baselinedeepwatermelt_input = element->GetInput(BaselineBasalforcingsSpatialDeepwaterMeltingRateEnum); _assert_(baselinedeepwatermelt_input);
+                  element->GetInputValue(&dimensionid,StochasticForcingDefaultIdEnum);
+                  Gauss* gauss = element->NewGauss();
+                  for(int i=0;i<numvertices;i++){
+                     gauss->GaussVertex(i);
+                     baselinedeepwatermelt_input->GetInputValue(&baselinedeepwatermelt,gauss);
+                     deepwatermelt_tot[i] = baselinedeepwatermelt+noisefield[dimensionid];
+                  }
+                  element->AddInput(BasalforcingsSpatialDeepwaterMeltingRateEnum,&deepwatermelt_tot[0],P1DGEnum);
+                  delete gauss;
+               }
+               break;
 				case DefaultCalvingEnum:
 					/*Delete CalvingCalvingrateEnum at previous time step (required if it is transient)*/
@@ -136,5 +165,6 @@
 							gauss->GaussVertex(i);
 							baselinefloatingicemeltrate_input->GetInputValue(&baselinefloatingicemeltrate,gauss);
-							floatingicemeltrate_tot[i] = max(0.0,baselinefloatingicemeltrate+noisefield[dimensionid]);
+							/*No check for positive melt rate because basal accretion is allowed*/
+							floatingicemeltrate_tot[i] = baselinefloatingicemeltrate+noisefield[dimensionid];
 						}
 						element->AddInput(BasalforcingsFloatingiceMeltingRateEnum,&floatingicemeltrate_tot[0],P1DGEnum);
@@ -142,5 +172,25 @@
 					}
 					break;
-				//VV working(29Nov2021)
+				case SMBforcingEnum:
+					/*Delete SmbMassBalanceEnum at previous time step (required if it is transient)*/
+					femmodel->inputs->DeleteInput(SmbMassBalanceEnum);
+					for(Object* &object:femmodel->elements->objects){
+						Element* element = xDynamicCast<Element*>(object);
+						int numvertices  = element->GetNumberOfVertices();
+						IssmDouble baselinesmb;
+						IssmDouble smb_tot[numvertices];
+						Input* baselinesmb_input  = NULL;
+						baselinesmb_input = element->GetInput(BaselineSmbMassBalanceEnum); _assert_(baselinesmb_input);
+						element->GetInputValue(&dimensionid,StochasticForcingDefaultIdEnum);
+						Gauss* gauss = element->NewGauss();
+						for(int i=0;i<numvertices;i++){
+							gauss->GaussVertex(i);
+							baselinesmb_input->GetInputValue(&baselinesmb,gauss);
+							smb_tot[i] = baselinesmb+noisefield[dimensionid];
+						}
+						element->AddInput(SmbMassBalanceEnum,&smb_tot[0],P1DGEnum);
+						delete gauss;
+					}
+					break;
 				case FrictionWaterPressureEnum:
 					/*Specify that WaterPressure is stochastic*/ 
@@ -165,27 +215,4 @@
 					}
 					break;
-
-				/*
-				case FrictionEffectivePressureEnum:
-					femmodel->parameters->SetParam(true,StochasticForcingIsEffectivePressureEnum);
-					for(Object* &object:femmodel->elements->objects){
-                  Element* element = xDynamicCast<Element*>(object);
-                  int numvertices  = element->GetNumberOfVertices();
-                  IssmDouble Neff[numvertices];
-						element->GetInputValue(&dimensionid,StochasticForcingDefaultIdEnum);
-						Gauss* gauss=element->NewGauss();
-						Friction* friction = new Friction(element);
-						for(int i=0;i<numvertices;i++){
-							gauss->GaussVertex(i);
-							Neff[i] = friction->EffectivePressure(gauss);
-							Neff[i] = Neff[i]+noisefield[dimensionid];
-						}
-						element->AddInput(FrictionEffectivePressureEnum,Neff,P1DGEnum);
-						delete gauss;
-						delete friction;
-					}
-					break;
-				*/
-
 				default:
 					_error_("Field "<<EnumToStringx(fields[j])<<" does not support stochasticity yet.");
Index: /issm/trunk/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp
===================================================================
--- /issm/trunk/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp	(revision 27034)
+++ /issm/trunk/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp	(revision 27035)
@@ -66,5 +66,5 @@
 	Input* vyobs_input  = NULL;
 
-	/*Read SurfaceEnum from 2D models:SSA, L1L2, MLHO*/
+	/*Read SurfaceEnum from 2D models:SSA, L1L2, MOLHO*/
 	if (domaintype == Domain2DhorizontalEnum) {
 		vx_input = topelement->GetInput(VxSurfaceEnum);					_assert_(vx_input);
Index: /issm/trunk/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp
===================================================================
--- /issm/trunk/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp	(revision 27034)
+++ /issm/trunk/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp	(revision 27035)
@@ -74,5 +74,5 @@
    Input* vyobs_input  = NULL;
 
-   /*Read SurfaceEnum from 2D models:SSA, L1L2, MLHO*/
+   /*Read SurfaceEnum from 2D models:SSA, L1L2, MOLHO*/
    if (domaintype == Domain2DhorizontalEnum) {
       vx_input = topelement->GetInput(VxSurfaceEnum);             _assert_(vx_input);
Index: /issm/trunk/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp
===================================================================
--- /issm/trunk/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp	(revision 27034)
+++ /issm/trunk/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp	(revision 27035)
@@ -68,5 +68,5 @@
    Input* vyobs_input  = NULL;
 
-   /*Read SurfaceEnum from 2D models:SSA, L1L2, MLHO*/
+   /*Read SurfaceEnum from 2D models:SSA, L1L2, MOLHO*/
    if (domaintype == Domain2DhorizontalEnum) {
       vx_input = topelement->GetInput(VxSurfaceEnum);             _assert_(vx_input);
Index: /issm/trunk/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp
===================================================================
--- /issm/trunk/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp	(revision 27034)
+++ /issm/trunk/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp	(revision 27035)
@@ -68,5 +68,5 @@
    Input* vyobs_input  = NULL;
 
-   /*Read SurfaceEnum from 2D models:SSA, L1L2, MLHO*/
+   /*Read SurfaceEnum from 2D models:SSA, L1L2, MOLHO*/
    if (domaintype == Domain2DhorizontalEnum) {
       vx_input = topelement->GetInput(VxSurfaceEnum);             _assert_(vx_input);
Index: /issm/trunk/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
===================================================================
--- /issm/trunk/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 27034)
+++ /issm/trunk/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 27035)
@@ -164,6 +164,6 @@
 	femmodel->parameters->FindParam(&phi,&M,&Nphi,SmbPhiEnum);  _assert_(M==numbasins); _assert_(Nphi==arorder);
 	
-	/*AR model spin-up with 0 noise to initialize SmbValuesAutoregressionEnum*/
-	int nspin{2*arorder+5};
+	/*AR model spin-up with 0 noise to initialize SmbValuesAutoregressionEnum (688 = log(0.001)/log(0.99): decaying time of inluence of phi[0]=0.99 to 0.001 of beta_0*/
+	int nspin = 688;
 	for(Object* &object:femmodel->elements->objects){
       Element* element      = xDynamicCast<Element*>(object); //generate element object
@@ -198,16 +198,23 @@
    bool isstochastic;
    bool issmbstochastic = false;
-   int M,N,Nphi,arorder,numbasins,my_rank;
+   int M,N,Nphi,arorder,numbasins,numelevbins,my_rank;
    femmodel->parameters->FindParam(&numbasins,SmbNumBasinsEnum);
    femmodel->parameters->FindParam(&arorder,SmbAutoregressiveOrderEnum);
+   femmodel->parameters->FindParam(&numelevbins,SmbNumElevationBinsEnum);
    IssmDouble tinit_ar;
-   IssmDouble* beta0      = NULL; 
-   IssmDouble* beta1      = NULL;
-   IssmDouble* phi        = NULL;
+   IssmDouble* beta0         = NULL; 
+   IssmDouble* beta1         = NULL;
+   IssmDouble* phi           = NULL;
+   IssmDouble* lapserates    = NULL;
+   IssmDouble* elevbins      = NULL;
+   IssmDouble* refelevation  = NULL;
 
    femmodel->parameters->FindParam(&tinit_ar,SmbAutoregressionInitialTimeEnum);
-   femmodel->parameters->FindParam(&beta0,&M,SmbBeta0Enum);    _assert_(M==numbasins);
-   femmodel->parameters->FindParam(&beta1,&M,SmbBeta1Enum);    _assert_(M==numbasins);
-   femmodel->parameters->FindParam(&phi,&M,&Nphi,SmbPhiEnum);  _assert_(M==numbasins); _assert_(Nphi==arorder);
+   femmodel->parameters->FindParam(&beta0,&M,SmbBeta0Enum);                  _assert_(M==numbasins);
+   femmodel->parameters->FindParam(&beta1,&M,SmbBeta1Enum);                  _assert_(M==numbasins);
+   femmodel->parameters->FindParam(&phi,&M,&Nphi,SmbPhiEnum);                _assert_(M==numbasins); _assert_(Nphi==arorder);
+   femmodel->parameters->FindParam(&lapserates,&M,&N,SmbLapseRatesEnum);     _assert_(M==numbasins); _assert_(N==numelevbins);
+   femmodel->parameters->FindParam(&elevbins,&M,&N,SmbElevationBinsEnum);    _assert_(M==numbasins); _assert_(N==numelevbins-1);
+   femmodel->parameters->FindParam(&refelevation,&M,SmbRefElevationEnum);    _assert_(M==numbasins);
 
    femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum);
@@ -228,6 +235,9 @@
    for(Object* &object:femmodel->elements->objects){
       Element* element = xDynamicCast<Element*>(object);
-      element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,issmbstochastic,SMBautoregressionEnum);
-   }
+      /*Compute autoregression*/
+		element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,issmbstochastic,SMBautoregressionEnum);
+		/*Compute lapse rate adjustment*/
+		element->LapseRateBasinSMB(numelevbins,lapserates,elevbins,refelevation);
+	}
 
    /*Cleanup*/
@@ -235,4 +245,7 @@
    xDelete<IssmDouble>(beta1);
    xDelete<IssmDouble>(phi);
+   xDelete<IssmDouble>(lapserates);
+   xDelete<IssmDouble>(elevbins);
+   xDelete<IssmDouble>(refelevation);
 }/*}}}*/
 void Delta18oParameterizationx(FemModel* femmodel){/*{{{*/
Index: /issm/trunk/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp
===================================================================
--- /issm/trunk/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp	(revision 27034)
+++ /issm/trunk/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp	(revision 27035)
@@ -68,5 +68,5 @@
    Input* vyobs_input  = NULL;
 
-   /*Read SurfaceEnum from 2D models:SSA, L1L2, MLHO*/
+   /*Read SurfaceEnum from 2D models:SSA, L1L2, MOLHO*/
    if (domaintype == Domain2DhorizontalEnum) {
       vx_input = topelement->GetInput(VxSurfaceEnum);             _assert_(vx_input);
Index: /issm/trunk/src/c/shared/Enum/Enum.vim
===================================================================
--- /issm/trunk/src/c/shared/Enum/Enum.vim	(revision 27034)
+++ /issm/trunk/src/c/shared/Enum/Enum.vim	(revision 27035)
@@ -64,4 +64,9 @@
 syn keyword cConstant BalancethicknessStabilizationEnum
 syn keyword cConstant BarystaticContributionsEnum
+syn keyword cConstant BasalforcingsAutoregressionInitialTimeEnum
+syn keyword cConstant BasalforcingsAutoregressionTimestepEnum
+syn keyword cConstant BasalforcingsAutoregressiveOrderEnum
+syn keyword cConstant BasalforcingsBeta0Enum
+syn keyword cConstant BasalforcingsBeta1Enum
 syn keyword cConstant BasalforcingsBottomplumedepthEnum
 syn keyword cConstant BasalforcingsCrustthicknessEnum
@@ -77,7 +82,9 @@
 syn keyword cConstant BasalforcingsIsmip6NumBasinsEnum
 syn keyword cConstant BasalforcingsIsmip6TfDepthsEnum
+syn keyword cConstant BasalforcingsLinearNumBasinsEnum
 syn keyword cConstant BasalforcingsLowercrustheatEnum
 syn keyword cConstant BasalforcingsMantleconductivityEnum
 syn keyword cConstant BasalforcingsNusseltEnum
+syn keyword cConstant BasalforcingsPhiEnum
 syn keyword cConstant BasalforcingsPicoAverageOverturningEnum
 syn keyword cConstant BasalforcingsPicoAverageSalinityEnum
@@ -105,4 +112,11 @@
 syn keyword cConstant CalvingLawEnum
 syn keyword cConstant CalvingMinthicknessEnum
+syn keyword cConstant CalvingTestSpeedfactorEnum
+syn keyword cConstant CalvingTestIndependentRateEnum
+syn keyword cConstant CalvingUseParamEnum
+syn keyword cConstant CalvingScaleThetaEnum
+syn keyword cConstant CalvingAmpAlphaEnum
+syn keyword cConstant CalvingMidpointEnum
+syn keyword cConstant CalvingNonlinearLawEnum
 syn keyword cConstant ConfigurationTypeEnum
 syn keyword cConstant ConstantsGEnum
@@ -162,5 +176,5 @@
 syn keyword cConstant FlowequationIsHOEnum
 syn keyword cConstant FlowequationIsL1L2Enum
-syn keyword cConstant FlowequationIsMLHOEnum
+syn keyword cConstant FlowequationIsMOLHOEnum
 syn keyword cConstant FlowequationIsSIAEnum
 syn keyword cConstant FlowequationIsSSAEnum
@@ -189,4 +203,6 @@
 syn keyword cConstant GroundinglineMeltInterpolationEnum
 syn keyword cConstant GroundinglineMigrationEnum
+syn keyword cConstant GroundinglineNumRequestedOutputsEnum
+syn keyword cConstant GroundinglineRequestedOutputsEnum
 syn keyword cConstant HydrologyAveragingEnum
 syn keyword cConstant HydrologyCavitySpacingEnum
@@ -263,4 +279,5 @@
 syn keyword cConstant LockFileNameEnum
 syn keyword cConstant LoveAllowLayerDeletionEnum
+syn keyword cConstant LoveChandlerWobbleEnum
 syn keyword cConstant LoveCoreMantleBoundaryEnum
 syn keyword cConstant LoveEarthMassEnum
@@ -283,4 +300,5 @@
 syn keyword cConstant LoveStartingLayerEnum
 syn keyword cConstant LoveUnderflowTolEnum
+syn keyword cConstant LovePostWidderThresholdEnum
 syn keyword cConstant MassFluxSegmentsEnum
 syn keyword cConstant MassFluxSegmentsPresentEnum
@@ -352,10 +370,8 @@
 syn keyword cConstant ModelnameEnum
 syn keyword cConstant SamplingAlphaEnum
-syn keyword cConstant SamplingPhiEnum
 syn keyword cConstant SamplingNumRequestedOutputsEnum
 syn keyword cConstant SamplingRequestedOutputsEnum
 syn keyword cConstant SamplingRobinEnum
 syn keyword cConstant SamplingSeedEnum
-syn keyword cConstant SamplingTauEnum
 syn keyword cConstant SaveResultsEnum
 syn keyword cConstant SolidearthPartitionIceEnum
@@ -369,5 +385,4 @@
 syn keyword cConstant SolidearthSettingsAbstolEnum
 syn keyword cConstant SolidearthSettingsCrossSectionShapeEnum
-syn keyword cConstant RotationalAngularVelocityEnum
 syn keyword cConstant SolidearthSettingsElasticEnum
 syn keyword cConstant SolidearthSettingsViscousEnum
@@ -376,5 +391,13 @@
 syn keyword cConstant SealevelchangeViscousTimesEnum
 syn keyword cConstant SealevelchangeViscousIndexEnum
+syn keyword cConstant SealevelchangeViscousPolarMotionEnum
+syn keyword cConstant SealevelchangeRunCountEnum
+syn keyword cConstant SealevelchangeTransitionsEnum
+syn keyword cConstant SealevelchangeRequestedOutputsEnum
+syn keyword cConstant RotationalAngularVelocityEnum
 syn keyword cConstant RotationalEquatorialMoiEnum
+syn keyword cConstant RotationalPolarMoiEnum
+syn keyword cConstant LovePolarMotionTransferFunctionColinearEnum
+syn keyword cConstant LovePolarMotionTransferFunctionOrthogonalEnum
 syn keyword cConstant TidalLoveHEnum
 syn keyword cConstant TidalLoveKEnum
@@ -388,9 +411,16 @@
 syn keyword cConstant SealevelchangeGSelfAttractionEnum
 syn keyword cConstant SealevelchangeGViscoElasticEnum
+syn keyword cConstant SealevelchangeUViscoElasticEnum
+syn keyword cConstant SealevelchangeHViscoElasticEnum
+syn keyword cConstant SealevelchangePolarMotionTransferFunctionColinearEnum
+syn keyword cConstant SealevelchangePolarMotionTransferFunctionOrthogonalEnum
+syn keyword cConstant SealevelchangePolarMotionTransferFunctionZEnum
+syn keyword cConstant SealevelchangeTidalK2Enum
+syn keyword cConstant SealevelchangeTidalH2Enum
+syn keyword cConstant SealevelchangeTidalL2Enum
 syn keyword cConstant SolidearthSettingsSealevelLoadingEnum
 syn keyword cConstant SolidearthSettingsGRDEnum
 syn keyword cConstant SolidearthSettingsRunFrequencyEnum
 syn keyword cConstant SolidearthSettingsTimeAccEnum
-syn keyword cConstant SealevelchangeHViscoElasticEnum
 syn keyword cConstant SolidearthSettingsHorizEnum
 syn keyword cConstant SolidearthSettingsMaxiterEnum
@@ -404,15 +434,12 @@
 syn keyword cConstant StochasticForcingIsStochasticForcingEnum
 syn keyword cConstant StochasticForcingIsWaterPressureEnum
+syn keyword cConstant StochasticForcingNoisetermsEnum
 syn keyword cConstant StochasticForcingNumFieldsEnum
 syn keyword cConstant StochasticForcingRandomflagEnum
-syn keyword cConstant RotationalPolarMoiEnum
+syn keyword cConstant StochasticForcingTimestepEnum
 syn keyword cConstant SolidearthSettingsReltolEnum
-syn keyword cConstant SealevelchangeRequestedOutputsEnum
 syn keyword cConstant SolidearthSettingsSelfAttractionEnum
 syn keyword cConstant SolidearthSettingsRotationEnum
 syn keyword cConstant SolidearthSettingsMaxSHCoeffEnum
-syn keyword cConstant SealevelchangeRunCountEnum
-syn keyword cConstant SealevelchangeTransitionsEnum
-syn keyword cConstant SealevelchangeUViscoElasticEnum
 syn keyword cConstant SettingsIoGatherEnum
 syn keyword cConstant SettingsNumResultsOnNodesEnum
@@ -439,4 +466,5 @@
 syn keyword cConstant SmbDpermilEnum
 syn keyword cConstant SmbDsnowIdxEnum
+syn keyword cConstant SmbElevationBinsEnum
 syn keyword cConstant SmbCldFracEnum
 syn keyword cConstant SmbDelta18oEnum
@@ -466,9 +494,12 @@
 syn keyword cConstant SmbIsturbulentfluxEnum
 syn keyword cConstant SmbKEnum
+syn keyword cConstant SmbLapseRatesEnum
 syn keyword cConstant SmbNumBasinsEnum
+syn keyword cConstant SmbNumElevationBinsEnum
 syn keyword cConstant SmbNumRequestedOutputsEnum
 syn keyword cConstant SmbPfacEnum
 syn keyword cConstant SmbPhiEnum
 syn keyword cConstant SmbRdlEnum
+syn keyword cConstant SmbRefElevationEnum
 syn keyword cConstant SmbRequestedOutputsEnum
 syn keyword cConstant SmbRlapsEnum
@@ -579,8 +610,16 @@
 syn keyword cConstant BalancethicknessThickeningRateEnum
 syn keyword cConstant BasalCrevasseEnum
+syn keyword cConstant BasalforcingsDeepwaterMeltingRateAutoregressionEnum
+syn keyword cConstant BasalforcingsDeepwaterMeltingRateNoiseEnum
+syn keyword cConstant BasalforcingsDeepwaterMeltingRateValuesAutoregressionEnum
 syn keyword cConstant BasalforcingsFloatingiceMeltingRateEnum
 syn keyword cConstant BasalforcingsGeothermalfluxEnum
 syn keyword cConstant BasalforcingsGroundediceMeltingRateEnum
+syn keyword cConstant BasalforcingsLinearBasinIdEnum
 syn keyword cConstant BasalforcingsPerturbationMeltingRateEnum
+syn keyword cConstant BasalforcingsSpatialDeepwaterElevationEnum
+syn keyword cConstant BasalforcingsSpatialDeepwaterMeltingRateEnum
+syn keyword cConstant BasalforcingsSpatialUpperwaterElevationEnum
+syn keyword cConstant BasalforcingsSpatialUpperwaterMeltingRateEnum
 syn keyword cConstant BasalforcingsIsmip6BasinIdEnum
 syn keyword cConstant BasalforcingsIsmip6TfEnum
@@ -604,6 +643,8 @@
 syn keyword cConstant BaseSlopeYEnum
 syn keyword cConstant BaselineBasalforcingsFloatingiceMeltingRateEnum
+syn keyword cConstant BaselineBasalforcingsSpatialDeepwaterMeltingRateEnum
 syn keyword cConstant BaselineCalvingCalvingrateEnum
 syn keyword cConstant BaselineFrictionEffectivePressureEnum
+syn keyword cConstant BaselineSmbMassBalanceEnum
 syn keyword cConstant BedEnum
 syn keyword cConstant BedGRDEnum
@@ -618,11 +659,10 @@
 syn keyword cConstant CalvingCalvingrateEnum
 syn keyword cConstant CalvingHabFractionEnum
+syn keyword cConstant CalvingAblationrateEnum
 syn keyword cConstant CalvingMeltingrateEnum
 syn keyword cConstant CalvingStressThresholdFloatingiceEnum
 syn keyword cConstant CalvingStressThresholdGroundediceEnum
 syn keyword cConstant CalvinglevermannCoeffEnum
-syn keyword cConstant CalvingratexAverageEnum
 syn keyword cConstant CalvingratexEnum
-syn keyword cConstant CalvingrateyAverageEnum
 syn keyword cConstant CalvingrateyEnum
 syn keyword cConstant CalvingFluxLevelsetEnum
@@ -803,6 +843,10 @@
 syn keyword cConstant RheologyBbarAbsGradientEnum
 syn keyword cConstant SampleEnum
+syn keyword cConstant SampleOldEnum
+syn keyword cConstant SampleNoiseEnum
 syn keyword cConstant SamplingBetaEnum
 syn keyword cConstant SamplingKappaEnum
+syn keyword cConstant SamplingPhiEnum
+syn keyword cConstant SamplingTauEnum
 syn keyword cConstant SealevelEnum
 syn keyword cConstant SealevelGRDEnum
@@ -839,16 +883,4 @@
 syn keyword cConstant BslcRateEnum
 syn keyword cConstant GmtslcEnum
-syn keyword cConstant SealevelGrotm1Enum
-syn keyword cConstant SealevelGrotm2Enum
-syn keyword cConstant SealevelGrotm3Enum
-syn keyword cConstant SealevelGUrotm1Enum
-syn keyword cConstant SealevelGUrotm2Enum
-syn keyword cConstant SealevelGUrotm3Enum
-syn keyword cConstant SealevelGNrotm1Enum
-syn keyword cConstant SealevelGNrotm2Enum
-syn keyword cConstant SealevelGNrotm3Enum
-syn keyword cConstant SealevelGErotm1Enum
-syn keyword cConstant SealevelGErotm2Enum
-syn keyword cConstant SealevelGErotm3Enum
 syn keyword cConstant SealevelRSLBarystaticEnum
 syn keyword cConstant SealevelRSLRateEnum
@@ -862,4 +894,8 @@
 syn keyword cConstant SealevelchangeGEEnum
 syn keyword cConstant SealevelchangeGNEnum
+syn keyword cConstant SealevelchangeGrotEnum
+syn keyword cConstant SealevelchangeGUrotEnum
+syn keyword cConstant SealevelchangeGNrotEnum
+syn keyword cConstant SealevelchangeGErotEnum
 syn keyword cConstant SealevelchangeGsubelOceanEnum
 syn keyword cConstant SealevelchangeGUsubelOceanEnum
@@ -1195,4 +1231,5 @@
 syn keyword cConstant ArrheniusEnum
 syn keyword cConstant AutodiffJacobianEnum
+syn keyword cConstant AutoregressionLinearFloatingMeltRateEnum
 syn keyword cConstant Balancethickness2AnalysisEnum
 syn keyword cConstant Balancethickness2SolutionEnum
@@ -1218,4 +1255,6 @@
 syn keyword cConstant CalvingHabEnum
 syn keyword cConstant CalvingLevermannEnum
+syn keyword cConstant CalvingTestEnum
+syn keyword cConstant CalvingParameterizationEnum
 syn keyword cConstant CalvingVonmisesEnum
 syn keyword cConstant CfdragcoeffabsgradEnum
@@ -1346,5 +1385,5 @@
 syn keyword cConstant JEnum
 syn keyword cConstant L1L2ApproximationEnum
-syn keyword cConstant MLHOApproximationEnum
+syn keyword cConstant MOLHOApproximationEnum
 syn keyword cConstant L2ProjectionBaseAnalysisEnum
 syn keyword cConstant L2ProjectionEPLAnalysisEnum
@@ -1358,12 +1397,17 @@
 syn keyword cConstant LoadsEnum
 syn keyword cConstant LoveAnalysisEnum
-syn keyword cConstant LoveHiEnum
-syn keyword cConstant LoveHrEnum
+syn keyword cConstant LoveHfEnum
+syn keyword cConstant LoveHtEnum
 syn keyword cConstant LoveKernelsImagEnum
 syn keyword cConstant LoveKernelsRealEnum
-syn keyword cConstant LoveKiEnum
-syn keyword cConstant LoveKrEnum
-syn keyword cConstant LoveLiEnum
-syn keyword cConstant LoveLrEnum
+syn keyword cConstant LoveKfEnum
+syn keyword cConstant LoveKtEnum
+syn keyword cConstant LoveLfEnum
+syn keyword cConstant LoveLtEnum
+syn keyword cConstant LoveTidalHtEnum
+syn keyword cConstant LoveTidalKtEnum
+syn keyword cConstant LoveTidalLtEnum
+syn keyword cConstant LovePMTF1tEnum
+syn keyword cConstant LovePMTF2tEnum
 syn keyword cConstant LoveSolutionEnum
 syn keyword cConstant MINIEnum
@@ -1477,7 +1521,7 @@
 syn keyword cConstant SealevelAbsoluteEnum
 syn keyword cConstant SealevelEmotionEnum
-syn keyword cConstant SealevelInertiaTensorXZEnum
-syn keyword cConstant SealevelInertiaTensorYZEnum
-syn keyword cConstant SealevelInertiaTensorZZEnum
+syn keyword cConstant SealevelchangePolarMotionXEnum
+syn keyword cConstant SealevelchangePolarMotionYEnum
+syn keyword cConstant SealevelchangePolarMotionZEnum
 syn keyword cConstant SealevelchangePolarMotionEnum
 syn keyword cConstant SealevelNmotionEnum
@@ -1580,5 +1624,4 @@
 syn keyword cType Cfsurfacesquare
 syn keyword cType Channel
-syn keyword cType classes
 syn keyword cType Constraint
 syn keyword cType Constraints
@@ -1587,6 +1630,6 @@
 syn keyword cType ControlInput
 syn keyword cType Covertree
+syn keyword cType DataSetParam
 syn keyword cType DatasetInput
-syn keyword cType DataSetParam
 syn keyword cType Definition
 syn keyword cType DependentObject
@@ -1601,6 +1644,6 @@
 syn keyword cType ElementInput
 syn keyword cType ElementMatrix
+syn keyword cType ElementVector
 syn keyword cType Elements
-syn keyword cType ElementVector
 syn keyword cType ExponentialVariogram
 syn keyword cType ExternalResult
@@ -1609,10 +1652,9 @@
 syn keyword cType Friction
 syn keyword cType Gauss
-syn keyword cType GaussianVariogram
-syn keyword cType gaussobjects
 syn keyword cType GaussPenta
 syn keyword cType GaussSeg
 syn keyword cType GaussTetra
 syn keyword cType GaussTria
+syn keyword cType GaussianVariogram
 syn keyword cType GenericExternalResult
 syn keyword cType GenericOption
@@ -1630,5 +1672,4 @@
 syn keyword cType IssmDirectApplicInterface
 syn keyword cType IssmParallelDirectApplicInterface
-syn keyword cType krigingobjects
 syn keyword cType Load
 syn keyword cType Loads
@@ -1641,5 +1682,4 @@
 syn keyword cType Matice
 syn keyword cType Matlitho
-syn keyword cType matrixobjects
 syn keyword cType MatrixParam
 syn keyword cType Misfit
@@ -1654,6 +1694,6 @@
 syn keyword cType Observations
 syn keyword cType Option
+syn keyword cType OptionUtilities
 syn keyword cType Options
-syn keyword cType OptionUtilities
 syn keyword cType Param
 syn keyword cType Parameters
@@ -1669,11 +1709,11 @@
 syn keyword cType Regionaloutput
 syn keyword cType Results
+syn keyword cType RiftStruct
 syn keyword cType Riftfront
-syn keyword cType RiftStruct
 syn keyword cType SealevelGeometry
 syn keyword cType Seg
 syn keyword cType SegInput
+syn keyword cType SegRef
 syn keyword cType Segment
-syn keyword cType SegRef
 syn keyword cType SpcDynamic
 syn keyword cType SpcStatic
@@ -1694,4 +1734,8 @@
 syn keyword cType Vertex
 syn keyword cType Vertices
+syn keyword cType classes
+syn keyword cType gaussobjects
+syn keyword cType krigingobjects
+syn keyword cType matrixobjects
 syn keyword cType AdjointBalancethickness2Analysis
 syn keyword cType AdjointBalancethicknessAnalysis
Index: /issm/trunk/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk/src/c/shared/Enum/EnumDefinitions.h	(revision 27034)
+++ /issm/trunk/src/c/shared/Enum/EnumDefinitions.h	(revision 27035)
@@ -58,4 +58,9 @@
 	BalancethicknessStabilizationEnum,
 	BarystaticContributionsEnum,
+	BasalforcingsAutoregressionInitialTimeEnum,
+	BasalforcingsAutoregressionTimestepEnum,
+	BasalforcingsAutoregressiveOrderEnum,
+	BasalforcingsBeta0Enum,
+	BasalforcingsBeta1Enum,
 	BasalforcingsBottomplumedepthEnum,
 	BasalforcingsCrustthicknessEnum,
@@ -71,7 +76,9 @@
 	BasalforcingsIsmip6NumBasinsEnum,
 	BasalforcingsIsmip6TfDepthsEnum,
+	BasalforcingsLinearNumBasinsEnum,
 	BasalforcingsLowercrustheatEnum,
 	BasalforcingsMantleconductivityEnum,
 	BasalforcingsNusseltEnum,
+	BasalforcingsPhiEnum,
 	BasalforcingsPicoAverageOverturningEnum,
 	BasalforcingsPicoAverageSalinityEnum,
@@ -99,4 +106,11 @@
 	CalvingLawEnum,
 	CalvingMinthicknessEnum,
+	CalvingTestSpeedfactorEnum,
+	CalvingTestIndependentRateEnum,
+	CalvingUseParamEnum,
+	CalvingScaleThetaEnum,
+	CalvingAmpAlphaEnum,
+	CalvingMidpointEnum,
+	CalvingNonlinearLawEnum,
 	ConfigurationTypeEnum,
 	ConstantsGEnum,
@@ -156,5 +170,5 @@
 	FlowequationIsHOEnum,
 	FlowequationIsL1L2Enum,
-	FlowequationIsMLHOEnum,
+	FlowequationIsMOLHOEnum,
 	FlowequationIsSIAEnum,
 	FlowequationIsSSAEnum,
@@ -183,4 +197,6 @@
 	GroundinglineMeltInterpolationEnum,
 	GroundinglineMigrationEnum,
+	GroundinglineNumRequestedOutputsEnum,
+	GroundinglineRequestedOutputsEnum,
 	HydrologyAveragingEnum,
 	HydrologyCavitySpacingEnum,
@@ -257,4 +273,5 @@
 	LockFileNameEnum,
 	LoveAllowLayerDeletionEnum,
+	LoveChandlerWobbleEnum,
 	LoveCoreMantleBoundaryEnum,
 	LoveEarthMassEnum,
@@ -277,4 +294,5 @@
 	LoveStartingLayerEnum,
 	LoveUnderflowTolEnum,
+	LovePostWidderThresholdEnum,
 	MassFluxSegmentsEnum,
 	MassFluxSegmentsPresentEnum,
@@ -346,10 +364,8 @@
 	ModelnameEnum,
 	SamplingAlphaEnum,
-	SamplingPhiEnum,
 	SamplingNumRequestedOutputsEnum,
 	SamplingRequestedOutputsEnum,
 	SamplingRobinEnum,
 	SamplingSeedEnum,
-	SamplingTauEnum,
 	SaveResultsEnum,
 	SolidearthPartitionIceEnum,
@@ -363,5 +379,4 @@
 	SolidearthSettingsAbstolEnum,
 	SolidearthSettingsCrossSectionShapeEnum,
-	RotationalAngularVelocityEnum,
 	SolidearthSettingsElasticEnum,
 	SolidearthSettingsViscousEnum,
@@ -370,5 +385,13 @@
 	SealevelchangeViscousTimesEnum,
 	SealevelchangeViscousIndexEnum,
+	SealevelchangeViscousPolarMotionEnum,
+	SealevelchangeRunCountEnum,
+	SealevelchangeTransitionsEnum,
+	SealevelchangeRequestedOutputsEnum,
+	RotationalAngularVelocityEnum,
 	RotationalEquatorialMoiEnum,
+	RotationalPolarMoiEnum,
+	LovePolarMotionTransferFunctionColinearEnum,
+	LovePolarMotionTransferFunctionOrthogonalEnum,
 	TidalLoveHEnum,
 	TidalLoveKEnum,
@@ -382,9 +405,16 @@
 	SealevelchangeGSelfAttractionEnum,
 	SealevelchangeGViscoElasticEnum,
+	SealevelchangeUViscoElasticEnum,
+	SealevelchangeHViscoElasticEnum,
+	SealevelchangePolarMotionTransferFunctionColinearEnum,
+	SealevelchangePolarMotionTransferFunctionOrthogonalEnum,
+	SealevelchangePolarMotionTransferFunctionZEnum,
+	SealevelchangeTidalK2Enum,
+	SealevelchangeTidalH2Enum,
+	SealevelchangeTidalL2Enum,
 	SolidearthSettingsSealevelLoadingEnum,
 	SolidearthSettingsGRDEnum,
 	SolidearthSettingsRunFrequencyEnum,
 	SolidearthSettingsTimeAccEnum,
-	SealevelchangeHViscoElasticEnum,
 	SolidearthSettingsHorizEnum,
 	SolidearthSettingsMaxiterEnum,
@@ -398,15 +428,12 @@
 	StochasticForcingIsStochasticForcingEnum,
 	StochasticForcingIsWaterPressureEnum,
+	StochasticForcingNoisetermsEnum,
 	StochasticForcingNumFieldsEnum,
 	StochasticForcingRandomflagEnum,
-	RotationalPolarMoiEnum,
+	StochasticForcingTimestepEnum,
 	SolidearthSettingsReltolEnum,
-	SealevelchangeRequestedOutputsEnum,
 	SolidearthSettingsSelfAttractionEnum,
 	SolidearthSettingsRotationEnum,
 	SolidearthSettingsMaxSHCoeffEnum,
-	SealevelchangeRunCountEnum,
-	SealevelchangeTransitionsEnum,
-	SealevelchangeUViscoElasticEnum,
 	SettingsIoGatherEnum,
 	SettingsNumResultsOnNodesEnum,
@@ -433,4 +460,5 @@
 	SmbDpermilEnum,
 	SmbDsnowIdxEnum,
+   SmbElevationBinsEnum,
 	SmbCldFracEnum,
 	SmbDelta18oEnum,
@@ -460,9 +488,12 @@
 	SmbIsturbulentfluxEnum,
 	SmbKEnum,
+   SmbLapseRatesEnum,
 	SmbNumBasinsEnum,
+	SmbNumElevationBinsEnum,
 	SmbNumRequestedOutputsEnum,
 	SmbPfacEnum,
 	SmbPhiEnum,
 	SmbRdlEnum,
+	SmbRefElevationEnum,
 	SmbRequestedOutputsEnum,
 	SmbRlapsEnum,
@@ -534,5 +565,5 @@
 	TransientIsgroundinglineEnum,
 	TransientIshydrologyEnum,
-	TransientIsmasstransportEnum, 
+	TransientIsmasstransportEnum,
 	TransientIsoceantransportEnum,
 	TransientIsmovingfrontEnum,
@@ -575,8 +606,16 @@
 	BalancethicknessThickeningRateEnum,
 	BasalCrevasseEnum,
+	BasalforcingsDeepwaterMeltingRateAutoregressionEnum,
+	BasalforcingsDeepwaterMeltingRateNoiseEnum,
+	BasalforcingsDeepwaterMeltingRateValuesAutoregressionEnum,
 	BasalforcingsFloatingiceMeltingRateEnum,
 	BasalforcingsGeothermalfluxEnum,
 	BasalforcingsGroundediceMeltingRateEnum,
+	BasalforcingsLinearBasinIdEnum,
 	BasalforcingsPerturbationMeltingRateEnum,
+	BasalforcingsSpatialDeepwaterElevationEnum,
+	BasalforcingsSpatialDeepwaterMeltingRateEnum,
+	BasalforcingsSpatialUpperwaterElevationEnum,
+	BasalforcingsSpatialUpperwaterMeltingRateEnum,
 	BasalforcingsIsmip6BasinIdEnum,
 	BasalforcingsIsmip6TfEnum,
@@ -600,6 +639,8 @@
 	BaseSlopeYEnum,
 	BaselineBasalforcingsFloatingiceMeltingRateEnum,
+	BaselineBasalforcingsSpatialDeepwaterMeltingRateEnum,
 	BaselineCalvingCalvingrateEnum,
 	BaselineFrictionEffectivePressureEnum,
+	BaselineSmbMassBalanceEnum,
 	BedEnum,
 	BedGRDEnum,
@@ -614,11 +655,10 @@
 	CalvingCalvingrateEnum,
 	CalvingHabFractionEnum,
+	CalvingAblationrateEnum,
 	CalvingMeltingrateEnum,
 	CalvingStressThresholdFloatingiceEnum,
 	CalvingStressThresholdGroundediceEnum,
 	CalvinglevermannCoeffEnum,
-	CalvingratexAverageEnum,
 	CalvingratexEnum,
-	CalvingrateyAverageEnum,
 	CalvingrateyEnum,
 	CalvingFluxLevelsetEnum,
@@ -799,6 +839,10 @@
 	RheologyBbarAbsGradientEnum,
 	SampleEnum,
+	SampleOldEnum,
+	SampleNoiseEnum,
 	SamplingBetaEnum,
 	SamplingKappaEnum,
+	SamplingPhiEnum,
+	SamplingTauEnum,
 	SealevelEnum,
 	SealevelGRDEnum,
@@ -835,16 +879,4 @@
 	BslcRateEnum,
 	GmtslcEnum,
-	SealevelGrotm1Enum,
-	SealevelGrotm2Enum,
-	SealevelGrotm3Enum,
-	SealevelGUrotm1Enum,
-	SealevelGUrotm2Enum,
-	SealevelGUrotm3Enum,
-	SealevelGNrotm1Enum,
-	SealevelGNrotm2Enum,
-	SealevelGNrotm3Enum,
-	SealevelGErotm1Enum,
-	SealevelGErotm2Enum,
-	SealevelGErotm3Enum,
 	SealevelRSLBarystaticEnum,
 	SealevelRSLRateEnum,
@@ -858,4 +890,8 @@
 	SealevelchangeGEEnum,
 	SealevelchangeGNEnum,
+	SealevelchangeGrotEnum,
+	SealevelchangeGUrotEnum,
+	SealevelchangeGNrotEnum,
+	SealevelchangeGErotEnum,
 	SealevelchangeGsubelOceanEnum,
 	SealevelchangeGUsubelOceanEnum,
@@ -1036,5 +1072,5 @@
 	TemperatureSEMICEnum,
    ThermalforcingAutoregressionNoiseEnum,
-	ThermalforcingValuesAutoregressionEnum,	
+	ThermalforcingValuesAutoregressionEnum,
 	ThermalSpctemperatureEnum,
 	ThicknessAbsGradientEnum,
@@ -1194,4 +1230,5 @@
 	ArrheniusEnum,
 	AutodiffJacobianEnum,
+	AutoregressionLinearFloatingMeltRateEnum,
 	Balancethickness2AnalysisEnum,
 	Balancethickness2SolutionEnum,
@@ -1217,4 +1254,6 @@
 	CalvingHabEnum,
 	CalvingLevermannEnum,
+	CalvingTestEnum,
+	CalvingParameterizationEnum,
 	CalvingVonmisesEnum,
 	CfdragcoeffabsgradEnum,
@@ -1345,5 +1384,5 @@
 	JEnum,
 	L1L2ApproximationEnum,
-	MLHOApproximationEnum,
+	MOLHOApproximationEnum,
 	L2ProjectionBaseAnalysisEnum,
 	L2ProjectionEPLAnalysisEnum,
@@ -1357,12 +1396,17 @@
 	LoadsEnum,
 	LoveAnalysisEnum,
-	LoveHiEnum,
-	LoveHrEnum,
+	LoveHfEnum,
+	LoveHtEnum,
 	LoveKernelsImagEnum,
 	LoveKernelsRealEnum,
-	LoveKiEnum,
-	LoveKrEnum,
-	LoveLiEnum,
-	LoveLrEnum,
+	LoveKfEnum,
+	LoveKtEnum,
+	LoveLfEnum,
+	LoveLtEnum,
+	LoveTidalHtEnum,
+	LoveTidalKtEnum,
+	LoveTidalLtEnum,
+	LovePMTF1tEnum,
+	LovePMTF2tEnum,
 	LoveSolutionEnum,
 	MINIEnum,
@@ -1476,7 +1520,7 @@
 	SealevelAbsoluteEnum,
 	SealevelEmotionEnum,
-	SealevelInertiaTensorXZEnum,
-	SealevelInertiaTensorYZEnum,
-	SealevelInertiaTensorZZEnum,
+	SealevelchangePolarMotionXEnum,
+	SealevelchangePolarMotionYEnum,
+	SealevelchangePolarMotionZEnum,
 	SealevelchangePolarMotionEnum,
 	SealevelNmotionEnum,
Index: /issm/trunk/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk/src/c/shared/Enum/EnumToStringx.cpp	(revision 27034)
+++ /issm/trunk/src/c/shared/Enum/EnumToStringx.cpp	(revision 27035)
@@ -66,4 +66,9 @@
 		case BalancethicknessStabilizationEnum : return "BalancethicknessStabilization";
 		case BarystaticContributionsEnum : return "BarystaticContributions";
+		case BasalforcingsAutoregressionInitialTimeEnum : return "BasalforcingsAutoregressionInitialTime";
+		case BasalforcingsAutoregressionTimestepEnum : return "BasalforcingsAutoregressionTimestep";
+		case BasalforcingsAutoregressiveOrderEnum : return "BasalforcingsAutoregressiveOrder";
+		case BasalforcingsBeta0Enum : return "BasalforcingsBeta0";
+		case BasalforcingsBeta1Enum : return "BasalforcingsBeta1";
 		case BasalforcingsBottomplumedepthEnum : return "BasalforcingsBottomplumedepth";
 		case BasalforcingsCrustthicknessEnum : return "BasalforcingsCrustthickness";
@@ -79,7 +84,9 @@
 		case BasalforcingsIsmip6NumBasinsEnum : return "BasalforcingsIsmip6NumBasins";
 		case BasalforcingsIsmip6TfDepthsEnum : return "BasalforcingsIsmip6TfDepths";
+		case BasalforcingsLinearNumBasinsEnum : return "BasalforcingsLinearNumBasins";
 		case BasalforcingsLowercrustheatEnum : return "BasalforcingsLowercrustheat";
 		case BasalforcingsMantleconductivityEnum : return "BasalforcingsMantleconductivity";
 		case BasalforcingsNusseltEnum : return "BasalforcingsNusselt";
+		case BasalforcingsPhiEnum : return "BasalforcingsPhi";
 		case BasalforcingsPicoAverageOverturningEnum : return "BasalforcingsPicoAverageOverturning";
 		case BasalforcingsPicoAverageSalinityEnum : return "BasalforcingsPicoAverageSalinity";
@@ -107,4 +114,11 @@
 		case CalvingLawEnum : return "CalvingLaw";
 		case CalvingMinthicknessEnum : return "CalvingMinthickness";
+		case CalvingTestSpeedfactorEnum : return "CalvingTestSpeedfactor";
+		case CalvingTestIndependentRateEnum : return "CalvingTestIndependentRate";
+		case CalvingUseParamEnum : return "CalvingUseParam";
+		case CalvingScaleThetaEnum : return "CalvingScaleTheta";
+		case CalvingAmpAlphaEnum : return "CalvingAmpAlpha";
+		case CalvingMidpointEnum : return "CalvingMidpoint";
+		case CalvingNonlinearLawEnum : return "CalvingNonlinearLaw";
 		case ConfigurationTypeEnum : return "ConfigurationType";
 		case ConstantsGEnum : return "ConstantsG";
@@ -164,5 +178,5 @@
 		case FlowequationIsHOEnum : return "FlowequationIsHO";
 		case FlowequationIsL1L2Enum : return "FlowequationIsL1L2";
-		case FlowequationIsMLHOEnum : return "FlowequationIsMLHO";
+		case FlowequationIsMOLHOEnum : return "FlowequationIsMOLHO";
 		case FlowequationIsSIAEnum : return "FlowequationIsSIA";
 		case FlowequationIsSSAEnum : return "FlowequationIsSSA";
@@ -191,4 +205,6 @@
 		case GroundinglineMeltInterpolationEnum : return "GroundinglineMeltInterpolation";
 		case GroundinglineMigrationEnum : return "GroundinglineMigration";
+		case GroundinglineNumRequestedOutputsEnum : return "GroundinglineNumRequestedOutputs";
+		case GroundinglineRequestedOutputsEnum : return "GroundinglineRequestedOutputs";
 		case HydrologyAveragingEnum : return "HydrologyAveraging";
 		case HydrologyCavitySpacingEnum : return "HydrologyCavitySpacing";
@@ -265,4 +281,5 @@
 		case LockFileNameEnum : return "LockFileName";
 		case LoveAllowLayerDeletionEnum : return "LoveAllowLayerDeletion";
+		case LoveChandlerWobbleEnum : return "LoveChandlerWobble";
 		case LoveCoreMantleBoundaryEnum : return "LoveCoreMantleBoundary";
 		case LoveEarthMassEnum : return "LoveEarthMass";
@@ -285,4 +302,5 @@
 		case LoveStartingLayerEnum : return "LoveStartingLayer";
 		case LoveUnderflowTolEnum : return "LoveUnderflowTol";
+		case LovePostWidderThresholdEnum : return "LovePostWidderThreshold";
 		case MassFluxSegmentsEnum : return "MassFluxSegments";
 		case MassFluxSegmentsPresentEnum : return "MassFluxSegmentsPresent";
@@ -354,10 +372,8 @@
 		case ModelnameEnum : return "Modelname";
 		case SamplingAlphaEnum : return "SamplingAlpha";
-		case SamplingPhiEnum : return "SamplingPhi";
 		case SamplingNumRequestedOutputsEnum : return "SamplingNumRequestedOutputs";
 		case SamplingRequestedOutputsEnum : return "SamplingRequestedOutputs";
 		case SamplingRobinEnum : return "SamplingRobin";
 		case SamplingSeedEnum : return "SamplingSeed";
-		case SamplingTauEnum : return "SamplingTau";
 		case SaveResultsEnum : return "SaveResults";
 		case SolidearthPartitionIceEnum : return "SolidearthPartitionIce";
@@ -371,5 +387,4 @@
 		case SolidearthSettingsAbstolEnum : return "SolidearthSettingsAbstol";
 		case SolidearthSettingsCrossSectionShapeEnum : return "SolidearthSettingsCrossSectionShape";
-		case RotationalAngularVelocityEnum : return "RotationalAngularVelocity";
 		case SolidearthSettingsElasticEnum : return "SolidearthSettingsElastic";
 		case SolidearthSettingsViscousEnum : return "SolidearthSettingsViscous";
@@ -378,5 +393,13 @@
 		case SealevelchangeViscousTimesEnum : return "SealevelchangeViscousTimes";
 		case SealevelchangeViscousIndexEnum : return "SealevelchangeViscousIndex";
+		case SealevelchangeViscousPolarMotionEnum : return "SealevelchangeViscousPolarMotion";
+		case SealevelchangeRunCountEnum : return "SealevelchangeRunCount";
+		case SealevelchangeTransitionsEnum : return "SealevelchangeTransitions";
+		case SealevelchangeRequestedOutputsEnum : return "SealevelchangeRequestedOutputs";
+		case RotationalAngularVelocityEnum : return "RotationalAngularVelocity";
 		case RotationalEquatorialMoiEnum : return "RotationalEquatorialMoi";
+		case RotationalPolarMoiEnum : return "RotationalPolarMoi";
+		case LovePolarMotionTransferFunctionColinearEnum : return "LovePolarMotionTransferFunctionColinear";
+		case LovePolarMotionTransferFunctionOrthogonalEnum : return "LovePolarMotionTransferFunctionOrthogonal";
 		case TidalLoveHEnum : return "TidalLoveH";
 		case TidalLoveKEnum : return "TidalLoveK";
@@ -390,9 +413,16 @@
 		case SealevelchangeGSelfAttractionEnum : return "SealevelchangeGSelfAttraction";
 		case SealevelchangeGViscoElasticEnum : return "SealevelchangeGViscoElastic";
+		case SealevelchangeUViscoElasticEnum : return "SealevelchangeUViscoElastic";
+		case SealevelchangeHViscoElasticEnum : return "SealevelchangeHViscoElastic";
+		case SealevelchangePolarMotionTransferFunctionColinearEnum : return "SealevelchangePolarMotionTransferFunctionColinear";
+		case SealevelchangePolarMotionTransferFunctionOrthogonalEnum : return "SealevelchangePolarMotionTransferFunctionOrthogonal";
+		case SealevelchangePolarMotionTransferFunctionZEnum : return "SealevelchangePolarMotionTransferFunctionZ";
+		case SealevelchangeTidalK2Enum : return "SealevelchangeTidalK2";
+		case SealevelchangeTidalH2Enum : return "SealevelchangeTidalH2";
+		case SealevelchangeTidalL2Enum : return "SealevelchangeTidalL2";
 		case SolidearthSettingsSealevelLoadingEnum : return "SolidearthSettingsSealevelLoading";
 		case SolidearthSettingsGRDEnum : return "SolidearthSettingsGRD";
 		case SolidearthSettingsRunFrequencyEnum : return "SolidearthSettingsRunFrequency";
 		case SolidearthSettingsTimeAccEnum : return "SolidearthSettingsTimeAcc";
-		case SealevelchangeHViscoElasticEnum : return "SealevelchangeHViscoElastic";
 		case SolidearthSettingsHorizEnum : return "SolidearthSettingsHoriz";
 		case SolidearthSettingsMaxiterEnum : return "SolidearthSettingsMaxiter";
@@ -406,15 +436,12 @@
 		case StochasticForcingIsStochasticForcingEnum : return "StochasticForcingIsStochasticForcing";
 		case StochasticForcingIsWaterPressureEnum : return "StochasticForcingIsWaterPressure";
+		case StochasticForcingNoisetermsEnum : return "StochasticForcingNoiseterms";
 		case StochasticForcingNumFieldsEnum : return "StochasticForcingNumFields";
 		case StochasticForcingRandomflagEnum : return "StochasticForcingRandomflag";
-		case RotationalPolarMoiEnum : return "RotationalPolarMoi";
+		case StochasticForcingTimestepEnum : return "StochasticForcingTimestep";
 		case SolidearthSettingsReltolEnum : return "SolidearthSettingsReltol";
-		case SealevelchangeRequestedOutputsEnum : return "SealevelchangeRequestedOutputs";
 		case SolidearthSettingsSelfAttractionEnum : return "SolidearthSettingsSelfAttraction";
 		case SolidearthSettingsRotationEnum : return "SolidearthSettingsRotation";
 		case SolidearthSettingsMaxSHCoeffEnum : return "SolidearthSettingsMaxSHCoeff";
-		case SealevelchangeRunCountEnum : return "SealevelchangeRunCount";
-		case SealevelchangeTransitionsEnum : return "SealevelchangeTransitions";
-		case SealevelchangeUViscoElasticEnum : return "SealevelchangeUViscoElastic";
 		case SettingsIoGatherEnum : return "SettingsIoGather";
 		case SettingsNumResultsOnNodesEnum : return "SettingsNumResultsOnNodes";
@@ -441,4 +468,5 @@
 		case SmbDpermilEnum : return "SmbDpermil";
 		case SmbDsnowIdxEnum : return "SmbDsnowIdx";
+		case SmbElevationBinsEnum : return "SmbElevationBins";
 		case SmbCldFracEnum : return "SmbCldFrac";
 		case SmbDelta18oEnum : return "SmbDelta18o";
@@ -468,9 +496,12 @@
 		case SmbIsturbulentfluxEnum : return "SmbIsturbulentflux";
 		case SmbKEnum : return "SmbK";
+		case SmbLapseRatesEnum : return "SmbLapseRates";
 		case SmbNumBasinsEnum : return "SmbNumBasins";
+		case SmbNumElevationBinsEnum : return "SmbNumElevationBins";
 		case SmbNumRequestedOutputsEnum : return "SmbNumRequestedOutputs";
 		case SmbPfacEnum : return "SmbPfac";
 		case SmbPhiEnum : return "SmbPhi";
 		case SmbRdlEnum : return "SmbRdl";
+		case SmbRefElevationEnum : return "SmbRefElevation";
 		case SmbRequestedOutputsEnum : return "SmbRequestedOutputs";
 		case SmbRlapsEnum : return "SmbRlaps";
@@ -581,8 +612,16 @@
 		case BalancethicknessThickeningRateEnum : return "BalancethicknessThickeningRate";
 		case BasalCrevasseEnum : return "BasalCrevasse";
+		case BasalforcingsDeepwaterMeltingRateAutoregressionEnum : return "BasalforcingsDeepwaterMeltingRateAutoregression";
+		case BasalforcingsDeepwaterMeltingRateNoiseEnum : return "BasalforcingsDeepwaterMeltingRateNoise";
+		case BasalforcingsDeepwaterMeltingRateValuesAutoregressionEnum : return "BasalforcingsDeepwaterMeltingRateValuesAutoregression";
 		case BasalforcingsFloatingiceMeltingRateEnum : return "BasalforcingsFloatingiceMeltingRate";
 		case BasalforcingsGeothermalfluxEnum : return "BasalforcingsGeothermalflux";
 		case BasalforcingsGroundediceMeltingRateEnum : return "BasalforcingsGroundediceMeltingRate";
+		case BasalforcingsLinearBasinIdEnum : return "BasalforcingsLinearBasinId";
 		case BasalforcingsPerturbationMeltingRateEnum : return "BasalforcingsPerturbationMeltingRate";
+		case BasalforcingsSpatialDeepwaterElevationEnum : return "BasalforcingsSpatialDeepwaterElevation";
+		case BasalforcingsSpatialDeepwaterMeltingRateEnum : return "BasalforcingsSpatialDeepwaterMeltingRate";
+		case BasalforcingsSpatialUpperwaterElevationEnum : return "BasalforcingsSpatialUpperwaterElevation";
+		case BasalforcingsSpatialUpperwaterMeltingRateEnum : return "BasalforcingsSpatialUpperwaterMeltingRate";
 		case BasalforcingsIsmip6BasinIdEnum : return "BasalforcingsIsmip6BasinId";
 		case BasalforcingsIsmip6TfEnum : return "BasalforcingsIsmip6Tf";
@@ -606,6 +645,8 @@
 		case BaseSlopeYEnum : return "BaseSlopeY";
 		case BaselineBasalforcingsFloatingiceMeltingRateEnum : return "BaselineBasalforcingsFloatingiceMeltingRate";
+		case BaselineBasalforcingsSpatialDeepwaterMeltingRateEnum : return "BaselineBasalforcingsSpatialDeepwaterMeltingRate";
 		case BaselineCalvingCalvingrateEnum : return "BaselineCalvingCalvingrate";
 		case BaselineFrictionEffectivePressureEnum : return "BaselineFrictionEffectivePressure";
+		case BaselineSmbMassBalanceEnum : return "BaselineSmbMassBalance";
 		case BedEnum : return "Bed";
 		case BedGRDEnum : return "BedGRD";
@@ -620,11 +661,10 @@
 		case CalvingCalvingrateEnum : return "CalvingCalvingrate";
 		case CalvingHabFractionEnum : return "CalvingHabFraction";
+		case CalvingAblationrateEnum : return "CalvingAblationrate";
 		case CalvingMeltingrateEnum : return "CalvingMeltingrate";
 		case CalvingStressThresholdFloatingiceEnum : return "CalvingStressThresholdFloatingice";
 		case CalvingStressThresholdGroundediceEnum : return "CalvingStressThresholdGroundedice";
 		case CalvinglevermannCoeffEnum : return "CalvinglevermannCoeff";
-		case CalvingratexAverageEnum : return "CalvingratexAverage";
 		case CalvingratexEnum : return "Calvingratex";
-		case CalvingrateyAverageEnum : return "CalvingrateyAverage";
 		case CalvingrateyEnum : return "Calvingratey";
 		case CalvingFluxLevelsetEnum : return "CalvingFluxLevelset";
@@ -805,6 +845,10 @@
 		case RheologyBbarAbsGradientEnum : return "RheologyBbarAbsGradient";
 		case SampleEnum : return "Sample";
+		case SampleOldEnum : return "SampleOld";
+		case SampleNoiseEnum : return "SampleNoise";
 		case SamplingBetaEnum : return "SamplingBeta";
 		case SamplingKappaEnum : return "SamplingKappa";
+		case SamplingPhiEnum : return "SamplingPhi";
+		case SamplingTauEnum : return "SamplingTau";
 		case SealevelEnum : return "Sealevel";
 		case SealevelGRDEnum : return "SealevelGRD";
@@ -841,16 +885,4 @@
 		case BslcRateEnum : return "BslcRate";
 		case GmtslcEnum : return "Gmtslc";
-		case SealevelGrotm1Enum : return "SealevelGrotm1";
-		case SealevelGrotm2Enum : return "SealevelGrotm2";
-		case SealevelGrotm3Enum : return "SealevelGrotm3";
-		case SealevelGUrotm1Enum : return "SealevelGUrotm1";
-		case SealevelGUrotm2Enum : return "SealevelGUrotm2";
-		case SealevelGUrotm3Enum : return "SealevelGUrotm3";
-		case SealevelGNrotm1Enum : return "SealevelGNrotm1";
-		case SealevelGNrotm2Enum : return "SealevelGNrotm2";
-		case SealevelGNrotm3Enum : return "SealevelGNrotm3";
-		case SealevelGErotm1Enum : return "SealevelGErotm1";
-		case SealevelGErotm2Enum : return "SealevelGErotm2";
-		case SealevelGErotm3Enum : return "SealevelGErotm3";
 		case SealevelRSLBarystaticEnum : return "SealevelRSLBarystatic";
 		case SealevelRSLRateEnum : return "SealevelRSLRate";
@@ -864,4 +896,8 @@
 		case SealevelchangeGEEnum : return "SealevelchangeGE";
 		case SealevelchangeGNEnum : return "SealevelchangeGN";
+		case SealevelchangeGrotEnum : return "SealevelchangeGrot";
+		case SealevelchangeGUrotEnum : return "SealevelchangeGUrot";
+		case SealevelchangeGNrotEnum : return "SealevelchangeGNrot";
+		case SealevelchangeGErotEnum : return "SealevelchangeGErot";
 		case SealevelchangeGsubelOceanEnum : return "SealevelchangeGsubelOcean";
 		case SealevelchangeGUsubelOceanEnum : return "SealevelchangeGUsubelOcean";
@@ -1197,4 +1233,5 @@
 		case ArrheniusEnum : return "Arrhenius";
 		case AutodiffJacobianEnum : return "AutodiffJacobian";
+		case AutoregressionLinearFloatingMeltRateEnum : return "AutoregressionLinearFloatingMeltRate";
 		case Balancethickness2AnalysisEnum : return "Balancethickness2Analysis";
 		case Balancethickness2SolutionEnum : return "Balancethickness2Solution";
@@ -1220,4 +1257,6 @@
 		case CalvingHabEnum : return "CalvingHab";
 		case CalvingLevermannEnum : return "CalvingLevermann";
+		case CalvingTestEnum : return "CalvingTest";
+		case CalvingParameterizationEnum : return "CalvingParameterization";
 		case CalvingVonmisesEnum : return "CalvingVonmises";
 		case CfdragcoeffabsgradEnum : return "Cfdragcoeffabsgrad";
@@ -1348,5 +1387,5 @@
 		case JEnum : return "J";
 		case L1L2ApproximationEnum : return "L1L2Approximation";
-		case MLHOApproximationEnum : return "MLHOApproximation";
+		case MOLHOApproximationEnum : return "MOLHOApproximation";
 		case L2ProjectionBaseAnalysisEnum : return "L2ProjectionBaseAnalysis";
 		case L2ProjectionEPLAnalysisEnum : return "L2ProjectionEPLAnalysis";
@@ -1360,12 +1399,17 @@
 		case LoadsEnum : return "Loads";
 		case LoveAnalysisEnum : return "LoveAnalysis";
-		case LoveHiEnum : return "LoveHi";
-		case LoveHrEnum : return "LoveHr";
+		case LoveHfEnum : return "LoveHf";
+		case LoveHtEnum : return "LoveHt";
 		case LoveKernelsImagEnum : return "LoveKernelsImag";
 		case LoveKernelsRealEnum : return "LoveKernelsReal";
-		case LoveKiEnum : return "LoveKi";
-		case LoveKrEnum : return "LoveKr";
-		case LoveLiEnum : return "LoveLi";
-		case LoveLrEnum : return "LoveLr";
+		case LoveKfEnum : return "LoveKf";
+		case LoveKtEnum : return "LoveKt";
+		case LoveLfEnum : return "LoveLf";
+		case LoveLtEnum : return "LoveLt";
+		case LoveTidalHtEnum : return "LoveTidalHt";
+		case LoveTidalKtEnum : return "LoveTidalKt";
+		case LoveTidalLtEnum : return "LoveTidalLt";
+		case LovePMTF1tEnum : return "LovePMTF1t";
+		case LovePMTF2tEnum : return "LovePMTF2t";
 		case LoveSolutionEnum : return "LoveSolution";
 		case MINIEnum : return "MINI";
@@ -1479,7 +1523,7 @@
 		case SealevelAbsoluteEnum : return "SealevelAbsolute";
 		case SealevelEmotionEnum : return "SealevelEmotion";
-		case SealevelInertiaTensorXZEnum : return "SealevelInertiaTensorXZ";
-		case SealevelInertiaTensorYZEnum : return "SealevelInertiaTensorYZ";
-		case SealevelInertiaTensorZZEnum : return "SealevelInertiaTensorZZ";
+		case SealevelchangePolarMotionXEnum : return "SealevelchangePolarMotionX";
+		case SealevelchangePolarMotionYEnum : return "SealevelchangePolarMotionY";
+		case SealevelchangePolarMotionZEnum : return "SealevelchangePolarMotionZ";
 		case SealevelchangePolarMotionEnum : return "SealevelchangePolarMotion";
 		case SealevelNmotionEnum : return "SealevelNmotion";
Index: /issm/trunk/src/c/shared/Enum/Enumjl.vim
===================================================================
--- /issm/trunk/src/c/shared/Enum/Enumjl.vim	(revision 27034)
+++ /issm/trunk/src/c/shared/Enum/Enumjl.vim	(revision 27035)
@@ -57,4 +57,9 @@
 syn keyword juliaConstC BalancethicknessStabilizationEnum
 syn keyword juliaConstC BarystaticContributionsEnum
+syn keyword juliaConstC BasalforcingsAutoregressionInitialTimeEnum
+syn keyword juliaConstC BasalforcingsAutoregressionTimestepEnum
+syn keyword juliaConstC BasalforcingsAutoregressiveOrderEnum
+syn keyword juliaConstC BasalforcingsBeta0Enum
+syn keyword juliaConstC BasalforcingsBeta1Enum
 syn keyword juliaConstC BasalforcingsBottomplumedepthEnum
 syn keyword juliaConstC BasalforcingsCrustthicknessEnum
@@ -70,7 +75,9 @@
 syn keyword juliaConstC BasalforcingsIsmip6NumBasinsEnum
 syn keyword juliaConstC BasalforcingsIsmip6TfDepthsEnum
+syn keyword juliaConstC BasalforcingsLinearNumBasinsEnum
 syn keyword juliaConstC BasalforcingsLowercrustheatEnum
 syn keyword juliaConstC BasalforcingsMantleconductivityEnum
 syn keyword juliaConstC BasalforcingsNusseltEnum
+syn keyword juliaConstC BasalforcingsPhiEnum
 syn keyword juliaConstC BasalforcingsPicoAverageOverturningEnum
 syn keyword juliaConstC BasalforcingsPicoAverageSalinityEnum
@@ -98,4 +105,11 @@
 syn keyword juliaConstC CalvingLawEnum
 syn keyword juliaConstC CalvingMinthicknessEnum
+syn keyword juliaConstC CalvingTestSpeedfactorEnum
+syn keyword juliaConstC CalvingTestIndependentRateEnum
+syn keyword juliaConstC CalvingUseParamEnum
+syn keyword juliaConstC CalvingScaleThetaEnum
+syn keyword juliaConstC CalvingAmpAlphaEnum
+syn keyword juliaConstC CalvingMidpointEnum
+syn keyword juliaConstC CalvingNonlinearLawEnum
 syn keyword juliaConstC ConfigurationTypeEnum
 syn keyword juliaConstC ConstantsGEnum
@@ -155,5 +169,5 @@
 syn keyword juliaConstC FlowequationIsHOEnum
 syn keyword juliaConstC FlowequationIsL1L2Enum
-syn keyword juliaConstC FlowequationIsMLHOEnum
+syn keyword juliaConstC FlowequationIsMOLHOEnum
 syn keyword juliaConstC FlowequationIsSIAEnum
 syn keyword juliaConstC FlowequationIsSSAEnum
@@ -182,4 +196,6 @@
 syn keyword juliaConstC GroundinglineMeltInterpolationEnum
 syn keyword juliaConstC GroundinglineMigrationEnum
+syn keyword juliaConstC GroundinglineNumRequestedOutputsEnum
+syn keyword juliaConstC GroundinglineRequestedOutputsEnum
 syn keyword juliaConstC HydrologyAveragingEnum
 syn keyword juliaConstC HydrologyCavitySpacingEnum
@@ -256,4 +272,5 @@
 syn keyword juliaConstC LockFileNameEnum
 syn keyword juliaConstC LoveAllowLayerDeletionEnum
+syn keyword juliaConstC LoveChandlerWobbleEnum
 syn keyword juliaConstC LoveCoreMantleBoundaryEnum
 syn keyword juliaConstC LoveEarthMassEnum
@@ -276,4 +293,5 @@
 syn keyword juliaConstC LoveStartingLayerEnum
 syn keyword juliaConstC LoveUnderflowTolEnum
+syn keyword juliaConstC LovePostWidderThresholdEnum
 syn keyword juliaConstC MassFluxSegmentsEnum
 syn keyword juliaConstC MassFluxSegmentsPresentEnum
@@ -345,10 +363,8 @@
 syn keyword juliaConstC ModelnameEnum
 syn keyword juliaConstC SamplingAlphaEnum
-syn keyword juliaConstC SamplingPhiEnum
 syn keyword juliaConstC SamplingNumRequestedOutputsEnum
 syn keyword juliaConstC SamplingRequestedOutputsEnum
 syn keyword juliaConstC SamplingRobinEnum
 syn keyword juliaConstC SamplingSeedEnum
-syn keyword juliaConstC SamplingTauEnum
 syn keyword juliaConstC SaveResultsEnum
 syn keyword juliaConstC SolidearthPartitionIceEnum
@@ -362,5 +378,4 @@
 syn keyword juliaConstC SolidearthSettingsAbstolEnum
 syn keyword juliaConstC SolidearthSettingsCrossSectionShapeEnum
-syn keyword juliaConstC RotationalAngularVelocityEnum
 syn keyword juliaConstC SolidearthSettingsElasticEnum
 syn keyword juliaConstC SolidearthSettingsViscousEnum
@@ -369,5 +384,13 @@
 syn keyword juliaConstC SealevelchangeViscousTimesEnum
 syn keyword juliaConstC SealevelchangeViscousIndexEnum
+syn keyword juliaConstC SealevelchangeViscousPolarMotionEnum
+syn keyword juliaConstC SealevelchangeRunCountEnum
+syn keyword juliaConstC SealevelchangeTransitionsEnum
+syn keyword juliaConstC SealevelchangeRequestedOutputsEnum
+syn keyword juliaConstC RotationalAngularVelocityEnum
 syn keyword juliaConstC RotationalEquatorialMoiEnum
+syn keyword juliaConstC RotationalPolarMoiEnum
+syn keyword juliaConstC LovePolarMotionTransferFunctionColinearEnum
+syn keyword juliaConstC LovePolarMotionTransferFunctionOrthogonalEnum
 syn keyword juliaConstC TidalLoveHEnum
 syn keyword juliaConstC TidalLoveKEnum
@@ -381,9 +404,16 @@
 syn keyword juliaConstC SealevelchangeGSelfAttractionEnum
 syn keyword juliaConstC SealevelchangeGViscoElasticEnum
+syn keyword juliaConstC SealevelchangeUViscoElasticEnum
+syn keyword juliaConstC SealevelchangeHViscoElasticEnum
+syn keyword juliaConstC SealevelchangePolarMotionTransferFunctionColinearEnum
+syn keyword juliaConstC SealevelchangePolarMotionTransferFunctionOrthogonalEnum
+syn keyword juliaConstC SealevelchangePolarMotionTransferFunctionZEnum
+syn keyword juliaConstC SealevelchangeTidalK2Enum
+syn keyword juliaConstC SealevelchangeTidalH2Enum
+syn keyword juliaConstC SealevelchangeTidalL2Enum
 syn keyword juliaConstC SolidearthSettingsSealevelLoadingEnum
 syn keyword juliaConstC SolidearthSettingsGRDEnum
 syn keyword juliaConstC SolidearthSettingsRunFrequencyEnum
 syn keyword juliaConstC SolidearthSettingsTimeAccEnum
-syn keyword juliaConstC SealevelchangeHViscoElasticEnum
 syn keyword juliaConstC SolidearthSettingsHorizEnum
 syn keyword juliaConstC SolidearthSettingsMaxiterEnum
@@ -397,15 +427,12 @@
 syn keyword juliaConstC StochasticForcingIsStochasticForcingEnum
 syn keyword juliaConstC StochasticForcingIsWaterPressureEnum
+syn keyword juliaConstC StochasticForcingNoisetermsEnum
 syn keyword juliaConstC StochasticForcingNumFieldsEnum
 syn keyword juliaConstC StochasticForcingRandomflagEnum
-syn keyword juliaConstC RotationalPolarMoiEnum
+syn keyword juliaConstC StochasticForcingTimestepEnum
 syn keyword juliaConstC SolidearthSettingsReltolEnum
-syn keyword juliaConstC SealevelchangeRequestedOutputsEnum
 syn keyword juliaConstC SolidearthSettingsSelfAttractionEnum
 syn keyword juliaConstC SolidearthSettingsRotationEnum
 syn keyword juliaConstC SolidearthSettingsMaxSHCoeffEnum
-syn keyword juliaConstC SealevelchangeRunCountEnum
-syn keyword juliaConstC SealevelchangeTransitionsEnum
-syn keyword juliaConstC SealevelchangeUViscoElasticEnum
 syn keyword juliaConstC SettingsIoGatherEnum
 syn keyword juliaConstC SettingsNumResultsOnNodesEnum
@@ -432,4 +459,5 @@
 syn keyword juliaConstC SmbDpermilEnum
 syn keyword juliaConstC SmbDsnowIdxEnum
+syn keyword juliaConstC SmbElevationBinsEnum
 syn keyword juliaConstC SmbCldFracEnum
 syn keyword juliaConstC SmbDelta18oEnum
@@ -459,9 +487,12 @@
 syn keyword juliaConstC SmbIsturbulentfluxEnum
 syn keyword juliaConstC SmbKEnum
+syn keyword juliaConstC SmbLapseRatesEnum
 syn keyword juliaConstC SmbNumBasinsEnum
+syn keyword juliaConstC SmbNumElevationBinsEnum
 syn keyword juliaConstC SmbNumRequestedOutputsEnum
 syn keyword juliaConstC SmbPfacEnum
 syn keyword juliaConstC SmbPhiEnum
 syn keyword juliaConstC SmbRdlEnum
+syn keyword juliaConstC SmbRefElevationEnum
 syn keyword juliaConstC SmbRequestedOutputsEnum
 syn keyword juliaConstC SmbRlapsEnum
@@ -572,8 +603,16 @@
 syn keyword juliaConstC BalancethicknessThickeningRateEnum
 syn keyword juliaConstC BasalCrevasseEnum
+syn keyword juliaConstC BasalforcingsDeepwaterMeltingRateAutoregressionEnum
+syn keyword juliaConstC BasalforcingsDeepwaterMeltingRateNoiseEnum
+syn keyword juliaConstC BasalforcingsDeepwaterMeltingRateValuesAutoregressionEnum
 syn keyword juliaConstC BasalforcingsFloatingiceMeltingRateEnum
 syn keyword juliaConstC BasalforcingsGeothermalfluxEnum
 syn keyword juliaConstC BasalforcingsGroundediceMeltingRateEnum
+syn keyword juliaConstC BasalforcingsLinearBasinIdEnum
 syn keyword juliaConstC BasalforcingsPerturbationMeltingRateEnum
+syn keyword juliaConstC BasalforcingsSpatialDeepwaterElevationEnum
+syn keyword juliaConstC BasalforcingsSpatialDeepwaterMeltingRateEnum
+syn keyword juliaConstC BasalforcingsSpatialUpperwaterElevationEnum
+syn keyword juliaConstC BasalforcingsSpatialUpperwaterMeltingRateEnum
 syn keyword juliaConstC BasalforcingsIsmip6BasinIdEnum
 syn keyword juliaConstC BasalforcingsIsmip6TfEnum
@@ -597,6 +636,8 @@
 syn keyword juliaConstC BaseSlopeYEnum
 syn keyword juliaConstC BaselineBasalforcingsFloatingiceMeltingRateEnum
+syn keyword juliaConstC BaselineBasalforcingsSpatialDeepwaterMeltingRateEnum
 syn keyword juliaConstC BaselineCalvingCalvingrateEnum
 syn keyword juliaConstC BaselineFrictionEffectivePressureEnum
+syn keyword juliaConstC BaselineSmbMassBalanceEnum
 syn keyword juliaConstC BedEnum
 syn keyword juliaConstC BedGRDEnum
@@ -611,11 +652,10 @@
 syn keyword juliaConstC CalvingCalvingrateEnum
 syn keyword juliaConstC CalvingHabFractionEnum
+syn keyword juliaConstC CalvingAblationrateEnum
 syn keyword juliaConstC CalvingMeltingrateEnum
 syn keyword juliaConstC CalvingStressThresholdFloatingiceEnum
 syn keyword juliaConstC CalvingStressThresholdGroundediceEnum
 syn keyword juliaConstC CalvinglevermannCoeffEnum
-syn keyword juliaConstC CalvingratexAverageEnum
 syn keyword juliaConstC CalvingratexEnum
-syn keyword juliaConstC CalvingrateyAverageEnum
 syn keyword juliaConstC CalvingrateyEnum
 syn keyword juliaConstC CalvingFluxLevelsetEnum
@@ -796,6 +836,10 @@
 syn keyword juliaConstC RheologyBbarAbsGradientEnum
 syn keyword juliaConstC SampleEnum
+syn keyword juliaConstC SampleOldEnum
+syn keyword juliaConstC SampleNoiseEnum
 syn keyword juliaConstC SamplingBetaEnum
 syn keyword juliaConstC SamplingKappaEnum
+syn keyword juliaConstC SamplingPhiEnum
+syn keyword juliaConstC SamplingTauEnum
 syn keyword juliaConstC SealevelEnum
 syn keyword juliaConstC SealevelGRDEnum
@@ -832,16 +876,4 @@
 syn keyword juliaConstC BslcRateEnum
 syn keyword juliaConstC GmtslcEnum
-syn keyword juliaConstC SealevelGrotm1Enum
-syn keyword juliaConstC SealevelGrotm2Enum
-syn keyword juliaConstC SealevelGrotm3Enum
-syn keyword juliaConstC SealevelGUrotm1Enum
-syn keyword juliaConstC SealevelGUrotm2Enum
-syn keyword juliaConstC SealevelGUrotm3Enum
-syn keyword juliaConstC SealevelGNrotm1Enum
-syn keyword juliaConstC SealevelGNrotm2Enum
-syn keyword juliaConstC SealevelGNrotm3Enum
-syn keyword juliaConstC SealevelGErotm1Enum
-syn keyword juliaConstC SealevelGErotm2Enum
-syn keyword juliaConstC SealevelGErotm3Enum
 syn keyword juliaConstC SealevelRSLBarystaticEnum
 syn keyword juliaConstC SealevelRSLRateEnum
@@ -855,4 +887,8 @@
 syn keyword juliaConstC SealevelchangeGEEnum
 syn keyword juliaConstC SealevelchangeGNEnum
+syn keyword juliaConstC SealevelchangeGrotEnum
+syn keyword juliaConstC SealevelchangeGUrotEnum
+syn keyword juliaConstC SealevelchangeGNrotEnum
+syn keyword juliaConstC SealevelchangeGErotEnum
 syn keyword juliaConstC SealevelchangeGsubelOceanEnum
 syn keyword juliaConstC SealevelchangeGUsubelOceanEnum
@@ -1188,4 +1224,5 @@
 syn keyword juliaConstC ArrheniusEnum
 syn keyword juliaConstC AutodiffJacobianEnum
+syn keyword juliaConstC AutoregressionLinearFloatingMeltRateEnum
 syn keyword juliaConstC Balancethickness2AnalysisEnum
 syn keyword juliaConstC Balancethickness2SolutionEnum
@@ -1211,4 +1248,6 @@
 syn keyword juliaConstC CalvingHabEnum
 syn keyword juliaConstC CalvingLevermannEnum
+syn keyword juliaConstC CalvingTestEnum
+syn keyword juliaConstC CalvingParameterizationEnum
 syn keyword juliaConstC CalvingVonmisesEnum
 syn keyword juliaConstC CfdragcoeffabsgradEnum
@@ -1339,5 +1378,5 @@
 syn keyword juliaConstC JEnum
 syn keyword juliaConstC L1L2ApproximationEnum
-syn keyword juliaConstC MLHOApproximationEnum
+syn keyword juliaConstC MOLHOApproximationEnum
 syn keyword juliaConstC L2ProjectionBaseAnalysisEnum
 syn keyword juliaConstC L2ProjectionEPLAnalysisEnum
@@ -1351,12 +1390,17 @@
 syn keyword juliaConstC LoadsEnum
 syn keyword juliaConstC LoveAnalysisEnum
-syn keyword juliaConstC LoveHiEnum
-syn keyword juliaConstC LoveHrEnum
+syn keyword juliaConstC LoveHfEnum
+syn keyword juliaConstC LoveHtEnum
 syn keyword juliaConstC LoveKernelsImagEnum
 syn keyword juliaConstC LoveKernelsRealEnum
-syn keyword juliaConstC LoveKiEnum
-syn keyword juliaConstC LoveKrEnum
-syn keyword juliaConstC LoveLiEnum
-syn keyword juliaConstC LoveLrEnum
+syn keyword juliaConstC LoveKfEnum
+syn keyword juliaConstC LoveKtEnum
+syn keyword juliaConstC LoveLfEnum
+syn keyword juliaConstC LoveLtEnum
+syn keyword juliaConstC LoveTidalHtEnum
+syn keyword juliaConstC LoveTidalKtEnum
+syn keyword juliaConstC LoveTidalLtEnum
+syn keyword juliaConstC LovePMTF1tEnum
+syn keyword juliaConstC LovePMTF2tEnum
 syn keyword juliaConstC LoveSolutionEnum
 syn keyword juliaConstC MINIEnum
@@ -1470,7 +1514,7 @@
 syn keyword juliaConstC SealevelAbsoluteEnum
 syn keyword juliaConstC SealevelEmotionEnum
-syn keyword juliaConstC SealevelInertiaTensorXZEnum
-syn keyword juliaConstC SealevelInertiaTensorYZEnum
-syn keyword juliaConstC SealevelInertiaTensorZZEnum
+syn keyword juliaConstC SealevelchangePolarMotionXEnum
+syn keyword juliaConstC SealevelchangePolarMotionYEnum
+syn keyword juliaConstC SealevelchangePolarMotionZEnum
 syn keyword juliaConstC SealevelchangePolarMotionEnum
 syn keyword juliaConstC SealevelNmotionEnum
Index: /issm/trunk/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk/src/c/shared/Enum/StringToEnumx.cpp	(revision 27034)
+++ /issm/trunk/src/c/shared/Enum/StringToEnumx.cpp	(revision 27035)
@@ -66,4 +66,9 @@
 	      else if (strcmp(name,"BalancethicknessStabilization")==0) return BalancethicknessStabilizationEnum;
 	      else if (strcmp(name,"BarystaticContributions")==0) return BarystaticContributionsEnum;
+	      else if (strcmp(name,"BasalforcingsAutoregressionInitialTime")==0) return BasalforcingsAutoregressionInitialTimeEnum;
+	      else if (strcmp(name,"BasalforcingsAutoregressionTimestep")==0) return BasalforcingsAutoregressionTimestepEnum;
+	      else if (strcmp(name,"BasalforcingsAutoregressiveOrder")==0) return BasalforcingsAutoregressiveOrderEnum;
+	      else if (strcmp(name,"BasalforcingsBeta0")==0) return BasalforcingsBeta0Enum;
+	      else if (strcmp(name,"BasalforcingsBeta1")==0) return BasalforcingsBeta1Enum;
 	      else if (strcmp(name,"BasalforcingsBottomplumedepth")==0) return BasalforcingsBottomplumedepthEnum;
 	      else if (strcmp(name,"BasalforcingsCrustthickness")==0) return BasalforcingsCrustthicknessEnum;
@@ -79,7 +84,9 @@
 	      else if (strcmp(name,"BasalforcingsIsmip6NumBasins")==0) return BasalforcingsIsmip6NumBasinsEnum;
 	      else if (strcmp(name,"BasalforcingsIsmip6TfDepths")==0) return BasalforcingsIsmip6TfDepthsEnum;
+	      else if (strcmp(name,"BasalforcingsLinearNumBasins")==0) return BasalforcingsLinearNumBasinsEnum;
 	      else if (strcmp(name,"BasalforcingsLowercrustheat")==0) return BasalforcingsLowercrustheatEnum;
 	      else if (strcmp(name,"BasalforcingsMantleconductivity")==0) return BasalforcingsMantleconductivityEnum;
 	      else if (strcmp(name,"BasalforcingsNusselt")==0) return BasalforcingsNusseltEnum;
+	      else if (strcmp(name,"BasalforcingsPhi")==0) return BasalforcingsPhiEnum;
 	      else if (strcmp(name,"BasalforcingsPicoAverageOverturning")==0) return BasalforcingsPicoAverageOverturningEnum;
 	      else if (strcmp(name,"BasalforcingsPicoAverageSalinity")==0) return BasalforcingsPicoAverageSalinityEnum;
@@ -107,4 +114,11 @@
 	      else if (strcmp(name,"CalvingLaw")==0) return CalvingLawEnum;
 	      else if (strcmp(name,"CalvingMinthickness")==0) return CalvingMinthicknessEnum;
+	      else if (strcmp(name,"CalvingTestSpeedfactor")==0) return CalvingTestSpeedfactorEnum;
+	      else if (strcmp(name,"CalvingTestIndependentRate")==0) return CalvingTestIndependentRateEnum;
+	      else if (strcmp(name,"CalvingUseParam")==0) return CalvingUseParamEnum;
+	      else if (strcmp(name,"CalvingScaleTheta")==0) return CalvingScaleThetaEnum;
+	      else if (strcmp(name,"CalvingAmpAlpha")==0) return CalvingAmpAlphaEnum;
+	      else if (strcmp(name,"CalvingMidpoint")==0) return CalvingMidpointEnum;
+	      else if (strcmp(name,"CalvingNonlinearLaw")==0) return CalvingNonlinearLawEnum;
 	      else if (strcmp(name,"ConfigurationType")==0) return ConfigurationTypeEnum;
 	      else if (strcmp(name,"ConstantsG")==0) return ConstantsGEnum;
@@ -123,5 +137,8 @@
 	      else if (strcmp(name,"CumBslcOceanPartition")==0) return CumBslcOceanPartitionEnum;
 	      else if (strcmp(name,"CumGmtslc")==0) return CumGmtslcEnum;
-	      else if (strcmp(name,"CumGmslc")==0) return CumGmslcEnum;
+         else stage=2;
+   }
+   if(stage==2){
+	      if (strcmp(name,"CumGmslc")==0) return CumGmslcEnum;
 	      else if (strcmp(name,"DamageC1")==0) return DamageC1Enum;
 	      else if (strcmp(name,"DamageC2")==0) return DamageC2Enum;
@@ -137,8 +154,5 @@
 	      else if (strcmp(name,"DamageMaxDamage")==0) return DamageMaxDamageEnum;
 	      else if (strcmp(name,"DamageStabilization")==0) return DamageStabilizationEnum;
-         else stage=2;
-   }
-   if(stage==2){
-	      if (strcmp(name,"DamageStressThreshold")==0) return DamageStressThresholdEnum;
+	      else if (strcmp(name,"DamageStressThreshold")==0) return DamageStressThresholdEnum;
 	      else if (strcmp(name,"DamageStressUBound")==0) return DamageStressUBoundEnum;
 	      else if (strcmp(name,"DebugProfiling")==0) return DebugProfilingEnum;
@@ -167,5 +181,5 @@
 	      else if (strcmp(name,"FlowequationIsHO")==0) return FlowequationIsHOEnum;
 	      else if (strcmp(name,"FlowequationIsL1L2")==0) return FlowequationIsL1L2Enum;
-	      else if (strcmp(name,"FlowequationIsMLHO")==0) return FlowequationIsMLHOEnum;
+	      else if (strcmp(name,"FlowequationIsMOLHO")==0) return FlowequationIsMOLHOEnum;
 	      else if (strcmp(name,"FlowequationIsSIA")==0) return FlowequationIsSIAEnum;
 	      else if (strcmp(name,"FlowequationIsSSA")==0) return FlowequationIsSSAEnum;
@@ -194,4 +208,6 @@
 	      else if (strcmp(name,"GroundinglineMeltInterpolation")==0) return GroundinglineMeltInterpolationEnum;
 	      else if (strcmp(name,"GroundinglineMigration")==0) return GroundinglineMigrationEnum;
+	      else if (strcmp(name,"GroundinglineNumRequestedOutputs")==0) return GroundinglineNumRequestedOutputsEnum;
+	      else if (strcmp(name,"GroundinglineRequestedOutputs")==0) return GroundinglineRequestedOutputsEnum;
 	      else if (strcmp(name,"HydrologyAveraging")==0) return HydrologyAveragingEnum;
 	      else if (strcmp(name,"HydrologyCavitySpacing")==0) return HydrologyCavitySpacingEnum;
@@ -244,5 +260,8 @@
 	      else if (strcmp(name,"InversionAlgorithm")==0) return InversionAlgorithmEnum;
 	      else if (strcmp(name,"InversionControlParameters")==0) return InversionControlParametersEnum;
-	      else if (strcmp(name,"InversionControlScalingFactors")==0) return InversionControlScalingFactorsEnum;
+         else stage=3;
+   }
+   if(stage==3){
+	      if (strcmp(name,"InversionControlScalingFactors")==0) return InversionControlScalingFactorsEnum;
 	      else if (strcmp(name,"InversionCostFunctions")==0) return InversionCostFunctionsEnum;
 	      else if (strcmp(name,"InversionDxmin")==0) return InversionDxminEnum;
@@ -260,8 +279,5 @@
 	      else if (strcmp(name,"InversionNumCostFunctions")==0) return InversionNumCostFunctionsEnum;
 	      else if (strcmp(name,"InversionStepThreshold")==0) return InversionStepThresholdEnum;
-         else stage=3;
-   }
-   if(stage==3){
-	      if (strcmp(name,"InversionType")==0) return InversionTypeEnum;
+	      else if (strcmp(name,"InversionType")==0) return InversionTypeEnum;
 	      else if (strcmp(name,"Ivins")==0) return IvinsEnum;
 	      else if (strcmp(name,"IsSlcCoupling")==0) return IsSlcCouplingEnum;
@@ -271,4 +287,5 @@
 	      else if (strcmp(name,"LockFileName")==0) return LockFileNameEnum;
 	      else if (strcmp(name,"LoveAllowLayerDeletion")==0) return LoveAllowLayerDeletionEnum;
+	      else if (strcmp(name,"LoveChandlerWobble")==0) return LoveChandlerWobbleEnum;
 	      else if (strcmp(name,"LoveCoreMantleBoundary")==0) return LoveCoreMantleBoundaryEnum;
 	      else if (strcmp(name,"LoveEarthMass")==0) return LoveEarthMassEnum;
@@ -291,4 +308,5 @@
 	      else if (strcmp(name,"LoveStartingLayer")==0) return LoveStartingLayerEnum;
 	      else if (strcmp(name,"LoveUnderflowTol")==0) return LoveUnderflowTolEnum;
+	      else if (strcmp(name,"LovePostWidderThreshold")==0) return LovePostWidderThresholdEnum;
 	      else if (strcmp(name,"MassFluxSegments")==0) return MassFluxSegmentsEnum;
 	      else if (strcmp(name,"MassFluxSegmentsPresent")==0) return MassFluxSegmentsPresentEnum;
@@ -360,12 +378,13 @@
 	      else if (strcmp(name,"Modelname")==0) return ModelnameEnum;
 	      else if (strcmp(name,"SamplingAlpha")==0) return SamplingAlphaEnum;
-	      else if (strcmp(name,"SamplingPhi")==0) return SamplingPhiEnum;
 	      else if (strcmp(name,"SamplingNumRequestedOutputs")==0) return SamplingNumRequestedOutputsEnum;
 	      else if (strcmp(name,"SamplingRequestedOutputs")==0) return SamplingRequestedOutputsEnum;
 	      else if (strcmp(name,"SamplingRobin")==0) return SamplingRobinEnum;
 	      else if (strcmp(name,"SamplingSeed")==0) return SamplingSeedEnum;
-	      else if (strcmp(name,"SamplingTau")==0) return SamplingTauEnum;
 	      else if (strcmp(name,"SaveResults")==0) return SaveResultsEnum;
-	      else if (strcmp(name,"SolidearthPartitionIce")==0) return SolidearthPartitionIceEnum;
+         else stage=4;
+   }
+   if(stage==4){
+	      if (strcmp(name,"SolidearthPartitionIce")==0) return SolidearthPartitionIceEnum;
 	      else if (strcmp(name,"SolidearthPartitionHydro")==0) return SolidearthPartitionHydroEnum;
 	      else if (strcmp(name,"SolidearthPartitionOcean")==0) return SolidearthPartitionOceanEnum;
@@ -377,5 +396,4 @@
 	      else if (strcmp(name,"SolidearthSettingsAbstol")==0) return SolidearthSettingsAbstolEnum;
 	      else if (strcmp(name,"SolidearthSettingsCrossSectionShape")==0) return SolidearthSettingsCrossSectionShapeEnum;
-	      else if (strcmp(name,"RotationalAngularVelocity")==0) return RotationalAngularVelocityEnum;
 	      else if (strcmp(name,"SolidearthSettingsElastic")==0) return SolidearthSettingsElasticEnum;
 	      else if (strcmp(name,"SolidearthSettingsViscous")==0) return SolidearthSettingsViscousEnum;
@@ -383,9 +401,14 @@
 	      else if (strcmp(name,"SealevelchangeViscousNumSteps")==0) return SealevelchangeViscousNumStepsEnum;
 	      else if (strcmp(name,"SealevelchangeViscousTimes")==0) return SealevelchangeViscousTimesEnum;
-         else stage=4;
-   }
-   if(stage==4){
-	      if (strcmp(name,"SealevelchangeViscousIndex")==0) return SealevelchangeViscousIndexEnum;
+	      else if (strcmp(name,"SealevelchangeViscousIndex")==0) return SealevelchangeViscousIndexEnum;
+	      else if (strcmp(name,"SealevelchangeViscousPolarMotion")==0) return SealevelchangeViscousPolarMotionEnum;
+	      else if (strcmp(name,"SealevelchangeRunCount")==0) return SealevelchangeRunCountEnum;
+	      else if (strcmp(name,"SealevelchangeTransitions")==0) return SealevelchangeTransitionsEnum;
+	      else if (strcmp(name,"SealevelchangeRequestedOutputs")==0) return SealevelchangeRequestedOutputsEnum;
+	      else if (strcmp(name,"RotationalAngularVelocity")==0) return RotationalAngularVelocityEnum;
 	      else if (strcmp(name,"RotationalEquatorialMoi")==0) return RotationalEquatorialMoiEnum;
+	      else if (strcmp(name,"RotationalPolarMoi")==0) return RotationalPolarMoiEnum;
+	      else if (strcmp(name,"LovePolarMotionTransferFunctionColinear")==0) return LovePolarMotionTransferFunctionColinearEnum;
+	      else if (strcmp(name,"LovePolarMotionTransferFunctionOrthogonal")==0) return LovePolarMotionTransferFunctionOrthogonalEnum;
 	      else if (strcmp(name,"TidalLoveH")==0) return TidalLoveHEnum;
 	      else if (strcmp(name,"TidalLoveK")==0) return TidalLoveKEnum;
@@ -399,9 +422,16 @@
 	      else if (strcmp(name,"SealevelchangeGSelfAttraction")==0) return SealevelchangeGSelfAttractionEnum;
 	      else if (strcmp(name,"SealevelchangeGViscoElastic")==0) return SealevelchangeGViscoElasticEnum;
+	      else if (strcmp(name,"SealevelchangeUViscoElastic")==0) return SealevelchangeUViscoElasticEnum;
+	      else if (strcmp(name,"SealevelchangeHViscoElastic")==0) return SealevelchangeHViscoElasticEnum;
+	      else if (strcmp(name,"SealevelchangePolarMotionTransferFunctionColinear")==0) return SealevelchangePolarMotionTransferFunctionColinearEnum;
+	      else if (strcmp(name,"SealevelchangePolarMotionTransferFunctionOrthogonal")==0) return SealevelchangePolarMotionTransferFunctionOrthogonalEnum;
+	      else if (strcmp(name,"SealevelchangePolarMotionTransferFunctionZ")==0) return SealevelchangePolarMotionTransferFunctionZEnum;
+	      else if (strcmp(name,"SealevelchangeTidalK2")==0) return SealevelchangeTidalK2Enum;
+	      else if (strcmp(name,"SealevelchangeTidalH2")==0) return SealevelchangeTidalH2Enum;
+	      else if (strcmp(name,"SealevelchangeTidalL2")==0) return SealevelchangeTidalL2Enum;
 	      else if (strcmp(name,"SolidearthSettingsSealevelLoading")==0) return SolidearthSettingsSealevelLoadingEnum;
 	      else if (strcmp(name,"SolidearthSettingsGRD")==0) return SolidearthSettingsGRDEnum;
 	      else if (strcmp(name,"SolidearthSettingsRunFrequency")==0) return SolidearthSettingsRunFrequencyEnum;
 	      else if (strcmp(name,"SolidearthSettingsTimeAcc")==0) return SolidearthSettingsTimeAccEnum;
-	      else if (strcmp(name,"SealevelchangeHViscoElastic")==0) return SealevelchangeHViscoElasticEnum;
 	      else if (strcmp(name,"SolidearthSettingsHoriz")==0) return SolidearthSettingsHorizEnum;
 	      else if (strcmp(name,"SolidearthSettingsMaxiter")==0) return SolidearthSettingsMaxiterEnum;
@@ -415,15 +445,12 @@
 	      else if (strcmp(name,"StochasticForcingIsStochasticForcing")==0) return StochasticForcingIsStochasticForcingEnum;
 	      else if (strcmp(name,"StochasticForcingIsWaterPressure")==0) return StochasticForcingIsWaterPressureEnum;
+	      else if (strcmp(name,"StochasticForcingNoiseterms")==0) return StochasticForcingNoisetermsEnum;
 	      else if (strcmp(name,"StochasticForcingNumFields")==0) return StochasticForcingNumFieldsEnum;
 	      else if (strcmp(name,"StochasticForcingRandomflag")==0) return StochasticForcingRandomflagEnum;
-	      else if (strcmp(name,"RotationalPolarMoi")==0) return RotationalPolarMoiEnum;
+	      else if (strcmp(name,"StochasticForcingTimestep")==0) return StochasticForcingTimestepEnum;
 	      else if (strcmp(name,"SolidearthSettingsReltol")==0) return SolidearthSettingsReltolEnum;
-	      else if (strcmp(name,"SealevelchangeRequestedOutputs")==0) return SealevelchangeRequestedOutputsEnum;
 	      else if (strcmp(name,"SolidearthSettingsSelfAttraction")==0) return SolidearthSettingsSelfAttractionEnum;
 	      else if (strcmp(name,"SolidearthSettingsRotation")==0) return SolidearthSettingsRotationEnum;
 	      else if (strcmp(name,"SolidearthSettingsMaxSHCoeff")==0) return SolidearthSettingsMaxSHCoeffEnum;
-	      else if (strcmp(name,"SealevelchangeRunCount")==0) return SealevelchangeRunCountEnum;
-	      else if (strcmp(name,"SealevelchangeTransitions")==0) return SealevelchangeTransitionsEnum;
-	      else if (strcmp(name,"SealevelchangeUViscoElastic")==0) return SealevelchangeUViscoElasticEnum;
 	      else if (strcmp(name,"SettingsIoGather")==0) return SettingsIoGatherEnum;
 	      else if (strcmp(name,"SettingsNumResultsOnNodes")==0) return SettingsNumResultsOnNodesEnum;
@@ -450,4 +477,5 @@
 	      else if (strcmp(name,"SmbDpermil")==0) return SmbDpermilEnum;
 	      else if (strcmp(name,"SmbDsnowIdx")==0) return SmbDsnowIdxEnum;
+	      else if (strcmp(name,"SmbElevationBins")==0) return SmbElevationBinsEnum;
 	      else if (strcmp(name,"SmbCldFrac")==0) return SmbCldFracEnum;
 	      else if (strcmp(name,"SmbDelta18o")==0) return SmbDelta18oEnum;
@@ -477,9 +505,15 @@
 	      else if (strcmp(name,"SmbIsturbulentflux")==0) return SmbIsturbulentfluxEnum;
 	      else if (strcmp(name,"SmbK")==0) return SmbKEnum;
-	      else if (strcmp(name,"SmbNumBasins")==0) return SmbNumBasinsEnum;
+	      else if (strcmp(name,"SmbLapseRates")==0) return SmbLapseRatesEnum;
+         else stage=5;
+   }
+   if(stage==5){
+	      if (strcmp(name,"SmbNumBasins")==0) return SmbNumBasinsEnum;
+	      else if (strcmp(name,"SmbNumElevationBins")==0) return SmbNumElevationBinsEnum;
 	      else if (strcmp(name,"SmbNumRequestedOutputs")==0) return SmbNumRequestedOutputsEnum;
 	      else if (strcmp(name,"SmbPfac")==0) return SmbPfacEnum;
 	      else if (strcmp(name,"SmbPhi")==0) return SmbPhiEnum;
 	      else if (strcmp(name,"SmbRdl")==0) return SmbRdlEnum;
+	      else if (strcmp(name,"SmbRefElevation")==0) return SmbRefElevationEnum;
 	      else if (strcmp(name,"SmbRequestedOutputs")==0) return SmbRequestedOutputsEnum;
 	      else if (strcmp(name,"SmbRlaps")==0) return SmbRlapsEnum;
@@ -506,8 +540,5 @@
 	      else if (strcmp(name,"Step")==0) return StepEnum;
 	      else if (strcmp(name,"Steps")==0) return StepsEnum;
-         else stage=5;
-   }
-   if(stage==5){
-	      if (strcmp(name,"StressbalanceAbstol")==0) return StressbalanceAbstolEnum;
+	      else if (strcmp(name,"StressbalanceAbstol")==0) return StressbalanceAbstolEnum;
 	      else if (strcmp(name,"StressbalanceFSreconditioning")==0) return StressbalanceFSreconditioningEnum;
 	      else if (strcmp(name,"StressbalanceIsnewton")==0) return StressbalanceIsnewtonEnum;
@@ -593,8 +624,19 @@
 	      else if (strcmp(name,"BalancethicknessThickeningRate")==0) return BalancethicknessThickeningRateEnum;
 	      else if (strcmp(name,"BasalCrevasse")==0) return BasalCrevasseEnum;
+	      else if (strcmp(name,"BasalforcingsDeepwaterMeltingRateAutoregression")==0) return BasalforcingsDeepwaterMeltingRateAutoregressionEnum;
+	      else if (strcmp(name,"BasalforcingsDeepwaterMeltingRateNoise")==0) return BasalforcingsDeepwaterMeltingRateNoiseEnum;
+	      else if (strcmp(name,"BasalforcingsDeepwaterMeltingRateValuesAutoregression")==0) return BasalforcingsDeepwaterMeltingRateValuesAutoregressionEnum;
 	      else if (strcmp(name,"BasalforcingsFloatingiceMeltingRate")==0) return BasalforcingsFloatingiceMeltingRateEnum;
 	      else if (strcmp(name,"BasalforcingsGeothermalflux")==0) return BasalforcingsGeothermalfluxEnum;
-	      else if (strcmp(name,"BasalforcingsGroundediceMeltingRate")==0) return BasalforcingsGroundediceMeltingRateEnum;
+         else stage=6;
+   }
+   if(stage==6){
+	      if (strcmp(name,"BasalforcingsGroundediceMeltingRate")==0) return BasalforcingsGroundediceMeltingRateEnum;
+	      else if (strcmp(name,"BasalforcingsLinearBasinId")==0) return BasalforcingsLinearBasinIdEnum;
 	      else if (strcmp(name,"BasalforcingsPerturbationMeltingRate")==0) return BasalforcingsPerturbationMeltingRateEnum;
+	      else if (strcmp(name,"BasalforcingsSpatialDeepwaterElevation")==0) return BasalforcingsSpatialDeepwaterElevationEnum;
+	      else if (strcmp(name,"BasalforcingsSpatialDeepwaterMeltingRate")==0) return BasalforcingsSpatialDeepwaterMeltingRateEnum;
+	      else if (strcmp(name,"BasalforcingsSpatialUpperwaterElevation")==0) return BasalforcingsSpatialUpperwaterElevationEnum;
+	      else if (strcmp(name,"BasalforcingsSpatialUpperwaterMeltingRate")==0) return BasalforcingsSpatialUpperwaterMeltingRateEnum;
 	      else if (strcmp(name,"BasalforcingsIsmip6BasinId")==0) return BasalforcingsIsmip6BasinIdEnum;
 	      else if (strcmp(name,"BasalforcingsIsmip6Tf")==0) return BasalforcingsIsmip6TfEnum;
@@ -618,6 +660,8 @@
 	      else if (strcmp(name,"BaseSlopeY")==0) return BaseSlopeYEnum;
 	      else if (strcmp(name,"BaselineBasalforcingsFloatingiceMeltingRate")==0) return BaselineBasalforcingsFloatingiceMeltingRateEnum;
+	      else if (strcmp(name,"BaselineBasalforcingsSpatialDeepwaterMeltingRate")==0) return BaselineBasalforcingsSpatialDeepwaterMeltingRateEnum;
 	      else if (strcmp(name,"BaselineCalvingCalvingrate")==0) return BaselineCalvingCalvingrateEnum;
 	      else if (strcmp(name,"BaselineFrictionEffectivePressure")==0) return BaselineFrictionEffectivePressureEnum;
+	      else if (strcmp(name,"BaselineSmbMassBalance")==0) return BaselineSmbMassBalanceEnum;
 	      else if (strcmp(name,"Bed")==0) return BedEnum;
 	      else if (strcmp(name,"BedGRD")==0) return BedGRDEnum;
@@ -629,17 +673,13 @@
 	      else if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum;
 	      else if (strcmp(name,"BottomPressure")==0) return BottomPressureEnum;
-         else stage=6;
-   }
-   if(stage==6){
-	      if (strcmp(name,"BottomPressureOld")==0) return BottomPressureOldEnum;
+	      else if (strcmp(name,"BottomPressureOld")==0) return BottomPressureOldEnum;
 	      else if (strcmp(name,"CalvingCalvingrate")==0) return CalvingCalvingrateEnum;
 	      else if (strcmp(name,"CalvingHabFraction")==0) return CalvingHabFractionEnum;
+	      else if (strcmp(name,"CalvingAblationrate")==0) return CalvingAblationrateEnum;
 	      else if (strcmp(name,"CalvingMeltingrate")==0) return CalvingMeltingrateEnum;
 	      else if (strcmp(name,"CalvingStressThresholdFloatingice")==0) return CalvingStressThresholdFloatingiceEnum;
 	      else if (strcmp(name,"CalvingStressThresholdGroundedice")==0) return CalvingStressThresholdGroundediceEnum;
 	      else if (strcmp(name,"CalvinglevermannCoeff")==0) return CalvinglevermannCoeffEnum;
-	      else if (strcmp(name,"CalvingratexAverage")==0) return CalvingratexAverageEnum;
 	      else if (strcmp(name,"Calvingratex")==0) return CalvingratexEnum;
-	      else if (strcmp(name,"CalvingrateyAverage")==0) return CalvingrateyAverageEnum;
 	      else if (strcmp(name,"Calvingratey")==0) return CalvingrateyEnum;
 	      else if (strcmp(name,"CalvingFluxLevelset")==0) return CalvingFluxLevelsetEnum;
@@ -712,5 +752,8 @@
 	      else if (strcmp(name,"FrictionP")==0) return FrictionPEnum;
 	      else if (strcmp(name,"FrictionPressureAdjustedTemperature")==0) return FrictionPressureAdjustedTemperatureEnum;
-	      else if (strcmp(name,"FrictionQ")==0) return FrictionQEnum;
+         else stage=7;
+   }
+   if(stage==7){
+	      if (strcmp(name,"FrictionQ")==0) return FrictionQEnum;
 	      else if (strcmp(name,"FrictionSedimentCompressibilityCoefficient")==0) return FrictionSedimentCompressibilityCoefficientEnum;
 	      else if (strcmp(name,"FrictionTillFrictionAngle")==0) return FrictionTillFrictionAngleEnum;
@@ -752,8 +795,5 @@
 	      else if (strcmp(name,"HydrologyHeadOld")==0) return HydrologyHeadOldEnum;
 	      else if (strcmp(name,"HydrologyMoulinInput")==0) return HydrologyMoulinInputEnum;
-         else stage=7;
-   }
-   if(stage==7){
-	      if (strcmp(name,"HydrologyNeumannflux")==0) return HydrologyNeumannfluxEnum;
+	      else if (strcmp(name,"HydrologyNeumannflux")==0) return HydrologyNeumannfluxEnum;
 	      else if (strcmp(name,"HydrologyReynolds")==0) return HydrologyReynoldsEnum;
 	      else if (strcmp(name,"HydrologySheetConductivity")==0) return HydrologySheetConductivityEnum;
@@ -823,6 +863,10 @@
 	      else if (strcmp(name,"RheologyBbarAbsGradient")==0) return RheologyBbarAbsGradientEnum;
 	      else if (strcmp(name,"Sample")==0) return SampleEnum;
+	      else if (strcmp(name,"SampleOld")==0) return SampleOldEnum;
+	      else if (strcmp(name,"SampleNoise")==0) return SampleNoiseEnum;
 	      else if (strcmp(name,"SamplingBeta")==0) return SamplingBetaEnum;
 	      else if (strcmp(name,"SamplingKappa")==0) return SamplingKappaEnum;
+	      else if (strcmp(name,"SamplingPhi")==0) return SamplingPhiEnum;
+	      else if (strcmp(name,"SamplingTau")==0) return SamplingTauEnum;
 	      else if (strcmp(name,"Sealevel")==0) return SealevelEnum;
 	      else if (strcmp(name,"SealevelGRD")==0) return SealevelGRDEnum;
@@ -831,5 +875,8 @@
 	      else if (strcmp(name,"SealevelBarystaticIceWeights")==0) return SealevelBarystaticIceWeightsEnum;
 	      else if (strcmp(name,"SealevelBarystaticIceArea")==0) return SealevelBarystaticIceAreaEnum;
-	      else if (strcmp(name,"SealevelBarystaticIceLatbar")==0) return SealevelBarystaticIceLatbarEnum;
+         else stage=8;
+   }
+   if(stage==8){
+	      if (strcmp(name,"SealevelBarystaticIceLatbar")==0) return SealevelBarystaticIceLatbarEnum;
 	      else if (strcmp(name,"SealevelBarystaticIceLongbar")==0) return SealevelBarystaticIceLongbarEnum;
 	      else if (strcmp(name,"SealevelBarystaticIceLoad")==0) return SealevelBarystaticIceLoadEnum;
@@ -859,24 +906,9 @@
 	      else if (strcmp(name,"BslcRate")==0) return BslcRateEnum;
 	      else if (strcmp(name,"Gmtslc")==0) return GmtslcEnum;
-	      else if (strcmp(name,"SealevelGrotm1")==0) return SealevelGrotm1Enum;
-	      else if (strcmp(name,"SealevelGrotm2")==0) return SealevelGrotm2Enum;
-	      else if (strcmp(name,"SealevelGrotm3")==0) return SealevelGrotm3Enum;
-	      else if (strcmp(name,"SealevelGUrotm1")==0) return SealevelGUrotm1Enum;
-	      else if (strcmp(name,"SealevelGUrotm2")==0) return SealevelGUrotm2Enum;
-	      else if (strcmp(name,"SealevelGUrotm3")==0) return SealevelGUrotm3Enum;
-	      else if (strcmp(name,"SealevelGNrotm1")==0) return SealevelGNrotm1Enum;
-	      else if (strcmp(name,"SealevelGNrotm2")==0) return SealevelGNrotm2Enum;
-	      else if (strcmp(name,"SealevelGNrotm3")==0) return SealevelGNrotm3Enum;
-	      else if (strcmp(name,"SealevelGErotm1")==0) return SealevelGErotm1Enum;
-	      else if (strcmp(name,"SealevelGErotm2")==0) return SealevelGErotm2Enum;
-	      else if (strcmp(name,"SealevelGErotm3")==0) return SealevelGErotm3Enum;
 	      else if (strcmp(name,"SealevelRSLBarystatic")==0) return SealevelRSLBarystaticEnum;
 	      else if (strcmp(name,"SealevelRSLRate")==0) return SealevelRSLRateEnum;
 	      else if (strcmp(name,"SealevelUGrd")==0) return SealevelUGrdEnum;
 	      else if (strcmp(name,"SealevelNGrd")==0) return SealevelNGrdEnum;
-         else stage=8;
-   }
-   if(stage==8){
-	      if (strcmp(name,"SealevelUEastEsa")==0) return SealevelUEastEsaEnum;
+	      else if (strcmp(name,"SealevelUEastEsa")==0) return SealevelUEastEsaEnum;
 	      else if (strcmp(name,"SealevelUNorthEsa")==0) return SealevelUNorthEsaEnum;
 	      else if (strcmp(name,"SealevelchangeIndices")==0) return SealevelchangeIndicesEnum;
@@ -885,4 +917,8 @@
 	      else if (strcmp(name,"SealevelchangeGE")==0) return SealevelchangeGEEnum;
 	      else if (strcmp(name,"SealevelchangeGN")==0) return SealevelchangeGNEnum;
+	      else if (strcmp(name,"SealevelchangeGrot")==0) return SealevelchangeGrotEnum;
+	      else if (strcmp(name,"SealevelchangeGUrot")==0) return SealevelchangeGUrotEnum;
+	      else if (strcmp(name,"SealevelchangeGNrot")==0) return SealevelchangeGNrotEnum;
+	      else if (strcmp(name,"SealevelchangeGErot")==0) return SealevelchangeGErotEnum;
 	      else if (strcmp(name,"SealevelchangeGsubelOcean")==0) return SealevelchangeGsubelOceanEnum;
 	      else if (strcmp(name,"SealevelchangeGUsubelOcean")==0) return SealevelchangeGUsubelOceanEnum;
@@ -962,5 +998,8 @@
 	      else if (strcmp(name,"SmbGdnini")==0) return SmbGdniniEnum;
 	      else if (strcmp(name,"SmbGsp")==0) return SmbGspEnum;
-	      else if (strcmp(name,"SmbGspini")==0) return SmbGspiniEnum;
+         else stage=9;
+   }
+   if(stage==9){
+	      if (strcmp(name,"SmbGspini")==0) return SmbGspiniEnum;
 	      else if (strcmp(name,"SmbHref")==0) return SmbHrefEnum;
 	      else if (strcmp(name,"SmbIsInitialized")==0) return SmbIsInitializedEnum;
@@ -998,8 +1037,5 @@
 	      else if (strcmp(name,"SmbSizeini")==0) return SmbSizeiniEnum;
 	      else if (strcmp(name,"SmbSmbCorr")==0) return SmbSmbCorrEnum;
-         else stage=9;
-   }
-   if(stage==9){
-	      if (strcmp(name,"SmbSmbref")==0) return SmbSmbrefEnum;
+	      else if (strcmp(name,"SmbSmbref")==0) return SmbSmbrefEnum;
 	      else if (strcmp(name,"SmbSzaValue")==0) return SmbSzaValueEnum;
 	      else if (strcmp(name,"SmbT")==0) return SmbTEnum;
@@ -1085,5 +1121,8 @@
 	      else if (strcmp(name,"VxSurface")==0) return VxSurfaceEnum;
 	      else if (strcmp(name,"VyAverage")==0) return VyAverageEnum;
-	      else if (strcmp(name,"VyBase")==0) return VyBaseEnum;
+         else stage=10;
+   }
+   if(stage==10){
+	      if (strcmp(name,"VyBase")==0) return VyBaseEnum;
 	      else if (strcmp(name,"Vy")==0) return VyEnum;
 	      else if (strcmp(name,"VyMesh")==0) return VyMeshEnum;
@@ -1121,8 +1160,5 @@
 	      else if (strcmp(name,"Outputdefinition19")==0) return Outputdefinition19Enum;
 	      else if (strcmp(name,"Outputdefinition20")==0) return Outputdefinition20Enum;
-         else stage=10;
-   }
-   if(stage==10){
-	      if (strcmp(name,"Outputdefinition21")==0) return Outputdefinition21Enum;
+	      else if (strcmp(name,"Outputdefinition21")==0) return Outputdefinition21Enum;
 	      else if (strcmp(name,"Outputdefinition22")==0) return Outputdefinition22Enum;
 	      else if (strcmp(name,"Outputdefinition23")==0) return Outputdefinition23Enum;
@@ -1208,5 +1244,8 @@
 	      else if (strcmp(name,"Outputdefinition96")==0) return Outputdefinition96Enum;
 	      else if (strcmp(name,"Outputdefinition97")==0) return Outputdefinition97Enum;
-	      else if (strcmp(name,"Outputdefinition98")==0) return Outputdefinition98Enum;
+         else stage=11;
+   }
+   if(stage==11){
+	      if (strcmp(name,"Outputdefinition98")==0) return Outputdefinition98Enum;
 	      else if (strcmp(name,"Outputdefinition99")==0) return Outputdefinition99Enum;
 	      else if (strcmp(name,"Outputdefinition9")==0) return Outputdefinition9Enum;
@@ -1224,4 +1263,5 @@
 	      else if (strcmp(name,"Arrhenius")==0) return ArrheniusEnum;
 	      else if (strcmp(name,"AutodiffJacobian")==0) return AutodiffJacobianEnum;
+	      else if (strcmp(name,"AutoregressionLinearFloatingMeltRate")==0) return AutoregressionLinearFloatingMeltRateEnum;
 	      else if (strcmp(name,"Balancethickness2Analysis")==0) return Balancethickness2AnalysisEnum;
 	      else if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum;
@@ -1244,10 +1284,9 @@
 	      else if (strcmp(name,"Boundary")==0) return BoundaryEnum;
 	      else if (strcmp(name,"BuddJacka")==0) return BuddJackaEnum;
-         else stage=11;
-   }
-   if(stage==11){
-	      if (strcmp(name,"CalvingDev2")==0) return CalvingDev2Enum;
+	      else if (strcmp(name,"CalvingDev2")==0) return CalvingDev2Enum;
 	      else if (strcmp(name,"CalvingHab")==0) return CalvingHabEnum;
 	      else if (strcmp(name,"CalvingLevermann")==0) return CalvingLevermannEnum;
+	      else if (strcmp(name,"CalvingTest")==0) return CalvingTestEnum;
+	      else if (strcmp(name,"CalvingParameterization")==0) return CalvingParameterizationEnum;
 	      else if (strcmp(name,"CalvingVonmises")==0) return CalvingVonmisesEnum;
 	      else if (strcmp(name,"Cfdragcoeffabsgrad")==0) return CfdragcoeffabsgradEnum;
@@ -1328,5 +1367,8 @@
 	      else if (strcmp(name,"GaussTetra")==0) return GaussTetraEnum;
 	      else if (strcmp(name,"GaussTria")==0) return GaussTriaEnum;
-	      else if (strcmp(name,"GenericOption")==0) return GenericOptionEnum;
+         else stage=12;
+   }
+   if(stage==12){
+	      if (strcmp(name,"GenericOption")==0) return GenericOptionEnum;
 	      else if (strcmp(name,"GenericParam")==0) return GenericParamEnum;
 	      else if (strcmp(name,"GenericExternalResult")==0) return GenericExternalResultEnum;
@@ -1367,8 +1409,5 @@
 	      else if (strcmp(name,"Indexed")==0) return IndexedEnum;
 	      else if (strcmp(name,"IntExternalResult")==0) return IntExternalResultEnum;
-         else stage=12;
-   }
-   if(stage==12){
-	      if (strcmp(name,"ElementInput")==0) return ElementInputEnum;
+	      else if (strcmp(name,"ElementInput")==0) return ElementInputEnum;
 	      else if (strcmp(name,"IntMatExternalResult")==0) return IntMatExternalResultEnum;
 	      else if (strcmp(name,"IntMatParam")==0) return IntMatParamEnum;
@@ -1381,5 +1420,5 @@
 	      else if (strcmp(name,"J")==0) return JEnum;
 	      else if (strcmp(name,"L1L2Approximation")==0) return L1L2ApproximationEnum;
-	      else if (strcmp(name,"MLHOApproximation")==0) return MLHOApproximationEnum;
+	      else if (strcmp(name,"MOLHOApproximation")==0) return MOLHOApproximationEnum;
 	      else if (strcmp(name,"L2ProjectionBaseAnalysis")==0) return L2ProjectionBaseAnalysisEnum;
 	      else if (strcmp(name,"L2ProjectionEPLAnalysis")==0) return L2ProjectionEPLAnalysisEnum;
@@ -1393,12 +1432,17 @@
 	      else if (strcmp(name,"Loads")==0) return LoadsEnum;
 	      else if (strcmp(name,"LoveAnalysis")==0) return LoveAnalysisEnum;
-	      else if (strcmp(name,"LoveHi")==0) return LoveHiEnum;
-	      else if (strcmp(name,"LoveHr")==0) return LoveHrEnum;
+	      else if (strcmp(name,"LoveHf")==0) return LoveHfEnum;
+	      else if (strcmp(name,"LoveHt")==0) return LoveHtEnum;
 	      else if (strcmp(name,"LoveKernelsImag")==0) return LoveKernelsImagEnum;
 	      else if (strcmp(name,"LoveKernelsReal")==0) return LoveKernelsRealEnum;
-	      else if (strcmp(name,"LoveKi")==0) return LoveKiEnum;
-	      else if (strcmp(name,"LoveKr")==0) return LoveKrEnum;
-	      else if (strcmp(name,"LoveLi")==0) return LoveLiEnum;
-	      else if (strcmp(name,"LoveLr")==0) return LoveLrEnum;
+	      else if (strcmp(name,"LoveKf")==0) return LoveKfEnum;
+	      else if (strcmp(name,"LoveKt")==0) return LoveKtEnum;
+	      else if (strcmp(name,"LoveLf")==0) return LoveLfEnum;
+	      else if (strcmp(name,"LoveLt")==0) return LoveLtEnum;
+	      else if (strcmp(name,"LoveTidalHt")==0) return LoveTidalHtEnum;
+	      else if (strcmp(name,"LoveTidalKt")==0) return LoveTidalKtEnum;
+	      else if (strcmp(name,"LoveTidalLt")==0) return LoveTidalLtEnum;
+	      else if (strcmp(name,"LovePMTF1t")==0) return LovePMTF1tEnum;
+	      else if (strcmp(name,"LovePMTF2t")==0) return LovePMTF2tEnum;
 	      else if (strcmp(name,"LoveSolution")==0) return LoveSolutionEnum;
 	      else if (strcmp(name,"MINI")==0) return MINIEnum;
@@ -1446,5 +1490,8 @@
 	      else if (strcmp(name,"Nodal")==0) return NodalEnum;
 	      else if (strcmp(name,"Nodalvalue")==0) return NodalvalueEnum;
-	      else if (strcmp(name,"NodeSId")==0) return NodeSIdEnum;
+         else stage=13;
+   }
+   if(stage==13){
+	      if (strcmp(name,"NodeSId")==0) return NodeSIdEnum;
 	      else if (strcmp(name,"NoneApproximation")==0) return NoneApproximationEnum;
 	      else if (strcmp(name,"None")==0) return NoneEnum;
@@ -1490,8 +1537,5 @@
 	      else if (strcmp(name,"Riftfront")==0) return RiftfrontEnum;
 	      else if (strcmp(name,"SamplingAnalysis")==0) return SamplingAnalysisEnum;
-         else stage=13;
-   }
-   if(stage==13){
-	      if (strcmp(name,"SamplingSolution")==0) return SamplingSolutionEnum;
+	      else if (strcmp(name,"SamplingSolution")==0) return SamplingSolutionEnum;
 	      else if (strcmp(name,"SIAApproximation")==0) return SIAApproximationEnum;
 	      else if (strcmp(name,"SMBautoregression")==0) return SMBautoregressionEnum;
@@ -1515,7 +1559,7 @@
 	      else if (strcmp(name,"SealevelAbsolute")==0) return SealevelAbsoluteEnum;
 	      else if (strcmp(name,"SealevelEmotion")==0) return SealevelEmotionEnum;
-	      else if (strcmp(name,"SealevelInertiaTensorXZ")==0) return SealevelInertiaTensorXZEnum;
-	      else if (strcmp(name,"SealevelInertiaTensorYZ")==0) return SealevelInertiaTensorYZEnum;
-	      else if (strcmp(name,"SealevelInertiaTensorZZ")==0) return SealevelInertiaTensorZZEnum;
+	      else if (strcmp(name,"SealevelchangePolarMotionX")==0) return SealevelchangePolarMotionXEnum;
+	      else if (strcmp(name,"SealevelchangePolarMotionY")==0) return SealevelchangePolarMotionYEnum;
+	      else if (strcmp(name,"SealevelchangePolarMotionZ")==0) return SealevelchangePolarMotionZEnum;
 	      else if (strcmp(name,"SealevelchangePolarMotion")==0) return SealevelchangePolarMotionEnum;
 	      else if (strcmp(name,"SealevelNmotion")==0) return SealevelNmotionEnum;
@@ -1569,5 +1613,8 @@
 	      else if (strcmp(name,"TotalSmbScaled")==0) return TotalSmbScaledEnum;
 	      else if (strcmp(name,"TransientArrayParam")==0) return TransientArrayParamEnum;
-	      else if (strcmp(name,"TransientInput")==0) return TransientInputEnum;
+         else stage=14;
+   }
+   if(stage==14){
+	      if (strcmp(name,"TransientInput")==0) return TransientInputEnum;
 	      else if (strcmp(name,"TransientParam")==0) return TransientParamEnum;
 	      else if (strcmp(name,"TransientSolution")==0) return TransientSolutionEnum;
@@ -1604,5 +1651,5 @@
 	      else if (strcmp(name,"TriangleInterp")==0) return TriangleInterpEnum;
 	      else if (strcmp(name,"MaximumNumberOfDefinitions")==0) return MaximumNumberOfDefinitionsEnum;
-         else stage=14;
+         else stage=15;
    }
 	/*If we reach this point, the string provided has not been found*/
Index: /issm/trunk/src/c/shared/Enum/Synchronize.sh
===================================================================
--- /issm/trunk/src/c/shared/Enum/Synchronize.sh	(revision 27034)
+++ /issm/trunk/src/c/shared/Enum/Synchronize.sh	(revision 27035)
@@ -193,4 +193,26 @@
 END
 #}}}
+#Build issmenum.jl {{{
+#Header
+cat <<END >  $ISSM_DIR/src/c/shared/Enum/issmenums.jl
+#   WARNING: DO NOT MODIFY THIS FILE
+#            this file has been automatically generated by Synchronize.sh
+#            Please read README for more information
+
+@enum IssmEnum begin
+END
+cat temp |  awk '{print "\t" $1}' >> $ISSM_DIR/src/c/shared/Enum/issmenums.jl
+#Move on to EnumToString
+cat <<END >> $ISSM_DIR/src/c/shared/Enum/issmenums.jl
+end
+
+function EnumToString(enum::IssmEnum)
+END
+cat temp |  awk '{print "\tif(enum==" $1 ") return \"" substr($1,1,length($1)-4) "\" end"}' >> $ISSM_DIR/src/c/shared/Enum/issmenums.jl
+#Move on to StringToEnumx
+cat <<END >> $ISSM_DIR/src/c/shared/Enum/issmenums.jl
+end
+END
+#}}}
 
 #vim file
Index: /issm/trunk/src/c/shared/Exceptions/Exceptions.cpp
===================================================================
--- /issm/trunk/src/c/shared/Exceptions/Exceptions.cpp	(revision 27034)
+++ /issm/trunk/src/c/shared/Exceptions/Exceptions.cpp	(revision 27035)
@@ -15,7 +15,4 @@
 #include <iomanip>
 #include "./exceptions.h"
-#include "../io/Print/Print.h"
-#include "../io/Comm/IssmComm.h"
-#include "../MemOps/MemOps.h"
 
 ErrorException::ErrorException(const string & what_arg){/*{{{*/
@@ -31,24 +28,26 @@
 
 }/*}}}*/
-ErrorException::ErrorException(const string& what_file, const string& what_function,int what_line, const string& what_arg){/*{{{*/
+ErrorException::ErrorException(int what_rank,const string& what_file, const string& what_function,int what_line, const string& what_arg){/*{{{*/
 
+	/*Intermediaries*/
 	int len;
 
-	len      = strlen(what_arg.c_str())+1;
-	what_str = new char[len];
-	memcpy(what_str,what_arg.c_str(),len);
+	this->rank     = what_rank;
+	this->file_line= what_line;
 
-	len       = strlen(what_file.c_str())+1;
-	file_name = new char[len];
-	memcpy(file_name,what_file.c_str(),len);
+	len = strlen(what_arg.c_str())+1;
+	this->what_str = new char[len];
+	memcpy(this->what_str,what_arg.c_str(),len);
 
-	len           = strlen(what_function.c_str())+1;
-	function_name = new char[len];
-	memcpy(function_name,what_function.c_str(),len);
+	len = strlen(what_file.c_str())+1;
+	this->file_name = new char[len];
+	memcpy(this->file_name,what_file.c_str(),len);
 
-	file_line= what_line;
-	/*When error messages are not shown properly, uncomment the following line*/
-	this->Report();
+	len = strlen(what_function.c_str())+1;
+	this->function_name = new char[len];
+	memcpy(this->function_name,what_function.c_str(),len);
 
+	/*Uncomment if messages do not print properly*/
+	//this->Report();
 }/*}}}*/
 ErrorException::~ErrorException() throw(){/*{{{*/
@@ -58,5 +57,4 @@
 }/*}}}*/
 const char* ErrorException::what() const throw(){/*{{{*/
-	//this->Report();
 	return what_str;
 }/*}}}*/
@@ -64,21 +62,11 @@
 
 	/*WINDOWS*/
-	if(!function_name || file_line==0){
-		_printf_("Error message: " << what());
+	if(!this->function_name || this->file_line==0){
+		cerr << "Error message: " << what() << endl;
 		return;
 	}
 
-	/*recover my_rank and num_procs:*/
-	int my_rank   = IssmComm::GetRank();
-	int num_procs = IssmComm::GetSize();
-
-	if(num_procs==1){
-		_printf_("\n??? Error in ==> " << file_name << ":" << file_line << "\n");
-		_printf_(function_name << " error message: " << what() << "\n\n");
-	}
-	else{
-		_printf_("\n[" << my_rank<< "] ??? Error using ==> " << file_name << ":" << file_line << "\n");
-		_printf_(  "[" << my_rank << "] " << function_name << " error message: " << what() << "\n\n");
-	}
+	cerr <<"\n[" << this->rank<< "] ??? Error using ==> " << this->file_name << ":" << this->file_line << 
+	       "\n[" << this->rank<< "] " << this->function_name << " error message: " << what() << "\n" << endl;
 
 	return;
@@ -91,5 +79,5 @@
 
 	/*WINDOWS*/
-	if(!function_name || file_line==0){ 
+	if(!this->function_name || this->file_line==0){ 
 		buffer << " error message: " << this->what_str;
 	}
@@ -101,5 +89,7 @@
 	/*Convert std::ostringstream to std::string and then create char* */
 	std::string buffer2 = buffer.str();
-	message = xNew<char>(strlen(buffer2.c_str())+1); sprintf(message,"%s",buffer2.c_str());
+	message = new char[strlen(buffer2.c_str())+1];
+	sprintf(message,"%s",buffer2.c_str());
+
 	return message;
 }/*}}}*/
Index: /issm/trunk/src/c/shared/Exceptions/exceptions.h
===================================================================
--- /issm/trunk/src/c/shared/Exceptions/exceptions.h	(revision 27034)
+++ /issm/trunk/src/c/shared/Exceptions/exceptions.h	(revision 27035)
@@ -28,5 +28,6 @@
 #include <sstream>
 
-/*macros: */
+/*macros: (should move somewhere else)*/
+#include "../io/Comm/IssmComm.h"
 /* _assert_ {{{*/
 /*Assertion macro: do nothing if macro _ISSM_DEBUG_ undefined*/
@@ -50,5 +51,5 @@
 	do{std::ostringstream aLoNgAnDwEiRdLoCaLnAmeFoRtHiSmAcRoOnLy; \
    aLoNgAnDwEiRdLoCaLnAmeFoRtHiSmAcRoOnLy << StreamArgs << std::ends; \
-   throw ErrorException(__FILE__,__func__,__LINE__,aLoNgAnDwEiRdLoCaLnAmeFoRtHiSmAcRoOnLy.str());}while(0)
+   throw ErrorException(IssmComm::GetRank(),__FILE__,__func__,__LINE__,aLoNgAnDwEiRdLoCaLnAmeFoRtHiSmAcRoOnLy.str());}while(0)
 #endif
 /*}}}*/
@@ -78,5 +79,5 @@
 
 /*ISSM exception class: */
-class ErrorException: public exception { /*{{{*/
+class ErrorException: public exception{ /*{{{*/
 
 	char* what_str;
@@ -84,8 +85,11 @@
 	char* file_name;
 	int   file_line;
+	int   rank;
 
 	public:
-	ErrorException(const string &what_arg); //for windows
-	ErrorException(const string &what_file,const string& what_function,int what_line,const string& what_arg);//UNIX
+	/*Windows*/
+	ErrorException(const string &what_arg);
+	/*Linux/macOS*/
+	ErrorException(int what_rank,const string &what_file,const string& what_function,int what_line,const string& what_arg);
 	~ErrorException() throw();
 	virtual const char *what() const throw();
Index: /issm/trunk/src/c/shared/MemOps/MemOps.h
===================================================================
--- /issm/trunk/src/c/shared/MemOps/MemOps.h	(revision 27034)
+++ /issm/trunk/src/c/shared/MemOps/MemOps.h	(revision 27035)
@@ -151,5 +151,5 @@
 template <class T>  T* xMemCpy(T* dest, const T* src, unsigned int size) {/*{{{*/
   assert(dest); assert(src);
-  #if defined(_HAVE_ADOLC_)
+  #if defined(_HAVE_ADOLC_) || defined(_HAVE_CODIPACK_)
   for (int i=0; i<size;++i) dest[i]=src[i];
   #else
Index: /issm/trunk/src/c/shared/Random/randomgenerator.cpp
===================================================================
--- /issm/trunk/src/c/shared/Random/randomgenerator.cpp	(revision 27034)
+++ /issm/trunk/src/c/shared/Random/randomgenerator.cpp	(revision 27035)
@@ -18,5 +18,5 @@
 
       pseed = new unsigned int;
-			*pseed = std::chrono::steady_clock::now().time_since_epoch()/std::chrono::milliseconds(1);
+		*pseed = std::chrono::steady_clock::now().time_since_epoch()/std::chrono::milliseconds(1);
       a = 1103515245;		       // BSD Formula
       c = 12345;					     // BSD Formula
@@ -24,9 +24,8 @@
 			return;
 	}/*}}}*/
-
   linear_congruential_engine::linear_congruential_engine(unsigned int _a, unsigned int _b, unsigned int _m){/*{{{*/
 
       pseed = new unsigned int;
-			*pseed = std::chrono::steady_clock::now().time_since_epoch()/std::chrono::milliseconds(1);
+		*pseed = std::chrono::steady_clock::now().time_since_epoch()/std::chrono::milliseconds(1);
       a = _a;
       c = _b;
@@ -34,5 +33,4 @@
 			return;
 	}/*}}}*/
-
 	linear_congruential_engine::~linear_congruential_engine(){}
 
Index: /issm/trunk/src/c/shared/io/Marshalling/IoCodeConversions.cpp
===================================================================
--- /issm/trunk/src/c/shared/io/Marshalling/IoCodeConversions.cpp	(revision 27034)
+++ /issm/trunk/src/c/shared/io/Marshalling/IoCodeConversions.cpp	(revision 27035)
@@ -241,5 +241,5 @@
 		case 11: return SMBgradientscomponentsEnum;
 		case 12: return SMBsemicEnum;	
-		case 55: return SMBautoregressionEnum;
+		case 13: return SMBautoregressionEnum;
 		default: _error_("Marshalled SMB code \""<<enum_in<<"\" not supported yet");
 	}
@@ -255,4 +255,5 @@
 		case 7: return BasalforcingsIsmip6Enum;
 		case 8: return BeckmannGoosseFloatingMeltRateEnum;
+		case 9: return AutoregressionLinearFloatingMeltRateEnum;
 		default: _error_("Marshalled Basal Forcings code \""<<enum_in<<"\" not supported yet");
 	}
@@ -267,4 +268,6 @@
 		case 6: return CalvingCrevasseDepthEnum;
 		case 7: return CalvingDev2Enum;
+		case 9: return CalvingParameterizationEnum;
+		case 8: return CalvingTestEnum;
 		default: _error_("Marshalled Calving law code \""<<enum_in<<"\" not supported yet");
 	}
@@ -274,5 +277,5 @@
 		case 1: return FrontalForcingsDefaultEnum;
 		case 2: return FrontalForcingsRignotEnum;
-		case 55: return FrontalForcingsRignotAutoregressionEnum;
+		case 3: return FrontalForcingsRignotAutoregressionEnum;
 		default: _error_("Marshalled Frontalforcings code \""<<enum_in<<"\" not supported yet");
 	}
@@ -342,5 +345,5 @@
 		case 2: return SSAApproximationEnum;
 		case 3: return L1L2ApproximationEnum;
-		case 4: return MLHOApproximationEnum;
+		case 4: return MOLHOApproximationEnum;
 		case 5: return HOApproximationEnum;
 		case 6: return FSApproximationEnum;
@@ -357,5 +360,5 @@
 		case 2: return SSAApproximationEnum;
 		case 3: return L1L2ApproximationEnum;
-		case 4: return MLHOApproximationEnum;
+		case 4: return MOLHOApproximationEnum;
 		case 5: return HOApproximationEnum;
 		case 6: return FSApproximationEnum;
Index: /issm/trunk/src/c/shared/io/Marshalling/Marshalling.cpp
===================================================================
--- /issm/trunk/src/c/shared/io/Marshalling/Marshalling.cpp	(revision 27034)
+++ /issm/trunk/src/c/shared/io/Marshalling/Marshalling.cpp	(revision 27035)
@@ -91,5 +91,8 @@
 void RegisterInputFunctor::call(IssmDouble & value){/*{{{*/
 	_assert_(this->double_count<size_max);
-	_assert_(!xIsNan<IssmDouble>(value));
+
+	/*Comment out this assert, some parameters are NaN (e.g. abstol) by default*/
+	//_assert_(!xIsNan<IssmDouble>(value));
+
 	this->tape_codi->registerInput(value);
 	#if _CODIPACK_MAJOR_==2
@@ -137,5 +140,5 @@
 }/*}}}*/
 void RegisterOutputFunctor::call(IssmDouble & value){/*{{{*/
-	_assert_(!xIsNan<IssmDouble>(value));
+	//_assert_(!xIsNan<IssmDouble>(value));
 	this->tape_codi->registerOutput(value);
 	this->double_count++;
Index: /issm/trunk/src/c/solutionsequences/convergence.cpp
===================================================================
--- /issm/trunk/src/c/solutionsequences/convergence.cpp	(revision 27034)
+++ /issm/trunk/src/c/solutionsequences/convergence.cpp	(revision 27035)
@@ -90,6 +90,6 @@
 		//compute max(du)
 		duf=old_uf->Duplicate(); old_uf->Copy(duf); duf->AYPX(uf,-1.0);
-		ndu=duf->Norm(NORM_TWO); nduinf=duf->Norm(NORM_INF);
-		if (xIsNan<IssmDouble>(ndu) || xIsNan<IssmDouble>(nu)) _error_("convergence criterion is NaN!");
+		nduinf=duf->Norm(NORM_INF);
+		if (xIsNan<IssmDouble>(nduinf)) _error_("convergence criterion is NaN!");
 
 		//clean up
Index: /issm/trunk/src/c/solutionsequences/solutionsequence_sampling.cpp
===================================================================
--- /issm/trunk/src/c/solutionsequences/solutionsequence_sampling.cpp	(revision 27034)
+++ /issm/trunk/src/c/solutionsequences/solutionsequence_sampling.cpp	(revision 27035)
@@ -13,12 +13,7 @@
 void GaussianVector(Vector<IssmDouble>* ppf,int seed){/*{{{*/
 
-
-	/*Intermediaries*/
-	double      rdnumber;
-
 	/*Define seed*/
 	rnd::linear_congruential_engine random_engine;
-	if(seed>=0)
-	{
+	if(seed>=0){
 		int my_rank;
 		ISSM_MPI_Comm_rank(ISSM_MPI_COMM_WORLD,&my_rank);
@@ -28,5 +23,4 @@
 
 	/* Define univariate distribution */
-
 	rnd::normal_distribution distribution(0.0,1.0);
 
@@ -38,9 +32,13 @@
 	ppf->GetLocalSize(&M);
 	for(int i=0;i<M;i++){
-		rdnumber = distribution.generator(random_engine);
+		double rdnumber = distribution.generator(random_engine);
 		ppf->SetValue(local_indices[i],rdnumber,INS_VAL);
 	}
 	ppf->Assemble();
 
+	/*Cleanup*/
+	random_engine.free_resources();
+	xDelete<int>(local_indices);
+	xDelete<IssmDouble>(local_vector);
 }/*}}}*/
 void solutionsequence_sampling(FemModel* femmodel){
@@ -51,6 +49,5 @@
   Vector<IssmDouble>*  ug  = NULL;
   Vector<IssmDouble>*  uf  = NULL;
-  Vector<IssmDouble>*  old_uf  = NULL;     // previous solution vector (for transient)
-  Vector<IssmDouble>*  pf  = NULL;
+	Vector<IssmDouble>*  pf  = NULL;
   Vector<IssmDouble>*  df  = NULL;
   Vector<IssmDouble>*  ys=NULL;
@@ -62,24 +59,9 @@
 
   /*parameters:*/
-  int solution_type, alpha, step, seed, nsize;
-  IssmDouble phi, tau;
+  int alpha, seed, nsize;
 
   /*Recover parameters: */
-  femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
   femmodel->parameters->FindParam(&seed,SamplingSeedEnum);
   femmodel->parameters->FindParam(&alpha,SamplingAlphaEnum);
-  femmodel->parameters->FindParam(&tau,SamplingTauEnum);
-
-  /*Recover parameters for transient simulation: */
-  if(solution_type==TransientSolutionEnum)
-  {
-    femmodel->parameters->FindParam(&step,StepEnum);
-    femmodel->parameters->FindParam(&phi,SamplingPhiEnum);
-		if(seed>=0) seed = seed + 13923272*step; // change default seed for transient simulations (by considering an arbitrary shif based on the step number)
-
-    GetSolutionFromInputsx(&ug,femmodel);
-    Reducevectorgtofx(&uf, ug, femmodel->nodes,femmodel->parameters);
-    old_uf=uf->Duplicate();
-  }
 
   /*CreateAnalysis*/
@@ -101,7 +83,4 @@
   Reduceloadx(pf, Kfs, ys);
   delete Kfs;
-
-  /*Copy old solution for transient run */
-  if(solution_type==TransientSolutionEnum) uf->Copy(old_uf);
 
   /* Generate random RHS */
@@ -130,10 +109,4 @@
   }
 
-  /* Divide results by tau */
-  uf->Scale(1.0/tau);
-
-  /* Update solution x_{t+1} = phi x_{t} + noise for transient */
-  if(solution_type==TransientSolutionEnum) uf->AXPY(old_uf,phi);
-
   /* Update input */
   Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);
@@ -141,5 +114,5 @@
 
   /*clean-up*/
-  delete Kff; delete pf; delete df; delete uf; delete ys; delete old_uf;
+  delete Kff; delete pf; delete df; delete uf; delete ys;
   delete Ml; delete Mscale;
   delete analysis;
Index: sm/trunk/src/m/boundaryconditions/SetMLHOBC.m
===================================================================
--- /issm/trunk/src/m/boundaryconditions/SetMLHOBC.m	(revision 27034)
+++ 	(revision )
@@ -1,16 +1,0 @@
-function md=SetMLHOBC(md)
-%SETMLHOBC - Create the boundary conditions for stressbalance for MLHO: VxBase, VyBase, VxShear, VyShear
-%
-%   Usage:
-%      md=SetMLHOBC(md)
-%
-
-
-%node on Dirichlet
-if md.flowequation.isMLHO
-	md.stressbalance.spcvx_base=md.stressbalance.spcvx;
-	md.stressbalance.spcvy_base=md.stressbalance.spcvy;
-
-	md.stressbalance.spcvx_shear=NaN*ones(size(md.stressbalance.spcvx_base));
-	md.stressbalance.spcvy_shear=NaN*ones(size(md.stressbalance.spcvy_base));
-end
Index: sm/trunk/src/m/boundaryconditions/SetMLHOBC.py
===================================================================
--- /issm/trunk/src/m/boundaryconditions/SetMLHOBC.py	(revision 27034)
+++ 	(revision )
@@ -1,22 +1,0 @@
-import numpy as np
-
-
-def SetMLHOBC(md):
-    """
-    SETMLHOBC - Create the boundary conditions for stressbalance for MLHO: VxBase, VyBase, VxShear, VyShear
-
-       Usage:
-          md = SetIceShelfBC(md, varargin)
-
-       Example:
-          md = SetIceShelfBC(md)
-
-    """
-
-    #node on Dirichlet (boundary and ~icefront)
-    md.stressbalance.spcvx_base = md.stressbalance.spcvx
-    md.stressbalance.spcvy_base = md.stressbalance.spcvy
-    md.stressbalance.spcvx_shear = np.nan * md.stressbalance.spcvx
-    md.stressbalance.spcvy_shear = np.nan * md.stressbalance.spcvy
-
-    return md
Index: /issm/trunk/src/m/boundaryconditions/SetMOLHOBC.m
===================================================================
--- /issm/trunk/src/m/boundaryconditions/SetMOLHOBC.m	(revision 27035)
+++ /issm/trunk/src/m/boundaryconditions/SetMOLHOBC.m	(revision 27035)
@@ -0,0 +1,16 @@
+function md=SetMOLHOBC(md)
+%SETMOLHOBC - Create the boundary conditions for stressbalance for MOLHO: VxBase, VyBase, VxShear, VyShear
+%
+%   Usage:
+%      md=SetMOLHOBC(md)
+%
+
+
+%node on Dirichlet
+if md.flowequation.isMOLHO
+	md.stressbalance.spcvx_base=md.stressbalance.spcvx;
+	md.stressbalance.spcvy_base=md.stressbalance.spcvy;
+
+	md.stressbalance.spcvx_shear=NaN*ones(size(md.stressbalance.spcvx_base));
+	md.stressbalance.spcvy_shear=NaN*ones(size(md.stressbalance.spcvy_base));
+end
Index: /issm/trunk/src/m/boundaryconditions/SetMOLHOBC.py
===================================================================
--- /issm/trunk/src/m/boundaryconditions/SetMOLHOBC.py	(revision 27035)
+++ /issm/trunk/src/m/boundaryconditions/SetMOLHOBC.py	(revision 27035)
@@ -0,0 +1,21 @@
+import numpy as np
+
+def SetMOLHOBC(md):
+    """
+    SETMOLHOBC - Create the boundary conditions for stressbalance for MOLHO: VxBase, VyBase, VxShear, VyShear
+
+       Usage:
+          md = SetIceShelfBC(md, varargin)
+
+       Example:
+          md = SetIceShelfBC(md)
+
+    """
+
+    #node on Dirichlet (boundary and ~icefront)
+    md.stressbalance.spcvx_base = md.stressbalance.spcvx
+    md.stressbalance.spcvy_base = md.stressbalance.spcvy
+    md.stressbalance.spcvx_shear = np.nan * md.stressbalance.spcvx
+    md.stressbalance.spcvy_shear = np.nan * md.stressbalance.spcvy
+
+    return md
Index: /issm/trunk/src/m/classes/SMBautoregression.m
===================================================================
--- /issm/trunk/src/m/classes/SMBautoregression.m	(revision 27034)
+++ /issm/trunk/src/m/classes/SMBautoregression.m	(revision 27035)
@@ -14,4 +14,7 @@
 		phi               = NaN;
 		basin_id          = NaN;
+		lapserates        = NaN;
+		elevationbins     = NaN;
+		refelevation      = NaN;
 		steps_per_step    = 1;
 		averaging         = 0;
@@ -59,5 +62,5 @@
 			self.ar_order    = 0.0; %autoregression model of order 0
 		end % }}}
-		function md = checkconsistency(self,md,solution,analyses) 
+		function md = checkconsistency(self,md,solution,analyses) % {{{
 
 			if ismember('MasstransportAnalysis',analyses),
@@ -70,14 +73,32 @@
 				md = checkfield(md,'fieldname','smb.ar_timestep','numel',1,'NaN',1,'Inf',1,'>=',md.timestepping.time_step); %autoregression time step cannot be finer than ISSM timestep
 				md = checkfield(md,'fieldname','smb.phi','NaN',1,'Inf',1,'size',[md.smb.num_basins,md.smb.ar_order]);
+
+				if (any(isnan(md.smb.refelevation)==0) || numel(md.smb.refelevation)>1)
+               md = checkfield(md,'fieldname','smb.refelevation','NaN',1,'Inf',1,'>=',0,'size',[1,md.smb.num_basins],'numel',md.smb.num_basins);
+            end
+				[nbas,nbins] = size(md.smb.lapserates);
+				if (any(isnan(reshape(md.smb.lapserates,[1,nbas*nbins]))==0) || numel(md.smb.lapserates)>1)
+					md = checkfield(md,'fieldname','smb.lapserates','NaN',1,'Inf',1,'size',[md.smb.num_basins,nbins],'numel',md.smb.num_basins*nbins);
+					md = checkfield(md,'fieldname','smb.elevationbins','NaN',1,'Inf',1,'size',[md.smb.num_basins,nbins-1],'numel',md.smb.num_basins*(nbins-1));
+					if(issorted(md.smb.elevationbins,2)==0)
+						error('md.smb.elevationbins should have rows in order of increasing elevation');
+					end
+				elseif (isnan(md.smb.elevationbins(1,1))==0 || numel(md.smb.elevationbins)>1)
+					%elevationbins specified but not lapserates: this will inevitably lead to inconsistencies
+					[nbas,nbins] = size(md.smb.elevationbins);
+					nbins        = nbins+1;
+					md = checkfield(md,'fieldname','smb.lapserates','NaN',1,'Inf',1,'size',[md.smb.num_basins,nbins],'numel',md.smb.num_basins*nbins);
+					md = checkfield(md,'fieldname','smb.elevationbins','NaN',1,'Inf',1,'size',[md.smb.num_basins,nbins-1],'numel',md.smb.num_basins*(nbins-1));
+				end
 			end
 			md = checkfield(md,'fieldname','smb.steps_per_step','>=',1,'numel',[1]);
 			md = checkfield(md,'fieldname','smb.averaging','numel',[1],'values',[0 1 2]);
 			md = checkfield(md,'fieldname','smb.requested_outputs','stringrow',1);
-		end 
+		end % }}}
 		function disp(self) % {{{
 			disp(sprintf('   surface forcings parameters:'));
 			fielddisplay(self,'num_basins','number of different basins [unitless]');
 			fielddisplay(self,'basin_id','basin number assigned to each element [unitless]');
-			fielddisplay(self,'beta0','basin-specific intercept values [m ice eq./yr]');
+			fielddisplay(self,'beta0','basin-specific intercept values [m ice eq./yr] (if beta_1==0 mean=beta_0/(1-sum(phi)))');
 			fielddisplay(self,'beta1','basin-specific trend values [m ice eq. yr^(-2)]');
 			fielddisplay(self,'ar_order','order of the autoregressive model [unitless]');
@@ -85,4 +106,7 @@
 			fielddisplay(self,'ar_timestep','time resolution of the autoregressive model [yr]');
 			fielddisplay(self,'phi','basin-specific vectors of lag coefficients [unitless]');
+			fielddisplay(self,'lapserates','basin-specific SMB lapse rates applied in each elevation bin, 1 row per basin, 1 column per bin [m ice eq yr^-1 m^-1] (default: no lapse rate)');
+			fielddisplay(self,'elevationbins','basin-specific separations between elevation bins, 1 row per basin, 1 column per limit between bins [m] (default: no basin separation)');
+			fielddisplay(self,'refelevation','basin-specific reference elevations at which SMB is calculated, and from which SMB is downscaled using lapserates (default: basin mean elevation) [m]');
 			fielddisplay(self, 'steps_per_step', 'number of smb steps per time step');
 			fielddisplay(self, 'averaging', 'averaging methods from short to long steps');
@@ -97,5 +121,31 @@
 			yts=md.constants.yts;
 
-			WriteData(fid,prefix,'name','md.smb.model','data',55,'format','Integer');
+			templapserates    = md.smb.lapserates;
+			tempelevationbins = md.smb.elevationbins;
+			temprefelevation  = md.smb.refelevation;
+			[nbas,nbins]      = size(md.smb.lapserates);
+			if(any(isnan(reshape(md.smb.lapserates,[1,nbas*nbins]))))
+				templapserates = zeros(md.smb.num_basins,2);
+				disp('      smb.lapserates not specified: set to 0');
+			   tempelevationbins = zeros(md.smb.num_basins,1); %dummy elevation bins
+			end
+			if(any(isnan(md.smb.refelevation)))
+				temprefelevation = zeros(1,md.smb.num_basins);
+				areas = GetAreas(md.mesh.elements,md.mesh.x,md.mesh.y);
+				for ii=1:md.smb.num_basins
+					indices = find(md.smb.basin_id==ii);
+					elemsh  = zeros(numel(indices),1);
+					for jj=1:numel(indices)
+						elemsh(jj) = mean(md.geometry.surface(md.mesh.elements(indices(jj),:)));
+					end
+					temprefelevation(ii) = sum(areas(indices).*elemsh)/sum(areas(indices));
+				end
+				if(any(reshape(md.smb.lapserates,[1,nbas*nbins])~=0))
+					disp('      smb.refelevation not specified: Reference elevations set to mean surface elevation of basins');
+				end
+			end
+			[nbas,nbins] = size(templapserates);
+
+			WriteData(fid,prefix,'name','md.smb.model','data',13,'format','Integer');
 			WriteData(fid,prefix,'object',self,'class','smb','fieldname','num_basins','format','Integer');
 			WriteData(fid,prefix,'object',self,'class','smb','fieldname','ar_order','format','Integer');
@@ -106,4 +156,8 @@
 			WriteData(fid,prefix,'object',self,'class','smb','fieldname','beta1','format','DoubleMat','name','md.smb.beta1','scale',1./(yts^2),'yts',yts);
 			WriteData(fid,prefix,'object',self,'class','smb','fieldname','phi','format','DoubleMat','name','md.smb.phi','yts',yts); 
+			WriteData(fid,prefix,'data',templapserates,'format','DoubleMat','name','md.smb.lapserates','scale',1./yts,'yts',yts);
+			WriteData(fid,prefix,'data',tempelevationbins,'format','DoubleMat','name','md.smb.elevationbins');
+			WriteData(fid,prefix,'data',temprefelevation,'format','DoubleMat','name','md.smb.refelevation');
+			WriteData(fid,prefix,'data',nbins,'format','Integer','name','md.smb.num_bins');
 			WriteData(fid,prefix,'object',self,'fieldname','steps_per_step','format','Integer');
 			WriteData(fid,prefix,'object',self,'fieldname','averaging','format','Integer');
Index: /issm/trunk/src/m/classes/SMBautoregression.py
===================================================================
--- /issm/trunk/src/m/classes/SMBautoregression.py	(revision 27034)
+++ /issm/trunk/src/m/classes/SMBautoregression.py	(revision 27035)
@@ -5,5 +5,5 @@
 from project3d import *
 from WriteData import *
-
+from GetAreas import *
 
 class SMBautoregression(object):
@@ -23,4 +23,7 @@
         self.phi = np.nan
         self.basin_id = np.nan
+        self.lapserates = np.nan
+        self.elevationbins = np.nan
+        self.refelevation = np.nan
         self.steps_per_step = 1
         self.averaging = 0
@@ -38,5 +41,5 @@
         s += '{}\n'.format(fielddisplay(self, 'num_basins', 'number of different basins [unitless]'))
         s += '{}\n'.format(fielddisplay(self, 'basin_id', 'basin number assigned to each element [unitless]'))
-        s += '{}\n'.format(fielddisplay(self, 'beta0', 'basin-specific intercept values [m ice eq./yr]'))
+        s += '{}\n'.format(fielddisplay(self, 'beta0', 'basin-specific intercept values [m ice eq./yr] (if beta_1==0 mean=beta_0/(1-sum(phi)))'))
         s += '{}\n'.format(fielddisplay(self, 'beta1', 'basin-specific trend values [m ice eq. yr^(-2)]'))
         s += '{}\n'.format(fielddisplay(self, 'ar_order', 'order of the autoregressive model [unitless]'))
@@ -44,6 +47,7 @@
         s += '{}\n'.format(fielddisplay(self, 'ar_timestep', 'time resolution of the autoregressive model [yr]'))
         s += '{}\n'.format(fielddisplay(self, 'phi', 'basin-specific vectors of lag coefficients [unitless]'))
-        s += '{}\n'.format(fielddisplay(self, 'covmat', 'inter-basin covariance matrix for multivariate normal noise at each time step [m^2 ice eq. yr^(-2)]'))
-        s += '{}\n'.format(fielddisplay(self, 'randomflag', 'whether to apply real randomness (true) or pseudo-randomness with fixed seed (false)'))
+        s += '{}\n'.format(fielddisplay(self, 'lapserates', 'basin-specific SMB lapse rates applied in each elevation bin, 1 row per basin, 1 column per bin [m ice eq yr^-1 m^-1] (default: no lapse rate)'))
+        s += '{}\n'.format(fielddisplay(self, 'elevationbins', 'basin-specific SMB lapse rates applied in range of SMB<0 [m ice eq yr^-1 m^-1] (default: no lapse rate)'))
+        s += '{}\n'.format(fielddisplay(self, 'refelevation', 'basin-specific reference elevations at which SMB is calculated, and from which SMB is downscaled using lapserates (default: basin mean elevation) [m]'))
         s += '{}\n'.format(fielddisplay(self, 'steps_per_step', 'number of smb steps per time step'))
         s += '{}\n'.format(fielddisplay(self, 'averaging', 'averaging methods from short to long steps'))
@@ -91,4 +95,7 @@
             md = checkfield(md, 'fieldname', 'smb.num_basins', 'numel', 1, 'NaN', 1, 'Inf', 1, '>', 0)
             md = checkfield(md, 'fieldname', 'smb.basin_id', 'Inf', 1, '>=', 0, '<=', md.smb.num_basins, 'size', [md.mesh.numberofelements])
+            if len(np.shape(self.beta0)) == 1:
+                self.beta0 = np.array([self.beta0])
+                self.beta1 = np.array([self.beta1])
             md = checkfield(md, 'fieldname', 'smb.beta0', 'NaN', 1, 'Inf', 1, 'size', [1, md.smb.num_basins], 'numel', md.smb.num_basins) # Scheme fails if passed as column vector
             md = checkfield(md, 'fieldname', 'smb.beta1', 'NaN', 1, 'Inf', 1, 'size', [1, md.smb.num_basins], 'numel', md.smb.num_basins) # Scheme fails if passed as column vector; NOTE: As opposed to MATLAB implementation, pass list
@@ -97,4 +104,33 @@
             md = checkfield(md, 'fieldname', 'smb.ar_timestep', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', md.timestepping.time_step) # Autoregression time step cannot be finer than ISSM timestep
             md = checkfield(md, 'fieldname', 'smb.phi', 'NaN', 1, 'Inf', 1, 'size', [md.smb.num_basins, md.smb.ar_order])
+            
+            if(np.any(np.isnan(self.refelevation) is False) or np.size(self.refelevation) > 1):
+                if len(np.shape(self.refelevation)) == 1:
+                    self.refelevation = np.array([self.refelevation])
+                md = checkfield(md, 'fieldname', 'smb.refelevation', 'NaN', 1, 'Inf', 1, '>=', 0, 'size', [1, md.smb.num_basins], 'numel', md.smb.num_basins)
+
+            if(np.any(np.isnan(self.lapserates) is False) or np.size(self.lapserates) > 1):
+                if len(np.shape(self.lapserates)) == 1:
+                    self.lapserates = np.array([self.lapserates])
+                    nbins = 1
+                else:
+                    nbins = np.shape(self.lapserates)[1]
+                if len(np.shape(self.elevationbins)) == 1:
+                    self.elevationbins = np.array([self.elevationbins])
+                md = checkfield(md, 'fieldname', 'smb.lapserates', 'NaN', 1, 'Inf', 1, 'size', [md.smb.num_basins, nbins], 'numel', md.smb.num_basins*nbins)
+                md = checkfield(md, 'fieldname', 'smb.elevationbins', 'NaN', 1, 'Inf', 1, 'size', [md.smb.num_basins, nbins-1], 'numel', md.smb.num_basins*(nbins-1))
+                for rr in range(md.smb.num_basins):
+                    if(np.all(self.elevationbins[rr,0:-1]<=self.elevationbins[rr,1:])==False):
+                        raise TypeError('md.smb.elevationbins should have rows in order of increasing elevation')
+            elif(np.any(np.isnan(self.elevationbins) is False) or np.size(self.elevationbins) > 1):
+                #elevationbins specified but not lapserates: this will inevitably lead to inconsistencies
+                if len(np.shape(self.elevationbins)) == 1:
+                    self.elevationbins = np.array([self.elevationbins])
+                    nbins = 1
+                else:
+                    nbins = np.shape(self.elevationbins)[1]+1
+                md = checkfield(md, 'fieldname', 'smb.lapserates', 'NaN', 1, 'Inf', 1, 'size', [md.smb.num_basins, nbins], 'numel', md.smb.num_basins*nbins)
+                md = checkfield(md, 'fieldname', 'smb.elevationbins', 'NaN', 1, 'Inf', 1, 'size', [md.smb.num_basins, nbins-1], 'numel', md.smb.num_basins*(nbins-1))
+
         md = checkfield(md, 'fieldname', 'smb.steps_per_step', '>=', 1, 'numel', [1])
         md = checkfield(md, 'fieldname', 'smb.averaging', 'numel', [1], 'values', [0, 1, 2])
@@ -106,13 +142,37 @@
         yts = md.constants.yts
 
-        WriteData(fid, prefix, 'name', 'md.smb.model', 'data', 55, 'format', 'Integer')
+        templapserates    = np.copy(md.smb.lapserates)
+        tempelevationbins = np.copy(md.smb.elevationbins)
+        temprefelevation  = np.copy(md.smb.refelevation)
+        if(np.any(np.isnan(md.smb.lapserates))):
+            templapserates = np.zeros((md.smb.num_basins,2))
+            print('      smb.lapserates not specified: set to 0')
+            tempelevationbins = np.zeros((md.smb.num_basins,1)) #dummy elevation bins
+        if(np.any(np.isnan(md.smb.refelevation))):
+            temprefelevation = np.zeros((md.smb.num_basins)).reshape(1,md.smb.num_basins)
+            areas = GetAreas(md.mesh.elements, md.mesh.x, md.mesh.y)
+            for ii, bid in enumerate(np.unique(md.smb.basin_id)):
+                indices = np.where(md.smb.basin_id == bid)[0]
+                elemsh = np.zeros((len(indices)))
+                for jj in range(len(indices)):
+                    elemsh[jj] = np.mean(md.geometry.surface[md.mesh.elements[indices[jj], :] - 1])
+                temprefelevation[0, ii] = np.sum(areas[indices] * elemsh) / np.sum(areas[indices])
+            if(np.any(templapserates != 0)):
+                print('      smb.refelevation not specified: Reference elevations set to mean surface elevation of basins')
+        nbins = np.shape(templapserates)[1]
+
+        WriteData(fid, prefix, 'name', 'md.smb.model', 'data', 13, 'format', 'Integer')
         WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'num_basins', 'format', 'Integer')
         WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'ar_order', 'format', 'Integer')
         WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'ar_initialtime', 'format', 'Double', 'scale', yts)
         WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'ar_timestep', 'format', 'Double', 'scale', yts)
-        WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'basin_id', 'data', self.basin_id, 'name', 'md.smb.basin_id', 'format', 'IntMat', 'mattype', 2) # 0-indexed
+        WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'basin_id', 'data', self.basin_id - 1, 'name', 'md.smb.basin_id', 'format', 'IntMat', 'mattype', 2)  # 0-indexed
         WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'beta0', 'format', 'DoubleMat', 'name', 'md.smb.beta0', 'scale', 1 / yts, 'yts', yts)
         WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'beta1', 'format', 'DoubleMat', 'name', 'md.smb.beta1', 'scale', 1 / (yts ** 2), 'yts', yts)
         WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'phi', 'format', 'DoubleMat', 'name', 'md.smb.phi', 'yts', yts)
+        WriteData(fid, prefix, 'data', templapserates, 'name', 'md.smb.lapserates', 'format', 'DoubleMat', 'scale', 1 / yts, 'yts', yts)
+        WriteData(fid, prefix, 'data', tempelevationbins, 'name', 'md.smb.elevationbins', 'format', 'DoubleMat')
+        WriteData(fid, prefix, 'data', temprefelevation, 'name', 'md.smb.refelevation', 'format', 'DoubleMat')
+        WriteData(fid, prefix, 'data', nbins, 'name', 'md.smb.num_bins', 'format', 'Integer')
         WriteData(fid, prefix, 'object', self, 'fieldname', 'steps_per_step', 'format', 'Integer')
         WriteData(fid, prefix, 'object', self, 'fieldname', 'averaging', 'format', 'Integer')
Index: /issm/trunk/src/m/classes/SMBpddSicopolis.py
===================================================================
--- /issm/trunk/src/m/classes/SMBpddSicopolis.py	(revision 27034)
+++ /issm/trunk/src/m/classes/SMBpddSicopolis.py	(revision 27035)
@@ -129,5 +129,5 @@
         WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 's0t', 'format', 'DoubleMat', 'mattype', 1)
         WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'rlaps', 'format', 'Double')
-        WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'monthlytemperatures', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', md.constants.yts)
+        WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'monthlytemperatures', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts)
         WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'precipitation', 'format', 'DoubleMat', 'mattype', 1, 'scale', 1. / yts, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts)
         WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'temperature_anomaly', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts)
Index: /issm/trunk/src/m/classes/autoregressionlinearbasalforcings.m
===================================================================
--- /issm/trunk/src/m/classes/autoregressionlinearbasalforcings.m	(revision 27035)
+++ /issm/trunk/src/m/classes/autoregressionlinearbasalforcings.m	(revision 27035)
@@ -0,0 +1,117 @@
+%AUTOREGRESSION LINEAR BASAL FORCINGS class definition
+%
+%   Usage:
+%      autoregressionlinearbasalforcings=spatiallinearbasalforcings();
+
+classdef autoregressionlinearbasalforcings
+	
+	%VV: not verified yet (27Jan2022)
+	
+	properties (SetAccess=public) 
+		num_basins                = 0;
+		beta0                     = NaN;
+      beta1                     = NaN;
+      ar_order                  = 0;
+      ar_initialtime            = 0;
+      ar_timestep               = 0;
+      phi                       = NaN;
+      basin_id                  = NaN;
+		groundedice_melting_rate  = NaN;
+		deepwater_elevation       = NaN;
+		upperwater_melting_rate   = NaN;
+		upperwater_elevation      = NaN;
+		geothermalflux            = NaN;
+	end
+	methods
+		function self = autoregressionlinearbasalforcings(varargin) % {{{
+			switch nargin
+				case 0
+					self=setdefaultparameters(self);
+				otherwise
+					error('constructor not supported');
+			end
+		end % }}}
+		function self = extrude(self,md) % {{{
+			self.groundedice_melting_rate=project3d(md,'vector',self.groundedice_melting_rate,'type','node','layer',1); 
+			self.deepwater_elevation=project3d(md,'vector',self.deepwater_elevation,'type','node','layer',1); 
+			self.upperwater_melting_rate=project3d(md,'vector',self.upperwater_melting_rate,'type','node','layer',1); 
+			self.upperwater_elevation=project3d(md,'vector',self.upperwater_elevation,'type','node','layer',1); 
+			self.geothermalflux=project3d(md,'vector',self.geothermalflux,'type','node','layer',1); %bedrock only gets geothermal flux
+		end % }}}
+		function self = initialize(self,md) % {{{
+
+			if isnan(self.groundedice_melting_rate),
+				self.groundedice_melting_rate=zeros(md.mesh.numberofvertices,1);
+				disp('      no basalforcings.groundedice_melting_rate specified: values set as zero');
+			end
+
+		end % }}}
+		function self = setdefaultparameters(self) % {{{
+			%Nothing for now
+		end % }}}
+		function md = checkconsistency(self,md,solution,analyses) % {{{
+
+			if ismember('MasstransportAnalysis',analyses) & ~(strcmp(solution,'TransientSolution') & md.transient.ismasstransport==0),
+				md = checkfield(md,'fieldname','basalforcings.num_basins','numel',1,'NaN',1,'Inf',1,'>',0);
+				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'Inf',1,'timeseries',1);
+				md = checkfield(md,'fieldname','basalforcings.deepwater_elevation','NaN',1,'Inf',1,'size',[1,md.basalforcings.num_basins],'numel',md.basalforcings.num_basins);
+				md = checkfield(md,'fieldname','basalforcings.upperwater_melting_rate','NaN',1,'Inf',1,'>=',0,'size',[1,md.basalforcings.num_basins],'numel',md.basalforcings.num_basins);
+				md = checkfield(md,'fieldname','basalforcings.upperwater_elevation','NaN',1,'Inf',1,'<=',0,'size',[1,md.basalforcings.num_basins],'numel',md.basalforcings.num_basins);
+            md = checkfield(md,'fieldname','basalforcings.basin_id','Inf',1,'>=',0,'<=',md.basalforcings.num_basins,'size',[md.mesh.numberofelements,1]);
+            md = checkfield(md,'fieldname','basalforcings.beta0','NaN',1,'Inf',1,'size',[1,md.basalforcings.num_basins],'numel',md.basalforcings.num_basins); 
+				md = checkfield(md,'fieldname','basalforcings.beta1','NaN',1,'Inf',1,'size',[1,md.basalforcings.num_basins],'numel',md.basalforcings.num_basins); 
+				md = checkfield(md,'fieldname','basalforcings.ar_order','numel',1,'NaN',1,'Inf',1,'>=',0);
+            md = checkfield(md,'fieldname','basalforcings.ar_initialtime','numel',1,'NaN',1,'Inf',1);
+            md = checkfield(md,'fieldname','basalforcings.ar_timestep','numel',1,'NaN',1,'Inf',1,'>=',md.timestepping.time_step); %autoregression time step cannot be finer than ISSM timestep
+            md = checkfield(md,'fieldname','basalforcings.phi','NaN',1,'Inf',1,'size',[md.basalforcings.num_basins,md.basalforcings.ar_order]);
+			end
+			if ismember('BalancethicknessAnalysis',analyses),
+				error('not implemented yet!');
+			end
+			if ismember('ThermalAnalysis',analyses) & ~(strcmp(solution,'TransientSolution') & md.transient.isthermal==0),
+				error('not implemented yet!');
+			end
+			if numel(md.basalforcings.geothermalflux)>1
+            md = checkfield(md,'fieldname','basalforcings.geothermalflux','NaN',1,'Inf',1,'timeseries',1,'>=',0);
+         end
+		end % }}}
+		function disp(self) % {{{
+			disp(sprintf('   autoregression linear basal forcings parameters:'));
+			disp(sprintf('   autoregressive model is applied for deepwater_melting_rate'));
+
+			fielddisplay(self,'num_basins','number of different basins [unitless]');
+         fielddisplay(self,'basin_id','basin number assigned to each element [unitless]');
+         fielddisplay(self,'beta0','basin-specific intercept values [m/yr] (if beta_1==0 mean=beta_0/(1-sum(phi)))');
+         fielddisplay(self,'beta1','basin-specific trend values [m  yr^(-2)]');
+         fielddisplay(self,'ar_order','order of the autoregressive model [unitless]');
+         fielddisplay(self,'ar_initialtime','initial time assumed in the autoregressive model parameterization [yr]');
+         fielddisplay(self,'ar_timestep','time resolution of the autoregressive model [yr]');
+         fielddisplay(self,'phi','basin-specific vectors of lag coefficients [unitless]');
+			fielddisplay(self,'deepwater_elevation','basin-specific elevation of ocean deepwater [m]');
+			fielddisplay(self,'upperwater_melting_rate','basin-specific basal melting rate (positive if melting applied for floating ice whith base >= upperwater_elevation) [m/yr]');
+			fielddisplay(self,'upperwater_elevation','basin-specific elevation of ocean upperwater [m]');
+			fielddisplay(self,'groundedice_melting_rate','node-specific basal melting rate (positive if melting) [m/yr]');
+			fielddisplay(self,'geothermalflux','node-specific geothermal heat flux [W/m^2]');
+
+		end % }}}
+		function marshall(self,prefix,md,fid) % {{{
+
+			yts=md.constants.yts;
+
+			WriteData(fid,prefix,'name','md.basalforcings.model','data',9,'format','Integer');
+			WriteData(fid,prefix,'object',self,'fieldname','groundedice_melting_rate','format','DoubleMat','name','md.basalforcings.groundedice_melting_rate','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
+			WriteData(fid,prefix,'object',self,'fieldname','geothermalflux','name','md.basalforcings.geothermalflux','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
+			WriteData(fid,prefix,'object',self,'fieldname','num_basins','format','Integer');
+         WriteData(fid,prefix,'object',self,'fieldname','ar_order','format','Integer');
+         WriteData(fid,prefix,'object',self,'fieldname','ar_initialtime','format','Double','scale',yts);
+         WriteData(fid,prefix,'object',self,'fieldname','ar_timestep','format','Double','scale',yts);
+         WriteData(fid,prefix,'object',self,'fieldname','basin_id','data',self.basin_id-1,'name','md.basalforcings.basin_id','format','IntMat','mattype',2); %0-indexed
+         WriteData(fid,prefix,'object',self,'fieldname','beta0','format','DoubleMat','name','md.basalforcings.beta0','scale',1./yts,'yts',yts);
+         WriteData(fid,prefix,'object',self,'fieldname','beta1','format','DoubleMat','name','md.basalforcings.beta1','scale',1./(yts^2),'yts',yts);
+         WriteData(fid,prefix,'object',self,'fieldname','phi','format','DoubleMat','name','md.basalforcings.phi','yts',yts);	
+			WriteData(fid,prefix,'object',self,'fieldname','deepwater_elevation','format','DoubleMat','name','md.basalforcings.deepwater_elevation');
+			WriteData(fid,prefix,'object',self,'fieldname','upperwater_melting_rate','format','DoubleMat','name','md.basalforcings.upperwater_melting_rate','scale',1./yts);
+			WriteData(fid,prefix,'object',self,'fieldname','upperwater_elevation','format','DoubleMat','name','md.basalforcings.upperwater_elevation');
+		end % }}}
+	end
+end
Index: /issm/trunk/src/m/classes/autoregressionlinearbasalforcings.py
===================================================================
--- /issm/trunk/src/m/classes/autoregressionlinearbasalforcings.py	(revision 27035)
+++ /issm/trunk/src/m/classes/autoregressionlinearbasalforcings.py	(revision 27035)
@@ -0,0 +1,122 @@
+import numpy as np
+
+from checkfield import *
+from fielddisplay import fielddisplay
+from project3d import *
+from WriteData import *
+
+class autoregressionlinearbasalforcings(object):
+    """autoregressionlinearbasalforcings class definition
+
+    Usage:
+        autoregressionlinearbasalforcings = autoregressionlinearbasalforcings()
+    """
+
+    def __init__(self, *args):  # {{{
+        self.num_basins = 0
+        self.beta0 = np.nan
+        self.beta1 = np.nan
+        self.ar_order = 0
+        self.ar_initialtime = 0
+        self.ar_timestep = 0
+        self.phi = np.nan
+        self.basin_id = np.nan
+        self.groundedice_melting_rate = np.nan
+        self.deepwater_elevation = np.nan
+        self.upperwater_melting_rate = np.nan
+        self.upperwater_elevation = np.nan
+        self.geothermalflux = np.nan
+
+        nargs = len(args)
+        if nargs == 0:
+            self.setdefaultparameters()
+        else:
+            raise Exception('constructor not supported')
+    # }}}
+
+    def __repr__(self):  # {{{
+        s = '   surface forcings parameters:\n'
+        s += '   autoregressive model is applied for deepwater_melting_rate\n'
+        s += '{}\n'.format(fielddisplay(self, 'num_basins', 'number of different basins [unitless]'))
+        s += '{}\n'.format(fielddisplay(self, 'basin_id', 'basin number assigned to each element [unitless]'))
+        s += '{}\n'.format(fielddisplay(self, 'beta0', 'basin-specific intercept values [m ice eq./yr] (if beta_1==0 mean=beta_0/(1-sum(phi)))'))
+        s += '{}\n'.format(fielddisplay(self, 'beta1', 'basin-specific trend values [m ice eq. yr^(-2)]'))
+        s += '{}\n'.format(fielddisplay(self, 'ar_order', 'order of the autoregressive model [unitless]'))
+        s += '{}\n'.format(fielddisplay(self, 'ar_initialtime', 'initial time assumed in the autoregressive model parameterization [yr]'))
+        s += '{}\n'.format(fielddisplay(self, 'ar_timestep', 'time resolution of the autoregressive model [yr]'))
+        s += '{}\n'.format(fielddisplay(self, 'phi', 'basin-specific vectors of lag coefficients [unitless]'))
+        s += '{}\n'.format(fielddisplay(self, 'deepwater_elevation', 'basin-specific elevation of ocean deepwater [m]'))
+        s += '{}\n'.format(fielddisplay(self, 'upperwater_melting_rate', 'basin-specic basal melting rate (positive if melting applied for floating ice whith base >= upperwater_elevation) [m/yr]'))
+        s += '{}\n'.format(fielddisplay(self, 'upperwater_elevation', 'basin-specific elevation of ocean upperwater [m]'))
+        s += '{}\n'.format(fielddisplay(self, 'groundedice_melting_rate','node-specific basal melting rate (positive if melting) [m/yr]'))
+        s += '{}\n'.format(fielddisplay(self, 'geothermalflux','node-specific geothermal heat flux [W/m^2]'))
+        return s
+    # }}}
+
+    def setdefaultparameters(self): #{{{
+        #Nothing for now
+        return self
+    # }}}
+
+    def extrude(self, md):  # {{{
+        return self # Nothing for now
+    # }}}
+
+    def initialize(self, md):  # {{{
+        if np.all(np.isnan(self.groundedice_melting_rate)):
+            self.groundedice_melting_rate = np.zeros((md.mesh.numberofvertices))
+            print("      no basalforcings.groundedice_melting_rate specified: values set as zero")
+        return self
+    # }}}
+
+    def checkconsistency(self, md, solution, analyses):  # {{{
+        if 'MasstransportAnalysis' in analyses:
+            md = checkfield(md, 'fieldname', 'basalforcings.num_basins', 'numel', 1, 'NaN', 1, 'Inf', 1, '>', 0)
+            md = checkfield(md, 'fieldname', 'basalforcings.groundedice_melting_rate', 'NaN', 1, 'Inf', 1, 'timeseries', 1)
+
+            if len(np.shape(self.deepwater_elevation)) == 1:
+                self.deepwater_elevation = np.array([self.deepwater_elevation])
+                self.upperwater_elevation = np.array([self.upperwater_elevation])
+                self.upperwater_melting_rate = np.array([self.upperwater_melting_rate])
+            md = checkfield(md, 'fieldname', 'basalforcings.deepwater_elevation', 'NaN', 1, 'Inf', 1, 'size', [1, md.basalforcings.num_basins], 'numel', md.basalforcings.num_basins)
+            md = checkfield(md, 'fieldname', 'basalforcings.upperwater_elevation', 'NaN', 1, 'Inf', 1, '<=', 0, 'size', [1, md.basalforcings.num_basins], 'numel', md.basalforcings.num_basins)
+            md = checkfield(md, 'fieldname', 'basalforcings.upperwater_melting_rate', 'NaN', 1, 'Inf', 1,'>=', 0, 'size', [1, md.basalforcings.num_basins], 'numel', md.basalforcings.num_basins)
+            md = checkfield(md, 'fieldname', 'basalforcings.basin_id', 'Inf', 1, '>=', 0, '<=', md.basalforcings.num_basins, 'size', [md.mesh.numberofelements])
+
+            if len(np.shape(self.beta0)) == 1:
+                self.beta0 = np.array([self.beta0])
+                self.beta1 = np.array([self.beta1])
+
+            md = checkfield(md, 'fieldname', 'basalforcings.beta0', 'NaN', 1, 'Inf', 1, 'size', [1, md.basalforcings.num_basins], 'numel', md.basalforcings.num_basins) # Scheme fails if passed as column vector
+            md = checkfield(md, 'fieldname', 'basalforcings.beta1', 'NaN', 1, 'Inf', 1, 'size', [1, md.basalforcings.num_basins], 'numel', md.basalforcings.num_basins) # Scheme fails if passed as column vector; NOTE: As opposed to MATLAB implementation, pass list
+            md = checkfield(md, 'fieldname', 'basalforcings.ar_order', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', 0)
+            md = checkfield(md, 'fieldname', 'basalforcings.ar_initialtime', 'numel', 1, 'NaN', 1, 'Inf', 1)
+            md = checkfield(md, 'fieldname', 'basalforcings.ar_timestep', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', md.timestepping.time_step) # Autoregression time step cannot be finer than ISSM timestep
+            md = checkfield(md, 'fieldname', 'basalforcings.phi', 'NaN', 1, 'Inf', 1, 'size', [md.basalforcings.num_basins, md.basalforcings.ar_order])
+        if 'BalancethicknessAnalysis' in analyses:
+            raise Exception('not implemented yet!')
+        if 'ThermalAnalysis' in analyses and not solution == 'TransientSolution' and not md.transient.isthermal:
+            raise Exception('not implemented yet!')
+
+        return md
+    # }}}
+
+    def marshall(self, prefix, md, fid):  # {{{
+        yts = md.constants.yts
+
+        WriteData(fid, prefix, 'name', 'md.basalforcings.model', 'data', 9, 'format', 'Integer')
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'groundedice_melting_rate', 'name', 'md.basalforcings.groundedice_melting_rate', 'format', 'DoubleMat', 'mattype', 1, 'scale', 1. / yts, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts)
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'geothermalflux', 'name', 'md.basalforcings.geothermalflux', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts)
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'num_basins', 'format', 'Integer')
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'ar_order', 'format', 'Integer')
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'ar_initialtime', 'format', 'Double', 'scale', yts)
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'ar_timestep', 'format', 'Double', 'scale', yts)
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'basin_id', 'data', self.basin_id - 1, 'name', 'md.basalforcings.basin_id', 'format', 'IntMat', 'mattype', 2)  # 0-indexed
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'beta0', 'format', 'DoubleMat', 'name', 'md.basalforcings.beta0', 'scale', 1 / yts, 'yts', yts)
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'beta1', 'format', 'DoubleMat', 'name', 'md.basalforcings.beta1', 'scale', 1 / (yts ** 2), 'yts', yts)
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'phi', 'format', 'DoubleMat', 'name', 'md.basalforcings.phi', 'yts', yts)
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'deepwater_elevation', 'format', 'DoubleMat', 'name', 'md.basalforcings.deepwater_elevation')
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'upperwater_melting_rate', 'format', 'DoubleMat', 'name', 'md.basalforcings.upperwater_melting_rate', 'scale', 1 / yts, 'yts', yts)
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'upperwater_elevation', 'format', 'DoubleMat', 'name', 'md.basalforcings.upperwater_elevation')
+
+    # }}}
Index: /issm/trunk/src/m/classes/basalforcings.m
===================================================================
--- /issm/trunk/src/m/classes/basalforcings.m	(revision 27034)
+++ /issm/trunk/src/m/classes/basalforcings.m	(revision 27035)
@@ -15,4 +15,6 @@
 				case 0
 					self=setdefaultparameters(self);
+				case 1
+					self =structtoobj(basalforcings(),varargin{1});
 				otherwise
 					error('constructor not supported');
Index: /issm/trunk/src/m/classes/calvingparameterization.m
===================================================================
--- /issm/trunk/src/m/classes/calvingparameterization.m	(revision 27035)
+++ /issm/trunk/src/m/classes/calvingparameterization.m	(revision 27035)
@@ -0,0 +1,98 @@
+%CALVINGPARAMETERIZATION class definition
+%	For test calving laws and coefficients
+%   Usage:
+%      calvingparameterization=calvingparameterization();
+
+classdef calvingparameterization
+	properties (SetAccess=public) 
+		stress_threshold_groundedice = 0.;
+		stress_threshold_floatingice = 0.;
+		min_thickness = 0.;
+		use_param = 0;
+		scale_theta = 0.;
+		amp_alpha = 0;
+		midp = 0;
+		nonlinearlaw = 0;
+	end
+	methods
+		function self = calvingparameterization(varargin) % {{{
+			switch nargin
+				case 0
+					self=setdefaultparameters(self);
+				case 1
+					inputstruct=varargin{1};
+					list1 = properties('calvingparameterization');
+					list2 = fieldnames(inputstruct);
+					for i=1:length(list1)
+						fieldname = list1{i};
+						if ismember(fieldname,list2),
+							self.(fieldname) = inputstruct.(fieldname);
+						end
+					end
+				otherwise
+					error('constructor not supported');
+			end
+		end % }}}
+		function self = extrude(self,md) % {{{
+		end % }}}
+		function self = setdefaultparameters(self) % {{{
+
+			%Default sigma max
+			self.stress_threshold_groundedice = 1e6;
+			self.stress_threshold_floatingice = 150e3;
+
+			%For now we turn this off by setting the threshold to 0
+			self.min_thickness = 0.;
+
+			%parameters for the spatial temporal seperation 
+			%The coefficient follows: \gamma = \frac{\theta}{2}(1-\tanh(\frac{b+p}{\alpha}))+(1-\theta)
+			% 0 - Use bed elevation, 1 - use heigh above floatation
+			self.use_param = 0;
+			% between 0 and 1, larger theta means more reduction for shallower ice
+			self.scale_theta = 0;
+			% alpha in the denominator
+			self.amp_alpha = 0;
+			% mid-point of this step function
+			self.midp = 0;
+			% if use a nonlinear calving law
+			self.nonlinearlaw = 0;
+		end % }}}
+		function md = checkconsistency(self,md,solution,analyses) % {{{
+			%Early return
+			if (~strcmp(solution,'TransientSolution') | md.transient.ismovingfront==0), return; end
+
+			md = checkfield(md,'fieldname','calving.stress_threshold_groundedice','>',0,'nan',1,'Inf',1);
+			md = checkfield(md,'fieldname','calving.stress_threshold_floatingice','>',0,'nan',1,'Inf',1);
+			md = checkfield(md,'fieldname','calving.min_thickness','>=',0,'NaN',1,'Inf',1,'numel',1);
+			md = checkfield(md,'fieldname','calving.use_param','values',[-1, 0, 1, 2, 3, 4]);
+			md = checkfield(md,'fieldname','calving.scale_theta','NaN',1,'Inf',1,'numel',1);
+			md = checkfield(md,'fieldname','calving.amp_alpha','<>',0,'NaN',1,'Inf',1,'numel',1);
+			md = checkfield(md,'fieldname','calving.midp','NaN',1,'Inf',1,'numel',1);
+			md = checkfield(md,'fieldname','calving.nonlinearlaw','values',[0, 1]);
+		end % }}}
+		function disp(self) % {{{
+			disp(sprintf('   Calving test parameters:'));
+			fielddisplay(self,'stress_threshold_groundedice','sigma_max applied to grounded ice only [Pa]');
+			fielddisplay(self,'stress_threshold_floatingice','sigma_max applied to floating ice only [Pa]');
+			fielddisplay(self,'min_thickness','minimum thickness below which no ice is allowed [m]');
+			fielddisplay(self,'use_param','0 - Use bed elevation, 1 - use heigh above floatation, 2 - use ice thickness');
+			fielddisplay(self,'scale_theta','larger than 0, larger theta means more reduction for shallower ice');
+			fielddisplay(self,'amp_alpha','alpha');
+			fielddisplay(self,'midp','mid-point');
+			fielddisplay(self,'nonlinearlaw','use a nonlinear law');
+
+		end % }}}
+		function marshall(self,prefix,md,fid) % {{{
+			yts=md.constants.yts;
+			WriteData(fid,prefix,'name','md.calving.law','data',9,'format','Integer');
+			WriteData(fid,prefix,'object',self,'fieldname','stress_threshold_groundedice','format','DoubleMat','mattype',1);
+			WriteData(fid,prefix,'object',self,'fieldname','stress_threshold_floatingice','format','DoubleMat','mattype',1);
+			WriteData(fid,prefix,'object',self,'fieldname','min_thickness','format','Double');
+			WriteData(fid,prefix,'object',self,'fieldname','use_param','format','Integer');
+			WriteData(fid,prefix,'object',self,'fieldname','scale_theta','format','Double');
+			WriteData(fid,prefix,'object',self,'fieldname','amp_alpha','format','Double');
+			WriteData(fid,prefix,'object',self,'fieldname','midp','format','Double');
+			WriteData(fid,prefix,'object',self,'fieldname','nonlinearlaw','format','Integer');
+		end % }}}
+	end
+end
Index: /issm/trunk/src/m/classes/calvingtest.m
===================================================================
--- /issm/trunk/src/m/classes/calvingtest.m	(revision 27035)
+++ /issm/trunk/src/m/classes/calvingtest.m	(revision 27035)
@@ -0,0 +1,54 @@
+%CALVINGTEST class definition
+%  For testing calving laws and coefficients
+%   Usage:
+%      calvingtest=calvingtest();
+
+classdef calvingtest
+	properties (SetAccess=public)
+		speedfactor = 1;
+		independentrate = 0;
+	end
+	methods
+		function self = calvingtest(varargin) % {{{
+			switch nargin
+				case 0
+					self=setdefaultparameters(self);
+				case 1
+					inputstruct=varargin{1};
+					list1 = properties('calvingtest');
+					list2 = fieldnames(inputstruct);
+					for i=1:length(list1)
+						fieldname = list1{i};
+						if ismember(fieldname,list2),
+							self.(fieldname) = inputstruct.(fieldname);
+						end
+					end
+				otherwise
+					error('constructor not supported');
+			end
+		end % }}}
+		function self = extrude(self,md) % {{{
+		end % }}}
+		function self = setdefaultparameters(self) % {{{
+			self.speedfactor = 1;
+			self.independentrate = 0;
+		end % }}}
+		function md = checkconsistency(self,md,solution,analyses) % {{{
+			%Early return
+			if (~strcmp(solution,'TransientSolution') | md.transient.ismovingfront==0), return; end
+			md = checkfield(md,'fieldname','calving.speedfactor','>=',0,'NaN',1,'Inf',1, 'singletimeseries', 1);
+			md = checkfield(md,'fieldname','calving.independentrate','NaN',1,'Inf',1, 'singletimeseries', 1);
+		end % }}}
+		function disp(self) % {{{
+			disp(sprintf('   Calving test parameters:'));
+			fielddisplay(self,'speedfactor','calving rate is proportional to the ice velocity (e.g. speedfactor=1 -> calving front should not move)');
+			fielddisplay(self,'independentrate','calving rate is independent of the ice velocity.');
+		end % }}}
+		function marshall(self,prefix,md,fid) % {{{
+			yts=md.constants.yts;
+			WriteData(fid,prefix,'name','md.calving.law','data',8,'format','Integer');
+			WriteData(fid,prefix,'object',self,'fieldname','speedfactor','format','DoubleMat','mattype',1,'timeserieslength',2,'yts',md.constants.yts);
+			WriteData(fid,prefix,'object',self,'fieldname','independentrate','format','DoubleMat','mattype',1,'timeserieslength',2,'yts',md.constants.yts,'scale',1./yts);
+		end % }}}
+	end
+end
Index: /issm/trunk/src/m/classes/calvingvonmises.m
===================================================================
--- /issm/trunk/src/m/classes/calvingvonmises.m	(revision 27034)
+++ /issm/trunk/src/m/classes/calvingvonmises.m	(revision 27035)
@@ -44,6 +44,6 @@
 			if (~strcmp(solution,'TransientSolution') | md.transient.ismovingfront==0), return; end
 
-			md = checkfield(md,'fieldname','calving.stress_threshold_groundedice','>',0,'NaN',1,'Inf',1);
-			md = checkfield(md,'fieldname','calving.stress_threshold_floatingice','>',0,'NaN',1,'Inf',1);
+			md = checkfield(md,'fieldname','calving.stress_threshold_groundedice','>',0,'NaN',1,'Inf',1,'size','universal');
+			md = checkfield(md,'fieldname','calving.stress_threshold_floatingice','>',0,'NaN',1,'Inf',1,'size','universal');
 			md = checkfield(md,'fieldname','calving.min_thickness','>=',0,'NaN',1,'Inf',1,'numel',1);
 		end % }}}
@@ -58,6 +58,6 @@
 			yts=md.constants.yts;
 			WriteData(fid,prefix,'name','md.calving.law','data',2,'format','Integer');
-			WriteData(fid,prefix,'object',self,'fieldname','stress_threshold_groundedice','format','DoubleMat','mattype',1);
-			WriteData(fid,prefix,'object',self,'fieldname','stress_threshold_floatingice','format','DoubleMat','mattype',1);
+			WriteData(fid,prefix,'object',self,'fieldname','stress_threshold_groundedice','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
+			WriteData(fid,prefix,'object',self,'fieldname','stress_threshold_floatingice','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
 			WriteData(fid,prefix,'object',self,'fieldname','min_thickness','format','Double');
 		end % }}}
Index: /issm/trunk/src/m/classes/calvingvonmises.py
===================================================================
--- /issm/trunk/src/m/classes/calvingvonmises.py	(revision 27034)
+++ /issm/trunk/src/m/classes/calvingvonmises.py	(revision 27035)
@@ -48,6 +48,6 @@
             return
 
-        md = checkfield(md, 'fieldname', 'calving.stress_threshold_groundedice', '>', 0, 'nan', 1, 'Inf', 1)
-        md = checkfield(md, 'fieldname', 'calving.stress_threshold_floatingice', '>', 0, 'nan', 1, 'Inf', 1)
+        md = checkfield(md, 'fieldname', 'calving.stress_threshold_groundedice', '>', 0, 'nan', 1, 'Inf', 1, 'size', 'universal')
+        md = checkfield(md, 'fieldname', 'calving.stress_threshold_floatingice', '>', 0, 'nan', 1, 'Inf', 1, 'size', 'universal')
         md = checkfield(md, 'fieldname', 'calving.min_thickness', '>=', 0, 'NaN', 1, 'Inf', 1, 'numel', [1])
 
@@ -56,7 +56,8 @@
 
     def marshall(self, prefix, md, fid):  # {{{
+        yts = md.constants.yts
         WriteData(fid, prefix, 'name', 'md.calving.law', 'data', 2, 'format', 'Integer')
-        WriteData(fid, prefix, 'object', self, 'fieldname', 'stress_threshold_groundedice', 'format', 'DoubleMat', 'mattype', 1)
-        WriteData(fid, prefix, 'object', self, 'fieldname', 'stress_threshold_floatingice', 'format', 'DoubleMat', 'mattype', 1)
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'stress_threshold_groundedice', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts )
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'stress_threshold_floatingice', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts)
         WriteData(fid, prefix, 'object', self, 'fieldname', 'min_thickness', 'format', 'Double')
     # }}}
Index: /issm/trunk/src/m/classes/clusters/computecanada.m
===================================================================
--- /issm/trunk/src/m/classes/clusters/computecanada.m	(revision 27035)
+++ /issm/trunk/src/m/classes/clusters/computecanada.m	(revision 27035)
@@ -0,0 +1,133 @@
+%COMPUTECANADA class definition
+%
+%   Usage:
+%      cluster=computecanada();
+%      cluster=computecanada('np',3);
+%      cluster=computecanada('np',3,'login','username');
+
+classdef computecanada
+    properties (SetAccess=public)  
+		 % {{{
+		 name           = ''
+		 login          = '';
+		 numtasks       = 1;
+		 cpuspertask    = 8;
+		 port           = 0;
+		 projectaccount = '';
+		 codepath       = '';
+		 executionpath  = '';
+		 time           = 24*60;
+		 memory         = 2;
+		 email          = '';
+		 mailtype       = '';
+	 end
+	 %}}}
+	 methods
+		 function cluster=computecanada(varargin) % {{{
+
+			 %initialize cluster using default settings if provided
+			 if (exist('computecanada_settings')==2), computecanada_settings; end
+
+			 %use provided options to change fields
+			 cluster=AssignObjectFields(pairoptions(varargin{:}),cluster);
+		 end
+		 %}}}
+		 function disp(cluster) % {{{
+			 %  display the object
+			 disp(sprintf('class ''%s'' object ''%s'' = ',class(cluster),inputname(1)));
+			 disp(sprintf('    name: %s',cluster.name));
+			 disp(sprintf('    login: %s',cluster.login));
+			 disp(sprintf('    port: %i',cluster.port));
+			 disp(sprintf('    numtasks: %i',cluster.numtasks));
+			 disp(sprintf('    cpuspertask: %i',cluster.cpuspertask));
+			 disp(sprintf('    projectaccount: %s',cluster.projectaccount));
+			 disp(sprintf('    codepath: %s',cluster.codepath));
+			 disp(sprintf('    executionpath: %s',cluster.executionpath));
+			 disp(sprintf('    time: %i',cluster.time));
+			 disp(sprintf('    memory: %i',cluster.memory));
+			 disp(sprintf('    email: %s', cluster.email));
+			 disp(sprintf('    mailtype: %s', cluster.mailtype));
+			 
+		 end
+		 %}}}
+		 function numprocs=np(cluster) % {{{
+			 %compute number of processors
+			 numprocs=cluster.numtasks*cluster.cpuspertask;
+		 end
+		 %}}}
+		 function md = checkconsistency(cluster,md,solution,analyses) % {{{
+			 if isempty(cluster.name), md = checkmessage(md,'name empty'); end
+			 if isempty(cluster.login), md = checkmessage(md,'login empty'); end
+			 if ~(cluster.numtasks > 0), md = checkmessage(md,'numtasks must be > 0'); end
+			 if ~(cluster.cpuspertask > 0), md = checkmessage(md,'cpuspertask must be > 0'); end
+			 if ~(cluster.port >= 0), md = checkmessage(md,'port must be >= 0'); end
+			 if isempty(cluster.projectaccount), md = checkmessage(md,'projectaccount empty'); end
+			 if isempty(cluster.codepath), md = checkmessage(md,'codepath empty'); end
+			 if isempty(cluster.executionpath), md = checkmessage(md,'executionpath empty'); end
+			 if ~(cluster.time > 0), md = checkmessage(md,'time must be > 0'); end
+			 if ~(cluster.memory > 0), md = checkmessage(md,'memory must be > 0'); end
+		 end
+		 %}}}
+		 function BuildKrigingQueueScript(cluster,dirname,modelname,solution,io_gather,isvalgrind,isgprof,isdakota,isoceancoupling) % {{{
+			 error('not implemented yet');
+		 end
+		 %}}}
+		 function BuildQueueScript(cluster,dirname,modelname,solution,io_gather,isvalgrind,isgprof,isdakota,isoceancoupling) % {{{
+
+			 if(isvalgrind), disp('valgrind not supported by cluster, ignoring...'); end
+			 if(isgprof),    disp('gprof not supported by cluster, ignoring...'); end
+
+			 %write queuing script 
+			 fid=fopen([modelname '.queue'],'w');
+			 fprintf(fid,'#!/bin/bash\n');
+			 fprintf(fid,'#SBATCH --job-name=%s\n',modelname);
+			 fprintf(fid,'#SBATCH --account=%s \n',cluster.projectaccount);
+			 fprintf(fid,'#SBATCH --ntasks=%i  \n',cluster.numtasks);
+			 fprintf(fid,'#SBATCH --cpus-per-task=%i\n',cluster.cpuspertask);
+			 fprintf(fid,'#SBATCH --time=%i\n',cluster.time); %walltime is in minutes
+			 fprintf(fid,'#SBATCH --mem-per-cpu=%igb\n',cluster.memory); %memory in in gigabytes
+			 fprintf(fid,'#SBATCH --mail-user=%s\n',cluster.email); %email
+			 fprintf(fid,'#SBATCH --mail-type=%s',cluster.mailtype); 
+			 fprintf(fid,'#SBATCH --output=%s.outlog \n',modelname);
+			 fprintf(fid,'#SBATCH --error=%s.errlog \n\n',modelname);
+			 fprintf(fid,'export ISSM_DIR="%s/../"\n',cluster.codepath); %FIXME
+			 fprintf(fid,'cd %s/%s\n\n',cluster.executionpath,dirname);
+			 fprintf(fid,'srun %s/issm.exe %s %s %s\n',cluster.codepath,solution,[cluster.executionpath '/' dirname],modelname);
+			 if ~io_gather, %concatenate the output files:
+				 fprintf(fid,'cat %s.outbin.* > %s.outbin',modelname,modelname);
+			 end
+			 fclose(fid);
+		 end %}}}
+		 function UploadQueueJob(cluster,modelname,dirname,filelist)% {{{
+
+			 %compress the files into one zip.
+			 compressstring=['tar -zcf ' dirname '.tar.gz '];
+			 for i=1:numel(filelist),
+				 compressstring = [compressstring ' ' filelist{i}];
+			 end
+			 system(compressstring);
+
+			 disp('uploading input file and queueing script');
+			 issmscpout(cluster.name,cluster.executionpath,cluster.login,cluster.port,{[dirname '.tar.gz']});
+
+		 end %}}}
+		 function LaunchQueueJob(cluster,modelname,dirname,filelist,restart,batch)% {{{
+
+			 disp('launching solution sequence on remote cluster');
+			 if ~isempty(restart)
+				 launchcommand=['cd ' cluster.executionpath ' && cd ' dirname ' && hostname && sbatch ' modelname '.queue '];
+			 else
+				 launchcommand=['cd ' cluster.executionpath ' && rm -rf ./' dirname ' && mkdir ' dirname ...
+					 ' && cd ' dirname ' && mv ../' dirname '.tar.gz ./ && tar -zxf ' dirname '.tar.gz  && hostname && sbatch ' modelname '.queue '];
+			 end
+			 issmssh(cluster.name,cluster.login,cluster.port,launchcommand);
+		 end %}}}
+		 function Download(cluster,dirname,filelist)% {{{
+
+			 %copy files from cluster to current directory
+			 directory=[cluster.executionpath '/' dirname '/'];
+			 issmscpin(cluster.name,cluster.login,cluster.port,directory,filelist);
+
+		 end %}}}
+	end
+end
Index: /issm/trunk/src/m/classes/clusters/discovery.m
===================================================================
--- /issm/trunk/src/m/classes/clusters/discovery.m	(revision 27035)
+++ /issm/trunk/src/m/classes/clusters/discovery.m	(revision 27035)
@@ -0,0 +1,170 @@
+%DISCOVERY(Dartmouth) cluster class definition
+%
+%   Usage:
+%      cluster=discovery();
+%      cluster=discovery('np',3);
+%      cluster=discovery('np',3,'login','username');
+
+classdef discovery
+	properties (SetAccess=public)
+		% {{{
+		name          = 'discovery'
+		login         = '';
+		numnodes      = 1;
+		cpuspernode   = 16;
+		codepath      = '';
+		executionpath = '';
+		interactive   = 0;
+		time          = 10; %in hours
+		memory        = 2;  %in Gb
+		email         = 'END,FAIL';
+
+	end
+	%}}}
+	methods
+		function cluster=discovery(varargin) % {{{
+
+			%initialize cluster using default settings if provided
+			if (exist('discovery_settings')==2), discovery_settings; end
+
+			%use provided options to change fields
+			cluster=AssignObjectFields(pairoptions(varargin{:}),cluster);
+		end
+		%}}}
+		function disp(cluster) % {{{
+			%  display the object
+			disp(sprintf('class ''%s'' object ''%s'' = ',class(cluster),inputname(1)));
+			disp(sprintf('    name:  %s',cluster.name));
+			disp(sprintf('    login: %s',cluster.login));
+			disp(sprintf('    numnodes:    %i',cluster.numnodes));
+			disp(sprintf('    cpuspernode: %i',cluster.cpuspernode));
+			disp(sprintf('    time: %i hours',cluster.time));
+			disp(sprintf('    memory: %i Gb',cluster.memory));
+			disp(sprintf('    email: %s (notifications: BEGIN,END,FAIL)',cluster.email));
+			disp(sprintf('    codepath:      %s',cluster.codepath));
+			disp(sprintf('    executionpath: %s',cluster.executionpath));
+			disp(sprintf('    interactive: %i',cluster.interactive));
+		end
+		%}}}
+		function numprocs=nprocs(cluster) % {{{
+			%compute number of processors
+			numprocs=cluster.numnodes*cluster.cpuspernode;
+		end
+		%}}}
+		function md = checkconsistency(cluster,md,solution,analyses) % {{{
+			%Miscellaneous
+			if isempty(cluster.login), md = checkmessage(md,'login empty'); end
+			if isempty(cluster.codepath), md = checkmessage(md,'codepath empty'); end
+			if isempty(cluster.executionpath), md = checkmessage(md,'executionpath empty'); end
+		end
+		%}}}
+		function BuildKrigingQueueScript(cluster,dirname,modelname,solution,io_gather,isvalgrind,isgprof,isdakota,isoceancoupling) % {{{
+
+			if(isvalgrind), disp('valgrind not supported by cluster, ignoring...'); end
+			if(isgprof),    disp('gprof not supported by cluster, ignoring...'); end
+
+			%write queuing script 
+			fid=fopen([modelname '.queue'],'w');
+			fprintf(fid,'#!/bin/bash\n');
+			fprintf(fid,'#SBATCH --job-name=%s\n',modelname);
+			fprintf(fid,'#SBATCH --account=ice\n'); %Make sure we use the ICE account for this run
+			fprintf(fid,'#SBATCH -o %s.outlog \n',modelname);
+			fprintf(fid,'#SBATCH -e %s.errlog \n',modelname);
+			fprintf(fid,'#SBATCH --nodes=%i\n',cluster.numnodes);
+			fprintf(fid,'#SBATCH --ntasks-per-node=%i\n',cluster.cpuspernode);
+			fprintf(fid,'#SBATCH --time=%s\n',datestr(cluster.time/24,'HH:MM:SS')); %walltime is in HH:MM:SS format. cluster.time is in hour
+			fprintf(fid,'#SBATCH --mem=%iG\n',cluster.memory);
+			if ~isempty(cluster.email)
+				fprintf(fid,'#SBATCH --mail-type=%s\n',cluster.email);
+			end
+			fprintf(fid,'\n');
+
+			fprintf(fid,'export ISSM_DIR="%s/../"\n',cluster.codepath);
+			fprintf(fid,'source $ISSM_DIR/etc/environment.sh\n');      
+			fprintf(fid,'cd %s/%s\n\n',cluster.executionpath,dirname);
+			fprintf(fid,'srun %s/kriging.exe %s %s\n', cluster.codepath,[cluster.executionpath '/' modelname],modelname);
+			if ~io_gather, %concatenate the output files:
+				fprintf(fid,'cat %s.outbin.* > %s.outbin',modelname,modelname);
+			end
+			fclose(fid);
+		end
+		%}}}
+		function BuildQueueScript(cluster,dirname,modelname,solution,io_gather,isvalgrind,isgprof,isdakota,isoceancoupling) % {{{
+
+			if(isvalgrind), disp('valgrind not supported by cluster, ignoring...'); end
+			if(isgprof),    disp('gprof not supported by cluster, ignoring...'); end
+
+			%write queuing script
+			fid=fopen([modelname '.queue'],'w');
+			fprintf(fid,'#!/bin/bash\n');
+			fprintf(fid,'#SBATCH --job-name=%s\n',modelname);
+			fprintf(fid,'#SBATCH --account=ice\n'); %Make sure we use the ICE account for this run
+			fprintf(fid,'#SBATCH -o %s.outlog \n',modelname);
+			fprintf(fid,'#SBATCH -e %s.errlog \n',modelname);
+			fprintf(fid,'#SBATCH --nodes=%i\n',cluster.numnodes);
+			fprintf(fid,'#SBATCH --ntasks-per-node=%i\n',cluster.cpuspernode);
+			fprintf(fid,'#SBATCH --time=%s\n',datestr(cluster.time/24,'HH:MM:SS')); %walltime is in HH:MM:SS format. cluster.time is in hour
+			fprintf(fid,'#SBATCH --mem=%iG\n',cluster.memory);
+			if ~isempty(cluster.email)
+				fprintf(fid,'#SBATCH --mail-type=%s\n',cluster.email);
+			end
+			fprintf(fid,'\n');
+			fprintf(fid,'export ISSM_DIR="%s/../"\n',cluster.codepath);
+			fprintf(fid,'source $ISSM_DIR/etc/environment.sh\n');
+			fprintf(fid,'cd %s/%s\n\n',cluster.executionpath,dirname);
+			fprintf(fid,'mpirun -n %i %s/issm.exe %s %s %s\n',cluster.nprocs(), cluster.codepath,solution,[cluster.executionpath '/' dirname],modelname);
+			if ~io_gather, %concatenate the output files:
+				fprintf(fid,'cat %s.outbin.* > %s.outbin',modelname,modelname);
+			end
+			fclose(fid);
+
+			%in interactive mode, create a run file, and errlog and outlog file
+			if cluster.interactive,
+				fid=fopen([modelname '.run'],'w');
+				fprintf(fid,'mpirun -n %i %s/issm.exe %s %s %s\n',cluster.nprocs(), cluster.codepath,solution,[cluster.executionpath '/' dirname],modelname);
+				if ~io_gather, %concatenate the output files:
+					fprintf(fid,'cat %s.outbin.* > %s.outbin',modelname,modelname);
+				end
+				fclose(fid);
+				fid=fopen([modelname '.errlog'],'w');
+				fclose(fid);
+				fid=fopen([modelname '.outlog'],'w');
+				fclose(fid);
+			end
+		end %}}}
+		function UploadQueueJob(cluster,modelname,dirname,filelist) % {{{
+
+			%compress the files into one zip.
+			compressstring=['tar -zcf ' dirname '.tar.gz '];
+			for i=1:numel(filelist),
+				compressstring = [compressstring ' ' filelist{i}];
+			end
+			if cluster.interactive,
+				compressstring = [compressstring ' ' modelname '.errlog ' modelname '.outlog '];
+			end
+			system(compressstring);
+
+			disp('uploading input file and queueing script');
+			issmscpout(cluster.name,cluster.executionpath,cluster.login,0,{[dirname '.tar.gz']});
+
+		end %}}}
+		function LaunchQueueJob(cluster,modelname,dirname,filelist,restart,batch) % {{{
+
+			disp('launching solution sequence on remote cluster');
+			if ~isempty(restart)
+				launchcommand=['cd ' cluster.executionpath ' && cd ' dirname ' && hostname && sbatch ' modelname '.queue '];
+			else
+				launchcommand=['cd ' cluster.executionpath ' && rm -rf ./' dirname ' && mkdir ' dirname ...
+					' && cd ' dirname ' && mv ../' dirname '.tar.gz ./ && tar -zxf ' dirname '.tar.gz  && hostname && sbatch ' modelname '.queue '];
+			end
+			issmssh(cluster.name,cluster.login,0,launchcommand);
+		end %}}}
+		function Download(cluster,dirname,filelist) % {{{
+
+			%copy files from cluster to current directory
+			directory=[cluster.executionpath '/' dirname '/'];
+			issmscpin(cluster.name,cluster.login,0,directory,filelist);
+
+		end %}}}
+	end
+end
Index: /issm/trunk/src/m/classes/clusters/generic.m
===================================================================
--- /issm/trunk/src/m/classes/clusters/generic.m	(revision 27034)
+++ /issm/trunk/src/m/classes/clusters/generic.m	(revision 27035)
@@ -19,5 +19,5 @@
 		port          = 0;
 		interactive   = 1;
-		codepath      = [IssmConfig('ISSM_PREFIX') '/bin'];
+		codepath      = [issmdir() '/bin'];
 		etcpath       = [issmdir() '/etc'];
 		executionpath = [issmdir() '/execution'];
Index: /issm/trunk/src/m/classes/clusters/pfe.m
===================================================================
--- /issm/trunk/src/m/classes/clusters/pfe.m	(revision 27034)
+++ /issm/trunk/src/m/classes/clusters/pfe.m	(revision 27035)
@@ -11,5 +11,5 @@
 		name           = 'pfe'
 		login          = '';
-		modules        = {'comp-intel/2016.2.181' 'mpt'};
+		modules        = {'comp-intel/2018.3.222' 'mpi-intel/2018.3.222' 'scicon/app-tools'};
 		numnodes       = 20;
 		cpuspernode    = 8;
@@ -19,4 +19,5 @@
 		processor      = 'ivy';
 		srcpath        = '';
+		extpkgpath     = '';
 		codepath       = '';
 		executionpath  = '';
@@ -44,6 +45,6 @@
 			disp(sprintf('    login: %s',cluster.login));
 			disp(sprintf('    modules: %s',strjoin(cluster.modules,', ')));
-			disp(sprintf('    numnodes: %s',cluster.numnodes));
-			disp(sprintf('    cpuspernode: %s',cluster.cpuspernode));
+			disp(sprintf('    numnodes: %i',cluster.numnodes));
+			disp(sprintf('    cpuspernode: %i',cluster.cpuspernode));
 			disp(sprintf('    np: %i',cluster.nprocs()));
 			disp(sprintf('    port: %i',cluster.port));
@@ -52,8 +53,9 @@
 			disp(sprintf('    processor: %i',cluster.processor));
 			disp(sprintf('    srcpath: %s',cluster.srcpath));
+			disp(sprintf('    extpkgpath: %s',cluster.extpkgpath));
 			disp(sprintf('    codepath: %s',cluster.codepath));
 			disp(sprintf('    executionpath: %s',cluster.executionpath));
 			disp(sprintf('    grouplist: %s',cluster.grouplist));
-			disp(sprintf('    interactive: %s',cluster.interactive));
+			disp(sprintf('    interactive: %i',cluster.interactive));
 			disp(sprintf('    bbftp: %s',cluster.bbftp));
 			disp(sprintf('    numstreams: %s',cluster.numstreams));
@@ -173,9 +175,11 @@
 			fprintf(fid,'export MPI_GROUP_MAX=64\n\n');
 			fprintf(fid,'export ISSM_DIR="%s"\n',cluster.srcpath); %FIXME
+			if cluster.extpkgpath
+				fprintf(fid,'export ISSM_EXT_PKG="%s"\n',cluster.extpkgpath); 
+			end
 			fprintf(fid,'source $ISSM_DIR/etc/environment.sh\n');       %FIXME
-			fprintf(fid,'export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$ISSM_DIR/externalpackages/petsc/install/lib"\n');
 			fprintf(fid,'cd %s/%s/\n\n',cluster.executionpath,dirname);
 			if ~isvalgrind,
-				fprintf(fid,'/u/scicon/tools/bin/toss3/several_tries mpiexec -np %i %s/%s %s %s/%s %s\n',cluster.nprocs(),cluster.codepath,executable,solution,cluster.executionpath,dirname,modelname);
+				fprintf(fid,'/u/scicon/tools/bin/toss3/several_tries mpiexec -np %i mbind.x -cs -n%i %s/%s %s %s/%s %s\n',cluster.nprocs(),cluster.cpuspernode,cluster.codepath,executable,solution,cluster.executionpath,dirname,modelname);
 			else
 				fprintf(fid,'mpiexec -np %i valgrind --leak-check=full %s/%s %s %s %s\n',cluster.nprocs(),cluster.codepath,executable,solution,[cluster.executionpath '/' dirname],modelname);
Index: /issm/trunk/src/m/classes/clusters/pfe.py
===================================================================
--- /issm/trunk/src/m/classes/clusters/pfe.py	(revision 27034)
+++ /issm/trunk/src/m/classes/clusters/pfe.py	(revision 27035)
@@ -28,5 +28,5 @@
         self.name = ''
         self.login = ''
-        self.modules = ['comp-intel/2016.2.181', 'mpt']
+        self.modules = ['comp-intel/2018.3.222', 'mpi-intel/2018.3.222', 'scicon/app-tools']
         self.numnodes = 20
         self.cpuspernode = 8
@@ -36,4 +36,5 @@
         self.processor = 'ivy'
         self.srcpath = ''
+        self.extpkgpath = ''
         self.codepath = ''
         self.executionpath = ''
@@ -72,4 +73,5 @@
         s += '    processor: {}\n'.format(self.processor)
         s += '    srcpath: {}\n'.format(self.srcpath)
+        s += '    extpkgpath: {}\n'.format(self.extpkgpath)
         s += '    codepath: {}\n'.format(self.codepath)
         s += '    executionpath: {}\n'.format(self.executionpath)
@@ -177,6 +179,7 @@
         fid.write('export MPI_GROUP_MAX=64\n\n')
         fid.write('export ISSM_DIR="{}"\n'.format(self.srcpath)) # FIXME
+        if self.extpkgpath:
+            fid.write('export ISSM_EXT_PKG="{}"\n'.format(self.extpkgpath)) 
         fid.write('source $ISSM_DIR/etc/environment.sh\n') # FIXME
-        fid.write('export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$ISSM_DIR/externalpackages/petsc/install/lib"\n')
         fid.write('cd {}/{}/\n\n'.format(self.executionpath, dirname))
         fid.write('mpiexec -np {} {}/{} {} {}/{} {}\n'.format(self.nprocs(), self.codepath, executable, solution, self.executionpath, dirname, modelname))
Index: /issm/trunk/src/m/classes/clusters/saga.py
===================================================================
--- /issm/trunk/src/m/classes/clusters/saga.py	(revision 27034)
+++ /issm/trunk/src/m/classes/clusters/saga.py	(revision 27035)
@@ -119,7 +119,7 @@
 
         fid.write('#SBATCH --nodes=%i \n' % self.numnodes)
-        fid.write('#SBATCH --ntasks-per-node=%i \n' % self.cpuspernode)
+        fid.write('#SBATCH --ntasks=%i \n' % self.cpuspernode)
         fid.write('#SBATCH --time={}\n'.format(timestring))  #walltime is minutes
-        fid.write('#SBATCH --mem-per-cpu={}MB\n'.format(int(1000 * self.mem)))  # mem is in MB
+        fid.write('#SBATCH --mem-per-cpu={}M\n'.format(int(1000 * self.mem)))  # mem is in MB
 
         fid.write('#SBATCH --account=%s\n' % self.accountname)
@@ -130,6 +130,6 @@
         fid.write('module purge\n')
         fid.write('module load CMake/3.15.3-GCCcore-8.3.0\n')
-        fid.write('module load PETSc/3.12.4-intel-2019b\n')
-        fid.write('module load ParMETIS/4.0.3-iimpi-2019b\n')
+        fid.write('module load PETSc/3.12.4-foss-2019b\n')
+        fid.write('module load ParMETIS/4.0.3-gompi-2019b\n')
         if isvalgrind:
             fid.write('module --ignore-cache load Valgrind/3.16.1-gompi-2019b \n')
@@ -138,9 +138,9 @@
         if isvalgrind:
             # profiling
-            #fid.write('mpirun {} --tool=callgrind {}/{} {} {}/{} {} 2>{}.errlog>{}.outlog \n'.format(self.valgrind, self.codepath, executable, solution, self.executionpath, dirname, modelname, modelname, modelname))
+            #fid.write('srun {} --tool=callgrind {}/{} {} {}/{} {} 2>{}.errlog>{}.outlog \n'.format(self.valgrind, self.codepath, executable, solution, self.executionpath, dirname, modelname, modelname, modelname))
             # leak check
-            fid.write('mpirun {} --leak-check=full {}/{} {} {}/{} {} 2>{}.errlog>{}.outlog '.format(self.valgrind, self.codepath, executable, solution, self.executionpath, dirname, modelname, modelname, modelname))
+            fid.write('srun {} --leak-check=full {}/{} {} {}/{} {} 2>{}.errlog>{}.outlog '.format(self.valgrind, self.codepath, executable, solution, self.executionpath, dirname, modelname, modelname, modelname))
         else:
-            fid.write('time mpirun {}/{} {} {}/{} {}\n'.format(self.codepath, executable, solution, self.executionpath, dirname, modelname))
+            fid.write('time srun {}/{} {} {}/{} {}\n'.format(self.codepath, executable, solution, self.executionpath, dirname, modelname))
         fid.close()
 
Index: /issm/trunk/src/m/classes/flowequation.js
===================================================================
--- /issm/trunk/src/m/classes/flowequation.js	(revision 27034)
+++ /issm/trunk/src/m/classes/flowequation.js	(revision 27035)
@@ -22,5 +22,5 @@
 		fielddisplay(this,'isSSA','is the Shelfy-Stream Approximation (SSA) used ?');
 		fielddisplay(this,'isL1L2','is the L1L2 approximation used ?');
-		fielddisplay(this,'isMLHO','is the Mono-Layer Higher-Order approximation used?');
+		fielddisplay(this,'isMOLHO','is the MOno-Layer Higher-Order (MOLHO) approximation used?');
 		fielddisplay(this,'isHO','is the Higher-Order (HO) approximation used ?');
 		fielddisplay(this,'isFS','are the Full-FS (FS) equations used ?');
@@ -41,11 +41,11 @@
 
 	}// }}}
-    this.extrude = function(md) {//{{{
-        this.element_equation=project3d(md,'vector',this.element_equation,'type','element');
-        this.vertex_equation=project3d(md,'vector',this.vertex_equation,'type','node');
-        this.borderSSA=project3d(md,'vector',this.borderSSA,'type','node');
-        this.borderHO=project3d(md,'vector',this.borderHO,'type','node');
-        this.borderFS=project3d(md,'vector',this.borderFS,'type','node');
-        return this;
+	this.extrude = function(md) {//{{{
+		this.element_equation=project3d(md,'vector',this.element_equation,'type','element');
+		this.vertex_equation=project3d(md,'vector',this.vertex_equation,'type','node');
+		this.borderSSA=project3d(md,'vector',this.borderSSA,'type','node');
+		this.borderHO=project3d(md,'vector',this.borderHO,'type','node');
+		this.borderFS=project3d(md,'vector',this.borderFS,'type','node');
+		return this;
     }//}}}
 		this.checkconsistency = function(md,solution,analyses) {//{{{
@@ -59,5 +59,5 @@
 			checkfield(md,'fieldname','flowequation.isSSA','numel',[1],'values',[0, 1]);
 			checkfield(md,'fieldname','flowequation.isL1L2','numel',[1],'values',[0, 1]);
-			checkfield(md,'fieldname','flowequation.isMLHO','numel',[1],'values',[0, 1]);
+			checkfield(md,'fieldname','flowequation.isMOLHO','numel',[1],'values',[0, 1]);
 			checkfield(md,'fieldname','flowequation.isHO','numel',[1],'values',[0, 1]);
 			checkfield(md,'fieldname','flowequation.isFS','numel',[1],'values',[0, 1]);
@@ -93,5 +93,5 @@
 			else throw Error('Case not supported yet');
 			
-			if (!(this.isSIA | this.isSSA | this.isL1L2 | this.isMLHO | this.isHO | this.isFS)){
+			if (!(this.isSIA | this.isSSA | this.isL1L2 | this.isMOLHO | this.isHO | this.isFS)){
 				checkmessage(md,['no element types set for this model']);
 			}
@@ -108,5 +108,5 @@
 			WriteData(fid,prefix,'object',this,'fieldname','isSSA','format','Boolean');
 			WriteData(fid,prefix,'object',this,'fieldname','isL1L2','format','Boolean');
-			WriteData(fid,prefix,'object',this,'fieldname','isMLHO','format','Boolean');
+			WriteData(fid,prefix,'object',this,'fieldname','isMOLHO','format','Boolean');
 			WriteData(fid,prefix,'object',this,'fieldname','isHO','format','Boolean');
 			WriteData(fid,prefix,'object',this,'fieldname','isFS','format','Boolean');
@@ -138,5 +138,5 @@
 	this.isSSA                          = 0;
 	this.isL1L2                         = 0;
-	this.isMLHO                         = 0;
+	this.isMOLHO                         = 0;
 	this.isHO                           = 0;
 	this.isFS                           = 0;
Index: /issm/trunk/src/m/classes/flowequation.m
===================================================================
--- /issm/trunk/src/m/classes/flowequation.m	(revision 27034)
+++ /issm/trunk/src/m/classes/flowequation.m	(revision 27035)
@@ -9,5 +9,5 @@
 		isSSA                          = 0;
 		isL1L2                         = 0;
-		isMLHO                         = 0;
+		isMOLHO                         = 0;
 		isHO                           = 0;
 		isFS                           = 0;
@@ -60,10 +60,11 @@
 				if isfield(objstruct,'borderpattyn'),  self.borderHO  = objstruct.borderpattyn;   end; 
 				if isfield(objstruct,'borderstokes'),  self.borderFS  = objstruct.borderstokes;   end; 
-			end
-
-			%Nov 6 2021
-			if any(self.vertex_equation==4)
-				disp(['Monolayer Higher-Order (MLHO) detected in md.flowequation, this is still under development. Please double check your settings.']);
-			end
+
+				%May 31 2022
+				if isfield(objstruct,'isMLHO')
+					self.isMOLHO = objstruct.isMLHO;
+				end
+			end
+
 
 		end% }}}
@@ -104,5 +105,5 @@
 			md = checkfield(md,'fieldname','flowequation.isSSA','numel',[1],'values',[0 1]);
 			md = checkfield(md,'fieldname','flowequation.isL1L2','numel',[1],'values',[0 1]);
-			md = checkfield(md,'fieldname','flowequation.isMLHO','numel',[1],'values',[0 1]);
+			md = checkfield(md,'fieldname','flowequation.isMOLHO','numel',[1],'values',[0 1]);
 			md = checkfield(md,'fieldname','flowequation.isHO','numel',[1],'values',[0 1]);
 			md = checkfield(md,'fieldname','flowequation.isFS','numel',[1],'values',[0 1]);
@@ -135,5 +136,5 @@
 				error('Case not supported yet');
 			end
-			if ~(self.isSIA || self.isSSA || self.isL1L2 || self.isMLHO || self.isHO || self.isFS),
+			if ~(self.isSIA || self.isSSA || self.isL1L2 || self.isMOLHO || self.isHO || self.isFS),
 				md = checkmessage(md,['no element types set for this model']);
 			end
@@ -153,5 +154,5 @@
 			fielddisplay(self,'isSSA','is the Shelfy-Stream Approximation (SSA) used?');
 			fielddisplay(self,'isL1L2','is the L1L2 approximation used?');
-			fielddisplay(self,'isMLHO','is the Mono-Layer Higher-Order approximation used?');
+			fielddisplay(self,'isMOLHO','is the MOno-Layer Higher-Order (MOLHO) approximation used?');
 			fielddisplay(self,'isHO','is the Higher-Order (HO) approximation used?');
 			fielddisplay(self,'isFS','are the Full-FS (FS) equations used?');
@@ -172,5 +173,5 @@
 			WriteData(fid,prefix,'object',self,'fieldname','isSSA','format','Boolean');
 			WriteData(fid,prefix,'object',self,'fieldname','isL1L2','format','Boolean');
-			WriteData(fid,prefix,'object',self,'fieldname','isMLHO','format','Boolean');
+			WriteData(fid,prefix,'object',self,'fieldname','isMOLHO','format','Boolean');
 			WriteData(fid,prefix,'object',self,'fieldname','isHO','format','Boolean');
 			WriteData(fid,prefix,'object',self,'fieldname','isFS','format','Boolean');
@@ -197,5 +198,5 @@
 			writejsdouble(fid,[modelname '.flowequation.isSSA'],self.isSSA);
 			writejsdouble(fid,[modelname '.flowequation.isL1L2'],self.isL1L2);
-			writejsdouble(fid,[modelname '.flowequation.isMLHO'],self.isMLHO);
+			writejsdouble(fid,[modelname '.flowequation.isMOLHO'],self.isMOLHO);
 			writejsdouble(fid,[modelname '.flowequation.isHO'],self.isHO);
 			writejsdouble(fid,[modelname '.flowequation.isFS'],self.isFS);
Index: /issm/trunk/src/m/classes/flowequation.py
===================================================================
--- /issm/trunk/src/m/classes/flowequation.py	(revision 27034)
+++ /issm/trunk/src/m/classes/flowequation.py	(revision 27035)
@@ -19,5 +19,5 @@
         self.isSSA = 0
         self.isL1L2 = 0
-        self.isMLHO = 0
+        self.isMOLHO = 0
         self.isHO = 0
         self.isFS = 0
@@ -46,5 +46,5 @@
         s += '{}\n'.format(fielddisplay(self, 'isSSA', "is the Shelfy-Stream Approximation (SSA) used?"))
         s += '{}\n'.format(fielddisplay(self, 'isL1L2', "are L1L2 equations used?"))
-        s += '{}\n'.format(fielddisplay(self, 'isMLHO', "are Mono-layer Higher-Order equations used?"))
+        s += '{}\n'.format(fielddisplay(self, 'isMOLHO', "are MOno-layer Higher-Order (MOLHO) equations used?"))
         s += '{}\n'.format(fielddisplay(self, 'isHO', "is the Higher-Order (HO) approximation used?"))
         s += '{}\n'.format(fielddisplay(self, 'isFS', "are the Full-FS (FS) equations used?"))
@@ -90,5 +90,5 @@
         md = checkfield(md, 'fieldname', 'flowequation.isSSA', 'numel', [1], 'values', [0, 1])
         md = checkfield(md, 'fieldname', 'flowequation.isL1L2', 'numel', [1], 'values', [0, 1])
-        md = checkfield(md, 'fieldname', 'flowequation.isMLHO', 'numel', [1], 'values', [0, 1])
+        md = checkfield(md, 'fieldname', 'flowequation.isMOLHO', 'numel', [1], 'values', [0, 1])
         md = checkfield(md, 'fieldname', 'flowequation.isHO', 'numel', [1], 'values', [0, 1])
         md = checkfield(md, 'fieldname', 'flowequation.isFS', 'numel', [1], 'values', [0, 1])
@@ -121,5 +121,5 @@
             raise RuntimeError('Case not supported yet')
 
-        if not (self.isSIA or self.isSSA or self.isL1L2 or self.isMLHO or self.isHO or self.isFS):
+        if not (self.isSIA or self.isSSA or self.isL1L2 or self.isMOLHO or self.isHO or self.isFS):
             md.checkmessage("no element types set for this model")
         if 'StressbalanceSIAAnalysis' in analyses:
@@ -134,5 +134,5 @@
         WriteData(fid, prefix, 'object', self, 'fieldname', 'isSSA', 'format', 'Boolean')
         WriteData(fid, prefix, 'object', self, 'fieldname', 'isL1L2', 'format', 'Boolean')
-        WriteData(fid, prefix, 'object', self, 'fieldname', 'isMLHO', 'format', 'Boolean')
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'isMOLHO', 'format', 'Boolean')
         WriteData(fid, prefix, 'object', self, 'fieldname', 'isHO', 'format', 'Boolean')
         WriteData(fid, prefix, 'object', self, 'fieldname', 'isFS', 'format', 'Boolean')
Index: /issm/trunk/src/m/classes/fourierlove.m
===================================================================
--- /issm/trunk/src/m/classes/fourierlove.m	(revision 27034)
+++ /issm/trunk/src/m/classes/fourierlove.m	(revision 27035)
@@ -6,23 +6,25 @@
 classdef fourierlove
 	properties (SetAccess=public) 
-		nfreq                       = 0;
-		frequencies                 = 0;
-		sh_nmax                     = 0;
-		sh_nmin                     = 0;
-		g0                          = 0;
-		r0                          = 0;
-		mu0                         = 0;
-		Gravitational_Constant      = 0;
-		allow_layer_deletion        = 0;
-		underflow_tol               = 0;
-		integration_steps_per_layer = 0;
-		istemporal                  = 0;
-		n_temporal_iterations       = 0;
-		time                        = 0;
-		love_kernels                = 0;
-		forcing_type                = 0;
-		inner_core_boundary         = 0;
-		core_mantle_boundary        = 0;
-		complex_computation         = 0;
+		nfreq						= 0;
+		frequencies					= 0;
+		sh_nmax						= 0;
+		sh_nmin						= 0;
+		g0							= 0;
+		r0							= 0;
+		mu0							= 0;
+		Gravitational_Constant		= 0;
+		chandler_wobble				= 0;
+		allow_layer_deletion		= 0;
+		underflow_tol				= 0;
+		pw_threshold				= 0;
+		integration_steps_per_layer	= 0;
+		istemporal					= 0;
+		n_temporal_iterations		= 0;
+		time						= 0;
+		love_kernels				= 0;
+		forcing_type				= 0;
+		inner_core_boundary			= 0;
+		core_mantle_boundary		= 0;
+		complex_computation			= 0;
 
 	end
@@ -53,6 +55,8 @@
 			self.mu0=1e11; % Pa
 			self.Gravitational_Constant=6.67259e-11; % m^3 kg^-1 s^-2
+			self.chandler_wobble=0;
 			self.allow_layer_deletion=1;
 			self.underflow_tol=1e-16; %threshold of deep to surface love number ratio to trigger the deletion of layer 
+			self.pw_threshold=1e-3; %if relative variation across frequencies is smaller than this ratio, the post-widder transform for time-dependent love numbers is bypassed 
 			self.integration_steps_per_layer=100;
 			self.istemporal=0;
@@ -74,6 +78,8 @@
 			fielddisplay(self,'mu0','adimensioning constant for stress (default: 10^11) [Pa]');
 			fielddisplay(self,'Gravitational_Constant','Newtonian constant of gravitation (default: 6.67259e-11 [m^3 kg^-1 s^-2])');
-			fielddisplay(self,'allow_layer_deletion','allow for migration of the integration boundary with increasing spherical harmonics degree (default: 1)');
+			fielddisplay(self,'chandler_wobble','includes the inertial terms for the chandler wobble in the rotational feedback love numbers, only for forcing_type=11 (default: 0) (/!\ 1 is untested yet)');
+			fielddisplay(self,'allow_layer_deletion','allow for migration of the integration boundary with increasing spherical harmonics degree (default: 1)');			
 			fielddisplay(self,'underflow_tol','threshold of deep to surface love number ratio to trigger the deletion of layers (default: 1e-16)');
+			fielddisplay(self,'pw_threshold','if relative variation across frequencies is smaller than this ratio, the post-widder transform for time-dependent love numbers is bypassed (default (1e-3)');
 			fielddisplay(self,'integration_steps_per_layer','number of radial steps to propagate the yi system from the bottom to the top of each layer (default: 100)');
 			fielddisplay(self,'istemporal',{'1 for time-dependent love numbers, 0 for frequency-dependent or elastic love numbers (default: 0)', 'If 1: use fourierlove function build_frequencies_from_time to meet consistency'});
@@ -98,6 +104,8 @@
 			md = checkfield(md,'fieldname','love.mu0','NaN',1,'Inf',1,'numel',1,'>',0);
 			md = checkfield(md,'fieldname','love.Gravitational_Constant','NaN',1,'Inf',1,'numel',1,'>',0);
+			md = checkfield(md,'fieldname','love.chandler_wobble','values',[0 1]);
 			md = checkfield(md,'fieldname','love.allow_layer_deletion','values',[0 1]);
 			md = checkfield(md,'fieldname','love.underflow_tol','NaN',1,'Inf',1,'numel',1,'>',0);
+			md = checkfield(md,'fieldname','love.pw_threshold','NaN',1,'Inf',1,'numel',1,'>',0);
 			md = checkfield(md,'fieldname','love.integration_steps_per_layer','NaN',1,'Inf',1,'numel',1,'>',0);
 			md = checkfield(md,'fieldname','love.love_kernels','values',[0 1]);
@@ -112,4 +120,8 @@
 			if md.love.sh_nmin<=1 & (md.love.forcing_type==1 || md.love.forcing_type==5 || md.love.forcing_type==9)
 				error(['Degree 1 not supported for forcing type ' num2str(md.love.forcing_type) '. Use sh_min>=2 for this kind of calculation.'])
+			end
+
+			if md.love.chandler_wobble==1
+				disp('Warning, Chandler Wobble in Love number calculator has not been validated yet');
 			end
 
@@ -137,6 +149,8 @@
 			WriteData(fid,prefix,'object',self,'fieldname','mu0','format','Double');
 			WriteData(fid,prefix,'object',self,'fieldname','Gravitational_Constant','format','Double');
+			WriteData(fid,prefix,'object',self,'fieldname','chandler_wobble','format','Boolean');
 			WriteData(fid,prefix,'object',self,'fieldname','allow_layer_deletion','format','Boolean');
 			WriteData(fid,prefix,'object',self,'fieldname','underflow_tol','format','Double');
+			WriteData(fid,prefix,'object',self,'fieldname','pw_threshold','format','Double');
 			WriteData(fid,prefix,'object',self,'fieldname','integration_steps_per_layer','format','Integer');
 			WriteData(fid,prefix,'object',self,'fieldname','istemporal','format','Boolean');
@@ -164,5 +178,9 @@
 			for i=1:length(self.time)
 				for j=1:2*self.n_temporal_iterations
-					self.frequencies((i-1)*2*self.n_temporal_iterations +j) = j*log(2)/self.time(i)/2/pi;
+					if self.time(i)==0
+						self.frequencies((i-1)*2*self.n_temporal_iterations +j) =0; % convention to avoid marshalling infinite numbers
+					else
+						self.frequencies((i-1)*2*self.n_temporal_iterations +j) = j*log(2)/self.time(i)/2/pi;
+					end
 				end
 			end
Index: /issm/trunk/src/m/classes/fourierlove.py
===================================================================
--- /issm/trunk/src/m/classes/fourierlove.py	(revision 27034)
+++ /issm/trunk/src/m/classes/fourierlove.py	(revision 27035)
@@ -22,6 +22,8 @@
         self.mu0 = 0
         self.Gravitational_Constant = 0
+        self.chandler_wobble = 0
         self.allow_layer_deletion = 0
         self.underflow_tol = 0
+        self.pw_threshold = 0
         self.integration_steps_per_layer = 0
         self.istemporal = 0
@@ -51,6 +53,8 @@
         s += '{}\n'.format(fielddisplay(self, 'allow_layer_deletion', 'allow for migration of the integration boundary with increasing spherical harmonics degree (default: 1)'))
         s += '{}\n'.format(fielddisplay(self, 'Gravitational_Constant', 'Newtonian constant of gravitation (default: 6.67259e-11 [m^3 kg^-1 s^-2])'))
+        s += '{}\n'.format(fielddisplay(self, 'chandler_wobble', 'includes the inertial terms for the chandler wobble in the rotational feedback love numbers, only for forcing_type=11 (default: 0) (/!\\ 1 has not been validated yet)'))
         s += '{}\n'.format(fielddisplay(self, 'allow_layer_deletion', 'allow for migration of the integration boundary with increasing spherical harmonics degree (default: 1)'))
-        s += '{}\n'.format(fielddisplay(self, 'underflow_tol', 'threshold of deep to surface love number ratio to trigger the deletion of layers (default: 1e-16)'))
+        s += '{}\n'.format(fielddisplay(self, 'pw_threshold', 'if relative variation across frequencies is smaller than this ratio, the post-widder transform for time-dependent love numbers is bypassed (default (1e-3)'))
+        s += '{}\n'.format(fielddisplay(self, 'chandler_wobble', 'includes the inertial terms for the chandler wobble in the rotational feedback love numbers, only for forcing_type=11 (default: 0) (/!\\ 1 is untested)'))
         s += '{}\n'.format(fielddisplay(self, 'integration_steps_per_layer', 'number of radial steps to propagate the yi system from the bottom to the top of each layer (default: 100)'))
         s += '{}\n'.format(fielddisplay(self, 'istemporal', ['1 for time-dependent love numbers, 0 for frequency-dependent or elastic love numbers (default: 0)', 'If 1: use fourierlove function build_frequencies_from_time to meet consistency']))
@@ -88,6 +92,8 @@
         self.mu0 = 1e11 # Pa
         self.Gravitational_Constant = 6.67259e-11 # m^3 kg^-1 s^-2
+        self.chandler_wobble = 0
         self.allow_layer_deletion = 1
         self.underflow_tol = 1e-16 # Threshold of deep to surface love number ratio to trigger the deletion of layer
+        self.pw_threshold = 1e-3 # If relative variation across frequencies is smaller than this ratio, the post-widder transform for time-dependent love numbers is bypassed 
         self.integration_steps_per_layer = 100
         self.istemporal = 0
@@ -113,6 +119,8 @@
         md = checkfield(md, 'fieldname', 'love.mu0', 'NaN', 1, 'Inf', 1, 'numel', 1, '>', 0)
         md = checkfield(md, 'fieldname', 'love.Gravitational_Constant', 'NaN', 1, 'Inf', 1, 'numel', 1, '>', 0)
+        md = checkfield(md, 'fieldname', 'love.chandler_wobble', 'values', [0, 1])
         md = checkfield(md, 'fieldname', 'love.allow_layer_deletion', 'values', [0, 1])
         md = checkfield(md, 'fieldname', 'love.underflow_tol', 'NaN', 1, 'Inf', 1, 'numel', 1, '>', 0)
+        md = checkfield(md, 'fieldname', 'love.pw_threshold', 'NaN', 1, 'Inf', 1, 'numel', 1, '>', 0)
         md = checkfield(md, 'fieldname', 'love.integration_steps_per_layer', 'NaN', 1, 'Inf', 1, 'numel', 1, '>', 0)
         md = checkfield(md, 'fieldname', 'love.love_kernels', 'values', [0, 1])
@@ -127,9 +135,12 @@
             raise RuntimeError('Degree 1 not supported for forcing type {}. Use sh_min >= 2 for this kind of calculation.'.format(md.love.forcing_type))
 
+        if md.love.chandler_wobble  == 1:
+            print('Warning: Chandler wobble in Love number calculator has not been validated yet')
+
         # Need 'litho' material
-        if not hasattr(md.materials, 'materials') or 'litho' not in md.materials.nature:
+        if md.materials.__class__.__name__ != 'materials' or 'litho' not in md.materials.nature:
             raise RuntimeError('Need a \'litho\' material to run a Fourier Love number analysis')
 
-        mat = np.where(np.array(nature) == 'litho')[0]
+        mat = np.where(np.array(md.materials.nature) == 'litho')[0]
         if md.love.forcing_type <= 4:
             md = checkfield(md, 'fieldname', 'love.inner_core_boundary', 'NaN', 1, 'Inf', 1, 'numel', 1, '>', 0, '<=', md.materials[mat].numlayers)
@@ -149,6 +160,8 @@
         WriteData(fid, prefix, 'object', self, 'fieldname', 'mu0', 'format', 'Double')
         WriteData(fid, prefix, 'object', self, 'fieldname', 'Gravitational_Constant', 'format', 'Double')
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'chandler_wobble', 'format', 'Boolean')
         WriteData(fid, prefix, 'object', self, 'fieldname', 'allow_layer_deletion', 'format', 'Boolean')
         WriteData(fid, prefix, 'object', self, 'fieldname', 'underflow_tol', 'format', 'Double')
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'pw_threshold', 'format', 'Double')
         WriteData(fid, prefix, 'object', self, 'fieldname', 'integration_steps_per_layer', 'format', 'Integer')
         WriteData(fid, prefix, 'object', self, 'fieldname', 'istemporal', 'format', 'Boolean')
@@ -171,7 +184,11 @@
         print('Temporal love numbers: Overriding md.love.nfreq and md.love.frequencies')
         self.nfreq = len(self.time) * 2 * self.n_temporal_iterations
-        self.frequencies = np.zeros((self.nfreq, 1))
+        self.frequencies = np.zeros((self.nfreq,))
         for i in range(len(self.time)):
             for j in range(2 * self.n_temporal_iterations):
-                self.frequencies[(i - 1) * 2 * self.n_temporal_iterations + j] = j * np.log(2) / self.time[i] / 2 / np.pi
+                if self.time[i] == 0:
+                    self.frequencies[(i - 1) * 2 * self.n_temporal_iterations + j] = 0 # Convention to avoid marshalling infinite numbers
+                else:
+                    self.frequencies[(i - 1) * 2 * self.n_temporal_iterations + j] = j * np.log(2) / self.time[i] / 2 / np.pi
+        return self
     #}}}
Index: /issm/trunk/src/m/classes/frontalforcings.m
===================================================================
--- /issm/trunk/src/m/classes/frontalforcings.m	(revision 27034)
+++ /issm/trunk/src/m/classes/frontalforcings.m	(revision 27035)
@@ -7,4 +7,5 @@
 	properties (SetAccess=public) 
 		meltingrate   = NaN;
+		ablationrate   = NaN;
 	end
 	methods
@@ -29,8 +30,10 @@
 		function self = extrude(self,md) % {{{
 			self.meltingrate=project3d(md,'vector',self.meltingrate,'type','node');
+			self.ablationrate=project3d(md,'vector',self.ablationrate,'type','node');
 		end % }}}
 		function self = setdefaultparameters(self) % {{{
 
 			meltingrate   = NaN;
+			ablationrate   = NaN;
 		end % }}}
 		function md = checkconsistency(self,md,solution,analyses) % {{{
@@ -39,4 +42,7 @@
 
 			md = checkfield(md,'fieldname','frontalforcings.meltingrate','NaN',1,'Inf',1,'timeseries',1,'>=',0);
+			if ~isnan(md.frontalforcings.ablationrate)
+				md = checkfield(md,'fieldname','frontalforcings.ablationrate','Inf',1,'timeseries',1);
+			end
 
 		end % }}}
@@ -44,4 +50,5 @@
 			disp(sprintf('   Frontalforcings parameters:'));
 			fielddisplay(self,'meltingrate','melting rate at given location [m/a]');
+			fielddisplay(self,'ablationrate','frontal ablation rate at given location [m/a], it contains both calving and melting');
 		end % }}}
 		function marshall(self,prefix,md,fid) % {{{
@@ -49,4 +56,7 @@
 			WriteData(fid,prefix,'name','md.frontalforcings.parameterization','data',1,'format','Integer');
 			WriteData(fid,prefix,'object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts,'scale',1./yts);
+			if ~isnan(md.frontalforcings.ablationrate)
+				WriteData(fid,prefix,'object',self,'fieldname','ablationrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts,'scale',1./yts);
+			end
 		end % }}}
 	end
Index: /issm/trunk/src/m/classes/frontalforcingsrignot.py
===================================================================
--- /issm/trunk/src/m/classes/frontalforcingsrignot.py	(revision 27034)
+++ /issm/trunk/src/m/classes/frontalforcingsrignot.py	(revision 27035)
@@ -64,5 +64,5 @@
     def marshall(self, prefix, md, fid):  # {{{
         WriteData(fid, prefix, 'name', 'md.frontalforcings.parameterization', 'data', 2, 'format', 'Integer')
-        WriteData(fid, prefix, 'object', self, 'fieldname', 'basin_id', 'data', self.basin_id, 'name', 'md.frontalforcings.basin_id', 'format', 'IntMat', 'mattype', 2) # 0-indexed
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'basin_id', 'data', self.basin_id - 1, 'name', 'md.frontalforcings.basin_id', 'format', 'IntMat', 'mattype', 2)  # 0-indexed
         WriteData(fid, prefix, 'object', self, 'fieldname', 'num_basins', 'format', 'Integer')
         WriteData(fid, prefix, 'object', self, 'fieldname', 'subglacial_discharge', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', md.constants.yts)
Index: /issm/trunk/src/m/classes/frontalforcingsrignotautoregression.m
===================================================================
--- /issm/trunk/src/m/classes/frontalforcingsrignotautoregression.m	(revision 27034)
+++ /issm/trunk/src/m/classes/frontalforcingsrignotautoregression.m	(revision 27035)
@@ -66,5 +66,5 @@
          fielddisplay(self,'basin_id','basin number assigned to each element [unitless]');
          fielddisplay(self,'subglacial_discharge','sum of subglacial discharge for each basin [m/d]');
-         fielddisplay(self,'beta0','basin-specific intercept values [∘C]');
+         fielddisplay(self,'beta0','basin-specific intercept values [∘C] (if beta_1==0 mean=beta_0/(1-sum(phi)))');
          fielddisplay(self,'beta1','basin-specific trend values [∘C yr^(-1)]');
          fielddisplay(self,'ar_order','order of the autoregressive model [unitless]');
@@ -75,5 +75,5 @@
 		function marshall(self,prefix,md,fid) % {{{
 			yts=md.constants.yts;
-			WriteData(fid,prefix,'name','md.frontalforcings.parameterization','data',55,'format','Integer');
+			WriteData(fid,prefix,'name','md.frontalforcings.parameterization','data',3,'format','Integer');
 			WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','num_basins','format','Integer');
 			WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','subglacial_discharge','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',yts);
Index: /issm/trunk/src/m/classes/frontalforcingsrignotautoregression.py
===================================================================
--- /issm/trunk/src/m/classes/frontalforcingsrignotautoregression.py	(revision 27034)
+++ /issm/trunk/src/m/classes/frontalforcingsrignotautoregression.py	(revision 27035)
@@ -1,10 +1,9 @@
 # -*- coding: utf-8 -*-
-
 import numpy as np
-
 from checkfield import checkfield
 from fielddisplay import fielddisplay
 from MatlabFuncs import *
 from WriteData import WriteData
+
 
 class frontalforcingsrignotautoregression(object):
@@ -36,5 +35,5 @@
         s += '{}\n'.format(fielddisplay(self, 'basin_id', 'basin number assigned to each element [unitless]'))
         s += '{}\n'.format(fielddisplay(self, 'subglacial_discharge', 'sum of subglacial discharge for each basin [m/d]'))
-        s += '{}\n'.format(fielddisplay(self, 'beta0', 'basin-specific intercept values [°C]'))
+        s += '{}\n'.format(fielddisplay(self, 'beta0', 'basin-specific intercept values [°C] (if beta_1==0 mean=beta_0/(1-sum(phi)))'))
         s += '{}\n'.format(fielddisplay(self, 'beta1', 'basin-specific trend values [°C yr^(-1)]'))
         s += '{}\n'.format(fielddisplay(self, 'ar_order', 'order of the autoregressive model [unitless]'))
@@ -49,5 +48,5 @@
         self.num_basins = 0
         self.subglacial_discharge = np.nan
-        self.ar_order = 0.0 # Autoregression model of order 0
+        self.ar_order = 0.0  # Autoregression model of order 0
         return self
     #}}}
@@ -61,4 +60,7 @@
         md = checkfield(md, 'fieldname', 'frontalforcings.basin_id', 'Inf', 1, '>=', 0, '<=', md.frontalforcings.num_basins, 'size', [md.mesh.numberofelements])
         md = checkfield(md, 'fieldname', 'frontalforcings.subglacial_discharge', '>=', 0, 'NaN', 1, 'Inf', 1, 'timeseries', 1)
+        if len(np.shape(self.beta0)) == 1:
+            self.beta0 = np.array([self.beta0])
+            self.beta1 = np.array([self.beta1])
         md = checkfield(md, 'fieldname', 'frontalforcings.beta0', 'NaN', 1, 'Inf', 1, 'size', [1, md.frontalforcings.num_basins], 'numel', md.frontalforcings.num_basins)
         md = checkfield(md, 'fieldname', 'frontalforcings.beta1', 'NaN', 1, 'Inf', 1, 'size', [1, md.frontalforcings.num_basins], 'numel', md.frontalforcings.num_basins)
@@ -77,5 +79,5 @@
     def marshall(self, prefix, md, fid):  # {{{
         yts = md.constants.yts
-        WriteData(fid, prefix, 'name', 'md.frontalforcings.parameterization', 'data', 55, 'format', 'Integer')
+        WriteData(fid, prefix, 'name', 'md.frontalforcings.parameterization', 'data', 3, 'format', 'Integer')
         WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'num_basins', 'format', 'Integer')
         WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'subglacial_discharge', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts)
@@ -83,5 +85,5 @@
         WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'ar_initialtime', 'format', 'Double', 'scale', yts)
         WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'ar_timestep', 'format', 'Double', 'scale', yts)
-        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'basin_id', 'data', self.basin_id, 'name', 'md.frontalforcings.basin_id', 'format', 'IntMat', 'mattype', 2) # 0-indexed
+        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'basin_id', 'data', self.basin_id - 1, 'name', 'md.frontalforcings.basin_id', 'format', 'IntMat', 'mattype', 2)  # 0-indexed
         WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'beta0', 'format', 'DoubleMat', 'name', 'md.frontalforcings.beta0')
         WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'beta1', 'format', 'DoubleMat', 'name', 'md.frontalforcings.beta1', 'scale', 1 / yts, 'yts', yts)
Index: /issm/trunk/src/m/classes/geometry.py
===================================================================
--- /issm/trunk/src/m/classes/geometry.py	(revision 27034)
+++ /issm/trunk/src/m/classes/geometry.py	(revision 27035)
@@ -61,5 +61,9 @@
 
     def marshall(self, prefix, md, fid):  # {{{
-        length_thickness = len(self.thickness)
+        if isinstance(self.thickness, (list, np.ndarray)):
+            length_thickness = len(self.thickness)
+        else:
+            length_thickness = 1
+
         if (length_thickness == md.mesh.numberofvertices) or (length_thickness == md.mesh.numberofvertices + 1):
             WriteData(fid, prefix, 'object', self, 'fieldname', 'thickness', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', md.constants.yts)
Index: /issm/trunk/src/m/classes/groundingline.m
===================================================================
--- /issm/trunk/src/m/classes/groundingline.m	(revision 27034)
+++ /issm/trunk/src/m/classes/groundingline.m	(revision 27035)
@@ -9,4 +9,5 @@
 		friction_interpolation = '';
 		melt_interpolation     = '';
+		requested_outputs      = {};
 	end
 	methods
@@ -25,4 +26,6 @@
 			self.friction_interpolation= 'SubelementFriction1';
 			self.melt_interpolation    = 'NoMeltOnPartiallyFloating';
+			%default output
+         self.requested_outputs     = {'default'};
 
 		end % }}}
@@ -32,4 +35,5 @@
 			md = checkfield(md,'fieldname','groundingline.friction_interpolation','values',{'NoFrictionOnPartiallyFloating' 'SubelementFriction1' 'SubelementFriction2'});
 			md = checkfield(md,'fieldname','groundingline.melt_interpolation','values',{'NoMeltOnPartiallyFloating' 'SubelementMelt1' 'SubelementMelt2' 'FullMeltOnPartiallyFloating'});
+			md = checkfield(md,'fieldname','groundingline.requested_outputs','stringrow',1);
 
 			if ~strcmp(self.migration,'None') & strcmp(solution,'TransientSolution') & md.transient.isgroundingline==1,
@@ -48,4 +52,9 @@
 
 		end % }}}
+		function list = defaultoutputs(self,md) % {{{
+      
+			list = {'Surface','Base','MaskOceanLevelset'};
+         
+      end % }}}
 		function disp(self) % {{{
 			disp(sprintf('   grounding line migration parameters:'));
@@ -53,4 +62,5 @@
 			fielddisplay(self,'friction_interpolation','type of friction interpolation for partially floating elements: ''NoFrictionOnPartiallyFloating'',''SubelementFriction1'', or ''SubelementFriction2''');
 			fielddisplay(self,'melt_interpolation','type of melt interpolation for partially floating elements: ''NoMeltOnPartiallyFloating'',''SubelementMelt1'',''SubelementMelt2'', or ''FullMeltOnPartiallyFloating''');
+			fielddisplay(self,'requested_outputs','additional outputs requested');
 
 		end % }}}
@@ -59,10 +69,20 @@
 			WriteData(fid,prefix,'data',self.friction_interpolation,'name','md.groundingline.friction_interpolation','format','String');
 			WriteData(fid,prefix,'data',self.melt_interpolation,'name','md.groundingline.melt_interpolation','format','String');
+			
+			%process requested outputs
+         outputs = self.requested_outputs;
+         pos  = find(ismember(outputs,'default'));
+         if ~isempty(pos),
+            outputs(pos) = [];                         %remove 'default' from outputs
+            outputs      = [outputs defaultoutputs(self,md)]; %add defaults
+         end
+			WriteData(fid,prefix,'data',outputs,'name','md.groundingline.requested_outputs','format','StringArray')
 		end % }}}
 		function savemodeljs(self,fid,modelname) % {{{
 		
 			writejsstring(fid,[modelname '.groundingline.migration'],self.migration);
-			writejsstring(fid,[modelname '.groundingline.friction_interpolation'],self.migration);
-			writejsstring(fid,[modelname '.groundingline.melt_interpolation'],self.migration);
+			writejsstring(fid,[modelname '.groundingline.friction_interpolation'],self.friction_interpolation);
+			writejsstring(fid,[modelname '.groundingline.melt_interpolation'],self.melt_interpolation);
+			writejscellstring(fid,[modelname '.groundingline.requested_outputs'],self.requested_outputs);
 
 		end % }}}
Index: /issm/trunk/src/m/classes/groundingline.py
===================================================================
--- /issm/trunk/src/m/classes/groundingline.py	(revision 27034)
+++ /issm/trunk/src/m/classes/groundingline.py	(revision 27035)
@@ -18,4 +18,5 @@
         self.friction_interpolation = ''
         self.melt_interpolation = ''
+        self.requested_outptuts = []
 
         # Set defaults
@@ -29,6 +30,12 @@
         s += '{}\n'.format(fielddisplay(self, 'migration', 'type of friction interpolation on partially floating elements: ''SubelementFriction1'', ''SubelementFriction2'', ''NoFrictionOnPartiallyFloating'''))
         s += '{}\n'.format(fielddisplay(self, 'migration', 'type of melt interpolation on partially floating elements: \'SubelementMelt1\', \'SubelementMelt2\', \'NoMeltOnPartiallyFloating\', \'FullMeltOnPartiallyFloating\''))
+        s += '{}\n'.format(fielddisplay(self, 'requested_outputs', 'additional outputs requested'))
         return s
     # }}}
+
+    def defaultoutputs(self, md):  # {{{
+        return ['Surface', 'Base','MaskOceanLevelset']
+
+    #}}}
 
     def setdefaultparameters(self):  # {{{
@@ -37,4 +44,6 @@
         self.friction_interpolation = 'SubelementFriction1'
         self.melt_interpolation = 'NoMeltOnPartiallyFloating'
+        # Default output
+        self.requested_outputs = ['default']
 
         return self
@@ -45,4 +54,5 @@
         md = checkfield(md, 'fieldname', 'groundingline.friction_interpolation', 'values', ['SubelementFriction1', 'SubelementFriction2', 'NoFrictionOnPartiallyFloating'])
         md = checkfield(md, 'fieldname', 'groundingline.melt_interpolation', 'values', ['SubelementMelt1', 'SubelementMelt2', 'NoMeltOnPartiallyFloating', 'FullMeltOnPartiallyFloating'])
+        md = checkfield(md, 'fieldname', 'groundingline.requested_outputs', 'stringrow', 1)
 
         if(not m.strcmp(self.migration, 'None') and md.transient.isgroundingline and solution == 'TransientSolution'):
@@ -62,3 +72,11 @@
         WriteData(fid, prefix, 'data', self.friction_interpolation, 'name', 'md.groundingline.friction_interpolation', 'format', 'String')
         WriteData(fid, prefix, 'data', self.melt_interpolation, 'name', 'md.groundingline.melt_interpolation', 'format', 'String')
+        
+        # Process requested outputs
+        outputs = self.requested_outputs
+        indices = [i for i, x in enumerate(outputs) if x == 'default']
+        if len(indices) > 0:
+            outputscopy = outputs[0:max(0, indices[0] - 1)] + self.defaultoutputs(md) + outputs[indices[0] + 1:]
+            outputs = outputscopy
+        WriteData(fid, prefix, 'data', outputs, 'name', 'md.groundingline.requested_outputs', 'format', 'StringArray')
     # }}}
Index: /issm/trunk/src/m/classes/hydrologyglads.py
===================================================================
--- /issm/trunk/src/m/classes/hydrologyglads.py	(revision 27034)
+++ /issm/trunk/src/m/classes/hydrologyglads.py	(revision 27035)
@@ -58,5 +58,5 @@
 
     def defaultoutputs(self, md):  # {{{
-        list = ['EffectivePressure', 'HydraulicPotential', 'HydrologySheetThickness', 'ChannelArea']
+        list = ['EffectivePressure', 'HydraulicPotential', 'HydrologySheetThickness', 'ChannelArea', 'ChannelDischarge']
         return list
     # }}}
Index: /issm/trunk/src/m/classes/hydrologyshreve.m
===================================================================
--- /issm/trunk/src/m/classes/hydrologyshreve.m	(revision 27034)
+++ /issm/trunk/src/m/classes/hydrologyshreve.m	(revision 27035)
@@ -35,5 +35,4 @@
 		end % }}}
 		function md = checkconsistency(self,md,solution,analyses) % {{{
-
 			%Early return
 			if ~ismember('HydrologyShreveAnalysis',analyses) | (strcmp(solution,'TransientSolution') & md.transient.ishydrology==0), return; end
Index: /issm/trunk/src/m/classes/hydrologytws.m
===================================================================
--- /issm/trunk/src/m/classes/hydrologytws.m	(revision 27034)
+++ /issm/trunk/src/m/classes/hydrologytws.m	(revision 27035)
@@ -44,5 +44,5 @@
 		end % }}}
 		function marshall(self,prefix,md,fid) % {{{
-			WriteData(fid,prefix,'name','md.hydrology.model','data',2,'format','Integer');
+			WriteData(fid,prefix,'name','md.hydrology.model','data',6,'format','Integer');
 			WriteData(fid,prefix,'object',self,'fieldname','spcwatercolumn','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
 			outputs = self.requested_outputs;
Index: /issm/trunk/src/m/classes/hydrologytws.py
===================================================================
--- /issm/trunk/src/m/classes/hydrologytws.py	(revision 27034)
+++ /issm/trunk/src/m/classes/hydrologytws.py	(revision 27035)
@@ -51,9 +51,9 @@
 
     def marshall(self, prefix, md, fid):  # {{{
-        WriteData(fid, prefix, 'name', 'md.hydrology.model', 'data', 2, 'format', 'Integer')
+        WriteData(fid, prefix, 'name', 'md.hydrology.model', 'data', 6, 'format', 'Integer')
         WriteData(fid, prefix, 'object', self, 'fieldname', 'spcwatercolumn', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', md.constants.yts)
         outputs = self.requested_outputs
         pos  = find(ismember(outputs,'default'))
-        if not len(pos),
+        if not len(pos):
             outputs[pos] = [];  # remove 'default' from outputs
             outputs.extend(defaultoutputs(self, md)) # add defaults
Index: /issm/trunk/src/m/classes/initialization.m
===================================================================
--- /issm/trunk/src/m/classes/initialization.m	(revision 27034)
+++ /issm/trunk/src/m/classes/initialization.m	(revision 27035)
@@ -39,5 +39,5 @@
 		function md = checkconsistency(self,md,solution,analyses) % {{{
 			if ismember('StressbalanceAnalysis',analyses) & ~(strcmp(solution,'TransientSolution') & md.transient.isstressbalance == 0),
-				if ~(isnan(md.initialization.vx) | isnan(md.initialization.vy)),
+				if numel(md.initialization.vx)>1 | numel(md.initialization.vy)>1
 					md = checkfield(md,'fieldname','initialization.vx','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices 1]);
 					md = checkfield(md,'fieldname','initialization.vy','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices 1]);
@@ -59,5 +59,5 @@
 				md = checkfield(md,'fieldname','initialization.vy','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices 1]);
 				%Triangle with zero velocity
-				if any(sum(abs(md.initialization.vx(md.mesh.elements)),2)==0 & sum(abs(md.initialization.vy(md.mesh.elements)),2)==0)
+				if any(sum(abs(md.initialization.vx(md.mesh.elements)),2)==0 & sum(abs(md.initialization.vy(md.mesh.elements)),2)==0 & min(md.mask.ice_levelset(md.mesh.elements),[],2)<0)
 					md = checkmessage(md,'at least one triangle has all its vertices with a zero velocity');
 				end
Index: /issm/trunk/src/m/classes/inversion.m
===================================================================
--- /issm/trunk/src/m/classes/inversion.m	(revision 27034)
+++ /issm/trunk/src/m/classes/inversion.m	(revision 27035)
@@ -104,6 +104,6 @@
 			%Only SSA, HO and FS are supported right now
 			if strcmp(solution,'StressbalanceSolution')
-				if ~(md.flowequation.isSSA || md.flowequation.isMLHO || md.flowequation.isHO || md.flowequation.isFS || md.flowequation.isL1L2),
-					md = checkmessage(md,['inversion can only be performed for SSA, MLHO, HO or FS ice flow models']);
+				if ~(md.flowequation.isSSA || md.flowequation.isMOLHO || md.flowequation.isHO || md.flowequation.isFS || md.flowequation.isL1L2),
+					md = checkmessage(md,['inversion can only be performed for SSA, MOLHO, HO or FS ice flow models']);
 				end
 			end
Index: /issm/trunk/src/m/classes/inversion.py
===================================================================
--- /issm/trunk/src/m/classes/inversion.py	(revision 27034)
+++ /issm/trunk/src/m/classes/inversion.py	(revision 27035)
@@ -131,13 +131,26 @@
         md = checkfield(md, 'fieldname', 'inversion.step_threshold', 'size', [md.inversion.nsteps])
         md = checkfield(md, 'fieldname', 'inversion.cost_functions', 'size', [num_costfunc], 'values', supportedcostfunctions())
-        md = checkfield(md, 'fieldname', 'inversion.cost_functions_coefficients', 'size', [md.mesh.numberofvertices, num_costfunc], '>=', 0)
-        md = checkfield(md, 'fieldname', 'inversion.gradient_scaling', 'size', [md.inversion.nsteps, num_controls])
-        md = checkfield(md, 'fieldname', 'inversion.min_parameters', 'size', [md.mesh.numberofvertices, num_controls])
-        md = checkfield(md, 'fieldname', 'inversion.max_parameters', 'size', [md.mesh.numberofvertices, num_controls])
+        if num_costfunc == 1:
+            md.inversion.cost_functions_coefficients = np.squeeze(md.inversion.cost_functions_coefficients)
+            md = checkfield(md, 'fieldname', 'inversion.cost_functions_coefficients', 'size', [md.mesh.numberofvertices], '>=', 0)
+        else:
+            md = checkfield(md, 'fieldname', 'inversion.cost_functions_coefficients', 'size', [md.mesh.numberofvertices, num_costfunc], '>=', 0)
+
+        if num_controls == 1:
+            md.inversion.gradient_scaling = np.squeeze(md.inversion.gradient_scaling)
+            md.inversion.min_parameters = np.squeeze(md.inversion.min_parameters)
+            md.inversion.max_parameters = np.squeeze(md.inversion.max_parameters)
+            md = checkfield(md, 'fieldname', 'inversion.gradient_scaling', 'size', [md.inversion.nsteps])
+            md = checkfield(md, 'fieldname', 'inversion.min_parameters', 'size', [md.mesh.numberofvertices])
+            md = checkfield(md, 'fieldname', 'inversion.max_parameters', 'size', [md.mesh.numberofvertices])
+        else:
+            md = checkfield(md, 'fieldname', 'inversion.gradient_scaling', 'size', [md.inversion.nsteps, num_controls])
+            md = checkfield(md, 'fieldname', 'inversion.min_parameters', 'size', [md.mesh.numberofvertices, num_controls])
+            md = checkfield(md, 'fieldname', 'inversion.max_parameters', 'size', [md.mesh.numberofvertices, num_controls])
 
         # Only SSA, HO and FS are supported right now
         if solution == 'StressbalanceSolution':
-            if not (md.flowequation.isSSA or md.flowequation.isMLHO or md.flowequation.isHO or md.flowequation.isFS or md.flowequation.isL1L2):
-                md.checkmessage("'inversion can only be performed for SSA, MLHO, HO or FS ice flow models")
+            if not (md.flowequation.isSSA or md.flowequation.isMOLHO or md.flowequation.isHO or md.flowequation.isFS or md.flowequation.isL1L2):
+                md.checkmessage("'inversion can only be performed for SSA, MOLHO, HO or FS ice flow models")
         if solution == 'BalancethicknessSolution':
             md = checkfield(md, 'fieldname', 'inversion.thickness_obs', 'size', [md.mesh.numberofvertices], 'NaN', 1, 'Inf', 1)
Index: /issm/trunk/src/m/classes/levelset.m
===================================================================
--- /issm/trunk/src/m/classes/levelset.m	(revision 27034)
+++ /issm/trunk/src/m/classes/levelset.m	(revision 27035)
@@ -62,5 +62,5 @@
 
 			md = checkfield(md,'fieldname','levelset.spclevelset','Inf',1,'timeseries',1);
-			md = checkfield(md,'fieldname','levelset.stabilization','values',[0 1 2 5]);
+			md = checkfield(md,'fieldname','levelset.stabilization','values',[0 1 2 5 6]);
 			md = checkfield(md,'fieldname','levelset.kill_icebergs','numel',1,'values',[0 1]);
 			md = checkfield(md,'fieldname','levelset.migration_max','numel',1,'NaN',1,'Inf',1,'>',0);
Index: /issm/trunk/src/m/classes/lovenumbers.m
===================================================================
--- /issm/trunk/src/m/classes/lovenumbers.m	(revision 27034)
+++ /issm/trunk/src/m/classes/lovenumbers.m	(revision 27035)
@@ -10,14 +10,16 @@
 	properties (SetAccess=public) 
 
-		%regular love numbers:
-		h           = []; %provided by PREM model
-		k           = []; %idem
-		l           = []; %idem
+		%loading love numbers:
+		h           	= []; %provided by PREM model
+		k           	= []; %idem
+		l           	= []; %idem
 		
 		%tidal love numbers for computing rotational feedback:
-		th          = [];
-		tk          = [];
-		tl          = [];
-		tk2secular  = 0; %deg 2 secular number.
+		th            = [];
+		tk            = [];
+		tl            = [];
+		tk2secular    = 0; %deg 2 secular number.
+		pmtf_colinear = [];
+		pmtf_ortho    = [];
 
 		%time/frequency for visco-elastic love numbers
@@ -44,4 +46,7 @@
 			fielddisplay(self,'tl','tidal load Love number (deg 2)');
 			fielddisplay(self,'tk2secular','secular fluid Love number');
+			fielddisplay(self,'pmtf_colinear','Colinear component of the Polar Motion Transfer Function (e.g. x-motion due to x-component perturbation of the inertia tensor)');
+			fielddisplay(self,'pmtf_ortho','Orthogonal component of the Polar Motion Transfer Function (couples x and y components, only used for Chandler Wobble)');
+
 
 			fielddisplay(self,'istime','time (default: 1) or frequency love numbers (0)');
@@ -62,4 +67,10 @@
 			self.tk2secular=0.942; 
 
+			self.pmtf_colinear=0.0;
+			self.pmtf_ortho=0.0;
+			if maxdeg>=2
+				self.pmtf_colinear= (1.0+self.k(3,:))/(1.0-self.tk(3,:)/self.tk2secular); %valid only for elastic regime, not viscous. Also neglects chandler wobble
+				self.pmtf_ortho= 0.0;
+			end
 			%time: 
 			self.istime=1; %temporal love numbers by default
@@ -82,4 +93,6 @@
 			md = checkfield(md,'fieldname','solidearth.lovenumbers.tl','NaN',1,'Inf',1);
 			md = checkfield(md,'fieldname','solidearth.lovenumbers.tk2secular','NaN',1,'Inf',1);
+			md = checkfield(md,'fieldname','solidearth.lovenumbers.pmtf_colinear','NaN',1,'Inf',1);
+			md = checkfield(md,'fieldname','solidearth.lovenumbers.pmtf_ortho','NaN',1,'Inf',1);
 			md = checkfield(md,'fieldname','solidearth.lovenumbers.timefreq','NaN',1,'Inf',1);
 			md = checkfield(md,'fieldname','solidearth.lovenumbers.istime','NaN',1,'Inf',1,'values',[0 1]);
@@ -91,6 +104,10 @@
 
 			ntf=length(self.timefreq);
-			if( size(self.h,2) ~= ntf | size(self.k,2) ~= ntf | size(self.l,2) ~= ntf | size(self.th,2) ~= ntf | size(self.tk,2) ~= ntf | size(self.tl,2) ~= ntf ),
+			if( size(self.h,2) ~= ntf | size(self.k,2) ~= ntf | size(self.l,2) ~= ntf | size(self.th,2) ~= ntf | size(self.tk,2) ~= ntf | size(self.tl,2) ~= ntf | size(self.pmtf_colinear,2) ~= ntf | size(self.pmtf_ortho,2) ~= ntf),
 				error('lovenumbers error message: love numbers should have as many time/frequency steps as the time/frequency vector');
+			end
+
+			if self.istime && self.timefreq(1)~=0
+				error('temporal love numbers must start with elastic response, i.e timefreq(1)=0');
 			end
 
@@ -108,4 +125,6 @@
 			WriteData(fid,prefix,'object',self,'fieldname','tk','name','md.solidearth.lovenumbers.tk','format','DoubleMat','mattype',1);
 			WriteData(fid,prefix,'object',self,'fieldname','tl','name','md.solidearth.lovenumbers.tl','format','DoubleMat','mattype',1);
+			WriteData(fid,prefix,'object',self,'fieldname','pmtf_colinear','name','md.solidearth.lovenumbers.pmtf_colinear','format','DoubleMat','mattype',1);
+			WriteData(fid,prefix,'object',self,'fieldname','pmtf_ortho','name','md.solidearth.lovenumbers.pmtf_ortho','format','DoubleMat','mattype',1);
 			WriteData(fid,prefix,'object',self,'data',self.tk2secular,'fieldname','lovenumbers.tk2secular','format','Double');
 
Index: /issm/trunk/src/m/classes/lovenumbers.py
===================================================================
--- /issm/trunk/src/m/classes/lovenumbers.py	(revision 27034)
+++ /issm/trunk/src/m/classes/lovenumbers.py	(revision 27035)
@@ -19,8 +19,8 @@
 
     def __init__(self, *args):  #{{{
-        # Regular love numbers
-        self.h = []   # Provided by PREM model
-        self.k = []   # idem
-        self.l = []   # idem
+        # Loading love numbers
+        self.h = [] # Provided by PREM model
+        self.k = [] # idem
+        self.l = [] # idem
 
         # Tidal love numbers for computing rotational feedback
@@ -28,5 +28,9 @@
         self.tk = []
         self.tl = []
-        self.tk2secular = 0  # deg 2 secular number
+        self.tk2secular = 0 # deg 2 secular number
+        self.pmtf_colinear = []
+        self.pmtf_ortho = []
+        pmtf_colinear   = []
+        pmtf_ortho      = []
 
         # Time/frequency for visco-elastic love numbers
@@ -49,6 +53,10 @@
         s += '{}\n'.format(fielddisplay(self, 'tl', 'tidal load Love number (deg 2)'))
         s += '{}\n'.format(fielddisplay(self, 'tk2secular', 'secular fluid Love number'))
+        s += '{}\n'.format(fielddisplay(self, 'pmtf_colinear', 'Colinear component of the Polar Motion Transfer Function (e.g. x-motion due to x-component perturbation of the inertia tensor)'))
+        s += '{}\n'.format(fielddisplay(self, 'pmtf_ortho', 'Orthogonal component of the Polar Motion Transfer Function (couples x and y components, only used for Chandler Wobble)'))
         s += '{}\n'.format(fielddisplay(self, 'istime', 'time (default: 1) or frequency love numbers (0)'))
         s += '{}\n'.format(fielddisplay(self, 'timefreq', 'time/frequency vector (yr or 1/yr)'))
+        s += '{}\n'.format(fielddisplay(self, 'pmtf_colinear', 'Colinear component of the Polar Motion Transfer Function (e.g. x-motion due to x-component perturbation of the inertia tensor)'))
+        s += '{}\n'.format(fielddisplay(self, 'pmtf_ortho', 'Orthogonal component of the Polar Motion Transfer Function (couples x and y components, only used for Chandler Wobble)'))
         return s
     #}}}
@@ -65,5 +73,15 @@
         # Secular fluid love number
         self.tk2secular = 0.942
+        self.pmtf_colinear=0.0
+        self.pmtf_ortho=0.0
+        if maxdeg>=2:
+            self.pmtf_colinear= (1.0+self.k[3-1,:])/(1.0-self.tk[3-1,:]/self.tk2secular) #valid only for elastic regime, not viscous. Also neglects chandler wobble
+            self.pmtf_ortho= 0.0
 
+        self.pmtf_colinear = np.array([0.0]).reshape(-1, 1)
+        self.pmtf_ortho = np.array([0.0]).reshape(-1, 1)
+        if maxdeg >= 2:
+            self.pmtf_colinear = ((1.0 + self.k[2, :]) / (1.0 - self.tk[2, :] / self.tk2secular)).reshape(-1, 1) # Valid only for elastic regime, not viscous. Also neglects chandler wobble.
+            self.pmtf_ortho = np.array([0.0]).reshape(-1, 1)
         # Time
         self.istime = 1 # Temporal love numbers by default
@@ -83,4 +101,6 @@
         md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.tl', 'NaN', 1, 'Inf', 1)
         md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.tk2secular', 'NaN', 1, 'Inf', 1)
+        md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.pmtf_colinear', 'NaN', 1, 'Inf', 1)
+        md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.pmtf_ortho', 'NaN', 1, 'Inf', 1)
         md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.timefreq', 'NaN', 1, 'Inf', 1)
         md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.istime', 'NaN', 1, 'Inf', 1, 'values', [0, 1])
@@ -91,7 +111,9 @@
 
         ntf = len(self.timefreq)
-        if (np.shape(self.h)[1] != ntf or np.shape(self.k)[1] != ntf or np.shape(self.l)[1] != ntf or np.shape(self.th)[1] != ntf or np.shape(self.tk)[1] != ntf or np.shape(self.tl)[1] != ntf):
+        if (np.shape(self.h)[1] != ntf or np.shape(self.k)[1] != ntf or np.shape(self.l)[1] != ntf or np.shape(self.th)[1] != ntf or np.shape(self.tk)[1] != ntf or np.shape(self.tl)[1] != ntf or np.shape(self.pmtf_colinear)[1] != ntf or np.shape(self.pmtf_ortho)[1] != ntf):
             raise ValueError('lovenumbers error message: love numbers should have as many time/frequency steps as the time/frequency vector')
 
+        if self.istime and self.timefreq[0] != 0:
+            raise ValueError('temporal love numbers must start with elastic response, i.e. timefreq[0] = 0')
         return md
     #}}}
@@ -109,5 +131,9 @@
         WriteData(fid, prefix, 'object', self, 'fieldname', 'tk', 'name', 'md.solidearth.lovenumbers.tk', 'format', 'DoubleMat', 'mattype', 1)
         WriteData(fid, prefix, 'object', self, 'fieldname', 'tl', 'name', 'md.solidearth.lovenumbers.tl', 'format', 'DoubleMat', 'mattype', 1)
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'pmtf_colinear', 'name', 'md.solidearth.lovenumbers.pmtf_colinear', 'format', 'DoubleMat', 'mattype', 1)
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'pmtf_ortho', 'name', 'md.solidearth.lovenumbers.pmtf_ortho', 'format', 'DoubleMat', 'mattype', 1)
         WriteData(fid, prefix, 'object', self, 'data', self.tk2secular, 'fieldname', 'lovenumbers.tk2secular', 'format', 'Double')
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'pmtf_colinear','name','md.solidearth.lovenumbers.pmtf_colinear','format','DoubleMat','mattype',1);
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'pmtf_ortho','name','md.solidearth.lovenumbers.pmtf_ortho','format','DoubleMat','mattype',1);
 
         if (self.istime):
@@ -118,5 +144,5 @@
         WriteData(fid, prefix, 'object', self, 'fieldname', 'timefreq', 'name', 'md.solidearth.lovenumbers.timefreq', 'format', 'DoubleMat', 'mattype', 1, 'scale', scale);
     #}}}
-
+ 
     def extrude(self, md):  #{{{
         return
Index: /issm/trunk/src/m/classes/m1qn3inversion.py
===================================================================
--- /issm/trunk/src/m/classes/m1qn3inversion.py	(revision 27034)
+++ /issm/trunk/src/m/classes/m1qn3inversion.py	(revision 27035)
@@ -1,4 +1,3 @@
 import numpy as np
-
 from checkfield import checkfield
 from fielddisplay import fielddisplay
Index: /issm/trunk/src/m/classes/massfluxatgate.py
===================================================================
--- /issm/trunk/src/m/classes/massfluxatgate.py	(revision 27034)
+++ /issm/trunk/src/m/classes/massfluxatgate.py	(revision 27035)
@@ -1,2 +1,3 @@
+import numpy as np
 from fielddisplay import fielddisplay
 from pairoptions import pairoptions
@@ -20,5 +21,5 @@
         self.definitionstring = ''
         self.profilename = ''
-        self.segments = float('NaN')
+        self.segments = np.nan
 
     #set defaults
Index: /issm/trunk/src/m/classes/matdamageice.py
===================================================================
--- /issm/trunk/src/m/classes/matdamageice.py	(revision 27034)
+++ /issm/trunk/src/m/classes/matdamageice.py	(revision 27035)
@@ -57,5 +57,5 @@
         s += '{}\n'.format(fielddisplay(self, 'rheology_law', 'law for the temperature dependance of the rheology: \'None\', \'BuddJacka\', \'Cuffey\', \'CuffeyTemperate\', \'Paterson\', \'Arrhenius\' or \'LliboutryDuval\''))
         s += '{}\n'.format(fielddisplay(self, 'earth_density', 'Mantle density [kg m^-3]'))
-        return string
+        return s
     #}}}
 
@@ -93,5 +93,5 @@
         # Thermal exchange velocity (ice-water interface) (m/s)
         self.thermal_exchange_velocity = 1.00e-4
-        # Rheology law: what is the temperature dependence of B with T 
+        # Rheology law: what is the temperature dependence of B with T
         # available: none, paterson and arrhenius
         self.rheology_law = 'Paterson'
Index: /issm/trunk/src/m/classes/materials.m
===================================================================
--- /issm/trunk/src/m/classes/materials.m	(revision 27034)
+++ /issm/trunk/src/m/classes/materials.m	(revision 27035)
@@ -264,7 +264,7 @@
 					end
 					ind=find(md.materials.issolid==0);
-					if sum(ismember(diff(ind),1)>=1) %if there are at least two consecutive indices that contain issolid = 0
-						error(['Fluid layers detected at layers #', num2str(ind'), ', but having 2 or more adjacent fluid layers is not supported yet. Consider merging them.'])
-					end
+					%if sum(ismember(diff(ind),1)>=1) %if there are at least two consecutive indices that contain issolid = 0
+					%		error(['Fluid layers detected at layers #', num2str(ind'), ', but having 2 or more adjacent fluid layers is not supported yet. Consider merging them.'])
+					%end
 
 				case 'hydro'
Index: /issm/trunk/src/m/classes/materials.py
===================================================================
--- /issm/trunk/src/m/classes/materials.py	(revision 27034)
+++ /issm/trunk/src/m/classes/materials.py	(revision 27035)
@@ -1,4 +1,3 @@
 import numpy as np
-
 from checkfield import checkfield
 from fielddisplay import fielddisplay
@@ -173,9 +172,9 @@
                 self.rheology_n = 3
             elif nat == 'litho':
-                # We default to a configuration that enables running GIA 
+                # We default to a configuration that enables running GIA
                 # solutions using giacaron and/or giaivins
                 self.numlayers = 2
 
-                # Center of the earth (approximation, must not be 0), then the 
+                # Center of the earth (approximation, must not be 0), then the
                 # lab (lithosphere/asthenosphere boundary) then the surface
                 # (with 1d3 to avoid numerical singularities)
@@ -250,6 +249,6 @@
                     raise RuntimeError('First layer must be solid (issolid[0] > 0 AND lame_mu[0] > 0). Add a weak inner core if necessary.')
                 ind = np.where(md.materials.issolid == 0)[0]
-                if np.sum(np.in1d(np.diff(ind),1) >= 1): # If there are at least two consecutive indices that contain issolid = 0
-                    raise RuntimeError('Fluid layers detected at layers #' + indices + ', but having 2 or more adjacent fluid layers is not supported yet. Consider merging them.')
+                #if np.sum(np.in1d(np.diff(ind),1) >= 1): # If there are at least two consecutive indices that contain issolid = 0
+                #    raise RuntimeError('Fluid layers detected at layers #' + indices + ', but having 2 or more adjacent fluid layers is not supported yet. Consider merging them.')
 
             elif nat == 'hydro':
@@ -295,5 +294,5 @@
                 WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'density', 'format', 'DoubleMat', 'mattype', 3)
                 WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'viscosity', 'format', 'DoubleMat', 'mattype', 3)
-                WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'rheologymodel', 'format', 'DoubleMat', 'mattype', 3) 
+                WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'rheologymodel', 'format', 'DoubleMat', 'mattype', 3)
                 WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'burgers_viscosity', 'format', 'DoubleMat', 'mattype', 3)
                 WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'burgers_mu', 'format', 'DoubleMat', 'mattype', 3)
Index: /issm/trunk/src/m/classes/model.m
===================================================================
--- /issm/trunk/src/m/classes/model.m	(revision 27034)
+++ /issm/trunk/src/m/classes/model.m	(revision 27035)
@@ -928,13 +928,31 @@
 			x_edges = 0.5*(md.mesh.x(edges(:,1)) + md.mesh.x(edges(:,2)));
 			y_edges = 0.5*(md.mesh.y(edges(:,1)) + md.mesh.y(edges(:,2)));
-			md2.mesh.x = [md2.mesh.x;x_edges];
-			md2.mesh.y = [md2.mesh.y;y_edges];
-			md2.mesh.elements = [...
+			xnew = [md2.mesh.x;x_edges];
+			ynew = [md2.mesh.y;y_edges];
+			indexnew = [...
 				index(:,1)          nbv+edges_tria(:,3) nbv+edges_tria(:,2);...
 				nbv+edges_tria(:,2) nbv+edges_tria(:,3) nbv+edges_tria(:,1);...
 				nbv+edges_tria(:,2) nbv+edges_tria(:,1) index(:,3);...
 				nbv+edges_tria(:,3) index(:,2)          nbv+edges_tria(:,1)];
-			md2.mesh.numberofelements = 4*nbe;
-			md2.mesh.numberofvertices = nbv + size(edges,1);
+			%md2.mesh.numberofelements = 4*nbe;
+			%md2.mesh.numberofvertices = nbv + size(edges,1);
+
+			%Call Bamg to update other mesh properties
+			[bamgmesh_out bamggeom_out]=BamgConvertMesh(indexnew,xnew,ynew);
+			md2.mesh.x              = bamgmesh_out.Vertices(:,1);
+			md2.mesh.y              = bamgmesh_out.Vertices(:,2);
+			md2.mesh.elements       = bamgmesh_out.Triangles(:,1:3);
+			md2.mesh.edges          = bamgmesh_out.IssmEdges;
+			md2.mesh.segments       = bamgmesh_out.IssmSegments(:,1:3);
+			md2.mesh.segmentmarkers = bamgmesh_out.IssmSegments(:,4);
+			md2.mesh.numberofelements = size(md2.mesh.elements,1);
+			md2.mesh.numberofvertices = length(md2.mesh.x);
+			md2.mesh.numberofedges    = size(md2.mesh.edges,1);
+			md2.mesh.vertexonboundary = zeros(md2.mesh.numberofvertices,1); md2.mesh.vertexonboundary(md2.mesh.segments(:,1:2)) = 1;
+
+			%Deal with boudary
+			md2.mesh.vertexonboundary = [md.mesh.vertexonboundary;sum(md.mesh.vertexonboundary(edges),2)==2];
+			md2.mesh.elementconnectivity=bamgmesh_out.ElementConnectivity;
+			md2.mesh.elementconnectivity(find(isnan(md2.mesh.elementconnectivity)))=0;
 			disp(['   Old number of elements: ' num2str(nbe)]);
 			disp(['   New number of elements: ' num2str(4*nbe)]);
@@ -1734,52 +1752,67 @@
 
 		end % }}}
-		function savemodeljs(md,modelname,websiteroot,varargin) % {{{
-		
-			%the goal of this routine is to save the model as a javascript array that can be included in any html 
-			%file: 
-
-			options=pairoptions(varargin{:});
-			optimization=getfieldvalue(options,'optimize',0);
-
-			
-			%disp: 
-			disp(['saving model ''' modelname ''' in file ' websiteroot '/js/' modelname '.js']);
-
-			%open file for writing and declare the model:
-			fid=fopen([websiteroot '/js/' modelname '.js'],'w');
-			fprintf(fid,'var %s=new model();\n',modelname);
-
-			%now go through all the classes and fwrite all the corresponding fields: 
-			
-			fields=properties('model');
+		function saveasstruct(md,filename) % {{{
+
+			fields=sort(properties('model')); %sort fields so that comparison of binary files is easier
+			disp('Converting all model fields to struct...');
+			warning off MATLAB:structOnObject
 			for i=1:length(fields),
 				field=fields{i};
-
-				%Some properties do not need to be saved
-				if ismember(field,{'results','cluster' }),
-					continue;
-				end
-
-				%some optimization: 
-				if optimization==1,
-					%optimize for plotting only:
-					if ~ismember(field,{'geometry','mesh','mask'}),
-						continue;
-					end
-				end
-
-				%Check that current field is an object
-				if ~isobject(md.(field))
-					error(['field ''' char(field) ''' is not an object']);
-				end
-
-				%savemodeljs for current object
-				%disp(['javascript saving ' field '...']);
-				savemodeljs(md.(field),fid,modelname);
-			end
-
-			%done, close file:
-			fclose(fid);
+				md.(field) = struct(md.(field));
+			end
+			disp('Converting model to struct...');
+			md=struct(md);
+			warning on MATLAB:structOnObject
+			disp(['Saving as ' filename '...']);
+			save(filename,'md','-v7.3')
+		end % }}}
+function savemodeljs(md,modelname,websiteroot,varargin) % {{{
+
+	%the goal of this routine is to save the model as a javascript array that can be included in any html 
+	%file: 
+
+	options=pairoptions(varargin{:});
+	optimization=getfieldvalue(options,'optimize',0);
+
+
+	%disp: 
+	disp(['saving model ''' modelname ''' in file ' websiteroot '/js/' modelname '.js']);
+
+	%open file for writing and declare the model:
+	fid=fopen([websiteroot '/js/' modelname '.js'],'w');
+	fprintf(fid,'var %s=new model();\n',modelname);
+
+	%now go through all the classes and fwrite all the corresponding fields: 
+
+	fields=properties('model');
+	for i=1:length(fields),
+		field=fields{i};
+
+		%Some properties do not need to be saved
+		if ismember(field,{'results','cluster' }),
+			continue;
 		end
+
+		%some optimization: 
+		if optimization==1,
+			%optimize for plotting only:
+			if ~ismember(field,{'geometry','mesh','mask'}),
+				continue;
+			end
+		end
+
+		%Check that current field is an object
+		if ~isobject(md.(field))
+			error(['field ''' char(field) ''' is not an object']);
+		end
+
+		%savemodeljs for current object
+		%disp(['javascript saving ' field '...']);
+		savemodeljs(md.(field),fid,modelname);
 	end
- end
+
+	%done, close file:
+	fclose(fid);
+end
+	end
+end
Index: /issm/trunk/src/m/classes/model.py
===================================================================
--- /issm/trunk/src/m/classes/model.py	(revision 27034)
+++ /issm/trunk/src/m/classes/model.py	(revision 27035)
@@ -823,7 +823,7 @@
             md.inversion.max_parameters = project2d(md, md.inversion.max_parameters, md.mesh.numberoflayers)
         if md.smb.__class__.__name__ == 'SMBforcing' and not np.isnan(md.smb.mass_balance).all():
-                md.smb.mass_balance = project2d(md, md.smb.mass_balance, md.mesh.numberoflayers)
+            md.smb.mass_balance = project2d(md, md.smb.mass_balance, md.mesh.numberoflayers)
         elif md.smb.__class__.__name__ == 'SMBhenning' and not np.isnan(md.smb.smbref).all():
-                md.smb.smbref = project2d(md, md.smb.smbref, md.mesh.numberoflayers)
+            md.smb.smbref = project2d(md, md.smb.smbref, md.mesh.numberoflayers)
 
         # Results
Index: /issm/trunk/src/m/classes/pairoptions.py
===================================================================
--- /issm/trunk/src/m/classes/pairoptions.py	(revision 27034)
+++ /issm/trunk/src/m/classes/pairoptions.py	(revision 27035)
@@ -11,11 +11,16 @@
 
     def __init__(self, *arg):  # {{{
-        self.functionname = ''
+        #self.functionname = ''
         self.list = OrderedDict()
 
         #get calling function name
-        import inspect
-        if len(inspect.stack()) > 1:
-            self.functionname = inspect.stack()[1][3]
+        #import inspect
+        #if len(inspect.stack()) > 1:
+        #self.functionname = inspect.stack()[1][3]
+        import traceback
+        try:
+            self.functionname = traceback.extract_stack(limit=2)[0][2]
+        except IndexError:
+            pass  #this is probably similar to the previous if treatment (but faster)
 
         #initialize list
@@ -98,6 +103,7 @@
         """
 
-        disp(['WARNING: pairoptions::displayunused is not yet implemented'])
+        print('WARNING: pairoptions::displayunused is not yet implemented')
     # }}}
+
     def exist(self, field):  # {{{
         """EXIST - check if the option exists
Index: /issm/trunk/src/m/classes/regionaloutput.py
===================================================================
--- /issm/trunk/src/m/classes/regionaloutput.py	(revision 27034)
+++ /issm/trunk/src/m/classes/regionaloutput.py	(revision 27035)
@@ -25,7 +25,8 @@
 
         self.name = ''
+        self.model= ''
         self.definitionstring = ''
         self.outputnamestring = ''
-        self.mask = float('NaN')
+        self.mask = np.nan
         self.maskexpstring = ''
 
@@ -46,6 +47,6 @@
                 self.setmaskfromexp(modelname)
 
-        if (len(self.mask) <= 1 & np.any(np.isnan(self.mask))):
-            error('regionaloutput error message: ''mask'' field or ''maskexpstring'' and ''model'' fields should be defined!')
+        # if (len(self.mask) <= 1 & np.any(np.isnan(self.mask))):
+        #     raise IOError('regionaloutput error message: ''mask'' field or ''maskexpstring'' and ''model'' fields should be defined!')
 
     #}}}
@@ -76,4 +77,5 @@
         return self
     # }}}
+
     def checkconsistency(self, md, solution, analyses):  # {{{
 
Index: /issm/trunk/src/m/classes/results.py
===================================================================
--- /issm/trunk/src/m/classes/results.py	(revision 27034)
+++ /issm/trunk/src/m/classes/results.py	(revision 27035)
@@ -143,8 +143,12 @@
 
     def __getattr__(self, key):  #{{{
-        if len(self.steps) == 1:
-            return getattr(self.steps[0], key)
-        else:
-            raise Exception('<results>.<solution> error: Currently, can only get a field if we are not working with a transient solution.')
+        # NOTE: Currently only returning value from first frame of transient solution (see retrieval of md.results.TransientSolution.BedGRD in test2051.py for justification)
+        return getattr(self.steps[0], key)
+
+        # Original code
+        # if len(self.steps) == 1:
+        #     return getattr(self.steps[0], key)
+        # else:
+        #     raise Exception('<results>.<solution> error: Currently, can only get a field if we are not working with a transient solution.')
     #}}}
 
Index: /issm/trunk/src/m/classes/rifts.py
===================================================================
--- /issm/trunk/src/m/classes/rifts.py	(revision 27034)
+++ /issm/trunk/src/m/classes/rifts.py	(revision 27035)
@@ -67,29 +67,31 @@
 
         numpairs = 0
-        for rift in self.riftstruct:
-            numpairs += np.size(rift['penaltypairs'], axis=0)
+        if numrifts > 0:
+            for rift in self.riftstruct:
+                numpairs += np.size(rift['penaltypairs'], axis=0)
 
-    # Convert strings in riftstruct to hard coded numbers
-        FillDict = {'Air': 0,
-                    'Ice': 1,
-                    'Melange': 2,
-                    'Water': 3}
-        for rift in self.riftstruct:
-            if rift['fill'] in ['Air', 'Ice', 'Melange', 'Water']:
-                rift['fill'] = FillDict[rift['fill']]
+            # Convert strings in riftstruct to hard coded numbers
+            FillDict = {'Air': 0,
+                        'Ice': 1,
+                        'Melange': 2,
+                        'Water': 3}
+            for rift in self.riftstruct:
+                if rift['fill'] in ['Air', 'Ice', 'Melange', 'Water']:
+                    rift['fill'] = FillDict[rift['fill']]
 
-    # 2 for nodes + 2 for elements + 2 for  normals + 1 for length + 1 for fill + 1 for friction + 1 for fraction + 1 for fractionincrement + 1 for state.
-        data = np.zeros((numpairs, 12))
-        count = 0
-        for rift in self.riftstruct:
-            numpairsforthisrift = np.size(rift['penaltypairs'], 0)
-            data[count:count + numpairsforthisrift, 0:7] = rift['penaltypairs']
-            data[count:count + numpairsforthisrift, 7] = rift['fill']
-            data[count:count + numpairsforthisrift, 8] = rift['friction']
-            data[count:count + numpairsforthisrift, 9] = rift['fraction']
-            data[count:count + numpairsforthisrift, 10] = rift['fractionincrement']
-            data[count:count + numpairsforthisrift, 11] = rift['state'].reshape(-1)
-            count += numpairsforthisrift
-
+            # 2 for nodes + 2 for elements + 2 for  normals + 1 for length + 1 for fill + 1 for friction + 1 for fraction + 1 for fractionincrement + 1 for state.
+            data = np.zeros((numpairs, 12))
+            count = 0
+            for rift in self.riftstruct:
+                numpairsforthisrift = np.size(rift['penaltypairs'], 0)
+                data[count:count + numpairsforthisrift, 0:7] = rift['penaltypairs']
+                data[count:count + numpairsforthisrift, 7] = rift['fill']
+                data[count:count + numpairsforthisrift, 8] = rift['friction']
+                data[count:count + numpairsforthisrift, 9] = rift['fraction']
+                data[count:count + numpairsforthisrift, 10] = rift['fractionincrement']
+                data[count:count + numpairsforthisrift, 11] = rift['state'].reshape(-1)
+                count += numpairsforthisrift
+        else:
+            data = np.zeros((numpairs, 12))
         WriteData(fid, prefix, 'data', numrifts, 'name', 'md.rifts.numrifts', 'format', 'Integer')
         WriteData(fid, prefix, 'data', data, 'name', 'md.rifts.riftstruct', 'format', 'DoubleMat', 'mattype', 3)
Index: /issm/trunk/src/m/classes/sampling.m
===================================================================
--- /issm/trunk/src/m/classes/sampling.m	(revision 27034)
+++ /issm/trunk/src/m/classes/sampling.m	(revision 27035)
@@ -9,5 +9,5 @@
 		tau               = 0;
 		beta              = NaN;
-		phi               = 0;
+		phi               = NaN;
 		alpha             = 0;
 		robin             = 0;
@@ -30,5 +30,5 @@
 			disp(sprintf('\n      %s','Parameters of PDE operator (kappa^2 I-Laplacian)^(alpha/2)(tau):'));
 			fielddisplay(self,'kappa','coefficient of the identity operator');
-			fielddisplay(self,'tau','scaling coefficient of the solution (default: 1.0)');
+			fielddisplay(self,'tau','scaling coefficient of the solution');
 			fielddisplay(self,'alpha','exponent in PDE operator, (default: 2.0, BiLaplacian covariance operator)');
 
@@ -47,12 +47,6 @@
 		function self = setdefaultparameters(self) % {{{
 
-			%Scaling coefficient
-			self.tau=1;
-
 			%Apply Robin boundary conditions
 			self.robin=0;
-
-			%Temporal correlation factor
-			self.phi=0;
 
 			%Exponent in fraction SPDE (default: 2, biLaplacian covariance
@@ -77,10 +71,9 @@
 
 			md = checkfield(md,'fieldname','sampling.kappa','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices 1],'>',0);
-			md = checkfield(md,'fieldname','sampling.tau','NaN',1,'Inf',1,'numel',1,'>',0);
+			md = checkfield(md,'fieldname','sampling.tau','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices 1],'>',0);
 			md = checkfield(md,'fieldname','sampling.robin','numel',1,'values',[0 1]);
 			if(md.sampling.robin)
 				md = checkfield(md,'fieldname','sampling.beta','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices 1],'>',0);
-			end
-			md = checkfield(md,'fieldname','sampling.phi','NaN',1,'Inf',1,'numel',1,'>=',0);
+            end
 			md = checkfield(md,'fieldname','sampling.alpha','NaN',1,'Inf',1,'numel',1,'>',0);
 			md = checkfield(md,'fieldname','sampling.seed','NaN',1,'Inf',1,'numel',1);
@@ -91,7 +84,7 @@
 
 			WriteData(fid,prefix,'object',self,'fieldname','kappa','format','DoubleMat','mattype',1);
-			WriteData(fid,prefix,'object',self,'fieldname','tau','format','Double');
+			WriteData(fid,prefix,'object',self,'fieldname','tau','format','DoubleMat','mattype',1);
 			WriteData(fid,prefix,'object',self,'fieldname','beta','format','DoubleMat','mattype',1);
-			WriteData(fid,prefix,'object',self,'fieldname','phi','format','Double');
+			WriteData(fid,prefix,'object',self,'fieldname','phi','format','DoubleMat','mattype',1);
 			WriteData(fid,prefix,'object',self,'fieldname','alpha','format','Integer');
 			WriteData(fid,prefix,'object',self,'fieldname','robin','format','Boolean');
@@ -110,8 +103,8 @@
 
 			nu = self.alpha-1;
-			KAPPA = sqrt(8*nu)/lc;
-			TAU = sqrt(gamma(nu)/(gamma(self.alpha)*(4*pi)*KAPPA^(2*nu)*sigma^2));
-			md.sampling.kappa = KAPPA*ones(md.mesh.numberofvertices,1);
-			md.sampling.tau = TAU;
+			KAPPA = sqrt(8*nu)./lc;
+			TAU = sqrt(gamma(nu)./(gamma(self.alpha)*(4*pi)*KAPPA.^(2*nu).*sigma.^2));
+			md.sampling.kappa = KAPPA.*ones(md.mesh.numberofvertices,1);
+			md.sampling.tau = TAU.*ones(md.mesh.numberofvertices,1);
 
 		end % }}}
@@ -121,5 +114,5 @@
 			writejsdouble(fid,[modelname '.sampling.tau'],self.tau);
 			writejsdouble(fid,[modelname '.sampling.beta'],self.beta);
-			writejsdouble(fid,[modelname '.sampling.phi'],self.beta);
+			writejsdouble(fid,[modelname '.sampling.phi'],self.phi);
 			writejsdouble(fid,[modelname '.sampling.alpha'],self.alpha);
 			writejsdouble(fid,[modelname '.sampling.robin'],self.robin);
Index: /issm/trunk/src/m/classes/solidearth.py
===================================================================
--- /issm/trunk/src/m/classes/solidearth.py	(revision 27034)
+++ /issm/trunk/src/m/classes/solidearth.py	(revision 27035)
@@ -1,4 +1,3 @@
 import numpy as np
-
 from checkfield import checkfield
 from fielddisplay import fielddisplay
@@ -6,5 +5,4 @@
 from MatlabFuncs import *
 from planetradius import planetradius
-from project3d import project3d
 from rotational import rotational
 from solidearthsettings import solidearthsettings
@@ -25,14 +23,14 @@
 
     def __init__(self, *args):  # {{{
-        self.settings           = solidearthsettings()
-        self.external           = None
-        self.lovenumbers        = lovenumbers()
-        self.rotational         = rotational()
-        self.planetradius       = planetradius('earth')
-        self.requested_outputs  = []
-        self.transitions        = []
-        self.partitionice       = []
-        self.partitionhydro     = []
-        self.partitionocean     = []
+        self.settings  = solidearthsettings()
+        self.external  = None
+        self.lovenumbers = lovenumbers()
+        self.rotational = rotational()
+        self.planetradius = planetradius('earth')
+        self.requested_outputs = []
+        self.transitions = []
+        self.partitionice = []
+        self.partitionhydro = []
+        self.partitionocean = []
 
         nargs = len(args)
@@ -44,4 +42,5 @@
             raise Exception('solidearth constructor error message: zero or one argument only!')
     # }}}
+
     def __repr__(self):  # {{{
         s = '   solidearthinputs, forcings and settings:\n'
@@ -57,8 +56,11 @@
         print(self.lovenumbers)
         print(self.rotational)
-        if len(self.external):
+        try:
             print(self.external)
+        except TypeError:
+            pass
         return s
     # }}}
+
     def setdefaultparameters(self, planet):  # {{{
         # Output default
@@ -79,4 +81,5 @@
         self.planetradius = planetradius(planet)
     # }}}
+
     def checkconsistency(self, md, solution, analyses):  # {{{
         if ('SealevelchangeAnalysis' not in analyses) or (solution == 'TransientSolution' and not md.transient.isslc):
@@ -94,7 +97,9 @@
         return md
     # }}}
+
     def defaultoutputs(self, md):  # {{{
         return ['Sealevel']
     # }}}
+
     def marshall(self, prefix, md, fid):  # {{{
         WriteData(fid, prefix, 'object', self, 'fieldname', 'planetradius', 'format', 'Double')
@@ -140,4 +145,5 @@
         WriteData(fid, prefix, 'data', outputs, 'name', 'md.solidearth.requested_outputs', 'format', 'StringArray')
     # }}}
+
     def extrude(self, md):  # {{{
         return self
Index: /issm/trunk/src/m/classes/solidearthsettings.py
===================================================================
--- /issm/trunk/src/m/classes/solidearthsettings.py	(revision 27034)
+++ /issm/trunk/src/m/classes/solidearthsettings.py	(revision 27035)
@@ -120,13 +120,13 @@
             if md.mesh.__class__.__name__ == 'mesh3dsurface':
                 if self.grdmodel == 2:
-                    raise RuntimeException('model requires a 2D mesh to run gia Ivins computations (change mesh from mesh3dsurface to mesh2d)')
+                    raise Exception('model requires a 2D mesh to run gia Ivins computations (change mesh from mesh3dsurface to mesh2d)')
             else:
                 if self.grdmodel == 1:
-                    raise RuntimeException('model requires a 3D surface mesh to run GRD computations (change mesh from mesh2d to mesh3dsurface)')
+                    raise Exception('model requires a 3D surface mesh to run GRD computations (change mesh from mesh2d to mesh3dsurface)')
             if self.sealevelloading and not self.grdocean:
-                raise RuntimeException('solidearthsettings checkconsistency error message: need grdocean on if sealevelloading flag is set')
+                raise Exception('solidearthsettings checkconsistency error message: need grdocean on if sealevelloading flag is set')
 
         if self.compute_bp_grd and not md.solidearth.settings.isgrd:
-            raise RuntimeException('solidearthsettings checkconsistency error message; if bottom pressure grd patterns are requested, solidearth settings class should have isgrd flag on')
+            raise Exception('solidearthsettings checkconsistency error message; if bottom pressure grd patterns are requested, solidearth settings class should have isgrd flag on')
 
         return md
Index: /issm/trunk/src/m/classes/spatiallinearbasalforcings.m
===================================================================
--- /issm/trunk/src/m/classes/spatiallinearbasalforcings.m	(revision 27034)
+++ /issm/trunk/src/m/classes/spatiallinearbasalforcings.m	(revision 27035)
@@ -9,5 +9,7 @@
 		deepwater_melting_rate    = NaN;
 		deepwater_elevation       = NaN;
+		upperwater_melting_rate   = NaN;
 		upperwater_elevation      = NaN;
+		perturbation_melting_rate = NaN;
 		geothermalflux            = NaN;
 	end
@@ -25,5 +27,7 @@
 						self.deepwater_elevation=lb.deepwater_elevation*ones(nvertices,1);
 						self.deepwater_melting_rate=lb.deepwater_melting_rate*ones(nvertices,1);
+						self.upperwater_melting_rate=lb.upperwater_melting_rate*ones(nvertices,1);
 						self.upperwater_elevation=lb.upperwater_elevation*ones(nvertices,1);
+						self.perturbation_melting_rate=lb.perturbation_melting_rate*ones(nvertices,1);
 					else 
 						self=structtoobj(spatiallinearbasalforcings(),varargin{1});
@@ -37,6 +41,8 @@
 			self.deepwater_melting_rate=project3d(md,'vector',self.deepwater_melting_rate,'type','node','layer',1); 
 			self.deepwater_elevation=project3d(md,'vector',self.deepwater_elevation,'type','node','layer',1); 
+			self.upperwater_melting_rate=project3d(md,'vector',self.upperwater_melting_rate,'type','node','layer',1); 
 			self.upperwater_elevation=project3d(md,'vector',self.upperwater_elevation,'type','node','layer',1); 
 			self.geothermalflux=project3d(md,'vector',self.geothermalflux,'type','node','layer',1); %bedrock only gets geothermal flux
+			self.perturbation_melting_rate=project3d(md,'vector',self.perturbation_melting_rate,'type','node','layer',1); 
 		end % }}}
 		function self = initialize(self,md) % {{{
@@ -58,9 +64,14 @@
 		function md = checkconsistency(self,md,solution,analyses) % {{{
 
+			if numel(md.basalforcings.perturbation_melting_rate)>1
+            md = checkfield(md,'fieldname','basalforcings.perturbation_melting_rate','NaN',1,'Inf',1,'timeseries',1);
+         end
+
 			if ismember('MasstransportAnalysis',analyses) & ~(strcmp(solution,'TransientSolution') & md.transient.ismasstransport==0),
 				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'Inf',1,'timeseries',1);
 				md = checkfield(md,'fieldname','basalforcings.deepwater_melting_rate','NaN',1,'Inf',1,'timeseries',1,'>=',0);
 				md = checkfield(md,'fieldname','basalforcings.deepwater_elevation','NaN',1,'Inf',1,'timeseries',1);
-				md = checkfield(md,'fieldname','basalforcings.upperwater_elevation','NaN',1,'Inf',1,'timeseries',1,'<',0);
+				md = checkfield(md,'fieldname','basalforcings.upperwater_melting_rate','NaN',1,'Inf',1,'timeseries',1,'>=',0);
+				md = checkfield(md,'fieldname','basalforcings.upperwater_elevation','NaN',1,'Inf',1,'timeseries',1,'<=',0);
 			end
 			if ismember('BalancethicknessAnalysis',analyses),
@@ -69,4 +80,5 @@
 				md = checkfield(md,'fieldname','basalforcings.deepwater_melting_rate','>=',0,'numel',1);
 				md = checkfield(md,'fieldname','basalforcings.deepwater_elevation','<','basalforcings.upperwater_elevation','numel',1);
+				md = checkfield(md,'fieldname','basalforcings.upperwater_melting_rate','>=',0,'numel',1);
 				md = checkfield(md,'fieldname','basalforcings.upperwater_elevation','<=',0,'numel',1);
 			end
@@ -76,5 +88,6 @@
 				md = checkfield(md,'fieldname','basalforcings.deepwater_melting_rate','>=',0,'numel',1);
 				md = checkfield(md,'fieldname','basalforcings.deepwater_elevation','<','basalforcings.upperwater_elevation','numel',1);
-				md = checkfield(md,'fieldname','basalforcings.upperwater_elevation','<',0,'numel',1);
+				md = checkfield(md,'fieldname','basalforcings.upperwater_melting_rate','>=',0,'numel',1);
+				md = checkfield(md,'fieldname','basalforcings.upperwater_elevation','<=',0,'numel',1);
 				md = checkfield(md,'fieldname','basalforcings.geothermalflux','NaN',1,'Inf',1,'timeseries',1,'>=',0);
 			end
@@ -86,5 +99,7 @@
 			fielddisplay(self,'deepwater_melting_rate','basal melting rate (positive if melting applied for floating ice whith base < deepwater_elevation) [m/yr]');
 			fielddisplay(self,'deepwater_elevation','elevation of ocean deepwater [m]');
+			fielddisplay(self,'upperwater_melting_rate','basal melting rate (positive if melting applied for floating ice whith base >= upperwater_elevation) [m/yr]');
 			fielddisplay(self,'upperwater_elevation','elevation of ocean upperwater [m]');
+			fielddisplay(self,'perturbation_melting_rate','basal melting rate perturbation added to computed melting rate (positive if melting) [m/yr]');
 			fielddisplay(self,'geothermalflux','geothermal heat flux [W/m^2]');
 
@@ -94,16 +109,12 @@
 			yts=md.constants.yts;
 
-			floatingice_melting_rate=zeros(md.mesh.numberofvertices,1);
-			pos=find(md.geometry.base<=md.basalforcings.deepwater_elevation);
-			floatingice_melting_rate(pos)=md.basalforcings.deepwater_melting_rate(pos);
-			pos=find(md.geometry.base>md.basalforcings.deepwater_elevation & md.geometry.base<md.basalforcings.upperwater_elevation);
-			floatingice_melting_rate(pos)=md.basalforcings.deepwater_melting_rate(pos).*(md.geometry.base(pos)-md.basalforcings.upperwater_elevation(pos))./(md.basalforcings.deepwater_elevation(pos)-md.basalforcings.upperwater_elevation(pos));
 			WriteData(fid,prefix,'name','md.basalforcings.model','data',6,'format','Integer');
-			WriteData(fid,prefix,'data',floatingice_melting_rate,'format','DoubleMat','name','md.basalforcings.floatingice_melting_rate','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
 			WriteData(fid,prefix,'object',self,'fieldname','groundedice_melting_rate','format','DoubleMat','name','md.basalforcings.groundedice_melting_rate','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
 			WriteData(fid,prefix,'object',self,'fieldname','geothermalflux','name','md.basalforcings.geothermalflux','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
 			WriteData(fid,prefix,'object',self,'fieldname','deepwater_melting_rate','format','DoubleMat','name','md.basalforcings.deepwater_melting_rate','scale',1./yts,'mattype',1);
 			WriteData(fid,prefix,'object',self,'fieldname','deepwater_elevation','format','DoubleMat','name','md.basalforcings.deepwater_elevation','mattype',1);
+			WriteData(fid,prefix,'object',self,'fieldname','upperwater_melting_rate','format','DoubleMat','name','md.basalforcings.upperwater_melting_rate','scale',1./yts,'mattype',1);
 			WriteData(fid,prefix,'object',self,'fieldname','upperwater_elevation','format','DoubleMat','name','md.basalforcings.upperwater_elevation','mattype',1);
+			WriteData(fid,prefix,'object',self,'fieldname','perturbation_melting_rate','format','DoubleMat','name','md.basalforcings.perturbation_melting_rate','scale',1./yts,'mattype',1);
 		end % }}}
 	end
Index: /issm/trunk/src/m/classes/spatiallinearbasalforcings.py
===================================================================
--- /issm/trunk/src/m/classes/spatiallinearbasalforcings.py	(revision 27034)
+++ /issm/trunk/src/m/classes/spatiallinearbasalforcings.py	(revision 27035)
@@ -21,6 +21,8 @@
             self.deepwater_melting_rate     = np.nan
             self.deepwater_elevation        = np.nan
+            self.upperwater_melting_rate    = np.nan
             self.upperwater_elevation       = np.nan
             self.geothermalflux             = np.nan
+            self.perturbation_melting_rate  = np.nan
 
             self.setdefaultparameters()
@@ -30,8 +32,10 @@
                 nvertices = len(lb.groundedice_melting_rate)
                 self.groundedice_melting_rate   = lb.groundedice_melting_rate
-                self.deepwater_melting_rate     = lb.geothermalflux
+                self.geothermalflux             = lb.geothermalflux
                 self.deepwater_elevation        = lb.deepwater_elevation * np.ones((nvertices, ))
-                self.upperwater_elevation       = lb.deepwater_melting_rate * np.ones((nvertices, ))
-                self.geothermalflux             = lb.upperwater_elevation * np.ones((nvertices, ))
+                self.deepwater_melting_rate     = lb.deepwater_melting_rate * np.ones((nvertices, ))
+                self.upperwater_melting_rate    = lb.upperwater_melting_rate * np.ones((nvertices, ))
+                self.upperwater_elevation       = lb.upperwater_elevation * np.ones((nvertices, ))
+                self.perturbation_melting_rate  = lb.perturbation_melting_rate * np.ones((nvertices, ))
             else:
                 # TODO: This has not been tested
@@ -46,5 +50,7 @@
         s += '{}\n'.format(fielddisplay(self, 'deepwater_melting_rate', 'basal melting rate (positive if melting applied for floating ice whith base < deepwater_elevation) [m/yr]'))
         s += '{}\n'.format(fielddisplay(self, 'deepwater_elevation', 'elevation of ocean deepwater [m]'))
+        s += '{}\n'.format(fielddisplay(self, 'upperwater_melting_rate', 'basal melting rate (positive if melting applied for floating ice whith base >= upperwater_elevation) [m/yr]'))
         s += '{}\n'.format(fielddisplay(self, 'upperwater_elevation', 'elevation of ocean upperwater [m]'))
+        s += '{}\n'.format(fielddisplay(self, 'perturbation_melting_rate', 'basal melting rate perturbation added to computed melting rate (positive if melting) [m/yr]'))
         s += '{}\n'.format(fielddisplay(self, 'geothermalflux', 'geothermal heat flux [W/m^2]'))
         return s
@@ -55,6 +61,8 @@
         self.deepwater_melting_rate = project3d(md, 'vector', self.deepwater_melting_rate, 'type', 'node', 'layer', 1) 
         self.deepwater_elevation = project3d(md, 'vector', self.deepwater_elevation, 'type', 'node', 'layer', 1)
+        self.upperwater_melting_rate = project3d(md, 'vector', self.upperwater_melting_rate, 'type', 'node', 'layer', 1) 
         self.upperwater_elevation = project3d(md, 'vector', self.upperwater_elevation, 'type', 'node', 'layer', 1) 
         self.geothermalflux = project3d(md, 'vector', self.geothermalflux, 'type', 'node', 'layer', 1) # Bedrock only gets geothermal flux
+        self.perturbation_melting_rate = project3d(md, 'vector', self.upperwater_melting_rate, 'type', 'node', 'layer', 1) 
         return self
     #}}}
@@ -72,8 +80,11 @@
 
     def checkconsistency(self, md, solution, analyses): #{{{
+        if not np.all(np.isnan(self.perturbation_melting_rate)):
+            md = checkfield(md, 'fieldname', 'basalforcings.perturbation_melting_rate', 'NaN', 1, 'Inf', 1, 'timeseries', 1)
         if 'MasstransportAnalysis' in analyses and not solution == 'TransientSolution' and not md.transient.ismasstransport:
             md = checkfield(md, 'fieldname', 'basalforcings.groundedice_melting_rate', 'NaN', 1, 'Inf', 1, 'timeseries', 1)
             md = checkfield(md, 'fieldname', 'basalforcings.deepwater_melting_rate', 'NaN', 1, 'Inf', 1, 'timeseries', 1, '>=', 0)
             md = checkfield(md, 'fieldname', 'basalforcings.deepwater_elevation', 'NaN', 1, 'Inf', 1, 'timeseries', 1)
+            md = checkfield(md, 'fieldname', 'basalforcings.upperwater_melting_rate', 'NaN', 1, 'Inf', 1, 'timeseries', 1, '>=', 0)
             md = checkfield(md, 'fieldname', 'basalforcings.upperwater_elevation', 'NaN', 1, 'Inf', 1, 'timeseries', 1, '<', 0)
         if 'BalancethicknessAnalysis' in analyses:
@@ -82,4 +93,5 @@
             md = checkfield(md, 'fieldname', 'basalforcings.deepwater_melting_rate', '>=', 0, 'numel', 1)
             md = checkfield(md, 'fieldname', 'basalforcings.deepwater_elevation', '<', 'basalforcings.upperwater_elevation', 'numel', 1)
+            md = checkfield(md, 'fieldname', 'basalforcings.upperwater_melting_rate', '>=', 0, 'numel', 1)
             md = checkfield(md, 'fieldname', 'basalforcings.upperwater_elevation', '<=', 0, 'numel', 1)
         if 'ThermalAnalysis' in analyses and not solution == 'TransientSolution' and not md.transient.isthermal:
@@ -89,4 +101,5 @@
             md = checkfield(md, 'fieldname', 'basalforcings.deepwater_elevation', '<', 'basalforcings.upperwater_elevation', 'numel', 1)
             md = checkfield(md, 'fieldname', 'basalforcings.upperwater_elevation', '<', 0, 'numel', 1)
+            md = checkfield(md, 'fieldname', 'basalforcings.deepwater_melting_rate', '>=', 0, 'numel', 1)
             md = checkfield(md, 'fieldname', 'basalforcings.geothermalflux', 'NaN', 1, 'Inf', 1, 'timeseries', 1, '>=', 0)
         return md
@@ -96,15 +109,11 @@
         yts = md.constants.yts
 
-        floatingice_melting_rate = np.zeros((md.mesh.numberofvertices, ))
-        pos = np.where(md.geometry.base <= md.basalforcings.deepwater_elevation)[0]
-        floatingice_melting_rate[pos] = md.basalforcings.deepwater_melting_rate[pos]
-        pos = np.where(np.logical_and.reduce(md.geometry.base > md.basalforcings.deepwater_elevation, md.geometry.base < md.basalforcings.upperwater_elevation))
-        floatingice_melting_rate[pos] = md.basalforcings.deepwater_melting_rate[pos] * (md.geometry.base[pos] - md.basalforcings.upperwater_elevation[pos]) / (md.basalforcings.deepwater_elevation[pos] - md.basalforcings.upperwater_elevation[pos])
         WriteData(fid, prefix, 'name', 'md.basalforcings.model', 'data', 6, 'format', 'Integer')
-        WriteData(fid, prefix, 'data', floatingice_melting_rate, 'format', 'DoubleMat', 'name', 'md.basalforcings.floatingice_melting_rate', 'mattype', 1, 'scale', 1. / yts, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', md.constants.yts)
         WriteData(fid, prefix, 'object', self, 'fieldname', 'groundedice_melting_rate', 'format', 'DoubleMat', 'name', 'md.basalforcings.groundedice_melting_rate', 'mattype', 1, 'scale', 1. / yts, 'timeserieslength', md.mesh.numberofvertices + 1,'yts', md.constants.yts)
         WriteData(fid, prefix,'object', self, 'fieldname', 'geothermalflux', 'name', 'md.basalforcings.geothermalflux', 'format', 'DoubleMat', 'mattype', 1,'timeserieslength', md.mesh.numberofvertices + 1, 'yts', md.constants.yts)
         WriteData(fid, prefix, 'object', self, 'fieldname', 'deepwater_melting_rate', 'format', 'DoubleMat', 'name', 'md.basalforcings.deepwater_melting_rate', 'scale', 1. / yts, 'mattype', 1)
         WriteData(fid, prefix, 'object', self, 'fieldname', 'deepwater_elevation', 'format', 'DoubleMat', 'name', 'md.basalforcings.deepwater_elevation', 'mattype', 1)
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'upperwater_melting_rate', 'format', 'DoubleMat', 'name', 'md.basalforcings.upperwater_melting_rate', 'scale', 1. / yts, 'mattype', 1)
         WriteData(fid, prefix, 'object', self, 'fieldname', 'upperwater_elevation', 'format', 'DoubleMat', 'name', 'md.basalforcings.upperwater_elevation', 'mattype', 1)
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'perturbation_melting_rate', 'format', 'DoubleMat', 'name', 'md.basalforcings.perturbation_melting_rate', 'scale', 1. / yts, 'mattype', 1)
     #}}}
Index: /issm/trunk/src/m/classes/stochasticforcing.m
===================================================================
--- /issm/trunk/src/m/classes/stochasticforcing.m	(revision 27034)
+++ /issm/trunk/src/m/classes/stochasticforcing.m	(revision 27035)
@@ -11,4 +11,5 @@
 		default_id				= NaN;
 		covariance				= NaN;
+		stochastictimestep   = 0;
 		randomflag				= 1;
 	end
@@ -35,4 +36,7 @@
 
 			num_fields = numel(self.fields);
+			if(self.stochastictimestep==0)
+				md.stochasticforcing.stochastictimestep = md.timestepping.time_step; %by default: stochastictimestep set to ISSM time step
+			end
 
 			%Check that covariance matrix is positive definite
@@ -48,5 +52,5 @@
 			for field=self.fields
 				%Checking agreement of classes
-				if(contains(field,'SMB'))
+				if(contains(field,'SMBautoregression'))
 					mdname = structstoch.mdnames(find(strcmp(structstoch.fields,char(field))));
 					if~(isequal(class(md.smb),char(mdname)))
@@ -54,4 +58,10 @@
 					end
 				end
+				if(contains(field,'SMBforcing'))
+					mdname = structstoch.mdnames(find(strcmp(structstoch.fields,char(field))));
+					if~(isequal(class(md.smb),char(mdname)))
+						error('md.smb does not agree with stochasticforcing field %s', char(field));
+					end
+				end
 				if(contains(field,'FrontalForcings'))
 					mdname = structstoch.mdnames(find(strcmp(structstoch.fields,char(field))));
@@ -67,4 +77,16 @@
 				end
 				if(contains(field,'BasalforcingsFloatingice'))
+					mdname = structstoch.mdnames(find(strcmp(structstoch.fields,char(field))));
+					if~(isequal(class(md.basalforcings),char(mdname)))
+						error('md.basalforcings does not agree with stochasticforcing field %s', char(field));
+					end
+				end
+				if(contains(field,'BasalforcingsSpatialDeepwaterMeltingRate'))
+					mdname = structstoch.mdnames(find(strcmp(structstoch.fields,char(field))));
+					if~(isequal(class(md.basalforcings),char(mdname)))
+						error('md.basalforcings does not agree with stochasticforcing field %s', char(field));
+					end
+				end
+				if(contains(field,'BasalforcingsDeepwaterMeltingRateAutoregression'))
 					mdname = structstoch.mdnames(find(strcmp(structstoch.fields,char(field))));
 					if~(isequal(class(md.basalforcings),char(mdname)))
@@ -85,31 +107,65 @@
             end
 				%Checking for specific dimensions
-				if ~(strcmp(field,'SMBautoregression') || strcmp(field,'FrontalForcingsRignotAutoregression'))
+				if ~(strcmp(field,'SMBautoregression') || strcmp(field,'FrontalForcingsRignotAutoregression') || strcmp(field,'BasalforcingsDeepwaterMeltingRateAutoregression'))
 					checkdefaults = true; %field with non-specific dimensionality
 				end
 			end
 
-			%Retrieve sum of all the field dimensionalities
-			size_tot	= self.defaultdimension*num_fields;
-			indSMBar	= -1; %about to check for index of SMBautoregression
-			indTFar	= -1; %about to check for index of FrontalForcingsRignotAutoregression
+			%Retrieve all the field dimensionalities
+			dimensions = self.defaultdimension*ones(1,num_fields);
+			indSMBar   = -1; %about to check for index of SMBautoregression
+			indTFar	  = -1; %about to check for index of FrontalForcingsRignotAutoregression
+			indBDWar	  = -1; %about to check for index of BasalforcingsDeepwaterMeltingRateAutoregression
 			if any(contains(self.fields,'SMBautoregression'))
-				size_tot = size_tot-self.defaultdimension+md.smb.num_basins;
-				indSMBar = find(contains(self.fields,'SMBautoregression')); %index of SMBar, now check for consistency with TFar timestep (08Nov2021)
+				indSMBar = find(contains(self.fields,'SMBautoregression')); %index of SMBar, now check for consistency with other ar timesteps 
+				dimensions(indSMBar) = md.smb.num_basins;
+				if(md.smb.ar_timestep<self.stochastictimestep)
+					error('SMBautoregression cannot have a timestep shorter than stochastictimestep');
+				end
 			end
 			if any(contains(self.fields,'FrontalForcingsRignotAutoregression'))
-				size_tot	= size_tot-self.defaultdimension+md.frontalforcings.num_basins;
-				indTFar	= find(contains(self.fields,'FrontalForcingsRignotAutoregression')); %index of TFar, now check for consistency with SMBar timestep (08Nov2021)
-			end
+				indTFar	= find(contains(self.fields,'FrontalForcingsRignotAutoregression')); %index of TFar, now check for consistency with other ar timesteps 
+				dimensions(indTFar) = md.frontalforcings.num_basins;
+				if(md.frontalforcings.ar_timestep<self.stochastictimestep)
+					error('FrontalForcingsRignotAutoregression cannot have a timestep shorter than stochastictimestep');
+				end
+			end
+			if any(contains(self.fields,'BasalforcingsDeepwaterMeltingRateAutoregression'))
+				indBDWar	= find(contains(self.fields,'BasalforcingsDeepwaterMeltingRateAutoregression')); %index of BDWar, now check for consistency with other ar timesteps 
+				dimensions(indBDWar) = md.basalforcings.num_basins;
+				if(md.basalforcings.ar_timestep<self.stochastictimestep)
+					error('BasalforcingsDeepwaterMeltingRateAutoregression cannot have a timestep shorter than stochastictimestep');
+				end
+			end
+			size_tot = sum(dimensions);
 
 			if(indSMBar~=-1 && indTFar~=-1) %both autoregressive models are used: check autoregressive time step consistency
-				if((md.smb.ar_timestep~=md.frontalforcings.ar_timestep) && any(self.covariance(1+sum(self.dimensions(1:indSMBar-1)):sum(self.dimensions(1:indSMBar)),1+sum(self.dimensions(1:indTFar-1)):sum(self.dimensions(1:indTFar))))~=0)
-					error('SMBautoregression and FrontalForcingsRignotAutoregression have different ar_timestep and non-zero covariance');
-				end
-			end
-
+				if(md.smb.ar_timestep~=md.frontalforcings.ar_timestep)
+					crossentries = reshape(self.covariance(1+sum(dimensions(1:indSMBar-1)):sum(dimensions(1:indSMBar)),1+sum(dimensions(1:indTFar-1)):sum(dimensions(1:indTFar))),1,[]);
+					if any(crossentries~=0)
+						error('SMBautoregression and FrontalForcingsRignotAutoregression have different ar_timestep and non-zero covariance');
+					end
+				end
+			end
+			if(indSMBar~=-1 && indBDWar~=-1) %both autoregressive models are used: check autoregressive time step consistency
+				if(md.smb.ar_timestep~=md.basalforcings.ar_timestep)
+					crossentries = reshape(self.covariance(1+sum(dimensions(1:indSMBar-1)):sum(dimensions(1:indSMBar)),1+sum(dimensions(1:indBDWar-1)):sum(dimensions(1:indBDWar))),1,[]);
+					if any(crossentries~=0)
+						error('SMBautoregression and BasalforcingsDeepwaterMeltingRateAutoregression have different ar_timestep and non-zero covariance');
+					end
+				end
+			end
+			if(indTFar~=-1 && indBDWar~=-1) %both autoregressive models are used: check autoregressive time step consistency
+				if(md.frontalforcings.ar_timestep~=md.basalforcings.ar_timestep)
+					crossentries = reshape(self.covariance(1+sum(dimensions(1:indTFar-1)):sum(dimensions(1:indTFar)),1+sum(dimensions(1:indBDWar-1)):sum(dimensions(1:indBDWar))),1,[]);
+					if any(crossentries~=0)
+						error('FrontalForcingsRignotAutoregression and BasalforcingsDeepwaterMeltingRateAutoregression have different ar_timestep and non-zero covariance');
+					end
+				end
+			end
 			md = checkfield(md,'fieldname','stochasticforcing.isstochasticforcing','values',[0 1]);
 			md = checkfield(md,'fieldname','stochasticforcing.fields','numel',num_fields,'cell',1,'values',supportedstochforcings());
 			md = checkfield(md,'fieldname','stochasticforcing.covariance','NaN',1,'Inf',1,'size',[size_tot,size_tot]); %global covariance matrix
+			md = checkfield(md,'fieldname','stochasticforcing.stochastictimestep','NaN',1,'Inf',1,'>=',md.timestepping.time_step);
 			md = checkfield(md,'fieldname','stochasticforcing.randomflag','numel',[1],'values',[0 1]);
 			if(checkdefaults) %need to check the defaults
@@ -121,8 +177,9 @@
 			disp(sprintf('   stochasticforcing parameters:'));
 			fielddisplay(self,'isstochasticforcing','is stochasticity activated?');
-			fielddisplay(self,'fields','fields with stochasticity applied, ex: {''SMBautoregression''}, or {''FrontalForcingsRignotAutoregression''}');
+			fielddisplay(self,'fields','fields with stochasticity applied, ex: [{''SMBautoregression''}], or [{''SMBforcing''},{''DefaultCalving''}]');
 			fielddisplay(self,'defaultdimension','dimensionality of the noise terms (does not apply to fields with their specific dimension)');
 			fielddisplay(self,'default_id','id of each element for partitioning of the noise terms (does not apply to fields with their specific partition)');
 			fielddisplay(self,'covariance','covariance matrix for within- and between-fields covariance (units must be squared field units)');
+			fielddisplay(self,'stochastictimestep','timestep at which new stochastic noise terms are generated (default: md.timestepping.time_step)');
 			fielddisplay(self,'randomflag','whether to apply real randomness (true) or pseudo-randomness with fixed seed (false)');
 			disp('Available fields:');
@@ -140,4 +197,9 @@
 				return
 			else
+
+				if(self.stochastictimestep==0)
+					disp('      stochasticforcing.stocahstictimestep not specified: set to md.timestepping.time_step');
+					self.stochastictimestep = md.timestepping.time_step; %by default: stochastictimestep set to ISSM time step
+				end
 
 				%Retrieve dimensionality of each field
@@ -152,9 +214,12 @@
 						dimensions(ind) = md.frontalforcings.num_basins;
 					end
+					if(strcmp(field,'BasalforcingsDeepwaterMeltingRateAutoregression'))
+						dimensions(ind) = md.basalforcings.num_basins;
+					end
 					ind = ind+1;
 				end
 
 				%Scaling covariance matrix (scale column-by-column and row-by-row)
-				scaledfields = {'DefaultCalving','FloatingMeltRate','SMBautoregression'}; %list of fields that need scaling *1/yts
+				scaledfields = {'BasalforcingsDeepwaterMeltingRateAutoregression','BasalforcingsSpatialDeepwaterMeltingRate','DefaultCalving','FloatingMeltRate','SMBautoregression','SMBforcing'}; %list of fields that need scaling *1/yts
 				tempcovariance = self.covariance; %copy of covariance to avoid writing back in member variable
 				for i=1:num_fields
@@ -173,4 +238,5 @@
 					self.default_id = zeros(md.mesh.numberofelements,1);
 				end
+
 				WriteData(fid,prefix,'data',num_fields,'name','md.stochasticforcing.num_fields','format','Integer');
 				WriteData(fid,prefix,'object',self,'fieldname','fields','format','StringArray');
@@ -179,4 +245,5 @@
 				WriteData(fid,prefix,'object',self,'fieldname','defaultdimension','format','Integer');
 				WriteData(fid,prefix,'data',tempcovariance,'name','md.stochasticforcing.covariance','format','DoubleMat');
+				WriteData(fid,prefix,'object',self,'fieldname','stochastictimestep','format','Double','scale',yts);
 				WriteData(fid,prefix,'object',self,'fieldname','randomflag','format','Boolean');
 			end
@@ -195,16 +262,22 @@
 	% supported and corresponding md names
 	structure.fields = {...
+		'BasalforcingsDeepwaterMeltingRateAutoregression',...
+		'BasalforcingsSpatialDeepwaterMeltingRate',...
 		'DefaultCalving',...
 		'FloatingMeltRate',...
 		'FrictionWaterPressure',...
 		'FrontalForcingsRignotAutoregression',...
-		'SMBautoregression'
+		'SMBautoregression',...
+		'SMBforcing'
 		};
 	structure.mdnames = {...
+		'autoregressionlinearbasalforcings',...
+		'spatiallinearbasalforcings',...
 		'calving',...
 		'basalforcings',...
 		'friction',...
 		'frontalforcingsrignotautoregression',...
-		'SMBautoregression'
+		'SMBautoregression',...
+		'SMBforcing'
 	};
 end % }}}
Index: /issm/trunk/src/m/classes/stochasticforcing.py
===================================================================
--- /issm/trunk/src/m/classes/stochasticforcing.py	(revision 27034)
+++ /issm/trunk/src/m/classes/stochasticforcing.py	(revision 27035)
@@ -18,4 +18,5 @@
         self.default_id = np.nan
         self.covariance = np.nan
+        self.stochastictimestep = 0
         self.randomflag = 1
 
@@ -28,14 +29,18 @@
         s = '   stochasticforcing parameters:\n'
         s += '{}\n'.format(fielddisplay(self, 'isstochasticforcing', 'is stochasticity activated?'))
-        s += '{}\n'.format(fielddisplay(self, 'fields', 'fields with stochasticity applied, ex: [\'SMBautoregression\'], or [\'FrontalForcingsRignotAutoregression\']'))
+        s += '{}\n'.format(fielddisplay(self, 'fields', 'fields with stochasticity applied, ex: [\'SMBautoregression\'], or [\'SMBforcing\',\'DefaultCalving\']'))
         s += '{}\n'.format(fielddisplay(self, 'defaultdimension', 'dimensionality of the noise terms (does not apply to fields with their specific dimension)'))
         s += '{}\n'.format(fielddisplay(self, 'default_id', 'id of each element for partitioning of the noise terms (does not apply to fields with their specific partition)'))
         s += '{}\n'.format(fielddisplay(self, 'covariance', 'covariance matrix for within- and between-fields covariance (units must be squared field units)'))
+        s += '{}\n'.format(fielddisplay(self, 'stochastictimestep', 'timestep at which new stochastic noise terms are generated (default: md.timestepping.time_step)'))
         s += '{}\n'.format(fielddisplay(self, 'randomflag', 'whether to apply real randomness (true) or pseudo-randomness with fixed seed (false)'))
         s += 'Available fields:\n'
+        s += '   BasalforcingsSpatialDeepwaterMeltingRate\n'
         s += '   DefaultCalving\n'
         s += '   FloatingMeltRate\n'
+        s += '   FrictionWaterPressure\n'
+        s += '   FrontalForcingsRignotAutoregression (thermal forcing)\n'
         s += '   SMBautoregression\n'
-        s += '   FrontalForcingsRignotAutoregression (thermal forcing)\n'
+        s += '   SMBforcing\n'
         return s
     #}}}
@@ -43,7 +48,7 @@
     def setdefaultparameters(self):  # {{{
         # Type of stabilization used
-        self.isstochasticforcing = 0 # stochasticforcing is turned off by default
-        self.fields = [] # Need to initialize to list to avoid "RuntimeError: object of type 'float' has no len()" on import of class
-        self.randomflag = 1 # true randomness is implemented by default
+        self.isstochasticforcing = 0  # stochasticforcing is turned off by default
+        self.fields = []  # Need to initialize to list to avoid "RuntimeError: object of type 'float' has no len()" on import of class
+        self.randomflag = 1  # true randomness is implemented by default
         return self
     #}}}
@@ -55,4 +60,7 @@
 
         num_fields = len(self.fields)
+        if(self.stochastictimestep==0):
+            md.stochasticforcing.stochastictimestep = md.timestepping.time_step #by default: stochastictimestep set to ISSM time step
+            print('      stochasticforcing.stocahstictimestep not specified: set to md.timestepping.time_step')
 
         # Check that covariance matrix is positive definite (this is done internally by linalg)
@@ -63,9 +71,13 @@
 
         # Check that all fields agree with the corresponding md class and if any field needs the default params
-        checkdefaults = False # Need to check defaults only if one of the fields does not have its own dimensionality
+        checkdefaults = False  # Need to check defaults only if one of the fields does not have its own dimensionality
         structstoch = self.structstochforcing()
         for field in self.fields:
             # Checking agreement of classes
-            if 'SMB' in field:
+            if 'SMBautoregression' in field:
+                mdname = structstoch[field]
+                if (type(md.smb).__name__ != mdname):
+                    raise TypeError('md.smb does not agree with stochasticforcing field {}'.format(field))
+            if 'SMBforcing' in field:
                 mdname = structstoch[field]
                 if (type(md.smb).__name__ != mdname):
@@ -83,39 +95,68 @@
                 if (type(md.basalforcings).__name__ != mdname):
                     raise TypeError('md.basalforcings does not agree with stochasticforcing field {}'.format(field))
+            if 'BasalforcingsSpatialDeepwaterMeltingRate' in field:
+                mdname = structstoch[field]
+                if (type(md.basalforcings).__name__ != mdname):
+                    raise TypeError('md.basalforcings does not agree with stochasticforcing field {}'.format(field))
+            if 'BasalforcingsDeepwaterMeltingRateAutoregression' in field:
+                mdname = structstoch[field]
+                if (type(md.basalforcings).__name__ != mdname):
+                    raise TypeError('md.basalforcings does not agree with stochasticforcing field {}'.format(field))
             if 'WaterPressure' in field:
                 mdname = structstoch[field]
                 if (type(md.friction).__name__ != mdname):
                     raise TypeError('stochasticforcing field {} is only implemented for default friction'.format(field))
-                if (md.friction.coupling!=0 and md.friction.coupling!=1 and md.friction.coupling!=2):
+                if md.friction.coupling not in[0, 1, 2]:
                     raise TypeError('stochasticforcing field {} is only implemented for cases md.friction.coupling 0 or 1 or 2'.format(field))
-                if (np.any(md.friction.q==0)):
-                        raise TypeError('stochasticforcing field {} requires non-zero q exponent'.format(field))
+                if (np.any(md.friction.q == 0)):
+                    raise TypeError('stochasticforcing field {} requires non-zero q exponent'.format(field))
 
             # Checking for specific dimensions
-            if not (field == 'SMBautoregression' or field == 'FrontalForcingsRignotAutoregression'):
-                checkdefaults = True # field with non-specific dimensionality
+            if field not in['SMBautoregression', 'FrontalForcingsRignotAutoregression','BasalforcingsDeepwaterMeltingRateAutoregression']:
+                checkdefaults = True  # field with non-specific dimensionality
 
         # Retrieve sum of all the field dimensionalities
-        size_tot = self.defaultdimension * num_fields
-        indSMBar = -1 # About to check for index of SMBautoregression
-        indTFar = -1 # About to check for index of FrontalForcingsRignotAutoregression
+        dimensions = self.defaultdimension*np.ones((num_fields))
+        indSMBar   = -1  # About to check for index of SMBautoregression
+        indTFar    = -1  # About to check for index of FrontalForcingsRignotAutoregression
+        indBDWar   = -1  # About to check for index of BasalforcingsDeepwaterMeltingRateAutoregression
         if ('SMBautoregression' in self.fields):
-            size_tot = size_tot - self.defaultdimension + md.smb.num_basins
-            indSMBar = self.fields.index('SMBautoregression') # Index of SMBar, now check for consistency with TFar timestep (08Nov2021)
+            indSMBar = self.fields.index('SMBautoregression')  # Index of SMBar, now check for consistency with other timesteps
+            dimensions[indSMBar] = md.smb.num_basins
+            if(md.smb.ar_timestep<self.stochastictimestep):
+                raise TypeError('SMBautoregression cannot have a timestep shorter than stochastictimestep')
         if ('FrontalForcingsRignotAutoregression' in self.fields):
-            size_tot = size_tot - self.defaultdimension + md.frontalforcings.num_basins
-            indTFar = self.fields.index('FrontalForcingsRignotAutoregression') # Index of TFar, now check for consistency with SMBar timestep (08Nov2021)
-        if (indSMBar != -1 and indTFar != -1): # Both autoregressive models are used: check autoregressive time step consistency
-            covsum = self.covariance[np.sum(self.defaultdimensions[0:indSMBar]).astype(int):np.sum(self.defaultdimensions[0:indSMBar + 1]).astype(int), np.sum(self.defaultdimensions[0:indTFar]).astype(int):np.sum(self.defaultdimensions[0:indTFar + 1]).astype(int)]
+            indTFar = self.fields.index('FrontalForcingsRignotAutoregression')  # Index of TFar, now check for consistency with other timesteps
+            dimensions[indTFar] = md.frontalforcings.num_basins
+            if(md.frontalforcings.ar_timestep<self.stochastictimestep):
+                raise TypeError('FrontalForcingsRignotAutoregression cannot have a timestep shorter than stochastictimestep')
+        if ('BasalforcingsDeepwaterMeltingRateAutoregression' in self.fields):
+            indBDWar = self.fields.index('BasalforcingsDeepwaterMeltingRateAutoregression')  # Index of BDWar, now check for consistency with other timesteps
+            dimensions[indTFar] = md.basalforcings.num_basins
+            if(md.basalforcings.ar_timestep<self.stochastictimestep):
+                raise TypeError('BasalforcingsDeepwaterMeltingRateAutoregression cannot have a timestep shorter than stochastictimestep')
+        size_tot = np.sum(dimensions)
+
+        if (indSMBar != -1 and indTFar != -1):  # Both autoregressive models are used: check autoregressive time step consistency
+            covsum = self.covariance[np.sum(dimensions[0:indSMBar]).astype(int):np.sum(dimensions[0:indSMBar + 1]).astype(int), np.sum(dimensions[0:indTFar]).astype(int):np.sum(dimensions[0:indTFar + 1]).astype(int)]
             if((md.smb.ar_timestep != md.frontalforcings.ar_timestep) and np.any(covsum != 0)):
                 raise IOError('SMBautoregression and FrontalForcingsRignotAutoregression have different ar_timestep and non-zero covariance')
+        if (indSMBar != -1 and indBDWar != -1):  # Both autoregressive models are used: check autoregressive time step consistency
+            covsum = self.covariance[np.sum(dimensions[0:indSMBar]).astype(int):np.sum(dimensions[0:indSMBar + 1]).astype(int), np.sum(dimensions[0:indBDWar]).astype(int):np.sum(dimensions[0:indBDWar + 1]).astype(int)]
+            if((md.smb.ar_timestep != md.basalforcings.ar_timestep) and np.any(covsum != 0)):
+                raise IOError('SMBautoregression and BasalforcingsDeepwaterMeltingRateAutoregression have different ar_timestep and non-zero covariance')
+        if (indTFar != -1 and indBDWar != -1):  # Both autoregressive models are used: check autoregressive time step consistency
+            covsum = self.covariance[np.sum(dimensions[0:indTFar]).astype(int):np.sum(dimensions[0:indTFar + 1]).astype(int), np.sum(dimensions[0:indBDWar]).astype(int):np.sum(dimensions[0:indBDWar + 1]).astype(int)]
+            if((md.frontalforcings.ar_timestep != md.basalforcings.ar_timestep) and np.any(covsum != 0)):
+                raise IOError('FrontalForcingsRignotAutoregression and BasalforcingsDeepwaterMeltingRateAutoregression have different ar_timestep and non-zero covariance')
 
         md = checkfield(md, 'fieldname', 'stochasticforcing.isstochasticforcing', 'values', [0, 1])
         md = checkfield(md, 'fieldname', 'stochasticforcing.fields', 'numel', num_fields, 'cell', 1, 'values', self.supportedstochforcings())
         md = checkfield(md, 'fieldname', 'stochasticforcing.covariance', 'NaN', 1, 'Inf', 1, 'size', [size_tot, size_tot])  # global covariance matrix
+        md = checkfield(md, 'fieldname', 'stochasticforcing.stochastictimestep', 'NaN', 1,'Inf', 1, '>=', md.timestepping.time_step)
         md = checkfield(md, 'fieldname', 'stochasticforcing.randomflag', 'numel', [1], 'values', [0, 1])
         if (checkdefaults):
             md = checkfield(md, 'fieldname', 'stochasticforcing.defaultdimension', 'numel', 1, 'NaN', 1, 'Inf', 1, '>', 0)
-            md = checkfield(md, 'fieldname', 'stochasticforcing.default_id','Inf',1,'NaN',1,'>=',0,'<=',self.defaultdimension,'size', [md.mesh.numberofelements])
+            md = checkfield(md, 'fieldname', 'stochasticforcing.default_id', 'Inf', 1, 'NaN', 1, '>=', 0, '<=', self.defaultdimension, 'size', [md.mesh.numberofelements])
         return md
     # }}}
@@ -128,12 +169,15 @@
     def marshall(self, prefix, md, fid):  # {{{
         yts = md.constants.yts
-        num_fields = len(self.fields)
 
         WriteData(fid, prefix, 'object', self, 'fieldname', 'isstochasticforcing', 'format', 'Boolean')
         if not self.isstochasticforcing:
             return md
+
         else:
+            num_fields = len(self.fields)
+            if(self.stochastictimestep==0):
+                md.stochasticforcing.stochastictimestep = md.timestepping.time_step #by default: stochastictimestep set to ISSM time step
             # Retrieve dimensionality of each field
-            dimensions = self.defaultdimension * np.ones((num_fields,))
+            dimensions = self.defaultdimension * np.ones((num_fields))
             for ind, field in enumerate(self.fields):
                 # Checking for specific dimensions
@@ -142,7 +186,9 @@
                 if (field == 'FrontalForcingsRignotAutoregression'):
                     dimensions[ind] = md.frontalforcings.num_basins
+                if (field == 'BasalforcingsDeepwaterMeltingRateAutoregression'):
+                    dimensions[ind] = md.basalforcings.num_basins
 
             # Scaling covariance matrix (scale column-by-column and row-by-row)
-            scaledfields = ['DefaultCalving','FloatingMeltRate','SMBautoregression'] # list of fields that need scaling * 1/yts
+            scaledfields = ['BasalforcingsDeepwaterMeltingRateAutoregression','BasalforcingsSpatialDeepwaterMeltingRate','DefaultCalving', 'FloatingMeltRate', 'SMBautoregression', 'SMBforcing']  # list of fields that need scaling * 1/yts
             tempcovariance = np.copy(self.covariance)
             for i in range(num_fields):
@@ -157,12 +203,13 @@
                 self.default_id = np.zeros(md.mesh.numberofelements)
             # Reshape dimensions as column array for marshalling
-            dimensions = dimensions.reshape(1,len(dimensions))
+            dimensions = dimensions.reshape(1, len(dimensions))
 
             WriteData(fid, prefix, 'data', num_fields, 'name', 'md.stochasticforcing.num_fields', 'format', 'Integer')
             WriteData(fid, prefix, 'object', self, 'fieldname', 'fields', 'format', 'StringArray')
-            WriteData(fid, prefix, 'data', dimensions, 'name', 'md.stochasticforcing.dimensions', 'format', 'IntMat','mattype',2)
-            WriteData(fid, prefix, 'object', self, 'fieldname', 'default_id', 'format', 'IntMat', 'mattype', 2)  #12Nov2021 make sure this is zero-indexed!
+            WriteData(fid, prefix, 'data', dimensions, 'name', 'md.stochasticforcing.dimensions', 'format', 'IntMat', 'mattype', 2)
+            WriteData(fid, prefix, 'object', self, 'fieldname', 'default_id', 'data', self.default_id - 1, 'format', 'IntMat', 'mattype', 2)  #12Nov2021 make sure this is zero-indexed!
             WriteData(fid, prefix, 'object', self, 'fieldname', 'defaultdimension', 'format', 'Integer')
             WriteData(fid, prefix, 'data', tempcovariance, 'name', 'md.stochasticforcing.covariance', 'format', 'DoubleMat')
+            WriteData(fid, prefix, 'object', self, 'fieldname', 'stochastictimestep', 'format', 'Double', 'scale', yts)
             WriteData(fid, prefix, 'object', self, 'fieldname', 'randomflag', 'format', 'Boolean')
     # }}}
@@ -180,9 +227,12 @@
            supported and corresponding md names
         """
-        structure = {'DefaultCalving': 'calving',
+        structure = {'BasalforcingsDeepwaterMeltingRateAutoregression': 'autoregressionlinearbasalforcings',
+                     'BasalforcingsSpatialDeepwaterMeltingRate': 'spatiallinearbasalforcings',
+                     'DefaultCalving': 'calving',
                      'FloatingMeltRate': 'basalforcings',
                      'FrictionWaterPressure': 'friction',
                      'FrontalForcingsRignotAutoregression': 'frontalforcingsrignotautoregression',
-                     'SMBautoregression': 'SMBautoregression'}
+                     'SMBautoregression': 'SMBautoregression',
+                     'SMBforcing': 'SMBforcing'}
         return structure
     # }}}
Index: /issm/trunk/src/m/classes/stressbalance.m
===================================================================
--- /issm/trunk/src/m/classes/stressbalance.m	(revision 27034)
+++ /issm/trunk/src/m/classes/stressbalance.m	(revision 27035)
@@ -36,6 +36,6 @@
 			self.loadingforce=project3d(md,'vector',self.loadingforce,'type','node');
 
-			% for MLHO
-			if md.flowequation.isMLHO
+			% for MOLHO
+			if md.flowequation.isMOLHO
 				self.spcvx_base=project3d(md,'vector',self.spcvx_base,'type','node');
 				self.spcvy_base=project3d(md,'vector',self.spcvy_base,'type','node');
@@ -134,6 +134,6 @@
 				md = checkfield(md,'fieldname','stressbalance.FSreconditioning','>',0);
 			end
-			% CHECK THIS ONLY WORKS FOR MLHO
-			if md.flowequation.isMLHO
+			% CHECK THIS ONLY WORKS FOR MOLHO
+			if md.flowequation.isMOLHO
 				md = checkfield(md,'fieldname','stressbalance.spcvx_base','Inf',1,'timeseries',1);
 				md = checkfield(md,'fieldname','stressbalance.spcvy_base','Inf',1,'timeseries',1);
@@ -169,5 +169,5 @@
 			fielddisplay(self,'spcvz','z-axis velocity constraint (NaN means no constraint) [m/yr]');
 
-			disp(sprintf('\n      %s','MLHO boundary conditions:'));
+			disp(sprintf('\n      %s','MOLHO boundary conditions:'));
 			fielddisplay(self,'spcvx_base','x-axis basal velocity constraint (NaN means no constraint) [m/yr]');
 			fielddisplay(self,'spcvy_base','y-axis basal velocity constraint (NaN means no constraint) [m/yr]');
@@ -226,6 +226,6 @@
 			end
 			WriteData(fid,prefix,'data',outputs,'name','md.stressbalance.requested_outputs','format','StringArray');
-			% for MLHO
-			if (md.flowequation.isMLHO)
+			% for MOLHO
+			if (md.flowequation.isMOLHO)
 				WriteData(fid,prefix,'object',self,'class','stressbalance','fieldname','spcvx_base','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
 				WriteData(fid,prefix,'object',self,'class','stressbalance','fieldname','spcvy_base','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
Index: /issm/trunk/src/m/classes/stressbalance.py
===================================================================
--- /issm/trunk/src/m/classes/stressbalance.py	(revision 27034)
+++ /issm/trunk/src/m/classes/stressbalance.py	(revision 27035)
@@ -59,5 +59,5 @@
         s += '{}\n'.format(fielddisplay(self, 'spcvz', 'z-axis velocity constraint (NaN means no constraint) [m / yr]'))
         s += '{}\n'.format(fielddisplay(self, 'icefront', 'segments on ice front list (last column 0: Air, 1: Water, 2: Ice'))
-        s += '      MLHO boundary conditions:\n'
+        s += '      MOLHO boundary conditions:\n'
         s += '{}\n'.format(fielddisplay(self, 'spcvx_base', 'x-axis basal velocity constraint (NaN means no constraint) [m / yr]'))
         s += '{}\n'.format(fielddisplay(self, 'spcvy_base', 'y-axis basal velocity constraint (NaN means no constraint) [m / yr]'))
@@ -86,5 +86,5 @@
         self.loadingforce = project3d(md, 'vector', self.loadingforce, 'type', 'node')
 
-        if md.flowequation.isMLHO:
+        if md.flowequation.isMOLHO:
             self.spcvx_base = project3d(md, 'vector', self.spcvx_base, 'type', 'node')
             self.spcvy_base = project3d(md, 'vector', self.spcvy_base, 'type', 'node')
@@ -176,5 +176,5 @@
             if np.any(np.logical_not(np.isnan(md.stressbalance.referential[pos, :]))):
                 md.checkmessage("no referential should be specified for basal vertices of grounded ice")
-        if md.flowequation.isMLHO:
+        if md.flowequation.isMOLHO:
             md = checkfield(md, 'fieldname', 'stressbalance.spcvx_base', 'Inf', 1, 'timeseries', 1)
             md = checkfield(md, 'fieldname', 'stressbalance.spcvy_base', 'Inf', 1, 'timeseries', 1)
@@ -215,6 +215,6 @@
             outputs = outputscopy
         WriteData(fid, prefix, 'data', outputs, 'name', 'md.stressbalance.requested_outputs', 'format', 'StringArray')
-        # MLHO
-        if md.flowequation.isMLHO:
+        # MOLHO
+        if md.flowequation.isMOLHO:
             WriteData(fid, prefix, 'object', self, 'class', 'stressbalance', 'fieldname', 'spcvx_base', 'format', 'DoubleMat', 'mattype', 1, 'scale', 1. / yts, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts)
             WriteData(fid, prefix, 'object', self, 'class', 'stressbalance', 'fieldname', 'spcvy_base', 'format', 'DoubleMat', 'mattype', 1, 'scale', 1. / yts, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts)
Index: /issm/trunk/src/m/classes/taoinversion.py
===================================================================
--- /issm/trunk/src/m/classes/taoinversion.py	(revision 27034)
+++ /issm/trunk/src/m/classes/taoinversion.py	(revision 27035)
@@ -1,7 +1,7 @@
 import numpy as np
-
 from checkfield import checkfield
 from IssmConfig import IssmConfig
 from marshallcostfunctions import marshallcostfunctions
+from fielddisplay import fielddisplay
 from project3d import project3d
 from supportedcontrols import *
@@ -45,37 +45,37 @@
     def __repr__(self):
         s = '   taoinversion parameters:\n'
-        s += '{}'.format(fieldstring(self, 'iscontrol', 'is inversion activated?'))
-        s += '{}'.format(fieldstring(self, 'mantle_viscosity', 'mantle viscosity constraints (NaN means no constraint) (Pa s)'))
-        s += '{}'.format(fieldstring(self, 'lithosphere_thickness', 'lithosphere thickness constraints (NaN means no constraint) (m)'))
-        s += '{}'.format(fieldstring(self, 'cross_section_shape', "1: square-edged, 2: elliptical - edged surface"))
-        s += '{}'.format(fieldstring(self, 'incomplete_adjoint', '1: linear viscosity, 0: non - linear viscosity'))
-        s += '{}'.format(fieldstring(self, 'control_parameters', 'ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}'))
-        s += '{}'.format(fieldstring(self, 'maxsteps', 'maximum number of iterations (gradient computation)'))
-        s += '{}'.format(fieldstring(self, 'maxiter', 'maximum number of Function evaluation (forward run)'))
-        s += '{}'.format(fieldstring(self, 'fatol', 'convergence criterion: f(X) - f(X * ) (X: current iteration, X * : "true" solution, f: cost function)'))
-        s += '{}'.format(fieldstring(self, 'frtol', 'convergence criterion: |f(X) - f(X * )| / |f(X * )|'))
-        s += '{}'.format(fieldstring(self, 'gatol', 'convergence criterion: ||g(X)|| (g: gradient of the cost function)'))
-        s += '{}'.format(fieldstring(self, 'grtol', 'convergence criterion: ||g(X)|| / |f(X)|'))
-        s += '{}'.format(fieldstring(self, 'gttol', 'convergence criterion: ||g(X)|| / ||g(X0)|| (g(X0): gradient at initial guess X0)'))
-        s += '{}'.format(fieldstring(self, 'algorithm', 'minimization algorithm: ''tao_blmvm'', ''tao_cg'', ''tao_lmvm'''))
-        s += '{}'.format(fieldstring(self, 'cost_functions', 'indicate the type of response for each optimization step'))
-        s += '{}'.format(fieldstring(self, 'cost_functions_coefficients', 'cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter'))
-        s += '{}'.format(fieldstring(self, 'min_parameters', 'absolute minimum acceptable value of the inversed parameter on each vertex'))
-        s += '{}'.format(fieldstring(self, 'max_parameters', 'absolute maximum acceptable value of the inversed parameter on each vertex'))
-        s += '{}'.format(fieldstring(self, 'vx_obs', 'observed velocity x component [m / yr]'))
-        s += '{}'.format(fieldstring(self, 'vy_obs', 'observed velocity y component [m / yr]'))
-        s += '{}'.format(fieldstring(self, 'vel_obs', 'observed velocity magnitude [m / yr]'))
-        s += '{}'.format(fieldstring(self, 'thickness_obs', 'observed thickness [m]'))
-        s += '{}'.format(fieldstring(self, 'surface_obs', 'observed surface elevation [m]'))
-        s += '{}'.format('Available cost functions:')
-        s += '{}'.format('   101: SurfaceAbsVelMisfit')
-        s += '{}'.format('   102: SurfaceRelVelMisfit')
-        s += '{}'.format('   103: SurfaceLogVelMisfit')
-        s += '{}'.format('   104: SurfaceLogVxVyMisfit')
-        s += '{}'.format('   105: SurfaceAverageVelMisfit')
-        s += '{}'.format('   201: ThicknessAbsMisfit')
-        s += '{}'.format('   501: DragCoefficientAbsGradient')
-        s += '{}'.format('   502: RheologyBbarAbsGradient')
-        s += '{}'.format('   503: ThicknessAbsGradient')
+        s += '{}\n'.format(fielddisplay(self, 'iscontrol', 'is inversion activated?'))
+        # s += '{}\n'.format(fielddisplay(self, 'mantle_viscosity', 'mantle viscosity constraints (NaN means no constraint) (Pa s)'))
+        # s += '{}\n'.format(fielddisplay(self, 'lithosphere_thickness', 'lithosphere thickness constraints (NaN means no constraint) (m)'))
+        # s += '{}\n'.format(fielddisplay(self, 'cross_section_shape', "1: square-edged, 2: elliptical - edged surface"))
+        s += '{}\n'.format(fielddisplay(self, 'incomplete_adjoint', '1: linear viscosity, 0: non - linear viscosity'))
+        s += '{}\n'.format(fielddisplay(self, 'control_parameters', 'ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}'))
+        s += '{}\n'.format(fielddisplay(self, 'maxsteps', 'maximum number of iterations (gradient computation)'))
+        s += '{}\n'.format(fielddisplay(self, 'maxiter', 'maximum number of Function evaluation (forward run)'))
+        s += '{}\n'.format(fielddisplay(self, 'fatol', 'convergence criterion: f(X) - f(X * ) (X: current iteration, X * : "true" solution, f: cost function)'))
+        s += '{}\n'.format(fielddisplay(self, 'frtol', 'convergence criterion: |f(X) - f(X * )| / |f(X * )|'))
+        s += '{}\n'.format(fielddisplay(self, 'gatol', 'convergence criterion: ||g(X)|| (g: gradient of the cost function)'))
+        s += '{}\n'.format(fielddisplay(self, 'grtol', 'convergence criterion: ||g(X)|| / |f(X)|'))
+        s += '{}\n'.format(fielddisplay(self, 'gttol', 'convergence criterion: ||g(X)|| / ||g(X0)|| (g(X0): gradient at initial guess X0)'))
+        s += '{}\n'.format(fielddisplay(self, 'algorithm', 'minimization algorithm: ''tao_blmvm'', ''tao_cg'', ''tao_lmvm'''))
+        s += '{}\n'.format(fielddisplay(self, 'cost_functions', 'indicate the type of response for each optimization step'))
+        s += '{}\n'.format(fielddisplay(self, 'cost_functions_coefficients', 'cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter'))
+        s += '{}\n'.format(fielddisplay(self, 'min_parameters', 'absolute minimum acceptable value of the inversed parameter on each vertex'))
+        s += '{}\n'.format(fielddisplay(self, 'max_parameters', 'absolute maximum acceptable value of the inversed parameter on each vertex'))
+        s += '{}\n'.format(fielddisplay(self, 'vx_obs', 'observed velocity x component [m / yr]'))
+        s += '{}\n'.format(fielddisplay(self, 'vy_obs', 'observed velocity y component [m / yr]'))
+        s += '{}\n'.format(fielddisplay(self, 'vel_obs', 'observed velocity magnitude [m / yr]'))
+        s += '{}\n'.format(fielddisplay(self, 'thickness_obs', 'observed thickness [m]'))
+        s += '{}\n'.format(fielddisplay(self, 'surface_obs', 'observed surface elevation [m]'))
+        s += '{}\n'.format('Available cost functions:')
+        s += '{}\n'.format('   101: SurfaceAbsVelMisfit')
+        s += '{}\n'.format('   102: SurfaceRelVelMisfit')
+        s += '{}\n'.format('   103: SurfaceLogVelMisfit')
+        s += '{}\n'.format('   104: SurfaceLogVxVyMisfit')
+        s += '{}\n'.format('   105: SurfaceAverageVelMisfit')
+        s += '{}\n'.format('   201: ThicknessAbsMisfit')
+        s += '{}\n'.format('   501: DragCoefficientAbsGradient')
+        s += '{}\n'.format('   502: RheologyBbarAbsGradient')
+        s += '{}\n'.format('   503: ThicknessAbsGradient')
         return s
 
Index: /issm/trunk/src/m/consistency/checkfield.py
===================================================================
--- /issm/trunk/src/m/consistency/checkfield.py	(revision 27034)
+++ /issm/trunk/src/m/consistency/checkfield.py	(revision 27035)
@@ -114,5 +114,10 @@
         else:
             if len(np.shape(field)) < len(fieldsize):
-                md = md.checkmessage(options.getfieldvalue('message', "field {} has size {} but should be size {}".format(fieldname, np.shape(field), fieldsize)))
+                if fieldsize[-1] > 1:
+                    md = md.checkmessage(options.getfieldvalue('message', "field {} has size {} but should be size {}".format(fieldname, np.shape(field), fieldsize)))
+                else:
+                    #The last dimension is one that follows matlab 2D array regulation but usually not what we do in python, we allow the difference in shape only if the number of element is equal
+                    if np.prod(np.shape(field)) != np.prod(fieldsize):
+                        md = md.checkmessage(options.getfieldvalue('message', "field {} has size {} but should be size {}".format(fieldname, np.shape(field), fieldsize)))
             else:
                 for i in range(np.size(fieldsize)):
@@ -153,5 +158,5 @@
                 md = md.checkmessage(options.getfieldvalue('message', "field '{}' value should be '{}'".format(fieldname, fieldvalues[0])))
             elif len(fieldvalues) == 2:
-                md = md.checkmessage(options.getfieldvalue('message', "field '{}' values should be '{}' '{}' or '{}'".format(fieldname, fieldvalues[0], fieldvalues[1])))
+                md = md.checkmessage(options.getfieldvalue('message', "field '{}' values should be '{}' or '{}'".format(fieldname, fieldvalues[0], fieldvalues[1])))
             else:
                 md = md.checkmessage(options.getfieldvalue('message', "field '{}' should have values in {}".format(fieldname, fieldvalues)))
Index: /issm/trunk/src/m/consistency/comparemodels.m
===================================================================
--- /issm/trunk/src/m/consistency/comparemodels.m	(revision 27034)
+++ /issm/trunk/src/m/consistency/comparemodels.m	(revision 27035)
@@ -27,8 +27,8 @@
 	if any(size(field1)~=size(field2)),
 		disp([fieldname ' do not have the same size']);
-	elseif isnumeric(field1),
+	elseif isnumeric(field1)
 		if numel(field1)==1 & isnan(field1) & isnan(field2),
 			%Do not do anything
-		elseif any(field1~=field2),
+		elseif any(field1(:)~=field2(:))
 			%Deal with NaN...
 			pos1=find(isnan(field1));
@@ -36,5 +36,5 @@
 			if numel(pos1)==numel(pos2) & all(pos1==pos2),
 				field1(pos1)=0; field2(pos2)=0;
-				if any(field1~=field2),
+				if any(field1(:)~=field2(:))
 					disp([fieldname ' differs']);
 				end
Index: /issm/trunk/src/m/contrib/akesson/interpMAR.m
===================================================================
--- /issm/trunk/src/m/contrib/akesson/interpMAR.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/akesson/interpMAR.m	(revision 27035)
@@ -0,0 +1,59 @@
+function output = interpMAR(X,Y,string,loadyear)
+%%%%%% %Interpolate from MAR (Fettweis et al 2017)
+
+%Available outputs
+	% -LAT
+	% -LON
+	% -ME					(Melt)
+	% -MSK_BAM01		(Mask Bamber et al 2001 5x5 km)
+	% -MSK_BAM13		(Mask Bamber et al 2013 1x1 km)
+	% -MSK_MAR			(MAR 10x10 km Ice Mask)
+	% -RF					(Rainfall)
+	% -RU					(Runoff)
+	% -SF					(Snowfall)
+	% -SMB				(Surface Mass Balance (without corrections)
+	% -SMBCORR			(Surface Mass Balance (with corrections)
+	% -SRF_BAM01		(Bamber et al 2001 5x5km Surface height)
+	% -SRF_BAM13		(Bamber et al 2013 1x1 km Surface height)
+	% -SRF_MAR			(MAR 10x10 km Surface height)
+	% -ST					(Surface temperature)
+	% -ST					(Surface temperature (with corrections)
+	% -SU					(Sublimation/Evaporation)
+	% -TIME				(Time)
+	% -X					(x)
+	% -Y					(y)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+if nargin==2,
+	string = 'SMBCORR';
+	loadyear = 2014;
+end
+
+isverbose=0;
+
+%Define data source
+ncpath='/Users/henning/issm/trunk-jpl/projects/ModelData/MAR3/MARv3.5.2-10km-yearly-ERA-Interim-1979-2014.nc';
+
+% Build grid from Bamber2001
+xdata = -800000:5000:700000;
+ydata = -3400000:5000:-600000;
+
+%Convert to MAR projections
+if isverbose, disp('   -- MAR: converting coordinates'); end
+[LAT,LON] = xy2ll(double(X(:)),double(Y(:)),+1,45,70); %convert model mesh xy to Bamber's projection
+[xMAR,yMAR] = ll2xy(LAT,LON,+1,39,71); %convert from lat/long Bamber's to MAR projection xy
+
+if isverbose, disp('   -- MAR: loading data'); end
+data  = double(ncread(ncpath,string));
+
+%Define what year to load data for 1979-2014
+startyear=1979;
+year=loadyear-startyear+1;
+
+%Get data from given year
+data2=squeeze(data(:,:,year));
+
+if isverbose, disp('   -- MAR: interpolating data to grid'); end
+output = InterpFromGrid(xdata,ydata,data2',xMAR,yMAR);
+output = reshape(output,size(X,1),size(X,2));
+
Index: /issm/trunk/src/m/contrib/chenggong/dataprocessing/README.md
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/dataprocessing/README.md	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/dataprocessing/README.md	(revision 27035)
@@ -0,0 +1,15 @@
+# Function List
+
+* analyzeCalvingFront.m				--		Interpolate the transient solutions to the calving front positions of the given flowlines
+* averageOverTime.m					--		For a given range, average transient data in time
+* computeGrad.m						--		Compute the gradient of a given field
+* extractTransientSolutions.m		--		Load a model with transient solutions, and put each of the items into individual array
+* interpZeroPos.m						--		Find zero positions (y=0) of the given curve defined by (X,Y)
+* integrateOverDomain.m				--		integrate a given variable over the whole domain, can set a mask
+* integrateOverTime.m				--		integrate a time series over the given time steps
+* inverseHistograms.m				--		Compute the inverse quantile function
+* npsd.m									--		Compute normalized power spectral density
+* projectToFlowlines.m				--		Project data from a mesh to a given flowline
+* psd.m									--		Compute power spectral density 
+* rescalegradientNan.m				--		Replace Nan by 0 in the cost function, then rescale it
+* wfDistance.m							--		Compute Wasserstein-Fourier distance
Index: /issm/trunk/src/m/contrib/chenggong/dataprocessing/analyzeCalvingFront.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/dataprocessing/analyzeCalvingFront.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/dataprocessing/analyzeCalvingFront.m	(revision 27035)
@@ -0,0 +1,62 @@
+function [flowline, icemaskFL] = analyzeCalvingFront(md, flowline, transientSolutions)
+%analyzeCalvingFront - to find calving front position at the given flowline,
+%                   if the given model contains transient solutions, then
+%                   return a time dependent calving front with
+%                   [Xmain, positionx, positiony, time], icemask, calving rate,
+%                   melting rate and velocity magnitude, sigma, thickness
+% Author: Cheng Gong
+% Last modified: 2020-09-25
+
+transient = isfield(md.results,'TransientSolution');
+
+if transient
+    % extract data from model
+    icemaskFL = InterpFromMeshToMesh2d(md.mesh.elements,md.mesh.x,md.mesh.y,transientSolutions.ice_levelset,flowline.x,flowline.y);
+    
+    % solve for the calving front coordinates
+    cf = interpZeroPos([flowline.Xmain(:), flowline.x, flowline.y], icemaskFL);
+    positionx = cf(:, 2);
+    positiony = cf(:, 3);
+    
+    % Calving rate C
+    cRate = InterpFromMeshToMesh2d(md.mesh.elements,md.mesh.x,md.mesh.y,...
+		 transientSolutions.calvingRate,positionx, positiony);
+    cRate = diag(cRate); % not very efficient, but works
+    
+    % melting rate M
+    mRateTemp = InterpFromMeshToMesh2d(md.mesh.elements,md.mesh.x,md.mesh.y,...
+		 transientSolutions.meltingRate,positionx, positiony);
+    mRate = diag(mRateTemp); % not very efficient, but works
+    
+    % velocity
+    vel = InterpFromMeshToMesh2d(md.mesh.elements,md.mesh.x,md.mesh.y,...
+		 transientSolutions.vel, positionx, positiony);
+    vel = diag(vel);
+    
+    % sigmaVM
+    SigmaVM = InterpFromMeshToMesh2d(md.mesh.elements,md.mesh.x,md.mesh.y,...
+		 transientSolutions.SigmaVM, positionx, positiony);
+    SigmaVM = diag(SigmaVM);
+    
+    % calving front
+    calvingFront = [cf, transientSolutions.time(:)];
+    
+    % solutions along the flowline
+    SigmaVM_FL = InterpFromMeshToMesh2d(md.mesh.elements,md.mesh.x,md.mesh.y,...
+		 transientSolutions.SigmaVM,flowline.x, flowline.y);
+    
+    % Thickness along the flowlines
+    thickness = InterpFromMeshToMesh2d(md.mesh.elements,md.mesh.x,md.mesh.y,...
+		 transientSolutions.thickness, flowline.x, flowline.y);
+    
+    % save to flowline
+    flowline.calvingFront = calvingFront;
+    flowline.cRate = cRate;
+    flowline.mRate = mRate;
+    flowline.vel = vel;
+    flowline.SigmaVM = SigmaVM;
+    flowline.SigmaVM_FL = SigmaVM_FL;
+    flowline.thickness = thickness;
+else
+    error('Calving front detectiong for the steady state is not implemented yet!')
+end
Index: /issm/trunk/src/m/contrib/chenggong/dataprocessing/averageOverTime.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/dataprocessing/averageOverTime.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/dataprocessing/averageOverTime.m	(revision 27035)
@@ -0,0 +1,86 @@
+function averagedData = averageOverTime(data, time, startP, endP)
+%averageOverTime - compute the time averaged value of data in the range [startP, endP]
+%
+%   data: time dependent data,
+%   time: has same number of columns as data, sorted in ascending order
+%   startP: start time point for averaging, can be at any time point, or
+%   even not coincide with the given points in 'time'
+%   endP: end time point for averaging. if this is the same as the startP,
+%   or not given, then the output will be the linear interpolation of the
+%   data at startP.
+%
+% if out of the given time range, use constant extrapolation,
+% if within the range, do linear interpolation.
+%
+%   Author: Cheng Gong
+%   Last modified: 2020-09-09
+if nargin < 4
+    endP = startP;
+end
+
+Nt = length(time);
+if Nt ~= size(data,2)
+    error('The data and time does not match!');
+end
+
+if startP > endP
+    error('The given start point has to be smaller than the end point!');
+elseif startP == endP
+    % extrapolation if earlier than the first time point
+    if startP <= time(1)
+        i1 = 1;
+        i2 = 2;
+    % extrapolation if later than the last time point
+    elseif startP >= time(Nt)
+        i1 = Nt-1;
+        i2 = Nt;
+    else
+        pos = (time > startP);
+        i2 = find(pos, 1, 'first');
+        i1 = i2 - 1;
+    end
+    % linear interpolation 
+    averagedData = data(:, i1) + (data(:, i1)-data(:, i2)).*(startP-time(i1))./(time(i1)-time(i2));
+else
+    % find the first and last ID in the time series within the given range
+    pos = ((time>=startP) & (time<=endP));
+    firstId = find(pos, 1, 'first');
+    lastId = find(pos, 1, 'last');
+    if isempty(firstId) | isempty(lastId)
+		 averagedData = nan(size(data,1), 1);
+       % error('Time points out of range');
+	 else
+		 % computed the integral with trapzoidal rule
+   	 integData = zeros(size(data,1), 1);
+   	 for i = firstId:lastId-1
+   	     integData = integData + (data(:,i+1) + data(:,i)) .* (time(i+1) - time(i)).*0.5;
+   	 end
+   	 
+   	 % special treatment for the first and last time step, which are not
+   	 % complete steps.
+   	 if firstId == 1
+   	     % extrapolation
+   	     integData = integData + data(:,1) .* (time(1)-startP);
+   	 else
+   	     % interpolation
+   	     integData = integData + 0.5.*(time(firstId)-startP)./ ...
+   	         (time(firstId)-time(firstId-1)) .* ...
+   	         ((time(firstId)-startP) .* data(:,firstId-1) + ...
+   	         (time(firstId)+startP-2*time(firstId-1)).*data(:,firstId));
+   	 end
+   	 
+   	 if lastId == Nt
+   	     % extrapolation
+   	     integData = integData + data(:,Nt) .* (endP-time(Nt));
+   	 else
+   	     % interpolation
+   	     integData = integData + 0.5.*(time(lastId)-endP)./ ...
+   	         (time(lastId+1)-time(lastId)) .* ...
+   	         ((time(lastId)-endP) .* data(:,lastId+1) + ...
+   	         (time(lastId)+endP-2*time(lastId+1)).*data(:,lastId));
+   	 end
+   	 
+   	 averagedData = integData ./ (endP-startP);
+	end
+end
+
Index: /issm/trunk/src/m/contrib/chenggong/dataprocessing/computeGrad.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/dataprocessing/computeGrad.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/dataprocessing/computeGrad.m	(revision 27035)
@@ -0,0 +1,45 @@
+function [gradx, grady]=computeGrad(index,x,y,field)
+%COMPUTEHESSIAN - compute the gradient from a field
+
+%some variables
+numberofnodes=length(x);
+numberofelements=size(index,1);
+numberoftime = size(field, 2);
+
+%some checks
+if (length(field)~=numberofnodes) && (length(field)~=numberofelements)
+    error('ComputeHessian error message: the given field size not supported yet');
+end
+%initialization
+line=index(:);
+linesize=3*numberofelements;
+
+%get areas and nodal functions coefficients N(x,y)=alpha x + beta y + gamma
+[alpha, beta]=GetNodalFunctionsCoeff(index,x,y);
+areas=GetAreas(index,x,y);
+
+%compute weights that hold the volume of all the element holding the node i
+weights=sparse(line,ones(linesize,1),repmat(areas,3,1),numberofnodes,1);
+
+%compute field on nodes if on elements
+if length(field)==numberofelements
+    field=sparse(line,ones(linesize,1),repmat(areas.*field,3,1),numberofnodes,1)./weights ;
+end
+
+%Compute gradient for each element
+if numberoftime == 1
+    grad_elx=sum(field(index).*alpha,2);
+    grad_ely=sum(field(index).*beta,2);
+else
+    grad_elx = zeros(numberofelements,numberoftime);
+    grad_ely = zeros(numberofelements,numberoftime);    
+    for i = 1:3
+        grad_elx = grad_elx + field(index(:,i), :).*alpha(:,i);
+        grad_ely = grad_ely + field(index(:,i), :).*beta(:,i);
+    end
+end
+%Compute gradient for each node (average of the elements around)
+gradx=sparse(repmat(line,1,numberoftime),cumsum(ones(linesize,numberoftime),2),repmat(areas.*grad_elx,3,1),numberofnodes,numberoftime);
+grady=sparse(repmat(line,1,numberoftime),cumsum(ones(linesize,numberoftime),2),repmat(areas.*grad_ely,3,1),numberofnodes,numberoftime);
+gradx=gradx./weights;
+grady=grady./weights;
Index: /issm/trunk/src/m/contrib/chenggong/dataprocessing/extractTransientSolutions.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/dataprocessing/extractTransientSolutions.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/dataprocessing/extractTransientSolutions.m	(revision 27035)
@@ -0,0 +1,14 @@
+function [transientSolutions]=extractTransientSolutions(md)
+%extractTransientSolutions - take the transient solutions out from model
+%                            and put each of them into an individual array.
+transientSolutions.time = cell2mat({md.results.TransientSolution(:).time});
+transientSolutions.vx = cell2mat({md.results.TransientSolution(:).Vx});
+transientSolutions.vy = cell2mat({md.results.TransientSolution(:).Vy});
+transientSolutions.vel = cell2mat({md.results.TransientSolution(:).Vel});
+transientSolutions.volume = cell2mat({md.results.TransientSolution(:).IceVolume});
+transientSolutions.thickness = cell2mat({md.results.TransientSolution(:).Thickness});
+transientSolutions.SigmaVM = cell2mat({md.results.TransientSolution(:).SigmaVM});
+transientSolutions.smb = cell2mat({md.results.TransientSolution(:).SmbMassBalance});
+transientSolutions.ice_levelset = cell2mat({md.results.TransientSolution(:).MaskIceLevelset});
+transientSolutions.calvingRate = cell2mat({md.results.TransientSolution(:).CalvingCalvingrate});
+transientSolutions.meltingRate = cell2mat({md.results.TransientSolution(:).CalvingMeltingrate});
Index: /issm/trunk/src/m/contrib/chenggong/dataprocessing/fillInNan.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/dataprocessing/fillInNan.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/dataprocessing/fillInNan.m	(revision 27035)
@@ -0,0 +1,26 @@
+function newdata = fillInNan(md, data, varargin)
+%fillInNan - use the mean of surrouding data to iteratidatay fill in the Nan in data
+%		data should have the same size as md.mesh.x
+%
+% Author: Cheng Gong
+% Last modified: 2021-12-08
+nanvflag = find(isnan(data));
+NNanv = length(nanvflag);
+
+options    = pairoptions(varargin{:});
+maxiter    = getfieldvalue(options,'maxiter', 10);
+count = 1;
+
+while((NNanv>0) & (count<=maxiter))
+   disp(['Iter ', num2str(count), ': found ', num2str(NNanv), ' Nan in the initial data, fill in them with the mean of their surroudings.']);
+   for i = 1:NNanv
+      [eleid, ~] = find(md.mesh.elements == nanvflag(i));
+      nodeid = md.mesh.elements(eleid, :);
+      data(nanvflag(i)) = mean(data(nodeid(:)) , 'omitnan');
+   end
+   nanvflag = find(isnan(data));
+   NNanv = length(nanvflag);
+	count = count + 1;
+end
+newdata = data;
+	
Index: /issm/trunk/src/m/contrib/chenggong/dataprocessing/integrateOverDomain.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/dataprocessing/integrateOverDomain.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/dataprocessing/integrateOverDomain.m	(revision 27035)
@@ -0,0 +1,32 @@
+function [intData, meanData, areas] = integrateOverDomain(md, data, masked, weights)
+% integrateOverDomain - integrating data over the whole domain
+%
+%   intData: integral of the data over each element
+%   meanData: intData/areas
+%   areas: areas of the domain
+if nargin < 4
+	weights = ones(size(data));
+	if nargin<3
+		masked = [];
+	end
+end
+
+% Set the area with masked=1 to nan
+data(masked) = nan;
+weights(masked) =nan;
+
+% get the mesh
+elements=md.mesh.elements;
+x=md.mesh.x;
+y=md.mesh.y;
+
+%compute areas;
+eleAreas=GetAreas(elements,x,y);
+
+% integrate nodal data to element
+eleData = 1/3*eleAreas.*(data(elements(:,1),:).*weights(elements(:,1),:) + data(elements(:,2),:).*weights(elements(:,2),:) + data(elements(:,3),:).*weights(elements(:,3),:));
+eleAreas = 1/3*eleAreas.*(weights(elements(:,1),:)+weights(elements(:,2),:)+weights(elements(:,3),:));
+
+intData = sum(eleData(:),'omitnan');
+areas = sum(eleAreas(:),'omitnan');
+meanData = intData / areas;
Index: /issm/trunk/src/m/contrib/chenggong/dataprocessing/integrateOverTime.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/dataprocessing/integrateOverTime.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/dataprocessing/integrateOverTime.m	(revision 27035)
@@ -0,0 +1,26 @@
+function [newData, intData] = integrateOverTime(tdata, data, time, Nintdt)
+% integrateOverDomain - integrating data over the whole domain
+%
+%	 Input:
+%		tdata:		time steps of data
+%		data:			time series of the data 
+%		time:			time steps to be used for integration
+%		Nintdt:		number of time steps in 'time' to be used for integration
+%
+%	 Return:
+%		newData:		data projected on to 'time'
+%		intData:		integrated 'newData'	
+
+dt = abs(time(2) -time(1));
+% patch the first N time steps
+intTime = [[-Nintdt:-1]*dt+time(1), time];
+% integration scheme
+integ = ones(1, Nintdt) * dt;
+
+% interpolate data from the time scheme 'tdata' to 'time'
+newData = interp1(double(tdata), double(data), intTime, 'linear', 'extrap'); 
+
+% integrated, only works for equidistance time steps for now
+intData = conv(integ, newData);
+intData = intData(Nintdt:end-Nintdt);
+newData = newData(Nintdt+1: end);
Index: /issm/trunk/src/m/contrib/chenggong/dataprocessing/interpZeroPos.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/dataprocessing/interpZeroPos.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/dataprocessing/interpZeroPos.m	(revision 27035)
@@ -0,0 +1,52 @@
+function X0 = interpZeroPos(X, Y)
+%interpZeroPos - find the x values for y=0 with line interpolation of the
+%                given X and Y coordinates.  
+%                   X: is a matrix of size mxn, each column represent a dimension
+%                   Y: is a matrix of size mxk, k is the number of date sets, and each 
+%                       data set must contains positive and negative values.
+%                 The return value:
+%                   x0: is a matrix of size kxn, the rows correspond to each column
+%                   of X and the columns are for each data set.
+%                
+%               The method is to find the two consective values y1 and y2 where
+%               Y changes the sign, and the corresponding X are x1 and x2.
+%                      x2*y1-x1*y2
+%                x0 = -------------
+%                        y1-y2
+% Author: Cheng Gong
+% Last modified: 2020-10-20
+[m, n] = size(X);
+[my, k] = size(Y);
+if m~=my
+    error('rows of X and Y are not the same!');
+end
+
+% find the place where Y changes signs, or y=0 at some points
+mask = (Y(1:m-1,:).*Y(2:m,:) <=0);
+[row, col] = find(mask);
+ind = row;
+
+% use only the first index from each column
+if length(col)>k
+    disp('Multiple candidates of the y=0 values are found in one data set! Be defalut, take the first y=0 from upstream.');
+    [col, ia, ~] = unique(col);
+    ind = row(ia);
+end
+
+if length(col)<k
+	disp('y does not contain both positive and negative values, find the closest value to 0');
+	[~,ind] = min(abs(Y(1:m-1,:)));
+	ind = ind';
+	col= [1:k]';
+	if (length(ind) ~= length(col))
+		error('Size of the row and col indicators are not consistent!');
+	end
+end
+
+a1 = zeros(1,k);
+for i =1:k
+    a1(i) =  Y(ind(i),col(i))./(Y(ind(i),col(i))-Y(ind(i)+1,col(i)));
+end
+
+a2 = 1- a1; 
+X0 = X(ind+1,:).*a1(:) + X(ind,:).*a2(:);
Index: /issm/trunk/src/m/contrib/chenggong/dataprocessing/inverseHistograms.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/dataprocessing/inverseHistograms.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/dataprocessing/inverseHistograms.m	(revision 27035)
@@ -0,0 +1,34 @@
+function [cdfa, q_Sinv] = inverseHistograms(mu, S, Sinv)
+%     Given a distribution mu compute its inverse quantile function
+%     Parameters
+%     ----------
+%     mu     : histogram
+%     S      : support of the histogram
+%     Sinv   : support of the quantile function
+%     Returns
+%     -------
+%     cdfa   : the cumulative distribution function and
+%     q_Sinv : the inverse quantile function of the distribution mu
+
+epsilon = 1e-14;
+A = (mu>epsilon);
+Sa = S(A);
+
+% cummulative sum
+cdf = cumtrapz(S, mu);
+cdfa = cdf(A);
+
+% set the first value to 0 and last value to 1
+cdfa(1) = 0;
+Sa(1) = 0;
+
+if cdfa(end) < 1
+    cdfa = [cdfa(:);1];
+    Sa = [Sa(:);S(end)];
+end
+
+[~, ind] = unique(cdfa);
+% linear interpolation
+q_Sinv = interp1(cdfa(ind), Sa(ind), Sinv);
+
+end
Index: /issm/trunk/src/m/contrib/chenggong/dataprocessing/movingAverage.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/dataprocessing/movingAverage.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/dataprocessing/movingAverage.m	(revision 27035)
@@ -0,0 +1,42 @@
+function outdata =  movingAverage(rawdata, varargin)
+%
+% rawdata is an MxN matrix, where the first M-1 rows are the raw data, the row M is the time
+
+options    = pairoptions(varargin{:});
+timeWindow	= getfieldvalue(options, 'time window', 30); % unit in days
+resamp = getfieldvalue(options, 'resample', 1); % resample the data set with the size of window
+
+% get data info {{{
+[M, N] = size(rawdata);
+if M < 2
+	error('The data has to be at least two rows!');
+end
+if N < 2
+	error('The data has to be at least two columns!');
+end
+
+% sort the time
+time = rawdata(M, :);
+[time, tI] = sort(time);
+data = rawdata(1:M-1, :);
+data = data(:, tI);
+
+dt = time(2) - time(1);
+if dt < 0
+	error('The time need to be in ascending order.');
+end
+windowSize = ceil(timeWindow/365/dt);
+%}}}
+%% filter {{{
+if resamp
+	ind = [1:timeWindow:N];
+else
+	ind = [1:N];
+end
+b = (1/windowSize)*ones(1,windowSize);
+a = 1;
+disp(['Applying filter of width ', num2str(timeWindow)]);
+smoothdata = filter(b,a,data,[],2);
+time = time(ind);
+outdata = [smoothdata(:,ind);time];
+%}}}
Index: /issm/trunk/src/m/contrib/chenggong/dataprocessing/npsd.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/dataprocessing/npsd.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/dataprocessing/npsd.m	(revision 27035)
@@ -0,0 +1,32 @@
+function [npsdx, psdx, freq] = npsd(x)
+%npsd - Normalized Power Spectral Density (using fft)
+%
+%   x: time series
+%
+%   psdx: Power Spectral Density(right half plane, value doubled)
+%   freq: frequency(non-negative half)
+%
+%   Author: Cheng Gong
+%   Date: 2021-08-17
+
+% length of data
+Nx = length(x);
+% fft
+xdft = fft(x);
+xdft = xdft(1:floor(Nx/2+1));
+% power specturm
+psdx = (1/(2*pi*Nx)) * abs(xdft).^2;
+%  In order to conserve the total power, multiply all frequencies that
+%  occur in both sets - the positive and negative frequencies — by a factor of 2
+psdx(2:end-1) = 2*psdx(2:end-1);
+freq = 0:(2*pi)/Nx:pi;
+% normalize(trapzoidal rule)
+intS = trapz(freq, psdx);
+if intS == 0
+    psdx = 1 +psdx;
+    intS = trapz(freq, psdx);
+end
+npsdx = psdx ./ intS;
+
+
+end
Index: /issm/trunk/src/m/contrib/chenggong/dataprocessing/projectToFlowlines.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/dataprocessing/projectToFlowlines.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/dataprocessing/projectToFlowlines.m	(revision 27035)
@@ -0,0 +1,16 @@
+% Function to project values on the mesh to a flowline
+%
+%	md			-	ISSM model with mesh
+%	pValue	-	data on the mesh
+%	fx			-	x coordinates of the flowline
+%	fy			-	y coordinates of the flowline
+%
+% Author: Cheng Gong
+% Last modified: 2021-01-27
+
+function valueC = projectToFlowlines(md, pValue, fx, fy)
+    temp = InterpFromMeshToMesh2d(md.mesh.elements, md.mesh.x, md.mesh.y,...
+        pValue, fx, fy);
+    temp = diag(temp); % not very efficient, but works
+    valueC = temp(:)';
+end
Index: /issm/trunk/src/m/contrib/chenggong/dataprocessing/psd.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/dataprocessing/psd.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/dataprocessing/psd.m	(revision 27035)
@@ -0,0 +1,24 @@
+function [psdx, freq] = psd(x)
+%psd - Power Spectral Density (using fft)
+%
+%   x: time series
+%   
+%   psdx: Power Spectral Density(right half plane, value doubled)
+%   freq: frequency(non-negative half)
+%
+%   Author: Cheng Gong
+%   Date: 2021-08-17
+
+% length of data
+Nx = length(x);
+% fft
+xdft = fft(x);
+xdft = xdft(1:floor(Nx/2+1));
+% power specturm
+psdx = (1/(2*pi*Nx)) * abs(xdft).^2;
+%  In order to conserve the total power, multiply all frequencies that 
+%  occur in both sets - the positive and negative frequencies — by a factor of 2
+psdx(2:end-1) = 2*psdx(2:end-1);
+freq = 0:(2*pi)/Nx:pi;
+
+end
Index: /issm/trunk/src/m/contrib/chenggong/dataprocessing/rescalegradientNan.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/dataprocessing/rescalegradientNan.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/dataprocessing/rescalegradientNan.m	(revision 27035)
@@ -0,0 +1,7 @@
+% function to replace Nan by 0 in J, then rescale with the mass matrix
+%
+function J = rescalegradientNan(md, unscaledJ)
+
+nanflag = isnan(unscaledJ);
+unscaledJ(nanflag) = 0;
+J = rescalegradient(md, unscaledJ);
Index: /issm/trunk/src/m/contrib/chenggong/dataprocessing/wfDistance.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/dataprocessing/wfDistance.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/dataprocessing/wfDistance.m	(revision 27035)
@@ -0,0 +1,26 @@
+function w2 = wfDistance(x, y)
+%wfDistance - compute Wasserstein-Fourier Distance, according to Cazelles, E.,
+%         Robert, A. & Tobar, F. The Wasserstein-Fourier Distance for 
+%         Stationary Time Series. Ieee T Signal Proces 69, 709–721 (2019).
+%
+%   x: first time series
+%   y: second time series
+%
+%   w2:  Wasserstein-Fourier Distance, or W2 distance of sx and sy
+%
+%   Author: Cheng Gong
+%   Date: 2021-08-18
+N = length(x);
+Sinv=linspace(0,1,N);
+
+[csx, ~, freqx] = npsd(x);
+[csy, ~, freqy] = npsd(y);
+
+% inverse cummulative function
+[~, qx] = inverseHistograms(csx, freqx, Sinv);
+[~, qy] = inverseHistograms(csy, freqy, Sinv);
+
+%
+w2 = sqrt(trapz(Sinv ,(qx-qy).^2));
+
+end
Index: /issm/trunk/src/m/contrib/chenggong/expxy2shpll.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/expxy2shpll.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/expxy2shpll.m	(revision 27035)
@@ -0,0 +1,69 @@
+function expxy2shpll(expfilename,shpfilename,geometry)
+%expxy2shpll
+%  Convert .exp to .shp file
+%
+%   Usage:
+%			expxy2shpll('glacier.exp', 'glacier.shp')
+%			expxy2shpll('glacier.exp', 'glacier.shp', geometry)
+%
+%		geometry (optional)-	'MultiPoint' : point clouds
+%									'Point' : single point
+%									'Line' : two points line
+%									'polygon' : multiple points
+%
+
+%check file extensions
+[pathstr,name,ext] = fileparts(shpfilename);
+if ~strcmp(ext,'.shp'),
+   error(['Shapefile ' shpfilename ' does not have an extension .shp']);
+end
+
+[pathstr,name,ext] = fileparts(expfilename);
+if ~strcmp(ext,'.exp'),
+   error(['Exp file ' expfilename ' does not have an extension .exp']);
+end
+
+shp=expread(expfilename);
+[lat, lon] = xy2ll(shp.x, shp.y, 1, 45, 70);
+shp.x = lon;
+shp.y = lat;
+
+%initialize number of profile
+count=1;
+
+contours=struct([]);
+for i=1:length(shp),
+   if nargin < 3
+
+      %TEMP
+      %if contains(shp(i).name,'_pointcloud');
+      %  continue;
+      %end
+
+      if length(shp(i).x) == 0
+         continue;
+      elseif contains(shp(i).name,'_pointcloud');
+         geometry = 'MultiPoint';
+         shp(i).name = erase(shp(i).name,'_pointcloud');
+      elseif length(shp(i).x) == 1
+         geometry = 'Point';
+      elseif length(shp(i).x) < 3
+         geometry = 'Line';
+      else
+         if (shp(i).x(end)==shp(i).x(1) && shp(i).y(end)==shp(i).y(1)),
+            geometry = 'Polygon';
+         else
+            geometry = 'Line';
+         end
+      end
+   end
+   contours(count).Geometry=geometry;
+   contours(count).id=i;
+   contours(count).Name=shp(i).name;
+   contours(count).X=shp(i).x;
+   contours(count).Y=shp(i).y;
+   count = count+1;
+end
+
+%Make sure it is one single geometry otherwise it will yell at you
+shapewrite(contours,shpfilename);
Index: /issm/trunk/src/m/contrib/chenggong/interpFromMEaSUREsGeotiff.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/interpFromMEaSUREsGeotiff.m	(revision 27034)
+++ /issm/trunk/src/m/contrib/chenggong/interpFromMEaSUREsGeotiff.m	(revision 27035)
@@ -1,9 +1,33 @@
-% This function calls src/m/contrib/morlighem/modeldata/interpFromGeotiff.m for multiple times to load all avaliable 
-% tif data in  /totten_1/ModelData/Greenland/VelMEaSUREs/Jakobshavn_2008_2021/ within the given time period (in decimal years)
-% For some reason, each .tif file in this folder contains two sets of data, only the first dataset is useful
+function dataout = interpFromMEaSUREsGeotiff(X,Y,Tstart,Tend,varargin)
+%interpFromMEaSUREsGeotiff: 
+%	This function calls src/m/contrib/morlighem/modeldata/interpFromGeotiff.m for multiple times to load all avaliable 
+%	tif data in  /totten_1/ModelData/Greenland/VelMEaSUREs/Jakobshavn_2008_2021/ within the given time period (in decimal years)
+%	For some reason, each .tif file in this folder contains two sets of data, only the first dataset is useful
+%
+%   Usage:
+%		 dataout = interpFromMEaSUREsGeotiff(X,Y,Tstart,Tend, varargin)
+%
+%	X, Y are the coordinates of the mesh 
+%	Tstart and Tend decimal year of the start and end time
+%
+%   Example:
+%			obsData = interpFromMEaSUREsGeotiff(md.mesh.x,md.mesh.y, tstart, tend);
+%
+%   Options:
+%      - 'glacier':  which glacier to look for
+options    = pairoptions(varargin{:});
+glacier    = getfieldvalue(options,'glacier','Jakobshavn');
 
-function dataout = interpFromMEaSUREsGeotiff(X,Y,Tstart,Tend)
-
-foldername = '/totten_1/ModelData/Greenland/VelMEaSUREs/Jakobshavn_2008_2021/';
+if strcmp(glacier, 'Jakobshavn')
+	foldername = '/totten_1/ModelData/Greenland/VelMEaSUREs/Jakobshavn_2008_2021/';
+elseif strcmp(glacier, 'Kangerlussuaq')
+	foldername = '/totten_1/ModelData/Greenland/VelMEaSUREs/Kangerlussuaq_2006_2021/';
+elseif strcmp(glacier, 'Store')
+	foldername = '/totten_1/ModelData/Greenland/VelMEaSUREs/Store_2008_2021/';
+elseif strcmp(glacier, 'Rink')
+	foldername = '/totten_1/ModelData/Greenland/VelMEaSUREs/Rink_2008_2022/';
+else
+	error(['The velocity data for ', glacier, ' is not available, please download from NSIDC first.']);
+end
 
 % get the time info from file names
Index: /issm/trunk/src/m/contrib/chenggong/modeldata/interpISMIP6Temp.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/modeldata/interpISMIP6Temp.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/modeldata/interpISMIP6Temp.m	(revision 27035)
@@ -0,0 +1,15 @@
+function temp = interpISMIP6Temp(X, Y)
+%interpISMIP6Temp - interpolate land ice basal temperature to the given mesh
+%
+%	X and Y are the coordinates of the mesh
+%
+%  Author: Cheng Gong
+%  Last modified: 2021-12-06
+
+filename = '/totten_1/ModelData/Greenland/ISMIP6/GreenlandISMIP6-Morlighem-2020-10-01.nc';
+
+x = ncread(filename, 'x');
+y = ncread(filename, 'y');
+tb = ncread(filename, 'tb');
+
+temp = InterpFromGrid(double(x), double(y), double(tb'), X, Y);
Index: /issm/trunk/src/m/contrib/chenggong/visualization/imageNonUni.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/visualization/imageNonUni.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/visualization/imageNonUni.m	(revision 27035)
@@ -0,0 +1,23 @@
+function imageNonUni(varargin)
+%imageNonUni - draw an image with non uniform grid
+%
+% Author: Cheng Gong
+% Last modified: 2020-08-24
+x = varargin{1};
+y = varargin{2};
+C = varargin{3};
+
+nx = length(x);
+ny = length(y);
+[ncy, ncx] = size(C);
+
+if ((nx ~= ncx) || (ny~=ncy))
+    error('The size of x-y coordinates do not match the data!');
+end
+
+X = repmat(x(:)',ny , 1);
+Y = repmat(y(:), 1, nx);
+
+
+surf(X, Y, zeros(ny,nx), C, 'EdgeColor','None');
+view(2);
Index: /issm/trunk/src/m/contrib/chenggong/visualization/plotCompareTransientFlowline.m
===================================================================
--- /issm/trunk/src/m/contrib/chenggong/visualization/plotCompareTransientFlowline.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/chenggong/visualization/plotCompareTransientFlowline.m	(revision 27035)
@@ -0,0 +1,48 @@
+function plotCompareTransientFlowline(velList, titleList, md, flowline, TStart, TEnd, xl, yl, ca)
+%plotCompareTransientFlowline - to compare the solutions along a given
+%  flowine for the given time periods
+%
+%   velList:	a cell of transient velocities on the model mesh
+%   titleList: names of the velocity data
+%   md:			ISSM model
+%   flowline:	a flowline data structure contains flowline.x and flowline.y. 
+%					If possible, it should also contains flowline.Xmain, which is 
+%					the distance along the flowline from upstream to the terminus position.
+%   TStart:		a list of start time points
+%   TEnd:		a list of end time points
+%   ca:			caixs value in plot
+%   xl:			xlim value
+%   yl:			ylim value
+%
+%   Author: Cheng Gong
+%   Date: 2021-12-06
+
+N = length(velList);
+vel_flowline = cell(N,1);
+if ~isfield(flowline, 'Xmain')
+    flowline.Xmain = cumsum([0;sqrt((flowline.x(2:end)- flowline.x(1:end-1)).^2 + (flowline.y(2:end)- flowline.y(1:end-1)).^2)]')/1000;
+end
+
+for i = 1:N
+    vel_flowline{i} = InterpFromMeshToMesh2d(md.mesh.elements,md.mesh.x,md.mesh.y,velList{i},flowline.x,flowline.y);
+end
+
+for p = 1:N
+    subplot(N,1,p)
+    hold on
+    for i = 1:length(TStart)
+        overlay = [vel_flowline{p}(:,i), vel_flowline{p}(:,i)]';
+        imAlpha = ones(size(overlay));
+        imAlpha(isnan(overlay)) = 0;
+        imageNonUni(flowline.Xmain, [TStart(i), TEnd(i)], overlay);
+    end
+    title(titleList{p}, 'Interpreter', 'latex');
+    xlim(xl)
+    xlabel('x(km)')
+    ylabel('year')
+    ylim(yl);
+    caxis(ca)
+    colormap('jet')
+    h=colorbar;
+    title(h,'m/a')
+end
Index: /issm/trunk/src/m/contrib/defleurian/netCDF/export_netCDF.m
===================================================================
--- /issm/trunk/src/m/contrib/defleurian/netCDF/export_netCDF.m	(revision 27034)
+++ /issm/trunk/src/m/contrib/defleurian/netCDF/export_netCDF.m	(revision 27035)
@@ -1,19 +1,20 @@
 function export_netCDF(md,filename)
-
-%Now going on Real treatment
+%verbosity of the code, 0 is no messages, 5 is chatty
+	verbose = 5;
 	if exist(filename),
-		disp(sprintf('File %s allready exist', filename));
-		prompt = 'Give a new name or "delete" to replace: ';
-		newname = input(prompt,'s');
-		if strcmp(newname,'delete')
-			delete(filename)
-		else
-			disp(sprintf('New file name is %s ', newname));
-			filename=newname
-	  end
-  end
+		delete(filename)
+		% disp(sprintf('File %s allready exist', filename));
+		% prompt = 'Give a new name or "delete" to replace: ';
+		% newname = input(prompt,'s');
+		% if strcmp(newname,'delete')
+		% 	delete(filename)
+		% else
+		% 	disp(sprintf('New file name is %s ', newname));
+		% 	filename=newname
+		% end
+	end
 	%open file and write description
 	mode = netcdf.getConstant('NC_NETCDF4');
-	mode = bitor(mode,netcdf.getConstant('NC_NOCLOBBER'));%NOCLOBBER to avoid overwrite
+	mode = bitor(mode,netcdf.getConstant('NC_NOCLOBBER')); %NOCLOBBER to avoid overwrite
 	ncid = netcdf.create(filename,mode);
 	netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'description',['Results for run ' md.miscellaneous.name]);
@@ -21,138 +22,258 @@
 
 	%gather geometry and timestepping as dimensions
-	resfields=fieldnames(md.results);
-	Duration=size(eval(['md.results. ' resfields{1} ]),2);
+	if isempty(fieldnames(md.results)),
+		%results as no field so no time is present
+		Duration = 0;
+	else
+		resfields = fieldnames(md.results);
+		Duration = size(eval(['md.results. ' resfields{1} ]),2);
+	end
 	if Duration>0,
-		StepNum=Duration;
+		StepNum = Duration;
 	else
 		StepNum=1;
-  end
-
-   dimlist=[2,md.mesh.numberofelements,md.mesh.numberofvertices,size(md.mesh.elements,2)];
-
-	%define netcdf dimensions
-	DimSize(1).index=netcdf.defDim(ncid,'Time',StepNum);
+	end
+	DimSize(1).index=netcdf.defDim(ncid,'Time',StepNum);  %time is the first dimension
 	[DimSize(1).name,DimSize(1).value]=netcdf.inqDim(ncid,DimSize(1).index);
 	DimValue(1)=DimSize(1).value;
-	DimSize(2).index=netcdf.defDim(ncid,'UnLim',netcdf.getConstant('NC_UNLIMITED'));
+	DimSize(2).index=netcdf.defDim(ncid,'UnLim',netcdf.getConstant('NC_UNLIMITED')); % we add an unlimited dimension if needed
 	[DimSize(2).name,DimSize(2).value]=netcdf.inqDim(ncid,DimSize(2).index);
 	DimValue(2)=DimSize(2).value;
+	% adding mesh related dimensions
+	dimlist=[2,40,md.mesh.numberofelements,md.mesh.numberofvertices,size(md.mesh.elements,2)];
+	dimnames=["DictDummy" "StringLength" "EltNum" "VertNum" "VertPerElt"];
+	if verbose > 0,
+		disp('===Creating dimensions ===');
+	end
+	%define netcdf dimensions
 	for i=1:5
+		% do not add the dimension if it exists already
 		if sum(dimlist(i) == DimValue) == 0
-			DimSize(i+2).index=netcdf.defDim(ncid,['Dimension' num2str(i+2)],dimlist(i));
+			DimSize(i+2).index=netcdf.defDim(ncid,dimnames(i),dimlist(i));
 			[DimSize(i+2).name,DimSize(i+2).value]=netcdf.inqDim(ncid,DimSize(i+2).index);
 			DimValue(i+2)=DimSize(i+2).value;
 		end
 	end
-
-	typelist=[{'numeric'} {'logical'} {'string'} {'char'} {'cell'}];
-
+	issmclasses = fieldnames(md)';
+	typelist={'half', 'single','double','int8','int16'...
+		  ,'int32','int64','uint8','uint16','uint32'...
+		  ,'uint64','logical','char','string'};  %all malab types that are 0D
+
+	for cl=1:length(issmclasses),
+		subclasses=fieldnames(md.(issmclasses{cl}))';
+		for sc=1:length(subclasses),
+			if sum(strcmp(class(md.(issmclasses{cl}).(subclasses{sc})), typelist)) == 0,
+				issmclasses = [issmclasses class(md.(issmclasses{cl}).(subclasses{sc}))];
+			end
+		end
+	end
 	%get all model classes and create respective groups
 	groups=fieldnames(md);
+	if verbose > 0,
+		disp('===Creating and populating groups===');
+	end
 	for i=1:length(groups),
-		disp(sprintf('group name in tree %s ',groups{i}));
+		if verbose >1,
+			disp(sprintf('===Now treating %s===',groups{i}));
+		end
+		if strcmp(groups{i}, 'qmu'),
+			disp('qmu is skipped until it is more stable');
+			continue
+		end
 		groupID=netcdf.defGrp(ncid,groups{i});
 		%In each group gather the fields of the class
-		groupfields=fieldnames(md.(groups{i}));
-		for j=1:length(groupfields),
-			Var=md.(groups{i}).(groupfields{j});
+		fields=fieldnames(md.(groups{i}));
+		if isempty(fields),
+			disp(sprintf("WARNING: md.%s as no fields, we skip it.",groups{i}))
+			continue
+		end
+		%looping on fields in each group
+		for j=1:length(fields),
+			Var=md.(groups{i}).(fields{j});
+			%treatment for lists
 			if isa(Var,'cell')
-				Stdlist=false;
+				Stdlist=false;  %first assume it is not a standard list
 				if length(Var) == 0
-					Stdlist=true;
+					Stdlist=true;  %It is empty and so standard (for us)
 				else
 					for k=1:length(typelist)
 						if isa(Var{1},typelist{k})
-							Stdlist=true;
+							Stdlist=true;  %if the list is of a known type (to matlab) if not it is probably some exotic ISSM stuff
 						end
 					end
 				end
-
-				netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype',class(md.(groups{i})));
-				if(Stdlist)
-					disp(sprintf('=====Field name in tree %s ',groupfields{j}));
-					[DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,groupfields{j},DimSize,DimValue);
-				else
-					listsize=length(Var);
-					subgroupID=netcdf.defGrp(groupID,groupfields{j});
-					netcdf.putAtt(subgroupID,netcdf.getConstant('NC_GLOBAL'),'classtype',class(Var));
-					for l=1:listsize
-						if isprop(Var{l},'name')
-							lname=Var{l}.name;
-						elseif isprop(Var{l},'step')
-							lname=Var{l}.step
-						else
-							lname=[class(Var{l}) int2str(l)];
+				%print the issm class as a classtype attribute
+				klass = class(md.(groups{i}));
+				klasstring = strcat(klass, '.',klass);
+				netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype',klasstring);
+				if(Stdlist)  % this is a standard or empty list just proceed
+					if verbose > 4,
+						disp(sprintf("=££=creating var for %s.%s with classtype : %s",groups{i}, fields{j}, klasstring))
+					end
+					if ~isempty(Var) && isa(Var{1}, 'char'),  % we have a char array, pad it to a given length
+						Var=char(Var)';
+					end
+					[DimSize,DimValue,varid]=CreateVar(ncid,Var,groupID,fields{j},DimSize,DimValue);
+					if ~isempty(varid),
+						FillVar(Var,groupID,varid);
+					end
+
+				else % this is a list of fields, specific treatment needed (perhaps)
+					if verbose > 4,
+						disp(sprintf("=??=we have a list of fields for %s.%s with classtype : %s",groups{i}, fields{j}, klasstring));
+					end
+					if strcmp(groups{i}, 'outputdefinition'),
+						listsize=length(Var);
+						for k=1:listsize,
+							subgroupname=md.(groups{i}).(fields{j}){k}.definitionstring;
+							subgroupID=netcdf.defGrp(groupID,subgroupname);
+							klass=class(md.(groups{i}).(fields{j}){k});
+							klasstring = strcat(klass, '.',klass);
+							netcdf.putAtt(subgroupID,netcdf.getConstant('NC_GLOBAL'),'classtype',klasstring);
+							subfields=fieldnames(md.(groups{i}).(fields{j}){k});
+							for l=1:length(subfields)
+								if verbose > 4,
+									disp(sprintf("=--=creating var for %s.%s[%i].%s",groups{i}, fields{j}, k, subfields{l}));
+								end
+								Var = md.(groups{i}).(fields{j}){k}.(subfields{l});
+								if sum(numel(Var) == size(Var)) == 0,  %this is a 2D array or more (and not a vector with dimension 2 = 1)
+									Var = Var';
+								end
+								[DimSize,DimValue,varid]=CreateVar(ncid,Var,subgroupID,subfields{l},DimSize,DimValue);
+								if ~isempty(varid),
+									FillVar(Var,subgroupID,varid);
+								end
+							end
 						end
-						listgroupID=netcdf.defGrp(subgroupID,lname);
-						netcdf.putAtt(listgroupID,netcdf.getConstant('NC_GLOBAL'),'classtype',class(Var{l}));
-						subfields=fieldnames(Var{l});
-						for m=1:length(subfields)
-							if ~strcmp(subfields{m},'outlog')
-								[DimSize,DimValue]=DefCreateVar(ncid,Var{l}.(subfields{m}),listgroupID,subfields{m},DimSize,DimValue);
-							end
+					else
+						disp(sprintf("WARNING: unknown treatment for md.%s",groups{i}));
+					end
+				end
+			elseif sum(strcmp(class(Var), typelist))==1, %this is a standard matlab class with no subgrouping
+				if verbose > 4,
+					disp(sprintf("====creating var for %s.%s", groups{i}, fields{j}))
+				end
+				klass=class(md.(groups{i}));
+				klasstring = strcat(klass, '.',klass);
+				netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype',klasstring);
+				if sum(numel(Var) == size(Var)) == 0,  %this is a 2D array or more (and not a vector with dimension 2 = 1)
+					Var = Var';
+				end
+
+				[DimSize,DimValue,varid]=CreateVar(ncid,Var,groupID,fields{j},DimSize,DimValue);
+				if ~isempty(varid),
+					FillVar(Var,groupID,varid);
+				end
+
+
+			elseif isa(Var,'struct')  % structures need special treatment
+				if strcmp(groups{i}, 'results'),
+					klasstring='results.results';
+					netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype',klasstring);
+					Listsize= length(md.(groups{i}).(fields{j}));
+					subgroupname=fields{j};
+					subgroupID=netcdf.defGrp(groupID,subgroupname);
+					klasstring='results.solutionstep';
+					netcdf.putAtt(subgroupID,netcdf.getConstant('NC_GLOBAL'),'classtype',klasstring);
+					subfields=fieldnames(md.(groups{i}).(fields{j}));
+					if isempty(subfields),
+						disp(sprintf("WARNING: md.%s.%s as no subfields, we skip it.",groups{i}, fields{j}));
+						continue
+					end
+					for k=1:length(subfields),
+						if ~ismember(subfields{k}, {'errlog', 'outlog', 'SolutionType'})
+							StackedVar=restable();
+							for l=1:Listsize,
+								Var = md.(groups{i}).(fields{j})(l).(subfields{k});
+								if length(Var) == 0,
+									%Some variables only have data on the first step
+									break
+								end
+								lastindex=l;
+								StackedVar=StackedVar.update(Var);
+							end
+							if verbose > 4,
+								disp(sprintf("=$$=creating var for %s.%s.%s",groups{i}, fields{j}, subfields{k}));
+								disp(sprintf("last index on the list is %i",lastindex));
+							end
+							StackedVar=StackedVar.finalize(lastindex);
+							[DimSize,DimValue,varid]=CreateVar(ncid,StackedVar,subgroupID,subfields{k},DimSize,DimValue);
+							if ~isempty(varid),
+								FillVar(StackedVar,subgroupID,varid);
+							end
+						elseif ismember(subfields{k}, {'SolutionType'})
+							%We just add solution type once as an attribute
+							Var = md.(groups{i}).(fields{j})(1).(subfields{k});
+							[DimSize,DimValue,varid]=CreateVar(ncid,Var,subgroupID,subfields{k},DimSize,DimValue);
+							if ~isempty(varid),
+								FillVar(Var,subgroupID,varid);
+							end
+
 						end
 					end
-				end
-			elseif isa(Var,'struct') && ~strcmp(groupfields{j},'bamg')
-				classtype=class(md.(groups{i}));
-				if strcmp(classtype,'struct')
-					classtype=groups{i};
-				end
-				netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype',classtype);
-				if length(Var)>1
-					listsize=length(Var);
-					subgroupID=netcdf.defGrp(groupID,groupfields{j});
-					classtype=class(Var);
-					if strcmp(classtype,'struct')
-						classtype=groups{i};
-					end
-					netcdf.putAtt(subgroupID,netcdf.getConstant('NC_GLOBAL'),'classtype',classtype);
-					for l=1:listsize
-						if isfield(Var(l),'step')
-							lname=[int2str(Var(l).step)];
-						else
-							lname=[class(Var(l)) int2str(l)];
+				elseif isempty(fieldnames(md.(groups{i}).(fields{j}))) % this is an empty struct, jus treat it as normal
+					klass=class(md.(groups{i}));
+					klasstring = strcat(klass, '.',klass);
+					netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype',klasstring);
+					if verbose > 4,
+						disp(sprintf("=[]=creating var for %s.%s",groups{i}, fields{j}));
+					end
+
+					[DimSize,DimValue,varid]=CreateVar(ncid,Var,groupID,fields{j},DimSize,DimValue);
+					if ~isempty(varid),
+						FillVar(Var,groupID,varid);
+					end
+
+				else
+					disp(sprintf("WARNING, md.%s.%s is not treated as it does not fall in one of the existing cases with class '%s'.",groups{i}, fields{j}, class(md.(groups{i}).(fields{j}))))
+				end
+			elseif sum(strcmp(class(Var), issmclasses)) == 1,  % that is an issm class
+				if strcmp(class(Var), 'solution'),
+					if verbose > 4,
+						disp(sprintf("=$$=creating var for %s.%s",groups{i}, fields{j}))
+						disp("NEED treatment")
+					end
+				elseif strcmp(class(Var), 'dict'),  %we have potential for a dict in py not to sure what it translates to here.
+					if verbose > 4,
+						disp(sprintf("=WW=creating var for %s.%s",groups{i}, fields{j}))
+						disp("NEED Treatment")
+					end
+
+				else
+					klass=class(md.(groups{i}));
+					klasstring = strcat(klass, '.',klass);
+					netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype',klasstring);
+					subgroupID=netcdf.defGrp(groupID,fields{j});
+					klass=class(md.(groups{i}).(fields{j}));
+					klasstring = strcat(klass, '.',klass);
+					netcdf.putAtt(subgroupID,netcdf.getConstant('NC_GLOBAL'),'classtype',klasstring);
+					subfields=fieldnames(Var);
+					for k=1:length(subfields),
+						if sum(strcmp(subfields{k},["outlog" "errlog"])) == 0,
+							if verbose > 4,
+								disp(sprintf("+==+creating var for %s.%s.%s",groups{i}, fields{j}, subfields{k}))
+							end
+							Var=md.(groups{i}).(fields{j}).(subfields{k});
+							[DimSize,DimValue,varid]=CreateVar(ncid,Var,subgroupID,subfields{k},DimSize,DimValue);
+							if ~isempty(varid),
+								FillVar(Var,subgroupID,varid);
+							end
 						end
-						classtype=class(Var(l));
-						if strcmp(classtype,'struct')
-							classtype=groups{i};
-						end
-						listgroupID=netcdf.defGrp(subgroupID,lname);
-						netcdf.putAtt(listgroupID,netcdf.getConstant('NC_GLOBAL'),'classtype',classtype);
-						subfields=fieldnames(Var(l));
-						for m=1:length(subfields)
-							if ~strcmp(subfields{m},'outlog')
-								[DimSize,DimValue]=DefCreateVar(ncid,Var(l).(subfields{m}),listgroupID,subfields{m},DimSize,DimValue);
-							end
-						end
-					end
-				else
-					subgroupID=netcdf.defGrp(groupID,groupfields{j});
-					classtype=class(Var);
-					if strcmp(classtype,'struct')
-						classtype=groups{i};
-					end
-					netcdf.putAtt(subgroupID,netcdf.getConstant('NC_GLOBAL'),'classtype',classtype);
-					subfields=fieldnames(Var);
-					for m=1:length(subfields)
-						if ~strcmp(subfields{m},'outlog')
-							[DimSize,DimValue]=DefCreateVar(ncid,Var.(subfields{m}),subgroupID,subfields{m},DimSize,DimValue);
-						end
-					end
+					end
+
 				end
 			else
-				netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype',class(md.(groups{i})));
-				[DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,groupfields{j},DimSize,DimValue);
-			end
-		end
- end
- netcdf.close(ncid);
+				disp(sprintf("WARNING, md.%s.%s is not treated as it does not fall in one of the existing cases with class '%s'.",groups{i}, fields{j}, class(Var)))
+			end
+		end
+	end
+	netcdf.close(ncid);
 end
 
-function [DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,field,DimSize,DimValue,last,md,midfield)
-	varclass=class(Var);
+function [DimSize,DimValue,varid]=CreateVar(ncid,Var,groupID,field,DimSize,DimValue)
+% Grab dimensions
 	varsize=size(Var);
 	varlength=length(Var);
+	% treating scalar string or bool as atribute
 	if isa(Var,'logical'),
 		if Var,
@@ -160,11 +281,85 @@
 		else,
 			LogicString='False';
-  	end
+		end
 		netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),field,LogicString);
+		varid=[];
+
 	elseif isa(Var,'char'),
-		netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),field,Var);
+		if strcmp(field,'name'),  % it looks like netCDF does not like attributes that are called "name"
+			field = 'varname';
+		end
+		if size(Var,1) <= 1  %that is a single string or empty
+			netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),field,Var);
+			varid=[];
+		else  % that is a character array
+			[dims,DimSize,DimValue]=GetDims(ncid,Var,DimSize,DimValue);
+			varid = netcdf.defVar(groupID,field,'NC_CHAR',dims);
+			if numel(Var)>1
+				netcdf.defVarDeflate(groupID,varid,true,true,4);
+			end
+		end
+
 	elseif isa(Var,'double'), %dealing with arrays
-		[dims,DimSize,DimValue]=GetDims(ncid,Var,DimSize,DimValue);
- 		varid = netcdf.defVar(groupID,field,'NC_DOUBLE',dims);
+		if all(mod(Var, 1) == 0, 'all')  %those are actually integers,
+			[dims,DimSize,DimValue]=GetDims(ncid,Var,DimSize,DimValue);
+			varid = netcdf.defVar(groupID,field,'NC_INT64',dims);
+			if numel(Var)>1
+				netcdf.defVarDeflate(groupID,varid,true,true,4);
+			end
+		else
+			[dims,DimSize,DimValue]=GetDims(ncid,Var,DimSize,DimValue);
+			varid = netcdf.defVar(groupID,field,'NC_DOUBLE',dims);
+			if numel(Var)>1
+				netcdf.defVarDeflate(groupID,varid,true,true,4);
+			end
+		end
+	elseif isa(Var,'cell'),
+		% cells can be a range of things, what are we dealing with here
+		if isempty(Var),
+			netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),field,'emptycell');
+			varid=[];
+		else
+			[dims,DimSize,DimValue]=GetDims(ncid,Var,DimSize,DimValue);
+			if isa(Var{1}, 'double'),
+				varid = netcdf.defVar(groupID,field,'NC_DOUBLE',dims);
+				if numel(Var)>1
+					netcdf.defVarDeflate(groupID,varid,true,true,4);
+				end
+			else
+				varid = netcdf.defVar(groupID,field,'NC_CHAR',dims);
+				if numel(Var)>1
+					netcdf.defVarDeflate(groupID,varid,true,true,4);
+				end
+			end
+		end
+	elseif isa(Var,'struct'),
+		if isempty(fieldnames(Var)),
+			netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),field,'emptystruct');
+			varid=[];
+		else
+			%Start by getting the structure fields and size
+			[dims,DimSize,DimValue]=GetDims(ncid,Var,DimSize,DimValue);
+			varid = netcdf.defVar(groupID,field,'NC_CHAR',dims);
+			if numel(Var)>1
+				netcdf.defVarDeflate(groupID,varid,true,true,4);
+			end
+		end
+	else
+		disp(sprintf('no support for class %s of field %s',class(Var),field));
+		varid=[];
+	end
+	return
+end
+
+
+function FillVar(Var,groupID,varid)
+% Grab dimensions
+	varsize=size(Var);
+	varlength=length(Var);
+	% treating scalar string or bool as atribute
+	if isa(Var,'double'), %dealing with arrays
+		if all(mod(Var, 1) == 0, 'all')  %those are actually integers,
+			Var = int64(Var);
+		end
 		if length(Var)==0,
 			netcdf.putVar(groupID,varid,NaN);
@@ -172,68 +367,69 @@
 			netcdf.putVar(groupID,varid,Var);
 		end
-	elseif isa(Var,'cell'),
-		[dims,DimSize,DimValue]=GetDims(ncid,Var,DimSize,DimValue);
-		%dirty hack to be able to pass strings
-		varid = netcdf.defVar(groupID,field,'NC_CHAR',dims);
-		if length(Var)==0,
-			netcdf.putVar(groupID,varid,0,9,'emptycell')
-		else
-			for i=1:length(Var),
+	elseif isa(Var,'char'),  % at this point this should be a character array
+		netcdf.putVar(groupID,varid,Var);
+	elseif isa(Var,'cell'),  % there can be a number of things in a cell array
+		for i=1:length(Var),
+			if isa(Var{i},'char')  %for characters we limit the size to 40 for now
 				if length(Var)>1,
-					endpoint=[1,min(length(Var{i}),40)];
-					startpoint=[1 0];
-				else
-					endpoint=min(length(Var{i}),40);
+					count=[min(length(Var{i}),40), 1];
+					startpoint=[0 i-1];
+				else
+					count=min(length(Var{i}),40);
 					startpoint=0;
 				end
+
 				if length(Var{i})>40,
-					netcdf.putVar(groupID,varid,startpoint,extent,Var{i}(1:40))
+					netcdf.putVar(groupID,varid,startpoint,count,Var{i}(1:40));
 					disp(sprintf('some variable have been truncated'));
 				else
-					netcdf.putVar(groupID,varid,startpoint,endpoint,Var{i})
-				end
+					netcdf.putVar(groupID,varid,startpoint,count,Var{i});
+				end
+			elseif isa(Var{i},'double')
+				startpoint=[i-1];
+				count=[1 length(Var{i}) ndims(Var{i})];
+				for j=1:ndims(Var{i}),
+					startpoint=[startpoint 0];
+				end
+				netcdf.putVar(groupID,varid,startpoint,count,Var{i});
+			else
+				disp(sprintf("WARNING: cell of class %s is not supported.",class(Var{i})))
 			end
 		end
 	elseif isa(Var,'struct'),
 		%Start by getting the structure fields and size
-		locfields=fieldnames(Var);
-		[dims,DimSize,DimValue]=GetDims(ncid,Var,DimSize,DimValue);
-		varid = netcdf.defVar(groupID,field,'NC_CHAR',dims);
-		if length(locfields)==0,
-			netcdf.putVar(groupID,varid,[0,0],[1,11],'emptystruct')
-		else
-			for i=1:length(locfields),
-				for j=1:2,
-					if j==1,
-						CharVar=locfields{i};
-						if length(CharVar)==0
-							CharVar='emptystruct';
-						end
-						startpoint=[i-1,0,0];
+		locfields=fieldnames(Var)
+		for i=1:length(locfields),
+			for j=1:2,
+				if j==1,
+					CharVar=locfields{i};
+					if length(CharVar)==0
+						CharVar='emptystruct';
+					end
+					startpoint=[i-1,0,0];
+				else
+					if isa(Var.(locfields{i}),'char'),
+						CharVar=Var.(locfields{i});
 					else
-						if isa(Var.(locfields{i}),'char'),
-							CharVar=Var.(locfields{i});
-						else
-							CharVar=num2str(Var.(locfields{i}));
-						end
-						if length(CharVar)==0
-							CharVar='emptystruct';
-						end
-						startpoint=[i-1,1,0];
-					end
-
-					extent=[1,1,min(length(CharVar),40)];
-					if length(CharVar)>40,
-						netcdf.putVar(groupID,varid,startpoint,extent,CharVar(1:40))
-						disp(sprintf('some variable have been truncated'));
-					else
-						netcdf.putVar(groupID,varid,startpoint,extent,CharVar)
-					end
+						CharVar=num2str(Var.(locfields{i}));
+					end
+					if length(CharVar)==0
+						CharVar='emptystruct';
+					end
+					startpoint=[i-1,1,0];
+				end
+
+				extent=[1,1,min(length(CharVar),40)];
+				if length(CharVar)>40,
+					netcdf.putVar(groupID,varid,startpoint,extent,CharVar(1:40));
+					disp(sprintf('some variable have been truncated'));
+				else
+					netcdf.putVar(groupID,varid,startpoint,extent,CharVar);
 				end
 			end
 		end
 	else
-		disp(sprintf('no support for class %s of field %s',varclass,field));
-  end
+		disp(sprintf('no support for class %s',class(Var)));
+	end
 	return
 end
@@ -241,44 +437,46 @@
 function [dims,DimSize,DimValue]=GetDims(ncid,Var,DimSize,DimValue)
 	dims=[];
-	if isa(Var,'cell'),
-		varsize=size(Var');
-	elseif isa(Var,'struct')
+	celldims=[];
+	dim=ndims(Var);
+	if isa(Var,'struct'),
 		varsize=length(fieldnames(Var));
 	else
 		varsize=size(Var);
-	end
-	dim=sum(varsize>1);
-	if dim>0
-		for i=1:dim
-			indsize=find(varsize(i)==DimValue);
-			if length(indsize)>0
-				dims=[dims DimSize(indsize).index];
-			else
-				indsize=length(DimSize)+1;
-				DimSize(indsize).index=netcdf.defDim(ncid,['Dimension' num2str(indsize)],varsize(i));
-				[DimSize(indsize).name,DimSize(indsize).value]=netcdf.inqDim(ncid,DimSize(indsize).index);
-				DimValue(indsize)=DimSize(indsize).value;
-				dims=[dims DimSize(indsize).index];
-			end
-		end
-	end
-	%if we have a cell variable we need to add a stringlength dimension
+		if isa(Var, 'cell')
+			%we add the dimension of the cells themselves,
+			%that will most probably fail if cells have different sizes
+			for i=1:dim,
+				newdim=size(Var{i});
+				if ~ismember(newdim, celldims),
+					celldims=[celldims newdim];
+				end
+			end
+		end
+	end
+	varsize=[varsize celldims];
+	alldim=length(varsize);
+	if dim>0,
+		for i=1:alldim,
+			if size(Var, i)>1 || i>dim,  %we skip dimensions with zero lenght but want to add dimensions from cells
+				indsize=find(varsize(i)==DimValue);
+				if length(indsize)>0
+					dims=[dims DimSize(indsize).index];
+				else
+					indsize=length(DimSize)+1;
+					DimSize(indsize).index=netcdf.defDim(ncid,['DimNum' num2str(indsize)],varsize(i));
+					[DimSize(indsize).name,DimSize(indsize).value]=netcdf.inqDim(ncid,DimSize(indsize).index);
+					DimValue(indsize)=DimSize(indsize).value;
+					dims=[dims DimSize(indsize).index];
+				end
+			end
+		end
+	end
+	if isa(Var, 'cell') && isa(Var{1}, 'char'),
+		%if we have an cell variable with strings we need to add a stringlength
+		dims=[dims DimSize(4).index];
+	end
+	% struct also need an extra dimension 2, but only if non empty
 	if isa(Var,'struct'),
-		if DimValue(3)~=2
-			if DimValue(2)~=2
-				dims=[dims DimSize(1).index];
-			else
-				dims=[dims DimSize(2).index];
-			end
-		else
-			dims=[dims DimSize(3).index];
-		end
-	end
-	if isa(Var,'cell') || isa(Var,'struct'),
-		if DimValue(2)~=40
-			dims=[dims DimSize(1).index];
-		else
-			dims=[dims DimSize(2).index];
-		end
+		dims=[dims DimSize(3).index DimSize(4).index];
 	end
 end
Index: /issm/trunk/src/m/contrib/defleurian/netCDF/export_netCDF.py
===================================================================
--- /issm/trunk/src/m/contrib/defleurian/netCDF/export_netCDF.py	(revision 27034)
+++ /issm/trunk/src/m/contrib/defleurian/netCDF/export_netCDF.py	(revision 27035)
@@ -1,4 +1,5 @@
 from netCDF4 import Dataset
 import numpy as np
+import numpy.ma as ma
 import time
 import collections
@@ -13,5 +14,5 @@
 
     def update(self, stepvar):
-        #if we have a scalar we just add it to the en
+        #if we have a scalar we just add it to the end
         #we save the size of the current step for further treatment
         if len(np.shape(stepvar)) == 0:
@@ -21,39 +22,47 @@
         #we save the size of the current step for further treatment
         else:
-            self.sizes.append(len(stepvar))
-            for r in stepvar:
-                self.data.append(r)
+            self.sizes.append([np.shape(stepvar)])
+            stackdat = np.squeeze(stepvar.flatten())
+            self.data = np.hstack((self.data, stackdat))
 
     def finalize(self, rows):
         #we have more scalars than steps, so we have an array
         if len(self.data) > rows:
+            datasize = np.squeeze(self.sizes)
+            maxsize = []
+            try:
+                dims = np.arange(np.shape(datasize)[1])
+                for dim in dims:
+                    maxsize.append(np.nanmax(datasize[:, dim]))
+            except IndexError:
+                if datasize.ndim == 0:
+                    maxsize.append(datasize)
+                else:
+                    maxsize.append(np.nanmax(datasize[:]))
+            findim = np.insert(maxsize, 0, rows)
             #first check if all steps are the same size
-            SameSize = np.sum(np.asarray(self.sizes) - self.sizes[0]) == 0
+            if datasize.ndim == 0:
+                SameSize = True
+            else:
+                SameSize = np.sum(np.abs(datasize - datasize[0])) == 0
             if SameSize:
                 #same size for all steps, just reshape
-                return np.reshape(self.data, newshape=(rows, int(len(self.data) / rows)))
+                return np.reshape(self.data, newshape=(findim))
             else:
                 #different sizes at each steps, first create a table big enough for the biggest step
                 startpoint = 0
-                datadim = len(np.shape(self.data))
-                if datadim == 1:
-                    outdat = np.nan * np.ones((rows, np.nanmax(self.sizes)))
-                    for step in range(rows):
-                        curlen = self.sizes[step]
-                        outdat[step, :curlen] = self.data[startpoint: startpoint + curlen]
-                        startpoint += curlen
-                elif datadim == 2:
-                    outdat = np.nan * np.ones((rows, np.nanmax(self.sizes), np.shape(self.data)[1]))
-                    for step in range(rows):
-                        curlen = self.sizes[step]
-                        outdat[step, :curlen, :] = self.data[startpoint: startpoint + curlen]
-                        startpoint += curlen
-
-                else:
-                    print("ERROR, reult treatment cant cope with dimensions above 2")
+                outdat = np.nan * np.ones(findim)
+                for step in range(rows):
+                    #slicer is the data slice in the final array
+                    slicer = [slice(0, d) for d in datasize[step, :]]
+                    slicer = np.insert(slicer, 0, step)
+                    curlen = int(np.prod(datasize[step, :]))
+                    outdat[tuple(slicer)] = np.reshape(self.data[startpoint:startpoint + curlen], newshape=(datasize[step, :]))
+                    startpoint += curlen
+                #outmasked = ma.masked_array(outdat, mask=np.where(np.isnan(outdat), 1, 0))
                 return outdat
-        #as much scalars as stpes (or less) so just one value per step
-        else:
-            return np.asarray(self.data)
+        #as much scalars as steps (or less) so just one value per step
+        else:
+            return np.squeeze(np.asarray(self.data))
 
 
@@ -88,6 +97,6 @@
     dimindex = 2
     #add mesh related dimension that we know are needed
-    dimlist = [2, md.mesh.numberofelements, md.mesh.numberofvertices, np.shape(md.mesh.elements)[1]]
-    dimnames = ['DictDummy', 'EltNum', 'VertNum', 'VertPerElt']
+    dimlist = [2, 40, md.mesh.numberofelements, md.mesh.numberofvertices, np.shape(md.mesh.elements)[1]]
+    dimnames = ['DictDummy', 'StringLength', 'EltNum', 'VertNum', 'VertPerElt']
     if verbose > 0:
         print('===Creating dimensions ===')
@@ -121,12 +130,13 @@
         # looping on fields in each group
         for field in fields:
+            Var = md.__dict__[group].__dict__[field]
             # Special treatment for list fields
-            if type(md.__dict__[group].__dict__[field]) == list:
+            if type(Var) == list:
                 StdList = False
-                if len(md.__dict__[group].__dict__[field]) == 0:
+                if len(Var) == 0:
                     StdList = True  #this is an empty list
                 else:
                     #returns False for exotic types (typicaly results)
-                    StdList = type(md.__dict__[group].__dict__[field][0]) in typelist
+                    StdList = type(Var[0]) in typelist
                 klass = type(md.__dict__[group]).__module__ + '.' + type(md.__dict__[group]).__name__
                 NCgroup.__setattr__('classtype', klass)
@@ -134,5 +144,4 @@
                     if verbose > 4:
                         print("=££=creating var for {}.{} with classtype : {}".format(group, field, klass))
-                    Var = md.__dict__[group].__dict__[field]
                     Var = SqueezeVar(Var)
                     DimDict, ncvar = CreateVar(NCData, Var, field, NCgroup, DimDict)
@@ -141,6 +150,6 @@
                 else:  # this is a list of fields, specific treatment needed (usually results or outputdefinitions)
                     if verbose > 4:
-                        print("list of fields happens for {}.{} with classtype : {}".format(group, field, klass))
-                    Listsize = len(md.__dict__[group].__dict__[field])
+                        print("=??=we have a list of fields for {}.{} with classtype : {}".format(group, field, klass))
+                    Listsize = len(Var)
                     if group == 'results':  #for results we reshape the datas following time rather than subgrouping
                         Subgroup = NCgroup.createGroup(str(field))
@@ -155,5 +164,5 @@
                             subfields = dict.keys(md.__dict__[group].__dict__[field].__getitem__(0))
                         for subfield in subfields:
-                            if subfield not in['errlog', 'outlog']:
+                            if subfield not in ['errlog', 'outlog']:
                                 StackedVar = ResTable()
                                 #first loop over the field (result type) to find the index of the last subfield (variable)
@@ -172,5 +181,5 @@
                                     StackedVar.update(Var)
                                 if verbose > 4:
-                                    print("=$$=creating var for {}.{}.{}".format(group, field, subfield))
+                                    print("=@@=creating var for {}.{}.{}".format(group, field, subfield))
                                     print("last index of the list is {}".format(lastindex))
                                 StackedVar = SqueezeVar(StackedVar.finalize(int(lastindex)))
@@ -238,5 +247,5 @@
                         subfields = dict.keys(md.__dict__[group].__dict__[field].__getitem__(0))
                     for subfield in subfields:
-                        if subfield not in['errlog', 'outlog']:
+                        if subfield not in ['errlog', 'outlog']:
                             StackedVar = ResTable()
                             for listindex in range(0, Listsize):
@@ -245,9 +254,10 @@
                                     lastindex = listindex + 1
                                 except AttributeError:
-                                    Var = md.__dict__[group].__dict__[field].__getitem__(listindex)[subfield]
+                                    Var = md.__dict__[group].__dict__[field].__dict__[subfield]
+                                    lastindex = listindex
                                 except KeyError:
                                     #Some fields only exist for the first step
                                     lastindex = listindex
-                                    continue
+                                    break
                                 Var = SqueezeVar(Var)
                                 StackedVar.update(Var)
@@ -289,5 +299,5 @@
                                 FillVar(ncvar, Var)
             else:
-                print("WARNING, md.{}.{} is not treated as it does not fall in one of the existing cases.".format(str(group), str(field)))
+                print("WARNING, md.{}.{} is not treated as it does not fall in one of the existing cases.".format(group, field))
 
     NCData.close()
@@ -305,4 +315,5 @@
         if val_type.startswith('<U'):
             val_type = 'stringarray'
+            print(var)
     except AttributeError:
         val_type = type(var)
@@ -329,13 +340,21 @@
         if field == 'name':  # it looks like netCDF does not like attributes that are called "name"
             field = 'varname'
-        Group.__setattr__(str(field).swapcase(), str(var))
+        Group.__setattr__(str(field), str(var))
         ncvar = None
     # numpy array of strings
     elif val_type == "stringarray":
         #if all strings are the same set it as an attribute
-        if all(var == var[0]):
+        try:
+            samestring = all(var == var[0])
+        except IndexError:
+            #Only one string
+            samestring = True
+        if samestring:
             if field == 'name':
                 field = 'varname'
-            Group.__setattr__(str(field).swapcase(), str(var[0]))
+            try:
+                Group.__setattr__(str(field), str(var[0]))
+            except IndexError:
+                Group.__setattr__(str(field), str(var))
             ncvar = None
         else:
@@ -355,6 +374,6 @@
             dimensions, DimDict = GetDim(NCData, val_shape, val_type, DimDict, val_dim)
             ncvar = Group.createVariable(str(field), nctype, dimensions=dimensions, zlib=True)
-    # treating bool tables and dict as string tables
-    elif val_type in [collections.OrderedDict, dict, 'bool']:
+    # treating  dict as string tables
+    elif val_type in [collections.OrderedDict, dict]:
         if val_shape in [(), (0,), 0]:
             ncvar = Group.createVariable(str(field), str, zlib=True)
@@ -362,6 +381,29 @@
             dimensions, DimDict = GetDim(NCData, val_shape, val_type, DimDict, val_dim)
             ncvar = Group.createVariable(str(field), str, dimensions=dimensions, zlib=True)
-    # Now dealing with numeric variables
-    elif val_type in [float, 'float64', np.float64, int, 'int64']:
+    # treating bool as integers
+    elif val_type == 'bool':
+        if val_shape in [(), (0,), 0]:
+            ncvar = Group.createVariable(str(field), int, zlib=True)
+        else:
+            dimensions, DimDict = GetDim(NCData, val_shape, val_type, DimDict, val_dim)
+            ncvar = Group.createVariable(str(field), int, dimensions=dimensions, zlib=True)
+    # Now dealing with doubles, we convert them to int if possible
+    elif val_type in [float, 'float64', np.float64]:
+        try:
+            #check if we are integer and under C long overflow also skip empty arrays
+            IsInt = np.sum(np.mod(var, 1)) == 0 and np.all(abs(var) < 2147483647) and len(var) > 0
+        except TypeError:
+            #check if we are integer and under C long overflow
+            IsInt = np.mod(var, 1) == 0 and abs(var) < 2147483647
+        if IsInt:
+            val_type = 'int64'
+        if val_shape in [(), (0,), 0] and not SupDim:
+            ncvar = Group.createVariable(str(field), TypeDict[val_type], zlib=True)
+        else:
+            dimensions, DimDict = GetDim(NCData, val_shape, val_type, DimDict, val_dim)
+            if SupDim:
+                dimensions = SupDim + dimensions
+            ncvar = Group.createVariable(str(field), TypeDict[val_type], dimensions=dimensions, zlib=True)
+    elif val_type in [int, 'int64']:
         if val_shape in [(), (0,), 0] and not SupDim:
             ncvar = Group.createVariable(str(field), TypeDict[val_type], zlib=True)
@@ -410,5 +452,5 @@
     elif val_type == 'bool':
         for elt in range(0, val_shape[0]):
-            ncvar[elt] = str(invar[elt])
+            ncvar[elt] = int(invar[elt])  #str(invar[elt])
     # treating dictionaries as tables of strings
     elif val_type in [collections.OrderedDict, dict]:
Index: /issm/trunk/src/m/contrib/defleurian/netCDF/restable.m
===================================================================
--- /issm/trunk/src/m/contrib/defleurian/netCDF/restable.m	(revision 27035)
+++ /issm/trunk/src/m/contrib/defleurian/netCDF/restable.m	(revision 27035)
@@ -0,0 +1,60 @@
+classdef restable
+	properties(SetAccess=public)
+		data=[];
+		sizes=[];
+	end
+	methods
+		function self = update(self, stepvar)
+			if length(stepvar) == 1
+				%if we have a scalar we just add it to the end
+				%we save the size of the current step for further treatment
+				self.sizes=[self.sizes;1];
+				self.data=[self.data;stepvar];
+			else
+				% if it is an array we add the values one by one
+				%we save the size of the current step for further treatment
+				self.sizes=[self.sizes;fliplr(size(stepvar))];
+				%we need to transpose to follow the indexing
+				flatdata=reshape(stepvar', 1, []);
+				self.data=[self.data,flatdata];
+			end
+		end
+		function outdat = finalize(self, rows)
+			if length(self.data)>rows,
+				if size(self.sizes, 1)==1,
+					%just one step, data don't need treatment
+					outdat=self.data;
+				else,
+					%we have more scalars than steps, so we have an array
+					maxsize=[];
+					for d=1:size(self.sizes,2)
+						maxsize=[maxsize,max(self.sizes(:,d))];
+					end
+					findim=[maxsize, rows];
+					%first check if all steps are the same size
+					SameSize = sum(self.sizes - self.sizes(1, :))==0;
+					if SameSize,
+						%same size for all steps, just reshape
+						outdat=reshape(self.data, findim);
+					else,
+						%different sizes at each steps, first create a table big enough for the biggest step
+						startpoint=1;
+						datadim=ndims(self.data);
+						outdat=nan(findim);
+						for r=1:rows
+							curlen = prod(self.sizes(r, :));
+							outdat(1:self.sizes(r,1), 1:self.sizes(r,2), r) = reshape(self.data(startpoint:startpoint+ ...
+													  curlen-1),self.sizes(r,:));
+							startpoint = startpoint+curlen;
+						end
+
+					end
+				end,
+			else,
+				%as much scalars as steps (or less) so just one value per step
+				outdat=self.data;
+
+			end
+		end
+	end
+end
Index: /issm/trunk/src/m/contrib/larour/mdanalysis.m
===================================================================
--- /issm/trunk/src/m/contrib/larour/mdanalysis.m	(revision 27034)
+++ /issm/trunk/src/m/contrib/larour/mdanalysis.m	(revision 27035)
@@ -1600,10 +1600,10 @@
 			if strncmpi(fieldv,'Mask',4),
 				contourexp=[tempname '.exp'];
-				expcontourlevelzero(md.icecaps{i},field,0, contourexp);
+				isoline(md.icecaps{i},field,'output',contourexp);
 				contourlevels=1;
 
 				if diff,
 					contourdiffexp=[tempname '.exp'];
-					expcontourlevelzero(md.icecaps{i},dfield,0, contourdiffexp);
+					isoline(md.icecaps{i},dfield,'output',contourdiffexp);
 				end
 			end
Index: /issm/trunk/src/m/contrib/morlighem/modeldata/interpBamber2001.m
===================================================================
--- /issm/trunk/src/m/contrib/morlighem/modeldata/interpBamber2001.m	(revision 27034)
+++ /issm/trunk/src/m/contrib/morlighem/modeldata/interpBamber2001.m	(revision 27035)
@@ -8,4 +8,7 @@
 		bamber2001bedpath ='/home/ModelData/Greenland/Bamber2001/bedrock.mat';
 		bamber2001thxpath ='/home/ModelData/Greenland/Bamber2001/thickness.mat';
+	case {'totten'}
+		bamber2001bedpath ='/totten_1/ModelData/Greenland/Bamber2001/bedrock.mat';
+		bamber2001thxpath ='/totten_1/ModelData/Greenland/Bamber2001/thickness.mat';
 	otherwise
 		error('machine not supported yet');
Index: /issm/trunk/src/m/contrib/morlighem/modeldata/interpBamber2013.m
===================================================================
--- /issm/trunk/src/m/contrib/morlighem/modeldata/interpBamber2013.m	(revision 27034)
+++ /issm/trunk/src/m/contrib/morlighem/modeldata/interpBamber2013.m	(revision 27035)
@@ -22,4 +22,6 @@
 	case {'ronne'}
 		bamber2013nc='/home/ModelData/Greenland/Bamber2013/Greenland_bedrock_topography_V3.nc';
+	case {'totten'}
+		bamber2013nc='/totten_1/ModelData/Greenland/Bamber2013/Greenland_bedrock_topography_V3.nc';
 	otherwise
 		error('machine not supported yet');
Index: /issm/trunk/src/m/contrib/morlighem/modeldata/interpBedmachineAntarctica.m
===================================================================
--- /issm/trunk/src/m/contrib/morlighem/modeldata/interpBedmachineAntarctica.m	(revision 27034)
+++ /issm/trunk/src/m/contrib/morlighem/modeldata/interpBedmachineAntarctica.m	(revision 27035)
@@ -28,5 +28,5 @@
 if nargin<5
 	ncdate='2020-07-15'; %BedMachine v2
-	ncdate='2021-11-16'; %BedMachine v2
+	ncdate='2021-11-16'; %new
 end
 basename = 'BedMachineAntarctica';
Index: /issm/trunk/src/m/contrib/morlighem/modeldata/interpBedmachineGreenland.m
===================================================================
--- /issm/trunk/src/m/contrib/morlighem/modeldata/interpBedmachineGreenland.m	(revision 27034)
+++ /issm/trunk/src/m/contrib/morlighem/modeldata/interpBedmachineGreenland.m	(revision 27035)
@@ -30,4 +30,6 @@
 	ncdate='2017-09-25'; %BedMachine v3
 	ncdate='2020-04-14';
+	ncdate='2021-08-27';
+	ncdate='2022-03-17';
 end
 basename = 'BedMachineGreenland';
Index: /issm/trunk/src/m/contrib/morlighem/modeldata/interpDhdt.m
===================================================================
--- /issm/trunk/src/m/contrib/morlighem/modeldata/interpDhdt.m	(revision 27034)
+++ /issm/trunk/src/m/contrib/morlighem/modeldata/interpDhdt.m	(revision 27035)
@@ -4,4 +4,6 @@
 	case {'ronne'}
 		dhdtpath='/home/ModelData/Greenland/DHDT/dhdt0306.tif';
+	case {'totten'}
+		dhdtpath='/totten_1/ModelData/Greenland/DHDT/dhdt0306.tif';
 	otherwise
 		error('machine not supported yet');
Index: /issm/trunk/src/m/contrib/morlighem/modeldata/interpGimpdem.m
===================================================================
--- /issm/trunk/src/m/contrib/morlighem/modeldata/interpGimpdem.m	(revision 27034)
+++ /issm/trunk/src/m/contrib/morlighem/modeldata/interpGimpdem.m	(revision 27035)
@@ -6,4 +6,6 @@
 	case {'ronne'}
 		howatpath='/home/ModelData/Greenland/gimpdem/gimpdem_90m.tif';
+	case {'totten'}
+		howatpath='/totten_1/ModelData/Greenland/gimpdem/gimpdem_90m.tif';
 	otherwise
 		error('machine not supported yet');
Index: /issm/trunk/src/m/contrib/morlighem/modeldata/interpJakobsson2020.m
===================================================================
--- /issm/trunk/src/m/contrib/morlighem/modeldata/interpJakobsson2020.m	(revision 27034)
+++ /issm/trunk/src/m/contrib/morlighem/modeldata/interpJakobsson2020.m	(revision 27035)
@@ -4,4 +4,6 @@
 	case {'ronne'}
 		ncpath ='/home/ModelData/Greenland/IBCAO/IBCAO_v4_200m.nc';
+	case {'totten'}
+		ncpath ='/totten_1/ModelData/Greenland/IBCAO/IBCAO_v4_200m.nc';
 	otherwise
 		error('machine not supported yet');
@@ -39,5 +41,5 @@
 
 if nargout==2,
-	ncpath ='/home/ModelData/Greenland/IBCAO/IBCAO_v4_200m_TID.nc';
+	ncpath ='/totten_1/ModelData/Greenland/IBCAO/IBCAO_v4_200m_TID.nc';
 	disp('   -- Jakobsson2020: loading source');
 	data = double(ncread(ncpath,'z',[id1x id1y],[id2x-id1x+1 id2y-id1y+1],[1 1]))';
Index: /issm/trunk/src/m/contrib/morlighem/modeldata/interpMouginotAnt2019.m
===================================================================
--- /issm/trunk/src/m/contrib/morlighem/modeldata/interpMouginotAnt2019.m	(revision 27034)
+++ /issm/trunk/src/m/contrib/morlighem/modeldata/interpMouginotAnt2019.m	(revision 27035)
@@ -5,4 +5,6 @@
 	case {'ronne'}
 		nc = '/home/ModelData/Antarctica/MouginotVel/v_mix.v13Mar2019.nc';
+	case {'totten'}
+		nc = '/totten_1/ModelData/Antarctica/MouginotVel/v_mix.v8Jul2019.nc';
 	otherwise
 		error('hostname not supported yet');
Index: /issm/trunk/src/m/contrib/morlighem/modeldata/interpRACMO1km.m
===================================================================
--- /issm/trunk/src/m/contrib/morlighem/modeldata/interpRACMO1km.m	(revision 27034)
+++ /issm/trunk/src/m/contrib/morlighem/modeldata/interpRACMO1km.m	(revision 27035)
@@ -4,4 +4,6 @@
 	case {'ronne'}
 		rootname='/home/ModelData/Greenland/RACMO2_1km/SMB_MEAN1960-1989_150m.nc';
+	case {'totten'}
+		rootname='/totten_1/ModelData/Greenland/RACMO2_1km/SMB_MEAN1960-1989_150m.nc';
 	otherwise
 		error('machine not supported yet');
Index: /issm/trunk/src/m/contrib/morlighem/modeldata/interpRignotIceShelfMelt.m
===================================================================
--- /issm/trunk/src/m/contrib/morlighem/modeldata/interpRignotIceShelfMelt.m	(revision 27034)
+++ /issm/trunk/src/m/contrib/morlighem/modeldata/interpRignotIceShelfMelt.m	(revision 27035)
@@ -4,4 +4,6 @@
 	case {'ronne'}
 		rignotmelt='/home/ModelData/Antarctica/RignotMeltingrate/Ant_MeltingRate.nc';
+	case {'totten'}
+		rignotmelt='/totten_1/ModelData/Antarctica/RignotMeltingrate/Ant_MeltingRate.nc';
 	case {'thwaites','murdo','astrid'}
 		rignotmelt=['/home/seroussi/Data/Ant_MeltingRate.nc'];
Index: /issm/trunk/src/m/coordsystems/ll2xy.m
===================================================================
--- /issm/trunk/src/m/coordsystems/ll2xy.m	(revision 27034)
+++ /issm/trunk/src/m/coordsystems/ll2xy.m	(revision 27035)
@@ -40,4 +40,18 @@
 end
 
+%Move to CoordTransform now...
+if exist('CoordTransform_matlab')==3
+	disp('Calling CoordTransform instead, make sure to change your MATLAB script');
+	if sgn==+1
+		assert(delta==45); assert(slat ==70);
+		[x y]=CoordTransform(lat,lon,'EPSG:4326','EPSG:3413');
+		return;
+	else
+		assert(delta==0); assert(slat ==71);
+		[x y]=CoordTransform(lat,lon,'EPSG:4326','EPSG:3031');
+		return;
+	end
+end
+
 % Conversion constant from degrees to radians
 cde  = 57.29577951;
Index: /issm/trunk/src/m/coordsystems/xy2ll.m
===================================================================
--- /issm/trunk/src/m/coordsystems/xy2ll.m	(revision 27034)
+++ /issm/trunk/src/m/coordsystems/xy2ll.m	(revision 27035)
@@ -34,4 +34,18 @@
 	help xy2ll
 	error('bad usage');
+end
+
+%Move to CoordTransform now...
+if exist('CoordTransform_matlab')==3
+	disp('Calling CoordTransform instead, make sure to change your MATLAB script');
+	if sgn==+1
+		assert(delta==45); assert(slat ==70);
+		[lat lon]=CoordTransform(x, y,'EPSG:3413','EPSG:4326');
+		return;
+	else
+		assert(delta==0); assert(slat ==71);
+		[lat lon]=CoordTransform(x, y,'EPSG:3031','EPSG:4326');
+		return;
+	end
 end
 
Index: /issm/trunk/src/m/dev/issmversion.m
===================================================================
--- /issm/trunk/src/m/dev/issmversion.m	(revision 27034)
+++ /issm/trunk/src/m/dev/issmversion.m	(revision 27035)
@@ -17,5 +17,5 @@
 disp(['Compiled on ' IssmConfig('HOST_VENDOR') ' ' IssmConfig('HOST_OS') ' ' IssmConfig('HOST_ARCH') ' by ' IssmConfig('USER_NAME')]);
 disp([' ']);
-disp(['Copyright (c) 2009-2021 California Institute of Technology']);
+disp(['Copyright (c) 2009-2022 California Institute of Technology']);
 disp([' ']);
 disp(['    to get started type: issmdoc']);
Index: /issm/trunk/src/m/dev/issmversion.py
===================================================================
--- /issm/trunk/src/m/dev/issmversion.py	(revision 27034)
+++ /issm/trunk/src/m/dev/issmversion.py	(revision 27035)
@@ -16,5 +16,5 @@
 print(' ')
 print(('Build date: ' + IssmConfig('PACKAGE_BUILD_DATE')[0]))
-print('Copyright (c) 2009-2021 California Institute of Technology')
+print('Copyright (c) 2009-2022 California Institute of Technology')
 print(' ')
 print('    to get started type: issmdoc')
Index: /issm/trunk/src/m/exp/contourlevelzero.m
===================================================================
--- /issm/trunk/src/m/exp/contourlevelzero.m	(revision 27034)
+++ /issm/trunk/src/m/exp/contourlevelzero.m	(revision 27035)
@@ -1,229 +1,3 @@
-function contours=contourlevelzero(md,mask,level)
-%CONTOURLEVELZERO - figure out the zero level (or offset thereof, specified by the level value) 
-%                   of a vectorial mask, and vectorialize it into an exp or shp compatible 
-%structure.
-%
-%   Usage:
-%      contours=contourlevelzero(md,mask,level)
-%
-%   See also: PLOT_CONTOUR
+function contours=contourlevelzero(md,mask,level,varargin)
 
-%process data 
-if dimension(md.mesh)==3,
-% 	error('contourlevelzero error message: routine not supported for 3d meshes, project on a layer');
-	x = md.mesh.x2d;
-	y = md.mesh.y2d;
-	index=md.mesh.elements2d;
-else
-	x=md.mesh.x;
-	y=md.mesh.y;
-	index=md.mesh.elements;
-end
-
-if isprop(md.mesh,'z'),
-	z=md.mesh.z;
-else
-	z=zeros(md.mesh.numberofvertices,1);
-end
-
-if isempty(mask), error('mask provided is empty'); end
-if dimension(md.mesh)==3,
-	if length(mask)~=md.mesh.numberofvertices2d, error('mask provided should be specified at the vertices of the mesh'); end
-else
-	if length(mask)~=md.mesh.numberofvertices, error('mask provided should be specified at the vertices of the mesh'); end
-end
-
-%initialization of some variables
-numberofelements=size(index,1);
-elementslist=1:numberofelements;
-c=[];
-h=[];
-
-%get unique edges in mesh
-%1: list of edges
-edges=[index(:,[1,2]); index(:,[2,3]); index(:,[3,1])];
-%2: find unique edges
-[edges,I,J]=unique(sort(edges,2),'rows');
-%3: unique edge numbers
-vec=J;
-%4: unique edges numbers in each triangle (2 triangles sharing the same edge will have
-%   the same edge number)
-edges_tria=[vec(elementslist), vec(elementslist+numberofelements), vec(elementslist+2*numberofelements)];
-
-%segments [nodes1 nodes2]
-Seg1=index(:,[1 2]);
-Seg2=index(:,[2 3]);
-Seg3=index(:,[3 1]);
-
-%segment numbers [1;4;6;...]
-Seg1_num=edges_tria(:,1);
-Seg2_num=edges_tria(:,2);
-Seg3_num=edges_tria(:,3);
-
-%value of data on each tips of the segments
-Data1=mask(Seg1);
-Data2=mask(Seg2);
-Data3=mask(Seg3);
-
-%get the ranges for each segment
-Range1=sort(Data1,2);
-Range2=sort(Data2,2);
-Range3=sort(Data3,2);
-
-%find the segments that contain this value
-pos1=(Range1(:,1)<level & Range1(:,2)>=level);
-pos2=(Range2(:,1)<level & Range2(:,2)>=level);
-pos3=(Range3(:,1)<level & Range3(:,2)>=level);
-
-%get elements
-poselem12=(pos1 & pos2);
-poselem13=(pos1 & pos3);
-poselem23=(pos2 & pos3);
-poselem=find(poselem12 | poselem13 | poselem23);
-numelems=length(poselem);
-
-%if no element has been flagged, skip to the next level
-if numelems==0,
-	warning('contourlevelzero warning message: no elements found with corresponding level value in mask');
-	contours=struct([]);
-	return;
-end
-
-%go through the elements and build the coordinates for each segment (1 by element)
-x1=zeros(numelems,1);
-x2=zeros(numelems,1);
-y1=zeros(numelems,1);
-y2=zeros(numelems,1);
-z1=zeros(numelems,1);
-z2=zeros(numelems,1);
-
-edge_l=zeros(numelems,2);
-
-for j=1:numelems,
-
-	weight1=(level-Data1(poselem(j),1))/(Data1(poselem(j),2)-Data1(poselem(j),1));
-	weight2=(level-Data2(poselem(j),1))/(Data2(poselem(j),2)-Data2(poselem(j),1));
-	weight3=(level-Data3(poselem(j),1))/(Data3(poselem(j),2)-Data3(poselem(j),1));
-
-	if poselem12(poselem(j));
-
-		x1(j)=x(Seg1(poselem(j),1))+weight1*(x(Seg1(poselem(j),2))-x(Seg1(poselem(j),1)));
-		x2(j)=x(Seg2(poselem(j),1))+weight2*(x(Seg2(poselem(j),2))-x(Seg2(poselem(j),1)));
-		y1(j)=y(Seg1(poselem(j),1))+weight1*(y(Seg1(poselem(j),2))-y(Seg1(poselem(j),1)));
-		y2(j)=y(Seg2(poselem(j),1))+weight2*(y(Seg2(poselem(j),2))-y(Seg2(poselem(j),1)));
-		z1(j)=z(Seg1(poselem(j),1))+weight1*(z(Seg1(poselem(j),2))-z(Seg1(poselem(j),1)));
-		z2(j)=z(Seg2(poselem(j),1))+weight2*(z(Seg2(poselem(j),2))-z(Seg2(poselem(j),1)));
-
-		edge_l(j,1)=Seg1_num(poselem(j));
-		edge_l(j,2)=Seg2_num(poselem(j));
-
-	elseif poselem13(poselem(j)),
-
-		x1(j)=x(Seg1(poselem(j),1))+weight1*(x(Seg1(poselem(j),2))-x(Seg1(poselem(j),1)));
-		x2(j)=x(Seg3(poselem(j),1))+weight3*(x(Seg3(poselem(j),2))-x(Seg3(poselem(j),1)));
-		y1(j)=y(Seg1(poselem(j),1))+weight1*(y(Seg1(poselem(j),2))-y(Seg1(poselem(j),1)));
-		y2(j)=y(Seg3(poselem(j),1))+weight3*(y(Seg3(poselem(j),2))-y(Seg3(poselem(j),1)));
-		z1(j)=z(Seg1(poselem(j),1))+weight1*(z(Seg1(poselem(j),2))-z(Seg1(poselem(j),1)));
-		z2(j)=z(Seg3(poselem(j),1))+weight3*(z(Seg3(poselem(j),2))-z(Seg3(poselem(j),1)));
-
-		edge_l(j,1)=Seg1_num(poselem(j));
-		edge_l(j,2)=Seg3_num(poselem(j));
-
-	elseif poselem23(poselem(j)),
-
-		x1(j)=x(Seg2(poselem(j),1))+weight2*(x(Seg2(poselem(j),2))-x(Seg2(poselem(j),1)));
-		x2(j)=x(Seg3(poselem(j),1))+weight3*(x(Seg3(poselem(j),2))-x(Seg3(poselem(j),1)));
-		y1(j)=y(Seg2(poselem(j),1))+weight2*(y(Seg2(poselem(j),2))-y(Seg2(poselem(j),1)));
-		y2(j)=y(Seg3(poselem(j),1))+weight3*(y(Seg3(poselem(j),2))-y(Seg3(poselem(j),1)));
-		z1(j)=z(Seg2(poselem(j),1))+weight2*(z(Seg2(poselem(j),2))-z(Seg2(poselem(j),1)));
-		z2(j)=z(Seg3(poselem(j),1))+weight3*(z(Seg3(poselem(j),2))-z(Seg3(poselem(j),1)));
-
-		edge_l(j,1)=Seg2_num(poselem(j));
-		edge_l(j,2)=Seg3_num(poselem(j));
-	else
-		%it shoud not go here
-	end
-end
-
-%now that we have the segments, we must try to connect them...
-
-%loop over the subcontours
-contours=struct([]);
-
-while ~isempty(edge_l),
-
-	%take the right edge of the second segment and connect it to the next segments if any
-	e1=edge_l(1,1);   e2=edge_l(1,2);
-	xc=[x1(1);x2(1)]; yc=[y1(1);y2(1)]; zc=[z1(1);z2(1)];
-
-
-	%erase the lines corresponding to this edge
-	edge_l(1,:)=[];
-	x1(1)=[]; x2(1)=[];
-	y1(1)=[]; y2(1)=[];
-	z1(1)=[]; z2(1)=[];
-
-	[ro1,co1]=find(edge_l==e1);
-
-	while ~isempty(ro1)
-
-		if co1==1,
-			xc=[x2(ro1);xc]; yc=[y2(ro1);yc];zc=[z2(ro1);zc];
-
-			%next edge:
-			e1=edge_l(ro1,2);
-
-		else
-			xc=[x1(ro1);xc]; yc=[y1(ro1);yc];zc=[z1(ro1);zc];
-
-			%next edge:
-			e1=edge_l(ro1,1);
-		end
-
-		%erase the lines of this
-		edge_l(ro1,:)=[];
-		x1(ro1)=[]; x2(ro1)=[];
-		y1(ro1)=[]; y2(ro1)=[];
-		z1(ro1)=[]; z2(ro1)=[];
-
-		%next connection
-		[ro1,co1]=find(edge_l==e1);
-	end
-
-	%same thing the other way (to the right)
-	[ro2,co2]=find(edge_l==e2);
-
-	while ~isempty(ro2)
-
-		if co2==1,
-			xc=[xc;x2(ro2)]; yc=[yc;y2(ro2)];zc=[zc;z2(ro2)];
-
-			%next edge:
-			e2=edge_l(ro2,2);
-		else
-			xc=[xc;x1(ro2)]; yc=[yc;y1(ro2)]; zc=[zc;z1(ro2)];
-
-			%next edge:
-			e2=edge_l(ro2,1);
-		end
-
-		%erase the lines of this
-		edge_l(ro2,:)=[];
-		x1(ro2)=[]; x2(ro2)=[];
-		y1(ro2)=[]; y2(ro2)=[];
-		z1(ro2)=[]; z2(ro2)=[];
-
-		%next connection
-		[ro2,co2]=find(edge_l==e2);
-	end
-
-	%save xc,yc contour: 
-	contours(end+1).x=xc;
-	contours(end).y=yc;
-	contours(end).z=zc;
-	contours(end).name='';
-	contours(end).nods=length(xc);
-	contours(end).density=1;
-	contours(end).closed=0;
-
-end
+	error('this function has been renamed: A = isoline(md,mask);');
Index: /issm/trunk/src/m/exp/expcontourlevelzero.m
===================================================================
--- /issm/trunk/src/m/exp/expcontourlevelzero.m	(revision 27034)
+++ /issm/trunk/src/m/exp/expcontourlevelzero.m	(revision 27035)
@@ -1,14 +1,3 @@
 function expcontourlevelzero(md,mask,level,filename)
-%EXPCONTOURLEVELZERO - write an Argus file from a structure recovered from running contourlevelzero 
-%
-%   Usage:
-%      expcontourlevelzero(md,mask,level,filename)
-% 
-%   Example:
-%      expcontourlevelzero(md,md.geometry.thickness,10, 'Level0.exp');
-%      expcontourlevelzero(md,md.mask.ocean_levelset,0, 'Level0.exp');
-%
-%   See also CONTOURLEVELZERO, EXPWRITE
 
-contours=contourlevelzero(md,mask,level);
-expwrite(contours,filename);
+error(['this function has been renamed: isoline(md,mask,''output'',''' filename ''');']);
Index: /issm/trunk/src/m/exp/exptool.m
===================================================================
--- /issm/trunk/src/m/exp/exptool.m	(revision 27034)
+++ /issm/trunk/src/m/exp/exptool.m	(revision 27035)
@@ -137,4 +137,5 @@
 %plot existing profile if any
 hold on
+disableDefaultInteractivity(gca); %disables the built-in interactions for the specified axes
 
 %Build backup structre for do and redo
Index: /issm/trunk/src/m/exp/expwrite.py
===================================================================
--- /issm/trunk/src/m/exp/expwrite.py	(revision 27034)
+++ /issm/trunk/src/m/exp/expwrite.py	(revision 27035)
@@ -7,5 +7,5 @@
     This routine writes an Argus file from a dict containing the fields:
     x and y of the coordinates of the points.
-    The first argument is the list containing the points coordinates and the 
+    The first argument is the list containing the points coordinates and the
     second one the file to be written.
 
@@ -20,26 +20,64 @@
 
     fid = open(filename, 'w')
-    for x, y in zip(contours['x'], contours['y']):
-        if len(x) != len(y):
-            raise RuntimeError('contours x and y coordinates must be of identical size')
-
-        if 'name' in contours:
-            fid.write('{}{}\n'.format('# Name:', contours['name']))
+    #if it is a list we need to loop on several contours
+    if isinstance(contours, list):
+        for contour in contours:
+            #if it is some kind of array it is a contour and we loop on indexes
+            if isinstance(contour['x'], (list, tuple, np.ndarray)):
+                writegeomlist(contour, fid, filename)
+            #else it is an index and we just write it down
+            else:
+                writegeom(contour, fid, filename)
+    #if it is a dict type it means just one contour
+    else:
+        #if it is some kind of array it is a contour and we loop on indexes
+        if isinstance(contours['x'], (list, tuple, np.ndarray)):
+            writegeomlist(contours, fid, filename)
+        #else it is an index and we just write it down
         else:
-            fid.write('{}{}\n'.format('# Name:', filename))
-
-        fid.write('{}\n'.format('## Icon:0'))
-        fid.write('{}\n'.format('# Points Count Value'))
-        if 'density' in contours:
-            if isinstance(contours['density'], int):
-                fid.write('{} {}\n'.format(np.size(x), contours['density']))
-            else:
-                fid.write('{} {}\n'.format(np.size(x), 1.))
-        else:
-            fid.write('{} {}\n'.format(np.size(x), 1.))
-        fid.write('{}\n'.format('# X pos Y pos'))
-        for xi, yi in zip(x, y):
-            fid.write('%10.10f %10.10f\n' % (xi, yi))
-        fid.write('\n')
+            writegeom(contours, fid, filename)
 
     fid.close()
+
+
+def writegeomlist(contour, fid, filename):
+    if len(contour['x']) != len(contour['y']):
+        raise RuntimeError('contours x and y coordinates must be of identical size')
+    if 'name' in contour:
+        fid.write('{}{}\n'.format('## Name:', contour['name']))
+    else:
+        fid.write('{}{}\n'.format('## Name:', filename))
+
+    fid.write('{}\n'.format('## Icon:0'))
+    fid.write('{}\n'.format('# Points Count Value'))
+    if 'density' in contour:
+        if isinstance(contour['density'], int):
+            fid.write('{} {}\n'.format(np.size(contour['x']), contour['density']))
+        else:
+            fid.write('{} {}\n'.format(np.size(contour['x']), 1.))
+    else:
+        fid.write('{} {}\n'.format(np.size(contour['x']), 1.))
+    fid.write('{}\n'.format('# X pos Y pos'))
+    for x, y in zip(contour['x'], contour['y']):
+        fid.write('%10.10f %10.10f\n' % (x, y))
+    fid.write('\n')
+
+
+def writegeom(contour, fid, filename):
+    if 'name' in contour:
+        fid.write('{}{}\n'.format('## Name:', contour['name']))
+    else:
+        fid.write('{}{}\n'.format('## Name:', filename))
+
+    fid.write('{}\n'.format('## Icon:0'))
+    fid.write('{}\n'.format('# Points Count Value'))
+    if 'density' in contour:
+        if isinstance(contour['density'], int):
+            fid.write('{} {}\n'.format(1, contour['density']))
+        else:
+            fid.write('{} {}\n'.format(1, 1.))
+    else:
+        fid.write('{} {}\n'.format(1, 1.))
+    fid.write('{}\n'.format('# X pos Y pos'))
+    fid.write('%10.10f %10.10f\n' % (contour['x'], contour['y']))
+    fid.write('\n')
Index: /issm/trunk/src/m/exp/isoline.m
===================================================================
--- /issm/trunk/src/m/exp/isoline.m	(revision 27035)
+++ /issm/trunk/src/m/exp/isoline.m	(revision 27035)
@@ -0,0 +1,262 @@
+function contours=isoline(md,field,varargin)
+%ISOLINE - construct isovalue lines based on field provided
+%
+%   Usage:
+%      contours=isoline(md,field,varargin)
+%
+%   Supported options:
+%      'value': isoline value, default is 0
+%      'output': 'struct' exp structure with individual contours (default)
+%                'matrix' contours are concatenated and separated by NaNs
+%                'filename.exp' saved as exp file
+%
+%   Example:
+%      contours=isoline(md, md.results.TransientSolution(end).MaskOceanLevelset,'value',0);
+%      contours=isoline(md, md.results.TransientSolution(end).MaskOceanLevelset,'output','vector');
+%      contours=isoline(md, md.results.TransientSolution(end).MaskIceLevelset,'output','Icefront.exp');
+
+%Process options
+options = pairoptions(varargin{:});
+
+%process data 
+if dimension(md.mesh)==3,
+	% error('contourlevelzero error message: routine not supported for 3d meshes, project on a layer');
+	x = md.mesh.x2d;
+	y = md.mesh.y2d;
+	index=md.mesh.elements2d;
+else
+	x=md.mesh.x;
+	y=md.mesh.y;
+	index=md.mesh.elements;
+end
+
+%Deal with z coordinate
+if isprop(md.mesh,'z'),
+	z=md.mesh.z;
+else
+	z=zeros(md.mesh.numberofvertices,1);
+end
+
+if isempty(field), error('field provided is empty'); end
+if dimension(md.mesh)==3,
+	if length(field)~=md.mesh.numberofvertices2d
+		error('field provided should be of size md.mesh.numberofvertices2d'); 
+	end
+else
+	if length(field)~=md.mesh.numberofvertices
+		error('field provided should be of size md.mesh.numberofvertices'); 
+	end
+end
+
+%What is the value we are trying to track
+level = getfieldvalue(options,'value',0.);
+
+%initialization of some variables
+numberofelements=size(index,1);
+elementslist=1:numberofelements;
+c=[];
+h=[];
+
+%get unique edges in mesh
+%1: list of edges
+edges=[index(:,[1,2]); index(:,[2,3]); index(:,[3,1])];
+%2: find unique edges
+[edges,I,J]=unique(sort(edges,2),'rows');
+%3: unique edge numbers
+vec=J;
+%4: unique edges numbers in each triangle (2 triangles sharing the same edge will have
+%   the same edge number)
+edges_tria=[vec(elementslist), vec(elementslist+numberofelements), vec(elementslist+2*numberofelements)];
+
+%segments [nodes1 nodes2]
+Seg1=index(:,[1 2]);
+Seg2=index(:,[2 3]);
+Seg3=index(:,[3 1]);
+
+%segment numbers [1;4;6;...]
+Seg1_num=edges_tria(:,1);
+Seg2_num=edges_tria(:,2);
+Seg3_num=edges_tria(:,3);
+
+%value of data on each tips of the segments
+Data1=field(Seg1);
+Data2=field(Seg2);
+Data3=field(Seg3);
+
+%get the ranges for each segment
+Range1=sort(Data1,2);
+Range2=sort(Data2,2);
+Range3=sort(Data3,2);
+
+%find the segments that contain this value
+pos1=(Range1(:,1)<level & Range1(:,2)>=level);
+pos2=(Range2(:,1)<level & Range2(:,2)>=level);
+pos3=(Range3(:,1)<level & Range3(:,2)>=level);
+
+%get elements
+poselem12=(pos1 & pos2);
+poselem13=(pos1 & pos3);
+poselem23=(pos2 & pos3);
+poselem=find(poselem12 | poselem13 | poselem23);
+numelems=length(poselem);
+
+%if no element has been flagged, skip to the next level
+if numelems==0,
+	warning('isoline warning message: no elements found with corresponding value');
+	contours=struct([]);
+	return;
+end
+
+%go through the elements and build the coordinates for each segment (1 by element)
+x1=zeros(numelems,1);
+x2=zeros(numelems,1);
+y1=zeros(numelems,1);
+y2=zeros(numelems,1);
+z1=zeros(numelems,1);
+z2=zeros(numelems,1);
+
+edge_l=zeros(numelems,2);
+
+for j=1:numelems,
+
+	weight1=(level-Data1(poselem(j),1))/(Data1(poselem(j),2)-Data1(poselem(j),1));
+	weight2=(level-Data2(poselem(j),1))/(Data2(poselem(j),2)-Data2(poselem(j),1));
+	weight3=(level-Data3(poselem(j),1))/(Data3(poselem(j),2)-Data3(poselem(j),1));
+
+	if poselem12(poselem(j));
+
+		x1(j)=x(Seg1(poselem(j),1))+weight1*(x(Seg1(poselem(j),2))-x(Seg1(poselem(j),1)));
+		x2(j)=x(Seg2(poselem(j),1))+weight2*(x(Seg2(poselem(j),2))-x(Seg2(poselem(j),1)));
+		y1(j)=y(Seg1(poselem(j),1))+weight1*(y(Seg1(poselem(j),2))-y(Seg1(poselem(j),1)));
+		y2(j)=y(Seg2(poselem(j),1))+weight2*(y(Seg2(poselem(j),2))-y(Seg2(poselem(j),1)));
+		z1(j)=z(Seg1(poselem(j),1))+weight1*(z(Seg1(poselem(j),2))-z(Seg1(poselem(j),1)));
+		z2(j)=z(Seg2(poselem(j),1))+weight2*(z(Seg2(poselem(j),2))-z(Seg2(poselem(j),1)));
+
+		edge_l(j,1)=Seg1_num(poselem(j));
+		edge_l(j,2)=Seg2_num(poselem(j));
+
+	elseif poselem13(poselem(j)),
+
+		x1(j)=x(Seg1(poselem(j),1))+weight1*(x(Seg1(poselem(j),2))-x(Seg1(poselem(j),1)));
+		x2(j)=x(Seg3(poselem(j),1))+weight3*(x(Seg3(poselem(j),2))-x(Seg3(poselem(j),1)));
+		y1(j)=y(Seg1(poselem(j),1))+weight1*(y(Seg1(poselem(j),2))-y(Seg1(poselem(j),1)));
+		y2(j)=y(Seg3(poselem(j),1))+weight3*(y(Seg3(poselem(j),2))-y(Seg3(poselem(j),1)));
+		z1(j)=z(Seg1(poselem(j),1))+weight1*(z(Seg1(poselem(j),2))-z(Seg1(poselem(j),1)));
+		z2(j)=z(Seg3(poselem(j),1))+weight3*(z(Seg3(poselem(j),2))-z(Seg3(poselem(j),1)));
+
+		edge_l(j,1)=Seg1_num(poselem(j));
+		edge_l(j,2)=Seg3_num(poselem(j));
+
+	elseif poselem23(poselem(j)),
+
+		x1(j)=x(Seg2(poselem(j),1))+weight2*(x(Seg2(poselem(j),2))-x(Seg2(poselem(j),1)));
+		x2(j)=x(Seg3(poselem(j),1))+weight3*(x(Seg3(poselem(j),2))-x(Seg3(poselem(j),1)));
+		y1(j)=y(Seg2(poselem(j),1))+weight2*(y(Seg2(poselem(j),2))-y(Seg2(poselem(j),1)));
+		y2(j)=y(Seg3(poselem(j),1))+weight3*(y(Seg3(poselem(j),2))-y(Seg3(poselem(j),1)));
+		z1(j)=z(Seg2(poselem(j),1))+weight2*(z(Seg2(poselem(j),2))-z(Seg2(poselem(j),1)));
+		z2(j)=z(Seg3(poselem(j),1))+weight3*(z(Seg3(poselem(j),2))-z(Seg3(poselem(j),1)));
+
+		edge_l(j,1)=Seg2_num(poselem(j));
+		edge_l(j,2)=Seg3_num(poselem(j));
+	else
+		%it shoud not go here
+	end
+end
+
+%now that we have the segments, we must try to connect them...
+
+%loop over the subcontours
+contours=struct([]);
+
+while ~isempty(edge_l),
+
+	%take the right edge of the second segment and connect it to the next segments if any
+	e1=edge_l(1,1);   e2=edge_l(1,2);
+	xc=[x1(1);x2(1)]; yc=[y1(1);y2(1)]; zc=[z1(1);z2(1)];
+
+
+	%erase the lines corresponding to this edge
+	edge_l(1,:)=[];
+	x1(1)=[]; x2(1)=[];
+	y1(1)=[]; y2(1)=[];
+	z1(1)=[]; z2(1)=[];
+
+	[ro1,co1]=find(edge_l==e1);
+
+	while ~isempty(ro1)
+
+		if co1==1,
+			xc=[x2(ro1);xc]; yc=[y2(ro1);yc];zc=[z2(ro1);zc];
+
+			%next edge:
+			e1=edge_l(ro1,2);
+
+		else
+			xc=[x1(ro1);xc]; yc=[y1(ro1);yc];zc=[z1(ro1);zc];
+
+			%next edge:
+			e1=edge_l(ro1,1);
+		end
+
+		%erase the lines of this
+		edge_l(ro1,:)=[];
+		x1(ro1)=[]; x2(ro1)=[];
+		y1(ro1)=[]; y2(ro1)=[];
+		z1(ro1)=[]; z2(ro1)=[];
+
+		%next connection
+		[ro1,co1]=find(edge_l==e1);
+	end
+
+	%same thing the other way (to the right)
+	[ro2,co2]=find(edge_l==e2);
+
+	while ~isempty(ro2)
+
+		if co2==1,
+			xc=[xc;x2(ro2)]; yc=[yc;y2(ro2)];zc=[zc;z2(ro2)];
+
+			%next edge:
+			e2=edge_l(ro2,2);
+		else
+			xc=[xc;x1(ro2)]; yc=[yc;y1(ro2)]; zc=[zc;z1(ro2)];
+
+			%next edge:
+			e2=edge_l(ro2,1);
+		end
+
+		%erase the lines of this
+		edge_l(ro2,:)=[];
+		x1(ro2)=[]; x2(ro2)=[];
+		y1(ro2)=[]; y2(ro2)=[];
+		z1(ro2)=[]; z2(ro2)=[];
+
+		%next connection
+		[ro2,co2]=find(edge_l==e2);
+	end
+
+	%save xc,yc contour: 
+	contours(end+1).x=xc;
+	contours(end).y=yc;
+	contours(end).z=zc;
+	contours(end).name='';
+	contours(end).nods=length(xc);
+	contours(end).density=1;
+	contours(end).closed=0;
+end
+
+%process output
+outputformat = getfieldvalue(options,'output','struct');
+if strcmp(outputformat,'matrix')
+	x = cell2mat(cellfun(@(x) [x;NaN],{contours(:).x},'UniformOutput',0)');
+	y = cell2mat(cellfun(@(x) [x;NaN],{contours(:).y},'UniformOutput',0)');
+
+	contours = [x y];
+elseif strcmp(outputformat(end-3:end),'.exp')
+	disp(['Saving output as ' outputformat]);
+	expwrite(contours,outputformat);
+elseif strcmp(outputformat,'struct')
+	%nothing to do, this is the default
+else
+	disp('output format not supported, returning struct');
+end
Index: /issm/trunk/src/m/exp/operation/exp_ginput.m
===================================================================
--- /issm/trunk/src/m/exp/operation/exp_ginput.m	(revision 27034)
+++ /issm/trunk/src/m/exp/operation/exp_ginput.m	(revision 27035)
@@ -5,6 +5,5 @@
 %      [xi yi] = exp_ginput(numclicks,options);
 
-
-ginputtype = getfieldvalue(options,'ginputtype','default');
+%ginputtype = getfieldvalue(options,'ginputtype','default');
 ginputtype = getfieldvalue(options,'ginputtype','myginput');
 
@@ -17,4 +16,2 @@
 		error('not supported yet');
 end
-
-
Index: /issm/trunk/src/m/geometry/VolumeAboveFloatation.m
===================================================================
--- /issm/trunk/src/m/geometry/VolumeAboveFloatation.m	(revision 27034)
+++ /issm/trunk/src/m/geometry/VolumeAboveFloatation.m	(revision 27035)
@@ -1,7 +1,9 @@
-function V = VolumeAboveFloatation(md)
+function V = VolumeAboveFloatation(md,step,flags)
 %VOLUMEABOVEFLOATATION - returns volume above floatation
 %
 %   Usage:
-%      V = VolumeAboveFloatation(md)
+%      V = VolumeAboveFloatation(md)          % uses model fiels alone
+%      V = VolumeAboveFloatation(md,10)       % Will look at step 10 of transient solution
+%      V = VolumeAboveFloatation(md,10,flags) % Will look at step 10 of transient solution, only flaged elements
 
 %Special case if 3d
@@ -17,4 +19,5 @@
 	error('not supported yet');
 end
+
 %1. get some parameters
 rho_ice   = md.materials.rho_ice;
@@ -22,7 +25,25 @@
 
 %2. compute averages
-base        = mean(md.geometry.base(index),2);
-surface     = mean(md.geometry.surface(index),2);
-bathymetry  = mean(md.geometry.bed(index),2);
+if nargin==1
+	base           = mean(md.geometry.base(index),2);
+	surface        = mean(md.geometry.surface(index),2);
+	bathymetry     = mean(md.geometry.bed(index),2);
+	ice_levelset   = md.mask.ice_levelset;
+	ocean_levelset = md.mask.ocean_levelset;
+else
+	if isprop(md.results.TransientSolution(step),'MaskIceLevelset')
+		ice_levelset   = md.results.TransientSolution(step).MaskIceLevelset;
+	else
+		ice_levelset   = md.mask.ice_levelset;
+	end
+   ocean_levelset = md.results.TransientSolution(step).MaskOceanLevelset;
+   base           = mean(md.results.TransientSolution(step).Base(index),2);
+   surface        = mean(md.results.TransientSolution(step).Surface(index),2);
+	if isprop(md.results.TransientSolution(step),'Bed')
+		bathymetry  = mean(md.results.TransientSolution(step).Bed(index),2);
+	else
+		 bathymetry  = mean(md.geometry.bed(index),2);
+	 end
+end
 
 %3. get areas of all triangles
@@ -33,6 +54,11 @@
 
 %5. take out the ones that are outside of levelset or floating
-pos = find(min(md.mask.ice_levelset(index),[],2)>0 | min(md.mask.ocean_levelset(index),[],2)<0);
+pos = find(min(ice_levelset(index),[],2)>0 | min(ocean_levelset(index),[],2)<0);
 V(pos) = 0;
+
+%In case we are only looking at one portion of the domain...
+if nargin==3
+	V(find(~flags)) = 0;
+end
 
 %sum individual contributions
Index: /issm/trunk/src/m/inversions/marshallcostfunctions.py
===================================================================
--- /issm/trunk/src/m/inversions/marshallcostfunctions.py	(revision 27034)
+++ /issm/trunk/src/m/inversions/marshallcostfunctions.py	(revision 27035)
@@ -14,5 +14,8 @@
               505: 'ThicknessAcrossGradient'}
 
-    data = [cfDict[cf] for cf in cost_functions]
+    if type(cost_functions) == int:
+        data = [cfDict[cost_functions]]
+    else:
+        data = [cfDict[cf] for cf in cost_functions]
     #  #copy list first
     # data = copy.deepcopy(cost_functions)
Index: /issm/trunk/src/m/io/loadmodel.py
===================================================================
--- /issm/trunk/src/m/io/loadmodel.py	(revision 27034)
+++ /issm/trunk/src/m/io/loadmodel.py	(revision 27035)
@@ -9,5 +9,5 @@
 
 
-def loadmodel(path, onlylast=False):
+def loadmodel(path, singletime=None, singleres=None):
     """LOADMODEL - load a model
 
@@ -31,5 +31,5 @@
     #       try:
     #recover model on file and name it md
-    struc = loadvars(path, onlylast=onlylast)
+    struc = loadvars(path, singletime=singletime, singleres=singleres)
     name = [key for key in list(struc.keys())]
     if len(name) > 1:
Index: /issm/trunk/src/m/io/loadvars.py
===================================================================
--- /issm/trunk/src/m/io/loadvars.py	(revision 27034)
+++ /issm/trunk/src/m/io/loadvars.py	(revision 27035)
@@ -7,6 +7,8 @@
 from re import findall, split
 import shelve
-from netCDF4 import Dataset
+from netCDF4 import Dataset, chartostring
 import numpy as np
+import numpy.ma as ma
+from importlib import import_module
 from model import *
 
@@ -30,5 +32,5 @@
     filename = ''
     nvdict = {}
-    debug = False  #print messages if true
+    verbose = 0  # 0 for silent 5 for chatty
 
     if len(args) >= 1 and isinstance(args[0], str):
@@ -52,9 +54,11 @@
         raise TypeError("Unrecognized input arguments.")
 
-    onlylast = False
+    timeindex = False
 
     for key, value in kwargs.items():
-        if key == 'onlylast':
-            onlylast = value
+        if key == 'singletime':
+            timeindex = value
+        if key == 'singleres':
+            resname = value
 
     if whichdb(filename):   #We used python pickle for the save
@@ -87,5 +91,5 @@
         for mod in dict.keys(classtype):
             #==== First we create the model structure  {{{
-            if debug:
+            if verbose > 0:
                 print(' ==== Now treating classtype {}'.format(mod))
             if mod not in classtree.keys():
@@ -94,5 +98,5 @@
                 # this points to a subclass (results.TransientSolution for example)
                 curclass = NCFile.groups[classtree[mod][0]].groups[classtree[mod][1]]
-                if debug:
+                if verbose > 0:
                     print("    ==> {} is of class {}".format(mod, classtype[mod]))
                 if classtype[mod][0] == 'results.solutionstep':  #Treating results {{{
@@ -100,5 +104,6 @@
                     #that is the current treatment
                     #here we have a more NC approach with time being a dimension
-                    listtype = split(r'\.', classtype[mod][0])[0]
+                    listtype = split(r'\.', classtype[mod][0])[1]
+                    print(listtype)
                     if len(NCFile.dimensions['Time']) == 1:
                         nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]] = getattr(classtype[mod][1], listtype)()
@@ -106,5 +111,5 @@
                     else:
                         #Time dimension is in all the variables so we take that as stepnumber for the results
-                        if onlylast:   #we load only the last result to save on time and memory
+                        if timeindex:   #we load only the last result to save on time and memory
                             nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]] = [getattr(classtype[mod][1], listtype)()]
                             Tree = nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]]
@@ -126,10 +131,8 @@
                         Tree = nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]]
                     else:
-                        if onlylast:   #we load only the last result to save on time and memory
+                        if timeindex:   #we load only the last result to save on time and memory
                             nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]] = [getattr(classtype[mod][1], listtype)()]
                             Tree = nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]]
                         else:
-                            #nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]] = [getattr(classtype[mod][1], listtype)() for i in range(max(1, len(NCFile.dimensions['Time'])))]
-                            #Tree = nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]][:]
                             setattr(nvdict['md'].__dict__[classtree[mod][0]], classtree[mod][1], getattr(classtype[mod][1], 'solution')([]))
                             for i in range(max(1, stepnum)):
@@ -137,16 +140,18 @@
                             Tree = nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]][:]
                     #}}}
-                elif classtype[mod][0] == 'massfluxatgate':  #this is for output definitions {{{
+                #elif classtype[mod][0] == 'massfluxatgate.massfluxatgate':  #this is for output definitions {{{
+                elif mod.startswith('outputdefinition'):  #this is for output definitions {{{
                     defname = split('Output|[0-9]+', classtree[mod][1])[1] + 's'
                     defindex = int(findall('[0-9]+', classtree[mod][1])[0])
-                    nvdict['md'].__dict__[classtree[mod][0]].__dict__[defname].append(getattr(classtype[mod][1], classtype[mod][0])())
+                    outdeftype = split(r'\.', classtype[mod][0])[0]
+                    nvdict['md'].__dict__[classtree[mod][0]].__dict__[defname].append(getattr(classtype[mod][1], outdeftype)())
                     Tree = nvdict['md'].__dict__[classtree[mod][0]].__dict__[defname][defindex - 1]
                 #}}}
                 else:
-                    if debug:
+                    if verbose > 0:
                         print("    Using the default for md.{}.{}, is that right??".format(classtree[mod][0], classtree[mod][1]))
                     try:
                         modulename = split(r'\.', classtype[mod][0])[0]
-                        if debug:
+                        if verbose > 0:
                             print("    trying to import {} from {}".format(classtype[mod][0], modulename))
                         nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]] = getattr(classtype[mod][1], modulename)()
@@ -154,4 +159,9 @@
                         print("WARNING: md.{}.{} is not initialized, hopefully that was done in the main group:".format(classtree[mod][0], classtree[mod][1]))
                     Tree = nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]]
+            elif classtype[mod][0] == 'SMBgemb.SMBgemb':
+                curclass = NCFile.groups[classtree[mod][0]]
+                modulename = split(r'\.', classtype[mod][0])[0]
+                nvdict['md'].__dict__[mod] = getattr(classtype[mod][1], modulename)(nvdict['md'].__dict__['mesh'], nvdict['md'].__dict__['geometry'])
+                Tree = nvdict['md'].__dict__[classtree[mod][0]]
             else:
                 curclass = NCFile.groups[classtree[mod][0]]
@@ -159,5 +169,5 @@
                 nvdict['md'].__dict__[mod] = getattr(classtype[mod][1], modulename)()
                 Tree = nvdict['md'].__dict__[classtree[mod][0]]
-            if debug:
+            if verbose > 0:
                 print("    for {} Tree is a {} with len {}".format(mod, Tree.__class__.__name__, len(curclass.groups)))
             # }}}
@@ -165,6 +175,9 @@
             #for i in range(0, max(1, len(curclass.groups))):
             if len(curclass.groups) > 0:  #that is presumably only for old style NC where each result step had its own group
-                if onlylast:
-                    groupclass = [curclass.groups[keylist[len(curclass.groups) - 1]]]
+                if timeindex:
+                    if timeindex < 0:
+                        groupclass = [curclass.groups[keylist[len(curclass.groups) - timeindex]]]
+                    else:
+                        groupclass = [curclass.groups[keylist[timeindex]]]
                 else:
                     groupclass = [curclass.groups[key] for key in keylist]
@@ -174,117 +187,147 @@
             for groupindex, listclass in enumerate(groupclass):
                 for var in listclass.variables:
-                    if var not in ['errlog', 'outlog']:
-                        varval = listclass.variables[str(var)]
-                        vardim = varval.ndim
-                        if debug:
-                            print("    ==> treating var {} of dimension {}".format(var, vardim))
-                        #There is a special treatment for results to account for its specific structure
-                        #that is the new export version where time is a named dimension
-                        NewFormat = 'Time' in NCFile.dimensions
-                        if type(Tree) == list:  # and NewFormat:
-                            if onlylast:
-                                if NewFormat:
-                                    if vardim == 1:
-                                        Tree[0].__dict__[str(var)] = varval[-1].data
-                                    elif vardim == 2:
-                                        Tree[0].__dict__[str(var)] = varval[-1, :].data
-                                    elif vardim == 3:
-                                        Tree[0].__dict__[str(var)] = varval[-1, :, :].data
+                    if not resname or var == resname:
+                        if var not in ['errlog', 'outlog']:
+                            varval = listclass.variables[str(var)]
+                            vardim = varval.ndim
+                            if verbose > 0:
+                                print("    ==> treating var {} of dimension {}".format(var, vardim))
+                            #There is a special treatment for results to account for its specific structure
+                            #that is the new export version where time is a named dimension
+                            NewFormat = 'Time' in NCFile.dimensions
+                            if type(Tree) == list:  # and NewFormat:
+                                if timeindex:
+                                    if NewFormat:
+                                        if vardim == 0:
+                                            try:
+                                                Tree[0].__dict__[str(var)] = varval[timeindex].data
+                                            except IndexError:
+                                                print('WARNING: No data on index {} for {} reverting to last time.'.format(timeindex, str(var)))
+                                                Tree[0].__dict__[str(var)] = varval[-1].data
+                                        elif vardim == 1:
+                                            try:
+                                                Tree[0].__dict__[str(var)] = varval[timeindex].data
+                                            except IndexError:
+                                                print('WARNING: No data on index {} for {} reverting to last time.'.format(timeindex, str(var)))
+                                                Tree[0].__dict__[str(var)] = varval[-1].data
+                                        elif vardim == 2:
+                                            Tree[0].__dict__[str(var)] = varval[timeindex, :].data
+                                        elif vardim == 3:
+                                            Tree[0].__dict__[str(var)] = varval[timeindex, :, :].data
+                                        else:
+                                            print('table dimension greater than 3 not implemented yet')
+                                    else:  #old format had step sorted in difeerent group so last group is last time
+                                        Tree[0].__dict__[str(var)] = varval[:].data
+                                else:
+                                    if NewFormat:
+                                        incomplete = 'Time' not in varval.dimensions
+                                        if incomplete:
+                                            try:
+                                                chosendim = varval.dimensions[0]
+                                                timelist = np.arange(0, len(NCFile.dimensions[chosendim]))
+                                                print('WARNING, {} is not present on every times, we chose {}({}) as the dimension to write it with'.format(var, chosendim, len(NCFile.dimensions[chosendim])))
+                                            except IndexError:
+                                                #just one step, so no dimension, we just put it on the first solutionstep
+                                                timelist = [0]
+                                        else:
+                                            timelist = np.arange(0, len(NCFile.dimensions['Time']))
+                                        for t in timelist:
+                                            if verbose > 5:
+                                                print("filing step {} for {}".format(t, var))
+                                            if vardim == 0:
+                                                Tree[t].__dict__[str(var)] = varval[:].data
+                                            elif vardim == 1:
+                                                stepval = ma.masked_array(varval[t].data, mask=np.where(np.isnan(varval[t]), 1, 0))
+                                                Tree[t].__dict__[str(var)] = ma.compressed(stepval)
+                                            elif vardim == 2:
+                                                stepval = ma.masked_array(varval[t, :].data, mask=np.where(np.isnan(varval[t, :]), 1, 0))
+                                                Tree[t].__dict__[str(var)] = ma.compressed(stepval)
+                                            elif vardim == 3:
+                                                stepval = ma.masked_array(varval[t, :, :].data, mask=np.where(np.isnan(varval[t, :, :]), 1, 0))
+                                                Tree[t].__dict__[str(var)] = ma.compressed(stepval).reshape((stepval.count(0)[0], stepval.count(1)[0]))
+                                            else:
+                                                print('table dimension greater than 3 not implemented yet')
                                     else:
-                                        print('table dimension greater than 3 not implemented yet')
-                                else:  #old format had step sorted in difeerent group so last group is last time
-                                    Tree[0].__dict__[str(var)] = varval[:].data
+                                        if verbose > 0:
+                                            print("filing step {} for {}".format(groupindex, var))
+                                        Tree[groupindex].__dict__[str(var)] = varval[:].data
                             else:
-                                if NewFormat:
-                                    incomplete = 'Time' not in varval.dimensions and NewFormat
-                                    if incomplete:
-                                        chosendim = varval.dimensions[0]
-                                        timelist = np.arange(0, len(NCFile.dimensions[chosendim]))
-                                        print('WARNING, {} is not present on every times, we chose {}({}) as the dimension to write it with'.format(var, chosendim, len(NCFile.dimensions[chosendim])))
+                                if vardim == 0:  #that is a scalar
+                                    if str(varval[0]) in ['', '--', 'emptycell']:  #no value
+                                        Tree.__dict__[str(var)] = []
+                                    elif varval[0] == 'True':  #treatin bool
+                                        Tree.__dict__[str(var)] = True
+                                    elif varval[0] == 'False':  #treatin bool
+                                        Tree.__dict__[str(var)] = False
                                     else:
-                                        timelist = np.arange(0, len(NCFile.dimensions['Time']))
-                                    for t in timelist:
-                                        if debug:
-                                            print("filing step {} for {}".format(t, var))
-                                        if vardim == 0:
-                                            Tree[t].__dict__[str(var)] = varval[:].data
-                                        elif vardim == 1:
-                                            Tree[t].__dict__[str(var)] = varval[t].data
-                                        elif vardim == 2:
-                                            Tree[t].__dict__[str(var)] = varval[t, :].data
-                                        elif vardim == 3:
-                                            Tree[t].__dict__[str(var)] = varval[t, :, :].data
-                                        else:
-                                            print('table dimension greater than 3 not implemented yet')
+                                        Tree.__dict__[str(var)] = varval[0].item()
+
+                                elif vardim == 1:  #that is a vector
+                                    if verbose > 0:
+                                        print("   for variable {} type is {}".format(str(var), varval.dtype))
+                                    if varval.dtype == str:
+                                        if varval.shape[0] == 1:
+                                            Tree.__dict__[str(var)] = [str(varval[0]), ]
+                                        elif 'True' in varval[:] or 'False' in varval[:]:
+                                            Tree.__dict__[str(var)] = np.asarray([V == 'True' for V in varval[:]], dtype=bool)
+                                        else:
+                                            Tree.__dict__[str(var)] = [str(vallue) for vallue in varval[:]]
+                                    elif varval.dtype == "|S1":  #that is for matlab chararcter arrays
+                                        stringlist = chartostring(varval[:])
+                                        Tree.__dict__[str(var)] = [stringlist.tolist(), ]
+                                    else:
+                                        try:
+                                            #some thing specifically require a list
+                                            mdtype = type(Tree.__dict__[str(var)])
+                                        except KeyError:
+                                            mdtype = float
+                                        if mdtype == list:
+                                            Tree.__dict__[str(var)] = [mdval for mdval in varval[:]]
+                                        else:
+                                            Tree.__dict__[str(var)] = varval[:].data
+
+                                elif vardim == 2:
+                                    #dealling with dict
+                                    if verbose > 0:
+                                        print("   for variable {} type is {}".format(str(var), varval.dtype))
+                                    if varval.dtype == str:  #that is for dictionaries
+                                        if any(varval[:, 0] == 'toolkit'):  #toolkit definition have to be first
+                                            Tree.__dict__[str(var)] = OrderedDict([('toolkit', str(varval[np.where(varval[:, 0] == 'toolkit')[0][0], 1]))])
+                                            strings1 = [str(arg[0]) for arg in varval if arg[0] != 'toolkits']
+                                            strings2 = [str(arg[1]) for arg in varval if arg[0] != 'toolkits']
+                                            Tree.__dict__[str(var)].update(list(zip(strings1, strings2)))
+                                        else:
+                                            strings1 = [str(arg[0]) for arg in varval]
+                                            strings2 = [str(arg[1]) for arg in varval]
+                                            Tree.__dict__[str(var)] = OrderedDict(list(zip(strings1, strings2)))
+                                    elif varval.dtype == "|S1":  #that is for matlab chararcter arrays
+                                        stringlist = chartostring(varval[:, :])
+                                        stringlist = [string.strip() for string in stringlist]
+                                        Tree.__dict__[str(var)] = stringlist
+                                    else:
+                                        if type(Tree) == list:
+                                            t = indexlist[i]
+                                            if listtype == 'dict':
+                                                Tree[t][str(var)] = varval[:, :].data
+                                            else:
+                                                Tree[t].__dict__[str(var)] = varval[:, :].data
+                                        else:
+                                            Tree.__dict__[str(var)] = varval[:, :].data
+                                elif vardim == 3:
+                                    Tree.__dict__[str(var)] = varval[:, :, :].data
                                 else:
-                                    if debug:
-                                        print("filing step {} for {}".format(groupindex, var))
-                                    Tree[groupindex].__dict__[str(var)] = varval[:].data
-                        else:
-                            if vardim == 0:  #that is a scalar
-                                if str(varval[0]) == '':  #no value
-                                    Tree.__dict__[str(var)] = []
-                                elif varval[0] == 'True':  #treatin bool
-                                    Tree.__dict__[str(var)] = True
-                                elif varval[0] == 'False':  #treatin bool
-                                    Tree.__dict__[str(var)] = False
-                                else:
-                                    Tree.__dict__[str(var)] = varval[0].item()
-
-                            elif vardim == 1:  #that is a vector
-                                if varval.dtype == str:
-                                    if varval.shape[0] == 1:
-                                        Tree.__dict__[str(var)] = [str(varval[0]), ]
-                                    elif 'True' in varval[:] or 'False' in varval[:]:
-                                        Tree.__dict__[str(var)] = np.asarray([V == 'True' for V in varval[:]], dtype=bool)
-                                    else:
-                                        Tree.__dict__[str(var)] = [str(vallue) for vallue in varval[:]]
-                                else:
-                                    try:
-                                        #some thing specifically require a list
-                                        mdtype = type(Tree.__dict__[str(var)])
-                                    except KeyError:
-                                        mdtype = float
-                                    if mdtype == list:
-                                        Tree.__dict__[str(var)] = [mdval for mdval in varval[:]]
-                                    else:
-                                        Tree.__dict__[str(var)] = varval[:].data
-
-                            elif vardim == 2:
-                                #dealling with dict
-                                if varval.dtype == str:  #that is for dictionaries
-                                    if any(varval[:, 0] == 'toolkit'):  #toolkit definition have to be first
-                                        Tree.__dict__[str(var)] = OrderedDict([('toolkit', str(varval[np.where(varval[:, 0] == 'toolkit')[0][0], 1]))])
-                                        strings1 = [str(arg[0]) for arg in varval if arg[0] != 'toolkits']
-                                        strings2 = [str(arg[1]) for arg in varval if arg[0] != 'toolkits']
-                                        Tree.__dict__[str(var)].update(list(zip(strings1, strings2)))
-                                    else:
-                                        strings1 = [str(arg[0]) for arg in varval]
-                                        strings2 = [str(arg[1]) for arg in varval]
-                                        Tree.__dict__[str(var)] = OrderedDict(list(zip(strings1, strings2)))
-                                else:
-                                    if type(Tree) == list:
-                                        t = indexlist[i]
-                                        if listtype == 'dict':
-                                            Tree[t][str(var)] = varval[:, :].data
-                                        else:
-                                            Tree[t].__dict__[str(var)] = varval[:, :].data
-                                    else:
-                                        Tree.__dict__[str(var)] = varval[:, :].data
-                            elif vardim == 3:
-                                Tree.__dict__[str(var)] = varval[:, :, :].data
-                            else:
-                                print('table dimension greater than 3 not implemented yet')
+                                    print('table dimension greater than 3 not implemented yet')
                 # }}}
                 #==== And with atribute {{{
                 for attr in listclass.ncattrs():
-                    if debug:
+                    if verbose > 0:
                         print("      ==> treating attribute {}".format(attr))
                     if attr != 'classtype':  #classtype is for treatment, don't get it back
-                        attribute = str(attr).swapcase()  #there is a reason for swapcase, no sure what it isanymore
-                        if attr == 'VARNAME':
+                        if attr == 'varname':
                             attribute = 'name'
+                        else:
+                            attribute = attr
                         if type(Tree) == list:
-                            if debug:
+                            if verbose > 0:
                                 print("        printing with index 0")
                             if listtype == 'dict':
@@ -293,9 +336,12 @@
                                 Tree[0].__dict__[attribute] = str(listclass.getncattr(attr))
                         else:
-                            Tree.__dict__[attribute] = str(listclass.getncattr(attr))
                             if listclass.getncattr(attr) == 'True':
                                 Tree.__dict__[attribute] = True
                             elif listclass.getncattr(attr) == 'False':
                                 Tree.__dict__[attribute] = False
+                            elif listclass.getncattr(attr) == 'emptycell':
+                                Tree.__dict__[attribute] = []
+                            else:
+                                Tree.__dict__[attribute] = str(listclass.getncattr(attr))
                 # }}}
             # }}}
@@ -328,10 +374,10 @@
                     try:
                         modulename = split(r'\.', class_dict[classe][0])[0]
-                        class_dict[classe].append(__import__(modulename))
+                        class_dict[classe].append(import_module(modulename))
                     except ModuleNotFoundError:
                         #submodule probably has a different name
                         modulename = str(getattr(NCData.groups[group].groups[subgroup], 'classtype'))
                         print("WARNING importing {} rather than {}".format(modulename, class_dict[classe][0]))
-                        class_dict[classe].append(__import__(modulename))
+                        class_dict[classe].append(import_module(modulename))
                 class_tree[classe] = [group, subgroup]
         else:
@@ -344,5 +390,5 @@
                         print("WARNING: module {} does not exist anymore and is skipped".format(modulename))
                     else:
-                        class_dict[classe].append(__import__(modulename))
+                        class_dict[classe].append(import_module(modulename))
                         class_tree[classe] = [group, ]
             except AttributeError:
Index: /issm/trunk/src/m/mesh/ExportGmsh.py
===================================================================
--- /issm/trunk/src/m/mesh/ExportGmsh.py	(revision 27035)
+++ /issm/trunk/src/m/mesh/ExportGmsh.py	(revision 27035)
@@ -0,0 +1,51 @@
+import numpy as np
+"""
+EXPORTGMSH - export mesh to gmsh format
+
+   Usage:
+      ExportGmsh(md,filename)
+"""
+
+
+def ExportGmsh(md, filename):
+
+    print('writing gmsh mesh file')
+    with open(filename, 'w+') as GmshFile:
+
+        #initialization
+        GmshFile.write('$MeshFormat \n')
+        GmshFile.write('2.2 0 8 \n')
+        GmshFile.write('$EndMeshFormat \n')
+        GmshFile.write('$Nodes \n')
+        GmshFile.write('{} \n'.format(md.mesh.numberofvertices))
+
+        #printing point positions
+        for j, eX in enumerate(md.mesh.x):
+            GmshFile.write('{:g} {:14.7e} {:14.7e} 0.0 \n'.format(j + 1, eX, md.mesh.y[j]))
+
+        GmshFile.write('$EndNodes \n')
+        GmshFile.write('$Elements \n')
+        GmshFile.write('{:d} \n'.format(md.mesh.numberofelements + np.shape(md.mesh.segments)[0]))
+
+        #printing elements caracteristics for boundaries
+        for ind, segment in enumerate(md.mesh.segments):
+            if md.mesh.x[segment[0]] == np.nanmax(md.mesh.x) and md.mesh.x[segment[1]] == np.nanmax(md.mesh.x):
+                bc_id = 1
+            elif md.mesh.y[segment[0]] == np.nanmax(md.mesh.y) and md.mesh.y[segment[1]] == np.nanmax(md.mesh.y):
+                bc_id = 2
+            elif md.mesh.x[segment[0]] == np.nanmin(md.mesh.x) and md.mesh.x[segment[1]] == np.nanmin(md.mesh.x):
+                bc_id = 3
+            elif md.mesh.y[segment[0]] == np.nanmin(md.mesh.y) and md.mesh.y[segment[1]] == np.nanmin(md.mesh.y):
+                bc_id = 4
+            else:
+                bc_id = 0
+
+            GmshFile.write('{:g} 1 2 {:g} 1 {:g} {:g} \n'.format(ind + 1, bc_id, segment[0], segment[1]))
+
+        #and for the body
+        body_id = 1
+        for elt, element in enumerate(md.mesh.elements):
+            GmshFile.write('{:g} 2 2 {:g} 3 {:g} {:g} {:g} \n'.format(elt + 1, body_id, element[0], element[1], element[2]))
+        GmshFile.write('$EndElements \n')
+        #close
+        GmshFile.close()
Index: /issm/trunk/src/m/mesh/meshconvert.m
===================================================================
--- /issm/trunk/src/m/mesh/meshconvert.m	(revision 27034)
+++ /issm/trunk/src/m/mesh/meshconvert.m	(revision 27035)
@@ -40,2 +40,4 @@
 md.mesh.numberofedges    = size(md.mesh.edges,1);
 md.mesh.vertexonboundary = zeros(md.mesh.numberofvertices,1); md.mesh.vertexonboundary(md.mesh.segments(:,1:2)) = 1;
+md.mesh.elementconnectivity=md.private.bamg.mesh.ElementConnectivity;
+md.mesh.elementconnectivity(find(isnan(md.mesh.elementconnectivity)))=0;
Index: /issm/trunk/src/m/mesh/roundmesh.m
===================================================================
--- /issm/trunk/src/m/mesh/roundmesh.m	(revision 27034)
+++ /issm/trunk/src/m/mesh/roundmesh.m	(revision 27035)
@@ -1,3 +1,3 @@
-function md=roundmesh(md,radius,resolution)
+function md=roundmesh(md,radius,resolution,varargin)
 %ROUNDMESH - create an unstructured round mesh 
 %
@@ -8,7 +8,12 @@
 %   Usage:
 %      md=roundmesh(md,radius,resolution)
+%      md=roundmesh(md,radius,resolution,'domain.exp')
 
 %First we have to create the domain outline 
-expname = [tempname() '.exp'];
+if nargin<4
+	expname = [tempname() '.exp'];
+else
+	expname = varargin{1};
+end
 
 %Get number of points on the circle
@@ -32,5 +37,7 @@
 
 %delete domain
-delete(expname);
+if nargin<4
+	delete(expname);
+end
 end
 
Index: /issm/trunk/src/m/mesh/roundmesh.py
===================================================================
--- /issm/trunk/src/m/mesh/roundmesh.py	(revision 27034)
+++ /issm/trunk/src/m/mesh/roundmesh.py	(revision 27035)
@@ -26,6 +26,6 @@
     y_list = roundsigfig(radius * np.sin(theta), 12)
     A = OrderedDict()
-    A['x'] = [x_list]
-    A['y'] = [y_list]
+    A['x'] = x_list
+    A['y'] = y_list
     A['density'] = 1.
     expwrite(A, 'RoundDomainOutline.exp')
Index: /issm/trunk/src/m/miscellaneous/MatlabFuncs.py
===================================================================
--- /issm/trunk/src/m/miscellaneous/MatlabFuncs.py	(revision 27034)
+++ /issm/trunk/src/m/miscellaneous/MatlabFuncs.py	(revision 27035)
@@ -2,6 +2,6 @@
 functions of the same, respective name.
 
-Where possible, users are encouraged to use native and/or the most efficient 
-methods in Python, but we provide these functions as a way to make translations 
+Where possible, users are encouraged to use native and/or the most efficient
+methods in Python, but we provide these functions as a way to make translations
 from the MATLAB to the Python ISSM API more seamless.
 """
@@ -82,5 +82,5 @@
 
 def cosdsingle(x):  # {{{
-    """function cosdsingle - Helper function for cosd to reduce repetition of 
+    """function cosdsingle - Helper function for cosd to reduce repetition of
     logic
 
@@ -162,5 +162,5 @@
     NOTE:
     - Only the following functionality is currently implemented:
-        - C = intersect(A,B) returns the data common to both A and B, with no 
+        - C = intersect(A,B) returns the data common to both A and B, with no
         repetitions. C is in sorted order.
 
@@ -175,5 +175,5 @@
 
     NOTE:
-    - Takes a type as its second argument (in contrast to the MATLAB function 
+    - Takes a type as its second argument (in contrast to the MATLAB function
     that it replicates, which takes a string representing the name of a type)
     """
@@ -204,5 +204,4 @@
 def ismember(a, s):  # {{{
     import numpy as np
-
     if not isinstance(s, (tuple, list, dict, np.ndarray)):
         s = [s]
@@ -215,10 +214,9 @@
     else:
         if not isinstance(s, np.ndarray):
-            b = np.empty_like(a)
+            b = np.empty_like(a).flat
             for i, item in enumerate(a.flat):
-                b.flat[i] = item in s
+                b[i] = item in s
         else:
             b = np.in1d(a.flat, s.flat).reshape(a.shape)
-
     return b
 # }}}
@@ -272,6 +270,7 @@
 def oshostname():  # {{{
     import socket
-
-    return socket.gethostname()
+    hostname = socket.gethostname()
+
+    return hostname.lower()
 # }}}
 
@@ -298,5 +297,5 @@
 
 def sindsingle(x):  # {{{
-    """function sindsingle - Helper function for sind to reduce repetition of 
+    """function sindsingle - Helper function for sind to reduce repetition of
     logic
 
Index: /issm/trunk/src/m/miscellaneous/diagnostics.m
===================================================================
--- /issm/trunk/src/m/miscellaneous/diagnostics.m	(revision 27034)
+++ /issm/trunk/src/m/miscellaneous/diagnostics.m	(revision 27035)
@@ -35,5 +35,5 @@
 	%grounding line : 
 	if getfieldvalue(options,'gl',0),
-		contours=contourlevelzero(md,md.mask.ocean_levelset,0);
+		contours=isoline(md,md.mask.ocean_levelset);
 		expwrite(contours,[path '/groundingline.exp']);
 		exp2shp([path '/groundingline.shp'],[path '/groundingline.exp']);
Index: /issm/trunk/src/m/miscellaneous/fielddisplay.py
===================================================================
--- /issm/trunk/src/m/miscellaneous/fielddisplay.py	(revision 27034)
+++ /issm/trunk/src/m/miscellaneous/fielddisplay.py	(revision 27035)
@@ -110,5 +110,5 @@
 
 
-def displayunit(offset, name, characterization, comment): #{{{
+def displayunit(offset, name, characterization, comment):  #{{{
     #take care of name
     if len(name) > 23:
@@ -116,5 +116,5 @@
 
     #take care of characterization
-    if m.strcmp(characterization, "''") or m.strcmp(characterization, '""') or m.strcmpi(characterization, 'nan'):
+    if characterization in ["''", '""', 'nan', np.nan, 'NaN', "[0x1]"]:
         characterization = "N/A"
 
Index: /issm/trunk/src/m/modules/CoordTransform.m
===================================================================
--- /issm/trunk/src/m/modules/CoordTransform.m	(revision 27034)
+++ /issm/trunk/src/m/modules/CoordTransform.m	(revision 27035)
@@ -4,23 +4,23 @@
 %   Usage:
 %      [xout,yout] = CoordTransform(xin,yin,projin,projout)
-%
-%   xin,  yin : input coordinates
-%   xout, yout: output coordinates (in new projection)
-%   projin,projout: input/output projection string (PROJ)
+%      - xin,  yin : input coordinates
+%      - xout, yout: output coordinates (in new projection)
+%      - projin,projout: input/output projection string (PROJ)
+%   
+%   Examples:
+%      [md.mesh.lat md.mesh.long] = CoordTransform(md.mesh.x,  md.mesh.y,   'EPSG:3413','EPSG:4326');
+%      [md.mesh.x   md.mesh.y]    = CoordTransform(md.mesh.lat,md.mesh.long,'EPSG:4326','EPSG:3413');
 %
 %   Example of Projections:
+%      lat/lon    = 'EPSG:4326'  or  lat/lon = '+proj=longlat +datum=WGS84'
+%      Greenland  = 'EPSG:3413' (polar stereographic 70N 45W)
+%      Antarctica = 'EPSG:3031' (polar stereographic 71S 0E)
+%      
+%   ll2xy previous default equivalent (uses with Hugues Ellispoid S)
+%      Greenland  = '+proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +k=1 +x_0=0 +y_0=0 +a=6378273 +b=6356889.448564109 +units=m +no_defs'
+%      Antarctica = '+proj=stere +lat_0=-90 +lat_ts=-71 +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378273 +b=6356889.448564109 +units=m +no_defs'
+%      Bamber Greenland = '+proj=stere +lat_0=90 +lat_ts=71 +lon_0=-39 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs'
 %
-%   lat/lon = '+init=epsg:4326'
-%   lat/lon = '+proj=longlat +datum=WGS84'
-%
-%   ll2xy default equivalent (uses with Hugues Ellispoid S)
-%   Greenland = '+proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +k=1 +x_0=0 +y_0=0 +a=6378273 +b=6356889.448564109 +units=m +no_defs'
-%   Antarctica = '+proj=stere +lat_0=-90 +lat_ts=-71 +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378273 +b=6356889.448564109 +units=m +no_defs'
-%   Bamber Greenland = '+proj=stere +lat_0=90 +lat_ts=71 +lon_0=-39 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs'
-%
-%   For latitude/longitude, x is longitude and y latitude and the angles are in 
-%   rad
-%
-%   This function will only work if PROJ has been installed and --with-proj-dir 
+%   This function will only work if PROJ has been installed and --with-proj-dir
 %   option has been set to its location in ISSM configuration
 
Index: /issm/trunk/src/m/os/issmscpin.py
===================================================================
--- /issm/trunk/src/m/os/issmscpin.py	(revision 27034)
+++ /issm/trunk/src/m/os/issmscpin.py	(revision 27035)
@@ -22,5 +22,5 @@
             pass
     #if hostname and host are the same, do a simple copy
-    if hostname == host:
+    if strcmpi(hostname, host):  #hostname == host:
         for package in packages:
             try:
Index: /issm/trunk/src/m/os/issmscpout.py
===================================================================
--- /issm/trunk/src/m/os/issmscpout.py	(revision 27034)
+++ /issm/trunk/src/m/os/issmscpout.py	(revision 27035)
@@ -1,4 +1,3 @@
 import os
-from socket import gethostname
 import subprocess
 from MatlabFuncs import *
@@ -17,5 +16,5 @@
     #if hostname and host are the same, do a simple copy
 
-    if host == hostname:
+    if strcmpi(host, hostname):  #host == hostname:
         for package in packages:
             here = os.getcwd()
Index: /issm/trunk/src/m/os/issmssh.py
===================================================================
--- /issm/trunk/src/m/os/issmssh.py	(revision 27034)
+++ /issm/trunk/src/m/os/issmssh.py	(revision 27035)
@@ -37,5 +37,5 @@
                 subprocess.call('ssh -l %s -p %d localhost "%s"' % (login, port, command), shell=True)
             else:
-                subprocess.call('ssh -l %s %s "%s"' % (login, host, command), shell=True)
+                subprocess.call('ssh -l {} {} "{}"'.format(login, host, command), shell=True)
 
     # The following code was added to fix:
Index: /issm/trunk/src/m/parameterization/killberg.m
===================================================================
--- /issm/trunk/src/m/parameterization/killberg.m	(revision 27034)
+++ /issm/trunk/src/m/parameterization/killberg.m	(revision 27035)
@@ -25,9 +25,10 @@
 %do not go through elements that are grounded, mark flag as 1 (done) need at least 2 vertices!
 %and initialize mask as 1 for all vertices of these elements
-isgrounded=(sum(md.mask.ocean_levelset(md.mesh.elements)>0,2)>1);
+isgrounded=(sum(md.mask.ocean_levelset(md.mesh.elements)>0,2)>2);
 %isgrounded = max(md.mask.ocean_levelset(md.mesh.elements),[],2)>0;
 pos = find(isgrounded);
-element_flag(pos) = 1;
+%element_flag(pos) = 1;
 mask(md.mesh.elements(pos,:)) = 1;
+mask(md.mask.ice_levelset>=0) = 0;
 
 iter = 1;
Index: /issm/trunk/src/m/parameterization/reinitializelevelset.m
===================================================================
--- /issm/trunk/src/m/parameterization/reinitializelevelset.m	(revision 27034)
+++ /issm/trunk/src/m/parameterization/reinitializelevelset.m	(revision 27035)
@@ -15,5 +15,5 @@
 
 %First: extract segments
-contours=contourlevelzero(md,levelset,0);
+contours=isoline(md,levelset,'value',0);
 
 %Now, make this a distance field (might not be closed)
Index: /issm/trunk/src/m/parameterization/setflowequation.js
===================================================================
--- /issm/trunk/src/m/parameterization/setflowequation.js	(revision 27034)
+++ /issm/trunk/src/m/parameterization/setflowequation.js	(revision 27035)
@@ -3,5 +3,5 @@
 //
 //   This routine works like plotmodel: it works with an even number of inputs
-//   'SIA','SSA','L1L2','MLHO','HO','FS' and 'fill' are the possible options
+//   'SIA','SSA','L1L2','MOLHO','HO','FS' and 'fill' are the possible options
 //   that must be followed by the corresponding exp file or flags list
 //   It can either be a domain file (argus type, .exp extension), or an array of element flags. 
@@ -11,5 +11,5 @@
 //   a string 'all' will be considered as the entire domain
 //   You can specify the type of coupling, 'penalties' or 'tiling', to use with the input 'coupling'
-//   NB: L1L2 and MLHO cannot currently be coupled to any other ice flow model
+//   NB: L1L2 and MOLHO cannot currently be coupled to any other ice flow model
 //
 //   Usage:
@@ -38,5 +38,5 @@
 	HOflag   = FlagElements(md,options.getfieldvalue('HO',''));
 	L1L2flag = FlagElements(md,options.getfieldvalue('L1L2',''));
-	MLHOflag = FlagElements(md,options.getfieldvalue('MLHO',''));
+	MOLHOflag = FlagElements(md,options.getfieldvalue('MOLHO',''));
 	FSflag   = FlagElements(md,options.getfieldvalue('FS',''));
 	filltype = options.getfieldvalue('fill','none');
@@ -55,9 +55,9 @@
 
 	//check that each element has at least one flag
-	for(var i=0;i<md.mesh.numberofelements;i++)if((SIAflag[i] + SSAflag[i] + HOflag[i] + L1L2flag[i] + MLHOflag[i] + FSflag[i])==0)
+	for(var i=0;i<md.mesh.numberofelements;i++)if((SIAflag[i] + SSAflag[i] + HOflag[i] + L1L2flag[i] + MOLHOflag[i] + FSflag[i])==0)
 	throw Error("elements type not assigned, supported models are 'SIA','SSA','HO' and 'FS'");
 
 	//check that each element has only one flag
-	if (ArrayAnyAboveStrict(ArrayXPY(SIAflag,SSAflag,HOflag,L1L2flag,MLHOflag),1)){
+	if (ArrayAnyAboveStrict(ArrayXPY(SIAflag,SSAflag,HOflag,L1L2flag,MOLHOflag),1)){
 		console.log('setflowequation warning message: some elements have several types, higher order type is used for them')
 
@@ -71,5 +71,5 @@
 	//check that L1L2 is not coupled to any other model for now
 	if (ArrayAnyEqual(L1L2flag,1) & ArrayAnyEqual(ArrayOr(SIAflag,SSAflag,HOflag,FSflag),1)) throw Error('L1L2 cannot be coupled to any other model');
-	if (ArrayAnyEqual(MLHOflag,1) & ArrayAnyEqual(ArrayOr(SIAflag,SSAflag,HOflag,FSflag),1)) throw Error('MLHO cannot be coupled to any other model');
+	if (ArrayAnyEqual(MOLHOflag,1) & ArrayAnyEqual(ArrayOr(SIAflag,SSAflag,HOflag,FSflag),1)) throw Error('MOLHO cannot be coupled to any other model');
 
 	//Check that no HO or FS for 2d mesh
@@ -100,7 +100,7 @@
 	for(var i=0;i<pos.length;i++) for(var j=0;j<md.mesh.elements[0].length;j++) nodeonL1L2[md.mesh.elements[pos[i]][j]-1]=1;
 
-	nodeonMLHO=NewArrayFill(md.mesh.numberofvertices,0);
-	pos=ArrayFind(MLHOflag,1);
-	for(var i=0;i<pos.length;i++) for(var j=0;j<md.mesh.elements[0].length;j++) nodeonMLHO[md.mesh.elements[pos[i]][j]-1]=1;
+	nodeonMOLHO=NewArrayFill(md.mesh.numberofvertices,0);
+	pos=ArrayFind(MOLHOflag,1);
+	for(var i=0;i<pos.length;i++) for(var j=0;j<md.mesh.elements[0].length;j++) nodeonMOLHO[md.mesh.elements[pos[i]][j]-1]=1;
 
 	nodeonFS=NewArrayFill(md.mesh.numberofvertices,0);
@@ -262,5 +262,5 @@
 	pos=ArrayFind(SSAflag,1);for(var i=0;i<pos.length;i++)md.flowequation.element_equation[pos[i]]=2;
 	pos=ArrayFind(L1L2flag,1);for(var i=0;i<pos.length;i++)md.flowequation.element_equation[pos[i]]=3;
-	pos=ArrayFind(MLHOflag,1);for(var i=0;i<pos.length;i++)md.flowequation.element_equation[pos[i]]=4;
+	pos=ArrayFind(MOLHOflag,1);for(var i=0;i<pos.length;i++)md.flowequation.element_equation[pos[i]]=4;
 	pos=ArrayFind(HOflag,1);for(var i=0;i<pos.length;i++)md.flowequation.element_equation[pos[i]]=5;
 	pos=ArrayFind(FSflag,1);for(var i=0;i<pos.length;i++)md.flowequation.element_equation[pos[i]]=6;
@@ -281,5 +281,5 @@
 	pos=ArrayFind(nodeonSSA,1);for(var i=0;i<pos.length;i++)md.flowequation.vertex_equation[pos[i]]=2;
 	pos=ArrayFind(nodeonL1L2,1);for(var i=0;i<pos.length;i++)md.flowequation.vertex_equation[pos[i]]=3;
-	pos=ArrayFind(nodeonMLHO,1);for(var i=0;i<pos.length;i++)md.flowequation.vertex_equation[pos[i]]=4;
+	pos=ArrayFind(nodeonMOLHO,1);for(var i=0;i<pos.length;i++)md.flowequation.vertex_equation[pos[i]]=4;
 	pos=ArrayFind(nodeonHO,1);for(var i=0;i<pos.length;i++)md.flowequation.vertex_equation[pos[i]]=5;
 	pos=ArrayFind(nodeonFS,1);for(var i=0;i<pos.length;i++)md.flowequation.vertex_equation[pos[i]]=6;
@@ -301,5 +301,5 @@
 	md.flowequation.isSSA  = ArrayAnyEqual(md.flowequation.element_equation,2);
 	md.flowequation.isL1L2 = ArrayAnyEqual(md.flowequation.element_equation,3);
-	md.flowequation.isMLHO = ArrayAnyEqual(md.flowequation.element_equation,4);
+	md.flowequation.isMOLHO = ArrayAnyEqual(md.flowequation.element_equation,4);
 	md.flowequation.isHO   = ArrayAnyEqual(md.flowequation.element_equation,5);
 	md.flowequation.isFS   = ArrayAnyEqual(md.flowequation.element_equation,6);
Index: /issm/trunk/src/m/parameterization/setflowequation.m
===================================================================
--- /issm/trunk/src/m/parameterization/setflowequation.m	(revision 27034)
+++ /issm/trunk/src/m/parameterization/setflowequation.m	(revision 27035)
@@ -3,5 +3,5 @@
 %
 %   This routine works like plotmodel: it works with an even number of inputs
-%   'SIA','SSA','L1L2','MLHO','HO','FS' and 'fill' are the possible options
+%   'SIA','SSA','L1L2','MOLHO','HO','FS' and 'fill' are the possible options
 %   that must be followed by the corresponding exp file or flags list
 %   It can either be a domain file (argus type, .exp extension), or an array of element flags. 
@@ -11,5 +11,5 @@
 %   a string 'all' will be considered as the entire domain
 %   You can specify the type of coupling, 'penalties' or 'tiling', to use with the input 'coupling'
-%   NB: L1L2 and MLHO cannot currently be coupled to any other ice flow model
+%   NB: L1L2 and MOLHO cannot currently be coupled to any other ice flow model
 %
 %   Usage:
@@ -39,5 +39,5 @@
 HOflag   = FlagElements(md,getfieldvalue(options,'HO',''));
 L1L2flag = FlagElements(md,getfieldvalue(options,'L1L2',''));
-MLHOflag = FlagElements(md,getfieldvalue(options,'MLHO',''));
+MOLHOflag = FlagElements(md,getfieldvalue(options,'MOLHO',''));
 FSflag   = FlagElements(md,getfieldvalue(options,'FS',''));
 filltype = getfieldvalue(options,'fill','none');
@@ -54,10 +54,10 @@
 
 %check that each element has at least one flag
-if any(SIAflag+SSAflag+HOflag+L1L2flag+MLHOflag+FSflag==0),
+if any(SIAflag+SSAflag+HOflag+L1L2flag+MOLHOflag+FSflag==0),
 	error('elements type not assigned, supported models are ''SIA'',''SSA'',''HO'' and ''FS''')
 end
 
 %check that each element has only one flag
-if any(SIAflag+SSAflag+HOflag+L1L2flag+MLHOflag+FSflag>1),
+if any(SIAflag+SSAflag+HOflag+L1L2flag+MOLHOflag+FSflag>1),
 	disp('setflowequation.m: Warning: some elements have several types, higher order type is used for them')
 	SIAflag(find(SIAflag & SSAflag))=0;
@@ -70,6 +70,6 @@
 	error('L1L2 cannot be coupled to any other model');
 end
-if any(MLHOflag) & any(SIAflag | SSAflag | HOflag | FSflag)
-	error('MLHO cannot be coupled to any other model');
+if any(MOLHOflag) & any(SIAflag | SSAflag | HOflag | FSflag)
+	error('MOLHO cannot be coupled to any other model');
 end
 
@@ -91,5 +91,5 @@
 nodeonHO=zeros(md.mesh.numberofvertices,1);   nodeonHO(md.mesh.elements(find(HOflag),:))=1;
 nodeonL1L2=zeros(md.mesh.numberofvertices,1); nodeonL1L2(md.mesh.elements(find(L1L2flag),:))=1;
-nodeonMLHO=zeros(md.mesh.numberofvertices,1); nodeonMLHO(md.mesh.elements(find(MLHOflag),:))=1;
+nodeonMOLHO=zeros(md.mesh.numberofvertices,1); nodeonMOLHO(md.mesh.elements(find(MOLHOflag),:))=1;
 nodeonFS=zeros(md.mesh.numberofvertices,1);
 noneflag=zeros(md.mesh.numberofelements,1);
@@ -248,5 +248,5 @@
 md.flowequation.element_equation(find(SSAflag))=2;
 md.flowequation.element_equation(find(L1L2flag))=3;
-md.flowequation.element_equation(find(MLHOflag))=4;
+md.flowequation.element_equation(find(MOLHOflag))=4;
 md.flowequation.element_equation(find(HOflag))=5;
 md.flowequation.element_equation(find(FSflag))=6;
@@ -264,5 +264,5 @@
 pos=find(nodeonSSA);  md.flowequation.vertex_equation(pos)=2;
 pos=find(nodeonL1L2); md.flowequation.vertex_equation(pos)=3;
-pos=find(nodeonMLHO); md.flowequation.vertex_equation(pos)=4;
+pos=find(nodeonMOLHO); md.flowequation.vertex_equation(pos)=4;
 pos=find(nodeonHO);   md.flowequation.vertex_equation(pos)=5;
 pos=find(nodeonFS);   md.flowequation.vertex_equation(pos)=6;
@@ -287,5 +287,5 @@
 md.flowequation.isSSA  = double(any(md.flowequation.element_equation == 2));
 md.flowequation.isL1L2 = double(any(md.flowequation.element_equation == 3));
-md.flowequation.isMLHO = double(any(md.flowequation.element_equation == 4));
+md.flowequation.isMOLHO = double(any(md.flowequation.element_equation == 4));
 md.flowequation.isHO   = double(any(md.flowequation.element_equation == 5));
 md.flowequation.isFS   = double(any(md.flowequation.element_equation == 6));
Index: /issm/trunk/src/m/parameterization/setflowequation.py
===================================================================
--- /issm/trunk/src/m/parameterization/setflowequation.py	(revision 27034)
+++ /issm/trunk/src/m/parameterization/setflowequation.py	(revision 27035)
@@ -9,5 +9,5 @@
 
     This routine works like plotmodel: it works with an even number of inputs
-    'SIA', 'SSA', 'HO', 'L1L2', 'MLHO', 'FS' and 'fill' are the possible 
+    'SIA', 'SSA', 'HO', 'L1L2', 'MOLHO', 'FS' and 'fill' are the possible 
     options that must be followed by the corresponding exp file or flags list. 
     It can either be a domain file (argus type, .exp extension), or an array of 
@@ -45,5 +45,5 @@
     HOflag = FlagElements(md, options.getfieldvalue('HO', ''))
     L1L2flag = FlagElements(md, options.getfieldvalue('L1L2', ''))
-    MLHOflag = FlagElements(md, options.getfieldvalue('MLHO', ''))
+    MOLHOflag = FlagElements(md, options.getfieldvalue('MOLHO', ''))
     FSflag = FlagElements(md, options.getfieldvalue('FS', ''))
     filltype = options.getfieldvalue('fill', 'none')
@@ -57,9 +57,9 @@
         HOflag = ~SIAflag & ~SSAflag & ~FSflag
     #check that each element has at least one flag
-    if not any(SIAflag + SSAflag + L1L2flag + MLHOflag + HOflag + FSflag):
+    if not any(SIAflag + SSAflag + L1L2flag + MOLHOflag + HOflag + FSflag):
         raise TypeError("elements type not assigned, supported models are 'SIA', 'SSA', 'HO' and 'FS'")
 
     #check that each element has only one flag
-    if any(SIAflag + SSAflag + L1L2flag + MLHOflag + HOflag + FSflag > 1):
+    if any(SIAflag + SSAflag + L1L2flag + MOLHOflag + HOflag + FSflag > 1):
         print('Warning: setflowequation.py: some elements have several types, higher order type is used for them')
         SIAflag[np.where(np.logical_and(SIAflag, SSAflag))] = False
@@ -67,9 +67,9 @@
         SSAflag[np.where(np.logical_and(SSAflag, HOflag))] = False
 
-        #check that L1L2 and MLHO is not coupled to any other model for now
+        #check that L1L2 and MOLHO is not coupled to any other model for now
         if any(L1L2flag) and any(SIAflag + SSAflag + HOflag + FSflag):
             raise TypeError('L1L2 cannot be coupled to any other model')
-        if any(MLHOflag) and any(SIAflag + SSAflag + HOflag + FSflag):
-            raise TypeError('MLHO cannot be coupled to any other model')
+        if any(MOLHOflag) and any(SIAflag + SSAflag + HOflag + FSflag):
+            raise TypeError('MOLHO cannot be coupled to any other model')
 
         #Check that no HO or FS for 2d mesh
@@ -89,6 +89,6 @@
     nodeonL1L2 = np.zeros(md.mesh.numberofvertices, bool)
     nodeonL1L2[md.mesh.elements[np.where(L1L2flag), :] - 1] = True
-    nodeonMLHO = np.zeros(md.mesh.numberofvertices, bool)
-    nodeonMLHO[md.mesh.elements[np.where(MLHOflag), :] - 1] = True
+    nodeonMOLHO = np.zeros(md.mesh.numberofvertices, bool)
+    nodeonMOLHO[md.mesh.elements[np.where(MOLHOflag), :] - 1] = True
     nodeonHO = np.zeros(md.mesh.numberofvertices, bool)
     nodeonHO[md.mesh.elements[np.where(HOflag), :] - 1] = True
@@ -241,5 +241,5 @@
     md.flowequation.element_equation[np.where(SSAflag)] = 2
     md.flowequation.element_equation[np.where(L1L2flag)] = 3
-    md.flowequation.element_equation[np.where(MLHOflag)] = 4
+    md.flowequation.element_equation[np.where(MOLHOflag)] = 4
     md.flowequation.element_equation[np.where(HOflag)] = 5
     md.flowequation.element_equation[np.where(FSflag)] = 6
@@ -259,5 +259,5 @@
     pos = np.where(nodeonL1L2)
     md.flowequation.vertex_equation[pos] = 3
-    pos = np.where(nodeonMLHO)
+    pos = np.where(nodeonMOLHO)
     md.flowequation.vertex_equation[pos] = 4
     pos = np.where(nodeonHO)
@@ -283,5 +283,5 @@
     md.flowequation.isSSA = any(md.flowequation.element_equation == 2)
     md.flowequation.isL1L2= any(md.flowequation.element_equation == 3)
-    md.flowequation.isMLHO= any(md.flowequation.element_equation == 4)
+    md.flowequation.isMOLHO= any(md.flowequation.element_equation == 4)
     md.flowequation.isHO = any(md.flowequation.element_equation == 5)
     md.flowequation.isFS = any(md.flowequation.element_equation == 6)
Index: /issm/trunk/src/m/plot/applyoptions.py
===================================================================
--- /issm/trunk/src/m/plot/applyoptions.py	(revision 27034)
+++ /issm/trunk/src/m/plot/applyoptions.py	(revision 27035)
@@ -53,6 +53,6 @@
     #title font
         titlefont = font.copy()
-        titlefont['size'] = titlefontsize
-        titlefont['weight'] = titlefontweight
+        titlefont['fontsize'] = titlefontsize
+        titlefont['fontweight'] = titlefontweight
         ax.set_title(title, **titlefont)
     # }}}
Index: /issm/trunk/src/m/plot/plot_elementstype.m
===================================================================
--- /issm/trunk/src/m/plot/plot_elementstype.m	(revision 27034)
+++ /issm/trunk/src/m/plot/plot_elementstype.m	(revision 27035)
@@ -37,5 +37,5 @@
 	end
 end
-legend(p,'None','SIA','SSA','L1L2','MLHO','HO',...
+legend(p,'None','SIA','SSA','L1L2','MOLHO','HO',...
 		'SSAHO','FS','SSAFS','HOFS');
 
Index: /issm/trunk/src/m/plot/plot_manager.m
===================================================================
--- /issm/trunk/src/m/plot/plot_manager.m	(revision 27034)
+++ /issm/trunk/src/m/plot/plot_manager.m	(revision 27035)
@@ -129,9 +129,13 @@
 		case 'transient_results',
 			plot_transient_results(md,options,subplotwidth,i);
+			return
 		case 'transient_field',
 			plot_transient_field(md,options,subplotwidth,i);
 			return;
 	otherwise,
-		if ismember(data,properties('model')),
+		if isfield(md.results,'TransientSolution') && isfield(md.results.TransientSolution,data)
+			plot_transient_movie(md,options,subplotwidth,i);
+			return
+		elseif ismember(data,properties('model')),
 			data=eval(['md.' data ';']);
 		else
Index: /issm/trunk/src/m/plot/plot_transient_movie.m
===================================================================
--- /issm/trunk/src/m/plot/plot_transient_movie.m	(revision 27034)
+++ /issm/trunk/src/m/plot/plot_transient_movie.m	(revision 27035)
@@ -12,4 +12,6 @@
 	if exist(options,'transient_movie_field'),
 		field=getfieldvalue(options,'transient_movie_field');
+	elseif ischar(getfieldvalue(options,'data'))
+		field=getfieldvalue(options,'data');
 	else
 		disp('List of available fields:');
@@ -37,7 +39,31 @@
 		steps=[limit(1):limit(end)];
 	elseif exist(options,'transient_movie_steps'),
+		warning('option ''transient_movie_steps'' is now ''steps'', please update your script');
 		steps = getfieldvalue(options,'transient_movie_steps');
+	elseif exist(options,'steps'),
+		steps = getfieldvalue(options,'steps');
 	else
 		steps=1:length(results);
+	end
+
+	%Do we have an output?
+	isavi = 0;
+	isgif = 0;
+	ismp4 = 0;
+	if exist(options,'transient_movie_output'),
+		filename=getfieldvalue(options,'transient_movie_output');
+		[pathstr,name,ext] = fileparts(filename);
+		if strcmp(ext,'.gif')
+			isgif = 1;
+		elseif strcmp(ext,'.mp4')
+			ismp4 = 1;
+		elseif strcmp(ext,'.avi')
+			isavi = 1;
+		end
+	end
+	if isavi || ismp4
+		vid=VideoWriter([filename(1:end-4),'.avi'],'Motion JPEG AVI');
+		vid.FrameRate = 2; 
+		open(vid); 
 	end
 
@@ -53,4 +79,8 @@
 	end
 
+
+	%Process mesh once for all
+	[x y z elements is2d isplanet]=processmesh(md,results(i).(field),options);
+
 	%display movie
 	nstep=1;
@@ -60,14 +90,51 @@
 		if ~isempty(results(i).(field)),
 			%process data
-			[x y z elements is2d isplanet]=processmesh(md,results(i).(field),options);
 			[data datatype]=processdata(md,results(i).(field),options);
 
 			clf;
-			titlestring=[field ' at time ' num2str(results(i).time,'%7.2f') ' year'];
+			titlestring=[field ' (time ' num2str(results(i).time,'%7.2f') ' yr)'];
 			plot_unit(x,y,z,elements,data,is2d,isplanet,datatype,options)
-			apply_options_movie(md,options,titlestring);
+			apply_options_movie(md,data,options,titlestring);
 
-			if exist(options,'transient_movie_output'),
-				set(gcf,'Renderer','zbuffer','color','white'); %fixes a bug on Mac OS X (not needed in future Matlab version)
+			%Add grounding line
+			if exist(options,'groundingline') 
+				if dimension(md.mesh)==2
+					contours=isoline(md, results(i).MaskOceanLevelset,'output','matrix');
+				else
+					ocean = project2d(md, results(i).MaskOceanLevelset, 1);
+					contours=isoline(md, ocean,'output','matrix');
+				end
+				hold on
+				plot(contours(:,1),contours(:,2),getfieldvalue(options,'groundingline'));
+			end
+
+			%Add ice front
+			if exist(options,'icefront')
+				if dimension(md.mesh)==2
+					contours=isoline(md, results(i).MaskIceLevelset,'output','matrix');
+				else
+					ice = project2d(md, results(i).MaskIceLevelset, 1);
+					contours=isoline(md, ice,'output','matrix');
+				end
+				hold on
+				plot(contours(:,1),contours(:,2),getfieldvalue(options,'icefront'));
+			end
+
+			if isgif
+				frame=getframe(gcf);
+				im = frame2im(frame);
+				[imind,cmap] = rgb2ind(im,256);
+				if i==1
+					imwrite(imind, cmap, filename, 'DelayTime',getfieldvalue(options,'transient_movie_time',.5), 'LoopCount',inf)
+				else
+					imwrite(imind, cmap, filename, 'WriteMode','append');
+				end
+			elseif isavi || ismp4
+				F=getframe(gcf);
+				writeVideo(vid, F);
+			end
+
+			if exist(options,'transient_movie_output')
+				%set(gcf,'Renderer','zbuffer','color','white'); %fixes a bug on Mac OS X (not needed in future Matlab version)
 				if nstep==1,
 					%initialize images and frame
@@ -87,15 +154,26 @@
 
 	%output movie if requested.
-	if exist(options,'transient_movie_output'),
-		filename=getfieldvalue(options,'transient_movie_output');
-		imwrite(images,map,filename,'DelayTime',getfieldvalue(options,'transient_movie_time',2),'LoopCount',inf)
+	if isavi || ismp4
+		close(vid);
+	end
+	if ismp4
+		filename = filename(1:end-4);
+		while(~exist([filename '.avi']))
+			disp(['Waiting for ' filename '.avi']);
+			pause(1)
+		end
+		command=sprintf('ffmpeg -y -i %s.avi -c:v libx264 -crf 19 -preset slow -c:a libfaac -b:a 192k -ac 2 -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" %s.mp4',filename,filename);
+		system(command);
+	end
+	if isgif
+		imwrite(images,map,filename,'DelayTime',getfieldvalue(options,'transient_movie_time',.5),'LoopCount',inf)
 	end
 
 end %function
 
-function apply_options_movie(md,options,titlestring)
+function apply_options_movie(md,data,options,titlestring)
 	%apply options
 	options=changefieldvalue(options,'title',titlestring);
 	options=addfielddefault(options,'colorbar',1);
-	applyoptions(md,[],options);
+	applyoptions(md,data,options);
 end
Index: /issm/trunk/src/m/plot/plot_vertexnumbering.m
===================================================================
--- /issm/trunk/src/m/plot/plot_vertexnumbering.m	(revision 27034)
+++ /issm/trunk/src/m/plot/plot_vertexnumbering.m	(revision 27035)
@@ -20,6 +20,13 @@
 
 	%numbering
-	text(x,y,z,num2str(vertexnumbers),...
-		'backgroundcolor',[0.8 0.9 0.8],'HorizontalAlignment','center','VerticalAlignment','middle');
+	X   = x;
+	Y   = y;
+	NUM = vertexnumbers;
+	if exist(options,'axis')
+		AXIS = getfieldvalue(options,'axis');
+		pos = find(X>AXIS(1) & X<AXIS(2) & Y>AXIS(3) & Y<AXIS(4));
+		X = X(pos); Y=Y(pos); NUM=NUM(pos);
+	end
+	text(X,Y,num2str(NUM),'backgroundcolor',[0.8 0.9 0.8],'HorizontalAlignment','center','VerticalAlignment','middle');
 
 	%Highlight
@@ -45,6 +52,14 @@
 
 	%numbering
-	text(x,y,z,num2str(vertexnumbers),...
-		'backgroundcolor',[0.8 0.9 0.8],'HorizontalAlignment','center','VerticalAlignment','middle');
+	X   = x;
+	Y   = y;
+	Z   = z;
+	NUM = vertexnumbers;
+	if exist(options,'axis')
+		AXIS = getfieldvalue(options,'axis');
+		pos = find(X>AXIS(1) & X<AXIS(2) & Y>AXIS(3) & Y<AXIS(4));
+		X = X(pos); Y=Y(pos); Z=Z(pos); NUM=NUM(pos);
+	end
+	text(X,Y,Z,num2str(NUM),'backgroundcolor',[0.8 0.9 0.8],'HorizontalAlignment','center','VerticalAlignment','middle');
 
 	%Highlight
Index: /issm/trunk/src/m/shp/shpread.py
===================================================================
--- /issm/trunk/src/m/shp/shpread.py	(revision 27034)
+++ /issm/trunk/src/m/shp/shpread.py	(revision 27035)
@@ -1,2 +1,3 @@
+import numpy as np
 from collections import OrderedDict
 from os import path
@@ -12,10 +13,10 @@
     """SHPREAD - read a shapefile and build a list of shapes
 
-    This routine reads a shapefile and builds a list of OrderedDict objects 
-    containing the fields x and y corresponding to the coordinates, one for the 
-    filename of the shp file, for the density, for the nodes, and a field 
-    closed to indicate if the domain is closed. If this initial shapefile is 
-    point only, the fields closed and points are ommitted. The first argument 
-    is the shapefile to be read and the second argument (optional) indicates if 
+    This routine reads a shapefile and builds a list of OrderedDict objects
+    containing the fields x and y corresponding to the coordinates, one for the
+    filename of the shp file, for the density, for the nodes, and a field
+    closed to indicate if the domain is closed. If this initial shapefile is
+    point only, the fields closed and points are ommitted. The first argument
+    is the shapefile to be read and the second argument (optional) indicates if
     the last point shall be read (1 to read it, 0 not to).
 
@@ -26,7 +27,7 @@
 
     Example:
-        From underling PyShp implementation, "The shapefile format is actually 
-        a collection of three files. You specify the base filename of the 
-        shapefile or the complete filename of any of the shapefile component 
+        From underling PyShp implementation, "The shapefile format is actually
+        a collection of three files. You specify the base filename of the
+        shapefile or the complete filename of any of the shapefile component
         files."
 
@@ -37,7 +38,7 @@
         list = shpread('domainoutline')
 
-        "OR any of the other 5+ formats which are potentially part of a 
-        shapefile. The library does not care about file extensions". We do, 
-        however, check that a file with the base filename or base filename with 
+        "OR any of the other 5+ formats which are potentially part of a
+        shapefile. The library does not care about file extensions". We do,
+        however, check that a file with the base filename or base filename with
         .shp extension exists.
 
@@ -46,13 +47,13 @@
 
     NOTE:
-    - OrderedDict objects are used instead of OrderedStruct objects (although 
-    addressing in the latter case is closer to the MATLAB struct type) in order 
+    - OrderedDict objects are used instead of OrderedStruct objects (although
+    addressing in the latter case is closer to the MATLAB struct type) in order
     to remain consistent with the pattern established by src/m/exp/expread.py.
 
     TODO:
-    - Create class that can be used to store and pretty print shape structs 
+    - Create class that can be used to store and pretty print shape structs
     (ala OrderedStruct from src/m/qmu/helpers.py).
-    - Convert returned data structure from list of OrderedDict objects to list 
-    of OrderedStruct objects and remove corresponding note (see also 
+    - Convert returned data structure from list of OrderedDict objects to list
+    of OrderedStruct objects and remove corresponding note (see also
     src/m/exp/expread.py). Also, modify handling of returned data structure in,
         - src/m/classes/basin.py
@@ -76,7 +77,6 @@
     Structs = []
     shapes = sf.shapes()
-    for i in range(len(shapes)):
+    for i, shape in enumerate(shapes):
         Struct = OrderedDict()
-        shape = shapes[i]
         if shape.shapeType == shapefile.POINT:
             Struct['x'] = shape.points[0][0]
@@ -88,6 +88,5 @@
             x = []
             y = []
-            for j in range(num_points):
-                point = shape.points[j]
+            for j, point in enumerate(shape.points):
                 x.append(point[0])
                 y.append(point[1])
@@ -103,6 +102,5 @@
             x = []
             y = []
-            for j in range(num_points):
-                point = shape.points[j]
+            for j, point in enumerate(shape.points):
                 x.append(point[0])
                 y.append(point[1])
@@ -115,8 +113,8 @@
             Struct['Geometry'] = 'Polygon'
         else:
-            # NOTE: We could do this once before looping over shapes as all 
-            #       shapes in the file must be of the same type, but we would 
-            #       need to have a second check anyway in order to know how to 
-            #       parse the points. So, let's just assume the file is not 
+            # NOTE: We could do this once before looping over shapes as all
+            #       shapes in the file must be of the same type, but we would
+            #       need to have a second check anyway in order to know how to
+            #       parse the points. So, let's just assume the file is not
             #       malformed.
             #
@@ -125,11 +123,11 @@
         name = ''
         fields = sf.fields
-        for j in range(1, len(fields)): # skip over first field, which is "DeletionFlag"
+        for j in range(1, len(fields)):  # skip over first field, which is "DeletionFlag"
             fieldname = fields[j][0]
             # 'id' field gets special treatment
-            if fieldname == 'id':
-                name = str(sf.record(i)[j - 1]) # record index is offset by one, again, because of "DeletionFlag"
+            if fieldname in ['id', 'fid']:
+                name = str(sf.record(i)[j - 1])  # record index is offset by one, again, because of "DeletionFlag"
             else:
-                setattr(Struct, str(fieldname), sf.record(i)[j - 1]) # cast to string removes "u" from "u'fieldname'"
+                setattr(Struct, str(fieldname), sf.record(i)[j - 1])  # cast to string removes "u" from "u'fieldname'"
         Struct['name'] = name
         Structs.append(Struct)
Index: /issm/trunk/src/m/shp/shpwrite.py
===================================================================
--- /issm/trunk/src/m/shp/shpwrite.py	(revision 27034)
+++ /issm/trunk/src/m/shp/shpwrite.py	(revision 27035)
@@ -23,5 +23,5 @@
 
     TODO:
-    - Should we check if there is only one element (see how MATLAB's shaperead 
+    - Should we check if there is only one element (see how MATLAB's shaperead
     and shapewrite handle single shapes versus multiple shapes)?
     '''
@@ -43,5 +43,5 @@
 
     for i in range(len(shp)):
-        sf.field('name', 'C') # TODO: Allow shape ids/names to be passed through
+        sf.field('name', 'C')  # TODO: Allow shape ids/names to be passed through
         if shapeType == 1: # POINT
             sf.point(shp[i].x, shp[i].y)
@@ -51,5 +51,5 @@
                 points.append([shp[i].x[j], shp[i].y[j]])
             sf.line(line)
-        elif shapeType == 5: # POLYGON
+        elif shapeType == 5:  # POLYGON
             points = []
             for j in range(len(shp[i].x)):
Index: /issm/trunk/src/m/solve/parseresultsfromdisk.m
===================================================================
--- /issm/trunk/src/m/solve/parseresultsfromdisk.m	(revision 27034)
+++ /issm/trunk/src/m/solve/parseresultsfromdisk.m	(revision 27035)
@@ -244,4 +244,8 @@
 		field = field*yts;
 	elseif strcmp(fieldname,'BasalforcingsFloatingiceMeltingRate'),
+		field = field*yts;
+	elseif strcmp(fieldname,'BasalforcingsSpatialDeepwaterMeltingRate'),
+		field = field*yts;
+	elseif strcmp(fieldname,'BasalforcingsSpatialUpperwaterMeltingRate'),
 		field = field*yts;
 	elseif strcmp(fieldname,'TotalFloatingBmb'),
Index: /issm/trunk/src/m/solve/parseresultsfromdisk.py
===================================================================
--- /issm/trunk/src/m/solve/parseresultsfromdisk.py	(revision 27034)
+++ /issm/trunk/src/m/solve/parseresultsfromdisk.py	(revision 27035)
@@ -195,4 +195,8 @@
             field = field * yts
         elif fieldname == 'BasalforcingsFloatingiceMeltingRate':
+            field = field * yts
+        elif fieldname == 'BasalforcingsSpatialDeepwaterMeltingRate':
+            field = field * yts
+        elif fieldname == 'BasalforcingsSpatialUpperwaterMeltingRate':
             field = field * yts
         elif fieldname == 'TotalFloatingBmb':
Index: /issm/trunk/src/wrappers/CoordTransform/CoordTransform.cpp
===================================================================
--- /issm/trunk/src/wrappers/CoordTransform/CoordTransform.cpp	(revision 27034)
+++ /issm/trunk/src/wrappers/CoordTransform/CoordTransform.cpp	(revision 27035)
@@ -65,5 +65,4 @@
 		}
 
-		PJ *P;
 		size_t sx = sizeof(double);
 		size_t sy = sizeof(double);
@@ -71,18 +70,19 @@
 		size_t ny = size;
 
-		P = proj_create_crs_to_crs(PJ_DEFAULT_CTX,projin,projout,NULL);
+		PJ* P = proj_create_crs_to_crs(PJ_DEFAULT_CTX,projin,projout,NULL);
 
-		if ( 0 == P ) {
+		if(P==0){
 			proj_destroy(P);
-			_error_("failed to initialize CRS transformation object");
+			_error_("Projection string not recognized");
 		}
 
 		int p = proj_trans_generic(P, PJ_FWD, xout, sx, nx, yout, sy, ny, 0, 0, 0, 0, 0, 0);
 
-		if ( 0 == p ){
+		if(p==0){
 			proj_destroy(P);
-			_error_("no successful transformations");
+			_error_("projection failed");
 		}
 
+		/*Cleanup*/
 		proj_destroy(P);
 
Index: /issm/trunk/test/Data/SlcTestMesh.pkl
===================================================================
--- /issm/trunk/test/Data/SlcTestMesh.pkl	(revision 27035)
+++ /issm/trunk/test/Data/SlcTestMesh.pkl	(revision 27035)
@@ -0,0 +1,202 @@
+ccopy_reg
+_reconstructor
+p0
+(cmesh3dsurface
+mesh3dsurface
+p1
+c__builtin__
+object
+p2
+Ntp3
+Rp4
+(dp5
+S'vertexonboundary'
+p6
+Fnan
+sS'extractedelements'
+p7
+Fnan
+sS'elements'
+p8
+cnumpy.core.multiarray
+_reconstruct
+p9
+(cnumpy
+ndarray
+p10
+(I0
+tp11
+S'b'
+p12
+tp13
+Rp14
+(I1
+(I2568
+I3
+tp15
+cnumpy
+dtype
+p16
+(S'i8'
+p17
+I0
+I1
+tp18
+Rp19
+(I3
+S'<'
+p20
+NNNI-1
+I-1
+I0
+tp21
+bI00
+S'\xaf\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\x00\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00r\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00t\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x00\x00\xc6\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00u\x00\x00\x00\x00\x00\x00\x00v\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\xca\x00\x00\x00\x00\x00\x00\x00\xcb\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\xd2\x00\x00\x00\x00\x00\x00\x00\xd1\x00\x00\x00\x00\x00\x00\x00\xd1\x00\x00\x00\x00\x00\x00\x00\xd2\x00\x00\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\xd4\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\xd4\x00\x00\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\xd5\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\xcb\x00\x00\x00\x00\x00\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00\xd7\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00\xd7\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd7\x00\x00\x00\x00\x00\x00\x00\xda\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x00\x00\x00\x00\xdb\x00\x00\x00\x00\x00\x00\x00k\x00\x00\x00\x00\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x00\x00k\x00\x00\x00\x00\x00\x00\x00l\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\xde\x00\x00\x00\x00\x00\x00\x00\xde\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\xe1\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\xe2\x00\x00\x00\x00\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\xe3\x00\x00\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x00\x00\x00\x00\xe7\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x00\x00\xe7\x00\x00\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x00\x00\xd1\x00\x00\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x00\x00\xd5\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00\x00\x00\x00\x00\xd1\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x00\x00\xec\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\x00\x00\x00\x00\xd5\x00\x00\x00\x00\x00\x00\x00\xed\x00\x00\x00\x00\x00\x00\x00\xd2\x00\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\x00\x00\x00\x00\xe1\x00\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\xe1\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xda\x00\x00\x00\x00\x00\x00\x00\xe1\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\xe1\x00\x00\x00\x00\x00\x00\x00\xda\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\xca\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\x00\x00\x00\x00\xdb\x00\x00\x00\x00\x00\x00\x00\xf3\x00\x00\x00\x00\x00\x00\x00\xf4\x00\x00\x00\x00\x00\x00\x00\xf6\x00\x00\x00\x00\x00\x00\x00\xf5\x00\x00\x00\x00\x00\x00\x00\xf7\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\xf5\x00\x00\x00\x00\x00\x00\x00\xf6\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\x00\x00\x00\x00\xfa\x00\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\xe2\x00\x00\x00\x00\x00\x00\x00\xe3\x00\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x00\x00\xfc\x00\x00\x00\x00\x00\x00\x00\xf4\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\xfc\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\xf7\x00\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\xf5\x00\x00\x00\x00\x00\x00\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\x00\x00\x00\x00\xf7\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00\x00\x00\x00\x00\xd4\x00\x00\x00\x00\x00\x00\x00\xd5\x00\x00\x00\x00\x00\x00\x00\xdb\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00k\x00\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00j\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00j\x00\x00\x00\x00\x00\x00\x00k\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x05\x01\x00\x00\x00\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x00\x00\x00\x08\x01\x00\x00\x00\x00\x00\x00\x07\x01\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x00\x00\x00\x07\x01\x00\x00\x00\x00\x00\x00o\x00\x00\x00\x00\x00\x00\x00\t\x01\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x07\x01\x00\x00\x00\x00\x00\x00\x07\x01\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\x00\x00n\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\n\x01\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\xfa\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\xca\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00\xec\x00\x00\x00\x00\x00\x00\x00\xd5\x00\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\xd5\x00\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00\r\x01\x00\x00\x00\x00\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00\x00\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x0f\x01\x00\x00\x00\x00\x00\x00\x11\x01\x00\x00\x00\x00\x00\x00\x10\x01\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x14\x01\x00\x00\x00\x00\x00\x00\x13\x01\x00\x00\x00\x00\x00\x00\x15\x01\x00\x00\x00\x00\x00\x00\x10\x01\x00\x00\x00\x00\x00\x00\x11\x01\x00\x00\x00\x00\x00\x00\x16\x01\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x00\x00\x16\x01\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x00\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x15\x01\x00\x00\x00\x00\x00\x00\x17\x01\x00\x00\x00\x00\x00\x00\x10\x01\x00\x00\x00\x00\x00\x00\x18\x01\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\xd7\x00\x00\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\x1a\x01\x00\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\x1a\x01\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00\x18\x01\x00\x00\x00\x00\x00\x00\x10\x01\x00\x00\x00\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00\x1a\x01\x00\x00\x00\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x1b\x01\x00\x00\x00\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x1b\x01\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x00\x00\x00u\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x17\x01\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00\x10\x01\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x14\x01\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x14\x01\x00\x00\x00\x00\x00\x00\xfa\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x00\x00\x00\xfa\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\n\x01\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\x00\x00\x00\x00\x08\x01\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00s\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00r\x00\x00\x00\x00\x00\x00\x00\xda\x00\x00\x00\x00\x00\x00\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x1a\x01\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x00\x00\x00\x00\xe3\x00\x00\x00\x00\x00\x00\x00\n\x01\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x08\x01\x00\x00\x00\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x00\x00l\x00\x00\x00\x00\x00\x00\x00\xf7\x00\x00\x00\x00\x00\x00\x00\xf7\x00\x00\x00\x00\x00\x00\x00l\x00\x00\x00\x00\x00\x00\x00m\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\x00\x00\x00\x00\r\x01\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x1d\x01\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x00\x00\x00\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x13\x01\x00\x00\x00\x00\x00\x00\x14\x01\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\xc6\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x00\x00\r\x01\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\x00\x00\x00\x00\xf3\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x00\x00\x00\x00\x00\x1e\x01\x00\x00\x00\x00\x00\x00\x10\x01\x00\x00\x00\x00\x00\x00\x18\x01\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x00\x00\x1b\x01\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x00\x00\xca\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x1f\x01\x00\x00\x00\x00\x00\x00\xca\x00\x00\x00\x00\x00\x00\x00\x1f\x01\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\xe3\x00\x00\x00\x00\x00\x00\x00 \x01\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x00\x00\x00\x00\x1e\x01\x00\x00\x00\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x00\x00\x05\x01\x00\x00\x00\x00\x00\x00"\x01\x00\x00\x00\x00\x00\x00!\x01\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\xda\x00\x00\x00\x00\x00\x00\x00#\x01\x00\x00\x00\x00\x00\x00#\x01\x00\x00\x00\x00\x00\x00\xda\x00\x00\x00\x00\x00\x00\x00\x1a\x01\x00\x00\x00\x00\x00\x00\xfa\x00\x00\x00\x00\x00\x00\x00\x14\x01\x00\x00\x00\x00\x00\x00$\x01\x00\x00\x00\x00\x00\x00\x10\x01\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x0f\x01\x00\x00\x00\x00\x00\x00\xfa\x00\x00\x00\x00\x00\x00\x00$\x01\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00\xe7\x00\x00\x00\x00\x00\x00\x00&\x01\x00\x00\x00\x00\x00\x00%\x01\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00\'\x01\x00\x00\x00\x00\x00\x00\xdd\x00\x00\x00\x00\x00\x00\x00$\x01\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00\xd5\x00\x00\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x00\x00\x00\x00\x00\x00$\x01\x00\x00\x00\x00\x00\x00\xdd\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\n\x01\x00\x00\x00\x00\x00\x00\'\x01\x00\x00\x00\x00\x00\x00\xdd\x00\x00\x00\x00\x00\x00\x00(\x01\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00\xed\x00\x00\x00\x00\x00\x00\x00\x15\x01\x00\x00\x00\x00\x00\x00\xd2\x00\x00\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x00\x00\xd2\x00\x00\x00\x00\x00\x00\x00\x15\x01\x00\x00\x00\x00\x00\x00\xed\x00\x00\x00\x00\x00\x00\x00\x17\x01\x00\x00\x00\x00\x00\x00\x15\x01\x00\x00\x00\x00\x00\x00\'\x01\x00\x00\x00\x00\x00\x00\n\x01\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00\x17\x01\x00\x00\x00\x00\x00\x00\'\x01\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\x00\x00\x00\x00\x1d\x01\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x18\x01\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00v\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x13\x01\x00\x00\x00\x00\x00\x00\xec\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\xdb\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\xca\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00#\x01\x00\x00\x00\x00\x00\x00\r\x01\x00\x00\x00\x00\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00#\x01\x00\x00\x00\x00\x00\x00\x1a\x01\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x13\x01\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00#\x01\x00\x00\x00\x00\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00\r\x01\x00\x00\x00\x00\x00\x00!\x01\x00\x00\x00\x00\x00\x00"\x01\x00\x00\x00\x00\x00\x00\xd4\x00\x00\x00\x00\x00\x00\x00%\x01\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00\x00\x00\x00\x00\xe7\x00\x00\x00\x00\x00\x00\x00\x18\x01\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\x00\x00\x00\x00\x18\x01\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x13\x01\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00\xf6\x00\x00\x00\x00\x00\x00\x00\x1b\x01\x00\x00\x00\x00\x00\x00\x16\x01\x00\x00\x00\x00\x00\x00)\x01\x00\x00\x00\x00\x00\x00&\x01\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00%\x01\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\xcb\x00\x00\x00\x00\x00\x00\x00\xca\x00\x00\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x00\x00\x11\x01\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\xf6\x00\x00\x00\x00\x00\x00\x00\xe3\x00\x00\x00\x00\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00*\x01\x00\x00\x00\x00\x00\x00+\x01\x00\x00\x00\x00\x00\x00,\x01\x00\x00\x00\x00\x00\x00)\x01\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00\x00\x00\x00\x00%\x01\x00\x00\x00\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00&\x01\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x1f\x01\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00%\x01\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00*\x01\x00\x00\x00\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\xde\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00-\x01\x00\x00\x00\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00%\x01\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\xde\x00\x00\x00\x00\x00\x00\x00(\x01\x00\x00\x00\x00\x00\x00\xdd\x00\x00\x00\x00\x00\x00\x00(\x01\x00\x00\x00\x00\x00\x00\xde\x00\x00\x00\x00\x00\x00\x00-\x01\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00.\x01\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00/\x01\x00\x00\x00\x00\x00\x000\x01\x00\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x00\x00\x00\x00\x11\x01\x00\x00\x00\x00\x00\x00/\x01\x00\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x00\x00\x00\x00$\x01\x00\x00\x00\x00\x00\x00\x14\x01\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00.\x01\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\xec\x00\x00\x00\x00\x00\x00\x00j\x00\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00i\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00!\x01\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00\x00\x00\x00\x00\x1d\x01\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x00\x00.\x01\x00\x00\x00\x00\x00\x001\x01\x00\x00\x00\x00\x00\x00.\x01\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x00\x00\x1e\x01\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x00\x00\x00\x00\x002\x01\x00\x00\x00\x00\x00\x00\t\x01\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x05\x01\x00\x00\x00\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00!\x01\x00\x00\x00\x00\x00\x00\xd4\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00\x00\x00\x00\x00\x05\x01\x00\x00\x00\x00\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\xcb\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xcb\x00\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00!\x01\x00\x00\x00\x00\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00\x05\x01\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00,\x01\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00\x1e\x01\x00\x00\x00\x00\x00\x002\x01\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00,\x01\x00\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\r\x01\x00\x00\x00\x00\x00\x00\xf3\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00i\x00\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00 \x01\x00\x00\x00\x00\x00\x00u\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x00\x00\x00t\x00\x00\x00\x00\x00\x00\x00\x1f\x01\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x00-\x01\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\xd7\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00)\x01\x00\x00\x00\x00\x00\x00,\x01\x00\x00\x00\x00\x00\x00\x1b\x01\x00\x00\x00\x00\x00\x00,\x01\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x1b\x01\x00\x00\x00\x00\x00\x00\xd7\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\xe2\x00\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x00\x00\x00\x003\x01\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x00\x001\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\'\x01\x00\x00\x00\x00\x00\x00\xed\x00\x00\x00\x00\x00\x00\x00\'\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\t\x01\x00\x00\x00\x00\x00\x00\x07\x01\x00\x00\x00\x00\x00\x00\x08\x01\x00\x00\x00\x00\x00\x00\'\x01\x00\x00\x00\x00\x00\x00\x17\x01\x00\x00\x00\x00\x00\x00\xed\x00\x00\x00\x00\x00\x00\x00o\x00\x00\x00\x00\x00\x00\x00\x07\x01\x00\x00\x00\x00\x00\x00n\x00\x00\x00\x00\x00\x00\x004\x01\x00\x00\x00\x00\x00\x00\x0f\x01\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x004\x01\x00\x00\x00\x00\x00\x00(\x01\x00\x00\x00\x00\x00\x00/\x01\x00\x00\x00\x00\x00\x00(\x01\x00\x00\x00\x00\x00\x004\x01\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00-\x01\x00\x00\x00\x00\x00\x005\x01\x00\x00\x00\x00\x00\x00(\x01\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\x00\x00\x00\x00\t\x01\x00\x00\x00\x00\x00\x00\x08\x01\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\x00\x00\x00\x00\xe1\x00\x00\x00\x00\x00\x00\x00\t\x01\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00,\x01\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x005\x01\x00\x00\x00\x00\x00\x00-\x01\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00+\x01\x00\x00\x00\x00\x00\x00\x1e\x01\x00\x00\x00\x00\x00\x00+\x01\x00\x00\x00\x00\x00\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x1e\x01\x00\x00\x00\x00\x00\x00\xe1\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\t\x01\x00\x00\x00\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\xe2\x00\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00\x00\x00\x00\x00/\x01\x00\x00\x00\x00\x00\x005\x01\x00\x00\x00\x00\x00\x000\x01\x00\x00\x00\x00\x00\x00(\x01\x00\x00\x00\x00\x00\x005\x01\x00\x00\x00\x00\x00\x00/\x01\x00\x00\x00\x00\x00\x002\x01\x00\x00\x00\x00\x00\x00\x1f\x01\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00+\x01\x00\x00\x00\x00\x00\x00)\x01\x00\x00\x00\x00\x00\x00\x16\x01\x00\x00\x00\x00\x00\x00\x1d\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x05\x01\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00"\x01\x00\x00\x00\x00\x00\x000\x01\x00\x00\x00\x00\x00\x005\x01\x00\x00\x00\x00\x00\x00&\x01\x00\x00\x00\x00\x00\x005\x01\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00&\x01\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x005\x01\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x0f\x01\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00\xfc\x00\x00\x00\x00\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x00\x006\x01\x00\x00\x00\x00\x00\x00\xfc\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\xf4\x00\x00\x00\x00\x00\x00\x00\xd1\x00\x00\x00\x00\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00\xec\x00\x00\x00\x00\x00\x00\x00\xdb\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\xf3\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\xdb\x00\x00\x00\x00\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00&\x01\x00\x00\x00\x00\x00\x00\xe7\x00\x00\x00\x00\x00\x00\x000\x01\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\x00\x00\x00\x001\x01\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x00\x00\xe7\x00\x00\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x00\x00\x00\x000\x01\x00\x00\x00\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x00\x006\x01\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x00\x00\x00\x00.\x01\x00\x00\x00\x00\x00\x001\x01\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00q\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x006\x01\x00\x00\x00\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\xf3\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\xc6\x00\x00\x00\x00\x00\x00\x00+\x01\x00\x00\x00\x00\x00\x00\x16\x01\x00\x00\x00\x00\x00\x003\x01\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x00\x00\x00\x006\x01\x00\x00\x00\x00\x00\x003\x01\x00\x00\x00\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x00\x007\x01\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x00\x00\x00o\x00\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\x00\x00\x00\x00\xd2\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x00\x00\x00\n\x01\x00\x00\x00\x00\x00\x00\x08\x01\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00.\x01\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00,\x01\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\xf3\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x002\x01\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x004\x01\x00\x00\x00\x00\x00\x00/\x01\x00\x00\x00\x00\x00\x00\x11\x01\x00\x00\x00\x00\x00\x00\xe2\x00\x00\x00\x00\x00\x00\x003\x01\x00\x00\x00\x00\x00\x007\x01\x00\x00\x00\x00\x00\x00\xed\x00\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x0f\x01\x00\x00\x00\x00\x00\x004\x01\x00\x00\x00\x00\x00\x00\x11\x01\x00\x00\x00\x00\x00\x00\xf7\x00\x00\x00\x00\x00\x00\x00m\x00\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\xf4\x00\x00\x00\x00\x00\x00\x008\x01\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\xfc\x00\x00\x00\x00\x00\x00\x00q\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x008\x01\x00\x00\x00\x00\x00\x006\x01\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\x16\x01\x00\x00\x00\x00\x00\x00\x1b\x01\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00q\x00\x00\x00\x00\x00\x00\x00r\x00\x00\x00\x00\x00\x00\x006\x01\x00\x00\x00\x00\x00\x008\x01\x00\x00\x00\x00\x00\x00\xfc\x00\x00\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x00\x00\x15\x01\x00\x00\x00\x00\x00\x00\x11\x01\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x00\x00\x00\x001\x01\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x001\x01\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00\xf6\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\xf6\x00\x00\x00\x00\x00\x00\x00\xf4\x00\x00\x00\x00\x00\x00\x00\xf5\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00\xf5\x00\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\x00\x00\x00\x00\xf4\x00\x00\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00n\x00\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\x00\x00m\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x008\x01\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x008\x01\x00\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x1d\x01\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00s\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\x00\x00\x00\x00t\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00s\x00\x00\x00\x00\x00\x00\x00 \x01\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00 \x01\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00+\x01\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00+\x01\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00,\x01\x00\x00\x00\x00\x00\x00\x1f\x01\x00\x00\x00\x00\x00\x002\x01\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x00\x00"\x01\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00*\x01\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\xe3\x00\x00\x00\x00\x00\x00\x00*\x01\x00\x00\x00\x00\x00\x00 \x01\x00\x00\x00\x00\x00\x00\x1e\x01\x00\x00\x00\x00\x00\x00\xc6\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x00\x00*\x01\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00 \x01\x00\x00\x00\x00\x00\x00"\x01\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\xd4\x00\x00\x00\x00\x00\x00\x00"\x01\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\xe2\x00\x00\x00\x00\x00\x00\x007\x01\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x00\x007\x01\x00\x00\x00\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x00\x007\x01\x00\x00\x00\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00\x00\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x00\x003\x01\x00\x00\x00\x00\x00\x006\x01\x00\x00\x00\x00\x00\x009\x01\x00\x00\x00\x00\x00\x00;\x01\x00\x00\x00\x00\x00\x00:\x01\x00\x00\x00\x00\x00\x009\x01\x00\x00\x00\x00\x00\x00:\x01\x00\x00\x00\x00\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00<\x01\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00:\x01\x00\x00\x00\x00\x00\x00:\x01\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00=\x01\x00\x00\x00\x00\x00\x00?\x01\x00\x00\x00\x00\x00\x00>\x01\x00\x00\x00\x00\x00\x00=\x01\x00\x00\x00\x00\x00\x00>\x01\x00\x00\x00\x00\x00\x00@\x01\x00\x00\x00\x00\x00\x00A\x01\x00\x00\x00\x00\x00\x00C\x01\x00\x00\x00\x00\x00\x00B\x01\x00\x00\x00\x00\x00\x00D\x01\x00\x00\x00\x00\x00\x00F\x01\x00\x00\x00\x00\x00\x00E\x01\x00\x00\x00\x00\x00\x00G\x01\x00\x00\x00\x00\x00\x00I\x01\x00\x00\x00\x00\x00\x00H\x01\x00\x00\x00\x00\x00\x00B\x01\x00\x00\x00\x00\x00\x00C\x01\x00\x00\x00\x00\x00\x00J\x01\x00\x00\x00\x00\x00\x00G\x01\x00\x00\x00\x00\x00\x00H\x01\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00K\x01\x00\x00\x00\x00\x00\x00M\x01\x00\x00\x00\x00\x00\x00L\x01\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00<\x01\x00\x00\x00\x00\x00\x00G\x01\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00G\x01\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00K\x01\x00\x00\x00\x00\x00\x00L\x01\x00\x00\x00\x00\x00\x00N\x01\x00\x00\x00\x00\x00\x00O\x01\x00\x00\x00\x00\x00\x00Q\x01\x00\x00\x00\x00\x00\x00P\x01\x00\x00\x00\x00\x00\x00R\x01\x00\x00\x00\x00\x00\x00g\x00\x00\x00\x00\x00\x00\x00h\x00\x00\x00\x00\x00\x00\x00S\x01\x00\x00\x00\x00\x00\x00,\x00\x00\x00\x00\x00\x00\x00-\x00\x00\x00\x00\x00\x00\x00T\x01\x00\x00\x00\x00\x00\x00V\x01\x00\x00\x00\x00\x00\x00U\x01\x00\x00\x00\x00\x00\x00W\x01\x00\x00\x00\x00\x00\x00X\x01\x00\x00\x00\x00\x00\x00\'\x00\x00\x00\x00\x00\x00\x00Y\x01\x00\x00\x00\x00\x00\x00[\x01\x00\x00\x00\x00\x00\x00Z\x01\x00\x00\x00\x00\x00\x00\\\x01\x00\x00\x00\x00\x00\x00^\x01\x00\x00\x00\x00\x00\x00]\x01\x00\x00\x00\x00\x00\x00]\x01\x00\x00\x00\x00\x00\x00^\x01\x00\x00\x00\x00\x00\x00_\x01\x00\x00\x00\x00\x00\x00*\x00\x00\x00\x00\x00\x00\x00`\x01\x00\x00\x00\x00\x00\x00M\x01\x00\x00\x00\x00\x00\x00*\x00\x00\x00\x00\x00\x00\x00M\x01\x00\x00\x00\x00\x00\x00)\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00b\x01\x00\x00\x00\x00\x00\x00a\x01\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00a\x01\x00\x00\x00\x00\x00\x00-\x00\x00\x00\x00\x00\x00\x00c\x01\x00\x00\x00\x00\x00\x00e\x01\x00\x00\x00\x00\x00\x00d\x01\x00\x00\x00\x00\x00\x00;\x01\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x00\x00\x00\x00f\x01\x00\x00\x00\x00\x00\x00f\x01\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x00\x00\x00\x00%\x00\x00\x00\x00\x00\x00\x00g\x01\x00\x00\x00\x00\x00\x00]\x00\x00\x00\x00\x00\x00\x00h\x01\x00\x00\x00\x00\x00\x00h\x01\x00\x00\x00\x00\x00\x00]\x00\x00\x00\x00\x00\x00\x00^\x00\x00\x00\x00\x00\x00\x00`\x01\x00\x00\x00\x00\x00\x00j\x01\x00\x00\x00\x00\x00\x00i\x01\x00\x00\x00\x00\x00\x00`\x01\x00\x00\x00\x00\x00\x00i\x01\x00\x00\x00\x00\x00\x00k\x01\x00\x00\x00\x00\x00\x00f\x01\x00\x00\x00\x00\x00\x00%\x00\x00\x00\x00\x00\x00\x00l\x01\x00\x00\x00\x00\x00\x00l\x01\x00\x00\x00\x00\x00\x00%\x00\x00\x00\x00\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00l\x01\x00\x00\x00\x00\x00\x00m\x01\x00\x00\x00\x00\x00\x00f\x01\x00\x00\x00\x00\x00\x00c\x01\x00\x00\x00\x00\x00\x00d\x01\x00\x00\x00\x00\x00\x00\x8d\x00\x00\x00\x00\x00\x00\x00Z\x01\x00\x00\x00\x00\x00\x00[\x01\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\x00\x00\x00\'\x00\x00\x00\x00\x00\x00\x00X\x01\x00\x00\x00\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00?\x01\x00\x00\x00\x00\x00\x00=\x01\x00\x00\x00\x00\x00\x00n\x01\x00\x00\x00\x00\x00\x00]\x01\x00\x00\x00\x00\x00\x00p\x01\x00\x00\x00\x00\x00\x00o\x01\x00\x00\x00\x00\x00\x00j\x01\x00\x00\x00\x00\x00\x00q\x01\x00\x00\x00\x00\x00\x00i\x01\x00\x00\x00\x00\x00\x00r\x01\x00\x00\x00\x00\x00\x00^\x01\x00\x00\x00\x00\x00\x00s\x01\x00\x00\x00\x00\x00\x00t\x01\x00\x00\x00\x00\x00\x00B\x01\x00\x00\x00\x00\x00\x00u\x01\x00\x00\x00\x00\x00\x00i\x01\x00\x00\x00\x00\x00\x00q\x01\x00\x00\x00\x00\x00\x00v\x01\x00\x00\x00\x00\x00\x00X\x01\x00\x00\x00\x00\x00\x00Q\x01\x00\x00\x00\x00\x00\x00O\x01\x00\x00\x00\x00\x00\x00Q\x01\x00\x00\x00\x00\x00\x00X\x01\x00\x00\x00\x00\x00\x00W\x01\x00\x00\x00\x00\x00\x00w\x01\x00\x00\x00\x00\x00\x00y\x01\x00\x00\x00\x00\x00\x00x\x01\x00\x00\x00\x00\x00\x00C\x01\x00\x00\x00\x00\x00\x00g\x01\x00\x00\x00\x00\x00\x00z\x01\x00\x00\x00\x00\x00\x00{\x01\x00\x00\x00\x00\x00\x00?\x01\x00\x00\x00\x00\x00\x00|\x01\x00\x00\x00\x00\x00\x00|\x01\x00\x00\x00\x00\x00\x00?\x01\x00\x00\x00\x00\x00\x00n\x01\x00\x00\x00\x00\x00\x00y\x01\x00\x00\x00\x00\x00\x00~\x01\x00\x00\x00\x00\x00\x00}\x01\x00\x00\x00\x00\x00\x00w\x01\x00\x00\x00\x00\x00\x00x\x01\x00\x00\x00\x00\x00\x00f\x00\x00\x00\x00\x00\x00\x00\x7f\x01\x00\x00\x00\x00\x00\x00{\x01\x00\x00\x00\x00\x00\x00\\\x01\x00\x00\x00\x00\x00\x00\x7f\x01\x00\x00\x00\x00\x00\x00\\\x01\x00\x00\x00\x00\x00\x00o\x01\x00\x00\x00\x00\x00\x00=\x01\x00\x00\x00\x00\x00\x00@\x01\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00\x00\x00@\x01\x00\x00\x00\x00\x00\x00k\x01\x00\x00\x00\x00\x00\x00\x81\x01\x00\x00\x00\x00\x00\x00\x82\x01\x00\x00\x00\x00\x00\x00|\x01\x00\x00\x00\x00\x00\x00q\x01\x00\x00\x00\x00\x00\x00j\x01\x00\x00\x00\x00\x00\x00S\x01\x00\x00\x00\x00\x00\x00|\x01\x00\x00\x00\x00\x00\x00\x82\x01\x00\x00\x00\x00\x00\x00s\x01\x00\x00\x00\x00\x00\x00\x83\x01\x00\x00\x00\x00\x00\x00\x85\x01\x00\x00\x00\x00\x00\x00\x84\x01\x00\x00\x00\x00\x00\x00\x86\x01\x00\x00\x00\x00\x00\x00\x81\x01\x00\x00\x00\x00\x00\x00F\x01\x00\x00\x00\x00\x00\x00;\x01\x00\x00\x00\x00\x00\x00f\x01\x00\x00\x00\x00\x00\x00:\x01\x00\x00\x00\x00\x00\x00f\x01\x00\x00\x00\x00\x00\x00m\x01\x00\x00\x00\x00\x00\x00\x87\x01\x00\x00\x00\x00\x00\x00:\x01\x00\x00\x00\x00\x00\x00f\x01\x00\x00\x00\x00\x00\x00\x87\x01\x00\x00\x00\x00\x00\x00\x88\x01\x00\x00\x00\x00\x00\x00\x89\x01\x00\x00\x00\x00\x00\x00Y\x01\x00\x00\x00\x00\x00\x00\x86\x01\x00\x00\x00\x00\x00\x00F\x01\x00\x00\x00\x00\x00\x00\x8a\x01\x00\x00\x00\x00\x00\x00\x87\x01\x00\x00\x00\x00\x00\x00m\x01\x00\x00\x00\x00\x00\x00\x8b\x01\x00\x00\x00\x00\x00\x00\x87\x01\x00\x00\x00\x00\x00\x00\x8b\x01\x00\x00\x00\x00\x00\x00\x8c\x01\x00\x00\x00\x00\x00\x00u\x01\x00\x00\x00\x00\x00\x00B\x01\x00\x00\x00\x00\x00\x000\x00\x00\x00\x00\x00\x00\x00}\x01\x00\x00\x00\x00\x00\x00~\x01\x00\x00\x00\x00\x00\x00\x8d\x01\x00\x00\x00\x00\x00\x00P\x01\x00\x00\x00\x00\x00\x00Q\x01\x00\x00\x00\x00\x00\x00\x8e\x01\x00\x00\x00\x00\x00\x00Q\x01\x00\x00\x00\x00\x00\x00\x8f\x01\x00\x00\x00\x00\x00\x00\x8e\x01\x00\x00\x00\x00\x00\x00\x90\x01\x00\x00\x00\x00\x00\x00\x92\x01\x00\x00\x00\x00\x00\x00\x91\x01\x00\x00\x00\x00\x00\x00\x93\x01\x00\x00\x00\x00\x00\x00\x95\x01\x00\x00\x00\x00\x00\x00\x94\x01\x00\x00\x00\x00\x00\x00\x96\x01\x00\x00\x00\x00\x00\x00\x91\x01\x00\x00\x00\x00\x00\x00\x92\x01\x00\x00\x00\x00\x00\x00X\x01\x00\x00\x00\x00\x00\x00O\x01\x00\x00\x00\x00\x00\x00l\x01\x00\x00\x00\x00\x00\x00\x93\x01\x00\x00\x00\x00\x00\x00\x94\x01\x00\x00\x00\x00\x00\x00a\x00\x00\x00\x00\x00\x00\x00\x84\x01\x00\x00\x00\x00\x00\x00\x85\x01\x00\x00\x00\x00\x00\x00\x97\x01\x00\x00\x00\x00\x00\x00\x98\x01\x00\x00\x00\x00\x00\x00a\x01\x00\x00\x00\x00\x00\x00J\x01\x00\x00\x00\x00\x00\x00\x99\x01\x00\x00\x00\x00\x00\x00\x96\x01\x00\x00\x00\x00\x00\x00\x92\x01\x00\x00\x00\x00\x00\x00\x89\x01\x00\x00\x00\x00\x00\x00\x9a\x01\x00\x00\x00\x00\x00\x00\x93\x01\x00\x00\x00\x00\x00\x00\x89\x01\x00\x00\x00\x00\x00\x00\x93\x01\x00\x00\x00\x00\x00\x00b\x00\x00\x00\x00\x00\x00\x00\x9b\x01\x00\x00\x00\x00\x00\x00\x9d\x01\x00\x00\x00\x00\x00\x00\x9c\x01\x00\x00\x00\x00\x00\x00I\x01\x00\x00\x00\x00\x00\x00\x8c\x01\x00\x00\x00\x00\x00\x00\x9e\x01\x00\x00\x00\x00\x00\x00\x9e\x01\x00\x00\x00\x00\x00\x00\x8c\x01\x00\x00\x00\x00\x00\x00\x8b\x01\x00\x00\x00\x00\x00\x00\x9f\x01\x00\x00\x00\x00\x00\x00\xa0\x01\x00\x00\x00\x00\x00\x00\x94\x01\x00\x00\x00\x00\x00\x00\x94\x01\x00\x00\x00\x00\x00\x00\xa0\x01\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x91\x01\x00\x00\x00\x00\x00\x00\x96\x01\x00\x00\x00\x00\x00\x00p\x01\x00\x00\x00\x00\x00\x00\x84\x01\x00\x00\x00\x00\x00\x00\xa1\x01\x00\x00\x00\x00\x00\x00\xa0\x01\x00\x00\x00\x00\x00\x00m\x01\x00\x00\x00\x00\x00\x00P\x01\x00\x00\x00\x00\x00\x00\x8b\x01\x00\x00\x00\x00\x00\x00q\x01\x00\x00\x00\x00\x00\x00\xa2\x01\x00\x00\x00\x00\x00\x00v\x01\x00\x00\x00\x00\x00\x00S\x01\x00\x00\x00\x00\x00\x00a\x01\x00\x00\x00\x00\x00\x00\xa3\x01\x00\x00\x00\x00\x00\x00J\x01\x00\x00\x00\x00\x00\x00C\x01\x00\x00\x00\x00\x00\x00\xa4\x01\x00\x00\x00\x00\x00\x00J\x01\x00\x00\x00\x00\x00\x00\xa4\x01\x00\x00\x00\x00\x00\x00\x98\x01\x00\x00\x00\x00\x00\x00h\x01\x00\x00\x00\x00\x00\x00^\x00\x00\x00\x00\x00\x00\x00\xa1\x01\x00\x00\x00\x00\x00\x00\xa1\x01\x00\x00\x00\x00\x00\x00^\x00\x00\x00\x00\x00\x00\x00_\x00\x00\x00\x00\x00\x00\x00\x9c\x01\x00\x00\x00\x00\x00\x00\x9d\x01\x00\x00\x00\x00\x00\x00R\x01\x00\x00\x00\x00\x00\x00\xa5\x01\x00\x00\x00\x00\x00\x00p\x01\x00\x00\x00\x00\x00\x00\x96\x01\x00\x00\x00\x00\x00\x00_\x01\x00\x00\x00\x00\x00\x00\x91\x01\x00\x00\x00\x00\x00\x00p\x01\x00\x00\x00\x00\x00\x00\x9e\x01\x00\x00\x00\x00\x00\x00\x8b\x01\x00\x00\x00\x00\x00\x00\xa6\x01\x00\x00\x00\x00\x00\x00]\x01\x00\x00\x00\x00\x00\x00_\x01\x00\x00\x00\x00\x00\x00p\x01\x00\x00\x00\x00\x00\x00\xa3\x01\x00\x00\x00\x00\x00\x00a\x01\x00\x00\x00\x00\x00\x00\x98\x01\x00\x00\x00\x00\x00\x00\xa1\x01\x00\x00\x00\x00\x00\x00\x84\x01\x00\x00\x00\x00\x00\x00h\x01\x00\x00\x00\x00\x00\x00\x83\x01\x00\x00\x00\x00\x00\x00\xa7\x01\x00\x00\x00\x00\x00\x00\x86\x01\x00\x00\x00\x00\x00\x00\xa8\x01\x00\x00\x00\x00\x00\x00\x8a\x01\x00\x00\x00\x00\x00\x00\xa9\x01\x00\x00\x00\x00\x00\x00\x85\x01\x00\x00\x00\x00\x00\x00\x83\x01\x00\x00\x00\x00\x00\x00\xa8\x01\x00\x00\x00\x00\x00\x00\x86\x01\x00\x00\x00\x00\x00\x00\x8a\x01\x00\x00\x00\x00\x00\x00\x83\x01\x00\x00\x00\x00\x00\x00~\x01\x00\x00\x00\x00\x00\x00\x9d\x01\x00\x00\x00\x00\x00\x00\xaa\x01\x00\x00\x00\x00\x00\x00U\x01\x00\x00\x00\x00\x00\x00\xa6\x01\x00\x00\x00\x00\x00\x00\x8e\x01\x00\x00\x00\x00\x00\x00\xa8\x01\x00\x00\x00\x00\x00\x00\x83\x01\x00\x00\x00\x00\x00\x00\x8a\x01\x00\x00\x00\x00\x00\x00~\x01\x00\x00\x00\x00\x00\x00\xaa\x01\x00\x00\x00\x00\x00\x00\x8d\x01\x00\x00\x00\x00\x00\x00A\x01\x00\x00\x00\x00\x00\x00B\x01\x00\x00\x00\x00\x00\x00t\x01\x00\x00\x00\x00\x00\x00\x84\x01\x00\x00\x00\x00\x00\x00\x97\x01\x00\x00\x00\x00\x00\x00h\x01\x00\x00\x00\x00\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\xad\x01\x00\x00\x00\x00\x00\x00\xac\x01\x00\x00\x00\x00\x00\x00\xae\x01\x00\x00\x00\x00\x00\x00\xac\x01\x00\x00\x00\x00\x00\x00\xad\x01\x00\x00\x00\x00\x00\x00\xaf\x01\x00\x00\x00\x00\x00\x00\xb1\x01\x00\x00\x00\x00\x00\x00\xb0\x01\x00\x00\x00\x00\x00\x00\xae\x01\x00\x00\x00\x00\x00\x00\xb2\x01\x00\x00\x00\x00\x00\x00\xac\x01\x00\x00\x00\x00\x00\x00/\x00\x00\x00\x00\x00\x00\x00B\x01\x00\x00\x00\x00\x00\x00b\x01\x00\x00\x00\x00\x00\x00/\x00\x00\x00\x00\x00\x00\x00b\x01\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00\x00\x00\x00\x00M\x01\x00\x00\x00\x00\x00\x00\xb3\x01\x00\x00\x00\x00\x00\x00w\x01\x00\x00\x00\x00\x00\x00g\x00\x00\x00\x00\x00\x00\x00R\x01\x00\x00\x00\x00\x00\x00R\x01\x00\x00\x00\x00\x00\x00\x9d\x01\x00\x00\x00\x00\x00\x00w\x01\x00\x00\x00\x00\x00\x00w\x01\x00\x00\x00\x00\x00\x00\x9d\x01\x00\x00\x00\x00\x00\x00~\x01\x00\x00\x00\x00\x00\x00y\x01\x00\x00\x00\x00\x00\x00w\x01\x00\x00\x00\x00\x00\x00~\x01\x00\x00\x00\x00\x00\x00\x89\x01\x00\x00\x00\x00\x00\x00\x88\x01\x00\x00\x00\x00\x00\x00\x9a\x01\x00\x00\x00\x00\x00\x00H\x01\x00\x00\x00\x00\x00\x00c\x01\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x00\x00\xa7\x01\x00\x00\x00\x00\x00\x00\x95\x01\x00\x00\x00\x00\x00\x00\xb4\x01\x00\x00\x00\x00\x00\x00\xb5\x01\x00\x00\x00\x00\x00\x00\xb6\x01\x00\x00\x00\x00\x00\x00Y\x01\x00\x00\x00\x00\x00\x00\x9a\x01\x00\x00\x00\x00\x00\x00\xb4\x01\x00\x00\x00\x00\x00\x00\x95\x01\x00\x00\x00\x00\x00\x00\xa7\x01\x00\x00\x00\x00\x00\x00\xb4\x01\x00\x00\x00\x00\x00\x00\xb7\x01\x00\x00\x00\x00\x00\x00\xa8\x01\x00\x00\x00\x00\x00\x00\xa9\x01\x00\x00\x00\x00\x00\x00\xb8\x01\x00\x00\x00\x00\x00\x00E\x01\x00\x00\x00\x00\x00\x00v\x01\x00\x00\x00\x00\x00\x00D\x01\x00\x00\x00\x00\x00\x00\xa9\x01\x00\x00\x00\x00\x00\x00\xa2\x01\x00\x00\x00\x00\x00\x00\xb8\x01\x00\x00\x00\x00\x00\x00v\x01\x00\x00\x00\x00\x00\x00\xa2\x01\x00\x00\x00\x00\x00\x00D\x01\x00\x00\x00\x00\x00\x00)\x00\x00\x00\x00\x00\x00\x00\xb3\x01\x00\x00\x00\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x00\x9e\x01\x00\x00\x00\x00\x00\x00\xb1\x01\x00\x00\x00\x00\x00\x00\xb9\x01\x00\x00\x00\x00\x00\x00\xaf\x01\x00\x00\x00\x00\x00\x00\xba\x01\x00\x00\x00\x00\x00\x00e\x01\x00\x00\x00\x00\x00\x00\xba\x01\x00\x00\x00\x00\x00\x00\xaf\x01\x00\x00\x00\x00\x00\x00\xbb\x01\x00\x00\x00\x00\x00\x00\xa2\x01\x00\x00\x00\x00\x00\x00\xa9\x01\x00\x00\x00\x00\x00\x00D\x01\x00\x00\x00\x00\x00\x000\x00\x00\x00\x00\x00\x00\x00B\x01\x00\x00\x00\x00\x00\x00/\x00\x00\x00\x00\x00\x00\x00\xa9\x01\x00\x00\x00\x00\x00\x00\x8a\x01\x00\x00\x00\x00\x00\x00D\x01\x00\x00\x00\x00\x00\x00\x8c\x01\x00\x00\x00\x00\x00\x00<\x01\x00\x00\x00\x00\x00\x00\x87\x01\x00\x00\x00\x00\x00\x00G\x01\x00\x00\x00\x00\x00\x00<\x01\x00\x00\x00\x00\x00\x00\x8c\x01\x00\x00\x00\x00\x00\x00:\x01\x00\x00\x00\x00\x00\x00\x87\x01\x00\x00\x00\x00\x00\x00<\x01\x00\x00\x00\x00\x00\x00\xaf\x01\x00\x00\x00\x00\x00\x00\xb0\x01\x00\x00\x00\x00\x00\x00\xbb\x01\x00\x00\x00\x00\x00\x00\x9c\x01\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00A\x01\x00\x00\x00\x00\x00\x00g\x01\x00\x00\x00\x00\x00\x00C\x01\x00\x00\x00\x00\x00\x00\xa6\x01\x00\x00\x00\x00\x00\x00P\x01\x00\x00\x00\x00\x00\x00\x8e\x01\x00\x00\x00\x00\x00\x00m\x01\x00\x00\x00\x00\x00\x00O\x01\x00\x00\x00\x00\x00\x00P\x01\x00\x00\x00\x00\x00\x00P\x01\x00\x00\x00\x00\x00\x00\xa6\x01\x00\x00\x00\x00\x00\x00\x8b\x01\x00\x00\x00\x00\x00\x00;\x01\x00\x00\x00\x00\x00\x009\x01\x00\x00\x00\x00\x00\x00#\x00\x00\x00\x00\x00\x00\x00\xbc\x01\x00\x00\x00\x00\x00\x00\xaa\x01\x00\x00\x00\x00\x00\x00\x9b\x01\x00\x00\x00\x00\x00\x00\x9b\x01\x00\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\xbc\x01\x00\x00\x00\x00\x00\x00\x9b\x01\x00\x00\x00\x00\x00\x00\x9c\x01\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00\xaa\x01\x00\x00\x00\x00\x00\x00\xbc\x01\x00\x00\x00\x00\x00\x00\x8d\x01\x00\x00\x00\x00\x00\x00\xbc\x01\x00\x00\x00\x00\x00\x00\xbd\x01\x00\x00\x00\x00\x00\x00\x8d\x01\x00\x00\x00\x00\x00\x00\xb9\x01\x00\x00\x00\x00\x00\x00\xb1\x01\x00\x00\x00\x00\x00\x00\xaf\x01\x00\x00\x00\x00\x00\x00I\x01\x00\x00\x00\x00\x00\x00e\x01\x00\x00\x00\x00\x00\x00H\x01\x00\x00\x00\x00\x00\x00c\x01\x00\x00\x00\x00\x00\x00H\x01\x00\x00\x00\x00\x00\x00e\x01\x00\x00\x00\x00\x00\x00I\x01\x00\x00\x00\x00\x00\x00G\x01\x00\x00\x00\x00\x00\x00\x8c\x01\x00\x00\x00\x00\x00\x00I\x01\x00\x00\x00\x00\x00\x00\xb9\x01\x00\x00\x00\x00\x00\x00e\x01\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x00\x00\x00\x00;\x01\x00\x00\x00\x00\x00\x00#\x00\x00\x00\x00\x00\x00\x00U\x01\x00\x00\x00\x00\x00\x00V\x01\x00\x00\x00\x00\x00\x00\xb1\x01\x00\x00\x00\x00\x00\x00\xb1\x01\x00\x00\x00\x00\x00\x00V\x01\x00\x00\x00\x00\x00\x00\xb0\x01\x00\x00\x00\x00\x00\x00\xb0\x01\x00\x00\x00\x00\x00\x00V\x01\x00\x00\x00\x00\x00\x00\x7f\x01\x00\x00\x00\x00\x00\x00V\x01\x00\x00\x00\x00\x00\x00\xbe\x01\x00\x00\x00\x00\x00\x00\x7f\x01\x00\x00\x00\x00\x00\x00r\x01\x00\x00\x00\x00\x00\x00\xae\x01\x00\x00\x00\x00\x00\x00^\x01\x00\x00\x00\x00\x00\x00_\x01\x00\x00\x00\x00\x00\x00^\x01\x00\x00\x00\x00\x00\x00\xae\x01\x00\x00\x00\x00\x00\x00r\x01\x00\x00\x00\x00\x00\x00\xb2\x01\x00\x00\x00\x00\x00\x00\xae\x01\x00\x00\x00\x00\x00\x00\xb9\x01\x00\x00\x00\x00\x00\x00I\x01\x00\x00\x00\x00\x00\x00\x9e\x01\x00\x00\x00\x00\x00\x00\xb6\x01\x00\x00\x00\x00\x00\x00\xb5\x01\x00\x00\x00\x00\x00\x00\xac\x01\x00\x00\x00\x00\x00\x00\xb9\x01\x00\x00\x00\x00\x00\x00\xaf\x01\x00\x00\x00\x00\x00\x00e\x01\x00\x00\x00\x00\x00\x00\xa7\x01\x00\x00\x00\x00\x00\x00\xb7\x01\x00\x00\x00\x00\x00\x00\x86\x01\x00\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\x9b\x01\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00R\x01\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x9c\x01\x00\x00\x00\x00\x00\x00<\x01\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00R\x01\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00R\x01\x00\x00\x00\x00\x00\x00h\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\xbe\x01\x00\x00\x00\x00\x00\x00>\x01\x00\x00\x00\x00\x00\x00?\x01\x00\x00\x00\x00\x00\x00@\x01\x00\x00\x00\x00\x00\x00>\x01\x00\x00\x00\x00\x00\x00\xbf\x01\x00\x00\x00\x00\x00\x00>\x01\x00\x00\x00\x00\x00\x00\xbe\x01\x00\x00\x00\x00\x00\x00\xbf\x01\x00\x00\x00\x00\x00\x00O\x01\x00\x00\x00\x00\x00\x00m\x01\x00\x00\x00\x00\x00\x00l\x01\x00\x00\x00\x00\x00\x00e\x00\x00\x00\x00\x00\x00\x00Z\x01\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\x00\x00\x00\x91\x01\x00\x00\x00\x00\x00\x00_\x01\x00\x00\x00\x00\x00\x00\xad\x01\x00\x00\x00\x00\x00\x00\xaa\x01\x00\x00\x00\x00\x00\x00\x9d\x01\x00\x00\x00\x00\x00\x00\x9b\x01\x00\x00\x00\x00\x00\x00\x96\x01\x00\x00\x00\x00\x00\x00\x99\x01\x00\x00\x00\x00\x00\x00\xc0\x01\x00\x00\x00\x00\x00\x00\x99\x01\x00\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x00\x00\x00\x00\xc0\x01\x00\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x99\x01\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\xbc\x01\x00\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\xa4\x01\x00\x00\x00\x00\x00\x00z\x01\x00\x00\x00\x00\x00\x00\xb8\x01\x00\x00\x00\x00\x00\x00\x98\x01\x00\x00\x00\x00\x00\x00\xa4\x01\x00\x00\x00\x00\x00\x00\xb8\x01\x00\x00\x00\x00\x00\x00z\x01\x00\x00\x00\x00\x00\x00\xa4\x01\x00\x00\x00\x00\x00\x00C\x01\x00\x00\x00\x00\x00\x00\xb8\x01\x00\x00\x00\x00\x00\x00\xa2\x01\x00\x00\x00\x00\x00\x00\x98\x01\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\xbd\x01\x00\x00\x00\x00\x00\x00\xbc\x01\x00\x00\x00\x00\x00\x00\xac\x01\x00\x00\x00\x00\x00\x00\xb5\x01\x00\x00\x00\x00\x00\x00}\x01\x00\x00\x00\x00\x00\x00\xac\x01\x00\x00\x00\x00\x00\x00}\x01\x00\x00\x00\x00\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\xad\x01\x00\x00\x00\x00\x00\x00\x90\x01\x00\x00\x00\x00\x00\x00\x91\x01\x00\x00\x00\x00\x00\x009\x01\x00\x00\x00\x00\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00#\x00\x00\x00\x00\x00\x00\x009\x01\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xb8\x01\x00\x00\x00\x00\x00\x00z\x01\x00\x00\x00\x00\x00\x00\xa8\x01\x00\x00\x00\x00\x00\x00\xb7\x01\x00\x00\x00\x00\x00\x00\xb4\x01\x00\x00\x00\x00\x00\x00\x82\x01\x00\x00\x00\x00\x00\x00\xb2\x01\x00\x00\x00\x00\x00\x00\xb6\x01\x00\x00\x00\x00\x00\x00\xac\x01\x00\x00\x00\x00\x00\x00\x84\x01\x00\x00\x00\x00\x00\x00\xa0\x01\x00\x00\x00\x00\x00\x00\x9f\x01\x00\x00\x00\x00\x00\x00g\x00\x00\x00\x00\x00\x00\x00w\x01\x00\x00\x00\x00\x00\x00f\x00\x00\x00\x00\x00\x00\x00\x88\x01\x00\x00\x00\x00\x00\x00\xb6\x01\x00\x00\x00\x00\x00\x00\xc1\x01\x00\x00\x00\x00\x00\x00\xb4\x01\x00\x00\x00\x00\x00\x00\x9a\x01\x00\x00\x00\x00\x00\x00\xc1\x01\x00\x00\x00\x00\x00\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x9a\x01\x00\x00\x00\x00\x00\x00\x88\x01\x00\x00\x00\x00\x00\x00H\x01\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00\xb6\x01\x00\x00\x00\x00\x00\x00\xb2\x01\x00\x00\x00\x00\x00\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00d\x01\x00\x00\x00\x00\x00\x00\xc0\x01\x00\x00\x00\x00\x00\x00T\x01\x00\x00\x00\x00\x00\x00\x8f\x01\x00\x00\x00\x00\x00\x00\xbf\x01\x00\x00\x00\x00\x00\x00\xbe\x01\x00\x00\x00\x00\x00\x00V\x01\x00\x00\x00\x00\x00\x00T\x01\x00\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\xc0\x01\x00\x00\x00\x00\x00\x00\x8f\x01\x00\x00\x00\x00\x00\x00K\x01\x00\x00\x00\x00\x00\x00N\x01\x00\x00\x00\x00\x00\x00\xbe\x01\x00\x00\x00\x00\x00\x00T\x01\x00\x00\x00\x00\x00\x00\xbf\x01\x00\x00\x00\x00\x00\x00Z\x01\x00\x00\x00\x00\x00\x00\xb5\x01\x00\x00\x00\x00\x00\x00Y\x01\x00\x00\x00\x00\x00\x00\xb5\x01\x00\x00\x00\x00\x00\x00y\x01\x00\x00\x00\x00\x00\x00}\x01\x00\x00\x00\x00\x00\x00k\x01\x00\x00\x00\x00\x00\x00@\x01\x00\x00\x00\x00\x00\x00N\x01\x00\x00\x00\x00\x00\x00y\x01\x00\x00\x00\x00\x00\x00\xb5\x01\x00\x00\x00\x00\x00\x00Z\x01\x00\x00\x00\x00\x00\x00g\x01\x00\x00\x00\x00\x00\x00A\x01\x00\x00\x00\x00\x00\x00]\x00\x00\x00\x00\x00\x00\x00\\\x00\x00\x00\x00\x00\x00\x00t\x01\x00\x00\x00\x00\x00\x00[\x00\x00\x00\x00\x00\x00\x00t\x01\x00\x00\x00\x00\x00\x00\\\x00\x00\x00\x00\x00\x00\x00A\x01\x00\x00\x00\x00\x00\x00A\x01\x00\x00\x00\x00\x00\x00\\\x00\x00\x00\x00\x00\x00\x00]\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00\x00\x00v\x01\x00\x00\x00\x00\x00\x00E\x01\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00\x00\x00E\x01\x00\x00\x00\x00\x00\x00=\x01\x00\x00\x00\x00\x00\x00\x9f\x01\x00\x00\x00\x00\x00\x00\x94\x01\x00\x00\x00\x00\x00\x00\x95\x01\x00\x00\x00\x00\x00\x00a\x00\x00\x00\x00\x00\x00\x00\x94\x01\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x83\x01\x00\x00\x00\x00\x00\x00\x84\x01\x00\x00\x00\x00\x00\x00\x9f\x01\x00\x00\x00\x00\x00\x00`\x01\x00\x00\x00\x00\x00\x00*\x00\x00\x00\x00\x00\x00\x00+\x00\x00\x00\x00\x00\x00\x00\xc2\x01\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x00\x00\x92\x01\x00\x00\x00\x00\x00\x00\xc2\x01\x00\x00\x00\x00\x00\x00\xbd\x01\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\'\x00\x00\x00\x00\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x00W\x01\x00\x00\x00\x00\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\xc3\x01\x00\x00\x00\x00\x00\x00\xad\x01\x00\x00\x00\x00\x00\x00\xbd\x01\x00\x00\x00\x00\x00\x00\xc2\x01\x00\x00\x00\x00\x00\x00\x92\x01\x00\x00\x00\x00\x00\x00\xc3\x01\x00\x00\x00\x00\x00\x00\x90\x01\x00\x00\x00\x00\x00\x00\xad\x01\x00\x00\x00\x00\x00\x00\xa7\x01\x00\x00\x00\x00\x00\x00\x9f\x01\x00\x00\x00\x00\x00\x00\x95\x01\x00\x00\x00\x00\x00\x00\x88\x01\x00\x00\x00\x00\x00\x00Y\x01\x00\x00\x00\x00\x00\x00\xb6\x01\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x00\x00\xc2\x01\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\xb7\x01\x00\x00\x00\x00\x00\x00\x82\x01\x00\x00\x00\x00\x00\x00\x81\x01\x00\x00\x00\x00\x00\x00+\x00\x00\x00\x00\x00\x00\x00j\x01\x00\x00\x00\x00\x00\x00`\x01\x00\x00\x00\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00X\x01\x00\x00\x00\x00\x00\x00l\x01\x00\x00\x00\x00\x00\x00\xa5\x01\x00\x00\x00\x00\x00\x00\xc0\x01\x00\x00\x00\x00\x00\x00d\x01\x00\x00\x00\x00\x00\x00\xa5\x01\x00\x00\x00\x00\x00\x00d\x01\x00\x00\x00\x00\x00\x00\xba\x01\x00\x00\x00\x00\x00\x00\x82\x01\x00\x00\x00\x00\x00\x00\xc1\x01\x00\x00\x00\x00\x00\x00r\x01\x00\x00\x00\x00\x00\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x82\x01\x00\x00\x00\x00\x00\x00\xb4\x01\x00\x00\x00\x00\x00\x00\x7f\x01\x00\x00\x00\x00\x00\x00o\x01\x00\x00\x00\x00\x00\x00\xb0\x01\x00\x00\x00\x00\x00\x00\x7f\x01\x00\x00\x00\x00\x00\x00\xbe\x01\x00\x00\x00\x00\x00\x00{\x01\x00\x00\x00\x00\x00\x00\xbd\x01\x00\x00\x00\x00\x00\x00\x92\x01\x00\x00\x00\x00\x00\x00\x90\x01\x00\x00\x00\x00\x00\x00\xba\x01\x00\x00\x00\x00\x00\x00d\x01\x00\x00\x00\x00\x00\x00e\x01\x00\x00\x00\x00\x00\x00\x8d\x00\x00\x00\x00\x00\x00\x00d\x01\x00\x00\x00\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\xc1\x01\x00\x00\x00\x00\x00\x00\xb2\x01\x00\x00\x00\x00\x00\x00r\x01\x00\x00\x00\x00\x00\x00\x92\x01\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x99\x01\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x92\x01\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x00\x00\xc3\x01\x00\x00\x00\x00\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x8d\x01\x00\x00\x00\x00\x00\x00\xc3\x01\x00\x00\x00\x00\x00\x00\xbd\x01\x00\x00\x00\x00\x00\x00\x90\x01\x00\x00\x00\x00\x00\x00E\x01\x00\x00\x00\x00\x00\x00n\x01\x00\x00\x00\x00\x00\x00=\x01\x00\x00\x00\x00\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00}\x01\x00\x00\x00\x00\x00\x00\x8d\x01\x00\x00\x00\x00\x00\x00U\x01\x00\x00\x00\x00\x00\x00\xb1\x01\x00\x00\x00\x00\x00\x00\xa6\x01\x00\x00\x00\x00\x00\x00n\x01\x00\x00\x00\x00\x00\x00E\x01\x00\x00\x00\x00\x00\x00F\x01\x00\x00\x00\x00\x00\x00\xbd\x01\x00\x00\x00\x00\x00\x00\xc3\x01\x00\x00\x00\x00\x00\x00\x8d\x01\x00\x00\x00\x00\x00\x00-\x00\x00\x00\x00\x00\x00\x00a\x01\x00\x00\x00\x00\x00\x00S\x01\x00\x00\x00\x00\x00\x00\x8f\x01\x00\x00\x00\x00\x00\x00T\x01\x00\x00\x00\x00\x00\x00\x8e\x01\x00\x00\x00\x00\x00\x00T\x01\x00\x00\x00\x00\x00\x00U\x01\x00\x00\x00\x00\x00\x00\x8e\x01\x00\x00\x00\x00\x00\x00]\x01\x00\x00\x00\x00\x00\x00o\x01\x00\x00\x00\x00\x00\x00\\\x01\x00\x00\x00\x00\x00\x00J\x01\x00\x00\x00\x00\x00\x00a\x01\x00\x00\x00\x00\x00\x00b\x01\x00\x00\x00\x00\x00\x00u\x01\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00[\x00\x00\x00\x00\x00\x00\x00j\x01\x00\x00\x00\x00\x00\x00+\x00\x00\x00\x00\x00\x00\x00,\x00\x00\x00\x00\x00\x00\x00g\x01\x00\x00\x00\x00\x00\x00\x97\x01\x00\x00\x00\x00\x00\x00z\x01\x00\x00\x00\x00\x00\x00\xbf\x01\x00\x00\x00\x00\x00\x00N\x01\x00\x00\x00\x00\x00\x00@\x01\x00\x00\x00\x00\x00\x00N\x01\x00\x00\x00\x00\x00\x00\xbf\x01\x00\x00\x00\x00\x00\x00\x8f\x01\x00\x00\x00\x00\x00\x00t\x01\x00\x00\x00\x00\x00\x00u\x01\x00\x00\x00\x00\x00\x00[\x00\x00\x00\x00\x00\x00\x00\xa7\x01\x00\x00\x00\x00\x00\x00\x83\x01\x00\x00\x00\x00\x00\x00\x9f\x01\x00\x00\x00\x00\x00\x00\x97\x01\x00\x00\x00\x00\x00\x00g\x01\x00\x00\x00\x00\x00\x00h\x01\x00\x00\x00\x00\x00\x00r\x01\x00\x00\x00\x00\x00\x00s\x01\x00\x00\x00\x00\x00\x00\x82\x01\x00\x00\x00\x00\x00\x00c\x00\x00\x00\x00\x00\x00\x00\x89\x01\x00\x00\x00\x00\x00\x00b\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00u\x01\x00\x00\x00\x00\x00\x000\x00\x00\x00\x00\x00\x00\x00\xb3\x01\x00\x00\x00\x00\x00\x00K\x01\x00\x00\x00\x00\x00\x00W\x01\x00\x00\x00\x00\x00\x00\x85\x01\x00\x00\x00\x00\x00\x00z\x01\x00\x00\x00\x00\x00\x00\x97\x01\x00\x00\x00\x00\x00\x00x\x01\x00\x00\x00\x00\x00\x00Z\x01\x00\x00\x00\x00\x00\x00e\x00\x00\x00\x00\x00\x00\x00o\x01\x00\x00\x00\x00\x00\x00p\x01\x00\x00\x00\x00\x00\x00\xbb\x01\x00\x00\x00\x00\x00\x00p\x01\x00\x00\x00\x00\x00\x00\xa5\x01\x00\x00\x00\x00\x00\x00\xbb\x01\x00\x00\x00\x00\x00\x00D\x01\x00\x00\x00\x00\x00\x00\x8a\x01\x00\x00\x00\x00\x00\x00F\x01\x00\x00\x00\x00\x00\x00K\x01\x00\x00\x00\x00\x00\x00\xb3\x01\x00\x00\x00\x00\x00\x00M\x01\x00\x00\x00\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x00\xb3\x01\x00\x00\x00\x00\x00\x00W\x01\x00\x00\x00\x00\x00\x00z\x01\x00\x00\x00\x00\x00\x00\x85\x01\x00\x00\x00\x00\x00\x00\xa8\x01\x00\x00\x00\x00\x00\x00\x93\x01\x00\x00\x00\x00\x00\x00a\x00\x00\x00\x00\x00\x00\x00b\x00\x00\x00\x00\x00\x00\x00\xbe\x01\x00\x00\x00\x00\x00\x00?\x01\x00\x00\x00\x00\x00\x00{\x01\x00\x00\x00\x00\x00\x00|\x01\x00\x00\x00\x00\x00\x00n\x01\x00\x00\x00\x00\x00\x00\x81\x01\x00\x00\x00\x00\x00\x00|\x01\x00\x00\x00\x00\x00\x00s\x01\x00\x00\x00\x00\x00\x00{\x01\x00\x00\x00\x00\x00\x00_\x01\x00\x00\x00\x00\x00\x00\xae\x01\x00\x00\x00\x00\x00\x00\xad\x01\x00\x00\x00\x00\x00\x00\x93\x01\x00\x00\x00\x00\x00\x00\x9a\x01\x00\x00\x00\x00\x00\x00\x95\x01\x00\x00\x00\x00\x00\x00L\x01\x00\x00\x00\x00\x00\x00`\x01\x00\x00\x00\x00\x00\x00k\x01\x00\x00\x00\x00\x00\x00Z\x01\x00\x00\x00\x00\x00\x00x\x01\x00\x00\x00\x00\x00\x00y\x01\x00\x00\x00\x00\x00\x00\xc0\x01\x00\x00\x00\x00\x00\x00\xa5\x01\x00\x00\x00\x00\x00\x00\x96\x01\x00\x00\x00\x00\x00\x00f\x00\x00\x00\x00\x00\x00\x00x\x01\x00\x00\x00\x00\x00\x00e\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\xa0\x01\x00\x00\x00\x00\x00\x00_\x00\x00\x00\x00\x00\x00\x00`\x01\x00\x00\x00\x00\x00\x00L\x01\x00\x00\x00\x00\x00\x00M\x01\x00\x00\x00\x00\x00\x00N\x01\x00\x00\x00\x00\x00\x00L\x01\x00\x00\x00\x00\x00\x00k\x01\x00\x00\x00\x00\x00\x00\xa1\x01\x00\x00\x00\x00\x00\x00_\x00\x00\x00\x00\x00\x00\x00\xa0\x01\x00\x00\x00\x00\x00\x00s\x01\x00\x00\x00\x00\x00\x00^\x01\x00\x00\x00\x00\x00\x00\\\x01\x00\x00\x00\x00\x00\x00\xba\x01\x00\x00\x00\x00\x00\x00\xbb\x01\x00\x00\x00\x00\x00\x00\xa5\x01\x00\x00\x00\x00\x00\x00o\x01\x00\x00\x00\x00\x00\x00\xbb\x01\x00\x00\x00\x00\x00\x00\xb0\x01\x00\x00\x00\x00\x00\x00s\x01\x00\x00\x00\x00\x00\x00\\\x01\x00\x00\x00\x00\x00\x00{\x01\x00\x00\x00\x00\x00\x00c\x00\x00\x00\x00\x00\x00\x00[\x01\x00\x00\x00\x00\x00\x00\x89\x01\x00\x00\x00\x00\x00\x00\x86\x01\x00\x00\x00\x00\x00\x00\xb7\x01\x00\x00\x00\x00\x00\x00\x81\x01\x00\x00\x00\x00\x00\x00c\x01\x00\x00\x00\x00\x00\x00\x8d\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x00\x00\x9e\x01\x00\x00\x00\x00\x00\x00\xa6\x01\x00\x00\x00\x00\x00\x00\xb1\x01\x00\x00\x00\x00\x00\x00[\x01\x00\x00\x00\x00\x00\x00Y\x01\x00\x00\x00\x00\x00\x00\x89\x01\x00\x00\x00\x00\x00\x00[\x01\x00\x00\x00\x00\x00\x00c\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\x00\x00\x00n\x01\x00\x00\x00\x00\x00\x00F\x01\x00\x00\x00\x00\x00\x00\x81\x01\x00\x00\x00\x00\x00\x00b\x01\x00\x00\x00\x00\x00\x00B\x01\x00\x00\x00\x00\x00\x00J\x01\x00\x00\x00\x00\x00\x00j\x01\x00\x00\x00\x00\x00\x00,\x00\x00\x00\x00\x00\x00\x00S\x01\x00\x00\x00\x00\x00\x00S\x01\x00\x00\x00\x00\x00\x00\xa3\x01\x00\x00\x00\x00\x00\x00q\x01\x00\x00\x00\x00\x00\x00\xa3\x01\x00\x00\x00\x00\x00\x00\xa2\x01\x00\x00\x00\x00\x00\x00q\x01\x00\x00\x00\x00\x00\x00i\x01\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00\x00\x00k\x01\x00\x00\x00\x00\x00\x00Q\x01\x00\x00\x00\x00\x00\x00K\x01\x00\x00\x00\x00\x00\x00\x8f\x01\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00\x00\x00i\x01\x00\x00\x00\x00\x00\x00v\x01\x00\x00\x00\x00\x00\x00\xa2\x01\x00\x00\x00\x00\x00\x00\xa3\x01\x00\x00\x00\x00\x00\x00\x98\x01\x00\x00\x00\x00\x00\x00K\x01\x00\x00\x00\x00\x00\x00Q\x01\x00\x00\x00\x00\x00\x00W\x01\x00\x00\x00\x00\x00\x00\xc4\x01\x00\x00\x00\x00\x00\x00\xc6\x01\x00\x00\x00\x00\x00\x00\xc5\x01\x00\x00\x00\x00\x00\x00\xc5\x01\x00\x00\x00\x00\x00\x00\xc6\x01\x00\x00\x00\x00\x00\x00k\x00\x00\x00\x00\x00\x00\x00\xc5\x01\x00\x00\x00\x00\x00\x00k\x00\x00\x00\x00\x00\x00\x00j\x00\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\xc8\x01\x00\x00\x00\x00\x00\x00\xc7\x01\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\xc7\x01\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\xc9\x01\x00\x00\x00\x00\x00\x00\xca\x01\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\xcb\x01\x00\x00\x00\x00\x00\x00\xcd\x01\x00\x00\x00\x00\x00\x00\xcc\x01\x00\x00\x00\x00\x00\x00l\x00\x00\x00\x00\x00\x00\x00\xc6\x01\x00\x00\x00\x00\x00\x00\xce\x01\x00\x00\x00\x00\x00\x00l\x00\x00\x00\x00\x00\x00\x00\xce\x01\x00\x00\x00\x00\x00\x00m\x00\x00\x00\x00\x00\x00\x00\xc7\x01\x00\x00\x00\x00\x00\x00\xd0\x01\x00\x00\x00\x00\x00\x00\xcf\x01\x00\x00\x00\x00\x00\x00\xcf\x01\x00\x00\x00\x00\x00\x00\xd0\x01\x00\x00\x00\x00\x00\x00\xd1\x01\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\xca\x01\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x00\x00\x00\x00\xd3\x01\x00\x00\x00\x00\x00\x00\x82\x00\x00\x00\x00\x00\x00\x00\xd4\x01\x00\x00\x00\x00\x00\x00\xd4\x01\x00\x00\x00\x00\x00\x00\x82\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x00\x00\x00\x00\xd5\x01\x00\x00\x00\x00\x00\x00\xd7\x01\x00\x00\x00\x00\x00\x00\xd6\x01\x00\x00\x00\x00\x00\x00\xd8\x01\x00\x00\x00\x00\x00\x00\xda\x01\x00\x00\x00\x00\x00\x00\xd9\x01\x00\x00\x00\x00\x00\x00\xd9\x01\x00\x00\x00\x00\x00\x00\xda\x01\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\x00\x00\x00\x00\xdc\x01\x00\x00\x00\x00\x00\x00\xcf\x01\x00\x00\x00\x00\x00\x00\xd1\x01\x00\x00\x00\x00\x00\x00\xdc\x01\x00\x00\x00\x00\x00\x00\xd1\x01\x00\x00\x00\x00\x00\x00\xdd\x01\x00\x00\x00\x00\x00\x00\xde\x01\x00\x00\x00\x00\x00\x00\xe0\x01\x00\x00\x00\x00\x00\x00\xdf\x01\x00\x00\x00\x00\x00\x00m\x00\x00\x00\x00\x00\x00\x00\xce\x01\x00\x00\x00\x00\x00\x00\xe1\x01\x00\x00\x00\x00\x00\x00\xe2\x01\x00\x00\x00\x00\x00\x00\xe4\x01\x00\x00\x00\x00\x00\x00\xe3\x01\x00\x00\x00\x00\x00\x00\xe2\x01\x00\x00\x00\x00\x00\x00\xe3\x01\x00\x00\x00\x00\x00\x00\xe5\x01\x00\x00\x00\x00\x00\x00y\x00\x00\x00\x00\x00\x00\x00\xe7\x01\x00\x00\x00\x00\x00\x00\xe6\x01\x00\x00\x00\x00\x00\x00y\x00\x00\x00\x00\x00\x00\x00\xe6\x01\x00\x00\x00\x00\x00\x00z\x00\x00\x00\x00\x00\x00\x00\xcc\x01\x00\x00\x00\x00\x00\x00\xcd\x01\x00\x00\x00\x00\x00\x00\xe8\x01\x00\x00\x00\x00\x00\x00\xe9\x01\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\xea\x01\x00\x00\x00\x00\x00\x00\xc4\x01\x00\x00\x00\x00\x00\x00\xc5\x01\x00\x00\x00\x00\x00\x00\xeb\x01\x00\x00\x00\x00\x00\x00\xea\x01\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\xea\x01\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\xec\x01\x00\x00\x00\x00\x00\x00\xec\x01\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\xed\x01\x00\x00\x00\x00\x00\x00\xd6\x01\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\xd6\x01\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\xe5\x01\x00\x00\x00\x00\x00\x00\xc8\x01\x00\x00\x00\x00\x00\x00\xee\x01\x00\x00\x00\x00\x00\x00\xd4\x01\x00\x00\x00\x00\x00\x00\xef\x01\x00\x00\x00\x00\x00\x00\xd3\x01\x00\x00\x00\x00\x00\x00\xc5\x01\x00\x00\x00\x00\x00\x00\xf0\x01\x00\x00\x00\x00\x00\x00\xeb\x01\x00\x00\x00\x00\x00\x00\xe5\x01\x00\x00\x00\x00\x00\x00\xee\x01\x00\x00\x00\x00\x00\x00\xf1\x01\x00\x00\x00\x00\x00\x00\xc8\x01\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\xee\x01\x00\x00\x00\x00\x00\x00\xee\x01\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00o\x00\x00\x00\x00\x00\x00\x00\xf3\x01\x00\x00\x00\x00\x00\x00\xf2\x01\x00\x00\x00\x00\x00\x00o\x00\x00\x00\x00\x00\x00\x00\xf2\x01\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x00\x00\x00\x00\x00\x00\xf5\x01\x00\x00\x00\x00\x00\x00\xcc\x01\x00\x00\x00\x00\x00\x00\xf6\x01\x00\x00\x00\x00\x00\x00\xf7\x01\x00\x00\x00\x00\x00\x00~\x00\x00\x00\x00\x00\x00\x00\xf8\x01\x00\x00\x00\x00\x00\x00\xfa\x01\x00\x00\x00\x00\x00\x00\xf9\x01\x00\x00\x00\x00\x00\x00\xf8\x01\x00\x00\x00\x00\x00\x00\xf9\x01\x00\x00\x00\x00\x00\x00\xfb\x01\x00\x00\x00\x00\x00\x00\xfc\x01\x00\x00\x00\x00\x00\x00\xfd\x01\x00\x00\x00\x00\x00\x00\xd9\x01\x00\x00\x00\x00\x00\x00\xfc\x01\x00\x00\x00\x00\x00\x00\xd9\x01\x00\x00\x00\x00\x00\x00\xfe\x01\x00\x00\x00\x00\x00\x00\xc5\x01\x00\x00\x00\x00\x00\x00j\x00\x00\x00\x00\x00\x00\x00\xff\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x00\x00\x00\x00\xd0\x01\x00\x00\x00\x00\x00\x00k\x00\x00\x00\x00\x00\x00\x00\xc6\x01\x00\x00\x00\x00\x00\x00l\x00\x00\x00\x00\x00\x00\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x00\x00\x00\x00\xd1\x01\x00\x00\x00\x00\x00\x00\xed\x01\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x02\x02\x00\x00\x00\x00\x00\x00\x04\x02\x00\x00\x00\x00\x00\x00\x05\x02\x00\x00\x00\x00\x00\x00\x02\x02\x00\x00\x00\x00\x00\x00\x06\x02\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x07\x02\x00\x00\x00\x00\x00\x00\xfc\x01\x00\x00\x00\x00\x00\x00\x08\x02\x00\x00\x00\x00\x00\x00\x07\x02\x00\x00\x00\x00\x00\x00\x08\x02\x00\x00\x00\x00\x00\x00\t\x02\x00\x00\x00\x00\x00\x00\n\x02\x00\x00\x00\x00\x00\x00\x0c\x02\x00\x00\x00\x00\x00\x00\x0b\x02\x00\x00\x00\x00\x00\x00\xe9\x01\x00\x00\x00\x00\x00\x00\xea\x01\x00\x00\x00\x00\x00\x00\r\x02\x00\x00\x00\x00\x00\x00\xcc\x01\x00\x00\x00\x00\x00\x00\xf5\x01\x00\x00\x00\x00\x00\x00\xcb\x01\x00\x00\x00\x00\x00\x00\xca\x01\x00\x00\x00\x00\x00\x00\x0f\x02\x00\x00\x00\x00\x00\x00\x0e\x02\x00\x00\x00\x00\x00\x00\x10\x02\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x00\x00\x00\x00\x11\x02\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x00\x00\x00\x00\x13\x02\x00\x00\x00\x00\x00\x00\x11\x02\x00\x00\x00\x00\x00\x00\xef\x01\x00\x00\x00\x00\x00\x00\xd4\x01\x00\x00\x00\x00\x00\x00\xca\x01\x00\x00\x00\x00\x00\x00\x13\x02\x00\x00\x00\x00\x00\x00\x14\x02\x00\x00\x00\x00\x00\x00\x11\x02\x00\x00\x00\x00\x00\x00\x11\x02\x00\x00\x00\x00\x00\x00\x14\x02\x00\x00\x00\x00\x00\x00\x15\x02\x00\x00\x00\x00\x00\x00\xe9\x01\x00\x00\x00\x00\x00\x00\x17\x02\x00\x00\x00\x00\x00\x00\x16\x02\x00\x00\x00\x00\x00\x00\n\x02\x00\x00\x00\x00\x00\x00\x18\x02\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x19\x02\x00\x00\x00\x00\x00\x00\x1b\x02\x00\x00\x00\x00\x00\x00\x1a\x02\x00\x00\x00\x00\x00\x00\n\x02\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\xe4\x01\x00\x00\x00\x00\x00\x00\x02\x02\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x1c\x02\x00\x00\x00\x00\x00\x00\xca\x01\x00\x00\x00\x00\x00\x00\x0e\x02\x00\x00\x00\x00\x00\x00\xef\x01\x00\x00\x00\x00\x00\x00\xcc\x01\x00\x00\x00\x00\x00\x00\x1d\x02\x00\x00\x00\x00\x00\x00\xf4\x01\x00\x00\x00\x00\x00\x00\xeb\x01\x00\x00\x00\x00\x00\x00\xef\x01\x00\x00\x00\x00\x00\x00\x1e\x02\x00\x00\x00\x00\x00\x00\xeb\x01\x00\x00\x00\x00\x00\x00\x1e\x02\x00\x00\x00\x00\x00\x00\xc4\x01\x00\x00\x00\x00\x00\x00\x1f\x02\x00\x00\x00\x00\x00\x00!\x02\x00\x00\x00\x00\x00\x00 \x02\x00\x00\x00\x00\x00\x00\x18\x02\x00\x00\x00\x00\x00\x00\n\x02\x00\x00\x00\x00\x00\x00"\x02\x00\x00\x00\x00\x00\x00\xe4\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00#\x02\x00\x00\x00\x00\x00\x00$\x02\x00\x00\x00\x00\x00\x00\x1a\x02\x00\x00\x00\x00\x00\x00\xdf\x01\x00\x00\x00\x00\x00\x00%\x02\x00\x00\x00\x00\x00\x00\x1b\x02\x00\x00\x00\x00\x00\x00&\x02\x00\x00\x00\x00\x00\x00$\x02\x00\x00\x00\x00\x00\x00\xdf\x01\x00\x00\x00\x00\x00\x00\xe0\x01\x00\x00\x00\x00\x00\x00\x1d\x02\x00\x00\x00\x00\x00\x00\xcc\x01\x00\x00\x00\x00\x00\x00\xe8\x01\x00\x00\x00\x00\x00\x00\'\x02\x00\x00\x00\x00\x00\x00(\x02\x00\x00\x00\x00\x00\x00%\x02\x00\x00\x00\x00\x00\x00\'\x02\x00\x00\x00\x00\x00\x00%\x02\x00\x00\x00\x00\x00\x00&\x02\x00\x00\x00\x00\x00\x00\n\x02\x00\x00\x00\x00\x00\x00\x0b\x02\x00\x00\x00\x00\x00\x00"\x02\x00\x00\x00\x00\x00\x00\x11\x02\x00\x00\x00\x00\x00\x00\x15\x02\x00\x00\x00\x00\x00\x00)\x02\x00\x00\x00\x00\x00\x00)\x02\x00\x00\x00\x00\x00\x00\x15\x02\x00\x00\x00\x00\x00\x00*\x02\x00\x00\x00\x00\x00\x00\xca\x01\x00\x00\x00\x00\x00\x00\xd4\x01\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x00\x00\x00\x00+\x02\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00!\x02\x00\x00\x00\x00\x00\x00+\x02\x00\x00\x00\x00\x00\x00+\x02\x00\x00\x00\x00\x00\x00!\x02\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\xed\x01\x00\x00\x00\x00\x00\x00+\x02\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\xe0\x01\x00\x00\x00\x00\x00\x00,\x02\x00\x00\x00\x00\x00\x00$\x02\x00\x00\x00\x00\x00\x00-\x02\x00\x00\x00\x00\x00\x00.\x02\x00\x00\x00\x00\x00\x00\xf6\x01\x00\x00\x00\x00\x00\x00.\x02\x00\x00\x00\x00\x00\x000\x02\x00\x00\x00\x00\x00\x00/\x02\x00\x00\x00\x00\x00\x00$\x02\x00\x00\x00\x00\x00\x00,\x02\x00\x00\x00\x00\x00\x00s\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\xc7\x01\x00\x00\x00\x00\x00\x00\xcf\x01\x00\x00\x00\x00\x00\x001\x02\x00\x00\x00\x00\x00\x000\x02\x00\x00\x00\x00\x00\x00.\x02\x00\x00\x00\x00\x00\x00\xce\x01\x00\x00\x00\x00\x00\x00\xc4\x01\x00\x00\x00\x00\x00\x002\x02\x00\x00\x00\x00\x00\x003\x02\x00\x00\x00\x00\x00\x005\x02\x00\x00\x00\x00\x00\x004\x02\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\xcf\x01\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\xd6\x01\x00\x00\x00\x00\x00\x00\xd7\x01\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\xd7\x01\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00#\x02\x00\x00\x00\x00\x00\x00\xd0\x01\x00\x00\x00\x00\x00\x00\xc7\x01\x00\x00\x00\x00\x00\x006\x02\x00\x00\x00\x00\x00\x007\x02\x00\x00\x00\x00\x00\x00\x05\x02\x00\x00\x00\x00\x00\x00\x05\x02\x00\x00\x00\x00\x00\x007\x02\x00\x00\x00\x00\x00\x00\xd5\x01\x00\x00\x00\x00\x00\x00z\x00\x00\x00\x00\x00\x00\x00\xf5\x01\x00\x00\x00\x00\x00\x00{\x00\x00\x00\x00\x00\x00\x00\xec\x01\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x008\x02\x00\x00\x00\x00\x00\x00\xe8\x01\x00\x00\x00\x00\x00\x00\xdd\x01\x00\x00\x00\x00\x00\x009\x02\x00\x00\x00\x00\x00\x008\x02\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00 \x02\x00\x00\x00\x00\x00\x00!\x02\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00\xc8\x01\x00\x00\x00\x00\x00\x00\xe3\x01\x00\x00\x00\x00\x00\x00\xc7\x01\x00\x00\x00\x00\x00\x00\xe3\x01\x00\x00\x00\x00\x00\x00\xc8\x01\x00\x00\x00\x00\x00\x00\xe5\x01\x00\x00\x00\x00\x00\x00\xc7\x01\x00\x00\x00\x00\x00\x00\xe3\x01\x00\x00\x00\x00\x00\x00#\x02\x00\x00\x00\x00\x00\x00\xe7\x01\x00\x00\x00\x00\x00\x00\x17\x02\x00\x00\x00\x00\x00\x00\r\x02\x00\x00\x00\x00\x00\x00\r\x02\x00\x00\x00\x00\x00\x00\x17\x02\x00\x00\x00\x00\x00\x00\xe9\x01\x00\x00\x00\x00\x00\x00:\x02\x00\x00\x00\x00\x00\x00\xff\x01\x00\x00\x00\x00\x00\x00;\x02\x00\x00\x00\x00\x00\x00\xfe\x01\x00\x00\x00\x00\x00\x00\x08\x02\x00\x00\x00\x00\x00\x00\xfc\x01\x00\x00\x00\x00\x00\x00\xde\x01\x00\x00\x00\x00\x00\x00<\x02\x00\x00\x00\x00\x00\x00\x04\x02\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00!\x02\x00\x00\x00\x00\x00\x00=\x02\x00\x00\x00\x00\x00\x00\xff\x01\x00\x00\x00\x00\x00\x00:\x02\x00\x00\x00\x00\x00\x00\xf0\x01\x00\x00\x00\x00\x00\x00\xc5\x01\x00\x00\x00\x00\x00\x00\xff\x01\x00\x00\x00\x00\x00\x00\xf0\x01\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00=\x02\x00\x00\x00\x00\x00\x00\x1c\x02\x00\x00\x00\x00\x00\x00>\x02\x00\x00\x00\x00\x00\x00\x04\x02\x00\x00\x00\x00\x00\x00<\x02\x00\x00\x00\x00\x00\x00?\x02\x00\x00\x00\x00\x00\x00\x0c\x02\x00\x00\x00\x00\x00\x00@\x02\x00\x00\x00\x00\x00\x00@\x02\x00\x00\x00\x00\x00\x00\x0c\x02\x00\x00\x00\x00\x00\x00A\x02\x00\x00\x00\x00\x00\x00\xde\x01\x00\x00\x00\x00\x00\x00\x04\x02\x00\x00\x00\x00\x00\x00\x1c\x02\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\xcf\x01\x00\x00\x00\x00\x00\x008\x02\x00\x00\x00\x00\x00\x00\xda\x01\x00\x00\x00\x00\x00\x00\x0f\x02\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\x00\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x00\x17\x02\x00\x00\x00\x00\x00\x00\xe7\x01\x00\x00\x00\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x00\xe7\x01\x00\x00\x00\x00\x00\x00y\x00\x00\x00\x00\x00\x00\x003\x02\x00\x00\x00\x00\x00\x00B\x02\x00\x00\x00\x00\x00\x00\x1d\x02\x00\x00\x00\x00\x00\x00\xf4\x01\x00\x00\x00\x00\x00\x00\x1d\x02\x00\x00\x00\x00\x00\x00B\x02\x00\x00\x00\x00\x00\x00B\x02\x00\x00\x00\x00\x00\x00.\x02\x00\x00\x00\x00\x00\x00C\x02\x00\x00\x00\x00\x00\x00\xe1\x01\x00\x00\x00\x00\x00\x002\x02\x00\x00\x00\x00\x00\x00*\x02\x00\x00\x00\x00\x00\x002\x02\x00\x00\x00\x00\x00\x00\xe1\x01\x00\x00\x00\x00\x00\x00\xce\x01\x00\x00\x00\x00\x00\x002\x02\x00\x00\x00\x00\x00\x00\xc4\x01\x00\x00\x00\x00\x00\x00D\x02\x00\x00\x00\x00\x00\x002\x02\x00\x00\x00\x00\x00\x00D\x02\x00\x00\x00\x00\x00\x00*\x02\x00\x00\x00\x00\x00\x00D\x02\x00\x00\x00\x00\x00\x00\xc4\x01\x00\x00\x00\x00\x00\x00\x1e\x02\x00\x00\x00\x00\x00\x00\x1e\x02\x00\x00\x00\x00\x00\x00\xda\x01\x00\x00\x00\x00\x00\x00D\x02\x00\x00\x00\x00\x00\x00\xd8\x01\x00\x00\x00\x00\x00\x00)\x02\x00\x00\x00\x00\x00\x00D\x02\x00\x00\x00\x00\x00\x00\xd3\x01\x00\x00\x00\x00\x00\x00\xef\x01\x00\x00\x00\x00\x00\x00\xf0\x01\x00\x00\x00\x00\x00\x00\xd3\x01\x00\x00\x00\x00\x00\x00\xf0\x01\x00\x00\x00\x00\x00\x00:\x02\x00\x00\x00\x00\x00\x00)\x02\x00\x00\x00\x00\x00\x00\xd8\x01\x00\x00\x00\x00\x00\x00\x11\x02\x00\x00\x00\x00\x00\x00)\x02\x00\x00\x00\x00\x00\x00*\x02\x00\x00\x00\x00\x00\x00D\x02\x00\x00\x00\x00\x00\x00:\x02\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x00\x00\xe9\x01\x00\x00\x00\x00\x00\x00\x16\x02\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00&\x02\x00\x00\x00\x00\x00\x00E\x02\x00\x00\x00\x00\x00\x00\x13\x02\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x00\x00\x00\x00&\x02\x00\x00\x00\x00\x00\x00\x13\x02\x00\x00\x00\x00\x00\x00w\x00\x00\x00\x00\x00\x00\x00\x17\x02\x00\x00\x00\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x00\xce\x01\x00\x00\x00\x00\x00\x00\xc6\x01\x00\x00\x00\x00\x00\x00\xc4\x01\x00\x00\x00\x00\x00\x00&\x02\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x00\x00\x00\x00\'\x02\x00\x00\x00\x00\x00\x00;\x02\x00\x00\x00\x00\x00\x00\xff\x01\x00\x00\x00\x00\x00\x00i\x00\x00\x00\x00\x00\x00\x00 \x02\x00\x00\x00\x00\x00\x00v\x00\x00\x00\x00\x00\x00\x00u\x00\x00\x00\x00\x00\x00\x00,\x02\x00\x00\x00\x00\x00\x00=\x02\x00\x00\x00\x00\x00\x00\x1f\x02\x00\x00\x00\x00\x00\x00\x1f\x02\x00\x00\x00\x00\x00\x00t\x00\x00\x00\x00\x00\x00\x00,\x02\x00\x00\x00\x00\x00\x00=\x02\x00\x00\x00\x00\x00\x00,\x02\x00\x00\x00\x00\x00\x00\x1c\x02\x00\x00\x00\x00\x00\x00\xd3\x01\x00\x00\x00\x00\x00\x00:\x02\x00\x00\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x00\x00,\x02\x00\x00\x00\x00\x00\x00\xe0\x01\x00\x00\x00\x00\x00\x00\x1c\x02\x00\x00\x00\x00\x00\x009\x02\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x00\x00\x00\x00F\x02\x00\x00\x00\x00\x00\x00\xe8\x01\x00\x00\x00\x00\x00\x009\x02\x00\x00\x00\x00\x00\x00F\x02\x00\x00\x00\x00\x00\x00\x1f\x02\x00\x00\x00\x00\x00\x00 \x02\x00\x00\x00\x00\x00\x00u\x00\x00\x00\x00\x00\x00\x00\xf0\x01\x00\x00\x00\x00\x00\x00\xef\x01\x00\x00\x00\x00\x00\x00\xeb\x01\x00\x00\x00\x00\x00\x003\x02\x00\x00\x00\x00\x00\x00\x1d\x02\x00\x00\x00\x00\x00\x00F\x02\x00\x00\x00\x00\x00\x00\xff\x01\x00\x00\x00\x00\x00\x00j\x00\x00\x00\x00\x00\x00\x00i\x00\x00\x00\x00\x00\x00\x00\xe8\x01\x00\x00\x00\x00\x00\x00F\x02\x00\x00\x00\x00\x00\x00\x1d\x02\x00\x00\x00\x00\x00\x00;\x02\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00:\x02\x00\x00\x00\x00\x00\x00w\x00\x00\x00\x00\x00\x00\x00\x16\x02\x00\x00\x00\x00\x00\x00\x17\x02\x00\x00\x00\x00\x00\x00\xf7\x01\x00\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00\x00\x00\xc9\x01\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\xe9\x01\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00C\x02\x00\x00\x00\x00\x00\x00.\x02\x00\x00\x00\x00\x00\x00-\x02\x00\x00\x00\x00\x00\x00H\x02\x00\x00\x00\x00\x00\x003\x02\x00\x00\x00\x00\x00\x00F\x02\x00\x00\x00\x00\x00\x00C\x02\x00\x00\x00\x00\x00\x00-\x02\x00\x00\x00\x00\x00\x00|\x00\x00\x00\x00\x00\x00\x00\xf9\x01\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x00\x00\x00\x00\x10\x02\x00\x00\x00\x00\x00\x00\xfb\x01\x00\x00\x00\x00\x00\x00\xf9\x01\x00\x00\x00\x00\x00\x00\x10\x02\x00\x00\x00\x00\x00\x00\xfb\x01\x00\x00\x00\x00\x00\x00\x10\x02\x00\x00\x00\x00\x00\x00\xfd\x01\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00v\x00\x00\x00\x00\x00\x00\x00 \x02\x00\x00\x00\x00\x00\x00v\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\xc8\x01\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x11\x02\x00\x00\x00\x00\x00\x00\xd8\x01\x00\x00\x00\x00\x00\x00\x10\x02\x00\x00\x00\x00\x00\x00\x10\x02\x00\x00\x00\x00\x00\x00\xd8\x01\x00\x00\x00\x00\x00\x00\xfd\x01\x00\x00\x00\x00\x00\x00s\x00\x00\x00\x00\x00\x00\x00,\x02\x00\x00\x00\x00\x00\x00t\x00\x00\x00\x00\x00\x00\x00t\x00\x00\x00\x00\x00\x00\x00\x1f\x02\x00\x00\x00\x00\x00\x00u\x00\x00\x00\x00\x00\x00\x00C\x02\x00\x00\x00\x00\x00\x00{\x00\x00\x00\x00\x00\x00\x00\xf5\x01\x00\x00\x00\x00\x00\x00\x82\x00\x00\x00\x00\x00\x00\x00\xd3\x01\x00\x00\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x00\x00\x18\x02\x00\x00\x00\x00\x00\x00\x06\x02\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00{\x00\x00\x00\x00\x00\x00\x00C\x02\x00\x00\x00\x00\x00\x00|\x00\x00\x00\x00\x00\x00\x000\x02\x00\x00\x00\x00\x00\x00\x08\x02\x00\x00\x00\x00\x00\x00I\x02\x00\x00\x00\x00\x00\x00\xcb\x01\x00\x00\x00\x00\x00\x00\xe6\x01\x00\x00\x00\x00\x00\x00\xe7\x01\x00\x00\x00\x00\x00\x00~\x00\x00\x00\x00\x00\x00\x00\xf7\x01\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\xe7\x01\x00\x00\x00\x00\x00\x00\r\x02\x00\x00\x00\x00\x00\x00\xcb\x01\x00\x00\x00\x00\x00\x00=\x02\x00\x00\x00\x00\x00\x00!\x02\x00\x00\x00\x00\x00\x00\x1f\x02\x00\x00\x00\x00\x00\x008\x02\x00\x00\x00\x00\x00\x00\xcf\x01\x00\x00\x00\x00\x00\x00\xdc\x01\x00\x00\x00\x00\x00\x00<\x02\x00\x00\x00\x00\x00\x00\xde\x01\x00\x00\x00\x00\x00\x00%\x02\x00\x00\x00\x00\x00\x00\xd8\x01\x00\x00\x00\x00\x00\x00\xd9\x01\x00\x00\x00\x00\x00\x00\xfd\x01\x00\x00\x00\x00\x00\x00D\x02\x00\x00\x00\x00\x00\x00\xda\x01\x00\x00\x00\x00\x00\x00\xd8\x01\x00\x00\x00\x00\x00\x00\xcb\x01\x00\x00\x00\x00\x00\x00\xf5\x01\x00\x00\x00\x00\x00\x00\xe6\x01\x00\x00\x00\x00\x00\x00z\x00\x00\x00\x00\x00\x00\x00\xe6\x01\x00\x00\x00\x00\x00\x00\xf5\x01\x00\x00\x00\x00\x00\x00\x16\x02\x00\x00\x00\x00\x00\x00w\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x16\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00;\x02\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00;\x02\x00\x00\x00\x00\x00\x00i\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00B\x02\x00\x00\x00\x00\x00\x003\x02\x00\x00\x00\x00\x00\x001\x02\x00\x00\x00\x00\x00\x00\xdd\x01\x00\x00\x00\x00\x00\x00\xec\x01\x00\x00\x00\x00\x00\x00\xdc\x01\x00\x00\x00\x00\x00\x00\x06\x02\x00\x00\x00\x00\x00\x00\x18\x02\x00\x00\x00\x00\x00\x00"\x02\x00\x00\x00\x00\x00\x00F\x02\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x00\x00\x00\x00\x06\x02\x00\x00\x00\x00\x00\x00+\x02\x00\x00\x00\x00\x00\x00\xed\x01\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00+\x02\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00J\x02\x00\x00\x00\x00\x00\x00\x0c\x02\x00\x00\x00\x00\x00\x00K\x02\x00\x00\x00\x00\x00\x00\x0c\x02\x00\x00\x00\x00\x00\x00?\x02\x00\x00\x00\x00\x00\x00K\x02\x00\x00\x00\x00\x00\x00#\x02\x00\x00\x00\x00\x00\x00\xe3\x01\x00\x00\x00\x00\x00\x00\xe4\x01\x00\x00\x00\x00\x00\x00\x08\x02\x00\x00\x00\x00\x00\x00\xfe\x01\x00\x00\x00\x00\x00\x00I\x02\x00\x00\x00\x00\x00\x00C\x02\x00\x00\x00\x00\x00\x00\xf4\x01\x00\x00\x00\x00\x00\x00B\x02\x00\x00\x00\x00\x00\x00\x06\x02\x00\x00\x00\x00\x00\x00H\x02\x00\x00\x00\x00\x00\x00F\x02\x00\x00\x00\x00\x00\x001\x02\x00\x00\x00\x00\x00\x003\x02\x00\x00\x00\x00\x00\x004\x02\x00\x00\x00\x00\x00\x00\x0e\x02\x00\x00\x00\x00\x00\x00\x1e\x02\x00\x00\x00\x00\x00\x00\xef\x01\x00\x00\x00\x00\x00\x00L\x02\x00\x00\x00\x00\x00\x00\xe1\x01\x00\x00\x00\x00\x00\x00M\x02\x00\x00\x00\x00\x00\x00M\x02\x00\x00\x00\x00\x00\x00*\x02\x00\x00\x00\x00\x00\x00\x15\x02\x00\x00\x00\x00\x00\x00*\x02\x00\x00\x00\x00\x00\x00M\x02\x00\x00\x00\x00\x00\x00\xe1\x01\x00\x00\x00\x00\x00\x00B\x02\x00\x00\x00\x00\x00\x001\x02\x00\x00\x00\x00\x00\x00.\x02\x00\x00\x00\x00\x00\x00\xf7\x01\x00\x00\x00\x00\x00\x00\xc9\x01\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00%\x02\x00\x00\x00\x00\x00\x00(\x02\x00\x00\x00\x00\x00\x00<\x02\x00\x00\x00\x00\x00\x00\xc9\x01\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x1b\x02\x00\x00\x00\x00\x00\x00\x19\x02\x00\x00\x00\x00\x00\x00\xf2\x01\x00\x00\x00\x00\x00\x00\x19\x02\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00\xf2\x01\x00\x00\x00\x00\x00\x00>\x02\x00\x00\x00\x00\x00\x00\x05\x02\x00\x00\x00\x00\x00\x00\x04\x02\x00\x00\x00\x00\x00\x00\xd5\x01\x00\x00\x00\x00\x00\x00\xed\x01\x00\x00\x00\x00\x00\x00\x02\x02\x00\x00\x00\x00\x00\x006\x02\x00\x00\x00\x00\x00\x00\x05\x02\x00\x00\x00\x00\x00\x00>\x02\x00\x00\x00\x00\x00\x00\xed\x01\x00\x00\x00\x00\x00\x00\xd5\x01\x00\x00\x00\x00\x00\x00\xd6\x01\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00\x19\x02\x00\x00\x00\x00\x00\x00q\x00\x00\x00\x00\x00\x00\x00M\x02\x00\x00\x00\x00\x00\x00\xf3\x01\x00\x00\x00\x00\x00\x00L\x02\x00\x00\x00\x00\x00\x00\x14\x02\x00\x00\x00\x00\x00\x00\xf3\x01\x00\x00\x00\x00\x00\x00M\x02\x00\x00\x00\x00\x00\x00\xdf\x01\x00\x00\x00\x00\x00\x00\x1a\x02\x00\x00\x00\x00\x00\x00\x1b\x02\x00\x00\x00\x00\x00\x00L\x02\x00\x00\x00\x00\x00\x00\xf3\x01\x00\x00\x00\x00\x00\x00n\x00\x00\x00\x00\x00\x00\x00?\x02\x00\x00\x00\x00\x00\x00<\x02\x00\x00\x00\x00\x00\x00(\x02\x00\x00\x00\x00\x00\x00n\x00\x00\x00\x00\x00\x00\x00\xf3\x01\x00\x00\x00\x00\x00\x00o\x00\x00\x00\x00\x00\x00\x00%\x02\x00\x00\x00\x00\x00\x00\xdf\x01\x00\x00\x00\x00\x00\x00\x1b\x02\x00\x00\x00\x00\x00\x00E\x02\x00\x00\x00\x00\x00\x00\xf2\x01\x00\x00\x00\x00\x00\x00\xf3\x01\x00\x00\x00\x00\x00\x00E\x02\x00\x00\x00\x00\x00\x00\xf3\x01\x00\x00\x00\x00\x00\x00\x14\x02\x00\x00\x00\x00\x00\x00\xdf\x01\x00\x00\x00\x00\x00\x00%\x02\x00\x00\x00\x00\x00\x00\xde\x01\x00\x00\x00\x00\x00\x00?\x02\x00\x00\x00\x00\x00\x00>\x02\x00\x00\x00\x00\x00\x00<\x02\x00\x00\x00\x00\x00\x00J\x02\x00\x00\x00\x00\x00\x00N\x02\x00\x00\x00\x00\x00\x00"\x02\x00\x00\x00\x00\x00\x00\xf1\x01\x00\x00\x00\x00\x00\x006\x02\x00\x00\x00\x00\x00\x00O\x02\x00\x00\x00\x00\x00\x00N\x02\x00\x00\x00\x00\x00\x00\t\x02\x00\x00\x00\x00\x00\x00"\x02\x00\x00\x00\x00\x00\x00\x04\x02\x00\x00\x00\x00\x00\x00\x02\x02\x00\x00\x00\x00\x00\x00\x1c\x02\x00\x00\x00\x00\x00\x00\xdd\x01\x00\x00\x00\x00\x00\x00P\x02\x00\x00\x00\x00\x00\x00\xec\x01\x00\x00\x00\x00\x00\x00P\x02\x00\x00\x00\x00\x00\x00\xea\x01\x00\x00\x00\x00\x00\x00\xec\x01\x00\x00\x00\x00\x00\x00\xf1\x01\x00\x00\x00\x00\x00\x00\xee\x01\x00\x00\x00\x00\x00\x00\xd7\x01\x00\x00\x00\x00\x00\x00\xee\x01\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\xd7\x01\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\xee\x01\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x1a\x02\x00\x00\x00\x00\x00\x00q\x00\x00\x00\x00\x00\x00\x00\x19\x02\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x00\x00\x00\x00\xfa\x01\x00\x00\x00\x00\x00\x00\'\x02\x00\x00\x00\x00\x00\x00q\x00\x00\x00\x00\x00\x00\x00\x1a\x02\x00\x00\x00\x00\x00\x00r\x00\x00\x00\x00\x00\x00\x00J\x02\x00\x00\x00\x00\x00\x00K\x02\x00\x00\x00\x00\x00\x00\xfa\x01\x00\x00\x00\x00\x00\x00\t\x02\x00\x00\x00\x00\x00\x00\x08\x02\x00\x00\x00\x00\x00\x004\x02\x00\x00\x00\x00\x00\x00K\x02\x00\x00\x00\x00\x00\x00\'\x02\x00\x00\x00\x00\x00\x00\xfa\x01\x00\x00\x00\x00\x00\x00\x1e\x02\x00\x00\x00\x00\x00\x00\x0e\x02\x00\x00\x00\x00\x00\x00\xda\x01\x00\x00\x00\x00\x00\x00\x08\x02\x00\x00\x00\x00\x00\x000\x02\x00\x00\x00\x00\x00\x004\x02\x00\x00\x00\x00\x00\x00\t\x02\x00\x00\x00\x00\x00\x004\x02\x00\x00\x00\x00\x00\x005\x02\x00\x00\x00\x00\x00\x00\xea\x01\x00\x00\x00\x00\x00\x00P\x02\x00\x00\x00\x00\x00\x00\r\x02\x00\x00\x00\x00\x00\x00\xc9\x01\x00\x00\x00\x00\x00\x00\x0f\x02\x00\x00\x00\x00\x00\x00\xca\x01\x00\x00\x00\x00\x00\x00\xd0\x01\x00\x00\x00\x00\x00\x00#\x02\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x07\x02\x00\x00\x00\x00\x00\x00\xfb\x01\x00\x00\x00\x00\x00\x00\xfc\x01\x00\x00\x00\x00\x00\x00\x07\x02\x00\x00\x00\x00\x00\x00\t\x02\x00\x00\x00\x00\x00\x00N\x02\x00\x00\x00\x00\x00\x00\x0f\x02\x00\x00\x00\x00\x00\x00\xc9\x01\x00\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00\x00\x00\xfb\x01\x00\x00\x00\x00\x00\x00\x07\x02\x00\x00\x00\x00\x00\x00N\x02\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x00\x00\x00\x00\xf9\x01\x00\x00\x00\x00\x00\x00\xfa\x01\x00\x00\x00\x00\x00\x00\xf6\x01\x00\x00\x00\x00\x00\x00~\x00\x00\x00\x00\x00\x00\x00}\x00\x00\x00\x00\x00\x00\x00?\x02\x00\x00\x00\x00\x00\x00(\x02\x00\x00\x00\x00\x00\x00K\x02\x00\x00\x00\x00\x00\x00\t\x02\x00\x00\x00\x00\x00\x005\x02\x00\x00\x00\x00\x00\x00"\x02\x00\x00\x00\x00\x00\x00(\x02\x00\x00\x00\x00\x00\x00\'\x02\x00\x00\x00\x00\x00\x00K\x02\x00\x00\x00\x00\x00\x005\x02\x00\x00\x00\x00\x00\x00\x06\x02\x00\x00\x00\x00\x00\x00"\x02\x00\x00\x00\x00\x00\x008\x02\x00\x00\x00\x00\x00\x00\xdc\x01\x00\x00\x00\x00\x00\x00\xec\x01\x00\x00\x00\x00\x00\x00E\x02\x00\x00\x00\x00\x00\x00&\x02\x00\x00\x00\x00\x00\x00\x1b\x02\x00\x00\x00\x00\x00\x00I\x02\x00\x00\x00\x00\x00\x00\xfe\x01\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00\x00\x00\xf7\x01\x00\x00\x00\x00\x00\x00/\x02\x00\x00\x00\x00\x00\x00\xf2\x01\x00\x00\x00\x00\x00\x00E\x02\x00\x00\x00\x00\x00\x00\x1b\x02\x00\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00\x00\x00I\x02\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\x00\x00\x00\x00M\x02\x00\x00\x00\x00\x00\x00\x15\x02\x00\x00\x00\x00\x00\x00\x14\x02\x00\x00\x00\x00\x00\x00/\x02\x00\x00\x00\x00\x00\x00\xf7\x01\x00\x00\x00\x00\x00\x00\xf6\x01\x00\x00\x00\x00\x00\x00\xe2\x01\x00\x00\x00\x00\x00\x00A\x02\x00\x00\x00\x00\x00\x00\xe4\x01\x00\x00\x00\x00\x00\x00\xf1\x01\x00\x00\x00\x00\x00\x00O\x02\x00\x00\x00\x00\x00\x00\xe5\x01\x00\x00\x00\x00\x00\x00\xe2\x01\x00\x00\x00\x00\x00\x00\xe5\x01\x00\x00\x00\x00\x00\x00O\x02\x00\x00\x00\x00\x00\x00\xfe\x01\x00\x00\x00\x00\x00\x00\xd9\x01\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\x00\x00\x00\x00A\x02\x00\x00\x00\x00\x00\x00\xe2\x01\x00\x00\x00\x00\x00\x00O\x02\x00\x00\x00\x00\x00\x00\x14\x02\x00\x00\x00\x00\x00\x00\x13\x02\x00\x00\x00\x00\x00\x00E\x02\x00\x00\x00\x00\x00\x00J\x02\x00\x00\x00\x00\x00\x00\xf8\x01\x00\x00\x00\x00\x00\x00N\x02\x00\x00\x00\x00\x00\x00\xf8\x01\x00\x00\x00\x00\x00\x00J\x02\x00\x00\x00\x00\x00\x00\xfa\x01\x00\x00\x00\x00\x00\x00\xf8\x01\x00\x00\x00\x00\x00\x00\xfb\x01\x00\x00\x00\x00\x00\x00N\x02\x00\x00\x00\x00\x00\x00\xdb\x01\x00\x00\x00\x00\x00\x00\x0f\x02\x00\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00\x00\x00L\x02\x00\x00\x00\x00\x00\x00n\x00\x00\x00\x00\x00\x00\x00m\x00\x00\x00\x00\x00\x00\x00P\x02\x00\x00\x00\x00\x00\x00\xdd\x01\x00\x00\x00\x00\x00\x00\xe8\x01\x00\x00\x00\x00\x00\x00\xe1\x01\x00\x00\x00\x00\x00\x00L\x02\x00\x00\x00\x00\x00\x00m\x00\x00\x00\x00\x00\x00\x00\xfc\x01\x00\x00\x00\x00\x00\x00\xfb\x01\x00\x00\x00\x00\x00\x00\xfd\x01\x00\x00\x00\x00\x00\x00>\x02\x00\x00\x00\x00\x00\x00?\x02\x00\x00\x00\x00\x00\x00@\x02\x00\x00\x00\x00\x00\x000\x02\x00\x00\x00\x00\x00\x001\x02\x00\x00\x00\x00\x00\x004\x02\x00\x00\x00\x00\x00\x00J\x02\x00\x00\x00\x00\x00\x00\x0b\x02\x00\x00\x00\x00\x00\x00\x0c\x02\x00\x00\x00\x00\x00\x006\x02\x00\x00\x00\x00\x00\x00>\x02\x00\x00\x00\x00\x00\x00@\x02\x00\x00\x00\x00\x00\x00\x0e\x02\x00\x00\x00\x00\x00\x00\x0f\x02\x00\x00\x00\x00\x00\x00\xda\x01\x00\x00\x00\x00\x00\x00\x0b\x02\x00\x00\x00\x00\x00\x00J\x02\x00\x00\x00\x00\x00\x00"\x02\x00\x00\x00\x00\x00\x00r\x00\x00\x00\x00\x00\x00\x00$\x02\x00\x00\x00\x00\x00\x00s\x00\x00\x00\x00\x00\x00\x00.\x02\x00\x00\x00\x00\x00\x00/\x02\x00\x00\x00\x00\x00\x00\xf6\x01\x00\x00\x00\x00\x00\x00\xe0\x01\x00\x00\x00\x00\x00\x00\xde\x01\x00\x00\x00\x00\x00\x00\x1c\x02\x00\x00\x00\x00\x00\x00}\x00\x00\x00\x00\x00\x00\x00-\x02\x00\x00\x00\x00\x00\x00\xf6\x01\x00\x00\x00\x00\x00\x00I\x02\x00\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00\x00\x00/\x02\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x00\x00\x00\x009\x02\x00\x00\x00\x00\x00\x00\xd1\x01\x00\x00\x00\x00\x00\x00\x02\x02\x00\x00\x00\x00\x00\x00\x05\x02\x00\x00\x00\x00\x00\x00\xd5\x01\x00\x00\x00\x00\x00\x00$\x02\x00\x00\x00\x00\x00\x00r\x00\x00\x00\x00\x00\x00\x00\x1a\x02\x00\x00\x00\x00\x00\x00C\x02\x00\x00\x00\x00\x00\x00\xf5\x01\x00\x00\x00\x00\x00\x00\xf4\x01\x00\x00\x00\x00\x00\x009\x02\x00\x00\x00\x00\x00\x00\xdd\x01\x00\x00\x00\x00\x00\x00\xd1\x01\x00\x00\x00\x00\x00\x007\x02\x00\x00\x00\x00\x00\x00\xd7\x01\x00\x00\x00\x00\x00\x00\xd5\x01\x00\x00\x00\x00\x00\x006\x02\x00\x00\x00\x00\x00\x00@\x02\x00\x00\x00\x00\x00\x00O\x02\x00\x00\x00\x00\x00\x007\x02\x00\x00\x00\x00\x00\x006\x02\x00\x00\x00\x00\x00\x00\xf1\x01\x00\x00\x00\x00\x00\x00@\x02\x00\x00\x00\x00\x00\x00A\x02\x00\x00\x00\x00\x00\x00O\x02\x00\x00\x00\x00\x00\x00A\x02\x00\x00\x00\x00\x00\x00\n\x02\x00\x00\x00\x00\x00\x00\xe4\x01\x00\x00\x00\x00\x00\x00\xd7\x01\x00\x00\x00\x00\x00\x007\x02\x00\x00\x00\x00\x00\x00\xf1\x01\x00\x00\x00\x00\x00\x00-\x02\x00\x00\x00\x00\x00\x00}\x00\x00\x00\x00\x00\x00\x00|\x00\x00\x00\x00\x00\x00\x00\n\x02\x00\x00\x00\x00\x00\x00A\x02\x00\x00\x00\x00\x00\x00\x0c\x02\x00\x00\x00\x00\x00\x000\x02\x00\x00\x00\x00\x00\x00I\x02\x00\x00\x00\x00\x00\x00/\x02\x00\x00\x00\x00\x00\x00\xcd\x01\x00\x00\x00\x00\x00\x00\r\x02\x00\x00\x00\x00\x00\x00P\x02\x00\x00\x00\x00\x00\x00\r\x02\x00\x00\x00\x00\x00\x00\xcd\x01\x00\x00\x00\x00\x00\x00\xcb\x01\x00\x00\x00\x00\x00\x00\xe8\x01\x00\x00\x00\x00\x00\x00\xcd\x01\x00\x00\x00\x00\x00\x00P\x02\x00\x00\x00\x00\x00\x00H\x02\x00\x00\x00\x00\x00\x00\x06\x02\x00\x00\x00\x00\x00\x005\x02\x00\x00\x00\x00\x00\x003\x02\x00\x00\x00\x00\x00\x00H\x02\x00\x00\x00\x00\x00\x005\x02\x00\x00\x00\x00\x00\x00Q\x02\x00\x00\x00\x00\x00\x00S\x02\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00S\x02\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00\x94\x00\x00\x00\x00\x00\x00\x00T\x02\x00\x00\x00\x00\x00\x00V\x02\x00\x00\x00\x00\x00\x00U\x02\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00X\x02\x00\x00\x00\x00\x00\x00W\x02\x00\x00\x00\x00\x00\x00Y\x02\x00\x00\x00\x00\x00\x00[\x02\x00\x00\x00\x00\x00\x00Z\x02\x00\x00\x00\x00\x00\x00\\\x02\x00\x00\x00\x00\x00\x00^\x02\x00\x00\x00\x00\x00\x00]\x02\x00\x00\x00\x00\x00\x00\x96\x00\x00\x00\x00\x00\x00\x00S\x02\x00\x00\x00\x00\x00\x00_\x02\x00\x00\x00\x00\x00\x00\x96\x00\x00\x00\x00\x00\x00\x00_\x02\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00`\x02\x00\x00\x00\x00\x00\x00b\x02\x00\x00\x00\x00\x00\x00a\x02\x00\x00\x00\x00\x00\x00Z\x02\x00\x00\x00\x00\x00\x00[\x02\x00\x00\x00\x00\x00\x00c\x02\x00\x00\x00\x00\x00\x00`\x02\x00\x00\x00\x00\x00\x00a\x02\x00\x00\x00\x00\x00\x00d\x02\x00\x00\x00\x00\x00\x00_\x02\x00\x00\x00\x00\x00\x00f\x02\x00\x00\x00\x00\x00\x00e\x02\x00\x00\x00\x00\x00\x00_\x02\x00\x00\x00\x00\x00\x00e\x02\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00g\x02\x00\x00\x00\x00\x00\x00i\x02\x00\x00\x00\x00\x00\x00h\x02\x00\x00\x00\x00\x00\x00j\x02\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00k\x02\x00\x00\x00\x00\x00\x00k\x02\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00l\x02\x00\x00\x00\x00\x00\x00K\x00\x00\x00\x00\x00\x00\x00L\x00\x00\x00\x00\x00\x00\x00m\x02\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00n\x02\x00\x00\x00\x00\x00\x00p\x02\x00\x00\x00\x00\x00\x00o\x02\x00\x00\x00\x00\x00\x00h\x02\x00\x00\x00\x00\x00\x00i\x02\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x00\x00\x00\x00q\x02\x00\x00\x00\x00\x00\x00s\x02\x00\x00\x00\x00\x00\x00r\x02\x00\x00\x00\x00\x00\x00t\x02\x00\x00\x00\x00\x00\x00v\x02\x00\x00\x00\x00\x00\x00u\x02\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00w\x02\x00\x00\x00\x00\x00\x00X\x02\x00\x00\x00\x00\x00\x00u\x02\x00\x00\x00\x00\x00\x00v\x02\x00\x00\x00\x00\x00\x00x\x02\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00X\x02\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00y\x02\x00\x00\x00\x00\x00\x00Z\x02\x00\x00\x00\x00\x00\x00z\x02\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00|\x02\x00\x00\x00\x00\x00\x00{\x02\x00\x00\x00\x00\x00\x00Q\x02\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00}\x02\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00{\x02\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00~\x02\x00\x00\x00\x00\x00\x00A\x00\x00\x00\x00\x00\x00\x00\x7f\x02\x00\x00\x00\x00\x00\x00\x7f\x02\x00\x00\x00\x00\x00\x00A\x00\x00\x00\x00\x00\x00\x00B\x00\x00\x00\x00\x00\x00\x00U\x02\x00\x00\x00\x00\x00\x00X\x02\x00\x00\x00\x00\x00\x00\x80\x02\x00\x00\x00\x00\x00\x00U\x02\x00\x00\x00\x00\x00\x00\x80\x02\x00\x00\x00\x00\x00\x00\x81\x02\x00\x00\x00\x00\x00\x00k\x02\x00\x00\x00\x00\x00\x00\x82\x02\x00\x00\x00\x00\x00\x00j\x02\x00\x00\x00\x00\x00\x00b\x02\x00\x00\x00\x00\x00\x00`\x02\x00\x00\x00\x00\x00\x00\x83\x02\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00\x84\x02\x00\x00\x00\x00\x00\x00}\x02\x00\x00\x00\x00\x00\x00q\x02\x00\x00\x00\x00\x00\x00\x86\x02\x00\x00\x00\x00\x00\x00\x85\x02\x00\x00\x00\x00\x00\x00z\x02\x00\x00\x00\x00\x00\x00Z\x02\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00w\x02\x00\x00\x00\x00\x00\x00\x88\x02\x00\x00\x00\x00\x00\x00\x87\x02\x00\x00\x00\x00\x00\x00w\x02\x00\x00\x00\x00\x00\x00\x87\x02\x00\x00\x00\x00\x00\x00\x89\x02\x00\x00\x00\x00\x00\x00u\x02\x00\x00\x00\x00\x00\x00\x8b\x02\x00\x00\x00\x00\x00\x00\x8a\x02\x00\x00\x00\x00\x00\x00\x88\x02\x00\x00\x00\x00\x00\x00\x8c\x02\x00\x00\x00\x00\x00\x00\x87\x02\x00\x00\x00\x00\x00\x00\x8d\x02\x00\x00\x00\x00\x00\x00v\x02\x00\x00\x00\x00\x00\x00\x8e\x02\x00\x00\x00\x00\x00\x00\x8c\x02\x00\x00\x00\x00\x00\x00\x88\x02\x00\x00\x00\x00\x00\x00m\x02\x00\x00\x00\x00\x00\x00\x8f\x02\x00\x00\x00\x00\x00\x00\x90\x02\x00\x00\x00\x00\x00\x00g\x02\x00\x00\x00\x00\x00\x00\x87\x02\x00\x00\x00\x00\x00\x00\x8c\x02\x00\x00\x00\x00\x00\x00\x91\x02\x00\x00\x00\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00\x94\x02\x00\x00\x00\x00\x00\x00\x93\x02\x00\x00\x00\x00\x00\x00[\x02\x00\x00\x00\x00\x00\x00~\x02\x00\x00\x00\x00\x00\x00\x95\x02\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00\x94\x00\x00\x00\x00\x00\x00\x00\x96\x02\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00S\x02\x00\x00\x00\x00\x00\x00\x96\x00\x00\x00\x00\x00\x00\x00\x97\x02\x00\x00\x00\x00\x00\x00\x99\x02\x00\x00\x00\x00\x00\x00\x98\x02\x00\x00\x00\x00\x00\x00\x9a\x02\x00\x00\x00\x00\x00\x00b\x02\x00\x00\x00\x00\x00\x00\x9b\x02\x00\x00\x00\x00\x00\x00\x94\x02\x00\x00\x00\x00\x00\x00\x9d\x02\x00\x00\x00\x00\x00\x00\x9c\x02\x00\x00\x00\x00\x00\x00s\x02\x00\x00\x00\x00\x00\x00\x97\x02\x00\x00\x00\x00\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\x9b\x02\x00\x00\x00\x00\x00\x00b\x02\x00\x00\x00\x00\x00\x00\x83\x02\x00\x00\x00\x00\x00\x00\x9f\x02\x00\x00\x00\x00\x00\x00\x9a\x02\x00\x00\x00\x00\x00\x00t\x02\x00\x00\x00\x00\x00\x00\x9f\x02\x00\x00\x00\x00\x00\x00t\x02\x00\x00\x00\x00\x00\x00\x8a\x02\x00\x00\x00\x00\x00\x00`\x02\x00\x00\x00\x00\x00\x00d\x02\x00\x00\x00\x00\x00\x00\xa0\x02\x00\x00\x00\x00\x00\x00\xa0\x02\x00\x00\x00\x00\x00\x00d\x02\x00\x00\x00\x00\x00\x00\x89\x02\x00\x00\x00\x00\x00\x00\x98\x02\x00\x00\x00\x00\x00\x00\xa1\x02\x00\x00\x00\x00\x00\x00\x97\x02\x00\x00\x00\x00\x00\x00\xa2\x02\x00\x00\x00\x00\x00\x00\xa3\x02\x00\x00\x00\x00\x00\x00\x9b\x02\x00\x00\x00\x00\x00\x00V\x02\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x82\x02\x00\x00\x00\x00\x00\x00k\x02\x00\x00\x00\x00\x00\x00\xa4\x02\x00\x00\x00\x00\x00\x00\x9b\x02\x00\x00\x00\x00\x00\x00\xa3\x02\x00\x00\x00\x00\x00\x00\x8e\x02\x00\x00\x00\x00\x00\x00\x98\x02\x00\x00\x00\x00\x00\x00\xa2\x02\x00\x00\x00\x00\x00\x00^\x02\x00\x00\x00\x00\x00\x00\x98\x02\x00\x00\x00\x00\x00\x00^\x02\x00\x00\x00\x00\x00\x00\xa1\x02\x00\x00\x00\x00\x00\x00f\x02\x00\x00\x00\x00\x00\x00\xa5\x02\x00\x00\x00\x00\x00\x00e\x02\x00\x00\x00\x00\x00\x00e\x02\x00\x00\x00\x00\x00\x00\xa5\x02\x00\x00\x00\x00\x00\x00\x98\x00\x00\x00\x00\x00\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\x97\x02\x00\x00\x00\x00\x00\x00\xa1\x02\x00\x00\x00\x00\x00\x00\x9c\x02\x00\x00\x00\x00\x00\x00\x9d\x02\x00\x00\x00\x00\x00\x00\xa6\x02\x00\x00\x00\x00\x00\x00Y\x02\x00\x00\x00\x00\x00\x00Z\x02\x00\x00\x00\x00\x00\x00y\x02\x00\x00\x00\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00\x93\x02\x00\x00\x00\x00\x00\x00J\x00\x00\x00\x00\x00\x00\x00}\x02\x00\x00\x00\x00\x00\x00\x82\x02\x00\x00\x00\x00\x00\x00\xa7\x02\x00\x00\x00\x00\x00\x00}\x02\x00\x00\x00\x00\x00\x00\xa7\x02\x00\x00\x00\x00\x00\x00Q\x02\x00\x00\x00\x00\x00\x00\xa8\x02\x00\x00\x00\x00\x00\x00\xaa\x02\x00\x00\x00\x00\x00\x00\xa9\x02\x00\x00\x00\x00\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00Q\x02\x00\x00\x00\x00\x00\x00\xa7\x02\x00\x00\x00\x00\x00\x00\xa8\x02\x00\x00\x00\x00\x00\x00\xa9\x02\x00\x00\x00\x00\x00\x00E\x00\x00\x00\x00\x00\x00\x00\xac\x02\x00\x00\x00\x00\x00\x00\xad\x02\x00\x00\x00\x00\x00\x00\x8b\x02\x00\x00\x00\x00\x00\x00\xae\x02\x00\x00\x00\x00\x00\x00\xb0\x02\x00\x00\x00\x00\x00\x00\xaf\x02\x00\x00\x00\x00\x00\x00\xb1\x02\x00\x00\x00\x00\x00\x00\x8b\x02\x00\x00\x00\x00\x00\x00\xad\x02\x00\x00\x00\x00\x00\x00x\x02\x00\x00\x00\x00\x00\x00\xac\x02\x00\x00\x00\x00\x00\x00\x8b\x02\x00\x00\x00\x00\x00\x00\x90\x02\x00\x00\x00\x00\x00\x00\xb2\x02\x00\x00\x00\x00\x00\x00\xa8\x02\x00\x00\x00\x00\x00\x00\x90\x02\x00\x00\x00\x00\x00\x00\xa8\x02\x00\x00\x00\x00\x00\x00F\x00\x00\x00\x00\x00\x00\x00u\x02\x00\x00\x00\x00\x00\x00x\x02\x00\x00\x00\x00\x00\x00\x8b\x02\x00\x00\x00\x00\x00\x00\xb3\x02\x00\x00\x00\x00\x00\x00\x85\x02\x00\x00\x00\x00\x00\x00\xa9\x02\x00\x00\x00\x00\x00\x00\xa9\x02\x00\x00\x00\x00\x00\x00\x85\x02\x00\x00\x00\x00\x00\x00D\x00\x00\x00\x00\x00\x00\x00\xb4\x02\x00\x00\x00\x00\x00\x00\x9e\x00\x00\x00\x00\x00\x00\x00\xb5\x02\x00\x00\x00\x00\x00\x00\xb6\x02\x00\x00\x00\x00\x00\x00{\x02\x00\x00\x00\x00\x00\x00c\x02\x00\x00\x00\x00\x00\x00\x82\x02\x00\x00\x00\x00\x00\x00\xa4\x02\x00\x00\x00\x00\x00\x00\xb7\x02\x00\x00\x00\x00\x00\x00\xb8\x02\x00\x00\x00\x00\x00\x00\xba\x02\x00\x00\x00\x00\x00\x00\xb9\x02\x00\x00\x00\x00\x00\x00\x82\x02\x00\x00\x00\x00\x00\x00\xb7\x02\x00\x00\x00\x00\x00\x00\xa7\x02\x00\x00\x00\x00\x00\x00\x8c\x02\x00\x00\x00\x00\x00\x00\xbb\x02\x00\x00\x00\x00\x00\x00\x91\x02\x00\x00\x00\x00\x00\x00\xbc\x02\x00\x00\x00\x00\x00\x00\xb9\x02\x00\x00\x00\x00\x00\x00\xba\x02\x00\x00\x00\x00\x00\x00\xbc\x02\x00\x00\x00\x00\x00\x00\xbd\x02\x00\x00\x00\x00\x00\x00\xb9\x02\x00\x00\x00\x00\x00\x00c\x02\x00\x00\x00\x00\x00\x00[\x02\x00\x00\x00\x00\x00\x00\xbe\x02\x00\x00\x00\x00\x00\x00\x86\x02\x00\x00\x00\x00\x00\x00q\x02\x00\x00\x00\x00\x00\x00\x7f\x02\x00\x00\x00\x00\x00\x00c\x02\x00\x00\x00\x00\x00\x00\xbe\x02\x00\x00\x00\x00\x00\x00\xb6\x02\x00\x00\x00\x00\x00\x00\x7f\x02\x00\x00\x00\x00\x00\x00B\x00\x00\x00\x00\x00\x00\x00\x86\x02\x00\x00\x00\x00\x00\x00\x86\x02\x00\x00\x00\x00\x00\x00B\x00\x00\x00\x00\x00\x00\x00C\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00W\x02\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\xaf\x02\x00\x00\x00\x00\x00\x00\xb0\x02\x00\x00\x00\x00\x00\x00l\x02\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00W\x02\x00\x00\x00\x00\x00\x00V\x02\x00\x00\x00\x00\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00\xa7\x02\x00\x00\x00\x00\x00\x00\xbf\x02\x00\x00\x00\x00\x00\x00\xbf\x02\x00\x00\x00\x00\x00\x00\xa7\x02\x00\x00\x00\x00\x00\x00\xc0\x02\x00\x00\x00\x00\x00\x00q\x02\x00\x00\x00\x00\x00\x00r\x02\x00\x00\x00\x00\x00\x00\x7f\x02\x00\x00\x00\x00\x00\x00\xc1\x02\x00\x00\x00\x00\x00\x00\xc2\x02\x00\x00\x00\x00\x00\x00f\x02\x00\x00\x00\x00\x00\x00\xc2\x02\x00\x00\x00\x00\x00\x00\xa5\x02\x00\x00\x00\x00\x00\x00f\x02\x00\x00\x00\x00\x00\x00\xc3\x02\x00\x00\x00\x00\x00\x00\x96\x02\x00\x00\x00\x00\x00\x00\xc4\x02\x00\x00\x00\x00\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\xa1\x02\x00\x00\x00\x00\x00\x00\xc5\x02\x00\x00\x00\x00\x00\x00]\x02\x00\x00\x00\x00\x00\x00\x91\x02\x00\x00\x00\x00\x00\x00\\\x02\x00\x00\x00\x00\x00\x00o\x02\x00\x00\x00\x00\x00\x00\xc0\x02\x00\x00\x00\x00\x00\x00\xc6\x02\x00\x00\x00\x00\x00\x00\xc1\x02\x00\x00\x00\x00\x00\x00f\x02\x00\x00\x00\x00\x00\x00\xc7\x02\x00\x00\x00\x00\x00\x00\x9d\x02\x00\x00\x00\x00\x00\x00\xb0\x02\x00\x00\x00\x00\x00\x00\xc8\x02\x00\x00\x00\x00\x00\x00\x91\x02\x00\x00\x00\x00\x00\x00\xbb\x02\x00\x00\x00\x00\x00\x00\\\x02\x00\x00\x00\x00\x00\x00\x9d\x02\x00\x00\x00\x00\x00\x00\xc8\x02\x00\x00\x00\x00\x00\x00\xa6\x02\x00\x00\x00\x00\x00\x00\x96\x02\x00\x00\x00\x00\x00\x00\xc3\x02\x00\x00\x00\x00\x00\x00\x84\x02\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00\x96\x02\x00\x00\x00\x00\x00\x00\x84\x02\x00\x00\x00\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00K\x00\x00\x00\x00\x00\x00\x00l\x02\x00\x00\x00\x00\x00\x00l\x02\x00\x00\x00\x00\x00\x00\xb0\x02\x00\x00\x00\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00\xc7\x02\x00\x00\x00\x00\x00\x00\xc9\x02\x00\x00\x00\x00\x00\x00\xc1\x02\x00\x00\x00\x00\x00\x00\xc1\x02\x00\x00\x00\x00\x00\x00\xc9\x02\x00\x00\x00\x00\x00\x00\xca\x02\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00Z\x02\x00\x00\x00\x00\x00\x00|\x02\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00|\x02\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00\xb0\x02\x00\x00\x00\x00\x00\x00\x9d\x02\x00\x00\x00\x00\x00\x00j\x02\x00\x00\x00\x00\x00\x00\x82\x02\x00\x00\x00\x00\x00\x00\x84\x02\x00\x00\x00\x00\x00\x00T\x02\x00\x00\x00\x00\x00\x00\xcb\x02\x00\x00\x00\x00\x00\x00\xc6\x02\x00\x00\x00\x00\x00\x00\x94\x02\x00\x00\x00\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00\x9d\x02\x00\x00\x00\x00\x00\x00\xcc\x02\x00\x00\x00\x00\x00\x00V\x02\x00\x00\x00\x00\x00\x00T\x02\x00\x00\x00\x00\x00\x00\xcc\x02\x00\x00\x00\x00\x00\x00T\x02\x00\x00\x00\x00\x00\x00\xc6\x02\x00\x00\x00\x00\x00\x00\xa4\x02\x00\x00\x00\x00\x00\x00\xcc\x02\x00\x00\x00\x00\x00\x00\xc6\x02\x00\x00\x00\x00\x00\x00\xcc\x02\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00V\x02\x00\x00\x00\x00\x00\x00\x90\x02\x00\x00\x00\x00\x00\x00\x8f\x02\x00\x00\x00\x00\x00\x00\xb2\x02\x00\x00\x00\x00\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\xc5\x02\x00\x00\x00\x00\x00\x00\xcd\x02\x00\x00\x00\x00\x00\x00\xbb\x02\x00\x00\x00\x00\x00\x00\xc5\x02\x00\x00\x00\x00\x00\x00\\\x02\x00\x00\x00\x00\x00\x00\xc5\x02\x00\x00\x00\x00\x00\x00\xbb\x02\x00\x00\x00\x00\x00\x00\xcd\x02\x00\x00\x00\x00\x00\x00\x99\x02\x00\x00\x00\x00\x00\x00\xaa\x02\x00\x00\x00\x00\x00\x00\xce\x02\x00\x00\x00\x00\x00\x00\xc5\x02\x00\x00\x00\x00\x00\x00\xa1\x02\x00\x00\x00\x00\x00\x00\\\x02\x00\x00\x00\x00\x00\x00\xb2\x02\x00\x00\x00\x00\x00\x00\xce\x02\x00\x00\x00\x00\x00\x00\xaa\x02\x00\x00\x00\x00\x00\x00\x99\x02\x00\x00\x00\x00\x00\x00\xce\x02\x00\x00\x00\x00\x00\x00\xcf\x02\x00\x00\x00\x00\x00\x00\xb5\x02\x00\x00\x00\x00\x00\x00\x9e\x00\x00\x00\x00\x00\x00\x00\x9d\x00\x00\x00\x00\x00\x00\x00j\x02\x00\x00\x00\x00\x00\x00\x84\x02\x00\x00\x00\x00\x00\x00\xc3\x02\x00\x00\x00\x00\x00\x00\x97\x02\x00\x00\x00\x00\x00\x00s\x02\x00\x00\x00\x00\x00\x00q\x02\x00\x00\x00\x00\x00\x00Y\x02\x00\x00\x00\x00\x00\x00~\x02\x00\x00\x00\x00\x00\x00[\x02\x00\x00\x00\x00\x00\x00\xc3\x02\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x00\xc0\x02\x00\x00\x00\x00\x00\x00\xb7\x02\x00\x00\x00\x00\x00\x00\xc6\x02\x00\x00\x00\x00\x00\x00\xb7\x02\x00\x00\x00\x00\x00\x00\xa4\x02\x00\x00\x00\x00\x00\x00\xc6\x02\x00\x00\x00\x00\x00\x00\xb7\x02\x00\x00\x00\x00\x00\x00\xc0\x02\x00\x00\x00\x00\x00\x00\xa7\x02\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00Z\x02\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\xd0\x02\x00\x00\x00\x00\x00\x00\xd1\x02\x00\x00\x00\x00\x00\x00g\x02\x00\x00\x00\x00\x00\x00\xaf\x02\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00_\x02\x00\x00\x00\x00\x00\x00S\x02\x00\x00\x00\x00\x00\x00Q\x02\x00\x00\x00\x00\x00\x00_\x02\x00\x00\x00\x00\x00\x00Q\x02\x00\x00\x00\x00\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00\xc4\x02\x00\x00\x00\x00\x00\x00\x96\x02\x00\x00\x00\x00\x00\x00\x93\x00\x00\x00\x00\x00\x00\x00j\x02\x00\x00\x00\x00\x00\x00\xc3\x02\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x00I\x00\x00\x00\x00\x00\x00\x00h\x02\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x00\x00\x00\x00\xd1\x02\x00\x00\x00\x00\x00\x00\xd0\x02\x00\x00\x00\x00\x00\x00\xb9\x02\x00\x00\x00\x00\x00\x00\xb4\x02\x00\x00\x00\x00\x00\x00\xc8\x02\x00\x00\x00\x00\x00\x00\xae\x02\x00\x00\x00\x00\x00\x00\xae\x02\x00\x00\x00\x00\x00\x00\xaf\x02\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00\xae\x02\x00\x00\x00\x00\x00\x00\x9e\x00\x00\x00\x00\x00\x00\x00\xb4\x02\x00\x00\x00\x00\x00\x00\xbd\x02\x00\x00\x00\x00\x00\x00\xd1\x02\x00\x00\x00\x00\x00\x00\xb9\x02\x00\x00\x00\x00\x00\x00\x96\x02\x00\x00\x00\x00\x00\x00\x94\x00\x00\x00\x00\x00\x00\x00\x93\x00\x00\x00\x00\x00\x00\x00\x84\x02\x00\x00\x00\x00\x00\x00\x82\x02\x00\x00\x00\x00\x00\x00}\x02\x00\x00\x00\x00\x00\x00\xc8\x02\x00\x00\x00\x00\x00\x00\xb4\x02\x00\x00\x00\x00\x00\x00\xa6\x02\x00\x00\x00\x00\x00\x00\xb4\x02\x00\x00\x00\x00\x00\x00\xd2\x02\x00\x00\x00\x00\x00\x00\xa6\x02\x00\x00\x00\x00\x00\x00\xc4\x02\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\xc3\x02\x00\x00\x00\x00\x00\x00\xc2\x02\x00\x00\x00\x00\x00\x00\xc1\x02\x00\x00\x00\x00\x00\x00\xd3\x02\x00\x00\x00\x00\x00\x00\xc1\x02\x00\x00\x00\x00\x00\x00\xca\x02\x00\x00\x00\x00\x00\x00\xd3\x02\x00\x00\x00\x00\x00\x00o\x02\x00\x00\x00\x00\x00\x00p\x02\x00\x00\x00\x00\x00\x00\xc9\x02\x00\x00\x00\x00\x00\x00\xc9\x02\x00\x00\x00\x00\x00\x00p\x02\x00\x00\x00\x00\x00\x00\xca\x02\x00\x00\x00\x00\x00\x00\xca\x02\x00\x00\x00\x00\x00\x00p\x02\x00\x00\x00\x00\x00\x00\x9f\x02\x00\x00\x00\x00\x00\x00p\x02\x00\x00\x00\x00\x00\x00\xd4\x02\x00\x00\x00\x00\x00\x00\x9f\x02\x00\x00\x00\x00\x00\x00m\x02\x00\x00\x00\x00\x00\x00{\x02\x00\x00\x00\x00\x00\x00\xd5\x02\x00\x00\x00\x00\x00\x00\x8d\x02\x00\x00\x00\x00\x00\x00\xbc\x02\x00\x00\x00\x00\x00\x00v\x02\x00\x00\x00\x00\x00\x00x\x02\x00\x00\x00\x00\x00\x00v\x02\x00\x00\x00\x00\x00\x00\xbc\x02\x00\x00\x00\x00\x00\x00\x8d\x02\x00\x00\x00\x00\x00\x00\xbd\x02\x00\x00\x00\x00\x00\x00\xbc\x02\x00\x00\x00\x00\x00\x00\xd4\x02\x00\x00\x00\x00\x00\x00a\x02\x00\x00\x00\x00\x00\x00b\x02\x00\x00\x00\x00\x00\x00\xd5\x02\x00\x00\x00\x00\x00\x00{\x02\x00\x00\x00\x00\x00\x00\xb6\x02\x00\x00\x00\x00\x00\x00\x99\x02\x00\x00\x00\x00\x00\x00\xcf\x02\x00\x00\x00\x00\x00\x00\x98\x02\x00\x00\x00\x00\x00\x00_\x02\x00\x00\x00\x00\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00f\x02\x00\x00\x00\x00\x00\x00\x9e\x00\x00\x00\x00\x00\x00\x00\xae\x02\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00\xc7\x02\x00\x00\x00\x00\x00\x00f\x02\x00\x00\x00\x00\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00j\x02\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x00l\x02\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\xaf\x02\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00l\x02\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\xc8\x02\x00\x00\x00\x00\x00\x00\xb0\x02\x00\x00\x00\x00\x00\x00\xae\x02\x00\x00\x00\x00\x00\x00l\x02\x00\x00\x00\x00\x00\x00L\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00d\x02\x00\x00\x00\x00\x00\x00a\x02\x00\x00\x00\x00\x00\x00\xd6\x02\x00\x00\x00\x00\x00\x00a\x02\x00\x00\x00\x00\x00\x00\xd4\x02\x00\x00\x00\x00\x00\x00\xd6\x02\x00\x00\x00\x00\x00\x00\xb9\x02\x00\x00\x00\x00\x00\x00\xd0\x02\x00\x00\x00\x00\x00\x00\x9c\x02\x00\x00\x00\x00\x00\x00\xbe\x02\x00\x00\x00\x00\x00\x00\x95\x02\x00\x00\x00\x00\x00\x00\xcd\x02\x00\x00\x00\x00\x00\x00\xb6\x02\x00\x00\x00\x00\x00\x00\xbe\x02\x00\x00\x00\x00\x00\x00\xcd\x02\x00\x00\x00\x00\x00\x00\x95\x02\x00\x00\x00\x00\x00\x00\xbe\x02\x00\x00\x00\x00\x00\x00[\x02\x00\x00\x00\x00\x00\x00\xcd\x02\x00\x00\x00\x00\x00\x00\xbb\x02\x00\x00\x00\x00\x00\x00\xb6\x02\x00\x00\x00\x00\x00\x00\xcd\x02\x00\x00\x00\x00\x00\x00\x95\x02\x00\x00\x00\x00\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\xb9\x02\x00\x00\x00\x00\x00\x00\x9c\x02\x00\x00\x00\x00\x00\x00\xb8\x02\x00\x00\x00\x00\x00\x00w\x02\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\xac\x02\x00\x00\x00\x00\x00\x00x\x02\x00\x00\x00\x00\x00\x00\xba\x02\x00\x00\x00\x00\x00\x00\xc4\x02\x00\x00\x00\x00\x00\x00\x93\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\xc4\x02\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xad\x02\x00\x00\x00\x00\x00\x00\xd8\x02\x00\x00\x00\x00\x00\x00\xd7\x02\x00\x00\x00\x00\x00\x00\xd8\x02\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\xd7\x02\x00\x00\x00\x00\x00\x00q\x02\x00\x00\x00\x00\x00\x00\x85\x02\x00\x00\x00\x00\x00\x00\xb3\x02\x00\x00\x00\x00\x00\x00K\x00\x00\x00\x00\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00J\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\xd8\x02\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x8f\x02\x00\x00\x00\x00\x00\x00\xd1\x02\x00\x00\x00\x00\x00\x00\xd9\x02\x00\x00\x00\x00\x00\x00\xce\x02\x00\x00\x00\x00\x00\x00\xb2\x02\x00\x00\x00\x00\x00\x00\xd9\x02\x00\x00\x00\x00\x00\x00\xd9\x02\x00\x00\x00\x00\x00\x00\xb2\x02\x00\x00\x00\x00\x00\x00\x8f\x02\x00\x00\x00\x00\x00\x00\xda\x02\x00\x00\x00\x00\x00\x00\xdb\x02\x00\x00\x00\x00\x00\x00\xac\x02\x00\x00\x00\x00\x00\x00\xba\x02\x00\x00\x00\x00\x00\x00\xda\x02\x00\x00\x00\x00\x00\x00\xac\x02\x00\x00\x00\x00\x00\x00U\x02\x00\x00\x00\x00\x00\x00\xcb\x02\x00\x00\x00\x00\x00\x00T\x02\x00\x00\x00\x00\x00\x00\xcb\x02\x00\x00\x00\x00\x00\x00U\x02\x00\x00\x00\x00\x00\x00\x81\x02\x00\x00\x00\x00\x00\x00\xcf\x02\x00\x00\x00\x00\x00\x00\xce\x02\x00\x00\x00\x00\x00\x00\xa3\x02\x00\x00\x00\x00\x00\x00\xd1\x02\x00\x00\x00\x00\x00\x00\xbd\x02\x00\x00\x00\x00\x00\x00\xd9\x02\x00\x00\x00\x00\x00\x00h\x02\x00\x00\x00\x00\x00\x00\xd0\x02\x00\x00\x00\x00\x00\x00g\x02\x00\x00\x00\x00\x00\x00\xd0\x02\x00\x00\x00\x00\x00\x00\x94\x02\x00\x00\x00\x00\x00\x00\x9c\x02\x00\x00\x00\x00\x00\x00\x94\x02\x00\x00\x00\x00\x00\x00\xd0\x02\x00\x00\x00\x00\x00\x00h\x02\x00\x00\x00\x00\x00\x00~\x02\x00\x00\x00\x00\x00\x00Y\x02\x00\x00\x00\x00\x00\x00A\x00\x00\x00\x00\x00\x00\x00\xb3\x02\x00\x00\x00\x00\x00\x00\xa9\x02\x00\x00\x00\x00\x00\x00\xaa\x02\x00\x00\x00\x00\x00\x00\x89\x02\x00\x00\x00\x00\x00\x00d\x02\x00\x00\x00\x00\x00\x00\x81\x02\x00\x00\x00\x00\x00\x00E\x00\x00\x00\x00\x00\x00\x00\xa9\x02\x00\x00\x00\x00\x00\x00D\x00\x00\x00\x00\x00\x00\x00y\x02\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00Y\x02\x00\x00\x00\x00\x00\x00Y\x02\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00A\x00\x00\x00\x00\x00\x00\x00\xa0\x02\x00\x00\x00\x00\x00\x00\x91\x02\x00\x00\x00\x00\x00\x00]\x02\x00\x00\x00\x00\x00\x00\xa0\x02\x00\x00\x00\x00\x00\x00]\x02\x00\x00\x00\x00\x00\x00`\x02\x00\x00\x00\x00\x00\x00\xb8\x02\x00\x00\x00\x00\x00\x00\xdc\x02\x00\x00\x00\x00\x00\x00\xba\x02\x00\x00\x00\x00\x00\x00\x97\x02\x00\x00\x00\x00\x00\x00q\x02\x00\x00\x00\x00\x00\x00\xb3\x02\x00\x00\x00\x00\x00\x00n\x02\x00\x00\x00\x00\x00\x00\xcb\x02\x00\x00\x00\x00\x00\x00\xd6\x02\x00\x00\x00\x00\x00\x00\xd4\x02\x00\x00\x00\x00\x00\x00p\x02\x00\x00\x00\x00\x00\x00n\x02\x00\x00\x00\x00\x00\x00\xd4\x02\x00\x00\x00\x00\x00\x00n\x02\x00\x00\x00\x00\x00\x00\xd6\x02\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x88\x02\x00\x00\x00\x00\x00\x00w\x02\x00\x00\x00\x00\x00\x00\xb5\x02\x00\x00\x00\x00\x00\x00\x9d\x00\x00\x00\x00\x00\x00\x00\xdd\x02\x00\x00\x00\x00\x00\x00\xb5\x02\x00\x00\x00\x00\x00\x00\xd2\x02\x00\x00\x00\x00\x00\x00\xb4\x02\x00\x00\x00\x00\x00\x00\xa3\x02\x00\x00\x00\x00\x00\x00\xd9\x02\x00\x00\x00\x00\x00\x00\x8d\x02\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00y\x02\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x00\x00\x00\xd9\x02\x00\x00\x00\x00\x00\x00\xa3\x02\x00\x00\x00\x00\x00\x00\xce\x02\x00\x00\x00\x00\x00\x00\xdc\x02\x00\x00\x00\x00\x00\x00\xda\x02\x00\x00\x00\x00\x00\x00\xba\x02\x00\x00\x00\x00\x00\x00\xd9\x02\x00\x00\x00\x00\x00\x00\xbd\x02\x00\x00\x00\x00\x00\x00\x8d\x02\x00\x00\x00\x00\x00\x00\xdc\x02\x00\x00\x00\x00\x00\x00\xb8\x02\x00\x00\x00\x00\x00\x00\xa6\x02\x00\x00\x00\x00\x00\x00\x99\x02\x00\x00\x00\x00\x00\x00\xb3\x02\x00\x00\x00\x00\x00\x00\xaa\x02\x00\x00\x00\x00\x00\x00\xcf\x02\x00\x00\x00\x00\x00\x00\xa3\x02\x00\x00\x00\x00\x00\x00\xa2\x02\x00\x00\x00\x00\x00\x00\x8f\x02\x00\x00\x00\x00\x00\x00g\x02\x00\x00\x00\x00\x00\x00\xd1\x02\x00\x00\x00\x00\x00\x00\xdc\x02\x00\x00\x00\x00\x00\x00\xd2\x02\x00\x00\x00\x00\x00\x00\xda\x02\x00\x00\x00\x00\x00\x00]\x02\x00\x00\x00\x00\x00\x00\x83\x02\x00\x00\x00\x00\x00\x00`\x02\x00\x00\x00\x00\x00\x00\x83\x02\x00\x00\x00\x00\x00\x00]\x02\x00\x00\x00\x00\x00\x00^\x02\x00\x00\x00\x00\x00\x00\xd2\x02\x00\x00\x00\x00\x00\x00\xdc\x02\x00\x00\x00\x00\x00\x00\xa6\x02\x00\x00\x00\x00\x00\x00\x99\x02\x00\x00\x00\x00\x00\x00\x97\x02\x00\x00\x00\x00\x00\x00\xb3\x02\x00\x00\x00\x00\x00\x00\x9f\x02\x00\x00\x00\x00\x00\x00\x8a\x02\x00\x00\x00\x00\x00\x00\xca\x02\x00\x00\x00\x00\x00\x00\x9f\x02\x00\x00\x00\x00\x00\x00\xd4\x02\x00\x00\x00\x00\x00\x00\x9a\x02\x00\x00\x00\x00\x00\x00\xd7\x02\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\xde\x02\x00\x00\x00\x00\x00\x00\xb1\x02\x00\x00\x00\x00\x00\x00\xd7\x02\x00\x00\x00\x00\x00\x00\xde\x02\x00\x00\x00\x00\x00\x00\xb1\x02\x00\x00\x00\x00\x00\x00\xde\x02\x00\x00\x00\x00\x00\x00\xc2\x02\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\xde\x02\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\xda\x02\x00\x00\x00\x00\x00\x00\xdf\x02\x00\x00\x00\x00\x00\x00\xdb\x02\x00\x00\x00\x00\x00\x00\xd2\x02\x00\x00\x00\x00\x00\x00\xdf\x02\x00\x00\x00\x00\x00\x00\xda\x02\x00\x00\x00\x00\x00\x00\xd2\x02\x00\x00\x00\x00\x00\x00\xb5\x02\x00\x00\x00\x00\x00\x00\xdd\x02\x00\x00\x00\x00\x00\x00k\x02\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\xcc\x02\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\xcc\x02\x00\x00\x00\x00\x00\x00\xc2\x02\x00\x00\x00\x00\x00\x00\xde\x02\x00\x00\x00\x00\x00\x00\xa5\x02\x00\x00\x00\x00\x00\x00\x98\x00\x00\x00\x00\x00\x00\x00\xa5\x02\x00\x00\x00\x00\x00\x00\xde\x02\x00\x00\x00\x00\x00\x00\x98\x00\x00\x00\x00\x00\x00\x00\xde\x02\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\xdb\x02\x00\x00\x00\x00\x00\x00\xdf\x02\x00\x00\x00\x00\x00\x00\xd8\x02\x00\x00\x00\x00\x00\x00\xdf\x02\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\xd8\x02\x00\x00\x00\x00\x00\x00\\\x02\x00\x00\x00\x00\x00\x00\xa1\x02\x00\x00\x00\x00\x00\x00^\x02\x00\x00\x00\x00\x00\x00z\x02\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x00\x00\x00y\x02\x00\x00\x00\x00\x00\x00z\x02\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\xdf\x02\x00\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00z\x02\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00x\x02\x00\x00\x00\x00\x00\x00\xbc\x02\x00\x00\x00\x00\x00\x00\xba\x02\x00\x00\x00\x00\x00\x00\xb8\x02\x00\x00\x00\x00\x00\x00\x9c\x02\x00\x00\x00\x00\x00\x00\xa6\x02\x00\x00\x00\x00\x00\x00\xd6\x02\x00\x00\x00\x00\x00\x00\x81\x02\x00\x00\x00\x00\x00\x00d\x02\x00\x00\x00\x00\x00\x00\x81\x02\x00\x00\x00\x00\x00\x00\xd6\x02\x00\x00\x00\x00\x00\x00\xcb\x02\x00\x00\x00\x00\x00\x00s\x02\x00\x00\x00\x00\x00\x00\x95\x02\x00\x00\x00\x00\x00\x00r\x02\x00\x00\x00\x00\x00\x00\x95\x02\x00\x00\x00\x00\x00\x00s\x02\x00\x00\x00\x00\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\xdd\x02\x00\x00\x00\x00\x00\x00\x9d\x00\x00\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x8d\x02\x00\x00\x00\x00\x00\x00\x8e\x02\x00\x00\x00\x00\x00\x00\xa3\x02\x00\x00\x00\x00\x00\x00o\x02\x00\x00\x00\x00\x00\x00\xc9\x02\x00\x00\x00\x00\x00\x00\xc0\x02\x00\x00\x00\x00\x00\x00\xcb\x02\x00\x00\x00\x00\x00\x00n\x02\x00\x00\x00\x00\x00\x00\xc6\x02\x00\x00\x00\x00\x00\x00n\x02\x00\x00\x00\x00\x00\x00o\x02\x00\x00\x00\x00\x00\x00\xc6\x02\x00\x00\x00\x00\x00\x00\x80\x02\x00\x00\x00\x00\x00\x00w\x02\x00\x00\x00\x00\x00\x00\x89\x02\x00\x00\x00\x00\x00\x00w\x02\x00\x00\x00\x00\x00\x00\x80\x02\x00\x00\x00\x00\x00\x00X\x02\x00\x00\x00\x00\x00\x00\xbf\x02\x00\x00\x00\x00\x00\x00\xc0\x02\x00\x00\x00\x00\x00\x00\xc9\x02\x00\x00\x00\x00\x00\x00u\x02\x00\x00\x00\x00\x00\x00\x8a\x02\x00\x00\x00\x00\x00\x00t\x02\x00\x00\x00\x00\x00\x00\xbf\x02\x00\x00\x00\x00\x00\x00\xc7\x02\x00\x00\x00\x00\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00\xc7\x02\x00\x00\x00\x00\x00\x00\xbf\x02\x00\x00\x00\x00\x00\x00\xc9\x02\x00\x00\x00\x00\x00\x00\x81\x02\x00\x00\x00\x00\x00\x00\x80\x02\x00\x00\x00\x00\x00\x00\x89\x02\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00{\x02\x00\x00\x00\x00\x00\x00m\x02\x00\x00\x00\x00\x00\x00\x88\x02\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\xd4\x02\x00\x00\x00\x00\x00\x00b\x02\x00\x00\x00\x00\x00\x00\x9a\x02\x00\x00\x00\x00\x00\x00~\x02\x00\x00\x00\x00\x00\x00r\x02\x00\x00\x00\x00\x00\x00\x95\x02\x00\x00\x00\x00\x00\x00\xcc\x02\x00\x00\x00\x00\x00\x00\xa4\x02\x00\x00\x00\x00\x00\x00k\x02\x00\x00\x00\x00\x00\x00r\x02\x00\x00\x00\x00\x00\x00~\x02\x00\x00\x00\x00\x00\x00\x7f\x02\x00\x00\x00\x00\x00\x00c\x02\x00\x00\x00\x00\x00\x00{\x02\x00\x00\x00\x00\x00\x00|\x02\x00\x00\x00\x00\x00\x00\x9b\x02\x00\x00\x00\x00\x00\x00\x83\x02\x00\x00\x00\x00\x00\x00\xa2\x02\x00\x00\x00\x00\x00\x00\x9b\x02\x00\x00\x00\x00\x00\x00\x8e\x02\x00\x00\x00\x00\x00\x00\x9a\x02\x00\x00\x00\x00\x00\x00\xd8\x02\x00\x00\x00\x00\x00\x00\xad\x02\x00\x00\x00\x00\x00\x00\xdb\x02\x00\x00\x00\x00\x00\x00\xad\x02\x00\x00\x00\x00\x00\x00\xac\x02\x00\x00\x00\x00\x00\x00\xdb\x02\x00\x00\x00\x00\x00\x00G\x00\x00\x00\x00\x00\x00\x00i\x02\x00\x00\x00\x00\x00\x00\x90\x02\x00\x00\x00\x00\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x90\x02\x00\x00\x00\x00\x00\x00F\x00\x00\x00\x00\x00\x00\x00\xd7\x02\x00\x00\x00\x00\x00\x00\xb1\x02\x00\x00\x00\x00\x00\x00\xad\x02\x00\x00\x00\x00\x00\x00i\x02\x00\x00\x00\x00\x00\x00g\x02\x00\x00\x00\x00\x00\x00\x90\x02\x00\x00\x00\x00\x00\x00D\x00\x00\x00\x00\x00\x00\x00\x85\x02\x00\x00\x00\x00\x00\x00C\x00\x00\x00\x00\x00\x00\x00\xd5\x02\x00\x00\x00\x00\x00\x00\xbb\x02\x00\x00\x00\x00\x00\x00\x8c\x02\x00\x00\x00\x00\x00\x00\x8a\x02\x00\x00\x00\x00\x00\x00\x8b\x02\x00\x00\x00\x00\x00\x00\xd3\x02\x00\x00\x00\x00\x00\x00\x8b\x02\x00\x00\x00\x00\x00\x00\xb1\x02\x00\x00\x00\x00\x00\x00\xd3\x02\x00\x00\x00\x00\x00\x00i\x02\x00\x00\x00\x00\x00\x00G\x00\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x00\x00\x00\x00\x98\x02\x00\x00\x00\x00\x00\x00\xcf\x02\x00\x00\x00\x00\x00\x00\xa2\x02\x00\x00\x00\x00\x00\x00\xa8\x02\x00\x00\x00\x00\x00\x00E\x00\x00\x00\x00\x00\x00\x00F\x00\x00\x00\x00\x00\x00\x00\x8e\x02\x00\x00\x00\x00\x00\x00v\x02\x00\x00\x00\x00\x00\x00t\x02\x00\x00\x00\x00\x00\x00\xa8\x02\x00\x00\x00\x00\x00\x00\xb2\x02\x00\x00\x00\x00\x00\x00\xaa\x02\x00\x00\x00\x00\x00\x00m\x02\x00\x00\x00\x00\x00\x00\xd5\x02\x00\x00\x00\x00\x00\x00\x8c\x02\x00\x00\x00\x00\x00\x00\xc2\x02\x00\x00\x00\x00\x00\x00\xd3\x02\x00\x00\x00\x00\x00\x00\xb1\x02\x00\x00\x00\x00\x00\x00\x8a\x02\x00\x00\x00\x00\x00\x00\xd3\x02\x00\x00\x00\x00\x00\x00\xca\x02\x00\x00\x00\x00\x00\x00\xbb\x02\x00\x00\x00\x00\x00\x00\xd5\x02\x00\x00\x00\x00\x00\x00\xb6\x02\x00\x00\x00\x00\x00\x00\x86\x02\x00\x00\x00\x00\x00\x00C\x00\x00\x00\x00\x00\x00\x00\x85\x02\x00\x00\x00\x00\x00\x00\x8e\x02\x00\x00\x00\x00\x00\x00t\x02\x00\x00\x00\x00\x00\x00\x9a\x02\x00\x00\x00\x00\x00\x00e\x02\x00\x00\x00\x00\x00\x00\x98\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x83\x02\x00\x00\x00\x00\x00\x00^\x02\x00\x00\x00\x00\x00\x00\xa2\x02\x00\x00\x00\x00\x00\x00|\x02\x00\x00\x00\x00\x00\x00Z\x02\x00\x00\x00\x00\x00\x00c\x02\x00\x00\x00\x00\x00\x00\x88\x02\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00m\x02\x00\x00\x00\x00\x00\x00W\x02\x00\x00\x00\x00\x00\x00U\x02\x00\x00\x00\x00\x00\x00V\x02\x00\x00\x00\x00\x00\x00\xdd\x02\x00\x00\x00\x00\x00\x00\xdf\x02\x00\x00\x00\x00\x00\x00\xd2\x02\x00\x00\x00\x00\x00\x00U\x02\x00\x00\x00\x00\x00\x00W\x02\x00\x00\x00\x00\x00\x00X\x02\x00\x00\x00\x00\x00\x00\x87\x02\x00\x00\x00\x00\x00\x00\xa0\x02\x00\x00\x00\x00\x00\x00\x89\x02\x00\x00\x00\x00\x00\x00\xdf\x02\x00\x00\x00\x00\x00\x00\xdd\x02\x00\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x93\x02\x00\x00\x00\x00\x00\x00h\x02\x00\x00\x00\x00\x00\x00I\x00\x00\x00\x00\x00\x00\x00\xa0\x02\x00\x00\x00\x00\x00\x00\x87\x02\x00\x00\x00\x00\x00\x00\x91\x02\x00\x00\x00\x00\x00\x00J\x00\x00\x00\x00\x00\x00\x00\x93\x02\x00\x00\x00\x00\x00\x00I\x00\x00\x00\x00\x00\x00\x00h\x02\x00\x00\x00\x00\x00\x00\x93\x02\x00\x00\x00\x00\x00\x00\x94\x02\x00\x00\x00\x00\x00\x00\xe0\x02\x00\x00\x00\x00\x00\x00\xe2\x02\x00\x00\x00\x00\x00\x00\xe1\x02\x00\x00\x00\x00\x00\x00\xe3\x02\x00\x00\x00\x00\x00\x00J\x00\x00\x00\x00\x00\x00\x00\xe4\x02\x00\x00\x00\x00\x00\x00\xe5\x02\x00\x00\x00\x00\x00\x00\xe0\x02\x00\x00\x00\x00\x00\x00\xe6\x02\x00\x00\x00\x00\x00\x00\xe0\x02\x00\x00\x00\x00\x00\x00\xe1\x02\x00\x00\x00\x00\x00\x00G\x00\x00\x00\x00\x00\x00\x00\xe4\x02\x00\x00\x00\x00\x00\x00J\x00\x00\x00\x00\x00\x00\x00I\x00\x00\x00\x00\x00\x00\x00\xe7\x02\x00\x00\x00\x00\x00\x00\xe9\x02\x00\x00\x00\x00\x00\x00\xe8\x02\x00\x00\x00\x00\x00\x00\xe7\x02\x00\x00\x00\x00\x00\x00\xe8\x02\x00\x00\x00\x00\x00\x00\xea\x02\x00\x00\x00\x00\x00\x00\xe4\x02\x00\x00\x00\x00\x00\x00I\x00\x00\x00\x00\x00\x00\x00\xeb\x02\x00\x00\x00\x00\x00\x00\xeb\x02\x00\x00\x00\x00\x00\x00I\x00\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x00\x00\x00\x00\xec\x02\x00\x00\x00\x00\x00\x00\xee\x02\x00\x00\x00\x00\x00\x00\xed\x02\x00\x00\x00\x00\x00\x00\xef\x02\x00\x00\x00\x00\x00\x00\xe8\x02\x00\x00\x00\x00\x00\x00\xf0\x02\x00\x00\x00\x00\x00\x00\xed\x02\x00\x00\x00\x00\x00\x00\xf1\x02\x00\x00\x00\x00\x00\x00\xec\x02\x00\x00\x00\x00\x00\x00\xec\x02\x00\x00\x00\x00\x00\x00\xf1\x02\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x00\x00\xf2\x02\x00\x00\x00\x00\x00\x00\xf4\x02\x00\x00\x00\x00\x00\x00\xf3\x02\x00\x00\x00\x00\x00\x00\xf2\x02\x00\x00\x00\x00\x00\x00\xf3\x02\x00\x00\x00\x00\x00\x00\xf5\x02\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\xf7\x02\x00\x00\x00\x00\x00\x00\xf6\x02\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x00\x00\xf1\x02\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xf8\x02\x00\x00\x00\x00\x00\x00\xfa\x02\x00\x00\x00\x00\x00\x00\xf9\x02\x00\x00\x00\x00\x00\x00\xfb\x02\x00\x00\x00\x00\x00\x00\xfd\x02\x00\x00\x00\x00\x00\x00\xfc\x02\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\xf6\x02\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\xfe\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xff\x02\x00\x00\x00\x00\x00\x00\xe5\x02\x00\x00\x00\x00\x00\x00\xe6\x02\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00\x00\x00\x00\xfb\x02\x00\x00\x00\x00\x00\x00\xfc\x02\x00\x00\x00\x00\x00\x00\x02\x03\x00\x00\x00\x00\x00\x00\xec\x02\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00\x00\x00\x00\x00\xee\x02\x00\x00\x00\x00\x00\x00\xee\x02\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00\x00\x00\x00\x00L\x00\x00\x00\x00\x00\x00\x00\xff\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x04\x03\x00\x00\x00\x00\x00\x00\xf8\x02\x00\x00\x00\x00\x00\x00\xf9\x02\x00\x00\x00\x00\x00\x00C\x00\x00\x00\x00\x00\x00\x00\x05\x03\x00\x00\x00\x00\x00\x00\x06\x03\x00\x00\x00\x00\x00\x00\xf1\x02\x00\x00\x00\x00\x00\x00\x07\x03\x00\x00\x00\x00\x00\x00\t\x03\x00\x00\x00\x00\x00\x00\x08\x03\x00\x00\x00\x00\x00\x00\xe0\x02\x00\x00\x00\x00\x00\x00\xe5\x02\x00\x00\x00\x00\x00\x00\xe2\x02\x00\x00\x00\x00\x00\x00\x08\x03\x00\x00\x00\x00\x00\x00\t\x03\x00\x00\x00\x00\x00\x00\n\x03\x00\x00\x00\x00\x00\x00\xeb\x02\x00\x00\x00\x00\x00\x00\x0b\x03\x00\x00\x00\x00\x00\x00\xe4\x02\x00\x00\x00\x00\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x00\x0e\x03\x00\x00\x00\x00\x00\x00\r\x03\x00\x00\x00\x00\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x00\r\x03\x00\x00\x00\x00\x00\x00\x0f\x03\x00\x00\x00\x00\x00\x00\x07\x03\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\t\x03\x00\x00\x00\x00\x00\x00\x06\x03\x00\x00\x00\x00\x00\x00\x10\x03\x00\x00\x00\x00\x00\x00\xa5\x00\x00\x00\x00\x00\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x00\x12\x03\x00\x00\x00\x00\x00\x00\x11\x03\x00\x00\x00\x00\x00\x00\t\x03\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x13\x03\x00\x00\x00\x00\x00\x00\x15\x03\x00\x00\x00\x00\x00\x00\x14\x03\x00\x00\x00\x00\x00\x00\x13\x03\x00\x00\x00\x00\x00\x00\x14\x03\x00\x00\x00\x00\x00\x00\x16\x03\x00\x00\x00\x00\x00\x00\x11\x03\x00\x00\x00\x00\x00\x00\x17\x03\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x18\x03\x00\x00\x00\x00\x00\x00\x1a\x03\x00\x00\x00\x00\x00\x00\x19\x03\x00\x00\x00\x00\x00\x00\x18\x03\x00\x00\x00\x00\x00\x00\x19\x03\x00\x00\x00\x00\x00\x00\x1b\x03\x00\x00\x00\x00\x00\x00\x1c\x03\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\xe3\x02\x00\x00\x00\x00\x00\x00\xe4\x02\x00\x00\x00\x00\x00\x00\x0b\x03\x00\x00\x00\x00\x00\x00\xe3\x02\x00\x00\x00\x00\x00\x00\x0b\x03\x00\x00\x00\x00\x00\x00\x1d\x03\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xf1\x02\x00\x00\x00\x00\x00\x00\x06\x03\x00\x00\x00\x00\x00\x00\x1e\x03\x00\x00\x00\x00\x00\x00 \x03\x00\x00\x00\x00\x00\x00\x1f\x03\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x06\x03\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00!\x03\x00\x00\x00\x00\x00\x00#\x03\x00\x00\x00\x00\x00\x00"\x03\x00\x00\x00\x00\x00\x00\x18\x03\x00\x00\x00\x00\x00\x00$\x03\x00\x00\x00\x00\x00\x00\xfe\x02\x00\x00\x00\x00\x00\x00\x18\x03\x00\x00\x00\x00\x00\x00\xfe\x02\x00\x00\x00\x00\x00\x00\xf0\x02\x00\x00\x00\x00\x00\x00\xfb\x02\x00\x00\x00\x00\x00\x00!\x03\x00\x00\x00\x00\x00\x00%\x03\x00\x00\x00\x00\x00\x00&\x03\x00\x00\x00\x00\x00\x00\'\x03\x00\x00\x00\x00\x00\x00\r\x03\x00\x00\x00\x00\x00\x00(\x03\x00\x00\x00\x00\x00\x00*\x03\x00\x00\x00\x00\x00\x00)\x03\x00\x00\x00\x00\x00\x00+\x03\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\xe2\x02\x00\x00\x00\x00\x00\x00-\x03\x00\x00\x00\x00\x00\x00,\x03\x00\x00\x00\x00\x00\x00\'\x03\x00\x00\x00\x00\x00\x00+\x03\x00\x00\x00\x00\x00\x00.\x03\x00\x00\x00\x00\x00\x00\x1f\x03\x00\x00\x00\x00\x00\x000\x03\x00\x00\x00\x00\x00\x00/\x03\x00\x00\x00\x00\x00\x00,\x03\x00\x00\x00\x00\x00\x00-\x03\x00\x00\x00\x00\x00\x001\x03\x00\x00\x00\x00\x00\x00#\x03\x00\x00\x00\x00\x00\x002\x03\x00\x00\x00\x00\x00\x00"\x03\x00\x00\x00\x00\x00\x00\xfb\x02\x00\x00\x00\x00\x00\x00#\x03\x00\x00\x00\x00\x00\x00!\x03\x00\x00\x00\x00\x00\x003\x03\x00\x00\x00\x00\x00\x00\xe5\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x05\x03\x00\x00\x00\x00\x00\x00\xf1\x02\x00\x00\x00\x00\x00\x004\x03\x00\x00\x00\x00\x00\x00\x0e\x03\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x003\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x005\x03\x00\x00\x00\x00\x00\x00\x05\x03\x00\x00\x00\x00\x00\x004\x03\x00\x00\x00\x00\x00\x006\x03\x00\x00\x00\x00\x00\x006\x03\x00\x00\x00\x00\x00\x004\x03\x00\x00\x00\x00\x00\x00\x1d\x03\x00\x00\x00\x00\x00\x00\n\x03\x00\x00\x00\x00\x00\x00\t\x03\x00\x00\x00\x00\x00\x00\xf6\x02\x00\x00\x00\x00\x00\x00\x11\x03\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\n\x03\x00\x00\x00\x00\x00\x00\xf6\x02\x00\x00\x00\x00\x00\x00%\x03\x00\x00\x00\x00\x00\x00.\x03\x00\x00\x00\x00\x00\x008\x03\x00\x00\x00\x00\x00\x007\x03\x00\x00\x00\x00\x00\x007\x03\x00\x00\x00\x00\x00\x008\x03\x00\x00\x00\x00\x00\x009\x03\x00\x00\x00\x00\x00\x00:\x03\x00\x00\x00\x00\x00\x00<\x03\x00\x00\x00\x00\x00\x00;\x03\x00\x00\x00\x00\x00\x00\x0b\x03\x00\x00\x00\x00\x00\x00\xeb\x02\x00\x00\x00\x00\x00\x001\x03\x00\x00\x00\x00\x00\x00\x0b\x03\x00\x00\x00\x00\x00\x001\x03\x00\x00\x00\x00\x00\x00=\x03\x00\x00\x00\x00\x00\x009\x03\x00\x00\x00\x00\x00\x00?\x03\x00\x00\x00\x00\x00\x00>\x03\x00\x00\x00\x00\x00\x00@\x03\x00\x00\x00\x00\x00\x00\xf5\x02\x00\x00\x00\x00\x00\x00>\x03\x00\x00\x00\x00\x00\x00\xf5\x02\x00\x00\x00\x00\x00\x009\x03\x00\x00\x00\x00\x00\x00>\x03\x00\x00\x00\x00\x00\x00"\x03\x00\x00\x00\x00\x00\x002\x03\x00\x00\x00\x00\x00\x00A\x03\x00\x00\x00\x00\x00\x00\x1f\x03\x00\x00\x00\x00\x00\x00@\x03\x00\x00\x00\x00\x00\x00>\x03\x00\x00\x00\x00\x00\x005\x03\x00\x00\x00\x00\x00\x00;\x03\x00\x00\x00\x00\x00\x00<\x03\x00\x00\x00\x00\x00\x00\x1d\x03\x00\x00\x00\x00\x00\x00\x0b\x03\x00\x00\x00\x00\x00\x00=\x03\x00\x00\x00\x00\x00\x00\x1d\x03\x00\x00\x00\x00\x00\x00=\x03\x00\x00\x00\x00\x00\x006\x03\x00\x00\x00\x00\x00\x00B\x03\x00\x00\x00\x00\x00\x00\x16\x03\x00\x00\x00\x00\x00\x00;\x03\x00\x00\x00\x00\x00\x00\x12\x03\x00\x00\x00\x00\x00\x00\xe7\x02\x00\x00\x00\x00\x00\x00C\x03\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00D\x03\x00\x00\x00\x00\x00\x00*\x03\x00\x00\x00\x00\x00\x00*\x03\x00\x00\x00\x00\x00\x00D\x03\x00\x00\x00\x00\x00\x00E\x03\x00\x00\x00\x00\x00\x00\x12\x03\x00\x00\x00\x00\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x00\x0f\x03\x00\x00\x00\x00\x00\x00\x08\x03\x00\x00\x00\x00\x00\x00\n\x03\x00\x00\x00\x00\x00\x00F\x03\x00\x00\x00\x00\x00\x00\x16\x03\x00\x00\x00\x00\x00\x00:\x03\x00\x00\x00\x00\x00\x00;\x03\x00\x00\x00\x00\x00\x00%\x03\x00\x00\x00\x00\x00\x00!\x03\x00\x00\x00\x00\x00\x00\n\x03\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00*\x03\x00\x00\x00\x00\x00\x00A\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00&\x03\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00B\x00\x00\x00\x00\x00\x00\x00\xf8\x02\x00\x00\x00\x00\x00\x00C\x00\x00\x00\x00\x00\x00\x00\x1c\x03\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x17\x03\x00\x00\x00\x00\x00\x00G\x03\x00\x00\x00\x00\x00\x006\x03\x00\x00\x00\x00\x00\x00=\x03\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00\x00\x00\x00E\x00\x00\x00\x00\x00\x00\x00H\x03\x00\x00\x00\x00\x00\x00I\x03\x00\x00\x00\x00\x00\x00J\x03\x00\x00\x00\x00\x00\x000\x03\x00\x00\x00\x00\x00\x00C\x03\x00\x00\x00\x00\x00\x00\xe7\x02\x00\x00\x00\x00\x00\x00K\x03\x00\x00\x00\x00\x00\x00E\x00\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00\x00\x00\x00\xe6\x02\x00\x00\x00\x00\x00\x00L\x03\x00\x00\x00\x00\x00\x00\x11\x03\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00I\x03\x00\x00\x00\x00\x00\x00M\x03\x00\x00\x00\x00\x00\x00J\x03\x00\x00\x00\x00\x00\x00N\x03\x00\x00\x00\x00\x00\x001\x03\x00\x00\x00\x00\x00\x00-\x03\x00\x00\x00\x00\x00\x00N\x03\x00\x00\x00\x00\x00\x00-\x03\x00\x00\x00\x00\x00\x00<\x03\x00\x00\x00\x00\x00\x00\x15\x03\x00\x00\x00\x00\x00\x00\x05\x03\x00\x00\x00\x00\x00\x006\x03\x00\x00\x00\x00\x00\x00=\x03\x00\x00\x00\x00\x00\x001\x03\x00\x00\x00\x00\x00\x00N\x03\x00\x00\x00\x00\x00\x00=\x03\x00\x00\x00\x00\x00\x00N\x03\x00\x00\x00\x00\x00\x00G\x03\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\xf7\x02\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00O\x03\x00\x00\x00\x00\x00\x00B\x03\x00\x00\x00\x00\x00\x00$\x03\x00\x00\x00\x00\x00\x00\x15\x03\x00\x00\x00\x00\x00\x006\x03\x00\x00\x00\x00\x00\x00G\x03\x00\x00\x00\x00\x00\x00>\x03\x00\x00\x00\x00\x00\x00\x1e\x03\x00\x00\x00\x00\x00\x00\x1f\x03\x00\x00\x00\x00\x00\x00\xfd\x02\x00\x00\x00\x00\x00\x00P\x03\x00\x00\x00\x00\x00\x00\xfc\x02\x00\x00\x00\x00\x00\x00B\x03\x00\x00\x00\x00\x00\x00;\x03\x00\x00\x00\x00\x00\x00$\x03\x00\x00\x00\x00\x00\x00K\x03\x00\x00\x00\x00\x00\x00\xe7\x02\x00\x00\x00\x00\x00\x00\xea\x02\x00\x00\x00\x00\x00\x00Q\x03\x00\x00\x00\x00\x00\x00S\x03\x00\x00\x00\x00\x00\x00R\x03\x00\x00\x00\x00\x00\x00Q\x03\x00\x00\x00\x00\x00\x00R\x03\x00\x00\x00\x00\x00\x00T\x03\x00\x00\x00\x00\x00\x00R\x03\x00\x00\x00\x00\x00\x00S\x03\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\x00\x00\x00\x00R\x03\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\x00\x00\x00\x00\xa6\x00\x00\x00\x00\x00\x00\x00\xfc\x02\x00\x00\x00\x00\x00\x00P\x03\x00\x00\x00\x00\x00\x00\xae\x00\x00\x00\x00\x00\x00\x00I\x03\x00\x00\x00\x00\x00\x00Q\x03\x00\x00\x00\x00\x00\x00M\x03\x00\x00\x00\x00\x00\x00U\x03\x00\x00\x00\x00\x00\x00D\x03\x00\x00\x00\x00\x00\x00V\x03\x00\x00\x00\x00\x00\x00D\x03\x00\x00\x00\x00\x00\x00U\x03\x00\x00\x00\x00\x00\x00E\x03\x00\x00\x00\x00\x00\x00\xe3\x02\x00\x00\x00\x00\x00\x00K\x00\x00\x00\x00\x00\x00\x00J\x00\x00\x00\x00\x00\x00\x00W\x03\x00\x00\x00\x00\x00\x00\x1e\x03\x00\x00\x00\x00\x00\x00A\x03\x00\x00\x00\x00\x00\x00\x1e\x03\x00\x00\x00\x00\x00\x00W\x03\x00\x00\x00\x00\x00\x00 \x03\x00\x00\x00\x00\x00\x00\xf7\x02\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\xfd\x02\x00\x00\x00\x00\x00\x00\xfb\x02\x00\x00\x00\x00\x00\x00\xf7\x02\x00\x00\x00\x00\x00\x00\xfd\x02\x00\x00\x00\x00\x00\x00G\x00\x00\x00\x00\x00\x00\x00F\x00\x00\x00\x00\x00\x00\x00\xe0\x02\x00\x00\x00\x00\x00\x00\xfd\x02\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00I\x03\x00\x00\x00\x00\x00\x00Y\x03\x00\x00\x00\x00\x00\x00X\x03\x00\x00\x00\x00\x00\x00\xe3\x02\x00\x00\x00\x00\x00\x00\xee\x02\x00\x00\x00\x00\x00\x00K\x00\x00\x00\x00\x00\x00\x00E\x00\x00\x00\x00\x00\x00\x00D\x00\x00\x00\x00\x00\x00\x00H\x03\x00\x00\x00\x00\x00\x00\xf9\x02\x00\x00\x00\x00\x00\x00D\x00\x00\x00\x00\x00\x00\x00C\x00\x00\x00\x00\x00\x00\x00\x15\x03\x00\x00\x00\x00\x00\x00[\x03\x00\x00\x00\x00\x00\x00Z\x03\x00\x00\x00\x00\x00\x00Z\x03\x00\x00\x00\x00\x00\x00[\x03\x00\x00\x00\x00\x00\x00\x10\x03\x00\x00\x00\x00\x00\x00Q\x03\x00\x00\x00\x00\x00\x00I\x03\x00\x00\x00\x00\x00\x00X\x03\x00\x00\x00\x00\x00\x00\\\x03\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00B\x03\x00\x00\x00\x00\x00\x00O\x03\x00\x00\x00\x00\x00\x00J\x03\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00]\x03\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00<\x03\x00\x00\x00\x00\x00\x00-\x03\x00\x00\x00\x00\x00\x003\x03\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00L\x03\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00*\x03\x00\x00\x00\x00\x00\x00E\x03\x00\x00\x00\x00\x00\x00)\x03\x00\x00\x00\x00\x00\x00\x10\x03\x00\x00\x00\x00\x00\x00\xa6\x00\x00\x00\x00\x00\x00\x00\xa5\x00\x00\x00\x00\x00\x00\x00)\x03\x00\x00\x00\x00\x00\x00E\x03\x00\x00\x00\x00\x00\x00\x1c\x03\x00\x00\x00\x00\x00\x00O\x03\x00\x00\x00\x00\x00\x000\x03\x00\x00\x00\x00\x00\x00J\x03\x00\x00\x00\x00\x00\x00U\x03\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x1c\x03\x00\x00\x00\x00\x00\x00\x17\x03\x00\x00\x00\x00\x00\x00)\x03\x00\x00\x00\x00\x00\x00\x1c\x03\x00\x00\x00\x00\x00\x00E\x03\x00\x00\x00\x00\x00\x00U\x03\x00\x00\x00\x00\x00\x00*\x03\x00\x00\x00\x00\x00\x00^\x03\x00\x00\x00\x00\x00\x00A\x00\x00\x00\x00\x00\x00\x00\xec\x02\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x00\x00\xa1\x00\x00\x00\x00\x00\x00\x00\x11\x03\x00\x00\x00\x00\x00\x00\x12\x03\x00\x00\x00\x00\x00\x00\x17\x03\x00\x00\x00\x00\x00\x00S\x03\x00\x00\x00\x00\x00\x00Q\x03\x00\x00\x00\x00\x00\x00X\x03\x00\x00\x00\x00\x00\x00\x08\x03\x00\x00\x00\x00\x00\x008\x03\x00\x00\x00\x00\x00\x00\x07\x03\x00\x00\x00\x00\x00\x00\x1c\x03\x00\x00\x00\x00\x00\x00U\x03\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\xef\x02\x00\x00\x00\x00\x00\x00`\x03\x00\x00\x00\x00\x00\x00_\x03\x00\x00\x00\x00\x00\x00`\x03\x00\x00\x00\x00\x00\x00\xef\x02\x00\x00\x00\x00\x00\x00\xff\x02\x00\x00\x00\x00\x00\x00\xef\x02\x00\x00\x00\x00\x00\x00\xf0\x02\x00\x00\x00\x00\x00\x00\xff\x02\x00\x00\x00\x00\x00\x00%\x03\x00\x00\x00\x00\x00\x00\xf7\x02\x00\x00\x00\x00\x00\x00\xfb\x02\x00\x00\x00\x00\x00\x00S\x03\x00\x00\x00\x00\x00\x00X\x03\x00\x00\x00\x00\x00\x00a\x03\x00\x00\x00\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x00\x00S\x03\x00\x00\x00\x00\x00\x00a\x03\x00\x00\x00\x00\x00\x000\x03\x00\x00\x00\x00\x00\x00\x1f\x03\x00\x00\x00\x00\x00\x00 \x03\x00\x00\x00\x00\x00\x00D\x03\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x00\x00\x00 \x03\x00\x00\x00\x00\x00\x00W\x03\x00\x00\x00\x00\x00\x00Y\x03\x00\x00\x00\x00\x00\x00V\x03\x00\x00\x00\x00\x00\x00D\x03\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x00\x00\x00\x06\x03\x00\x00\x00\x00\x00\x00\xa5\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x00L\x03\x00\x00\x00\x00\x00\x00\x0e\x03\x00\x00\x00\x00\x00\x00L\x03\x00\x00\x00\x00\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x00\x11\x03\x00\x00\x00\x00\x00\x00L\x03\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x0e\x03\x00\x00\x00\x00\x00\x00\xe9\x02\x00\x00\x00\x00\x00\x00\x1a\x03\x00\x00\x00\x00\x00\x00\xe8\x02\x00\x00\x00\x00\x00\x00\xe9\x02\x00\x00\x00\x00\x00\x00b\x03\x00\x00\x00\x00\x00\x00\x1a\x03\x00\x00\x00\x00\x00\x00V\x03\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00U\x03\x00\x00\x00\x00\x00\x00G\x03\x00\x00\x00\x00\x00\x00\x14\x03\x00\x00\x00\x00\x00\x00\x15\x03\x00\x00\x00\x00\x00\x00[\x03\x00\x00\x00\x00\x00\x00\x15\x03\x00\x00\x00\x00\x00\x00\x13\x03\x00\x00\x00\x00\x00\x008\x03\x00\x00\x00\x00\x00\x00\x08\x03\x00\x00\x00\x00\x00\x009\x03\x00\x00\x00\x00\x00\x00?\x03\x00\x00\x00\x00\x00\x00\x08\x03\x00\x00\x00\x00\x00\x00F\x03\x00\x00\x00\x00\x00\x00\x08\x03\x00\x00\x00\x00\x00\x00?\x03\x00\x00\x00\x00\x00\x009\x03\x00\x00\x00\x00\x00\x00\xef\x02\x00\x00\x00\x00\x00\x00\xea\x02\x00\x00\x00\x00\x00\x00\xe8\x02\x00\x00\x00\x00\x00\x00\xef\x02\x00\x00\x00\x00\x00\x00_\x03\x00\x00\x00\x00\x00\x00\xea\x02\x00\x00\x00\x00\x00\x00 \x03\x00\x00\x00\x00\x00\x00Y\x03\x00\x00\x00\x00\x00\x00I\x03\x00\x00\x00\x00\x00\x00\xe3\x02\x00\x00\x00\x00\x00\x00\xed\x02\x00\x00\x00\x00\x00\x00\xee\x02\x00\x00\x00\x00\x00\x00b\x03\x00\x00\x00\x00\x00\x00\xe9\x02\x00\x00\x00\x00\x00\x00c\x03\x00\x00\x00\x00\x00\x00\xe9\x02\x00\x00\x00\x00\x00\x00\x0f\x03\x00\x00\x00\x00\x00\x00c\x03\x00\x00\x00\x00\x00\x00\xed\x02\x00\x00\x00\x00\x00\x00\xe3\x02\x00\x00\x00\x00\x00\x00\x1d\x03\x00\x00\x00\x00\x00\x00\xed\x02\x00\x00\x00\x00\x00\x00\x1d\x03\x00\x00\x00\x00\x00\x004\x03\x00\x00\x00\x00\x00\x00\xe9\x02\x00\x00\x00\x00\x00\x00\xe7\x02\x00\x00\x00\x00\x00\x00\x12\x03\x00\x00\x00\x00\x00\x00\x0f\x03\x00\x00\x00\x00\x00\x00\xe9\x02\x00\x00\x00\x00\x00\x00\x12\x03\x00\x00\x00\x00\x00\x00\x07\x03\x00\x00\x00\x00\x00\x008\x03\x00\x00\x00\x00\x00\x00\\\x03\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x07\x03\x00\x00\x00\x00\x00\x00\\\x03\x00\x00\x00\x00\x00\x00\x07\x03\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x16\x03\x00\x00\x00\x00\x00\x00B\x03\x00\x00\x00\x00\x00\x00J\x03\x00\x00\x00\x00\x00\x000\x03\x00\x00\x00\x00\x00\x00O\x03\x00\x00\x00\x00\x00\x00/\x03\x00\x00\x00\x00\x00\x00d\x03\x00\x00\x00\x00\x00\x00\x02\x03\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x00\x00\x00\x00+\x03\x00\x00\x00\x00\x00\x00\'\x03\x00\x00\x00\x00\x00\x00&\x03\x00\x00\x00\x00\x00\x00F\x03\x00\x00\x00\x00\x00\x00!\x03\x00\x00\x00\x00\x00\x00"\x03\x00\x00\x00\x00\x00\x00!\x03\x00\x00\x00\x00\x00\x00F\x03\x00\x00\x00\x00\x00\x00\n\x03\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00+\x03\x00\x00\x00\x00\x00\x00&\x03\x00\x00\x00\x00\x00\x00#\x03\x00\x00\x00\x00\x00\x00\x02\x03\x00\x00\x00\x00\x00\x00d\x03\x00\x00\x00\x00\x00\x00d\x03\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00]\x03\x00\x00\x00\x00\x00\x00I\x03\x00\x00\x00\x00\x00\x000\x03\x00\x00\x00\x00\x00\x00 \x03\x00\x00\x00\x00\x00\x00\xf0\x02\x00\x00\x00\x00\x00\x00\xe8\x02\x00\x00\x00\x00\x00\x00\x1a\x03\x00\x00\x00\x00\x00\x00N\x03\x00\x00\x00\x00\x00\x00\x14\x03\x00\x00\x00\x00\x00\x00G\x03\x00\x00\x00\x00\x00\x00\x14\x03\x00\x00\x00\x00\x00\x00N\x03\x00\x00\x00\x00\x00\x00:\x03\x00\x00\x00\x00\x00\x00\x16\x03\x00\x00\x00\x00\x00\x00\x14\x03\x00\x00\x00\x00\x00\x00:\x03\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00d\x03\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x00\x00\x00\x00^\x03\x00\x00\x00\x00\x00\x00(\x03\x00\x00\x00\x00\x00\x00\xf8\x02\x00\x00\x00\x00\x00\x003\x03\x00\x00\x00\x00\x00\x00\xe2\x02\x00\x00\x00\x00\x00\x00\xe5\x02\x00\x00\x00\x00\x00\x00V\x03\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00V\x03\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00]\x03\x00\x00\x00\x00\x00\x00e\x03\x00\x00\x00\x00\x00\x002\x03\x00\x00\x00\x00\x00\x00e\x03\x00\x00\x00\x00\x00\x00]\x03\x00\x00\x00\x00\x00\x00f\x03\x00\x00\x00\x00\x00\x00]\x03\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00f\x03\x00\x00\x00\x00\x00\x00R\x03\x00\x00\x00\x00\x00\x00[\x03\x00\x00\x00\x00\x00\x00T\x03\x00\x00\x00\x00\x00\x00[\x03\x00\x00\x00\x00\x00\x00R\x03\x00\x00\x00\x00\x00\x00\x10\x03\x00\x00\x00\x00\x00\x00\xf1\x02\x00\x00\x00\x00\x00\x00\xed\x02\x00\x00\x00\x00\x00\x004\x03\x00\x00\x00\x00\x00\x00\x02\x03\x00\x00\x00\x00\x00\x00#\x03\x00\x00\x00\x00\x00\x00\xfb\x02\x00\x00\x00\x00\x00\x00\x02\x03\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x00\x00\x00\x00R\x03\x00\x00\x00\x00\x00\x00\xa6\x00\x00\x00\x00\x00\x00\x00\x10\x03\x00\x00\x00\x00\x00\x00g\x03\x00\x00\x00\x00\x00\x00\xf8\x02\x00\x00\x00\x00\x00\x00(\x03\x00\x00\x00\x00\x00\x00*\x03\x00\x00\x00\x00\x00\x00(\x03\x00\x00\x00\x00\x00\x00^\x03\x00\x00\x00\x00\x00\x00\x04\x03\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00\x00\x00\x00`\x03\x00\x00\x00\x00\x00\x00#\x03\x00\x00\x00\x00\x00\x00d\x03\x00\x00\x00\x00\x00\x002\x03\x00\x00\x00\x00\x00\x00F\x00\x00\x00\x00\x00\x00\x00\xe6\x02\x00\x00\x00\x00\x00\x00\xe0\x02\x00\x00\x00\x00\x00\x00\xfa\x02\x00\x00\x00\x00\x00\x00_\x03\x00\x00\x00\x00\x00\x00`\x03\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00\x00\x00\x00\x04\x03\x00\x00\x00\x00\x00\x00\xe5\x02\x00\x00\x00\x00\x00\x00\xe2\x02\x00\x00\x00\x00\x00\x003\x03\x00\x00\x00\x00\x00\x00-\x03\x00\x00\x00\x00\x00\x00\xfc\x02\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\x02\x03\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\xfc\x02\x00\x00\x00\x00\x00\x00\xae\x00\x00\x00\x00\x00\x00\x00Z\x03\x00\x00\x00\x00\x00\x00\x06\x03\x00\x00\x00\x00\x00\x00\x05\x03\x00\x00\x00\x00\x00\x00\x15\x03\x00\x00\x00\x00\x00\x00Z\x03\x00\x00\x00\x00\x00\x00\x05\x03\x00\x00\x00\x00\x00\x00\x06\x03\x00\x00\x00\x00\x00\x00Z\x03\x00\x00\x00\x00\x00\x00\x10\x03\x00\x00\x00\x00\x00\x00,\x03\x00\x00\x00\x00\x00\x00\xeb\x02\x00\x00\x00\x00\x00\x00\xe1\x02\x00\x00\x00\x00\x00\x00P\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\xae\x00\x00\x00\x00\x00\x00\x00>\x03\x00\x00\x00\x00\x00\x00?\x03\x00\x00\x00\x00\x00\x00h\x03\x00\x00\x00\x00\x00\x00P\x03\x00\x00\x00\x00\x00\x00\xfd\x02\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x1e\x03\x00\x00\x00\x00\x00\x00>\x03\x00\x00\x00\x00\x00\x00h\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00P\x03\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00e\x03\x00\x00\x00\x00\x00\x00Y\x03\x00\x00\x00\x00\x00\x00W\x03\x00\x00\x00\x00\x00\x00\xe2\x02\x00\x00\x00\x00\x00\x00,\x03\x00\x00\x00\x00\x00\x00\xe1\x02\x00\x00\x00\x00\x00\x007\x03\x00\x00\x00\x00\x00\x00\xf5\x02\x00\x00\x00\x00\x00\x00\xf3\x02\x00\x00\x00\x00\x00\x00.\x03\x00\x00\x00\x00\x00\x007\x03\x00\x00\x00\x00\x00\x00\xf3\x02\x00\x00\x00\x00\x00\x00\xf5\x02\x00\x00\x00\x00\x00\x007\x03\x00\x00\x00\x00\x00\x009\x03\x00\x00\x00\x00\x00\x00.\x03\x00\x00\x00\x00\x00\x00\\\x03\x00\x00\x00\x00\x00\x008\x03\x00\x00\x00\x00\x00\x00\xf3\x02\x00\x00\x00\x00\x00\x00\'\x03\x00\x00\x00\x00\x00\x00.\x03\x00\x00\x00\x00\x00\x00"\x03\x00\x00\x00\x00\x00\x00A\x03\x00\x00\x00\x00\x00\x00h\x03\x00\x00\x00\x00\x00\x00\'\x03\x00\x00\x00\x00\x00\x00\xf3\x02\x00\x00\x00\x00\x00\x00\xf4\x02\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\xf6\x02\x00\x00\x00\x00\x00\x00\t\x03\x00\x00\x00\x00\x00\x00F\x03\x00\x00\x00\x00\x00\x00"\x03\x00\x00\x00\x00\x00\x00h\x03\x00\x00\x00\x00\x00\x00%\x03\x00\x00\x00\x00\x00\x00\xf6\x02\x00\x00\x00\x00\x00\x00\xf7\x02\x00\x00\x00\x00\x00\x00\xeb\x02\x00\x00\x00\x00\x00\x00,\x03\x00\x00\x00\x00\x00\x001\x03\x00\x00\x00\x00\x00\x00c\x03\x00\x00\x00\x00\x00\x00\r\x03\x00\x00\x00\x00\x00\x00\xf4\x02\x00\x00\x00\x00\x00\x00b\x03\x00\x00\x00\x00\x00\x00\xf2\x02\x00\x00\x00\x00\x00\x00i\x03\x00\x00\x00\x00\x00\x00\xf2\x02\x00\x00\x00\x00\x00\x00b\x03\x00\x00\x00\x00\x00\x00\xf4\x02\x00\x00\x00\x00\x00\x00\xf2\x02\x00\x00\x00\x00\x00\x00\xf5\x02\x00\x00\x00\x00\x00\x00i\x03\x00\x00\x00\x00\x00\x00\x16\x03\x00\x00\x00\x00\x00\x00J\x03\x00\x00\x00\x00\x00\x00M\x03\x00\x00\x00\x00\x00\x00\r\x03\x00\x00\x00\x00\x00\x00c\x03\x00\x00\x00\x00\x00\x00\x0f\x03\x00\x00\x00\x00\x00\x00Y\x03\x00\x00\x00\x00\x00\x00e\x03\x00\x00\x00\x00\x00\x00X\x03\x00\x00\x00\x00\x00\x00b\x03\x00\x00\x00\x00\x00\x00c\x03\x00\x00\x00\x00\x00\x00\xf4\x02\x00\x00\x00\x00\x00\x00h\x03\x00\x00\x00\x00\x00\x00?\x03\x00\x00\x00\x00\x00\x00F\x03\x00\x00\x00\x00\x00\x00\x18\x03\x00\x00\x00\x00\x00\x00\x1b\x03\x00\x00\x00\x00\x00\x00$\x03\x00\x00\x00\x00\x00\x00\x18\x03\x00\x00\x00\x00\x00\x00\xf0\x02\x00\x00\x00\x00\x00\x00\x1a\x03\x00\x00\x00\x00\x00\x00h\x03\x00\x00\x00\x00\x00\x00A\x03\x00\x00\x00\x00\x00\x00\x1e\x03\x00\x00\x00\x00\x00\x00\xe6\x02\x00\x00\x00\x00\x00\x00F\x00\x00\x00\x00\x00\x00\x00E\x00\x00\x00\x00\x00\x00\x00\xff\x02\x00\x00\x00\x00\x00\x00\xf0\x02\x00\x00\x00\x00\x00\x00\xfe\x02\x00\x00\x00\x00\x00\x00\xff\x02\x00\x00\x00\x00\x00\x00\x04\x03\x00\x00\x00\x00\x00\x00`\x03\x00\x00\x00\x00\x00\x00\'\x03\x00\x00\x00\x00\x00\x00\xf4\x02\x00\x00\x00\x00\x00\x00\r\x03\x00\x00\x00\x00\x00\x00\x13\x03\x00\x00\x00\x00\x00\x00\x16\x03\x00\x00\x00\x00\x00\x00M\x03\x00\x00\x00\x00\x00\x00\x13\x03\x00\x00\x00\x00\x00\x00T\x03\x00\x00\x00\x00\x00\x00[\x03\x00\x00\x00\x00\x00\x00T\x03\x00\x00\x00\x00\x00\x00\x13\x03\x00\x00\x00\x00\x00\x00M\x03\x00\x00\x00\x00\x00\x005\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xfe\x02\x00\x00\x00\x00\x00\x00M\x03\x00\x00\x00\x00\x00\x00Q\x03\x00\x00\x00\x00\x00\x00T\x03\x00\x00\x00\x00\x00\x00\x04\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\xe5\x02\x00\x00\x00\x00\x00\x00\x19\x03\x00\x00\x00\x00\x00\x00b\x03\x00\x00\x00\x00\x00\x00i\x03\x00\x00\x00\x00\x00\x003\x03\x00\x00\x00\x00\x00\x005\x03\x00\x00\x00\x00\x00\x00<\x03\x00\x00\x00\x00\x00\x00\x1b\x03\x00\x00\x00\x00\x00\x00\x19\x03\x00\x00\x00\x00\x00\x00i\x03\x00\x00\x00\x00\x00\x00e\x03\x00\x00\x00\x00\x00\x00W\x03\x00\x00\x00\x00\x00\x002\x03\x00\x00\x00\x00\x00\x00b\x03\x00\x00\x00\x00\x00\x00\x19\x03\x00\x00\x00\x00\x00\x00\x1a\x03\x00\x00\x00\x00\x00\x00a\x03\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x00\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x00\x00a\x03\x00\x00\x00\x00\x00\x00X\x03\x00\x00\x00\x00\x00\x00e\x03\x00\x00\x00\x00\x00\x00W\x03\x00\x00\x00\x00\x00\x00A\x03\x00\x00\x00\x00\x00\x002\x03\x00\x00\x00\x00\x00\x00\x1f\x03\x00\x00\x00\x00\x00\x00/\x03\x00\x00\x00\x00\x00\x00@\x03\x00\x00\x00\x00\x00\x00/\x03\x00\x00\x00\x00\x00\x00\x1b\x03\x00\x00\x00\x00\x00\x00@\x03\x00\x00\x00\x00\x00\x005\x03\x00\x00\x00\x00\x00\x00\xfe\x02\x00\x00\x00\x00\x00\x00$\x03\x00\x00\x00\x00\x00\x00i\x03\x00\x00\x00\x00\x00\x00\xf5\x02\x00\x00\x00\x00\x00\x00@\x03\x00\x00\x00\x00\x00\x00\x1b\x03\x00\x00\x00\x00\x00\x00i\x03\x00\x00\x00\x00\x00\x00@\x03\x00\x00\x00\x00\x00\x00f\x03\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x00\x00\x00\x00a\x03\x00\x00\x00\x00\x00\x00e\x03\x00\x00\x00\x00\x00\x00f\x03\x00\x00\x00\x00\x00\x00a\x03\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x00\x00\x00\x00f\x03\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00C\x03\x00\x00\x00\x00\x00\x00K\x03\x00\x00\x00\x00\x00\x00)\x03\x00\x00\x00\x00\x00\x00<\x03\x00\x00\x00\x00\x00\x00:\x03\x00\x00\x00\x00\x00\x00N\x03\x00\x00\x00\x00\x00\x00C\x03\x00\x00\x00\x00\x00\x00\x17\x03\x00\x00\x00\x00\x00\x00\x12\x03\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x00\x00\x00\x00\xe1\x02\x00\x00\x00\x00\x00\x00\xeb\x02\x00\x00\x00\x00\x00\x00S\x03\x00\x00\x00\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00L\x00\x00\x00\x00\x00\x00\x00g\x03\x00\x00\x00\x00\x00\x00K\x03\x00\x00\x00\x00\x00\x00\xea\x02\x00\x00\x00\x00\x00\x00\xf8\x02\x00\x00\x00\x00\x00\x00g\x03\x00\x00\x00\x00\x00\x00\xfa\x02\x00\x00\x00\x00\x00\x00;\x03\x00\x00\x00\x00\x00\x005\x03\x00\x00\x00\x00\x00\x00$\x03\x00\x00\x00\x00\x00\x00_\x03\x00\x00\x00\x00\x00\x00g\x03\x00\x00\x00\x00\x00\x00\xea\x02\x00\x00\x00\x00\x00\x00B\x00\x00\x00\x00\x00\x00\x00^\x03\x00\x00\x00\x00\x00\x00\xf8\x02\x00\x00\x00\x00\x00\x00_\x03\x00\x00\x00\x00\x00\x00\xfa\x02\x00\x00\x00\x00\x00\x00g\x03\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00\x00\x00\x00\x00\xec\x02\x00\x00\x00\x00\x00\x00\xa1\x00\x00\x00\x00\x00\x00\x00\xe1\x02\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x00\x00\x00\x00G\x00\x00\x00\x00\x00\x00\x00+\x03\x00\x00\x00\x00\x00\x00\\\x03\x00\x00\x00\x00\x00\x00.\x03\x00\x00\x00\x00\x00\x00K\x00\x00\x00\x00\x00\x00\x00\xee\x02\x00\x00\x00\x00\x00\x00L\x00\x00\x00\x00\x00\x00\x00\\\x03\x00\x00\x00\x00\x00\x00+\x03\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x0e\x03\x00\x00\x00\x00\x00\x00&\x03\x00\x00\x00\x00\x00\x00\r\x03\x00\x00\x00\x00\x00\x00\x17\x03\x00\x00\x00\x00\x00\x00C\x03\x00\x00\x00\x00\x00\x00)\x03\x00\x00\x00\x00\x00\x00d\x03\x00\x00\x00\x00\x00\x00]\x03\x00\x00\x00\x00\x00\x002\x03\x00\x00\x00\x00\x00\x00&\x03\x00\x00\x00\x00\x00\x00\x0e\x03\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x1b\x03\x00\x00\x00\x00\x00\x00O\x03\x00\x00\x00\x00\x00\x00$\x03\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00\x00\x00\x00\x00\xa1\x00\x00\x00\x00\x00\x00\x00(\x03\x00\x00\x00\x00\x00\x00K\x03\x00\x00\x00\x00\x00\x00g\x03\x00\x00\x00\x00\x00\x00O\x03\x00\x00\x00\x00\x00\x00\x1b\x03\x00\x00\x00\x00\x00\x00/\x03\x00\x00\x00\x00\x00\x00K\x03\x00\x00\x00\x00\x00\x00(\x03\x00\x00\x00\x00\x00\x00)\x03\x00\x00\x00\x00\x00\x00^\x03\x00\x00\x00\x00\x00\x00B\x00\x00\x00\x00\x00\x00\x00A\x00\x00\x00\x00\x00\x00\x00\xf9\x02\x00\x00\x00\x00\x00\x00\xfa\x02\x00\x00\x00\x00\x00\x00H\x03\x00\x00\x00\x00\x00\x00`\x03\x00\x00\x00\x00\x00\x00H\x03\x00\x00\x00\x00\x00\x00\xfa\x02\x00\x00\x00\x00\x00\x00H\x03\x00\x00\x00\x00\x00\x00`\x03\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00\x00\x00\x00D\x00\x00\x00\x00\x00\x00\x00\xf9\x02\x00\x00\x00\x00\x00\x00H\x03\x00\x00\x00\x00\x00\x00j\x03\x00\x00\x00\x00\x00\x00l\x03\x00\x00\x00\x00\x00\x00k\x03\x00\x00\x00\x00\x00\x00k\x03\x00\x00\x00\x00\x00\x00l\x03\x00\x00\x00\x00\x00\x00m\x03\x00\x00\x00\x00\x00\x00n\x03\x00\x00\x00\x00\x00\x00p\x03\x00\x00\x00\x00\x00\x00o\x03\x00\x00\x00\x00\x00\x00o\x03\x00\x00\x00\x00\x00\x00p\x03\x00\x00\x00\x00\x00\x00q\x03\x00\x00\x00\x00\x00\x00r\x03\x00\x00\x00\x00\x00\x00t\x03\x00\x00\x00\x00\x00\x00s\x03\x00\x00\x00\x00\x00\x00u\x03\x00\x00\x00\x00\x00\x00w\x03\x00\x00\x00\x00\x00\x00v\x03\x00\x00\x00\x00\x00\x00x\x03\x00\x00\x00\x00\x00\x00z\x03\x00\x00\x00\x00\x00\x00y\x03\x00\x00\x00\x00\x00\x00\x94\x00\x00\x00\x00\x00\x00\x00{\x03\x00\x00\x00\x00\x00\x00\x93\x00\x00\x00\x00\x00\x00\x00|\x03\x00\x00\x00\x00\x00\x00j\x03\x00\x00\x00\x00\x00\x00}\x03\x00\x00\x00\x00\x00\x00|\x03\x00\x00\x00\x00\x00\x00}\x03\x00\x00\x00\x00\x00\x00\x98\x00\x00\x00\x00\x00\x00\x00~\x03\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00\x7f\x03\x00\x00\x00\x00\x00\x00v\x03\x00\x00\x00\x00\x00\x00w\x03\x00\x00\x00\x00\x00\x00\x80\x03\x00\x00\x00\x00\x00\x00t\x03\x00\x00\x00\x00\x00\x00\x81\x03\x00\x00\x00\x00\x00\x00s\x03\x00\x00\x00\x00\x00\x00\x82\x03\x00\x00\x00\x00\x00\x00\x81\x03\x00\x00\x00\x00\x00\x00t\x03\x00\x00\x00\x00\x00\x00\x83\x03\x00\x00\x00\x00\x00\x00\x85\x03\x00\x00\x00\x00\x00\x00\x84\x03\x00\x00\x00\x00\x00\x00\x86\x03\x00\x00\x00\x00\x00\x00\x88\x03\x00\x00\x00\x00\x00\x00\x87\x03\x00\x00\x00\x00\x00\x00\x87\x03\x00\x00\x00\x00\x00\x00\x88\x03\x00\x00\x00\x00\x00\x00\x89\x03\x00\x00\x00\x00\x00\x00\x8a\x03\x00\x00\x00\x00\x00\x00\x8c\x03\x00\x00\x00\x00\x00\x00\x8b\x03\x00\x00\x00\x00\x00\x00\x8b\x03\x00\x00\x00\x00\x00\x00\x8c\x03\x00\x00\x00\x00\x00\x00-\x00\x00\x00\x00\x00\x00\x00\x8d\x03\x00\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x8e\x03\x00\x00\x00\x00\x00\x00\x8e\x03\x00\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x9d\x00\x00\x00\x00\x00\x00\x00\x9e\x00\x00\x00\x00\x00\x00\x00\x90\x03\x00\x00\x00\x00\x00\x00\x8f\x03\x00\x00\x00\x00\x00\x00\x9e\x00\x00\x00\x00\x00\x00\x00\x8f\x03\x00\x00\x00\x00\x00\x00\x9d\x00\x00\x00\x00\x00\x00\x00\x91\x03\x00\x00\x00\x00\x00\x00\x92\x03\x00\x00\x00\x00\x00\x00\x85\x03\x00\x00\x00\x00\x00\x00\x93\x03\x00\x00\x00\x00\x00\x00\x95\x03\x00\x00\x00\x00\x00\x00\x94\x03\x00\x00\x00\x00\x00\x00\x96\x03\x00\x00\x00\x00\x00\x00\x97\x03\x00\x00\x00\x00\x00\x00{\x03\x00\x00\x00\x00\x00\x00{\x03\x00\x00\x00\x00\x00\x00\x97\x03\x00\x00\x00\x00\x00\x00\x93\x00\x00\x00\x00\x00\x00\x00\x87\x03\x00\x00\x00\x00\x00\x00\x99\x03\x00\x00\x00\x00\x00\x00\x98\x03\x00\x00\x00\x00\x00\x00\x9a\x03\x00\x00\x00\x00\x00\x00O\x00\x00\x00\x00\x00\x00\x00\x9b\x03\x00\x00\x00\x00\x00\x00\x9b\x03\x00\x00\x00\x00\x00\x00O\x00\x00\x00\x00\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\x9c\x03\x00\x00\x00\x00\x00\x00v\x03\x00\x00\x00\x00\x00\x00\x9d\x03\x00\x00\x00\x00\x00\x00\x9d\x03\x00\x00\x00\x00\x00\x00v\x03\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x9e\x03\x00\x00\x00\x00\x00\x00\x96\x03\x00\x00\x00\x00\x00\x00\x9f\x03\x00\x00\x00\x00\x00\x00\x83\x03\x00\x00\x00\x00\x00\x00\x84\x03\x00\x00\x00\x00\x00\x00\xa0\x03\x00\x00\x00\x00\x00\x00\x9f\x03\x00\x00\x00\x00\x00\x00\x96\x03\x00\x00\x00\x00\x00\x00{\x03\x00\x00\x00\x00\x00\x00\xa1\x03\x00\x00\x00\x00\x00\x00\xa2\x03\x00\x00\x00\x00\x00\x00\x99\x03\x00\x00\x00\x00\x00\x00\xa3\x03\x00\x00\x00\x00\x00\x00\x99\x03\x00\x00\x00\x00\x00\x00\xa2\x03\x00\x00\x00\x00\x00\x00\xa4\x03\x00\x00\x00\x00\x00\x00\x88\x03\x00\x00\x00\x00\x00\x00\xa5\x03\x00\x00\x00\x00\x00\x00\x89\x03\x00\x00\x00\x00\x00\x00\xa1\x03\x00\x00\x00\x00\x00\x00\x99\x03\x00\x00\x00\x00\x00\x00\xa6\x03\x00\x00\x00\x00\x00\x00\xa7\x03\x00\x00\x00\x00\x00\x00\x93\x03\x00\x00\x00\x00\x00\x00\x87\x03\x00\x00\x00\x00\x00\x00\x89\x03\x00\x00\x00\x00\x00\x00\x99\x03\x00\x00\x00\x00\x00\x00\xa8\x03\x00\x00\x00\x00\x00\x00\xaa\x03\x00\x00\x00\x00\x00\x00\xa9\x03\x00\x00\x00\x00\x00\x00\xab\x03\x00\x00\x00\x00\x00\x00\xad\x03\x00\x00\x00\x00\x00\x00\xac\x03\x00\x00\x00\x00\x00\x00\xae\x03\x00\x00\x00\x00\x00\x00o\x03\x00\x00\x00\x00\x00\x00\xaf\x03\x00\x00\x00\x00\x00\x00\xac\x03\x00\x00\x00\x00\x00\x00\xad\x03\x00\x00\x00\x00\x00\x00\xb0\x03\x00\x00\x00\x00\x00\x00\xb1\x03\x00\x00\x00\x00\x00\x00\xab\x03\x00\x00\x00\x00\x00\x00\x86\x03\x00\x00\x00\x00\x00\x00\xb1\x03\x00\x00\x00\x00\x00\x00\x86\x03\x00\x00\x00\x00\x00\x00\x98\x03\x00\x00\x00\x00\x00\x00w\x03\x00\x00\x00\x00\x00\x00\x9a\x03\x00\x00\x00\x00\x00\x00\xb2\x03\x00\x00\x00\x00\x00\x00q\x03\x00\x00\x00\x00\x00\x00\xb4\x03\x00\x00\x00\x00\x00\x00\xb3\x03\x00\x00\x00\x00\x00\x00\x82\x03\x00\x00\x00\x00\x00\x00\xb5\x03\x00\x00\x00\x00\x00\x00\x81\x03\x00\x00\x00\x00\x00\x00\xb0\x03\x00\x00\x00\x00\x00\x00\xb3\x03\x00\x00\x00\x00\x00\x00\xb4\x03\x00\x00\x00\x00\x00\x00\xb6\x03\x00\x00\x00\x00\x00\x00\xb8\x03\x00\x00\x00\x00\x00\x00\xb7\x03\x00\x00\x00\x00\x00\x00q\x03\x00\x00\x00\x00\x00\x00\xb3\x03\x00\x00\x00\x00\x00\x00\xb9\x03\x00\x00\x00\x00\x00\x00\xb4\x03\x00\x00\x00\x00\x00\x00\xba\x03\x00\x00\x00\x00\x00\x00\xac\x03\x00\x00\x00\x00\x00\x00\xac\x03\x00\x00\x00\x00\x00\x00\xba\x03\x00\x00\x00\x00\x00\x00\xa5\x03\x00\x00\x00\x00\x00\x00r\x03\x00\x00\x00\x00\x00\x00\x8d\x03\x00\x00\x00\x00\x00\x00\x8e\x03\x00\x00\x00\x00\x00\x00u\x03\x00\x00\x00\x00\x00\x00v\x03\x00\x00\x00\x00\x00\x00\x9c\x03\x00\x00\x00\x00\x00\x00\xbb\x03\x00\x00\x00\x00\x00\x00\xbd\x03\x00\x00\x00\x00\x00\x00\xbc\x03\x00\x00\x00\x00\x00\x00\x8e\x03\x00\x00\x00\x00\x00\x00\xbe\x03\x00\x00\x00\x00\x00\x00r\x03\x00\x00\x00\x00\x00\x00\x8e\x03\x00\x00\x00\x00\x00\x00\xbf\x03\x00\x00\x00\x00\x00\x00\xbe\x03\x00\x00\x00\x00\x00\x00k\x03\x00\x00\x00\x00\x00\x00}\x03\x00\x00\x00\x00\x00\x00j\x03\x00\x00\x00\x00\x00\x00\xc0\x03\x00\x00\x00\x00\x00\x00\xc2\x03\x00\x00\x00\x00\x00\x00\xc1\x03\x00\x00\x00\x00\x00\x00\xbc\x03\x00\x00\x00\x00\x00\x00\xbd\x03\x00\x00\x00\x00\x00\x00\xc3\x03\x00\x00\x00\x00\x00\x00\xc4\x03\x00\x00\x00\x00\x00\x00\xc6\x03\x00\x00\x00\x00\x00\x00\xc5\x03\x00\x00\x00\x00\x00\x00\xc4\x03\x00\x00\x00\x00\x00\x00\xc5\x03\x00\x00\x00\x00\x00\x00S\x00\x00\x00\x00\x00\x00\x00\xc7\x03\x00\x00\x00\x00\x00\x00\xbb\x03\x00\x00\x00\x00\x00\x00\xbc\x03\x00\x00\x00\x00\x00\x00\xc2\x03\x00\x00\x00\x00\x00\x00\xc8\x03\x00\x00\x00\x00\x00\x00\xc4\x03\x00\x00\x00\x00\x00\x00}\x03\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x98\x00\x00\x00\x00\x00\x00\x00\xc2\x03\x00\x00\x00\x00\x00\x00\xc4\x03\x00\x00\x00\x00\x00\x00T\x00\x00\x00\x00\x00\x00\x00\xc3\x03\x00\x00\x00\x00\x00\x00\x95\x03\x00\x00\x00\x00\x00\x00\xbc\x03\x00\x00\x00\x00\x00\x00\x8c\x03\x00\x00\x00\x00\x00\x00\x8a\x03\x00\x00\x00\x00\x00\x00\x7f\x03\x00\x00\x00\x00\x00\x00Y\x00\x00\x00\x00\x00\x00\x00Z\x00\x00\x00\x00\x00\x00\x00\xc9\x03\x00\x00\x00\x00\x00\x00\xbf\x03\x00\x00\x00\x00\x00\x00\x8e\x03\x00\x00\x00\x00\x00\x00\x8f\x03\x00\x00\x00\x00\x00\x00\xbf\x03\x00\x00\x00\x00\x00\x00\x8f\x03\x00\x00\x00\x00\x00\x00\x80\x03\x00\x00\x00\x00\x00\x00Y\x00\x00\x00\x00\x00\x00\x00\xca\x03\x00\x00\x00\x00\x00\x00X\x00\x00\x00\x00\x00\x00\x00\xcb\x03\x00\x00\x00\x00\x00\x00\xcc\x03\x00\x00\x00\x00\x00\x00\xc5\x03\x00\x00\x00\x00\x00\x00\xc5\x03\x00\x00\x00\x00\x00\x00\xcc\x03\x00\x00\x00\x00\x00\x00R\x00\x00\x00\x00\x00\x00\x00\xcd\x03\x00\x00\x00\x00\x00\x00Y\x00\x00\x00\x00\x00\x00\x00\xc9\x03\x00\x00\x00\x00\x00\x00\x95\x03\x00\x00\x00\x00\x00\x00\xc3\x03\x00\x00\x00\x00\x00\x00\xce\x03\x00\x00\x00\x00\x00\x00~\x03\x00\x00\x00\x00\x00\x00\xcd\x03\x00\x00\x00\x00\x00\x00\xcf\x03\x00\x00\x00\x00\x00\x00\xca\x03\x00\x00\x00\x00\x00\x00Y\x00\x00\x00\x00\x00\x00\x00\xcd\x03\x00\x00\x00\x00\x00\x00\xcf\x03\x00\x00\x00\x00\x00\x00\xcd\x03\x00\x00\x00\x00\x00\x00\xc9\x03\x00\x00\x00\x00\x00\x00r\x03\x00\x00\x00\x00\x00\x00\xbe\x03\x00\x00\x00\x00\x00\x00t\x03\x00\x00\x00\x00\x00\x00\xd0\x03\x00\x00\x00\x00\x00\x00k\x03\x00\x00\x00\x00\x00\x00m\x03\x00\x00\x00\x00\x00\x00\xd0\x03\x00\x00\x00\x00\x00\x00m\x03\x00\x00\x00\x00\x00\x00\x92\x03\x00\x00\x00\x00\x00\x00\x8d\x03\x00\x00\x00\x00\x00\x00r\x03\x00\x00\x00\x00\x00\x00s\x03\x00\x00\x00\x00\x00\x00t\x03\x00\x00\x00\x00\x00\x00\xbe\x03\x00\x00\x00\x00\x00\x00\xd1\x03\x00\x00\x00\x00\x00\x00\xb8\x03\x00\x00\x00\x00\x00\x00\xae\x03\x00\x00\x00\x00\x00\x00\xaf\x03\x00\x00\x00\x00\x00\x00}\x03\x00\x00\x00\x00\x00\x00k\x03\x00\x00\x00\x00\x00\x00\xd2\x03\x00\x00\x00\x00\x00\x00}\x03\x00\x00\x00\x00\x00\x00\xd2\x03\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\xb6\x03\x00\x00\x00\x00\x00\x00\xae\x03\x00\x00\x00\x00\x00\x00\xb8\x03\x00\x00\x00\x00\x00\x00\xbc\x03\x00\x00\x00\x00\x00\x00\x95\x03\x00\x00\x00\x00\x00\x00\x93\x03\x00\x00\x00\x00\x00\x00\xd3\x03\x00\x00\x00\x00\x00\x00W\x00\x00\x00\x00\x00\x00\x00\xd4\x03\x00\x00\x00\x00\x00\x00\x80\x03\x00\x00\x00\x00\x00\x00w\x03\x00\x00\x00\x00\x00\x00\xd5\x03\x00\x00\x00\x00\x00\x00\x80\x03\x00\x00\x00\x00\x00\x00\xd5\x03\x00\x00\x00\x00\x00\x00\xbf\x03\x00\x00\x00\x00\x00\x00\xd4\x03\x00\x00\x00\x00\x00\x00W\x00\x00\x00\x00\x00\x00\x00X\x00\x00\x00\x00\x00\x00\x00o\x03\x00\x00\x00\x00\x00\x00\xae\x03\x00\x00\x00\x00\x00\x00n\x03\x00\x00\x00\x00\x00\x00\x7f\x03\x00\x00\x00\x00\x00\x00\x8a\x03\x00\x00\x00\x00\x00\x00\xce\x03\x00\x00\x00\x00\x00\x00n\x03\x00\x00\x00\x00\x00\x00\xae\x03\x00\x00\x00\x00\x00\x00\xcb\x03\x00\x00\x00\x00\x00\x00\x84\x03\x00\x00\x00\x00\x00\x00\xd6\x03\x00\x00\x00\x00\x00\x00\xa9\x03\x00\x00\x00\x00\x00\x00\xa8\x03\x00\x00\x00\x00\x00\x00\xa9\x03\x00\x00\x00\x00\x00\x00\xd6\x03\x00\x00\x00\x00\x00\x00\x85\x03\x00\x00\x00\x00\x00\x00\x83\x03\x00\x00\x00\x00\x00\x00\x91\x03\x00\x00\x00\x00\x00\x00\x9b\x03\x00\x00\x00\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\xd7\x03\x00\x00\x00\x00\x00\x00\xd7\x03\x00\x00\x00\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00Q\x00\x00\x00\x00\x00\x00\x00\xa7\x03\x00\x00\x00\x00\x00\x00\xc7\x03\x00\x00\x00\x00\x00\x00\x93\x03\x00\x00\x00\x00\x00\x00\xc2\x03\x00\x00\x00\x00\x00\x00\xc0\x03\x00\x00\x00\x00\x00\x00\xc8\x03\x00\x00\x00\x00\x00\x00n\x03\x00\x00\x00\x00\x00\x00\xc6\x03\x00\x00\x00\x00\x00\x00\xd8\x03\x00\x00\x00\x00\x00\x00\xb3\x03\x00\x00\x00\x00\x00\x00\x82\x03\x00\x00\x00\x00\x00\x00\xd1\x03\x00\x00\x00\x00\x00\x00\xd2\x03\x00\x00\x00\x00\x00\x00\x96\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x82\x03\x00\x00\x00\x00\x00\x00t\x03\x00\x00\x00\x00\x00\x00\xd1\x03\x00\x00\x00\x00\x00\x00\xc8\x03\x00\x00\x00\x00\x00\x00\xd8\x03\x00\x00\x00\x00\x00\x00\xc6\x03\x00\x00\x00\x00\x00\x00n\x03\x00\x00\x00\x00\x00\x00\xd8\x03\x00\x00\x00\x00\x00\x00p\x03\x00\x00\x00\x00\x00\x00\x96\x03\x00\x00\x00\x00\x00\x00\xd9\x03\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x00\x00\x00\x00|\x03\x00\x00\x00\x00\x00\x00\x98\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\xda\x03\x00\x00\x00\x00\x00\x00\xdc\x03\x00\x00\x00\x00\x00\x00\xdb\x03\x00\x00\x00\x00\x00\x00\x95\x03\x00\x00\x00\x00\x00\x00\x8a\x03\x00\x00\x00\x00\x00\x00\xdd\x03\x00\x00\x00\x00\x00\x00\x8a\x03\x00\x00\x00\x00\x00\x00\x95\x03\x00\x00\x00\x00\x00\x00\xce\x03\x00\x00\x00\x00\x00\x00\xaf\x03\x00\x00\x00\x00\x00\x00\xb9\x03\x00\x00\x00\x00\x00\x00\xde\x03\x00\x00\x00\x00\x00\x00\xde\x03\x00\x00\x00\x00\x00\x00\xb9\x03\x00\x00\x00\x00\x00\x00\xd1\x03\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00v\x03\x00\x00\x00\x00\x00\x00\x90\x03\x00\x00\x00\x00\x00\x00l\x03\x00\x00\x00\x00\x00\x00x\x03\x00\x00\x00\x00\x00\x00m\x03\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00\x90\x03\x00\x00\x00\x00\x00\x00\x9e\x00\x00\x00\x00\x00\x00\x00m\x03\x00\x00\x00\x00\x00\x00\xda\x03\x00\x00\x00\x00\x00\x00\xdb\x03\x00\x00\x00\x00\x00\x00\x96\x03\x00\x00\x00\x00\x00\x00\x9e\x03\x00\x00\x00\x00\x00\x00\xd9\x03\x00\x00\x00\x00\x00\x00\xdf\x03\x00\x00\x00\x00\x00\x00\xc1\x03\x00\x00\x00\x00\x00\x00\xc2\x03\x00\x00\x00\x00\x00\x00\xdb\x03\x00\x00\x00\x00\x00\x00\x92\x03\x00\x00\x00\x00\x00\x00m\x03\x00\x00\x00\x00\x00\x00\xb9\x03\x00\x00\x00\x00\x00\x00o\x03\x00\x00\x00\x00\x00\x00q\x03\x00\x00\x00\x00\x00\x00o\x03\x00\x00\x00\x00\x00\x00\xb9\x03\x00\x00\x00\x00\x00\x00\xaf\x03\x00\x00\x00\x00\x00\x00U\x00\x00\x00\x00\x00\x00\x00\xdf\x03\x00\x00\x00\x00\x00\x00\xc2\x03\x00\x00\x00\x00\x00\x00\xdf\x03\x00\x00\x00\x00\x00\x00U\x00\x00\x00\x00\x00\x00\x00V\x00\x00\x00\x00\x00\x00\x00\xb9\x03\x00\x00\x00\x00\x00\x00\xb3\x03\x00\x00\x00\x00\x00\x00\xd1\x03\x00\x00\x00\x00\x00\x00\xa4\x03\x00\x00\x00\x00\x00\x00\xa6\x03\x00\x00\x00\x00\x00\x00\x88\x03\x00\x00\x00\x00\x00\x00\xaf\x03\x00\x00\x00\x00\x00\x00\xde\x03\x00\x00\x00\x00\x00\x00\xe0\x03\x00\x00\x00\x00\x00\x00\xbe\x03\x00\x00\x00\x00\x00\x00\xde\x03\x00\x00\x00\x00\x00\x00\xd1\x03\x00\x00\x00\x00\x00\x00\xde\x03\x00\x00\x00\x00\x00\x00\xbe\x03\x00\x00\x00\x00\x00\x00\xe0\x03\x00\x00\x00\x00\x00\x00\x89\x03\x00\x00\x00\x00\x00\x00\x88\x03\x00\x00\x00\x00\x00\x00\xa6\x03\x00\x00\x00\x00\x00\x00\xa4\x03\x00\x00\x00\x00\x00\x00\xa7\x03\x00\x00\x00\x00\x00\x00\xa6\x03\x00\x00\x00\x00\x00\x00\xc0\x03\x00\x00\x00\x00\x00\x00\xe2\x03\x00\x00\x00\x00\x00\x00\xe1\x03\x00\x00\x00\x00\x00\x00\xd8\x03\x00\x00\x00\x00\x00\x00\xc8\x03\x00\x00\x00\x00\x00\x00\xe1\x03\x00\x00\x00\x00\x00\x00\xe1\x03\x00\x00\x00\x00\x00\x00\xc8\x03\x00\x00\x00\x00\x00\x00\xc0\x03\x00\x00\x00\x00\x00\x00\xe2\x03\x00\x00\x00\x00\x00\x00\xa7\x03\x00\x00\x00\x00\x00\x00\xe1\x03\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00v\x03\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00u\x03\x00\x00\x00\x00\x00\x00\x9a\x03\x00\x00\x00\x00\x00\x00w\x03\x00\x00\x00\x00\x00\x00\xa9\x03\x00\x00\x00\x00\x00\x00\xaa\x03\x00\x00\x00\x00\x00\x00\xe3\x03\x00\x00\x00\x00\x00\x00\xd2\x03\x00\x00\x00\x00\x00\x00\xd0\x03\x00\x00\x00\x00\x00\x00\xe4\x03\x00\x00\x00\x00\x00\x00\x84\x03\x00\x00\x00\x00\x00\x00\xa9\x03\x00\x00\x00\x00\x00\x00\xe5\x03\x00\x00\x00\x00\x00\x00\xa3\x03\x00\x00\x00\x00\x00\x00\xe6\x03\x00\x00\x00\x00\x00\x00\xaa\x03\x00\x00\x00\x00\x00\x00#\x00\x00\x00\x00\x00\x00\x00\x96\x03\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x00\x00\x00\x00\xe6\x03\x00\x00\x00\x00\x00\x00*\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00\x00\x00\x00\x00\xe3\x03\x00\x00\x00\x00\x00\x00\xaa\x03\x00\x00\x00\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x00\xa2\x03\x00\x00\x00\x00\x00\x00\xe7\x03\x00\x00\x00\x00\x00\x00\xe6\x03\x00\x00\x00\x00\x00\x00\xcf\x03\x00\x00\x00\x00\x00\x000\x00\x00\x00\x00\x00\x00\x00/\x00\x00\x00\x00\x00\x00\x00\xaa\x03\x00\x00\x00\x00\x00\x00\xe6\x03\x00\x00\x00\x00\x00\x00)\x00\x00\x00\x00\x00\x00\x00\xe6\x03\x00\x00\x00\x00\x00\x00\xa3\x03\x00\x00\x00\x00\x00\x00\xa2\x03\x00\x00\x00\x00\x00\x00\xd3\x03\x00\x00\x00\x00\x00\x00V\x00\x00\x00\x00\x00\x00\x00W\x00\x00\x00\x00\x00\x00\x00\xa1\x03\x00\x00\x00\x00\x00\x00\x89\x03\x00\x00\x00\x00\x00\x00\x94\x03\x00\x00\x00\x00\x00\x00\xdf\x03\x00\x00\x00\x00\x00\x00V\x00\x00\x00\x00\x00\x00\x00\xd3\x03\x00\x00\x00\x00\x00\x00~\x03\x00\x00\x00\x00\x00\x00\xcf\x03\x00\x00\x00\x00\x00\x00/\x00\x00\x00\x00\x00\x00\x00\xe7\x03\x00\x00\x00\x00\x00\x00*\x00\x00\x00\x00\x00\x00\x00\xe6\x03\x00\x00\x00\x00\x00\x00\xc9\x03\x00\x00\x00\x00\x00\x000\x00\x00\x00\x00\x00\x00\x00\xcf\x03\x00\x00\x00\x00\x00\x00\xe8\x03\x00\x00\x00\x00\x00\x00\xe9\x03\x00\x00\x00\x00\x00\x00\xe4\x03\x00\x00\x00\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x00\xaa\x03\x00\x00\x00\x00\x00\x00)\x00\x00\x00\x00\x00\x00\x00#\x00\x00\x00\x00\x00\x00\x00\x97\x03\x00\x00\x00\x00\x00\x00\x96\x03\x00\x00\x00\x00\x00\x00\x91\x03\x00\x00\x00\x00\x00\x00\x83\x03\x00\x00\x00\x00\x00\x00\xea\x03\x00\x00\x00\x00\x00\x00\x91\x03\x00\x00\x00\x00\x00\x00\xea\x03\x00\x00\x00\x00\x00\x00\x9e\x03\x00\x00\x00\x00\x00\x00x\x03\x00\x00\x00\x00\x00\x00\xeb\x03\x00\x00\x00\x00\x00\x00z\x03\x00\x00\x00\x00\x00\x00\xb5\x03\x00\x00\x00\x00\x00\x00z\x03\x00\x00\x00\x00\x00\x00\xeb\x03\x00\x00\x00\x00\x00\x00*\x00\x00\x00\x00\x00\x00\x00\xe7\x03\x00\x00\x00\x00\x00\x00+\x00\x00\x00\x00\x00\x00\x00%\x00\x00\x00\x00\x00\x00\x00\xd9\x03\x00\x00\x00\x00\x00\x00\xa0\x03\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00\xe9\x03\x00\x00\x00\x00\x00\x00\x94\x00\x00\x00\x00\x00\x00\x00%\x00\x00\x00\x00\x00\x00\x00\xa0\x03\x00\x00\x00\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00-\x00\x00\x00\x00\x00\x00\x00\x8c\x03\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00\x8c\x03\x00\x00\x00\x00\x00\x00\x7f\x03\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00\xdd\x03\x00\x00\x00\x00\x00\x00\xec\x03\x00\x00\x00\x00\x00\x00\xa1\x03\x00\x00\x00\x00\x00\x00\x94\x03\x00\x00\x00\x00\x00\x00\xdd\x03\x00\x00\x00\x00\x00\x00\xa1\x03\x00\x00\x00\x00\x00\x00,\x00\x00\x00\x00\x00\x00\x00\x8b\x03\x00\x00\x00\x00\x00\x00-\x00\x00\x00\x00\x00\x00\x00x\x03\x00\x00\x00\x00\x00\x00l\x03\x00\x00\x00\x00\x00\x00\xeb\x03\x00\x00\x00\x00\x00\x00p\x03\x00\x00\x00\x00\x00\x00\xd8\x03\x00\x00\x00\x00\x00\x00\xba\x03\x00\x00\x00\x00\x00\x00y\x03\x00\x00\x00\x00\x00\x00z\x03\x00\x00\x00\x00\x00\x00\xad\x03\x00\x00\x00\x00\x00\x00\xed\x03\x00\x00\x00\x00\x00\x00\xeb\x03\x00\x00\x00\x00\x00\x00l\x03\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00~\x03\x00\x00\x00\x00\x00\x00/\x00\x00\x00\x00\x00\x00\x00\xd5\x03\x00\x00\x00\x00\x00\x00\xb2\x03\x00\x00\x00\x00\x00\x00\xe0\x03\x00\x00\x00\x00\x00\x00\xbf\x03\x00\x00\x00\x00\x00\x00\xd5\x03\x00\x00\x00\x00\x00\x00\xe0\x03\x00\x00\x00\x00\x00\x00\xb2\x03\x00\x00\x00\x00\x00\x00\xd5\x03\x00\x00\x00\x00\x00\x00w\x03\x00\x00\x00\x00\x00\x00\xe0\x03\x00\x00\x00\x00\x00\x00\xbe\x03\x00\x00\x00\x00\x00\x00\xbf\x03\x00\x00\x00\x00\x00\x00\xe0\x03\x00\x00\x00\x00\x00\x00\xb2\x03\x00\x00\x00\x00\x00\x00\xaf\x03\x00\x00\x00\x00\x00\x00\x9a\x03\x00\x00\x00\x00\x00\x00u\x03\x00\x00\x00\x00\x00\x00O\x00\x00\x00\x00\x00\x00\x00\x9c\x03\x00\x00\x00\x00\x00\x00N\x00\x00\x00\x00\x00\x00\x00u\x03\x00\x00\x00\x00\x00\x00z\x03\x00\x00\x00\x00\x00\x00\xb5\x03\x00\x00\x00\x00\x00\x00\xad\x03\x00\x00\x00\x00\x00\x00\xd9\x03\x00\x00\x00\x00\x00\x00%\x00\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x00\x00\x00\x00u\x03\x00\x00\x00\x00\x00\x00N\x00\x00\x00\x00\x00\x00\x00O\x00\x00\x00\x00\x00\x00\x00|\x03\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\xee\x03\x00\x00\x00\x00\x00\x00\x93\x00\x00\x00\x00\x00\x00\x00\x97\x03\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x97\x03\x00\x00\x00\x00\x00\x00#\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\xee\x03\x00\x00\x00\x00\x00\x00\x8d\x03\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\xc9\x03\x00\x00\x00\x00\x00\x00Z\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x000\x00\x00\x00\x00\x00\x00\x00\xc9\x03\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xb3\x03\x00\x00\x00\x00\x00\x00\xb5\x03\x00\x00\x00\x00\x00\x00\x82\x03\x00\x00\x00\x00\x00\x00\xb3\x03\x00\x00\x00\x00\x00\x00\xb0\x03\x00\x00\x00\x00\x00\x00\xb5\x03\x00\x00\x00\x00\x00\x00\xba\x03\x00\x00\x00\x00\x00\x00\xe1\x03\x00\x00\x00\x00\x00\x00\xa4\x03\x00\x00\x00\x00\x00\x00N\x00\x00\x00\x00\x00\x00\x00\x9c\x03\x00\x00\x00\x00\x00\x00M\x00\x00\x00\x00\x00\x00\x00\xe1\x03\x00\x00\x00\x00\x00\x00\xba\x03\x00\x00\x00\x00\x00\x00\xd8\x03\x00\x00\x00\x00\x00\x00\xe1\x03\x00\x00\x00\x00\x00\x00\xa7\x03\x00\x00\x00\x00\x00\x00\xa4\x03\x00\x00\x00\x00\x00\x00\xbd\x03\x00\x00\x00\x00\x00\x00\xca\x03\x00\x00\x00\x00\x00\x00\xc3\x03\x00\x00\x00\x00\x00\x00|\x03\x00\x00\x00\x00\x00\x00\xee\x03\x00\x00\x00\x00\x00\x00\xef\x03\x00\x00\x00\x00\x00\x00\xee\x03\x00\x00\x00\x00\x00\x00s\x03\x00\x00\x00\x00\x00\x00\xef\x03\x00\x00\x00\x00\x00\x00\x94\x00\x00\x00\x00\x00\x00\x00\xe9\x03\x00\x00\x00\x00\x00\x00{\x03\x00\x00\x00\x00\x00\x00\xa0\x03\x00\x00\x00\x00\x00\x00\x84\x03\x00\x00\x00\x00\x00\x00\xe5\x03\x00\x00\x00\x00\x00\x00\xd6\x03\x00\x00\x00\x00\x00\x00\xf0\x03\x00\x00\x00\x00\x00\x00\xa8\x03\x00\x00\x00\x00\x00\x00\xbb\x03\x00\x00\x00\x00\x00\x00\xdf\x03\x00\x00\x00\x00\x00\x00\xd3\x03\x00\x00\x00\x00\x00\x00\xbb\x03\x00\x00\x00\x00\x00\x00\xc1\x03\x00\x00\x00\x00\x00\x00\xdf\x03\x00\x00\x00\x00\x00\x00n\x03\x00\x00\x00\x00\x00\x00\xcb\x03\x00\x00\x00\x00\x00\x00\xc6\x03\x00\x00\x00\x00\x00\x00l\x03\x00\x00\x00\x00\x00\x00j\x03\x00\x00\x00\x00\x00\x00\xed\x03\x00\x00\x00\x00\x00\x00\xc0\x03\x00\x00\x00\x00\x00\x00\xc1\x03\x00\x00\x00\x00\x00\x00\xe2\x03\x00\x00\x00\x00\x00\x00\xbd\x03\x00\x00\x00\x00\x00\x00\xbb\x03\x00\x00\x00\x00\x00\x00\xd3\x03\x00\x00\x00\x00\x00\x00s\x03\x00\x00\x00\x00\x00\x00\xee\x03\x00\x00\x00\x00\x00\x00\x8d\x03\x00\x00\x00\x00\x00\x00\xee\x03\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x8d\x03\x00\x00\x00\x00\x00\x00\xe4\x03\x00\x00\x00\x00\x00\x00\xe9\x03\x00\x00\x00\x00\x00\x00\xd2\x03\x00\x00\x00\x00\x00\x00\xe9\x03\x00\x00\x00\x00\x00\x00\x96\x00\x00\x00\x00\x00\x00\x00\xd2\x03\x00\x00\x00\x00\x00\x00\x96\x00\x00\x00\x00\x00\x00\x00\xe9\x03\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00\xcb\x03\x00\x00\x00\x00\x00\x00\xc5\x03\x00\x00\x00\x00\x00\x00\xc6\x03\x00\x00\x00\x00\x00\x00S\x00\x00\x00\x00\x00\x00\x00\xc5\x03\x00\x00\x00\x00\x00\x00R\x00\x00\x00\x00\x00\x00\x00\xd6\x03\x00\x00\x00\x00\x00\x00\x84\x03\x00\x00\x00\x00\x00\x00\x85\x03\x00\x00\x00\x00\x00\x00\x9e\x03\x00\x00\x00\x00\x00\x00\xe8\x03\x00\x00\x00\x00\x00\x00\x91\x03\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\xee\x03\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\xca\x03\x00\x00\x00\x00\x00\x00\xcd\x03\x00\x00\x00\x00\x00\x00\xf1\x03\x00\x00\x00\x00\x00\x00\xca\x03\x00\x00\x00\x00\x00\x00\xf1\x03\x00\x00\x00\x00\x00\x00\xc3\x03\x00\x00\x00\x00\x00\x00\xc3\x03\x00\x00\x00\x00\x00\x00\xf1\x03\x00\x00\x00\x00\x00\x00\xce\x03\x00\x00\x00\x00\x00\x00\xe8\x03\x00\x00\x00\x00\x00\x00\x92\x03\x00\x00\x00\x00\x00\x00\x91\x03\x00\x00\x00\x00\x00\x00\xdd\x03\x00\x00\x00\x00\x00\x00\x8b\x03\x00\x00\x00\x00\x00\x00\xec\x03\x00\x00\x00\x00\x00\x00\x8a\x03\x00\x00\x00\x00\x00\x00\x8b\x03\x00\x00\x00\x00\x00\x00\xdd\x03\x00\x00\x00\x00\x00\x00\x85\x03\x00\x00\x00\x00\x00\x00\x92\x03\x00\x00\x00\x00\x00\x00\xdb\x03\x00\x00\x00\x00\x00\x00\xea\x03\x00\x00\x00\x00\x00\x00\xd9\x03\x00\x00\x00\x00\x00\x00\x9e\x03\x00\x00\x00\x00\x00\x00\xea\x03\x00\x00\x00\x00\x00\x00\x83\x03\x00\x00\x00\x00\x00\x00\xa0\x03\x00\x00\x00\x00\x00\x00\xae\x03\x00\x00\x00\x00\x00\x00\xcc\x03\x00\x00\x00\x00\x00\x00\xcb\x03\x00\x00\x00\x00\x00\x00\xaa\x03\x00\x00\x00\x00\x00\x00\xa8\x03\x00\x00\x00\x00\x00\x00\xa3\x03\x00\x00\x00\x00\x00\x00\xec\x03\x00\x00\x00\x00\x00\x00\x8b\x03\x00\x00\x00\x00\x00\x00\xe7\x03\x00\x00\x00\x00\x00\x00p\x03\x00\x00\x00\x00\x00\x00\xba\x03\x00\x00\x00\x00\x00\x00\xb4\x03\x00\x00\x00\x00\x00\x00\x8b\x03\x00\x00\x00\x00\x00\x00+\x00\x00\x00\x00\x00\x00\x00\xe7\x03\x00\x00\x00\x00\x00\x00+\x00\x00\x00\x00\x00\x00\x00\x8b\x03\x00\x00\x00\x00\x00\x00,\x00\x00\x00\x00\x00\x00\x00\xf1\x03\x00\x00\x00\x00\x00\x00\xcd\x03\x00\x00\x00\x00\x00\x00~\x03\x00\x00\x00\x00\x00\x00\x7f\x03\x00\x00\x00\x00\x00\x00\xf1\x03\x00\x00\x00\x00\x00\x00~\x03\x00\x00\x00\x00\x00\x00\xf1\x03\x00\x00\x00\x00\x00\x00\x7f\x03\x00\x00\x00\x00\x00\x00\xce\x03\x00\x00\x00\x00\x00\x00\xc1\x03\x00\x00\x00\x00\x00\x00\xbb\x03\x00\x00\x00\x00\x00\x00\xe2\x03\x00\x00\x00\x00\x00\x00\xb1\x03\x00\x00\x00\x00\x00\x00\x98\x03\x00\x00\x00\x00\x00\x00\xf0\x03\x00\x00\x00\x00\x00\x00\xb1\x03\x00\x00\x00\x00\x00\x00y\x03\x00\x00\x00\x00\x00\x00\xab\x03\x00\x00\x00\x00\x00\x00\xbb\x03\x00\x00\x00\x00\x00\x00\xc7\x03\x00\x00\x00\x00\x00\x00\xe2\x03\x00\x00\x00\x00\x00\x00\xe8\x03\x00\x00\x00\x00\x00\x00\xe4\x03\x00\x00\x00\x00\x00\x00\xd0\x03\x00\x00\x00\x00\x00\x00\x87\x03\x00\x00\x00\x00\x00\x00\x98\x03\x00\x00\x00\x00\x00\x00\x86\x03\x00\x00\x00\x00\x00\x00\x9d\x00\x00\x00\x00\x00\x00\x00\x8f\x03\x00\x00\x00\x00\x00\x00\x8e\x03\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x9d\x03\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\xb6\x03\x00\x00\x00\x00\x00\x00\xb7\x03\x00\x00\x00\x00\x00\x00\x9b\x03\x00\x00\x00\x00\x00\x00|\x03\x00\x00\x00\x00\x00\x00\xed\x03\x00\x00\x00\x00\x00\x00j\x03\x00\x00\x00\x00\x00\x00\x9a\x03\x00\x00\x00\x00\x00\x00\xb7\x03\x00\x00\x00\x00\x00\x00\xb2\x03\x00\x00\x00\x00\x00\x00\x9c\x03\x00\x00\x00\x00\x00\x00\x9d\x03\x00\x00\x00\x00\x00\x00M\x00\x00\x00\x00\x00\x00\x00\xb7\x03\x00\x00\x00\x00\x00\x00\x9a\x03\x00\x00\x00\x00\x00\x00\x9b\x03\x00\x00\x00\x00\x00\x00\x80\x03\x00\x00\x00\x00\x00\x00\x8f\x03\x00\x00\x00\x00\x00\x00\x90\x03\x00\x00\x00\x00\x00\x00\xe7\x03\x00\x00\x00\x00\x00\x00\xa2\x03\x00\x00\x00\x00\x00\x00\xec\x03\x00\x00\x00\x00\x00\x00\xa2\x03\x00\x00\x00\x00\x00\x00\xa1\x03\x00\x00\x00\x00\x00\x00\xec\x03\x00\x00\x00\x00\x00\x00\x9d\x03\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00M\x00\x00\x00\x00\x00\x00\x00U\x00\x00\x00\x00\x00\x00\x00\xc2\x03\x00\x00\x00\x00\x00\x00T\x00\x00\x00\x00\x00\x00\x00\xf0\x03\x00\x00\x00\x00\x00\x00\xdc\x03\x00\x00\x00\x00\x00\x00\xb1\x03\x00\x00\x00\x00\x00\x00\xa7\x03\x00\x00\x00\x00\x00\x00\xe2\x03\x00\x00\x00\x00\x00\x00\xc7\x03\x00\x00\x00\x00\x00\x00\xf2\x03\x00\x00\x00\x00\x00\x00\xa8\x03\x00\x00\x00\x00\x00\x00\xf0\x03\x00\x00\x00\x00\x00\x00\xf2\x03\x00\x00\x00\x00\x00\x00\x99\x03\x00\x00\x00\x00\x00\x00\xa3\x03\x00\x00\x00\x00\x00\x00\xa5\x03\x00\x00\x00\x00\x00\x00\x88\x03\x00\x00\x00\x00\x00\x00\x86\x03\x00\x00\x00\x00\x00\x00\x92\x03\x00\x00\x00\x00\x00\x00\xe8\x03\x00\x00\x00\x00\x00\x00\xd0\x03\x00\x00\x00\x00\x00\x00\xf2\x03\x00\x00\x00\x00\x00\x00\x98\x03\x00\x00\x00\x00\x00\x00\x99\x03\x00\x00\x00\x00\x00\x00\xd4\x03\x00\x00\x00\x00\x00\x00X\x00\x00\x00\x00\x00\x00\x00\xca\x03\x00\x00\x00\x00\x00\x00\xd4\x03\x00\x00\x00\x00\x00\x00\xbd\x03\x00\x00\x00\x00\x00\x00\xd3\x03\x00\x00\x00\x00\x00\x00\xbd\x03\x00\x00\x00\x00\x00\x00\xd4\x03\x00\x00\x00\x00\x00\x00\xca\x03\x00\x00\x00\x00\x00\x00\x98\x03\x00\x00\x00\x00\x00\x00\xf2\x03\x00\x00\x00\x00\x00\x00\xf0\x03\x00\x00\x00\x00\x00\x00\xa4\x03\x00\x00\x00\x00\x00\x00\xa5\x03\x00\x00\x00\x00\x00\x00\xba\x03\x00\x00\x00\x00\x00\x00\xc4\x03\x00\x00\x00\x00\x00\x00S\x00\x00\x00\x00\x00\x00\x00T\x00\x00\x00\x00\x00\x00\x00\xc4\x03\x00\x00\x00\x00\x00\x00\xc8\x03\x00\x00\x00\x00\x00\x00\xc6\x03\x00\x00\x00\x00\x00\x00\xb6\x03\x00\x00\x00\x00\x00\x00\xd7\x03\x00\x00\x00\x00\x00\x00\xcc\x03\x00\x00\x00\x00\x00\x00\xd7\x03\x00\x00\x00\x00\x00\x00\xb6\x03\x00\x00\x00\x00\x00\x00\x9b\x03\x00\x00\x00\x00\x00\x00\xb8\x03\x00\x00\x00\x00\x00\x00\xb2\x03\x00\x00\x00\x00\x00\x00\xb7\x03\x00\x00\x00\x00\x00\x00\xb2\x03\x00\x00\x00\x00\x00\x00\xb8\x03\x00\x00\x00\x00\x00\x00\xaf\x03\x00\x00\x00\x00\x00\x00\xd7\x03\x00\x00\x00\x00\x00\x00Q\x00\x00\x00\x00\x00\x00\x00\xcc\x03\x00\x00\x00\x00\x00\x00\xd0\x03\x00\x00\x00\x00\x00\x00\xd2\x03\x00\x00\x00\x00\x00\x00k\x03\x00\x00\x00\x00\x00\x00\xeb\x03\x00\x00\x00\x00\x00\x00\xed\x03\x00\x00\x00\x00\x00\x00\x81\x03\x00\x00\x00\x00\x00\x00\x89\x03\x00\x00\x00\x00\x00\x00\xa6\x03\x00\x00\x00\x00\x00\x00\x94\x03\x00\x00\x00\x00\x00\x00\xa5\x03\x00\x00\x00\x00\x00\x00\x86\x03\x00\x00\x00\x00\x00\x00\xab\x03\x00\x00\x00\x00\x00\x00\xdb\x03\x00\x00\x00\x00\x00\x00\xdc\x03\x00\x00\x00\x00\x00\x00\xd6\x03\x00\x00\x00\x00\x00\x00\xa6\x03\x00\x00\x00\x00\x00\x00\x93\x03\x00\x00\x00\x00\x00\x00\x94\x03\x00\x00\x00\x00\x00\x00\x95\x03\x00\x00\x00\x00\x00\x00\xdd\x03\x00\x00\x00\x00\x00\x00\x94\x03\x00\x00\x00\x00\x00\x00\xc7\x03\x00\x00\x00\x00\x00\x00\xbc\x03\x00\x00\x00\x00\x00\x00\x93\x03\x00\x00\x00\x00\x00\x00\xb0\x03\x00\x00\x00\x00\x00\x00\xad\x03\x00\x00\x00\x00\x00\x00\xb5\x03\x00\x00\x00\x00\x00\x00y\x03\x00\x00\x00\x00\x00\x00\xad\x03\x00\x00\x00\x00\x00\x00\xab\x03\x00\x00\x00\x00\x00\x00\xac\x03\x00\x00\x00\x00\x00\x00\xb0\x03\x00\x00\x00\x00\x00\x00\xb4\x03\x00\x00\x00\x00\x00\x00\xac\x03\x00\x00\x00\x00\x00\x00\xa5\x03\x00\x00\x00\x00\x00\x00\xab\x03\x00\x00\x00\x00\x00\x00\xb5\x03\x00\x00\x00\x00\x00\x00\xeb\x03\x00\x00\x00\x00\x00\x00\x81\x03\x00\x00\x00\x00\x00\x00m\x03\x00\x00\x00\x00\x00\x00x\x03\x00\x00\x00\x00\x00\x00\xda\x03\x00\x00\x00\x00\x00\x00\xdc\x03\x00\x00\x00\x00\x00\x00\xda\x03\x00\x00\x00\x00\x00\x00\xb1\x03\x00\x00\x00\x00\x00\x00\x9f\x03\x00\x00\x00\x00\x00\x00{\x03\x00\x00\x00\x00\x00\x00\xe9\x03\x00\x00\x00\x00\x00\x00\xd9\x03\x00\x00\x00\x00\x00\x00\xea\x03\x00\x00\x00\x00\x00\x00\xa0\x03\x00\x00\x00\x00\x00\x00\xef\x03\x00\x00\x00\x00\x00\x00\xed\x03\x00\x00\x00\x00\x00\x00|\x03\x00\x00\x00\x00\x00\x00R\x00\x00\x00\x00\x00\x00\x00\xcc\x03\x00\x00\x00\x00\x00\x00Q\x00\x00\x00\x00\x00\x00\x00\xe5\x03\x00\x00\x00\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00\xa0\x03\x00\x00\x00\x00\x00\x00\x90\x03\x00\x00\x00\x00\x00\x00v\x03\x00\x00\x00\x00\x00\x00\x80\x03\x00\x00\x00\x00\x00\x00\xef\x03\x00\x00\x00\x00\x00\x00s\x03\x00\x00\x00\x00\x00\x00\x81\x03\x00\x00\x00\x00\x00\x00\xed\x03\x00\x00\x00\x00\x00\x00\xef\x03\x00\x00\x00\x00\x00\x00\x81\x03\x00\x00\x00\x00\x00\x00q\x03\x00\x00\x00\x00\x00\x00p\x03\x00\x00\x00\x00\x00\x00\xb4\x03\x00\x00\x00\x00\x00\x00\xda\x03\x00\x00\x00\x00\x00\x00x\x03\x00\x00\x00\x00\x00\x00y\x03\x00\x00\x00\x00\x00\x00\xdc\x03\x00\x00\x00\x00\x00\x00\xf0\x03\x00\x00\x00\x00\x00\x00\xd6\x03\x00\x00\x00\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00\xe5\x03\x00\x00\x00\x00\x00\x00\'\x00\x00\x00\x00\x00\x00\x00\xcc\x03\x00\x00\x00\x00\x00\x00\xae\x03\x00\x00\x00\x00\x00\x00\xb6\x03\x00\x00\x00\x00\x00\x00\x9f\x03\x00\x00\x00\x00\x00\x00\xe8\x03\x00\x00\x00\x00\x00\x00\x9e\x03\x00\x00\x00\x00\x00\x00\xe8\x03\x00\x00\x00\x00\x00\x00\x9f\x03\x00\x00\x00\x00\x00\x00\xe9\x03\x00\x00\x00\x00\x00\x00\xa8\x03\x00\x00\x00\x00\x00\x00\xf2\x03\x00\x00\x00\x00\x00\x00\xa3\x03\x00\x00\x00\x00\x00\x00\xe3\x03\x00\x00\x00\x00\x00\x00\'\x00\x00\x00\x00\x00\x00\x00\xe5\x03\x00\x00\x00\x00\x00\x00\'\x00\x00\x00\x00\x00\x00\x00\xe3\x03\x00\x00\x00\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x00\xa9\x03\x00\x00\x00\x00\x00\x00\xe3\x03\x00\x00\x00\x00\x00\x00\xe5\x03\x00\x00\x00\x00\x00\x00\xda\x03\x00\x00\x00\x00\x00\x00y\x03\x00\x00\x00\x00\x00\x00\xb1\x03\x00\x00\x00\x00\x00\x00\x85\x03\x00\x00\x00\x00\x00\x00\xdb\x03\x00\x00\x00\x00\x00\x00\xd6\x03\x00\x00\x00\x00\x00\x00}\x00\x00\x00\x00\x00\x00\x00\xf4\x03\x00\x00\x00\x00\x00\x00\xf3\x03\x00\x00\x00\x00\x00\x00}\x00\x00\x00\x00\x00\x00\x00\xf3\x03\x00\x00\x00\x00\x00\x00|\x00\x00\x00\x00\x00\x00\x00\xf5\x03\x00\x00\x00\x00\x00\x00\xf7\x03\x00\x00\x00\x00\x00\x00\xf6\x03\x00\x00\x00\x00\x00\x00\xf5\x03\x00\x00\x00\x00\x00\x00\xf8\x03\x00\x00\x00\x00\x00\x00\xf7\x03\x00\x00\x00\x00\x00\x00\xf9\x03\x00\x00\x00\x00\x00\x00\xfb\x03\x00\x00\x00\x00\x00\x00\xfa\x03\x00\x00\x00\x00\x00\x00\xf3\x03\x00\x00\x00\x00\x00\x00\xfd\x03\x00\x00\x00\x00\x00\x00\xfc\x03\x00\x00\x00\x00\x00\x00\xfe\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\xff\x03\x00\x00\x00\x00\x00\x00\xfc\x03\x00\x00\x00\x00\x00\x00\xfd\x03\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00\x00\x00\xf9\x03\x00\x00\x00\x00\x00\x00\xfa\x03\x00\x00\x00\x00\x00\x00\x02\x04\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00\x05\x04\x00\x00\x00\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00\x06\x04\x00\x00\x00\x00\x00\x00\x08\x04\x00\x00\x00\x00\x00\x00\x07\x04\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00\t\x04\x00\x00\x00\x00\x00\x00\x06\x04\x00\x00\x00\x00\x00\x00\x07\x04\x00\x00\x00\x00\x00\x00\n\x04\x00\x00\x00\x00\x00\x00\x0b\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x0c\x04\x00\x00\x00\x00\x00\x00\r\x04\x00\x00\x00\x00\x00\x00\xfe\x03\x00\x00\x00\x00\x00\x00\xff\x03\x00\x00\x00\x00\x00\x00\x0e\x04\x00\x00\x00\x00\x00\x00\x10\x04\x00\x00\x00\x00\x00\x00\x0f\x04\x00\x00\x00\x00\x00\x00\x0f\x04\x00\x00\x00\x00\x00\x00\x10\x04\x00\x00\x00\x00\x00\x00\x11\x04\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x13\x04\x00\x00\x00\x00\x00\x00\x12\x04\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x12\x04\x00\x00\x00\x00\x00\x00;\x00\x00\x00\x00\x00\x00\x00\x0c\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x14\x04\x00\x00\x00\x00\x00\x00\xfb\x03\x00\x00\x00\x00\x00\x00\x16\x04\x00\x00\x00\x00\x00\x00\x15\x04\x00\x00\x00\x00\x00\x00\x17\x04\x00\x00\x00\x00\x00\x00\x19\x04\x00\x00\x00\x00\x00\x00\x18\x04\x00\x00\x00\x00\x00\x00\x18\x04\x00\x00\x00\x00\x00\x00\x19\x04\x00\x00\x00\x00\x00\x00\x1a\x04\x00\x00\x00\x00\x00\x00\x1b\x04\x00\x00\x00\x00\x00\x00\x1d\x04\x00\x00\x00\x00\x00\x00\x1c\x04\x00\x00\x00\x00\x00\x00\x1b\x04\x00\x00\x00\x00\x00\x00\x1c\x04\x00\x00\x00\x00\x00\x00\x1e\x04\x00\x00\x00\x00\x00\x00\x1f\x04\x00\x00\x00\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x00y\x00\x00\x00\x00\x00\x00\x00]\x00\x00\x00\x00\x00\x00\x00\x1a\x04\x00\x00\x00\x00\x00\x00\x19\x04\x00\x00\x00\x00\x00\x00]\x00\x00\x00\x00\x00\x00\x00\x19\x04\x00\x00\x00\x00\x00\x00^\x00\x00\x00\x00\x00\x00\x00\x1f\x04\x00\x00\x00\x00\x00\x00y\x00\x00\x00\x00\x00\x00\x00 \x04\x00\x00\x00\x00\x00\x00 \x04\x00\x00\x00\x00\x00\x00y\x00\x00\x00\x00\x00\x00\x00z\x00\x00\x00\x00\x00\x00\x00\x15\x04\x00\x00\x00\x00\x00\x00\x16\x04\x00\x00\x00\x00\x00\x00!\x04\x00\x00\x00\x00\x00\x00\x82\x00\x00\x00\x00\x00\x00\x00"\x04\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x00\x00\x00\x00\x18\x04\x00\x00\x00\x00\x00\x00\x1a\x04\x00\x00\x00\x00\x00\x00#\x04\x00\x00\x00\x00\x00\x00$\x04\x00\x00\x00\x00\x00\x003\x00\x00\x00\x00\x00\x00\x004\x00\x00\x00\x00\x00\x00\x00%\x04\x00\x00\x00\x00\x00\x00\'\x04\x00\x00\x00\x00\x00\x00&\x04\x00\x00\x00\x00\x00\x00%\x04\x00\x00\x00\x00\x00\x00(\x04\x00\x00\x00\x00\x00\x00!\x04\x00\x00\x00\x00\x00\x00%\x04\x00\x00\x00\x00\x00\x00&\x04\x00\x00\x00\x00\x00\x00)\x04\x00\x00\x00\x00\x00\x00%\x04\x00\x00\x00\x00\x00\x00)\x04\x00\x00\x00\x00\x00\x00$\x04\x00\x00\x00\x00\x00\x00*\x04\x00\x00\x00\x00\x00\x00,\x04\x00\x00\x00\x00\x00\x00+\x04\x00\x00\x00\x00\x00\x00*\x04\x00\x00\x00\x00\x00\x00+\x04\x00\x00\x00\x00\x00\x00-\x04\x00\x00\x00\x00\x00\x00.\x04\x00\x00\x00\x00\x00\x00/\x04\x00\x00\x00\x00\x00\x00\x0b\x04\x00\x00\x00\x00\x00\x00\x0b\x04\x00\x00\x00\x00\x00\x00/\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x000\x04\x00\x00\x00\x00\x00\x00\xfc\x03\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00\x00\x001\x04\x00\x00\x00\x00\x00\x003\x04\x00\x00\x00\x00\x00\x002\x04\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\x00\x00\x004\x04\x00\x00\x00\x00\x00\x00\x11\x04\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\x00\x00\x00\x11\x04\x00\x00\x00\x00\x00\x00e\x00\x00\x00\x00\x00\x00\x00\n\x04\x00\x00\x00\x00\x00\x00\xf4\x03\x00\x00\x00\x00\x00\x005\x04\x00\x00\x00\x00\x00\x00\n\x04\x00\x00\x00\x00\x00\x005\x04\x00\x00\x00\x00\x00\x006\x04\x00\x00\x00\x00\x00\x00\xf4\x03\x00\x00\x00\x00\x00\x00~\x00\x00\x00\x00\x00\x00\x005\x04\x00\x00\x00\x00\x00\x005\x04\x00\x00\x00\x00\x00\x00~\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00a\x00\x00\x00\x00\x00\x00\x008\x04\x00\x00\x00\x00\x00\x007\x04\x00\x00\x00\x00\x00\x00a\x00\x00\x00\x00\x00\x00\x007\x04\x00\x00\x00\x00\x00\x00b\x00\x00\x00\x00\x00\x00\x00\t\x04\x00\x00\x00\x00\x00\x009\x04\x00\x00\x00\x00\x00\x00\x08\x04\x00\x00\x00\x00\x00\x00\x08\x04\x00\x00\x00\x00\x00\x009\x04\x00\x00\x00\x00\x00\x00:\x04\x00\x00\x00\x00\x00\x002\x04\x00\x00\x00\x00\x00\x00f\x00\x00\x00\x00\x00\x00\x001\x04\x00\x00\x00\x00\x00\x003\x04\x00\x00\x00\x00\x00\x001\x04\x00\x00\x00\x00\x00\x00\x10\x04\x00\x00\x00\x00\x00\x00;\x04\x00\x00\x00\x00\x00\x00"\x04\x00\x00\x00\x00\x00\x00<\x04\x00\x00\x00\x00\x00\x009\x04\x00\x00\x00\x00\x00\x00=\x04\x00\x00\x00\x00\x00\x00\xfd\x03\x00\x00\x00\x00\x00\x00\xfd\x03\x00\x00\x00\x00\x00\x00=\x04\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00\x00\x00<\x04\x00\x00\x00\x00\x00\x00"\x04\x00\x00\x00\x00\x00\x00\x82\x00\x00\x00\x00\x00\x00\x00>\x04\x00\x00\x00\x00\x00\x00=\x04\x00\x00\x00\x00\x00\x009\x04\x00\x00\x00\x00\x00\x00?\x04\x00\x00\x00\x00\x00\x00\x1f\x04\x00\x00\x00\x00\x00\x00@\x04\x00\x00\x00\x00\x00\x00.\x04\x00\x00\x00\x00\x00\x00B\x04\x00\x00\x00\x00\x00\x00A\x04\x00\x00\x00\x00\x00\x001\x04\x00\x00\x00\x00\x00\x00\x11\x04\x00\x00\x00\x00\x00\x00\x10\x04\x00\x00\x00\x00\x00\x00C\x04\x00\x00\x00\x00\x00\x00\xfe\x03\x00\x00\x00\x00\x00\x00\r\x04\x00\x00\x00\x00\x00\x00@\x04\x00\x00\x00\x00\x00\x00E\x04\x00\x00\x00\x00\x00\x00D\x04\x00\x00\x00\x00\x00\x00F\x04\x00\x00\x00\x00\x00\x00C\x04\x00\x00\x00\x00\x00\x00\r\x04\x00\x00\x00\x00\x00\x00\r\x04\x00\x00\x00\x00\x00\x00\x1e\x04\x00\x00\x00\x00\x00\x00F\x04\x00\x00\x00\x00\x00\x00\xfe\x03\x00\x00\x00\x00\x00\x00\x14\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x16\x04\x00\x00\x00\x00\x00\x00\x0c\x04\x00\x00\x00\x00\x00\x00\x14\x04\x00\x00\x00\x00\x00\x00G\x04\x00\x00\x00\x00\x00\x00I\x04\x00\x00\x00\x00\x00\x00H\x04\x00\x00\x00\x00\x00\x00H\x04\x00\x00\x00\x00\x00\x00I\x04\x00\x00\x00\x00\x00\x00J\x04\x00\x00\x00\x00\x00\x00-\x04\x00\x00\x00\x00\x00\x002\x00\x00\x00\x00\x00\x00\x00*\x04\x00\x00\x00\x00\x00\x00*\x04\x00\x00\x00\x00\x00\x002\x00\x00\x00\x00\x00\x00\x003\x00\x00\x00\x00\x00\x00\x00(\x04\x00\x00\x00\x00\x00\x006\x00\x00\x00\x00\x00\x00\x00\x15\x04\x00\x00\x00\x00\x00\x00K\x04\x00\x00\x00\x00\x00\x00L\x04\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00\x00\x00?\x04\x00\x00\x00\x00\x00\x00N\x04\x00\x00\x00\x00\x00\x00M\x04\x00\x00\x00\x00\x00\x00\x15\x04\x00\x00\x00\x00\x00\x006\x00\x00\x00\x00\x00\x00\x007\x00\x00\x00\x00\x00\x00\x00C\x04\x00\x00\x00\x00\x00\x00F\x04\x00\x00\x00\x00\x00\x00O\x04\x00\x00\x00\x00\x00\x00H\x04\x00\x00\x00\x00\x00\x00J\x04\x00\x00\x00\x00\x00\x00P\x04\x00\x00\x00\x00\x00\x00O\x04\x00\x00\x00\x00\x00\x00F\x04\x00\x00\x00\x00\x00\x00Q\x04\x00\x00\x00\x00\x00\x00R\x04\x00\x00\x00\x00\x00\x00S\x04\x00\x00\x00\x00\x00\x00J\x04\x00\x00\x00\x00\x00\x00\x0f\x04\x00\x00\x00\x00\x00\x004\x04\x00\x00\x00\x00\x00\x00T\x04\x00\x00\x00\x00\x00\x00^\x00\x00\x00\x00\x00\x00\x00\x19\x04\x00\x00\x00\x00\x00\x00U\x04\x00\x00\x00\x00\x00\x00^\x00\x00\x00\x00\x00\x00\x00U\x04\x00\x00\x00\x00\x00\x00_\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x00\x00\x00\x00"\x04\x00\x00\x00\x00\x00\x00V\x04\x00\x00\x00\x00\x00\x000\x04\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00\x00\x00L\x04\x00\x00\x00\x00\x00\x002\x04\x00\x00\x00\x00\x00\x00X\x04\x00\x00\x00\x00\x00\x00W\x04\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x00\x00\x00\x00V\x04\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00L\x04\x00\x00\x00\x00\x00\x00 \x04\x00\x00\x00\x00\x00\x000\x04\x00\x00\x00\x00\x00\x00H\x04\x00\x00\x00\x00\x00\x00P\x04\x00\x00\x00\x00\x00\x00Y\x04\x00\x00\x00\x00\x00\x00W\x04\x00\x00\x00\x00\x00\x00X\x04\x00\x00\x00\x00\x00\x00Z\x04\x00\x00\x00\x00\x00\x00[\x04\x00\x00\x00\x00\x00\x00\\\x04\x00\x00\x00\x00\x00\x004\x04\x00\x00\x00\x00\x00\x00E\x04\x00\x00\x00\x00\x00\x00L\x04\x00\x00\x00\x00\x00\x00K\x04\x00\x00\x00\x00\x00\x00(\x04\x00\x00\x00\x00\x00\x005\x00\x00\x00\x00\x00\x00\x006\x00\x00\x00\x00\x00\x00\x00 \x04\x00\x00\x00\x00\x00\x00z\x00\x00\x00\x00\x00\x00\x00]\x04\x00\x00\x00\x00\x00\x00]\x04\x00\x00\x00\x00\x00\x00z\x00\x00\x00\x00\x00\x00\x00{\x00\x00\x00\x00\x00\x00\x00^\x04\x00\x00\x00\x00\x00\x00`\x04\x00\x00\x00\x00\x00\x00_\x04\x00\x00\x00\x00\x00\x00_\x04\x00\x00\x00\x00\x00\x00`\x04\x00\x00\x00\x00\x00\x00\x02\x04\x00\x00\x00\x00\x00\x00\\\x04\x00\x00\x00\x00\x00\x00T\x04\x00\x00\x00\x00\x00\x004\x04\x00\x00\x00\x00\x00\x00\xf8\x03\x00\x00\x00\x00\x00\x00\xf5\x03\x00\x00\x00\x00\x00\x00a\x04\x00\x00\x00\x00\x00\x00b\x04\x00\x00\x00\x00\x00\x00`\x04\x00\x00\x00\x00\x00\x00c\x04\x00\x00\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x00\x00<\x04\x00\x00\x00\x00\x00\x00\x82\x00\x00\x00\x00\x00\x00\x00)\x04\x00\x00\x00\x00\x00\x00&\x04\x00\x00\x00\x00\x00\x00d\x04\x00\x00\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00Z\x04\x00\x00\x00\x00\x00\x00?\x04\x00\x00\x00\x00\x00\x00M\x04\x00\x00\x00\x00\x00\x00e\x04\x00\x00\x00\x00\x00\x00;\x04\x00\x00\x00\x00\x00\x00<\x04\x00\x00\x00\x00\x00\x00X\x04\x00\x00\x00\x00\x00\x00e\x04\x00\x00\x00\x00\x00\x00M\x04\x00\x00\x00\x00\x00\x00w\x00\x00\x00\x00\x00\x00\x00X\x04\x00\x00\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x00\x00Z\x04\x00\x00\x00\x00\x00\x00<\x04\x00\x00\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x00\x00X\x04\x00\x00\x00\x00\x00\x00;\x00\x00\x00\x00\x00\x00\x00\x12\x04\x00\x00\x00\x00\x00\x00^\x04\x00\x00\x00\x00\x00\x00;\x00\x00\x00\x00\x00\x00\x00^\x04\x00\x00\x00\x00\x00\x00:\x00\x00\x00\x00\x00\x00\x00f\x04\x00\x00\x00\x00\x00\x00,\x04\x00\x00\x00\x00\x00\x00)\x04\x00\x00\x00\x00\x00\x00T\x04\x00\x00\x00\x00\x00\x00h\x04\x00\x00\x00\x00\x00\x00g\x04\x00\x00\x00\x00\x00\x00T\x04\x00\x00\x00\x00\x00\x00\\\x04\x00\x00\x00\x00\x00\x00i\x04\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x00\x00\x00\x00N\x04\x00\x00\x00\x00\x00\x00\x13\x04\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x00\x00\x00\x00\x13\x04\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00j\x04\x00\x00\x00\x00\x00\x00h\x04\x00\x00\x00\x00\x00\x00T\x04\x00\x00\x00\x00\x00\x00f\x04\x00\x00\x00\x00\x00\x00)\x04\x00\x00\x00\x00\x00\x00d\x04\x00\x00\x00\x00\x00\x00j\x04\x00\x00\x00\x00\x00\x00T\x04\x00\x00\x00\x00\x00\x00i\x04\x00\x00\x00\x00\x00\x00U\x04\x00\x00\x00\x00\x00\x00k\x04\x00\x00\x00\x00\x00\x00_\x00\x00\x00\x00\x00\x00\x00,\x04\x00\x00\x00\x00\x00\x00f\x04\x00\x00\x00\x00\x00\x00#\x04\x00\x00\x00\x00\x00\x00:\x04\x00\x00\x00\x00\x00\x00\xfd\x03\x00\x00\x00\x00\x00\x00\xf3\x03\x00\x00\x00\x00\x00\x00\x18\x04\x00\x00\x00\x00\x00\x00#\x04\x00\x00\x00\x00\x00\x00f\x04\x00\x00\x00\x00\x00\x00l\x04\x00\x00\x00\x00\x00\x00J\x04\x00\x00\x00\x00\x00\x00S\x04\x00\x00\x00\x00\x00\x00e\x04\x00\x00\x00\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x00\x1f\x04\x00\x00\x00\x00\x00\x00?\x04\x00\x00\x00\x00\x00\x00e\x04\x00\x00\x00\x00\x00\x00\x1f\x04\x00\x00\x00\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x00e\x04\x00\x00\x00\x00\x00\x00w\x00\x00\x00\x00\x00\x00\x00\x14\x04\x00\x00\x00\x00\x00\x00C\x04\x00\x00\x00\x00\x00\x00\'\x04\x00\x00\x00\x00\x00\x00&\x04\x00\x00\x00\x00\x00\x00\'\x04\x00\x00\x00\x00\x00\x00C\x04\x00\x00\x00\x00\x00\x00\xf4\x03\x00\x00\x00\x00\x00\x00\x07\x04\x00\x00\x00\x00\x00\x00\xf3\x03\x00\x00\x00\x00\x00\x00\x07\x04\x00\x00\x00\x00\x00\x00\xf4\x03\x00\x00\x00\x00\x00\x00\n\x04\x00\x00\x00\x00\x00\x00\xf3\x03\x00\x00\x00\x00\x00\x00\x07\x04\x00\x00\x00\x00\x00\x00:\x04\x00\x00\x00\x00\x00\x00-\x04\x00\x00\x00\x00\x00\x00n\x04\x00\x00\x00\x00\x00\x00m\x04\x00\x00\x00\x00\x00\x00\x14\x04\x00\x00\x00\x00\x00\x00\xfe\x03\x00\x00\x00\x00\x00\x00C\x04\x00\x00\x00\x00\x00\x00b\x04\x00\x00\x00\x00\x00\x00\x0b\x04\x00\x00\x00\x00\x00\x00o\x04\x00\x00\x00\x00\x00\x00c\x04\x00\x00\x00\x00\x00\x00D\x04\x00\x00\x00\x00\x00\x00E\x04\x00\x00\x00\x00\x00\x00p\x04\x00\x00\x00\x00\x00\x00\xf7\x03\x00\x00\x00\x00\x00\x00\xf8\x03\x00\x00\x00\x00\x00\x00@\x04\x00\x00\x00\x00\x00\x00L\x04\x00\x00\x00\x00\x00\x00E\x04\x00\x00\x00\x00\x00\x00\x06\x04\x00\x00\x00\x00\x00\x00\n\x04\x00\x00\x00\x00\x00\x00\xf7\x03\x00\x00\x00\x00\x00\x00\x0f\x04\x00\x00\x00\x00\x00\x00g\x04\x00\x00\x00\x00\x00\x00\x0e\x04\x00\x00\x00\x00\x00\x00g\x04\x00\x00\x00\x00\x00\x00a\x04\x00\x00\x00\x00\x00\x00\x0e\x04\x00\x00\x00\x00\x00\x00>\x00\x00\x00\x00\x00\x00\x00N\x04\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x00\x00\x00\x00f\x04\x00\x00\x00\x00\x00\x00d\x04\x00\x00\x00\x00\x00\x00Y\x04\x00\x00\x00\x00\x00\x006\x04\x00\x00\x00\x00\x00\x00\xf7\x03\x00\x00\x00\x00\x00\x00\n\x04\x00\x00\x00\x00\x00\x00\x18\x04\x00\x00\x00\x00\x00\x00f\x04\x00\x00\x00\x00\x00\x00Y\x04\x00\x00\x00\x00\x00\x00k\x04\x00\x00\x00\x00\x00\x00\x17\x04\x00\x00\x00\x00\x00\x00l\x04\x00\x00\x00\x00\x00\x00\x17\x04\x00\x00\x00\x00\x00\x00k\x04\x00\x00\x00\x00\x00\x00U\x04\x00\x00\x00\x00\x00\x00.\x04\x00\x00\x00\x00\x00\x00q\x04\x00\x00\x00\x00\x00\x00/\x04\x00\x00\x00\x00\x00\x00p\x04\x00\x00\x00\x00\x00\x00\x06\x04\x00\x00\x00\x00\x00\x00\xf7\x03\x00\x00\x00\x00\x00\x00W\x04\x00\x00\x00\x00\x00\x00h\x00\x00\x00\x00\x00\x00\x00g\x00\x00\x00\x00\x00\x00\x00.\x04\x00\x00\x00\x00\x00\x00>\x04\x00\x00\x00\x00\x00\x00q\x04\x00\x00\x00\x00\x00\x00\xfb\x03\x00\x00\x00\x00\x00\x00\x0c\x04\x00\x00\x00\x00\x00\x00\x16\x04\x00\x00\x00\x00\x00\x00\x1a\x04\x00\x00\x00\x00\x00\x00]\x00\x00\x00\x00\x00\x00\x00\\\x00\x00\x00\x00\x00\x00\x00\x17\x04\x00\x00\x00\x00\x00\x00U\x04\x00\x00\x00\x00\x00\x00\x19\x04\x00\x00\x00\x00\x00\x00Y\x04\x00\x00\x00\x00\x00\x00\x17\x04\x00\x00\x00\x00\x00\x00\x18\x04\x00\x00\x00\x00\x00\x002\x04\x00\x00\x00\x00\x00\x00W\x04\x00\x00\x00\x00\x00\x00g\x00\x00\x00\x00\x00\x00\x00Y\x04\x00\x00\x00\x00\x00\x00d\x04\x00\x00\x00\x00\x00\x00Q\x04\x00\x00\x00\x00\x00\x00)\x04\x00\x00\x00\x00\x00\x00,\x04\x00\x00\x00\x00\x00\x00$\x04\x00\x00\x00\x00\x00\x00i\x04\x00\x00\x00\x00\x00\x00r\x04\x00\x00\x00\x00\x00\x00R\x04\x00\x00\x00\x00\x00\x00s\x04\x00\x00\x00\x00\x00\x00i\x04\x00\x00\x00\x00\x00\x00R\x04\x00\x00\x00\x00\x00\x00i\x04\x00\x00\x00\x00\x00\x00s\x04\x00\x00\x00\x00\x00\x00j\x04\x00\x00\x00\x00\x00\x00\x15\x04\x00\x00\x00\x00\x00\x007\x00\x00\x00\x00\x00\x00\x00\xfb\x03\x00\x00\x00\x00\x00\x00b\x04\x00\x00\x00\x00\x00\x00o\x04\x00\x00\x00\x00\x00\x00`\x04\x00\x00\x00\x00\x00\x00>\x00\x00\x00\x00\x00\x00\x00M\x04\x00\x00\x00\x00\x00\x00N\x04\x00\x00\x00\x00\x00\x00Z\x04\x00\x00\x00\x00\x00\x00h\x00\x00\x00\x00\x00\x00\x00W\x04\x00\x00\x00\x00\x00\x00(\x04\x00\x00\x00\x00\x00\x00%\x04\x00\x00\x00\x00\x00\x00t\x04\x00\x00\x00\x00\x00\x00\x1c\x04\x00\x00\x00\x00\x00\x00s\x04\x00\x00\x00\x00\x00\x00G\x04\x00\x00\x00\x00\x00\x00\x1e\x04\x00\x00\x00\x00\x00\x00\x1c\x04\x00\x00\x00\x00\x00\x00G\x04\x00\x00\x00\x00\x00\x00\x1e\x04\x00\x00\x00\x00\x00\x00G\x04\x00\x00\x00\x00\x00\x00F\x04\x00\x00\x00\x00\x00\x00b\x04\x00\x00\x00\x00\x00\x00c\x04\x00\x00\x00\x00\x00\x00B\x04\x00\x00\x00\x00\x00\x00(\x04\x00\x00\x00\x00\x00\x00t\x04\x00\x00\x00\x00\x00\x005\x00\x00\x00\x00\x00\x00\x00G\x04\x00\x00\x00\x00\x00\x00Q\x04\x00\x00\x00\x00\x00\x00F\x04\x00\x00\x00\x00\x00\x00\xf4\x03\x00\x00\x00\x00\x00\x00}\x00\x00\x00\x00\x00\x00\x00~\x00\x00\x00\x00\x00\x00\x00]\x04\x00\x00\x00\x00\x00\x00\xfc\x03\x00\x00\x00\x00\x00\x000\x04\x00\x00\x00\x00\x00\x00?\x04\x00\x00\x00\x00\x00\x00@\x04\x00\x00\x00\x00\x00\x00\x13\x04\x00\x00\x00\x00\x00\x00\x13\x04\x00\x00\x00\x00\x00\x00N\x04\x00\x00\x00\x00\x00\x00?\x04\x00\x00\x00\x00\x00\x00D\x04\x00\x00\x00\x00\x00\x00\x12\x04\x00\x00\x00\x00\x00\x00\x13\x04\x00\x00\x00\x00\x00\x00e\x00\x00\x00\x00\x00\x00\x001\x04\x00\x00\x00\x00\x00\x00f\x00\x00\x00\x00\x00\x00\x00\x0e\x04\x00\x00\x00\x00\x00\x00\xf5\x03\x00\x00\x00\x00\x00\x00u\x04\x00\x00\x00\x00\x00\x00f\x00\x00\x00\x00\x00\x00\x002\x04\x00\x00\x00\x00\x00\x00g\x00\x00\x00\x00\x00\x00\x00\x13\x04\x00\x00\x00\x00\x00\x00@\x04\x00\x00\x00\x00\x00\x00D\x04\x00\x00\x00\x00\x00\x00\xf5\x03\x00\x00\x00\x00\x00\x00\x0e\x04\x00\x00\x00\x00\x00\x00a\x04\x00\x00\x00\x00\x00\x00\x0c\x04\x00\x00\x00\x00\x00\x00\xf9\x03\x00\x00\x00\x00\x00\x00\x0b\x04\x00\x00\x00\x00\x00\x00\xf6\x03\x00\x00\x00\x00\x00\x00;\x04\x00\x00\x00\x00\x00\x00u\x04\x00\x00\x00\x00\x00\x00u\x04\x00\x00\x00\x00\x00\x00\xf5\x03\x00\x00\x00\x00\x00\x00\xf6\x03\x00\x00\x00\x00\x00\x00;\x04\x00\x00\x00\x00\x00\x00\xf6\x03\x00\x00\x00\x00\x00\x00"\x04\x00\x00\x00\x00\x00\x00"\x04\x00\x00\x00\x00\x00\x00\xf6\x03\x00\x00\x00\x00\x00\x00V\x04\x00\x00\x00\x00\x00\x00=\x04\x00\x00\x00\x00\x00\x00A\x04\x00\x00\x00\x00\x00\x00K\x04\x00\x00\x00\x00\x00\x00A\x04\x00\x00\x00\x00\x00\x00B\x04\x00\x00\x00\x00\x00\x00K\x04\x00\x00\x00\x00\x00\x00v\x04\x00\x00\x00\x00\x00\x00\x05\x04\x00\x00\x00\x00\x00\x00w\x04\x00\x00\x00\x00\x00\x00\x05\x04\x00\x00\x00\x00\x00\x00\xf8\x03\x00\x00\x00\x00\x00\x00w\x04\x00\x00\x00\x00\x00\x00\xf8\x03\x00\x00\x00\x00\x00\x00\x05\x04\x00\x00\x00\x00\x00\x00p\x04\x00\x00\x00\x00\x00\x00g\x04\x00\x00\x00\x00\x00\x00\x0f\x04\x00\x00\x00\x00\x00\x00T\x04\x00\x00\x00\x00\x00\x00E\x04\x00\x00\x00\x00\x00\x00K\x04\x00\x00\x00\x00\x00\x00B\x04\x00\x00\x00\x00\x00\x00d\x04\x00\x00\x00\x00\x00\x00O\x04\x00\x00\x00\x00\x00\x00Q\x04\x00\x00\x00\x00\x00\x00m\x04\x00\x00\x00\x00\x00\x00[\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x001\x00\x00\x00\x00\x00\x00\x00m\x04\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00w\x00\x00\x00\x00\x00\x00\x00M\x04\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00M\x04\x00\x00\x00\x00\x00\x00>\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00Z\x04\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00h\x00\x00\x00\x00\x00\x00\x00Z\x04\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00v\x04\x00\x00\x00\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00\x05\x04\x00\x00\x00\x00\x00\x00\x0c\x04\x00\x00\x00\x00\x00\x00\xfb\x03\x00\x00\x00\x00\x00\x00\xf9\x03\x00\x00\x00\x00\x00\x00C\x04\x00\x00\x00\x00\x00\x00O\x04\x00\x00\x00\x00\x00\x00&\x04\x00\x00\x00\x00\x00\x00e\x00\x00\x00\x00\x00\x00\x00\x11\x04\x00\x00\x00\x00\x00\x001\x04\x00\x00\x00\x00\x00\x00\\\x04\x00\x00\x00\x00\x00\x00[\x04\x00\x00\x00\x00\x00\x007\x04\x00\x00\x00\x00\x00\x00[\x04\x00\x00\x00\x00\x00\x00b\x00\x00\x00\x00\x00\x00\x007\x04\x00\x00\x00\x00\x00\x00b\x00\x00\x00\x00\x00\x00\x00[\x04\x00\x00\x00\x00\x00\x00c\x00\x00\x00\x00\x00\x00\x00[\x00\x00\x00\x00\x00\x00\x00m\x04\x00\x00\x00\x00\x00\x00n\x04\x00\x00\x00\x00\x00\x00\\\x00\x00\x00\x00\x00\x00\x00n\x04\x00\x00\x00\x00\x00\x00\x1a\x04\x00\x00\x00\x00\x00\x00[\x00\x00\x00\x00\x00\x00\x00n\x04\x00\x00\x00\x00\x00\x00\\\x00\x00\x00\x00\x00\x00\x00\x0e\x04\x00\x00\x00\x00\x00\x00u\x04\x00\x00\x00\x00\x00\x00\x10\x04\x00\x00\x00\x00\x00\x00l\x04\x00\x00\x00\x00\x00\x008\x04\x00\x00\x00\x00\x00\x00k\x04\x00\x00\x00\x00\x00\x00S\x04\x00\x00\x00\x00\x00\x008\x04\x00\x00\x00\x00\x00\x00l\x04\x00\x00\x00\x00\x00\x00k\x04\x00\x00\x00\x00\x00\x008\x04\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00:\x04\x00\x00\x00\x00\x00\x00\x07\x04\x00\x00\x00\x00\x00\x00\x08\x04\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x008\x04\x00\x00\x00\x00\x00\x00a\x00\x00\x00\x00\x00\x00\x00\t\x04\x00\x00\x00\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00x\x04\x00\x00\x00\x00\x00\x00r\x04\x00\x00\x00\x00\x00\x007\x04\x00\x00\x00\x00\x00\x008\x04\x00\x00\x00\x00\x00\x00r\x04\x00\x00\x00\x00\x00\x008\x04\x00\x00\x00\x00\x00\x00S\x04\x00\x00\x00\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00v\x04\x00\x00\x00\x00\x00\x00x\x04\x00\x00\x00\x00\x00\x00\xf7\x03\x00\x00\x00\x00\x00\x006\x04\x00\x00\x00\x00\x00\x00\xf6\x03\x00\x00\x00\x00\x00\x00]\x04\x00\x00\x00\x00\x00\x00{\x00\x00\x00\x00\x00\x00\x00y\x04\x00\x00\x00\x00\x00\x00x\x04\x00\x00\x00\x00\x00\x00>\x04\x00\x00\x00\x00\x00\x00\t\x04\x00\x00\x00\x00\x00\x00;\x04\x00\x00\x00\x00\x00\x00X\x04\x00\x00\x00\x00\x00\x003\x04\x00\x00\x00\x00\x00\x00;\x04\x00\x00\x00\x00\x00\x003\x04\x00\x00\x00\x00\x00\x00u\x04\x00\x00\x00\x00\x00\x00u\x04\x00\x00\x00\x00\x00\x003\x04\x00\x00\x00\x00\x00\x00\x10\x04\x00\x00\x00\x00\x00\x00\x11\x04\x00\x00\x00\x00\x00\x004\x04\x00\x00\x00\x00\x00\x00\x0f\x04\x00\x00\x00\x00\x00\x00-\x04\x00\x00\x00\x00\x00\x001\x00\x00\x00\x00\x00\x00\x002\x00\x00\x00\x00\x00\x00\x001\x00\x00\x00\x00\x00\x00\x00-\x04\x00\x00\x00\x00\x00\x00m\x04\x00\x00\x00\x00\x00\x006\x04\x00\x00\x00\x00\x00\x005\x04\x00\x00\x00\x00\x00\x00V\x04\x00\x00\x00\x00\x00\x005\x04\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00V\x04\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x005\x04\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x004\x04\x00\x00\x00\x00\x00\x00c\x00\x00\x00\x00\x00\x00\x00[\x04\x00\x00\x00\x00\x00\x00c\x00\x00\x00\x00\x00\x00\x004\x04\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\x00\x00\x003\x04\x00\x00\x00\x00\x00\x00X\x04\x00\x00\x00\x00\x00\x002\x04\x00\x00\x00\x00\x00\x00{\x00\x00\x00\x00\x00\x00\x00|\x00\x00\x00\x00\x00\x00\x00y\x04\x00\x00\x00\x00\x00\x00\'\x04\x00\x00\x00\x00\x00\x00%\x04\x00\x00\x00\x00\x00\x00!\x04\x00\x00\x00\x00\x00\x00\x16\x04\x00\x00\x00\x00\x00\x00\x14\x04\x00\x00\x00\x00\x00\x00\'\x04\x00\x00\x00\x00\x00\x00>\x04\x00\x00\x00\x00\x00\x009\x04\x00\x00\x00\x00\x00\x00\t\x04\x00\x00\x00\x00\x00\x00\x16\x04\x00\x00\x00\x00\x00\x00\'\x04\x00\x00\x00\x00\x00\x00!\x04\x00\x00\x00\x00\x00\x00v\x04\x00\x00\x00\x00\x00\x00z\x04\x00\x00\x00\x00\x00\x00x\x04\x00\x00\x00\x00\x00\x00n\x04\x00\x00\x00\x00\x00\x00#\x04\x00\x00\x00\x00\x00\x00\x1a\x04\x00\x00\x00\x00\x00\x00z\x04\x00\x00\x00\x00\x00\x00\xff\x03\x00\x00\x00\x00\x00\x00x\x04\x00\x00\x00\x00\x00\x00O\x04\x00\x00\x00\x00\x00\x00d\x04\x00\x00\x00\x00\x00\x00&\x04\x00\x00\x00\x00\x00\x00\xff\x03\x00\x00\x00\x00\x00\x00/\x04\x00\x00\x00\x00\x00\x00q\x04\x00\x00\x00\x00\x00\x00/\x04\x00\x00\x00\x00\x00\x00\xff\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00s\x04\x00\x00\x00\x00\x00\x00\x1d\x04\x00\x00\x00\x00\x00\x00j\x04\x00\x00\x00\x00\x00\x009\x00\x00\x00\x00\x00\x00\x00_\x04\x00\x00\x00\x00\x00\x00\x02\x04\x00\x00\x00\x00\x00\x00v\x04\x00\x00\x00\x00\x00\x00w\x04\x00\x00\x00\x00\x00\x00\x1d\x04\x00\x00\x00\x00\x00\x00a\x04\x00\x00\x00\x00\x00\x00g\x04\x00\x00\x00\x00\x00\x00h\x04\x00\x00\x00\x00\x00\x00w\x04\x00\x00\x00\x00\x00\x00j\x04\x00\x00\x00\x00\x00\x00\x1d\x04\x00\x00\x00\x00\x00\x00^\x04\x00\x00\x00\x00\x00\x00_\x04\x00\x00\x00\x00\x00\x00:\x00\x00\x00\x00\x00\x00\x00_\x04\x00\x00\x00\x00\x00\x009\x00\x00\x00\x00\x00\x00\x00:\x00\x00\x00\x00\x00\x00\x00\x17\x04\x00\x00\x00\x00\x00\x00P\x04\x00\x00\x00\x00\x00\x00l\x04\x00\x00\x00\x00\x00\x00\xf8\x03\x00\x00\x00\x00\x00\x00a\x04\x00\x00\x00\x00\x00\x00h\x04\x00\x00\x00\x00\x00\x00P\x04\x00\x00\x00\x00\x00\x00\x17\x04\x00\x00\x00\x00\x00\x00Y\x04\x00\x00\x00\x00\x00\x00k\x04\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00_\x00\x00\x00\x00\x00\x00\x00\xfd\x03\x00\x00\x00\x00\x00\x00:\x04\x00\x00\x00\x00\x00\x009\x04\x00\x00\x00\x00\x00\x00s\x04\x00\x00\x00\x00\x00\x00\x1c\x04\x00\x00\x00\x00\x00\x00\x1d\x04\x00\x00\x00\x00\x00\x00P\x04\x00\x00\x00\x00\x00\x00J\x04\x00\x00\x00\x00\x00\x00l\x04\x00\x00\x00\x00\x00\x00\xff\x03\x00\x00\x00\x00\x00\x00q\x04\x00\x00\x00\x00\x00\x00x\x04\x00\x00\x00\x00\x00\x00o\x04\x00\x00\x00\x00\x00\x00\x02\x04\x00\x00\x00\x00\x00\x00`\x04\x00\x00\x00\x00\x00\x00q\x04\x00\x00\x00\x00\x00\x00>\x04\x00\x00\x00\x00\x00\x00x\x04\x00\x00\x00\x00\x00\x00L\x04\x00\x00\x00\x00\x00\x00\x1f\x04\x00\x00\x00\x00\x00\x00 \x04\x00\x00\x00\x00\x00\x00\xf8\x03\x00\x00\x00\x00\x00\x00h\x04\x00\x00\x00\x00\x00\x00w\x04\x00\x00\x00\x00\x00\x00h\x04\x00\x00\x00\x00\x00\x00j\x04\x00\x00\x00\x00\x00\x00w\x04\x00\x00\x00\x00\x00\x00\x1f\x04\x00\x00\x00\x00\x00\x00L\x04\x00\x00\x00\x00\x00\x00@\x04\x00\x00\x00\x00\x00\x00\r\x04\x00\x00\x00\x00\x00\x00\xff\x03\x00\x00\x00\x00\x00\x00z\x04\x00\x00\x00\x00\x00\x00\x1e\x04\x00\x00\x00\x00\x00\x00\r\x04\x00\x00\x00\x00\x00\x00z\x04\x00\x00\x00\x00\x00\x00o\x04\x00\x00\x00\x00\x00\x00\x0b\x04\x00\x00\x00\x00\x00\x00\xf9\x03\x00\x00\x00\x00\x00\x00]\x04\x00\x00\x00\x00\x00\x000\x04\x00\x00\x00\x00\x00\x00 \x04\x00\x00\x00\x00\x00\x00r\x04\x00\x00\x00\x00\x00\x00i\x04\x00\x00\x00\x00\x00\x00\\\x04\x00\x00\x00\x00\x00\x007\x04\x00\x00\x00\x00\x00\x00r\x04\x00\x00\x00\x00\x00\x00\\\x04\x00\x00\x00\x00\x00\x00\x06\x04\x00\x00\x00\x00\x00\x00p\x04\x00\x00\x00\x00\x00\x00\x08\x04\x00\x00\x00\x00\x00\x00\xfb\x03\x00\x00\x00\x00\x00\x007\x00\x00\x00\x00\x00\x00\x008\x00\x00\x00\x00\x00\x00\x00A\x04\x00\x00\x00\x00\x00\x00=\x04\x00\x00\x00\x00\x00\x00>\x04\x00\x00\x00\x00\x00\x00\xfc\x03\x00\x00\x00\x00\x00\x00y\x04\x00\x00\x00\x00\x00\x00\xf3\x03\x00\x00\x00\x00\x00\x00S\x04\x00\x00\x00\x00\x00\x00R\x04\x00\x00\x00\x00\x00\x00r\x04\x00\x00\x00\x00\x00\x00v\x04\x00\x00\x00\x00\x00\x00\x1b\x04\x00\x00\x00\x00\x00\x00z\x04\x00\x00\x00\x00\x00\x00\x1b\x04\x00\x00\x00\x00\x00\x00v\x04\x00\x00\x00\x00\x00\x00\x1d\x04\x00\x00\x00\x00\x00\x00\x1b\x04\x00\x00\x00\x00\x00\x00\x1e\x04\x00\x00\x00\x00\x00\x00z\x04\x00\x00\x00\x00\x00\x00.\x04\x00\x00\x00\x00\x00\x00A\x04\x00\x00\x00\x00\x00\x00>\x04\x00\x00\x00\x00\x00\x00y\x04\x00\x00\x00\x00\x00\x00\xfc\x03\x00\x00\x00\x00\x00\x00]\x04\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00p\x04\x00\x00\x00\x00\x00\x00\x05\x04\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00\t\x04\x00\x00\x00\x00\x00\x00\x08\x04\x00\x00\x00\x00\x00\x00y\x04\x00\x00\x00\x00\x00\x00|\x00\x00\x00\x00\x00\x00\x00\xf3\x03\x00\x00\x00\x00\x00\x00p\x04\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00\x08\x04\x00\x00\x00\x00\x00\x00=\x04\x00\x00\x00\x00\x00\x00K\x04\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00\x00\x00I\x04\x00\x00\x00\x00\x00\x00s\x04\x00\x00\x00\x00\x00\x00R\x04\x00\x00\x00\x00\x00\x00+\x04\x00\x00\x00\x00\x00\x00,\x04\x00\x00\x00\x00\x00\x00#\x04\x00\x00\x00\x00\x00\x00+\x04\x00\x00\x00\x00\x00\x00n\x04\x00\x00\x00\x00\x00\x00-\x04\x00\x00\x00\x00\x00\x00n\x04\x00\x00\x00\x00\x00\x00+\x04\x00\x00\x00\x00\x00\x00#\x04\x00\x00\x00\x00\x00\x00J\x04\x00\x00\x00\x00\x00\x00I\x04\x00\x00\x00\x00\x00\x00R\x04\x00\x00\x00\x00\x00\x00\x15\x04\x00\x00\x00\x00\x00\x00!\x04\x00\x00\x00\x00\x00\x00(\x04\x00\x00\x00\x00\x00\x00V\x04\x00\x00\x00\x00\x00\x00\xf6\x03\x00\x00\x00\x00\x00\x006\x04\x00\x00\x00\x00\x00\x00s\x04\x00\x00\x00\x00\x00\x00I\x04\x00\x00\x00\x00\x00\x00G\x04\x00\x00\x00\x00\x00\x00Q\x04\x00\x00\x00\x00\x00\x00H\x04\x00\x00\x00\x00\x00\x00Y\x04\x00\x00\x00\x00\x00\x00B\x04\x00\x00\x00\x00\x00\x00c\x04\x00\x00\x00\x00\x00\x00E\x04\x00\x00\x00\x00\x00\x00H\x04\x00\x00\x00\x00\x00\x00Q\x04\x00\x00\x00\x00\x00\x00G\x04\x00\x00\x00\x00\x00\x00*\x04\x00\x00\x00\x00\x00\x003\x00\x00\x00\x00\x00\x00\x00$\x04\x00\x00\x00\x00\x00\x00,\x04\x00\x00\x00\x00\x00\x00*\x04\x00\x00\x00\x00\x00\x00$\x04\x00\x00\x00\x00\x00\x00\x02\x04\x00\x00\x00\x00\x00\x00o\x04\x00\x00\x00\x00\x00\x00\xf9\x03\x00\x00\x00\x00\x00\x00\x0b\x04\x00\x00\x00\x00\x00\x00b\x04\x00\x00\x00\x00\x00\x00.\x04\x00\x00\x00\x00\x00\x004\x00\x00\x00\x00\x00\x00\x00t\x04\x00\x00\x00\x00\x00\x00$\x04\x00\x00\x00\x00\x00\x00b\x04\x00\x00\x00\x00\x00\x00B\x04\x00\x00\x00\x00\x00\x00.\x04\x00\x00\x00\x00\x00\x00c\x04\x00\x00\x00\x00\x00\x00^\x04\x00\x00\x00\x00\x00\x00\x12\x04\x00\x00\x00\x00\x00\x00t\x04\x00\x00\x00\x00\x00\x00%\x04\x00\x00\x00\x00\x00\x00$\x04\x00\x00\x00\x00\x00\x00^\x04\x00\x00\x00\x00\x00\x00c\x04\x00\x00\x00\x00\x00\x00`\x04\x00\x00\x00\x00\x00\x00t\x04\x00\x00\x00\x00\x00\x004\x00\x00\x00\x00\x00\x00\x005\x00\x00\x00\x00\x00\x00\x00\xfa\x03\x00\x00\x00\x00\x00\x008\x00\x00\x00\x00\x00\x00\x009\x00\x00\x00\x00\x00\x00\x00D\x04\x00\x00\x00\x00\x00\x00c\x04\x00\x00\x00\x00\x00\x00\x12\x04\x00\x00\x00\x00\x00\x00\x02\x04\x00\x00\x00\x00\x00\x00\xfa\x03\x00\x00\x00\x00\x00\x009\x00\x00\x00\x00\x00\x00\x008\x00\x00\x00\x00\x00\x00\x00\xfa\x03\x00\x00\x00\x00\x00\x00\xfb\x03\x00\x00\x00\x00\x00\x00{\x04\x00\x00\x00\x00\x00\x00}\x04\x00\x00\x00\x00\x00\x00|\x04\x00\x00\x00\x00\x00\x00|\x04\x00\x00\x00\x00\x00\x00}\x04\x00\x00\x00\x00\x00\x003\x00\x00\x00\x00\x00\x00\x00|\x04\x00\x00\x00\x00\x00\x003\x00\x00\x00\x00\x00\x00\x002\x00\x00\x00\x00\x00\x00\x00~\x04\x00\x00\x00\x00\x00\x00\x80\x04\x00\x00\x00\x00\x00\x00\x7f\x04\x00\x00\x00\x00\x00\x00\x81\x04\x00\x00\x00\x00\x00\x00\x83\x04\x00\x00\x00\x00\x00\x00\x82\x04\x00\x00\x00\x00\x00\x00\x84\x04\x00\x00\x00\x00\x00\x00\x86\x04\x00\x00\x00\x00\x00\x00\x85\x04\x00\x00\x00\x00\x00\x00\x7f\x04\x00\x00\x00\x00\x00\x00\x80\x04\x00\x00\x00\x00\x00\x00\x87\x04\x00\x00\x00\x00\x00\x004\x00\x00\x00\x00\x00\x00\x00}\x04\x00\x00\x00\x00\x00\x00\x88\x04\x00\x00\x00\x00\x00\x004\x00\x00\x00\x00\x00\x00\x00\x88\x04\x00\x00\x00\x00\x00\x005\x00\x00\x00\x00\x00\x00\x007\x00\x00\x00\x00\x00\x00\x00\x8a\x04\x00\x00\x00\x00\x00\x00\x89\x04\x00\x00\x00\x00\x00\x007\x00\x00\x00\x00\x00\x00\x00\x89\x04\x00\x00\x00\x00\x00\x008\x00\x00\x00\x00\x00\x00\x00\x8b\x04\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x8c\x04\x00\x00\x00\x00\x00\x00\x82\x04\x00\x00\x00\x00\x00\x00\x83\x04\x00\x00\x00\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x8d\x04\x00\x00\x00\x00\x00\x00\x8f\x04\x00\x00\x00\x00\x00\x00\x8e\x04\x00\x00\x00\x00\x00\x00\x90\x04\x00\x00\x00\x00\x00\x00\x92\x04\x00\x00\x00\x00\x00\x00\x91\x04\x00\x00\x00\x00\x00\x00\x93\x04\x00\x00\x00\x00\x00\x00X\x00\x00\x00\x00\x00\x00\x00\x94\x04\x00\x00\x00\x00\x00\x00\x94\x04\x00\x00\x00\x00\x00\x00X\x00\x00\x00\x00\x00\x00\x00W\x00\x00\x00\x00\x00\x00\x00\x91\x04\x00\x00\x00\x00\x00\x00\x92\x04\x00\x00\x00\x00\x00\x00\x95\x04\x00\x00\x00\x00\x00\x00\x96\x04\x00\x00\x00\x00\x00\x00\x98\x04\x00\x00\x00\x00\x00\x00\x97\x04\x00\x00\x00\x00\x00\x00\x96\x04\x00\x00\x00\x00\x00\x00\x97\x04\x00\x00\x00\x00\x00\x00\x99\x04\x00\x00\x00\x00\x00\x00O\x00\x00\x00\x00\x00\x00\x00\x9b\x04\x00\x00\x00\x00\x00\x00\x9a\x04\x00\x00\x00\x00\x00\x00O\x00\x00\x00\x00\x00\x00\x00\x9a\x04\x00\x00\x00\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\x88\x04\x00\x00\x00\x00\x00\x00\x9d\x04\x00\x00\x00\x00\x00\x00\x9c\x04\x00\x00\x00\x00\x00\x00\x88\x04\x00\x00\x00\x00\x00\x00\x9c\x04\x00\x00\x00\x00\x00\x005\x00\x00\x00\x00\x00\x00\x00\x9e\x04\x00\x00\x00\x00\x00\x00\x9d\x04\x00\x00\x00\x00\x00\x00\x88\x04\x00\x00\x00\x00\x00\x00\x9e\x04\x00\x00\x00\x00\x00\x00\x88\x04\x00\x00\x00\x00\x00\x00\x9f\x04\x00\x00\x00\x00\x00\x00T\x00\x00\x00\x00\x00\x00\x00\xa1\x04\x00\x00\x00\x00\x00\x00\xa0\x04\x00\x00\x00\x00\x00\x00T\x00\x00\x00\x00\x00\x00\x00\xa0\x04\x00\x00\x00\x00\x00\x00U\x00\x00\x00\x00\x00\x00\x00{\x04\x00\x00\x00\x00\x00\x00|\x04\x00\x00\x00\x00\x00\x00\xa2\x04\x00\x00\x00\x00\x00\x00\xa3\x04\x00\x00\x00\x00\x00\x00\xa5\x04\x00\x00\x00\x00\x00\x00\xa4\x04\x00\x00\x00\x00\x00\x00\xa6\x04\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa7\x04\x00\x00\x00\x00\x00\x00\xa7\x04\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\xa8\x04\x00\x00\x00\x00\x00\x00\xaa\x04\x00\x00\x00\x00\x00\x00\xa9\x04\x00\x00\x00\x00\x00\x00\xa8\x04\x00\x00\x00\x00\x00\x00\xa9\x04\x00\x00\x00\x00\x00\x00\x87\x04\x00\x00\x00\x00\x00\x00\x94\x04\x00\x00\x00\x00\x00\x00\xab\x04\x00\x00\x00\x00\x00\x00\x93\x04\x00\x00\x00\x00\x00\x00\xac\x04\x00\x00\x00\x00\x00\x00\xae\x04\x00\x00\x00\x00\x00\x00\xad\x04\x00\x00\x00\x00\x00\x00|\x04\x00\x00\x00\x00\x00\x00\xaf\x04\x00\x00\x00\x00\x00\x00\xa2\x04\x00\x00\x00\x00\x00\x00\xad\x04\x00\x00\x00\x00\x00\x00\xae\x04\x00\x00\x00\x00\x00\x00\xb0\x04\x00\x00\x00\x00\x00\x00\xb1\x04\x00\x00\x00\x00\x00\x00\xb3\x04\x00\x00\x00\x00\x00\x00\xb2\x04\x00\x00\x00\x00\x00\x00\xb1\x04\x00\x00\x00\x00\x00\x00\xb2\x04\x00\x00\x00\x00\x00\x00\xb4\x04\x00\x00\x00\x00\x00\x00\xb5\x04\x00\x00\x00\x00\x00\x00\xb3\x04\x00\x00\x00\x00\x00\x00\xb6\x04\x00\x00\x00\x00\x00\x00\xb5\x04\x00\x00\x00\x00\x00\x00\xb6\x04\x00\x00\x00\x00\x00\x00\xb7\x04\x00\x00\x00\x00\x00\x00\xb8\x04\x00\x00\x00\x00\x00\x00\xba\x04\x00\x00\x00\x00\x00\x00\xb9\x04\x00\x00\x00\x00\x00\x00\xbb\x04\x00\x00\x00\x00\x00\x00\xbc\x04\x00\x00\x00\x00\x00\x00\xb4\x04\x00\x00\x00\x00\x00\x00\xb9\x04\x00\x00\x00\x00\x00\x00\xba\x04\x00\x00\x00\x00\x00\x00M\x00\x00\x00\x00\x00\x00\x00\xbd\x04\x00\x00\x00\x00\x00\x00\xbf\x04\x00\x00\x00\x00\x00\x00\xbe\x04\x00\x00\x00\x00\x00\x00\xc0\x04\x00\x00\x00\x00\x00\x00\x81\x04\x00\x00\x00\x00\x00\x00\xbf\x04\x00\x00\x00\x00\x00\x00:\x00\x00\x00\x00\x00\x00\x00\xc1\x04\x00\x00\x00\x00\x00\x00\x95\x04\x00\x00\x00\x00\x00\x00|\x04\x00\x00\x00\x00\x00\x002\x00\x00\x00\x00\x00\x00\x00\xc2\x04\x00\x00\x00\x00\x00\x00:\x00\x00\x00\x00\x00\x00\x00\x95\x04\x00\x00\x00\x00\x00\x00;\x00\x00\x00\x00\x00\x00\x003\x00\x00\x00\x00\x00\x00\x00}\x04\x00\x00\x00\x00\x00\x004\x00\x00\x00\x00\x00\x00\x00\xc3\x04\x00\x00\x00\x00\x00\x00Q\x00\x00\x00\x00\x00\x00\x00\xc4\x04\x00\x00\x00\x00\x00\x00\x86\x04\x00\x00\x00\x00\x00\x00\xa6\x04\x00\x00\x00\x00\x00\x00\xc5\x04\x00\x00\x00\x00\x00\x00\xc4\x04\x00\x00\x00\x00\x00\x00Q\x00\x00\x00\x00\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\x82\x04\x00\x00\x00\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x00\x00\x00\x00\xc6\x04\x00\x00\x00\x00\x00\x00\xc8\x04\x00\x00\x00\x00\x00\x00\xc7\x04\x00\x00\x00\x00\x00\x00\x85\x04\x00\x00\x00\x00\x00\x00\xba\x04\x00\x00\x00\x00\x00\x00\x84\x04\x00\x00\x00\x00\x00\x00\x83\x04\x00\x00\x00\x00\x00\x00\xca\x04\x00\x00\x00\x00\x00\x00\xc9\x04\x00\x00\x00\x00\x00\x00\x83\x04\x00\x00\x00\x00\x00\x00\xc9\x04\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\x00\x00\x00\x00\xc6\x04\x00\x00\x00\x00\x00\x00\xc7\x04\x00\x00\x00\x00\x00\x00\xcb\x04\x00\x00\x00\x00\x00\x00\xbe\x04\x00\x00\x00\x00\x00\x00\xbf\x04\x00\x00\x00\x00\x00\x00\x82\x04\x00\x00\x00\x00\x00\x00\xcc\x04\x00\x00\x00\x00\x00\x00\x95\x04\x00\x00\x00\x00\x00\x00\x8c\x04\x00\x00\x00\x00\x00\x00\xa1\x04\x00\x00\x00\x00\x00\x00\xc8\x04\x00\x00\x00\x00\x00\x00\xc6\x04\x00\x00\x00\x00\x00\x00\xab\x04\x00\x00\x00\x00\x00\x00\x94\x04\x00\x00\x00\x00\x00\x00\xcd\x04\x00\x00\x00\x00\x00\x00\xc3\x04\x00\x00\x00\x00\x00\x00\xc7\x04\x00\x00\x00\x00\x00\x00\xce\x04\x00\x00\x00\x00\x00\x00\xcf\x04\x00\x00\x00\x00\x00\x00\xd1\x04\x00\x00\x00\x00\x00\x00\xd0\x04\x00\x00\x00\x00\x00\x00\xd2\x04\x00\x00\x00\x00\x00\x00\xd3\x04\x00\x00\x00\x00\x00\x00\xc9\x04\x00\x00\x00\x00\x00\x00\xc9\x04\x00\x00\x00\x00\x00\x00\xd3\x04\x00\x00\x00\x00\x00\x00\xa6\x00\x00\x00\x00\x00\x00\x00\xc3\x04\x00\x00\x00\x00\x00\x00\xce\x04\x00\x00\x00\x00\x00\x00R\x00\x00\x00\x00\x00\x00\x00\xd4\x04\x00\x00\x00\x00\x00\x00\xc4\x04\x00\x00\x00\x00\x00\x00\x9a\x04\x00\x00\x00\x00\x00\x00\xd5\x04\x00\x00\x00\x00\x00\x00\xc3\x04\x00\x00\x00\x00\x00\x00\xc4\x04\x00\x00\x00\x00\x00\x00\xd4\x04\x00\x00\x00\x00\x00\x00\x9a\x04\x00\x00\x00\x00\x00\x00\x85\x04\x00\x00\x00\x00\x00\x00\xab\x04\x00\x00\x00\x00\x00\x00\xcd\x04\x00\x00\x00\x00\x00\x00\xd6\x04\x00\x00\x00\x00\x00\x00\xa2\x04\x00\x00\x00\x00\x00\x00\xab\x04\x00\x00\x00\x00\x00\x00\xd7\x04\x00\x00\x00\x00\x00\x00\xa2\x04\x00\x00\x00\x00\x00\x00\xd7\x04\x00\x00\x00\x00\x00\x00{\x04\x00\x00\x00\x00\x00\x00\xc4\x04\x00\x00\x00\x00\x00\x00\xd8\x04\x00\x00\x00\x00\x00\x00\xd5\x04\x00\x00\x00\x00\x00\x00\x9f\x04\x00\x00\x00\x00\x00\x00{\x04\x00\x00\x00\x00\x00\x00\xd7\x04\x00\x00\x00\x00\x00\x00\xab\x04\x00\x00\x00\x00\x00\x00\xd6\x04\x00\x00\x00\x00\x00\x00\xd7\x04\x00\x00\x00\x00\x00\x00\xd5\x04\x00\x00\x00\x00\x00\x00\xd8\x04\x00\x00\x00\x00\x00\x00\x8f\x04\x00\x00\x00\x00\x00\x00\xd0\x04\x00\x00\x00\x00\x00\x00\xda\x04\x00\x00\x00\x00\x00\x00\xd9\x04\x00\x00\x00\x00\x00\x00\xc4\x04\x00\x00\x00\x00\x00\x00\xd4\x04\x00\x00\x00\x00\x00\x00\xd8\x04\x00\x00\x00\x00\x00\x00\x8b\x04\x00\x00\x00\x00\x00\x00\xdc\x04\x00\x00\x00\x00\x00\x00\xdb\x04\x00\x00\x00\x00\x00\x00\xbc\x04\x00\x00\x00\x00\x00\x00\xdd\x04\x00\x00\x00\x00\x00\x00\x8d\x04\x00\x00\x00\x00\x00\x00\xdb\x04\x00\x00\x00\x00\x00\x00\xdc\x04\x00\x00\x00\x00\x00\x00\xde\x04\x00\x00\x00\x00\x00\x00\x85\x04\x00\x00\x00\x00\x00\x00\x86\x04\x00\x00\x00\x00\x00\x00\xdf\x04\x00\x00\x00\x00\x00\x00\x85\x04\x00\x00\x00\x00\x00\x00\xdf\x04\x00\x00\x00\x00\x00\x00\xd4\x04\x00\x00\x00\x00\x00\x00\xa7\x04\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\xe0\x04\x00\x00\x00\x00\x00\x00\xe0\x04\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\xa5\x00\x00\x00\x00\x00\x00\x00\xdd\x04\x00\x00\x00\x00\x00\x00\xbc\x04\x00\x00\x00\x00\x00\x00\xbb\x04\x00\x00\x00\x00\x00\x00\x8d\x04\x00\x00\x00\x00\x00\x00\x8e\x04\x00\x00\x00\x00\x00\x00\xbc\x04\x00\x00\x00\x00\x00\x00\x82\x04\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x00\x00\x00\x00\xbe\x04\x00\x00\x00\x00\x00\x00\xbe\x04\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\xd9\x04\x00\x00\x00\x00\x00\x00\xc5\x04\x00\x00\x00\x00\x00\x00\xd0\x04\x00\x00\x00\x00\x00\x00\xd7\x04\x00\x00\x00\x00\x00\x00\xe1\x04\x00\x00\x00\x00\x00\x00\x9f\x04\x00\x00\x00\x00\x00\x00\x8d\x04\x00\x00\x00\x00\x00\x00\xdd\x04\x00\x00\x00\x00\x00\x00\xcb\x04\x00\x00\x00\x00\x00\x00\x9d\x04\x00\x00\x00\x00\x00\x00\x8a\x04\x00\x00\x00\x00\x00\x00\x9c\x04\x00\x00\x00\x00\x00\x00\x8a\x04\x00\x00\x00\x00\x00\x00\x9d\x04\x00\x00\x00\x00\x00\x00\xe2\x04\x00\x00\x00\x00\x00\x00\xa5\x04\x00\x00\x00\x00\x00\x00\xc0\x04\x00\x00\x00\x00\x00\x00\xb6\x04\x00\x00\x00\x00\x00\x00\xa5\x04\x00\x00\x00\x00\x00\x00\xb6\x04\x00\x00\x00\x00\x00\x00\xa4\x04\x00\x00\x00\x00\x00\x00\x87\x04\x00\x00\x00\x00\x00\x00\xa9\x04\x00\x00\x00\x00\x00\x00\x7f\x04\x00\x00\x00\x00\x00\x00\x7f\x04\x00\x00\x00\x00\x00\x00\xa9\x04\x00\x00\x00\x00\x00\x00\xe3\x04\x00\x00\x00\x00\x00\x00\x8c\x04\x00\x00\x00\x00\x00\x00\x95\x04\x00\x00\x00\x00\x00\x00\x92\x04\x00\x00\x00\x00\x00\x00\xbd\x04\x00\x00\x00\x00\x00\x00\xbe\x04\x00\x00\x00\x00\x00\x00\xe4\x04\x00\x00\x00\x00\x00\x00\xc1\x04\x00\x00\x00\x00\x00\x00\xe6\x04\x00\x00\x00\x00\x00\x00\xe5\x04\x00\x00\x00\x00\x00\x00\xe7\x04\x00\x00\x00\x00\x00\x00\xe6\x04\x00\x00\x00\x00\x00\x00\xc1\x04\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\xae\x00\x00\x00\x00\x00\x00\x00\xde\x04\x00\x00\x00\x00\x00\x00\xcd\x04\x00\x00\x00\x00\x00\x00\x7f\x04\x00\x00\x00\x00\x00\x00\xe3\x04\x00\x00\x00\x00\x00\x00N\x00\x00\x00\x00\x00\x00\x00\xba\x04\x00\x00\x00\x00\x00\x00\x9b\x04\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\xe8\x04\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x00\x00\x00\x00N\x00\x00\x00\x00\x00\x00\x00\x9b\x04\x00\x00\x00\x00\x00\x00O\x00\x00\x00\x00\x00\x00\x00\xdc\x04\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\xde\x04\x00\x00\x00\x00\x00\x00\xe9\x04\x00\x00\x00\x00\x00\x00\xe1\x04\x00\x00\x00\x00\x00\x00\xe3\x04\x00\x00\x00\x00\x00\x00\xe8\x04\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\xdc\x04\x00\x00\x00\x00\x00\x00\xd0\x04\x00\x00\x00\x00\x00\x00\xea\x04\x00\x00\x00\x00\x00\x00\xda\x04\x00\x00\x00\x00\x00\x00\xd0\x04\x00\x00\x00\x00\x00\x00\xd1\x04\x00\x00\x00\x00\x00\x00\xea\x04\x00\x00\x00\x00\x00\x00\xe5\x04\x00\x00\x00\x00\x00\x00\xe6\x04\x00\x00\x00\x00\x00\x00\xeb\x04\x00\x00\x00\x00\x00\x00\xec\x04\x00\x00\x00\x00\x00\x00\xee\x04\x00\x00\x00\x00\x00\x00\xed\x04\x00\x00\x00\x00\x00\x00\xef\x04\x00\x00\x00\x00\x00\x00\xc2\x04\x00\x00\x00\x00\x00\x00\xf0\x04\x00\x00\x00\x00\x00\x00\xf1\x04\x00\x00\x00\x00\x00\x00\xe2\x04\x00\x00\x00\x00\x00\x00\x9d\x04\x00\x00\x00\x00\x00\x00\xc2\x04\x00\x00\x00\x00\x00\x00\xef\x04\x00\x00\x00\x00\x00\x00\xaf\x04\x00\x00\x00\x00\x00\x00|\x04\x00\x00\x00\x00\x00\x00\xc2\x04\x00\x00\x00\x00\x00\x00\xaf\x04\x00\x00\x00\x00\x00\x00\xf1\x04\x00\x00\x00\x00\x00\x00\x9d\x04\x00\x00\x00\x00\x00\x00\x9e\x04\x00\x00\x00\x00\x00\x00\xf2\x04\x00\x00\x00\x00\x00\x00\x89\x04\x00\x00\x00\x00\x00\x00\x8a\x04\x00\x00\x00\x00\x00\x00\xf2\x04\x00\x00\x00\x00\x00\x00\x8a\x04\x00\x00\x00\x00\x00\x00\xe2\x04\x00\x00\x00\x00\x00\x00\xed\x04\x00\x00\x00\x00\x00\x00\x90\x04\x00\x00\x00\x00\x00\x00\xec\x04\x00\x00\x00\x00\x00\x00\xee\x04\x00\x00\x00\x00\x00\x00\xec\x04\x00\x00\x00\x00\x00\x00\xf3\x04\x00\x00\x00\x00\x00\x00\xf4\x04\x00\x00\x00\x00\x00\x00\xea\x04\x00\x00\x00\x00\x00\x00\xb1\x04\x00\x00\x00\x00\x00\x00\xf5\x04\x00\x00\x00\x00\x00\x00\xc6\x04\x00\x00\x00\x00\x00\x00\xcb\x04\x00\x00\x00\x00\x00\x00\x82\x04\x00\x00\x00\x00\x00\x00\xbf\x04\x00\x00\x00\x00\x00\x00\x81\x04\x00\x00\x00\x00\x00\x00\xbc\x04\x00\x00\x00\x00\x00\x00\xf4\x04\x00\x00\x00\x00\x00\x00\xb4\x04\x00\x00\x00\x00\x00\x00\x94\x04\x00\x00\x00\x00\x00\x00W\x00\x00\x00\x00\x00\x00\x00~\x04\x00\x00\x00\x00\x00\x00~\x04\x00\x00\x00\x00\x00\x00\xcd\x04\x00\x00\x00\x00\x00\x00\x94\x04\x00\x00\x00\x00\x00\x00\xec\x04\x00\x00\x00\x00\x00\x00\x99\x04\x00\x00\x00\x00\x00\x00\xf3\x04\x00\x00\x00\x00\x00\x00\x84\x04\x00\x00\x00\x00\x00\x00\xf6\x04\x00\x00\x00\x00\x00\x00\x86\x04\x00\x00\x00\x00\x00\x00\xf6\x04\x00\x00\x00\x00\x00\x00\xa6\x04\x00\x00\x00\x00\x00\x00\x86\x04\x00\x00\x00\x00\x00\x00\xf4\x04\x00\x00\x00\x00\x00\x00\x8e\x04\x00\x00\x00\x00\x00\x00\xda\x04\x00\x00\x00\x00\x00\x00\xf4\x04\x00\x00\x00\x00\x00\x00\xbc\x04\x00\x00\x00\x00\x00\x00\x8e\x04\x00\x00\x00\x00\x00\x00\xda\x04\x00\x00\x00\x00\x00\x00\xd8\x04\x00\x00\x00\x00\x00\x00\xd9\x04\x00\x00\x00\x00\x00\x00W\x00\x00\x00\x00\x00\x00\x00V\x00\x00\x00\x00\x00\x00\x00~\x04\x00\x00\x00\x00\x00\x00\xf4\x04\x00\x00\x00\x00\x00\x00\xda\x04\x00\x00\x00\x00\x00\x00\xea\x04\x00\x00\x00\x00\x00\x00\xf4\x04\x00\x00\x00\x00\x00\x00\xb1\x04\x00\x00\x00\x00\x00\x00\xb4\x04\x00\x00\x00\x00\x00\x00\x93\x04\x00\x00\x00\x00\x00\x00\xab\x04\x00\x00\x00\x00\x00\x00\xaf\x04\x00\x00\x00\x00\x00\x00\xef\x04\x00\x00\x00\x00\x00\x00Z\x00\x00\x00\x00\x00\x00\x00Y\x00\x00\x00\x00\x00\x00\x00\x93\x04\x00\x00\x00\x00\x00\x00\xaf\x04\x00\x00\x00\x00\x00\x00\xef\x04\x00\x00\x00\x00\x00\x00\x8f\x04\x00\x00\x00\x00\x00\x00\xd8\x04\x00\x00\x00\x00\x00\x00\x8e\x04\x00\x00\x00\x00\x00\x00\xd8\x04\x00\x00\x00\x00\x00\x00\xda\x04\x00\x00\x00\x00\x00\x00\x8e\x04\x00\x00\x00\x00\x00\x00\xf7\x04\x00\x00\x00\x00\x00\x00\xf9\x04\x00\x00\x00\x00\x00\x00\xf8\x04\x00\x00\x00\x00\x00\x00\x90\x04\x00\x00\x00\x00\x00\x00\xfa\x04\x00\x00\x00\x00\x00\x00\xf8\x04\x00\x00\x00\x00\x00\x00M\x00\x00\x00\x00\x00\x00\x00\xba\x04\x00\x00\x00\x00\x00\x00N\x00\x00\x00\x00\x00\x00\x00\x88\x04\x00\x00\x00\x00\x00\x00}\x04\x00\x00\x00\x00\x00\x00{\x04\x00\x00\x00\x00\x00\x00\x88\x04\x00\x00\x00\x00\x00\x00{\x04\x00\x00\x00\x00\x00\x00\x9f\x04\x00\x00\x00\x00\x00\x00\xf0\x04\x00\x00\x00\x00\x00\x00\xc2\x04\x00\x00\x00\x00\x00\x001\x00\x00\x00\x00\x00\x00\x00\xdb\x04\x00\x00\x00\x00\x00\x00>\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x00\x00\x00\x00\xfa\x04\x00\x00\x00\x00\x00\x00\x90\x04\x00\x00\x00\x00\x00\x00\xed\x04\x00\x00\x00\x00\x00\x00\x93\x04\x00\x00\x00\x00\x00\x00\xef\x04\x00\x00\x00\x00\x00\x00Y\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00\x00\x00\x00\x00\xcc\x04\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\xcc\x04\x00\x00\x00\x00\x00\x00\x8c\x04\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\xfb\x04\x00\x00\x00\x00\x00\x00\xfc\x04\x00\x00\x00\x00\x00\x00\x98\x04\x00\x00\x00\x00\x00\x00\x8b\x04\x00\x00\x00\x00\x00\x00\xdb\x04\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x00\x00\x00\x00\xe2\x04\x00\x00\x00\x00\x00\x00\xf1\x04\x00\x00\x00\x00\x00\x00\x98\x04\x00\x00\x00\x00\x00\x00\xfb\x04\x00\x00\x00\x00\x00\x00\xf1\x04\x00\x00\x00\x00\x00\x00\xfd\x04\x00\x00\x00\x00\x00\x00\xc2\x04\x00\x00\x00\x00\x00\x002\x00\x00\x00\x00\x00\x00\x001\x00\x00\x00\x00\x00\x00\x00\xfe\x04\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\xaf\x04\x00\x00\x00\x00\x00\x00\xab\x04\x00\x00\x00\x00\x00\x00\xa2\x04\x00\x00\x00\x00\x00\x00\xcd\x04\x00\x00\x00\x00\x00\x00~\x04\x00\x00\x00\x00\x00\x00\x7f\x04\x00\x00\x00\x00\x00\x00\xf1\x04\x00\x00\x00\x00\x00\x00\xfb\x04\x00\x00\x00\x00\x00\x00\x98\x04\x00\x00\x00\x00\x00\x00\xf0\x04\x00\x00\x00\x00\x00\x00Z\x00\x00\x00\x00\x00\x00\x00\xef\x04\x00\x00\x00\x00\x00\x00\xde\x04\x00\x00\x00\x00\x00\x00>\x00\x00\x00\x00\x00\x00\x00\xdb\x04\x00\x00\x00\x00\x00\x00\xf1\x04\x00\x00\x00\x00\x00\x00\xff\x04\x00\x00\x00\x00\x00\x00\xfd\x04\x00\x00\x00\x00\x00\x00\xe1\x04\x00\x00\x00\x00\x00\x00\xd6\x04\x00\x00\x00\x00\x00\x00\xe3\x04\x00\x00\x00\x00\x00\x00\xd6\x04\x00\x00\x00\x00\x00\x00\xcd\x04\x00\x00\x00\x00\x00\x00\xe3\x04\x00\x00\x00\x00\x00\x00\xd6\x04\x00\x00\x00\x00\x00\x00\xe1\x04\x00\x00\x00\x00\x00\x00\xd7\x04\x00\x00\x00\x00\x00\x00\x9e\x04\x00\x00\x00\x00\x00\x00\xff\x04\x00\x00\x00\x00\x00\x00\xf1\x04\x00\x00\x00\x00\x00\x00\xff\x04\x00\x00\x00\x00\x00\x00\xe9\x04\x00\x00\x00\x00\x00\x00\xfd\x04\x00\x00\x00\x00\x00\x00\xe9\x04\x00\x00\x00\x00\x00\x00\xff\x04\x00\x00\x00\x00\x00\x00\xe1\x04\x00\x00\x00\x00\x00\x00\xdf\x04\x00\x00\x00\x00\x00\x00\xc5\x04\x00\x00\x00\x00\x00\x00\xd9\x04\x00\x00\x00\x00\x00\x00\xd4\x04\x00\x00\x00\x00\x00\x00\xdf\x04\x00\x00\x00\x00\x00\x00\xd9\x04\x00\x00\x00\x00\x00\x00\xc5\x04\x00\x00\x00\x00\x00\x00\xdf\x04\x00\x00\x00\x00\x00\x00\x86\x04\x00\x00\x00\x00\x00\x00\xd9\x04\x00\x00\x00\x00\x00\x00\xd8\x04\x00\x00\x00\x00\x00\x00\xd4\x04\x00\x00\x00\x00\x00\x00\xfa\x04\x00\x00\x00\x00\x00\x00\xf7\x04\x00\x00\x00\x00\x00\x00\xf8\x04\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x8b\x04\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x00\x00\x00\x00\xbd\x04\x00\x00\x00\x00\x00\x00\xe4\x04\x00\x00\x00\x00\x00\x00\xfa\x04\x00\x00\x00\x00\x00\x00X\x00\x00\x00\x00\x00\x00\x00\x93\x04\x00\x00\x00\x00\x00\x00Y\x00\x00\x00\x00\x00\x00\x00\xbf\x04\x00\x00\x00\x00\x00\x00\xbd\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\xbd\x04\x00\x00\x00\x00\x00\x00\xfa\x04\x00\x00\x00\x00\x00\x00\xed\x04\x00\x00\x00\x00\x00\x00\xbd\x04\x00\x00\x00\x00\x00\x00\xed\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\xfc\x04\x00\x00\x00\x00\x00\x00\xfb\x04\x00\x00\x00\x00\x00\x00\xfd\x04\x00\x00\x00\x00\x00\x00\xf7\x04\x00\x00\x00\x00\x00\x00\xe8\x04\x00\x00\x00\x00\x00\x00\xf9\x04\x00\x00\x00\x00\x00\x00\xf9\x04\x00\x00\x00\x00\x00\x00\xe8\x04\x00\x00\x00\x00\x00\x00\xdc\x04\x00\x00\x00\x00\x00\x00\xf9\x04\x00\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x00\xf8\x04\x00\x00\x00\x00\x00\x00\xa3\x04\x00\x00\x00\x00\x00\x00\xd1\x04\x00\x00\x00\x00\x00\x00\xcf\x04\x00\x00\x00\x00\x00\x00\xd2\x04\x00\x00\x00\x00\x00\x00\xa3\x04\x00\x00\x00\x00\x00\x00\xcf\x04\x00\x00\x00\x00\x00\x00\xd1\x04\x00\x00\x00\x00\x00\x00\xa3\x04\x00\x00\x00\x00\x00\x00\x02\x05\x00\x00\x00\x00\x00\x00\xa3\x04\x00\x00\x00\x00\x00\x00\xa4\x04\x00\x00\x00\x00\x00\x00\x02\x05\x00\x00\x00\x00\x00\x00\x9c\x04\x00\x00\x00\x00\x00\x00\x8a\x04\x00\x00\x00\x00\x00\x006\x00\x00\x00\x00\x00\x00\x006\x00\x00\x00\x00\x00\x00\x00\x8a\x04\x00\x00\x00\x00\x00\x007\x00\x00\x00\x00\x00\x00\x00\xe9\x04\x00\x00\x00\x00\x00\x00\xa9\x04\x00\x00\x00\x00\x00\x00\xaa\x04\x00\x00\x00\x00\x00\x00\x03\x05\x00\x00\x00\x00\x00\x00\xaa\x04\x00\x00\x00\x00\x00\x00\xa8\x04\x00\x00\x00\x00\x00\x00Z\x00\x00\x00\x00\x00\x00\x00\xf0\x04\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xf0\x04\x00\x00\x00\x00\x00\x001\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xde\x04\x00\x00\x00\x00\x00\x00\xae\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00>\x00\x00\x00\x00\x00\x00\x00\xde\x04\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\xd2\x04\x00\x00\x00\x00\x00\x00\xc9\x04\x00\x00\x00\x00\x00\x00\xca\x04\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\x00\x00\x00\x00\xc9\x04\x00\x00\x00\x00\x00\x00\xa6\x00\x00\x00\x00\x00\x00\x00\xeb\x04\x00\x00\x00\x00\x00\x00\xe6\x04\x00\x00\x00\x00\x00\x00\x96\x04\x00\x00\x00\x00\x00\x00\x99\x04\x00\x00\x00\x00\x00\x00\xeb\x04\x00\x00\x00\x00\x00\x00\x96\x04\x00\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x00\xf9\x04\x00\x00\x00\x00\x00\x00\xdc\x04\x00\x00\x00\x00\x00\x00\xa3\x04\x00\x00\x00\x00\x00\x00\xca\x04\x00\x00\x00\x00\x00\x00\xa5\x04\x00\x00\x00\x00\x00\x00\xa3\x04\x00\x00\x00\x00\x00\x00\xd2\x04\x00\x00\x00\x00\x00\x00\xca\x04\x00\x00\x00\x00\x00\x00;\x00\x00\x00\x00\x00\x00\x00\x95\x04\x00\x00\x00\x00\x00\x00\xcc\x04\x00\x00\x00\x00\x00\x00\xe4\x04\x00\x00\x00\x00\x00\x00\xf7\x04\x00\x00\x00\x00\x00\x00\xfa\x04\x00\x00\x00\x00\x00\x00\x87\x04\x00\x00\x00\x00\x00\x00\x80\x04\x00\x00\x00\x00\x00\x00\xf5\x04\x00\x00\x00\x00\x00\x00\xa1\x04\x00\x00\x00\x00\x00\x00\xf5\x04\x00\x00\x00\x00\x00\x00\x80\x04\x00\x00\x00\x00\x00\x00\xf7\x04\x00\x00\x00\x00\x00\x00\xe4\x04\x00\x00\x00\x00\x00\x00\xfe\x04\x00\x00\x00\x00\x00\x00\x8d\x04\x00\x00\x00\x00\x00\x00\xcb\x04\x00\x00\x00\x00\x00\x00\x8f\x04\x00\x00\x00\x00\x00\x00\xd2\x04\x00\x00\x00\x00\x00\x00\xcf\x04\x00\x00\x00\x00\x00\x00\xd3\x04\x00\x00\x00\x00\x00\x00\xe6\x04\x00\x00\x00\x00\x00\x00\xe7\x04\x00\x00\x00\x00\x00\x00\x89\x04\x00\x00\x00\x00\x00\x00\xe7\x04\x00\x00\x00\x00\x00\x008\x00\x00\x00\x00\x00\x00\x00\x89\x04\x00\x00\x00\x00\x00\x008\x00\x00\x00\x00\x00\x00\x00\xe7\x04\x00\x00\x00\x00\x00\x009\x00\x00\x00\x00\x00\x00\x00\xcb\x04\x00\x00\x00\x00\x00\x00\xdd\x04\x00\x00\x00\x00\x00\x00\xf5\x04\x00\x00\x00\x00\x00\x00\xaa\x04\x00\x00\x00\x00\x00\x00\xfd\x04\x00\x00\x00\x00\x00\x00\xe9\x04\x00\x00\x00\x00\x00\x00\xfd\x04\x00\x00\x00\x00\x00\x00\xaa\x04\x00\x00\x00\x00\x00\x00\xac\x04\x00\x00\x00\x00\x00\x00\xaa\x04\x00\x00\x00\x00\x00\x00\x03\x05\x00\x00\x00\x00\x00\x00\xac\x04\x00\x00\x00\x00\x00\x00\xd5\x04\x00\x00\x00\x00\x00\x00\x8f\x04\x00\x00\x00\x00\x00\x00\xc7\x04\x00\x00\x00\x00\x00\x00\xec\x04\x00\x00\x00\x00\x00\x00\xeb\x04\x00\x00\x00\x00\x00\x00\x99\x04\x00\x00\x00\x00\x00\x00\xc3\x04\x00\x00\x00\x00\x00\x00R\x00\x00\x00\x00\x00\x00\x00Q\x00\x00\x00\x00\x00\x00\x00\xcb\x04\x00\x00\x00\x00\x00\x00\xc7\x04\x00\x00\x00\x00\x00\x00\x8f\x04\x00\x00\x00\x00\x00\x00\xb8\x04\x00\x00\x00\x00\x00\x00\xf6\x04\x00\x00\x00\x00\x00\x00\x84\x04\x00\x00\x00\x00\x00\x00\xfc\x04\x00\x00\x00\x00\x00\x00\x97\x04\x00\x00\x00\x00\x00\x00\x98\x04\x00\x00\x00\x00\x00\x00\x99\x04\x00\x00\x00\x00\x00\x00\x97\x04\x00\x00\x00\x00\x00\x00\x04\x05\x00\x00\x00\x00\x00\x00\x97\x04\x00\x00\x00\x00\x00\x00\xfc\x04\x00\x00\x00\x00\x00\x00\x04\x05\x00\x00\x00\x00\x00\x00\xa6\x04\x00\x00\x00\x00\x00\x00\xf6\x04\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xb8\x04\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x00\x00\xf6\x04\x00\x00\x00\x00\x00\x00\xf6\x04\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x00\x00\xb8\x04\x00\x00\x00\x00\x00\x00\xa1\x00\x00\x00\x00\x00\x00\x00\x90\x04\x00\x00\x00\x00\x00\x00\xf8\x04\x00\x00\x00\x00\x00\x00\x92\x04\x00\x00\x00\x00\x00\x00\xe0\x04\x00\x00\x00\x00\x00\x00\xcf\x04\x00\x00\x00\x00\x00\x00\x05\x05\x00\x00\x00\x00\x00\x00U\x00\x00\x00\x00\x00\x00\x00\xa0\x04\x00\x00\x00\x00\x00\x00\x06\x05\x00\x00\x00\x00\x00\x00\x80\x04\x00\x00\x00\x00\x00\x00\xa0\x04\x00\x00\x00\x00\x00\x00\xa1\x04\x00\x00\x00\x00\x00\x00\x84\x04\x00\x00\x00\x00\x00\x00\xba\x04\x00\x00\x00\x00\x00\x00\xb8\x04\x00\x00\x00\x00\x00\x00\xb1\x04\x00\x00\x00\x00\x00\x00\xa4\x04\x00\x00\x00\x00\x00\x00\xb3\x04\x00\x00\x00\x00\x00\x00\xa0\x04\x00\x00\x00\x00\x00\x00\x80\x04\x00\x00\x00\x00\x00\x00\x06\x05\x00\x00\x00\x00\x00\x00\xcf\x04\x00\x00\x00\x00\x00\x00\xe0\x04\x00\x00\x00\x00\x00\x00\xd3\x04\x00\x00\x00\x00\x00\x00\xe0\x04\x00\x00\x00\x00\x00\x00\x05\x05\x00\x00\x00\x00\x00\x00\xa7\x04\x00\x00\x00\x00\x00\x00\x91\x04\x00\x00\x00\x00\x00\x00\xec\x04\x00\x00\x00\x00\x00\x00\x90\x04\x00\x00\x00\x00\x00\x00\xec\x04\x00\x00\x00\x00\x00\x00\x91\x04\x00\x00\x00\x00\x00\x00\xeb\x04\x00\x00\x00\x00\x00\x00\xf8\x04\x00\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x00\x92\x04\x00\x00\x00\x00\x00\x00\xac\x04\x00\x00\x00\x00\x00\x00\xfc\x04\x00\x00\x00\x00\x00\x00\xfd\x04\x00\x00\x00\x00\x00\x00\x06\x05\x00\x00\x00\x00\x00\x00~\x04\x00\x00\x00\x00\x00\x00V\x00\x00\x00\x00\x00\x00\x00\xe8\x04\x00\x00\x00\x00\x00\x00\xf7\x04\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x00\x00\x00\x00~\x04\x00\x00\x00\x00\x00\x00\x06\x05\x00\x00\x00\x00\x00\x00\x80\x04\x00\x00\x00\x00\x00\x00\xc1\x04\x00\x00\x00\x00\x00\x009\x00\x00\x00\x00\x00\x00\x00\xe7\x04\x00\x00\x00\x00\x00\x00\x03\x05\x00\x00\x00\x00\x00\x00\xae\x04\x00\x00\x00\x00\x00\x00\xac\x04\x00\x00\x00\x00\x00\x009\x00\x00\x00\x00\x00\x00\x00\xc1\x04\x00\x00\x00\x00\x00\x00:\x00\x00\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x00\xdc\x04\x00\x00\x00\x00\x00\x00\x8b\x04\x00\x00\x00\x00\x00\x00\x8c\x04\x00\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x00\x8b\x04\x00\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x00\x8c\x04\x00\x00\x00\x00\x00\x00\x92\x04\x00\x00\x00\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\x9a\x04\x00\x00\x00\x00\x00\x00\xc4\x04\x00\x00\x00\x00\x00\x00\xa4\x04\x00\x00\x00\x00\x00\x00\xb6\x04\x00\x00\x00\x00\x00\x00\xb3\x04\x00\x00\x00\x00\x00\x00\xb7\x04\x00\x00\x00\x00\x00\x00\xb6\x04\x00\x00\x00\x00\x00\x00\xc0\x04\x00\x00\x00\x00\x00\x00\x85\x04\x00\x00\x00\x00\x00\x00\x9a\x04\x00\x00\x00\x00\x00\x00\x9b\x04\x00\x00\x00\x00\x00\x00U\x00\x00\x00\x00\x00\x00\x00\x06\x05\x00\x00\x00\x00\x00\x00V\x00\x00\x00\x00\x00\x00\x00\x81\x04\x00\x00\x00\x00\x00\x00\xa5\x04\x00\x00\x00\x00\x00\x00\xca\x04\x00\x00\x00\x00\x00\x00\xa5\x04\x00\x00\x00\x00\x00\x00\x81\x04\x00\x00\x00\x00\x00\x00\xc0\x04\x00\x00\x00\x00\x00\x00\xa9\x04\x00\x00\x00\x00\x00\x00\xe9\x04\x00\x00\x00\x00\x00\x00\xe3\x04\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\xf7\x04\x00\x00\x00\x00\x00\x00\xfe\x04\x00\x00\x00\x00\x00\x00\xa8\x04\x00\x00\x00\x00\x00\x00\xf5\x04\x00\x00\x00\x00\x00\x00\xdd\x04\x00\x00\x00\x00\x00\x00\xf5\x04\x00\x00\x00\x00\x00\x00\xa8\x04\x00\x00\x00\x00\x00\x00\x87\x04\x00\x00\x00\x00\x00\x00\x03\x05\x00\x00\x00\x00\x00\x00\xa8\x04\x00\x00\x00\x00\x00\x00\xdd\x04\x00\x00\x00\x00\x00\x00\xa6\x04\x00\x00\x00\x00\x00\x00\x05\x05\x00\x00\x00\x00\x00\x00\xc5\x04\x00\x00\x00\x00\x00\x00\x05\x05\x00\x00\x00\x00\x00\x00\xa6\x04\x00\x00\x00\x00\x00\x00\xa7\x04\x00\x00\x00\x00\x00\x00\xf2\x04\x00\x00\x00\x00\x00\x00\x96\x04\x00\x00\x00\x00\x00\x00\xe6\x04\x00\x00\x00\x00\x00\x00\xf7\x04\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x00\x00\x00\x00\x96\x04\x00\x00\x00\x00\x00\x00\xf2\x04\x00\x00\x00\x00\x00\x00\x98\x04\x00\x00\x00\x00\x00\x00\x83\x04\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\x00\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x83\x04\x00\x00\x00\x00\x00\x00\x81\x04\x00\x00\x00\x00\x00\x00\xca\x04\x00\x00\x00\x00\x00\x00\xb8\x04\x00\x00\x00\x00\x00\x00\xb9\x04\x00\x00\x00\x00\x00\x00\xa1\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\xb9\x04\x00\x00\x00\x00\x00\x00M\x00\x00\x00\x00\x00\x00\x00\x04\x05\x00\x00\x00\x00\x00\x00\xb0\x04\x00\x00\x00\x00\x00\x00\xf3\x04\x00\x00\x00\x00\x00\x00\xe0\x04\x00\x00\x00\x00\x00\x00\xa5\x00\x00\x00\x00\x00\x00\x00\xd3\x04\x00\x00\x00\x00\x00\x00\x99\x04\x00\x00\x00\x00\x00\x00\x04\x05\x00\x00\x00\x00\x00\x00\xf3\x04\x00\x00\x00\x00\x00\x00\x89\x04\x00\x00\x00\x00\x00\x00\xf2\x04\x00\x00\x00\x00\x00\x00\xe6\x04\x00\x00\x00\x00\x00\x00\xb2\x04\x00\x00\x00\x00\x00\x00\xb0\x04\x00\x00\x00\x00\x00\x00\xae\x04\x00\x00\x00\x00\x00\x00\xb0\x04\x00\x00\x00\x00\x00\x00\xb2\x04\x00\x00\x00\x00\x00\x00\xb3\x04\x00\x00\x00\x00\x00\x00\xb4\x04\x00\x00\x00\x00\x00\x00\xb2\x04\x00\x00\x00\x00\x00\x00\xae\x04\x00\x00\x00\x00\x00\x00\xbb\x04\x00\x00\x00\x00\x00\x00\x03\x05\x00\x00\x00\x00\x00\x00\xdd\x04\x00\x00\x00\x00\x00\x00\xbb\x04\x00\x00\x00\x00\x00\x00\xb4\x04\x00\x00\x00\x00\x00\x00\xae\x04\x00\x00\x00\x00\x00\x00\xfc\x04\x00\x00\x00\x00\x00\x00\xad\x04\x00\x00\x00\x00\x00\x00\x04\x05\x00\x00\x00\x00\x00\x00\x03\x05\x00\x00\x00\x00\x00\x00\xbb\x04\x00\x00\x00\x00\x00\x00\xae\x04\x00\x00\x00\x00\x00\x00\xad\x04\x00\x00\x00\x00\x00\x00\xb0\x04\x00\x00\x00\x00\x00\x00\x04\x05\x00\x00\x00\x00\x00\x00\xad\x04\x00\x00\x00\x00\x00\x00\xfc\x04\x00\x00\x00\x00\x00\x00\xac\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\xb7\x04\x00\x00\x00\x00\x00\x00\xc0\x04\x00\x00\x00\x00\x00\x00\xbf\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\xc0\x04\x00\x00\x00\x00\x00\x00\xa6\x00\x00\x00\x00\x00\x00\x00\xd3\x04\x00\x00\x00\x00\x00\x00\xa5\x00\x00\x00\x00\x00\x00\x00\xff\x04\x00\x00\x00\x00\x00\x00\x9e\x04\x00\x00\x00\x00\x00\x00\x9f\x04\x00\x00\x00\x00\x00\x00\xb7\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\xed\x04\x00\x00\x00\x00\x00\x00\xe1\x04\x00\x00\x00\x00\x00\x00\xff\x04\x00\x00\x00\x00\x00\x00\x9f\x04\x00\x00\x00\x00\x00\x00\x91\x04\x00\x00\x00\x00\x00\x00\xe5\x04\x00\x00\x00\x00\x00\x00\xeb\x04\x00\x00\x00\x00\x00\x00\xb5\x04\x00\x00\x00\x00\x00\x00\xb7\x04\x00\x00\x00\x00\x00\x00\xf3\x04\x00\x00\x00\x00\x00\x00\xb5\x04\x00\x00\x00\x00\x00\x00\xb0\x04\x00\x00\x00\x00\x00\x00\xb3\x04\x00\x00\x00\x00\x00\x00\xc1\x04\x00\x00\x00\x00\x00\x00\xe5\x04\x00\x00\x00\x00\x00\x00\x95\x04\x00\x00\x00\x00\x00\x00\xb0\x04\x00\x00\x00\x00\x00\x00\xb5\x04\x00\x00\x00\x00\x00\x00\xf3\x04\x00\x00\x00\x00\x00\x00\xb9\x04\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\xa1\x00\x00\x00\x00\x00\x00\x00\x9c\x04\x00\x00\x00\x00\x00\x006\x00\x00\x00\x00\x00\x00\x005\x00\x00\x00\x00\x00\x00\x00\x98\x04\x00\x00\x00\x00\x00\x00\xf2\x04\x00\x00\x00\x00\x00\x00\xe2\x04\x00\x00\x00\x00\x00\x00\xea\x04\x00\x00\x00\x00\x00\x00\x02\x05\x00\x00\x00\x00\x00\x00\xb1\x04\x00\x00\x00\x00\x00\x00\x02\x05\x00\x00\x00\x00\x00\x00\xa4\x04\x00\x00\x00\x00\x00\x00\xb1\x04\x00\x00\x00\x00\x00\x00\x02\x05\x00\x00\x00\x00\x00\x00\xea\x04\x00\x00\x00\x00\x00\x00\xd1\x04\x00\x00\x00\x00\x00\x00\x9b\x04\x00\x00\x00\x00\x00\x00\xba\x04\x00\x00\x00\x00\x00\x00\x85\x04\x00\x00\x00\x00\x00\x00\xc8\x04\x00\x00\x00\x00\x00\x00T\x00\x00\x00\x00\x00\x00\x00S\x00\x00\x00\x00\x00\x00\x00\xe5\x04\x00\x00\x00\x00\x00\x00\x91\x04\x00\x00\x00\x00\x00\x00\x95\x04\x00\x00\x00\x00\x00\x00\xd0\x04\x00\x00\x00\x00\x00\x00\xc5\x04\x00\x00\x00\x00\x00\x00\x05\x05\x00\x00\x00\x00\x00\x00T\x00\x00\x00\x00\x00\x00\x00\xc8\x04\x00\x00\x00\x00\x00\x00\xa1\x04\x00\x00\x00\x00\x00\x00\xee\x04\x00\x00\x00\x00\x00\x00\xb7\x04\x00\x00\x00\x00\x00\x00\xed\x04\x00\x00\x00\x00\x00\x00\xcf\x04\x00\x00\x00\x00\x00\x00\xd0\x04\x00\x00\x00\x00\x00\x00\x05\x05\x00\x00\x00\x00\x00\x00\xd5\x04\x00\x00\x00\x00\x00\x00\xc7\x04\x00\x00\x00\x00\x00\x00\xc3\x04\x00\x00\x00\x00\x00\x00\xb7\x04\x00\x00\x00\x00\x00\x00\xee\x04\x00\x00\x00\x00\x00\x00\xf3\x04\x00\x00\x00\x00\x00\x00S\x00\x00\x00\x00\x00\x00\x00\xce\x04\x00\x00\x00\x00\x00\x00\xc8\x04\x00\x00\x00\x00\x00\x00\xbe\x04\x00\x00\x00\x00\x00\x00\xfe\x04\x00\x00\x00\x00\x00\x00\xe4\x04\x00\x00\x00\x00\x00\x00\xfe\x04\x00\x00\x00\x00\x00\x00\xbe\x04\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\xc6\x04\x00\x00\x00\x00\x00\x00\xf5\x04\x00\x00\x00\x00\x00\x00\xa1\x04\x00\x00\x00\x00\x00\x00\xce\x04\x00\x00\x00\x00\x00\x00S\x00\x00\x00\x00\x00\x00\x00R\x00\x00\x00\x00\x00\x00\x00\xce\x04\x00\x00\x00\x00\x00\x00\xc7\x04\x00\x00\x00\x00\x00\x00\xc8\x04\x00\x00\x00\x00\x00\x00'
+p22
+tp23
+bsS'lat'
+p24
+g9
+(g10
+(I0
+tp25
+g12
+tp26
+Rp27
+(I1
+(I1286
+tp28
+g16
+(S'f8'
+p29
+I0
+I1
+tp30
+Rp31
+(I3
+S'<'
+p32
+NNNI-1
+I-1
+I0
+tp33
+bI00
+S'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\xc2\xf5(\\\x7fV\xc0\x8f\xc2\xf5(\\\x7fV@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x85\xda\x00\x00\x00\x18\xc0,\x03\r\x01\x00\x00(\xc0\xa3A\xd1\x00\x00\x002\xc0\xb8\xe4%\x01\x00\x008\xc0oF\\\x01\x00\x00>\xc0\xf3\t\xd8\x00\x00\x00B\xc0\x7f\xca\x07\x01\x00\x00E\xc0\xba\x1f\x10\x01\x00\x00H\xc0:\xe3\xd9\x00\x00\x00K\xc0K\xbb\xc0\x00\x00\x00N\xc0\x1d\xbeQ\x00\x00\x80P\xc0 \xfd=\x00\x00\x00R\xc0\x08\x94*\x00\x00\x80S\xc0\x17G\x14\x00\x00\x00U\xc0\xa3W\xf2\xff\xff\xffT\xc0\x9b_\xde\xff\xff\x7fS\xc0\x97\xaf\xcb\xff\xff\xffQ\xc0\xd2\x86\xb6\xff\xff\x7fP\xc0\xc8\xdcQ\xff\xff\xffM\xc0\x0c\xf6\'\xff\xff\xffJ\xc0\x805\xf8\xfe\xff\xffG\xc0F\xe0\xef\xfe\xff\xffD\xc0\xc6\x1c&\xff\xff\xffA\xc0o\x89~\xfe\xff\xff=\xc0\x8e\x07\xb9\xfe\xff\xff7\xc0\x7f\x0b\x08\xff\xff\xff1\xc0\xcc_\xab\xfe\xff\xff\'\xc0\x8b\x8e\xbb\xfe\xff\xff\x17\xc0\xd4\x85\xda\x00\x00\x00\x18@,\x03\r\x01\x00\x00(@\xa3A\xd1\x00\x00\x002@\xb8\xe4%\x01\x00\x008@oF\\\x01\x00\x00>@\xf3\t\xd8\x00\x00\x00B@\x7f\xca\x07\x01\x00\x00E@\xba\x1f\x10\x01\x00\x00H@:\xe3\xd9\x00\x00\x00K@K\xbb\xc0\x00\x00\x00N@\x1d\xbeQ\x00\x00\x80P@ \xfd=\x00\x00\x00R@\x08\x94*\x00\x00\x80S@\x17G\x14\x00\x00\x00U@\xa3W\xf2\xff\xff\xffT@\x9b_\xde\xff\xff\x7fS@\x97\xaf\xcb\xff\xff\xffQ@\xd2\x86\xb6\xff\xff\x7fP@\xc8\xdcQ\xff\xff\xffM@\x0c\xf6\'\xff\xff\xffJ@\x805\xf8\xfe\xff\xffG@F\xe0\xef\xfe\xff\xffD@\xc6\x1c&\xff\xff\xffA@o\x89~\xfe\xff\xff=@\x8e\x07\xb9\xfe\xff\xff7@\x7f\x0b\x08\xff\xff\xff1@\xcc_\xab\xfe\xff\xff\'@\x8b\x8e\xbb\xfe\xff\xff\x17@\xd4\x85\xda\x00\x00\x00\x18@,\x03\r\x01\x00\x00(@\xa3A\xd1\x00\x00\x002@\xb8\xe4%\x01\x00\x008@oF\\\x01\x00\x00>@\xf3\t\xd8\x00\x00\x00B@\x7f\xca\x07\x01\x00\x00E@\xba\x1f\x10\x01\x00\x00H@:\xe3\xd9\x00\x00\x00K@K\xbb\xc0\x00\x00\x00N@\x1d\xbeQ\x00\x00\x80P@ \xfd=\x00\x00\x00R@\x08\x94*\x00\x00\x80S@\x17G\x14\x00\x00\x00U@\xa3W\xf2\xff\xff\xffT@\x9b_\xde\xff\xff\x7fS@\x97\xaf\xcb\xff\xff\xffQ@\xd2\x86\xb6\xff\xff\x7fP@\xc8\xdcQ\xff\xff\xffM@\x0c\xf6\'\xff\xff\xffJ@\x805\xf8\xfe\xff\xffG@F\xe0\xef\xfe\xff\xffD@\xc6\x1c&\xff\xff\xffA@o\x89~\xfe\xff\xff=@\x8e\x07\xb9\xfe\xff\xff7@\x7f\x0b\x08\xff\xff\xff1@\xcc_\xab\xfe\xff\xff\'@\x8b\x8e\xbb\xfe\xff\xff\x17@\xd4\x85\xda\x00\x00\x00\x18\xc0,\x03\r\x01\x00\x00(\xc0\xa3A\xd1\x00\x00\x002\xc0\xb8\xe4%\x01\x00\x008\xc0oF\\\x01\x00\x00>\xc0\xf3\t\xd8\x00\x00\x00B\xc0\x7f\xca\x07\x01\x00\x00E\xc0\xba\x1f\x10\x01\x00\x00H\xc0:\xe3\xd9\x00\x00\x00K\xc0K\xbb\xc0\x00\x00\x00N\xc0\x1d\xbeQ\x00\x00\x80P\xc0 \xfd=\x00\x00\x00R\xc0\x08\x94*\x00\x00\x80S\xc0\x17G\x14\x00\x00\x00U\xc0\xa3W\xf2\xff\xff\xffT\xc0\x9b_\xde\xff\xff\x7fS\xc0\x97\xaf\xcb\xff\xff\xffQ\xc0\xd2\x86\xb6\xff\xff\x7fP\xc0\xc8\xdcQ\xff\xff\xffM\xc0\x0c\xf6\'\xff\xff\xffJ\xc0\x805\xf8\xfe\xff\xffG\xc0F\xe0\xef\xfe\xff\xffD\xc0\xc6\x1c&\xff\xff\xffA\xc0o\x89~\xfe\xff\xff=\xc0\x8e\x07\xb9\xfe\xff\xff7\xc0\x7f\x0b\x08\xff\xff\xff1\xc0\xcc_\xab\xfe\xff\xff\'\xc0\x8b\x8e\xbb\xfe\xff\xff\x17\xc0\xa3\xf5\xbe\xa6\x11\xf6A@\x97\x02\xb6\xa9\x84`>@PU<Z\xba0A@\x0e%y\xd5\xb5\x1f<@\x7f*\xa1\xd3\x98\xd4E@\x05\xa6$\xc8\x93-F@lm=&<`C@{7\xa1\x08\x8e\xdf?@2\xacp\x80iK@@C\x00l\x8a\x948B@\xa0\x8b:"\xd3\xd9+@\xc0\t\x1ad\xce}4@\x96\xc1\x8a\x18\xba{3@\xd9\xde"v\x1f\xa2@@\xab\xc1\xa8i\x06\x10$@\x0b\x9e\xa3Q8\xeb>@\xe6jAN\x0f\xe49@d\xce6a\x13\x1a@@\x17\x82}\xc87\xf6%@\x80\x97.+\xe9\x80$@\x9b\x0c\xef-d\x96-@\xcb\x87\xcf\xfc\x86@3@4\xf1H5\rB9@\xe6o\xe6&\x8d66@\xe7Dbb\x1d\xf6\x18@\x1ap\x03\x02\xc2>L@\x9b\xb1\xe8\xc3\xc8\xbbH@\x9b\xd44[v;\x1a@\x06\xf4\x90\xd6%v\x11@mu;\x81\xa4\x0eI@\xa0\x90\xef)\xa4\xbcK@i\x14D\xb8\xa8KJ@s1]D\x0c\xa7\x15@\xf5y%G~\x1e<@\xbaX\xe1\x06\xa1\xdc6@\xd2\\i\xbf/Z;@\xc0\x16%[l`5@\xa3\x0e\xd4\x07\\\xe2P@\\>\xa4\xe8&3R@\xcb\xdbd\x0bQ\x81H@\xb7\x94w\x10F>H@\xe19\x82f\xd6\xd4E@\xa1\x17Y=\xd68E@\xd9\x10\xbc\xfe\xd42K@)\x99\x03\xbd\x17\x84Q@\x94\x1b\xf9\x11\xec\xc4P@\x9a\n\xe2\x83|T\x19@\xfaZ\xfe\x91y\xb0\x0f@\xa2\x0e\xd4|\x83CM@\x1b\x8b\x97]\xe0DN@v/\x15\xc2c$K@\xc7\xc5\x93\xcc\xc5\xa6*@\xe1\xde\xb4\xf3\x81\xbe"@*t\x833\xcaU\x1b@\x03\xf8<\x93d\xd8-@M\x9fS\rJ?1@\xa8\xbbmq<\xa9$@\x7fB\'\xae\xe7\xbd\'@\xe5\xc5\xfc\ny\xb9P@\xb9q\xe7\x07o\xc2Q@\xab\xe5\x1e\x96i\xfe5@N\xcb\x7fV\x87;S@MU\xf0\xf8\x8f\x08@@ \xb5\xfc\xc7m\xd5@@\xbb`\xcf<\x8d\x1cH@wa|W\xeb\xebM@m\xa0\xaf\xc8>\x96&@\xfe\x0f\xee\x03\xaa\xfa)@\x1e5\xf2\xee\xf3\x8bP@g\x8a\x94\xec\xd4\xcd@@+\t\xe7\x1d\xa24C@\x0e\x9e\x94\xc0\xf3\xeeB@\x90\x0b\xd0\x04\x95\rO@\xda.\nT\'\x19P@\x1e\xc6L0\xf492@\xc2V\x11\x8e6**@_N\x93v\x85//@\x18\x7f\x91;x\xdd;@\xed\x01\xc0N\xa2\x84L@7\xbc\xd09\xa7\xc3F@\x7f\xd3\x81\xa4\x05\xb6E@\x95\x9a\x8f\x87\x10qC@\xb2\xf6\xec>\x9b\xe6R@:\x03B\x8d&\x92T@\xc94\xe43\xf5\xd8A@<\x91\x94\xc2|\xe2B@\xa7UT\xb8\xf4XM@)\x9f3\x1d\xb12F@\xb1"\x7f[D1I@4\x18m42/G@Q\x0c\xa7\xd8X(J@\x81l\xc9\xe3\x84TD@\n\xcfM\x1c\xd8\x1a)@\x8f\xd0!\'\x19\xf3S@3W\xaa\xb8N\x01P@\xaa\x95O3\x85JN@[UDl\xd3\\1@\xb38f\xcax?7@\n\x1a:\x05\x80\xe92@\xeb\xf8\xc7S\x7f\xf3\x10@e\xcdE\x1eMb\n@\'N\xa9\x91\xdb\xf2 @6\xa4\x1d\xa3\xee\x8e9@\x1ep\x9aY\xe1\x8e8@\xc0c\xc2G\x95}=@3\xbd\xa4\x8ex=8@F\xcb\x1a\xbaI(>@\x86\xf7Z\x14QfK@\t\xcfR1\xbf\x13:@\xf0E\x01\xed+ E@\x1f\x88\xe8P\x1e\xfbE@\x8fT\x83\xb4h\\.@\xfa\x8d?@\xbb-\x15@i\x02\x1d\xc7\xe8\xd7\x13@\xd1}/\xd4\xc5\xa0O@Op\xd1\xffw\x07O@5gn$\xb3oM@\xc3\xa1\xf4\x8c\x1f\xe9 @\xf5\x07\x10\x91\x08\xc7\x17@Fk\x0b\x10p\xc8\x12@g\xde<8X\x15B@\xdb\x8b,\x02\x1e\xba @\xaf\xc6\xb0Ea\xeb5@\xbeF\xf4}.4\x12@)\xe1\xc6\xb1\xb1"2@\xd6}\x8cA\x84\xf31@J\xd1\xb8\x161\x1f\r@\x1dZ\x9d6\xd7}C@\xb3\xf7#F\x04\xc6\'@t|%{9\xa0"@\xdc\xaa!\xbf\xd4\xdaC@\xb1\x8d\xb2\x81\xea\xaa"@\xa3\xc1\x06\xfe\xea\xfe1@W2\x9d\x1d*\xe9+@\x84\xb5\xa2\x1e\xa7\xc7\x15@\xa3]x\x14bA6@\xca\xbd!C\xd5\xc90@x\xd2;[O\x9f;@\xc9\xed\xeaH.\x05\x0c@(m\xb2\x10\xcf\xa0 @/>\x97\xca\x95\x04\n@\xc9\xe1t\xe1a\xfa-@w\x9ee@\x16\x057@X\xe2\x1aq+M7@\xb7OK\x0f\xc1(<@,\xa6\xa6\xbe\xb9\x7f2@,\xf99\xe5<\xad)@\xee\xa3~\x9a\r\xf0\x19@\x98\xd6\x97\xa1\xdf\x8c*@)\xbc&\xbc\xe4\xc35@\x80\xad\xe8A\xa3W6@X]\x95\xe5$%<@\'o\xce\x8eY\xfb5@\xd8{=\xa6\nU<@\xac\xbb\xae\x17\xe0\xf99@<\xa6p\xd3\xe6\x1b"@\x96da8\x14\x1b"@\x86|\x80\xdf\x90\xed"@\xb9U\xca\x085\xe3\x13@G\x96\\\xc2\x04\x9d,@s\xc1B\xa9P\xcc"@yg\xdaS\xbdl,@\x96v\x04\x0f5\xc5$@\xb9F\xa1\xd4\xad\x9bT@\xdf\xe5;<\xf7\xbf\x16@\xbf\x13(\x115v4@\x05\x8b!\xa6 36@\x90Bl\x80\x84\xe4:@\x96\xa2U\xc9\xc2j\x13@YR\\\xc7\xc0\x95\x13@\x13\xc2\x1a$\x95kL@\xf0\xa9\xbf\x89\xee\xa8O@\x03C\x815\xd9\xa3L@x\x04\xa7;\xe0\x81C@gA\xa0\xa3\xbe\xccE@}kL\xc2*GF@#\xdf\x16\xfdw\x90H@\xeb\x11\xfb>\x18b\x1b@\x191R(\xe7^\x17@Y\xac\xd8\x84\x83@\x10@\xdf\x12*$ \xa6@@\xe2\xfeg\x15\xaa\xd2C@V\xe9sn\xe09@@\xa5\xffB\xfbNV\x17@\x87\xd2\x8e\xb5\x92\x142@\xfa\xa6\xa8\xce\xa6r7@\xc4\xcf^lik(@L\xb6\xef\xf1\xa3\xee\x1a@\xe1,\x88kf\xe8)@\xf2\xf3\xfb\x19\nT\x15@P\xc8\xf2\x91m\xb6%@\xdc\xe2\xc8iiq<@\x88_W\x96\xa4VC@\xc6\x11\xed\x10\x8b\xb9F@\x04n,\r\xff\x8e\'@\xb7\x11zPg\xa9F@\xab\x16P\xac\xa2\xeeC@\x8b\xab\x1c\x9b\x03\x16 @\xe2\x14@w\xf3\xa6\x0e@\xfc\xa1\xe5\x97R\xcd0@I\x1dY\xae\xd9\xb9R@n.6m\xd5=Q@:\x1e\x91\x8b\xd2\x0bQ@\xbcQi\x03~\x083@2\xbc/1\xa1\xb8@@\x81\xaf\x87\xfb\x9b\x05A@\xca\x0b\x17;\xcflP@b\x7f:\x16\xc9\x02R@\xfb[\x0b\xd6\xb5V@@\x95\xed\xfa\xb0o\x021@==m\x89\xfa\x9b@@\xc9\x98\xe9\x8d\x0e\tD@#N\xe9\xd0\xe4I>@\xdc\x9cNM\x11\x0f=@\xb5\\\xed\xe3k\x019@n\xeb\x95\x1c\xad!@@\x96\xa5}\xe2\xb9\xf8(@GI[\xbb\xc6\xabI@\xe0\x81\x16\t\\\xc1I@ \x1f\x0f%\x98\x83:@\xb4t\xbaI\x83U1@\xf4\xb5\xb0\x0c\x96E3@\xae\xbf\x18N\n\xdbP@\xb9\ty\x99\x05 1@\xc3\xef\x89)v\xed,@\x81\xdd\xcf\x10\xa6RM@\xc5\x12p\x95a\x88J@\xf3z\xf8_TNL@;\xb1\xb38Q{F@\xed)m~\x94\x93C@r\xedm*y\x9fD@8\xda\x95\xd1\x03\nI@\x8a6\x0c[\xf6\xf16@>q\xd8xP\x03(@\x9bv\xa11\x10\xa2I@g\x10d|\xacNG@\x80\x1f\x97\x15\xdf\xe2R@$!\x02\x7f\x15!T@\x92\x11\xac\xb5?GS@`\xd7g]\x86\x007@|Bn\xfb\x9c\xb8A@\x9d\x93\x84\xc5\xb6\x93@@\xd6\x17\x0b%k\x89<@\x87\xc0"\xcd\x1a\xf6.@\x16D_\xe8\xc7\x8a$@\x03\x89W#\xde\xed+@\x17M\x02\x05\x93\xd4E@\x1d[#B\xb7\xed3@\xb9\xb1~\xdf-sB@\xf8`\xda4V\x177@\xfb\xb8\xf59\xab\xb44@\x10<\xf9i!TR@\x94\xc4i\x9d9(O@ \xacBi\x926M@7,\x9c\xe7\x93-L@i4\xea\x05\x14\x97I@Z\xaa\xa2\x85\x07o@@\xe7\x8a9\xcd\xf5Y@@M*F\x92\x9c\x89:@9\xaf\xec\xf1C\xe5I@\x8dn\x84\xb0\'\x9c\x10@\xa7G\x0bz\xcf\x03E@\xac\xa4U\x94\x81#O@\xee\x1d0\x01acK@\xe8\xc4\x17\xc5\x99\xb3B@\xdah\xb36\xc5\xcb0@\x8b\xdeI\xca\xd3\x9a<@\xf9\xd9j\xdeS\xf5B@\xe4\x13\x0c\xb4Y\x1aC@ve\x9eb1\x8cQ@\x99\xbd\x89\xb5\xd5\xeeO@\xe1\xdaU\x85\x8cP:@"\x0c"\x17n\xcb3@a\x86\x9b\xf2.\xf2F@!\x83\xb8\x03l\x8dG@\re\xd61\x14\xfbN@\x01}\xceU\x11\xf0N@\x93$\xe4\xfah\xf2P@\x8fL\x92\xbf\x83\xaaR@\x00\xcae\xe8\xb6qQ@D\x03k\x07\xbb-\x1c@\xe9\xbe\xf60Vn\x17@\x80\x9d\x9d\xaf\x0c\xb7L@L\x80ia\x05\x08P@\xb3fx\xc8F^3@\x97?g\x03\xa6\xf36@\xa4\xef\x9d\x0e\xd5\x841@tN\x1d\xe7+)P@\x03\xcfn\xec7\xaf\x1b@?D\x04\x92\xb5\x00+@\xb8\x1a|.^q*@\xf1\xbb\xd3\x81Q\x18\x11@L\x8b\xb7\xc9\x89\xa6R@9\x1f\x1ek\x0fgQ@\xc7\xa6\xeb\xd4\x9f\xc5#@vH\xa0\xc2\xa25\x12@\xcd\x9f\xb2\xebQw\x17@-M\x0b\xddA\xd5J@\x7f\xa4^Y\x98DJ@>\x03\xac\xbf\xc8\xa2M@f\xee\xdd%O\xd0J@\x03\x9d\xdcBN\x1b"@\x1e\x00\x17L\xffa*@/\xd5:f\x99\xb39@\x15\xcc\xe9} &?@\x8d\x8cWE\xce\x0b8@\xff\xd0X\\\\\xc3M@\xf9\x1b\xe2_\xc5\xe7.@\xcfnZ\x95\xa6\xaa\'@\xf6\x02n\xd8\xc6|2@\x84Uxj\xea/%@\x96M\xc6\xe6\x8a\x025@j\xc0\x11\x84\xca\x86/@g\xa0aN\xf8?3@1s\x84\x06\x1c\xf7\x14@\r\xdf\x1a\xe53\xeb\x18@\xe9(\xc9\xee\xaf\xcdQ@\xee\xe5\xdb\x0c\xf6\xd2\x1a@-J{\xd8\xc0Y\x1e@\x1dU\n\xe2\xb3\xdf\x12@\xb0\x9f\xdegsqQ@h;v\xaa\xb8\xe8R@0\xb4\x8a\xfb\xcd0%@\x96\xc3\x1am~\xaaE@\xd2\xec80m\xceH@\xa8ms/\xd2\x9d<@\xc8\xf8\xd2Y\xc2\xb39@\x94\xc6\xdbJ\xd4\'F@D`c\xebG\x15I@\x0fm\xf2\xf2\xd5\x1eC@\xbdN\xaa\x96y\x12E@\xce\x05\xb16\xdf\xb9B@*5]Z3\x98E@=\x11\xb6\xb7\xa2AG@\xa8<_G\x9e.H@\xbfgM\xad\xf1\x90H@f\xd0\xb2\x02o"T@\xc9\xe4\x90\xdf[,4@\xa0\t\xbd\xf0\x04i3@\x82Q\xc4W\xe21+@\xa6l\xc5\xb5\x9e\x9d\'@8M\xfc\xaaz.4@X\xb8\xbb\xd8\xc3K-@\x7f\xdc\x843\xe4\xb99@(\xbc\xda\xfc\xfb\xdaD@\xb7\xd3l\x05d\xa1E@1\xd7\x99\x92\xb1bB@\x9eol\xbc\xfaW8@\x17!aGB\x88<@z\x8f\xf7\xdd\xf1A:@\xee%B\x9b8\x99(@$\xc3\x11=R\x00P@\xfar\xd9ZS\x82M@\xd8wy\xcf\x02\x9bG@E\xfeHK^\xf1H@6}\t\xd5\x1eUE@>\x8b-\n:\xb8F@\x12\xf2\x88\xfbG\xc9H@\xe5B\xaa/\xf4\xe9J@=\x0b\xd1-\xb8\xe6\x0e@\xf9\xb3a\x9b\xa9\xdc"@7\x8a\x1a2\xc7q9@jyC?\xeb\'C@\xd7\x1d\xaaJq\xbe@@\xdee\xcbN\xd8\xc7B@\xac\x10\x05\xee\x06\xc72@\x9a\xb8\x1b\x06\x17\x82:@\xb4u\xe5\x99DqP@+Y\xd5b\xeb<,@\xcav\x96r\x8d\xc1!@\xff\xdc\xd6=\xedX#@\xc5\xf4\x04\xfc\xa7\x97>@&zJ\xe6Y\x1b,@\xe9\x97G\xe5\x84\x18;@\x04\xd2\xee=8h@@W/\xd4\xbf \xfeC@S\x87\x18Y\xc5\xf7A@\xfe\x0f\xb3Jpo>@A\xbdSTY\xefK@+\xb2\x1c\xd5X M@\x173_\x15\xf0\x9d\x16@Li\xeci\xb0W4@\xb0\xa7E\xed\x99cC@F\xd3\xa4t\x0c\xc0C@\x82\xe5zMd\x15G@\x8f\xe3\xa0\xd4\x9d\xf8D@\x0fwL\xd3\xc4 B@\xf8*x\xad\xe0zO@]\x82\xa4@I\xe3>@\x93?\x98T\xbb\x80B@\x93O\xef\x81\x00\x9b?@\x08\x8a\xb2\xa3\x9c:/@\xadt\xdf\x98]\xe3%@\x00g{S#/\x13@TLxgD\xcd1@pP\xab\x8e\x90\x1aT@\x92\x03c4\x9f6U@\x9b\xc9\t\xd1\x93\xbe9@\xd3#k\xf3\xc2v.@\x07\xb1\xae\x99\xcb\xae4@\x97\xd6}H\xb9\x999@\xafN\x82`\x99\xaa4@\x90\x007\xfa\xbcL4@a\x82c\xd6\x93V@@\x887f\xb1\xd3\xa6@@\x18\xc9\xd0L9\xd2N@\xb0\xf68\xf3\x97\xf4E@\xd4\xd9\xc6\xbc\x8b\x8c7@l\r\xa6\x16\xbaVJ@\'\xce3\xb5\x11\x08<@\x08\xceC\x9c\xe7\xeeG@\xcb\xb0\xfad\x90\x83@@,vv\n{[?@\x14\xf3\x8f%M\xd1K@\xbe\x8cvY;\x18K@Iz#\xc9\xa0\xb2B@\x12f\x03\x19\xc5\x8b.@S\xc6\xb5zq[)@\xed\xe0B(\xb0(3\xc0\x8e}\xce\xed\x00\xa1+\xc0{m\\?\x02\x9e3\xc0h\xf3f\x00\xc0\x87#\xc0\x83\x91\x9b\xb3\xfd1!\xc0\xd4\xad\x7f\x9bOi\x13\xc0\x84\x0b\x9bt\x92\xc9\x0e\xc0\x02\x16\xbf\x8c\xfa\x1b\x13\xc0\x8c\xa9\xda]=\xad)\xc0v\xaa"A\x10\xf0\x19\xc0\x01QIr\xdf\x8c*\xc0\xeb\xb3g\xe16\xc25\xc0\x9d\xf5\xa3\x83XS6\xc0\x08N\xa4\xfc$%<\xc0U\x1e\xf8\xda\xd5\xde9\xc0\x88\xa9\xc5\xb4\xa8\xf66\xc0&\r\x8b+\xfb&7\xc0\xfa.e\xe6j\xc3;\xc0;\xcf\xd0\xad\x8a\x1b"\xc0\x85\\=\xfa\x88\x012\xc0?&\xfe\x84\x99\xcb?\xc0\xd7=\xc2\x83\x1b\xd4>\xc0\x9b\x13\xd11DiL\xc0\xeb\x9f\xdeA\xed\xa8O\xc0\xd8\x19\xcb\xc9\xd9\xa3L\xc0\xb9o\xa3\xc8\xd3w\x11\xc0\x06Q\xf4V\x0b\xe7\x14\xc0\xf2$\xdd\xd2\xad\x9bT\xc0\xc6\x80P\xa8\xcf\xa2\x16\xc0\xado7\x8a\xf2z4\xc0\x0f\xd1\xabo\xb5`5\xc0\x940\xbe\x80.Z:\xc0a\xae\xd3\x84\x10\x0f=\xc0(\xce\xe0?\xf6\xf16\xc0\xfd\x8c$\xf4i\x019\xc0\x81\xa7\xe9]\xf2\x81C\xc0#\xc7\xdd\xf8\xb9\xccE\xc0\ruJ\xab*GF\xc0)\xc0\xf6=~5\x1a\xc0\x08\xa9e\xd3V\x81H\xc0\x9c\x95\x8d\xa5\x03\x16 \xc0\xfd\x01\x08\xaf\xf3\xa6\x0e\xc0\xe1b\x04\x8e\x8eZ\x17\xc0b\x12C\xfa\x80@\x10\xc0\xbb\x90s\xb4\xa2i+\xc0\x12\xd7\x92\xba\x92\x142\xc0\x8b\xed\xf1\xc7\xa6r7\xc0\x855\xf9\x10V\xae"\xc0\x0f.X\xe1\xcd\x10+\xc0SvX9b\x96%\xc0\xfb\xb8\xaf\x07oq<\xc0\xac\xba\x80\xec7k"\xc0\x17\x04\x13\xac\xb6\x93@\xc0\xb8\x97\x02 k\x89<\xc0\xf3\xe7rMF\x18(\xc0,TS\xe8\xb2\x90\x1a\xc0@\x9c&\x0f\x9b\xf6(\xc0\x1e\x94\xb8\x8d\xd8AC\xc0Kc[\x81\x19\x99F\xc0E\xda\xf6\xaa\x0fx\'\xc0\xa5(\x84\xd1d\xa9F\xc0\x9cU.\xa7\x9e\xeeC\xc0\x9c\xa8\xbc\x84\x7f\xbdI\xc0\xaa)\x8a\x07\\\xc1I\xc0\xba\xd6\xd6\xf1\xa4\xc50\xc0F\xacj\x92\xa9\xbbR\xc0\xadt[\xd98=Q\xc0\r \xef\xad[\x0cQ\xc0Z\xaa\xa3=~\x083\xc0\xab"{v\xac\x06 \xc0\x160\xfbf\xe2I>\xc0\xb9\xfc\x85\x9d\xab!@\xc0\\\xa2\xe0\x1a-sB\xc0\xaaFhY\xbf\xb8@\xc0\xabU\xa9\x03p\xfd@\xc0(\t#t\x88mP\xc0[\x8c]G\xbc\x14R\xc0;oo\'P\x177\xc0>\xcf\xf0\xf2\x9fW@\xc0\x93B"\xfe\xe0\xfa0\xc0\x7f\xa1\x16g\x91\x83:\xc0\x97F\x0f\xfc\xf6\x9b@\xc0\xe4tr\x89\t\tD\xc0\xd1\x88%C\xa4\xf1$\xc0\x1e9\xc0\xace\xd2A\xc0C|\xf8d\xde\xdeP\xc0y\r3\x14\x8a\x9b1\xc0\xbd\xa9$5Q{F\xc0v3\x15y\x94\x93C\xc0\x12\'A\'y\x9fD\xc0s\x8b8:\x80\x188\xc0\xb1\xd7\xe7\x92\xb6^J\xc0\xc7o\x83\xed\xcb\xdaH\xc0\xb8\x1eD\x14\xdf\xe2R\xc0\xeeF6\x7f\x15!T\xc0\x98H\x93\xb4?GS\xc0$a\x81\xee\xfc\xa9E\xc0&\xea\xd1\xcd\xdbRG\xc0=7D\x86\x9c\xb8A\xc0\xb7\x9f%Qw\x90Q\xc0\x95Y\x90\xc1:\xccP\xc0\x17\xd5s\x18\x1f\x01(\xc0k\xae]Y\xc1H-\xc0\xca\xc4\xb7F\xb0 O\xc0\xdb\xd7\xac\x14Z6M\xc0D\xc5\x95\xd7*-L\xc0\x15|\xa8\xcc\xe1\xf2.\xc0Nl\x10\xe3J\x96I\xc0\xb1\xf1\x93aB\xe5I\xc0\xb2l,\xbc\x81\xed+\xc0(\xc1\xa2\x17\xd5$7\xc0\x1b\x98T\xa6\xb9\xa73\xc0\xedbO\x1a\xd4"@\xc0\xa7-\x90<\xa0\xa4B\xc0\xb3\xed\x9dD\xa9\xe6\x10\xc0h\xe65~\x8c\x0c\r\xc0~\x93!\xf6\x93\xb44\xc0\xd4\xf3*\x17\x05\xfe,\xc0>+O\xd0D`;\xc0o0]I!TR\xc0{ybS\x0f6:\xc0\x10i\xd7p\xb2^@\xc0\x1d\x96->\xc6\x07-\xc0L\xc2\xe8\xca~\xd5\x19\xc0\x94}\xc2f\xc5\xcb0\xc0\xa9\x10\xe7\xa3\xce\x03E\xc0\x89\x02\xea\x99\x99\xb3B\xc0X\xb8\x15xv#O\xc0>\xbb9b[cK\xc0\xd1\xb2\xf7+\x95\xfbO\xc0\xd0]L\xd0\x19\x03C\xc0\xec\xa9J[\xdaB:\xc0\xb7\xa1Pe\xcb\x84$\xc03F\xc6\xd0Mb3\xc0\r\x17\xbd\t`\xc9G\xc02@\x94\xa4\xc1dJ\xc0\x14*^rj\x8dG\xc0T$W\xec{\'M\xc0\xafl\xc5t\x0e\x93K\xc0\xef\x8b\xe9\x8a\xbd\xdcN\xc0MI\x99#QoO\xc0Z\x99\xdcJ\xe8\xbfD\xc0\\\x95\xc5\xa2\x880M\xc0&\xcb(X};I\xc0\xc2\xa5\x14Il\x1bL\xc0@\xc9\xf8\x02\x882J\xc0"E\xe0"\xfa{R\xc0\xb5\xaf\x00\xbd-\x1bQ\xc0\xc8)\n\x00\xae\nG\xc0\xdb\xb8\xe6\xa9\x8a\x95F\xc0Q\x89%\x12\x1a\x933\xc0[\x81\xbf\xbf1\x13:\xc0\x8b\xa4*\x97>#4\xc0a%\xc2\xa7\xac\x8b8\xc0b}\x90\x1d\x86EO\xc0\xb2g,\x92\xd6\x0fT\xc0\x18\x9bW\xe0\x8a\xcbR\xc0TBmd\xa6\xfaS\xc0\x07\xf32=\x7f\xd3>\xc0\x01s\xd8\xfc\xc9:@\xc0\xb3\xfa\xf4u\xfeVR\xc0\'\x12n\xf7\x19\xda3\xc0\xcf4\xbeB\xca\x81.\xc0\xd68\xf0\xf8\xed\xe6/\xc0V\x02a|\xca\xf74\xc0K\xa9NN\xb9\xf5\x12\xc0\xb2\xb7?\x11\x1c=\x13\xc0\t4\xe9\xec(\x0e:\xc0_\xcb\x80(\x1e\xed?\xc0\xc4\x01\xfd\x97T\xba>\xc0\xcbI=K=+%\xc08\x8f\x15w)\x07!\xc0\xbf\x7f\xa4-\x85j\x12\xc0\x06`\xa3\xe4\xd5MC\xc0kY\xbe\xb3\xb3\xadB\xc0\'\x00i\xac@bE\xc0\x00\x8d\x80\x83\xd8\x9aD\xc0a8\xe6\x03\x12/-\xc0\xff\xea\xbbLu,U\xc0\xbb\xd7\xb2*v|D\xc0\x82\x1d\xdch\xc0\xb7P\xc0\x9b\xfb3,\x08qP\xc0\xe4\xff\xae\xd6\x97\x13\x15\xc0y\xef\xa6\xf8i\xc3\'\xc0\xed\xa2\xff$\xca\xd1\x14\xc0\x99:\t\x946\xe2#\xc0Zvv\xba\xfb\xb0P\xc0\x05e\xc1[\xe5\xd1"\xc0>\x9e(\xa5-.&\xc0\x97}r\x18{\x8d\x14\xc07Zi2+\xb8,\xc0KtX\xd4\x94BM\xc0\x81\r5;q4\x18\xc0\x88\x18\x8e\xbfu\x91+\xc0\r^\x07jJ\xd7J\xc07\xa7\xb9\x13f\xe4K\xc0\x90\x88\x00-WBN\xc0%,1\x96\xf7\x89H\xc0H\xea\r\xb6\xc1t"\xc0\xb5W\xbeK\xdf\x8b@\xc0\xbf\x05\xed\x1d{\x19<\xc0LW\x99w\x94\x02;\xc0\x8e\xb9\x1a#U#@\xc0vR\xd2\xed]\xe1\x18\xc09jX)l\x8aQ\xc0\xd5"\xd6\x9b\xaf\xed:\xc0\xb3E\xd4\x809\xe8>\xc0yn*\xc3K\x97@\xc0\x92\x19R\xaaM\xf6+\xc0\xb9o\x84\x03}\xa53\xc0\xa822\x1eo\xbc1\xc0=\xfd\xb3\xd0\x8d\xb4C\xc0\xf1\xc9\x81\xe5(\x81!\xc0j(\x10\xee\x03:\x15\xc0\xb9\\\x14\xe6\xb1?#\xc0\x08\x87=\xb56\xf83\xc0\x8a\x10\xdaZ6%+\xc0\xe6=\xa4\xc0EX.\xc0i\x8d\xd5$\x1c\xc0\x13\xc0G\x1b\x93\x1f\xfb\xe0L\xc0\x13\x91\xd6\xa4t:K\xc0\xa7\xf9h\x91p\xc0$\xc0\x18ET\xf0g\xb9@\xc0\xc1{\xda\xbdFaB\xc0\xf1\xf0&\x8f\xf8FN\xc0\xd3\xe1\xdfI\x98\xba8\xc0s\xda\xa7\xe1\xdbuH\xc0\xb3\x16\x9cR\xdb\xc8Q\xc0\xe6=a\x01P\x0fF\xc0\xc5\x02\x03\xe8\xdbpP\xc0%\x10*\xb9\xe4{-\xc0\xff>\xf5\xc1\x9fl%\xc0\xe6\x04z\xbd,\xe50\xc0\x900`x \xe4I\xc0V\x0b\xfflEHG\xc0\x8f}\xd1\xab\x87UI\xc0\xa3\xe4\x88\\$\x85O\xc0\xedP^\x90M\x8e7\xc0\xf8\x1c\x16\x1a\x11\x112\xc0\xb0\xc9\xda\xa1ZH;\xc0\xb5\x8b\xc4\xfc\x95\xfe7\xc0\x7f^\xbc&\x9c\x8bE\xc0w\xd9yS\xad\xc3.\xc01\x8c\xe2+\xa5\xdd!\xc0$\x8e\x86d\x7f[#\xc0c\xe3\xd4\x11\xa2L/\xc0[\xe9La\xb1cN\xc0O\x0e\xaf\x81@,B\xc0\x83\xa0-\xd2B\xfaC\xc0fc\x9b\xe6;\\E\xc0\x84S\x9a\xe6\x16\x873\xc0\x98\xd6\x925\x82\r\x12\xc0C_\xe5\x8f\xdc\xafG\xc0\xa3\xa3\x84k\xf1\x98L\xc0\xbeX\xc8\xde}\x11C\xc0Y\x89y\'V\xf1\r\xc0\x1doJe\x99\xc0F\xc0\xd2@Gt\xc3\xb9I\xc0C0\xacTOAF\xc0\xe2\xef\xea\xd2\xda\x85I\xc0S\xbd3\\\x18\xed\x12\xc0;W\x90\x8c(\xc9\x10\xc0R\x9d\xf9Y&\xc6=\xc0D\xdbo\xb5\xb5yC\xc0#\xc9I\x87\x0fhA\xc0\xce\x8c\xc8(a\xf5N\xc0]E+H\x823L\xc0i7d6\xba\xf5\x14\xc0\x93l\xbf\xff\xb3x;\xc0\x9e\xc3,\xb3\xf1~4\xc0\xfd\xbe\x06\xc6\x16\xbc<\xc0\xf1r\xf2\x06$\x8bA\xc04}?3\x86\x17C\xc0U\xfe\xa3\xb3u\x156\xc0\x1a\x84\x80|-\xfd0\xc0O\x0c6%\xb7\x905\xc0\x0b\'\xd6\xc0v$@\xc0r\x14\x7fc\x81y@\xc0\x81]\xa8\xa8\xdd\xaa8\xc0v(-,\xd1S5\xc0\x83\xe0/-\x07-9\xc0Aa/\x11l\xf6A\xc0\xf5\xa6\xb2\x1c{\x80>\xc0\xd6\x9b\x7f\xa6\xc1UA\xc0\x02\xe2lU\xe6\x0b<\xc0\xc0A\xcb;\x03\x9aH\xc0\x90~\xf5\nQ\tJ\xc0\xa5?\x05\xf2p\xd4F\xc0\x10\xd3\xfa=\xb3}H\xc0\x16\xacZ\xe7\xb9{L\xc0T\xe4\xc2\xde\xb7\xa8I\xc0\x8c\xba]\x82[\xb7J\xc0\xc8\xb8L/D\x02S\xc0\xa8\xfd4\t\xd7\xb4S\xc0\xa52\xf4\xa9a"R\xc0M[\xe8\xcdi\xa3@\xc0\xaa\xeet\xb9\xbdy@\xc0\xc1\xcb\x9cp\x95zB\xc0\xa2\xe19\x9by\x0e$\xc0\xe8\x86\xb6\xa3\xf0&D\xc0s\x03\xa1\x8d\x91\xa5@\xc0M\x133;\xff{\x14\xc0\xea\xa15W\'\xcf\x19\xc0\xf7\xba+\xdb\xe07R\xc0]QP\nE:G\xc0\xb1\xcb\nm\x9a\xd5H\xc05\xae\xd6\x8e\x1d\xdd&\xc0\xe8\r\xaev\x14\x0b%\xc0\t~\x0bn\x9a\xe7/\xc0\x0cv\xd7\x1d~\x1e<\xc0QG\xb1\xe0\xa0\xdc6\xc0b\xfc\x9b\x198Z;\xc0\xdd\xf1\xba]nZ5\xc0"\xcb\xd2\x01\x88\x1e#\xc0\xfe\xee\x9f4oH\x14\xc04g\xa7\xbc\xb1\xfe\x10\xc0\x89T\x0f^i\xc2K\xc0i\x96\xaa\xc4\xaefO\xc0\xda\xf8\xfe\x10\xfcdQ\xc0S/8\xd7Z\xb7R\xc0\\3`\xda\x16b-\xc0\x87\xc9Q\xa0\x0f\xf34\xc0\xb9<\xc1\xda\xdc\xb77\xc0\x07\xf5i7h\x0f3\xc0\'n\xa7@\xa6\xf30\xc0i\xc42\x8d\xd4=\x1a\xc0R\x87\xd3\xe8Lv\x11\xc0\xf1\x11C5\x19!6\xc0\x9e\x06\xf8\x89\xdf71\xc0\x03\x17\xabs\x9f\x96Q\xc0\xbbN5\x05\xc9\xa0P\xc0h^\x92\x9d\x993T\xc0J\x0faY\xc6\x1bU\xc0\x08\xf8\xdb\x9d\xb3Y&\xc0\xe3\x96V\xceM\xfc)\xc0\x18\xda\xea\x0f\xa6\xa7\x15\xc0\xfa\\\xc9,C\x98-\xc0u4\x8d\n\xb5\xdd#\xc0\x98X\x94@\xbcz\'\xc0\xd6\xd9\xbd\xe1\x9b\x08@\xc0k]\xf3\xbem\xd5@\xc0z\xb1:}\xa1\x03:\xc0w\x0f\xac\xcd\xb1\x96=\xc0\xb4so\xc0\xcb~*\xc0\'v\\n\xb0\xb7"\xc0,j~rb)\x1b\xc0\xa6\xa0\x9a\xdf\xd4\xcd@\xc0Zu/\x04\x824C\xc0\x06\xf5\xf1/\xda\xeeB\xc0\xe5\x8e\xfa\'f\xeeK\xc0\xd9\xdcnl\xfe\x80M\xc0\xe2\xccZ\x8ax8E\xc0yd\xc1\xe6n\xea:\xc0\xfe\x9c\xcf\x97\x1c\x84P\xc0\xa9\xed\xd2\xae\xa9CH\xc0\x14\xe1}\x9b\xbc\xd4E\xc0\x8c\x84\x0c|\x11\xb8E\xc0J\xf0q\x1b\xe5\xbfN\xc0*mf[N\\P\xc0g\x0f\x9f\xf8\x16\xb9N\xc0\xea\xb7\x078\xaf\xfdJ\xc0\x10\xea?t\xf6pC\xc0\xa77\xa2B\xc6\xc2:\xc0I\xb1\\\xfbc\x0b6\xc0\x18\xd5>\xb9\xac\xd24\xc0\x10i:,\x87CN\xc0\xd1\xe1JL2\xb0P\xc0#\xda\x84\xcby\xebA\xc0\x97\xd5\xe3\xc0RC@\xc0%\x82\xcbE6\xcdB\xc0>5b3w\xab0\xc0\x86G.\xb6\xaf2F\xc0\xea\xe0\xdf\xca@1I\xc0\xd8\x87!\x82G/G\xc03dJ\xeb\x89\xd4:\xc0\xb9\xe6\xe1\xe2\nOD\xc0\r>::\x89{\x15\xc0\x04E\xd5\xdb\xcd\x0c/\xc0\xb9\x14~\xb4\x11\xddI\xc0[\x93\x844\xaeRL\xc0>\xc6\x83h3\xd8!\xc0\x96E\r\xc2&@(\xc0\x7f\xa9\xd74@)\x10\xc0Z\x0f\xe8e\xdeW8\xc0Ob\x08\xb1tIK\xc0\x87`:$\xc7\x15:\xc0\xc7\x91\xcd\x0c\xcc\xa79\xc0W\x7f\xf3\x1e;\x904\xc0*\x93\xa0\x0e\xac\x16Q\xc0\xc0\xbc\x981\xdf\x8a/\xc0\xa6#\xbe%\x8f\xedN\xc0\xe8MD~! E\xc0\x9e\x953\x81\xf7/\x15\xc0\x10]\xf20\xc1\x1d<\xc0-\\if\x07\x0f6\xc0H\xcaR\xdbz\xb96\xc0\x06\x8eIr\xa9\xa1(\xc0\xb1it\xb3U2M\xc0\xb3z\x99&|\x80?\xc0\xc4\xea\xf3\xa7\x16\xc2O\xc0~c\xe9\x1d\xeb\x14B\xc0 \xb1\x16\xb3_q?\xc0*np*q%\x12\xc0\x05\xc0\xd0O\xdb\xec5\xc0u\xb9\x9f\x19\xdc\xd2\x13\xc0\xad\xad\xadS\x93p\x17\xc0\xf6\x8dut\x8a\xb1\x13\xc0\xda\xbb;\x84\x96\xe31\xc0\x12\x03\xd7\xb9e\xed1\xc0\x8b\xa5\x08\x86\xbc\xac"\xc0c\xda\xad\xd3\xab\x86C\xc0\xd8\xfb\x99[t\xcd!\xc0\x968\x96\x94r;D\xc0\x04j\xbf\x9b|\x0fH\xc0\xccY\tb\x12\x95F\xc0\xa2\x1bA\x1a\x7f\x064\xc0\xc6\xe8#J\xaf5&\xc0\xbe\x14\x9b\xaf\xe2\xea0\xc0\xff\xa5\xa9\x87,JC@)\xcd\x03;\x88\x07G@b~n"\xe8rM@\x11&!\xe1\xc3\x11O@\xe9q\xea\xf7\xa6\xeeJ@T\x8fi\n8\xe0I@\xed\x80[\xebk3$@0\xd5\xed\xd7\x91.\x12@Uau\xeb\xe6y\x19@</6\xcdSp?@\xfd\xac\x84^:\xe4@@\xe3]_\x18Ml6@\xbf\xce\x07\x0b\xca\x18;@I\x001\x01\x08\x8e3@^D\xaa\x8ah!;@\x92\x91\x92\xa3\x8f\xad\x1a@=\xab\xdc\x8ckSE@/\x17 ~\x03\x98C@J\x85\x04r\xdanF@\x90\xb7\xfc\xc4s\x1fH@7\xb3\xc5\x07,4F@\xc4\xcdf]\xfeWE@\xa4\xd1z\x99\xe0\xc0B@\xf2+\xfb>\x11cI@\x9aTJ\xab\xa6\xe20@\x7f\xd1\xb6\x8c\x03\xe4*@(y\x12\xe1\x17\x10;@\xa1U\xcaF9\xb3N@s\x91\rda\xf3M@\xb2|\x96m\xa8lP@\xad1\xdb\r\x8a\x99O@ +\x19#\x86\x04\x15@/\xedJ\x96)\xc8\x16@5\xa1E\xfe\xd2\xad0@h\xda\xa1\x12A{\x13@\xba\xec\x8c\x0fM\x10%@d\xe3\xa1P\x91h;@\x11\x1e\x18_\x03\xab4@X\xf3\x83\x19\x90A6@\x93M\xe8\xc8A(0@\xa3\xc7A\x86\xb0\x1bB@\xb6v#\x1c\x98\\B@ \xea\xf1\x0c\xfb\\D@j\xee*\xc5\x86\x1a@@\xd3ef\tl\xc4-@N\x12\x85\x98h\x875@c0\xa4.{j @p\xc3\x93\xb2f\xf9P@\xca\xbbR\xc4l\xf1+@\x84\xf4\xb4\xb9\x13\x82\x17@\xd3F\xee3\x95\x80"@\x9e\xab\x11\x1c\x1840@\x1d4\xdaC\xae\r+@\xb6\xe5\x0b\x06av\x10@\xe3\xa3\xa3\xae\xedb(@98\x9e9L\x00\x14@"At\xcaz\xb0"@<B\x86R\n\x11%@\x8f\x98u\x0b\xb7\'\x12@IY\xae4\xe4f6@\x85\xad[\xb6\xb8{6@\x84n\xa9{+\xcb9@\x84@P\xa3\x06nQ@E\x03\xc6\xb2\xa9\xe4R@*m\x87\xcbn\xddQ@}`\xa2\xceJJL@\xf1A\x91r%\xfdJ@\xca{)Na\x1fL@7"\x92\x0e1\x14G@D/MaN\xd6C@\xe6g\xdb?*\xeaA@A\xc2CG\xf3\x83C@\x91\xfa\xfc\x94\x98\x8dQ@\x951P\x84R\x90R@,\x83\xf4C\xf1\n=@A\xee\xbf\xafZN>@R\xa9\xfc>\x87d!@\xd7\xbf#\xdaxw)@\xc9W\xcb.b\xf28@\x1a\x07\xab>>\xef2@\xddZ\xc1\x1f2\xb34@\x02\xeazb6\xac$@-8A\x97\xf4\xed/@H\x8bXR\x1c\xc9:@5\x82\xfezdF@@\xe3\xde\x10\x15\xa0}>@\xda\xa7o\\\x01\xccA@\x0f\x86\xd0L\xc1^A@\xb5:\xd1\xce\x8c\xac6@?\x7f\x80\x81\xc6 4@S\x05&\xcc\x82*\x13@\x1f\xf3\xd80\xbf\xbd\x0e@\xc3\xe0\xd6\x9a\xd7\xee5@;\xbd>\x0b\xb9>>@\xb3\xbf\x13_;\xee9@\xa7Rk\xdbI\tD@nQ\x96_\xefAC@6z\xe9\\1\x96J@9\n\x99\x8d\x98\xc9:@\xa6WY$r\xb1N@\xaf\xf0\x8d\xb7\xab*T@3\xecS[\xbf`S@r4C\xbb\xd5\x0b9@\x82\xd1\xca\xd7\xf3\xd9T@\xf3\xe9\xcb\x7f\xf7\xc4I@\xe9\'n!\xe8NI@\xb7,fG\x84\x08<@\x98\t\x98\x18\x02T\x13@\xe97\x17\xa9\xbbk\x10@\x19\xa6\x02\x92)\xee!@\xc5]\x02h\x156L@\x86\xb2\xf5\xfbIy.@\x84\x81\x84\x00\xc4\xdc%@\x7f\xa3\x1f[\x1c\xb43@s\xe7\xafB\xde\xd2#@\x84\x0f7\xb5\xa011@\xb8\x82\x02$\t^L@\x13{\xe3\xe2x\xf0I@\xb2ZG\x8a\xac\x9fG@\x07Uzt\xde;G@\xf46\xb6d\x039@@\x07C\xf7-O\x0fA@R\\Eb\xc0<\x10@\x143\x89\x96\xe4-#@\xbaYK\xd8:g(@\x9b\x8b\xe5\xaa\x8d\xc7G@\x91o8\xacf\xbc;@\xa9$8\x1a1\'F@[\xc5\xe4\x94\x86\xfbC@\x97D\xba/j\xbc\x0f@{Fv\xc1<YP@b\x90\x02\x04\xaf\x8eC@\xef1\x19}{\xe3F@jL\x16\xe2q\xca@@e\xb3z\xd5\x17\x98@@W\xffF)\x9eN@@7\x01+\xe9\x86\x03$\xc0\xceSR\xd1\xa2\xee\x18\xc0@\x10\xfb[\x00|\x12\xc0\x1at\x93\xc4\xa82<\xc0\x04\xcf\xbdv\xfe>=\xc0\xf2ni\x8ansA\xc0\xb0g|\x06iuD\xc0\xea\xed\xfd\xc6X\x1cC\xc0UE\xa0\xd8\xc4\x19F\xc0\xd0\x19(/F\x0fS\xc0\x1a\x04\xb3X\x801R\xc0\x85 6\x9f\xf9\xffQ\xc0\n\x8f\x8d\\\x91\x17A\xc0\xa4XM\xbf}[\x1b\xc0"\x945i\xa4\x9f\x14\xc0=[u\xa26-\x16\xc0\xc5\xcc$\xc4?\xf8\x14\xc0K&\x86)m\xda\x19\xc0TPPZ\x01oH\xc0\xd9\x0fJ\'CbJ\xc0\x0f\xdd&\xe9W\xb8J\xc0s\xb1\xad\xd9hH3\xc0\x84<\x95\xfc\xcfH+\xc0@W\x92\x04\x0e\xa6(\xc0]R\xd2\x0eW{-\xc0\xac\xec\x98\xf1\x9f\x8b5\xc0\xdf!\x88h&\xd7\x19\xc0\xf5gA\x05\xd1\xcf/\xc0z\xba\x134\n\xc04\xc0VT!\xa5P:1\xc0_c\xfe\xc8\x11!5\xc0\xe3\t\n\xc1\xb0`Q\xc0\xfd\x10\x1cO\xa3\x9dR\xc0\x95\x93S"\x9c\x9a\x11\xc0\x1e\xe9\x16\xfb\xc6o#\xc0d\x0e\xd0\x04\xae[)\xc0\xdc\xeb\x83\x9d\x8d\x03,\xc0$\xe14e\x94\xb2B\xc0\x92\xd2\r\xf7\x8f\x99D\xc0R.\xfcZ\xb9P(\xc0k\x8eC\xe2\xa1\xedH\xc0E\xfe\xc6\xb0\xb3?F\xc0i-^S(\xa7E\xc0\x848\xa0\x06\x9e~Q\xc0\xdf\xdcq_\x1b\xc5P\xc0\xc6)\xd3\x9f\x94\xb4A\xc0\xb2N+\xb5\xb8\xfb<\xc0\xa0\xba\xf9\xe0+\xe4=\xc0\xa5\x15+4e\'1\xc0\xc9\xe7F\t~f=\xc0\'!b\xdbGD=\xc0\xa5t-\xb3\xfc\x97A\xc0Bi1\xfb\xd3z%\xc0m\x06Icq\x85@\xc0\x81\xf4oZc\x85F\xc0\xdc\x95s\x8a\xce\x86C\xc0~\xa4(\x8c\'\xa9C\xc0\\`\xcd\xc6\x99SE\xc0a\xa0a\xdb\x1e\xd9@\xc0\xa3N\xeds\xa8@C\xc0\x0e%76%\r@\xc0\xf4l \x85\xd4\x10T\xc0\xaa\xea\xe1\xd3."U\xc0\xba\x1bq\xb0+\xccS\xc0\xb2i11fAD\xc0\xf65\xb0\xf9\xa9\x14G\xc0\xff\xbe\x130/y=\xc0\x1a`S\xa4A\xd3?\xc0\xe3\x7f\xd6k1\xb1A\xc0\x9a\xfd\x05\xeb\xea\xa7B\xc0\xf9%\x9e\xc9~\x98\x14\xc0\'\x9d\x1e\xa0;\xbf\x13\xc0~\x05kUf\\L\xc0\xc4\x84\xb5\xd7^bO\xc0\x95\x11\xe6\xc6\xa9xP\xc0\x18\xb7:\xff\xea\xa0F\xc0\xdf.`]\xf0\xb2I\xc0\xb7&x2\xff,G\xc0\x04^(\x05\xac<I\xc0\xf0\xa2JNppG\xc08uKD\xd1\x8eG\xc0Z\x14\xe4\xa1\xbd\xde\x08\xc0\xa3u\xee\xbb\x98\x0f8\xc0\x1dA:_\xd7\x9dI\xc0\x88c,\xde\xb5\xb9L\xc00Q\xdf\x8dm\xb4M\xc0A\xa7U}N5K\xc09\x9e\xa1\x84\xa2\x17J\xc0\x88\x17\xea\xe2\xf1]L\xc0\x12\xf9,\x06o\x91P\xc0^,\xf4\x1e\xc9\x9cL\xc0\x9a#\xa7\xf5\xeaP4\xc0V\x13\xe7\xc8*I/\xc0\xb6\x01\xb7m\xfe\xb3M\xc0\x03z\x1c\\\x16\x9cO\xc0`\xe2$\xdbvUL\xc0\x8b_\x84\xa6\x12&\x10\xc0\xdbv\xaa)\xc7^#\xc0\xe8\xfb\xe8\x15\xb6aE\xc0\xcc\x0e\xce\x16\x15\x97\x15\xc0\xaauH`\x03\x14Q\xc0\xb0\xd3:\x06]\x0eO\xc0|\x8dz\xac\xb4\xb53\xc0\x8b%\xb2\xe2n\x17(\xc0\xddB\x0fp\xff\xb58\xc0\x06\x950\xdcd\x82:\xc0\xbbM\xb0\xe8*\x17$\xc0\xb7\x11\xac\xf5\xe3W#\xc0\x9d_\x88\xcb\x14,\x10\xc0:c\xb9\xf0\x82\x9f.\xc0\xfd}\x92\x87\xf3\x8e8\xc0\xbd\x990m\r4J\xc0\x90\x19_@\x15\xcc.\xc0Pc\xd2\x98\x1aQ5\xc0)\xb1\xa5\xc2\\|:\xc0_\x8aY\x14\x97n:\xc0\xa6`\xa2BL+!\xc0\xee!\xa9\xce\xcc\x1e\r\xc0\xfb\xd0\xd9\xd5\xeb60\xc0\xb9\x8c67\xb9j&\xc0\x1c\x0f\xf3\xc1\xdd\xb2;\xc0\xf1\xc8\xee\xeb\xe7\x99H\xc0\x9bK\x86_O"D\xc0b\x9bO\xc5\xce\xdbR\xc0\xeb\x17\x05\xc2\xba\xcb4\xc0\x1cdb\x9f\x07\x0b1\xc0\x08\xc9pH\xb3\xb3,\xc0\xe3\x19\xa8K\xaa\x8d7\xc0\xa2ez\xb5_\n4\xc0t\xec\'\x9a\xd7\xd97\xc0p#\xd5\x95\xa7L7\xc0\x1e@\xea\x90\xf2\x7f:\xc0 j\xf7\x99\x89\xa42\xc0\x10F\x8bo+@@\xc0<\xe7\xbc\xc7\xac\xaa%\xc0\xa2\xd7"G\xe5wH\xc0\xc5\xf4\x94\xbbO\xcdA\xc0\xef\xbb\xc9\xa3/\x03:\xc0\x9aR\xc9u\xa6\x04P\xc0\x9c2\xe16\xf6\x8a@\xc0'
+p34
+tp35
+bsS'numberofedges'
+p36
+I0
+sS'edges'
+p37
+Fnan
+sS'long'
+p38
+g9
+(g10
+(I0
+tp39
+g12
+tp40
+Rp41
+(I1
+(I1286
+tp42
+g31
+I00
+S'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x85\xda\x00\x00\x00\x18@+\x03\r\x01\x00\x00(@\xa3A\xd1\x00\x00\x002@\xb9\xe4%\x01\x00\x008@qF\\\x01\x00\x00>@\xf3\t\xd8\x00\x00\x00B@\x7f\xca\x07\x01\x00\x00E@\xba\x1f\x10\x01\x00\x00H@:\xe3\xd9\x00\x00\x00K@J\xbb\xc0\x00\x00\x00N@\x1d\xbeQ\x00\x00\x80P@ \xfd=\x00\x00\x00R@\x07\x94*\x00\x00\x80S@\x17G\x14\x00\x00\x00U@^\xa8\r\x00\x00\x00X@f\xa0!\x00\x00\x80Y@iP4\x00\x00\x00[@.yI\x00\x00\x80\\@\x9c\x11W\x00\x00\x00^@\xfa\x04l\x00\x00\x80_@\xa0\xf2A\x00\x00\x80`@\xef\x07D\x00\x00@a@\xcfx6\x00\x00\x00b@\xd3.0\x00\x00\xc0b@\x0e\xdf(\x00\x00\x80c@\x90\xfe\x1e\x00\x00@d@\x04J\x15\x00\x00\x00e@\x8c#\n\x00\x00\xc0e@\xd2+\xf9\xff\xff\xbfe\xc0\xcd/\xef\xff\xff\xffd\xc0\xcc\xd7\xe5\xff\xff?d\xc0iC\xdb\xff\xff\x7fc\xc02w\xd4\xff\xff\xbfb\xc0\x83\xfd\xc9\xff\xff\xffa\xc0`\r\xbe\xff\xff?a\xc0\x11\xf8\xbb\xff\xff\x7f`\xc0d\x0e\x93\xff\xff\x7f_\xc0\\\xa2\x9f\xff\xff\xff]\xc0\xe4A\xae\xff\xff\x7f\\\xc0\xe0\x02\xc2\xff\xff\xffZ\xc0\xfak\xd5\xff\xff\x7fY\xc0\xe9\xb8\xeb\xff\xff\xffW\xc0\xa3W\xf2\xff\xff\xffT\xc0\x9b_\xde\xff\xff\x7fS\xc0\x97\xaf\xcb\xff\xff\xffQ\xc0\xd2\x86\xb6\xff\xff\x7fP\xc0\xc8\xdcQ\xff\xff\xffM\xc0\r\xf6\'\xff\xff\xffJ\xc0\x815\xf8\xfe\xff\xffG\xc0F\xe0\xef\xfe\xff\xffD\xc0\xc6\x1c&\xff\xff\xffA\xc0m\x89~\xfe\xff\xff=\xc0\x8e\x07\xb9\xfe\xff\xff7\xc0\x7f\x0b\x08\xff\xff\xff1\xc0\xcc_\xab\xfe\xff\xff\'\xc0\x8b\x8e\xbb\xfe\xff\xff\x17\xc0\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V\xc0\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x80V@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x80f@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\xd0*c\x18\xf6d@]\xa6M\xae\xeb\x03e@)\xe0\xf8\xb1:;d@\x80\xfd:\x05;\x12d@\xf0\x8f\xd8S\xf8\xfdd@\xc4\xf2X\xc5{\xc0e@!\x06\x9b\xab\xcb\x96e@\x95`S\xdf\xd8=c@\xf5\x00d\xac\xb3Bb@\x81!\x838a\xbdb@\x10%\x9dM\x08\xf4W@5\xaaE\x93J\xb9W@\xbe\x18cb\x93\xffX@\xd5\xe5\xac\xcb3\xc4e@\xd5<\\K\x8c\xe8e@\t~\xf5\xb60\xa8Y@\xd3\xf0\x0c\x15a+X@K\xf7\xf7h2\x08X@\x17\x0ez\xdbN\x9bc@\xdbhO\x08\xbb\x0bc@x\x02\x01\x94w5c@\x98\n\nPN.c@\xfb;\x81\xbf\xe92c@\xe9;:)\xe1\xf9c@d\xc7^&\x84\x92W@\xb8t\x16V\x9cAe@we\x98\xbauFe@b\'\x9c6+Pe@\xe5\x89\x1aZ\xbc\xf4e@\x82\xd8\x86J\x9b\xe0b@\xdf\x85\xe2\xdc\xb58c@\xe61+\xd1\xcd.d@\x87%\xebW\x95\xacc@I\xce\xe4$F\xd4`@\x12\x84\x0e\xf1\x86q`@\xd1\x0e~:\xe7\xf7_@\xd0\xb0\xc1\x10\x90x_@7\xba\xa8\xcf\xb4\xb0d@\x8a.\x14\xd1S|c@^U\x97{\xbe\xea_@v\xb8\x0f\xc5/va@\x11\xfb\xee?\rx`@\x01\xd3H\xef\xb0\x8aa@Q7\x18\xf17\x96`@\xddbH\xf8mZ\\@@d\xaa\x8aDTY@\xdbL\xc3\xfd\xac/[@\xfc\xder\xa3\xe0\x1e\\@8P\xd6w\xec\xc8[@#\xf2\x13\xb6\x88\xe3]@\x19\xfa\xf8\xf4\x1aN^@R5\x10\x15J\xbfa@\x7fNE\xb3a[b@o\xc2\xe0\x99`\xa4a@\xdfJ\x9e\xffUC_@\xedd\x0b\xda)\x81`@(\xdd\x1d\x85\x14J`@\x08\xa7\xf7\x8d\xb4\x08a@|*\x13\x89\xe4\xadb@\xcb\xe5a\xda\xea\xa0`@\x1cR\xb2\xde\x18Ba@\xa5T\xb6\xefx\x0fa@X6\xbb\xce\x01\xbe^@\x95\xa6\x98e@4`@\xf7\xe1,\x99\xf8\x01]@N\xbe%\xd9\x1a\x1f`@`b+%\xc7\xadd@\xcc\x0et_\x9fWe@%\xfe\xf32\xe5t_@\x99\x82((\xcdTa@\'\xaf&\xaa\x88\xd7`@?\xe7[\x14)\xe4a@En\xacB\x9e\x84Y@\xed\x8b\xdf\xc6\x16S\\@\x03\xf3\xc8\x12\xc6\x95Z@\x7f\xbd2\x8b\x83\x7fY@"\xf6\x972\tvb@K_o\xcb\x95\xbaa@\xca\x96\xdbj\xd7FY@Tv\x8b=\xca\xf1c@\xb1\xad\x08\xe4\x0f\x99b@r\xf5Si=\x1c_@\xb7\xaf\xb4\xd9\xaeN\\@\r\xd4\xb2\x13\x8e\x05_@\x82\xf2\xc8x\n\x8aZ@\xcb\xd4A\xe3\xfe\x81X@\xdc\xa4\x9c\x0f\xa7\nd@\xdcw\xc5\xb3\x9e\xa0X@\x95\x1e\xc0o=\x81X@s\xe3\xf4|\r\xc6Z@\xe4\xaf\xc9\xf2\x1a\\[@c\xac\x1c[\xe4\xacZ@\x12\xad\xbe\x80W6[@9\x8f\xf1\x0cN;c@\xe9"\xee\xba((a@\xab\xf5d`\xcd\x98b@\xc4}\xa5j\xa7\xff[@D\n\r\xee\x07\x00\\@}\x9e{\xfb?\x98]@\xfd:\x16HJ\xf5Y@M\xda\x06wX\xb9X@\xbfZo\x19\xa0\xefX@_\x84\xb1\x986\x13^@\xab#m`\xad\xd1d@\\7:jt\xdf\\@\xa9j\xa3\xda\x8c\xf8Y@\x8b}\xbcr\x82H[@\xbb2\xbe\x86\xb7\xfea@\x07\x12\xcc\xf2\x9f\xb2e@\xe6&\x98\x8fb\xd3\\@s\xd1\xf6D\xbd\x9c^@u\x8c\xfe\xd9\x97\xf1c@\xd8d;\xef\x90\x84d@S\x97\xfe\tS\xf0b@\x04B!m\xa6\xe8c@\x9a\xd0,\xa5\xce0e@\x7f\x0fy\x94q9a@\xca\xbb\\\x92\xfc\x1bZ@,XK5U\xc8`@t\xabr\xa7\x1c\x05`@"\x9d\xcdI+\xb6\\@\xc5\\\xc1\x91\xf8\xb1\\@*7\xa3+\xbdSe@\x18\xc9(\xc0\x00Wb@\x01\x9e\xe4\xe7\xfa\xd7d@\xa7\r?h\x08\xd8e@\x87K\xab\x0c\x06:]@\x87\x85\x83\xd6\xe7\x8fc@n\xe7\x9c\xd5T\xec]@\x80L/\x18\x128_@\xd6b\xd1\xef{\x8fd@t\x04\xf6\x05($d@\x12\xc4\x0c;Q\xc4a@\xf6\x05\x14C\x97\xb6\\@k\xb09\xc7ce^@k\xe1\x96\xd5;Lb@\xf7\x95\x9b\x9c,.a@\x0c\xde.\xe3\'\x8bb@q\xc3:jF\xf3e\xc0\xdcr\xab\x04\x1f\xa9e\xc0\x94\x8d\xc2Y\xf3\\e\xc0hd ~\x1d\xc3e\xc0\x1b\xc5L:"M`\xc0w\xb8\xf2d:\x07a\xc0\x9e\x16r\xd3\x89\xc7`\xc0\x1da\xe9\xd4\x13\xc7`\xc0v\xe3q\x9an\xe2W\xc0\xf9h\xdd\xfe3\xd3X\xc0\xd3\x86\xcb\xe5\xbf\\Y\xc0\x84\x98\xdfnb\xc7]\xc0\x0f\xeaKT\x02H_\xc0,\xb2H\x19\xaei^\xc04[WN\xad\xc1e\xc0\xe2\xfd\x16T\xf0\xd2e\xc0\xc3=\x9a\x1c\xd0\x16e\xc0\xbc\xb1V\x90\x0fmZ\xc0w](g>\xb9a\xc0{\xd8\xe1^\xd1\xfb`\xc0\xbaX\x85b}\x0fa\xc05b\x1a\xd5\xe4Aa\xc0-y!\xcdi\x83c\xc0/\xe4W\xcc\x03\x81c\xc0\x86\xd1\xde\xcd\xee\xb1b\xc0:H\xa5-\xcc\x17_\xc0,-\xf9\x0e,i]\xc0\xcd6&\x13\xe7Db\xc0&\x90L{A\xfeb\xc0\x1c\x01\x8f\xb2/\xa2b\xc0\x08\x92\x01\xd0mGb\xc0\xc7\x81&\xb5n\tc\xc0/(M\r\xcd\x82[\xc0V\xdd\x1b=\xec\xddY\xc0P;\xf2So\xe7X\xc0\x9fd\xa4\xed\xe7\xcca\xc0\xbb\xf2\x90\xf8\xc3qb\xc0 \x96\xab\x90\x83ya\xc0\xce\xb7\x06\x7f\xefFb\xc0q\xa3\rhEO`\xc0i\xbd\xa9\x87q\xb1[\xc0.O\xf2(\xe3%Z\xc0\xe3>\xd4\xb9v\xe6e\xc0\xd80\x12SG\x8de\xc0\xb7(\xff\x97\x8f\x13e\xc0\x0ea\xe2Dp\xb7d\xc0\xdbk\x9d\x08o\x7fX\xc0\xa5\x87Z\x08\x94\xf1W\xc0\xed\xf1\x1c\xbd\xf2\xa4_\xc0\x8b\x06\xcb\xb9\xce\x00_\xc0\xd7\xfe\xc6z\xb4\x86`\xc0D\xef\xff\xa3D\xddc\xc0\xf2\xba\n9?#d\xc0>\xc1\x9c\x14^\xee_\xc0\x81\x93\x0c\xd7\x01\xc1b\xc0P\xfb\xb5\xf4\x95Vc\xc0T`$\x1bV,^\xc0Y\xa6I\x82*^`\xc0\xe0\x05rLL\xb8`\xc0\x84\xf9l\xef\xff\x9dW\xc0\x87\xa9\x9fW\x96\x82W\xc0X\\\xb3 f\xae^\xc0\'\xba\xe4_\xff$\\\xc0\x8e\x01\x95\xb9\x99\xc0Y\xc0\xb8U;\xa9\xa0"]\xc0\xd3\x8e\x8e\x1c\x0f=Z\xc0^\t6\xb6\xe6Ia\xc0\x1bj\\\xdd{W`\xc0\xfa\x0c\xceR\xf4^`\xc0\xc0x\xbf\xc7U\x9f`\xc0\xe1\xd4V\x14\xd8)b\xc0cDg\xec\x87\r`\xc0\xd4\x8bu\xf2\x98\x1f_\xc0<dq\xf8F4_\xc0\xee\x14Yp\x03G[\xc0\xc3\x8buNPRY\xc0W\xde\x05)\xaa_Z\xc0l:&\xa5\x91"]\xc0\xa2\xb6\xd4_\xe7\xe4d\xc0\xb2\xf9\xf3\xf3s\xc5[\xc0\xfcD\xec\xe5\x18\x0eY\xc05e\x8f\xe5\xf2\xa5\\\xc0\x0fC\xa13\xfcFd\xc0\xa3\xd7O\x8d\x97\xfdd\xc0\xca\xd9\xbd\xe4\x9enb\xc0x\xc7\x06\x85}\xd1b\xc0\x19\x01\xc0h\xbd&b\xc0\xc9\xa1\x1f\x100yc\xc0\x13S\xb9\xf4Tcc\xc0\x87]\xe2\x86\xaf\xead\xc0\xd5\xf7\xb1!\x05\xa6X\xc0\x9aX\xdd\xe7\x90%X\xc0\xe0{2\xb0\x8amZ\xc0\xba\x83\xf8:\x88zd\xc0\xd7\x91\xdf\xd2\x9c?Y\xc0\x8a\xbf\xdf\xf7\xd9\xb8[\xc0\x83#\xf6\xc7\x7f\x9fe\xc0\x18\xf2\x05`\x9d\x1f[\xc0\r\xa5T\x8d\xfaXd\xc0\xde8\x8c\xd0\x03\xf2c\xc0Z\xcd\x9c\x84\x8aTa\xc0y\x9b3\xc6\xeaUd\xc0\xf9\'\x10\x8f\r\xf5Y\xc04\xbbU]\x84\xfdW\xc0&\xf6\xea\xf2\xfb\xbaW\xc0e\xdc\xd7\xa2\xa6\x14]\xc0\x15\x81\xbbw6\xca\\\xc0 \n\xdc\x89\xfd\xb8Z\xc0\x0e\x14\xbf\xc65yd\xc0\xe5\x89\x8b*\xfa\x9bc\xc0\xb0\xb0kh\x14\xcf[\xc0p\x1f\xa9\x8d\x10u[\xc0\x90\x18\x89\x81b\x83\\\xc0\xa9r\x94\xc5;\xa6b\xc0T\xb1\xb9\x93\x1d{a\xc0\xb5w\xb2\xba\xcfa`\xc0\xc2\xff\x0cz\xfb\x04b\xc0Ud[\x81\x11\x0fa\xc0\x0c\x9e=e\xed\x16d\xc0*\x0b+/\x1c\x1ec\xc0\x8c\r\x88\x96\xfa\x96c\xc0/\xc5\xdd\x9f\xcc\xcf_\xc0S\xea\xaa4\x02\xa5a\xc0#\x14a$\xcc\xca\\\xc0 \xb1_J}\x82]\xc0)\xadf\xcbG\xda]\xc0\x8e\x05\xd1\xa0\xb9\xc5]\xc0\xd6\xf0,\x07\xd5\xaa[\xc0%\x02\xacX^qd\xc0V\x1a\xe0;%\x9ed\xc0\xef\x05\xee\xdf\xbd\xb3c\xc0\xa5\xff\xce\xe1\xd7pd\xc0\xfb\x03*\xe5\xaf:d\xc0f\xd5\xc5\xbc\xc5\xb2a\xc0\xd0Z\xcdT\x8c\x8ea\xc0\xba\x8d\xef\xf8@\x88e\xc0\xb6T\xf9\xd4\x8a\xf8]\xc0\x87\xf67R2\x80e\xc0\xd3\x7f\x97\xe0l\xb3b\xc0"\x18\xc2n^\x06O@\xcfH%\xc1=vP@\x1b\xde\xf1\xf4YJS@\xbc\x93\xadO\xdb=C@\xae\x9a\xb0>\x9aBG@\xdd\xd8\x8e\x9ako&@H\xe2\xcb%(\xc8.@\x11\xba\x15\xbe\xbd\xa0#@c\xb7)\xc7\t.-@\'\xaf\t\x83eT.@Z:\x84Y1hS@8\xe6\xac\xe9\xc9\xe6?@\xadW9\x8b#\x89A@hfuJ8\x1f=@\xe9_\xb1"\x89\xeeT@+\xe4S\xd0<\xc90@\x1f&\x0f\x1e=K(@\xbfL\xbb\xeb\xb0\xbaP@\xc1M\x9aG\xee\xf1P@#\x12 t\xd0\xfaN@\x9a\x8b\x01\xe1\x17\x1cI@L\x8f\xb7\xa6\xc4+C@\xf382\xf8\xea\xc3C@w\x05\xaf\x96\x96\xa4=@]\x02\x0f\x10\'\x07;@\xdf[\x9d\xec\x91E7@\xd4U\xfb\x8e\xb5nR@\x9eG\xbe\xb1\xd7sS@$\xcefJ?\xecS@\x90\xf0\x1c-\xf6/S@\xa7e\xfe\xcb\xac\xfbH@\xca1w\xe8\xa9\xb4F@\xf7\xddw\x18\\\xd0F@\x99\xffl\xd4\xfaiI@<\xc3\xcd\x81\xb6\xb8\x10@-\xb1=\xc9\xb05\x16@\x8b\xa9\xd1\xf9\xea>4@\xa6\xf0\xe4\x11\xcat"@\x1f\xd4O1\x80v/@l4\xf6\xd29\x9aG@\x00\xb5m\x98\xd9\xf45@\x12\xfc+\xae\x03\x05R@;\x1f\x076\xd2\rK@\x04\xe1_\xe4\x1a\xaf=@1p\x13j\xeb\xd3C@\xd3;O\xed\xeb\xb1L@\xaa\ns\x97\xdc\xc2T@\xa2\xb9\xef\nFRT@\xd1\xff\x8aa\x8f\xd7*@\xc5\xab6\xaf\xbb\x0e\x1d@\xe3\x89Y\xd6X\x02\x1d@\x1c\x1cKQ#\xbb#@Y\xf4\x8a\x17zjH@\xf3\x90\x10\x17\xed\xf0J@\xdfXI\x0b\xd4\xd0K@P\xe3\x1d?\xcc\x10G@\x0f\x18\x8f\xba\xf6\x1cC@\xa0|8\xcb\xce\xd8F@vX:0\x8f @@\xc5\x8a"y\xc4=M@7\xb3\xc1\x99\xecAC@\xe7\xb8|i\x1fn?@\xc4\x80\xceX\x18\xe0Q@n\xca\xd4u])S@\xc9\xc8$\x10\xbb\x8aQ@\x94]\xe6\xba7\x85P@\xc2B\xbe\xea\x0f\xc4@@9Se;\xf1BC@\xc7\xd1\x9c\x012\x0c?@\xe3\xf85\xd9\xaa\x93A@\x9b\xbdq\xe4\xd3\x7fF@\xa41\x14R\xbfoG@P\x0b\xe6\xc0NyJ@V\xec\xbe\\GH\'@\xdbD^$J\x15?@\x0b=h\xbf\xd4\xd58@\x8f\x9c\x99\x9eS\x9fJ@\x94J\x80\x7f\x13\xd4N@\xc4\x13\xed\xa6\x16\x83N@\x83\xc4\xf0U\xec#Q@\x0c\xbeO\xe4c\x06R@\xe8\xf9\xa4\x86X\xccP@\xbe\xff7\x9f\xc6\xe0\x10@\xf1\x94Y\t\xf5\xd9\x14@\np\xf2a\xcd\x85C@\x02T_\x85\xbb.U@\x12H#\xbby\tU@Y\xc0]\xa3\x13iS@\x92(n\xf9M(S@\xcc\xe0\xab\x9c\x17]3@6\x05\x9e\x80\xf3\x0bF@\x14\x0e/\x03\xa5bU@\xebs\xa1tQ\xaaU@\x04NWK\x93YT@a\xf33yXFD@\xb0S\xb4qB<D@\xc7r\n\x12\xd5\x1cU@\x9bs!FJ\xacQ@\x963\x86k\x1d\x84Q@Z\xbc\x94E\xa0\xccO@\xaa\xeb\x0eM\xd1\x06P@\xe9\xe3=\xfd\x1c\xf3L@\xd7\xa9\x979T\xaaP@\xc4u\x98\x86\xb7GS@B6\xa5[e\x11U@^U\x16\xd1\xb3\x10\x18@\xbb\x91\xbek\xa4\xf1*@ITz"\x96\xad/@k"g\xa0X\x046@\xf3p\xae\rv)5@\x1bu\xf1\x11\x94\xe3P@\x14\x07\xff\xd0,m8@\xa6\x01K\x12\x85\x82;@U\xf4\x87\xbcM\xb0?@\xde5\xc4\x8a\xdb\x98N@\xa6\xd8\xb6\x12\xe0\x06O@\'\xe4\\\xd9+U;@\x87~\xe1c/\x159@\xc6,\xab\xc2\xc5U:@\xe1\xfcj\xcc\xdbxF@5\xe0\x02\xf3p\xe0P@%\x0fz+\xafAT@\xc6\xca\xcf\xd5\x85\x1cP@F\xc5\x04E\x908N@\xd5\x0bW\xd8\xa2\xa6L@\xde"\x14`\xd8\x9bI@ln\xef\x1c\xb4\xd50@n\x198U\x97\xc1 @\xdd\x86\x1c\xf4\x1cLK@\xc4\xf3\xc1\x83\xa5\xf2R@<\xedx\xc80\x999@2\x83\xc6\xdb\xb3/3@\x0c2l\xf3\x05\xde<@\xb1\x02\xa9\xe0\xc0\xd28@<tw\xaa\xbb\xa5H@\xd18\x86\xc2&\x87L@\xbea\xacu\x94\xb8T@\xd3:.Q\xf2\xb7R@g\xe3&\x8e\xc3\x82E@\xa8\t\xf2\xb7&vK@\xa04\xfe\x02\x14.2@\x9b\xe0\xfe(*@e@?\xbf\xe3\xbd\xd4\xbbe@\xed9\xbc\xbf\xb5\xefe@\xcf@\xb0\x08N}b@OGv\xee"\xbba@Rq\xcfj\xa3Pb@8\x1c\xca\x1b\x1b\xb0a@K\xf7\x10\xef0\x12a@)U,\x95n\xe2W@H\xbc\xd0\xc23\xd3X@\x81\xd4\xdb\x0f\xc0\\Y@R\x8a\x95\xc2\xf2\xc6]@\xfa\xfe\x9e\x7f\x92G_@\x8b!\x94\xad\xb4i^@sj\xf9\xd7\xbd\xb9e@\xc2\x03\x07\xb1;N`@|r-\x8f\x7f\ta@\x85\xba\x03\xf6\xed\xc7`@c\xa2\xa7\xaf\'mZ@\x0b\xc0\xee\xd5\x8c\xc7`@,yZf.\xdee@\x9be\xbe\xbe\xa4\x0ce@&ry\x90&#[@\xfd\xf8Vi\xf5\xddY@\x00i,\xafs\xe7X@R\t\xfb\xad\xdf\xa8d@+T\xf0\xc3|\xe8c@Dg\xa33\xcc\x17_@\xdf\xff\xdc\xebTg]@\xfaM9\\\xadUb@\xe2\x8e/!\xda\xffb@\xd1S:\x0e\xfe\x9eb@\xffJ\xf3xQRY@*A>\\\x9d?Y@\xdfH\x85\xdc\xab_Z@\x90F>\xfc\xea\xcca@\x1f\xc1\xd5\xda\xc5qb@!\xa7\xe7\xeb\x84ya@4t\x13\xf0\xa8Q`@3z@v\xa4Fb@\x85\x80h\xf5\xff\x9dW@\xf5Q\xdb_\x96\x82W@\xc2\x0c[\xc8W\xb1[@\xaa\xbe\xd6\xd6\xe3%Z@\'\x00\r\xcf\n\xf3d@\x10\xff5 o\x7fX@\xa5\x11\xd3l\x94\xf1W@\x81\x18 ]\xba\xf6`@\xb9\xf5]\xa5\xb9Ea@\x12\x19A\x08\xe2Jd@nd\xf3mp\xee_@\x989?\xeb\x93&e@=\xdc\xc3\xff\x84\xfdW@3\r\x88w\xfc\xbaW@\n8\xfe\x98\xbf\xa3_@\x19R\xe8\x16\xa4\x01_@NQ\xba<\x9d|`@\x8c\xbaq\xddY\xc2b@\x99s\x9b\xfc\xd7Wc@a\x8f$gm+^@\x1f\xfa\xba\xdb,^`@\x17K&\xfbP\xb8`@V\x85\xee\xe3&\xdd[@\xef\xb9j\xd7\x19\x0eY@x\xff\xb5I,\xad^@7\xb7\xcd?\xf2\r\\@\xc5\x1b\xa1\x1f\x0c\xb7Y@\xdcM\x05\xa9\xa4\x07]@=\xa7\x9f.\x0f=Z@\xee\xc1\xbe\x92\xae\xe2e@\x82q\x8f(\x06G[@\xc7\x11\xf4\x17\x96"]@\xb5\x1a\x0bN\x16\xcf[@\x14\xf0\xc0\xb7\x15Ja@Y\x9a\x10\x14&W`@N\x85\x08\xd0\xc5O`@\xd0i1\xb4\x91y`@@\xe1i\t\x14u[@~\xc9[\xba\xf9)b@\xba=?\xbb\x13\x0b`@\xcf\x08X\xd0\xf7\xa5\\@\xa1\x8a\xc9b\xa0\x1f_@\x15\xae&t\x8f4_@\x0f=\x8f\x12\xa3\x8ac@\x1d\x02\xc0Z\xce\x95e@\xae\x82\xe5\xf2\x87-b@\xb5\x9bX\xe3\xdc]d@\xcdj\x02)\x05\xa6X@\xb8\x9c\xeb\xef\x90%X@<\xb3!\x9b\x8bmZ@\xb9HQ\xe9\x8f\xced@\xa3w\x98;\x9cMc@\x9e\xafg\xb6\x8fYd@\xd0\xe3\x91\x8b\xfaXd@v\xadP\xd0\x03\xf2c@"\xed\x11\x82\x8aTa@\xc01\xc8>Z\x89d@\x13\xd2\xaf\xc5\x90 [@\xd9l\xff\xda\x0e\xf5Y@\xf6Rr\xfc-\x1ed@\xe7\x9f\x17\x83n7e@`1\xc2\xde\xeb\xb8[@sSmB\xe8\xc1c@\x00\xd0\x1cB\xb9\x83a@\xac\x92\xaax\xf9a`@\x93w\x15\xd0-\x05b@t\xa5:\x83\xfc\x14]@\xfb\xb7\xcb\xcf\x96\x0fa@\xac\xe1_b\xce\xcf_@f\x81\x18\xf0\x0e\xb9Z@?\xa0\xae\xad\x0e$d@=+\xe1\x17M\xa3c@\xa6\xa7\xbc\xbc6#d@\x0f\xbc\xc1\x08\xe3\xd0d@\x83\xdc(\xbd\x17me@\xe0\x85\x1f\x96Y\x0bf@\xcbr\xd8rk\x83\\@y\x9b\xce\xc7\xec\xfdb@8\xec\x89\x83\x88`d@X7D\x0f<\xa6b@\xcel\x94\x97\x02\x8fc@\xf5\xbfA5o\x1ec@\x17\xe9\xb8\x1f\xc7\tb@\x8dc;I.\x13c@]\x876$\xd5\xaa[@h\xd6\xd6\x9f\xcf\xca\\@Q\x17\xbb\x1a\xba\xc5]@\xd2\x89\x82\r\x9c\x82]@\x1bp\x02\xe4]\xda]@\xd9S\xd8\r\xbd\x14d@\xc7G\xe6\xa7\x00\xbdc@z\xf4-\xf6\xef\xb7a@\x0b\x9a\x8c\xbd\xd4\xc9\\@\xd0t\xba\xdcb\x93a@\xf2\x80?_A=e@=\x1f\x9a\xf0\x84le@h2B\xfe\x8d\xf8]@\xc1T\xcf\x1b\xaa\x9bc@I\x81(\xe0\r]d@\xe5\xe3NR/\xacb@\xca:s\xa1\xc3\x7fe@X\x80\x8ff\xe6\xa8e@tV\x83O\xf1.e@\xc5%\xc5\xe1\xfa_T@(\xd9y\x0e^;T@3F\xfc\x08_HR@\x166\x8e_\xf3\xf8P@\xfe\xbf\x0b\x9ed\xa3S@\x1a\xcf\xa2\xee\xba\x93R@\xb9Y\x06/\t\xbcT@*F\xf2\x8cY\xebP@\xfe\xaapa\x85\x1bP@S\xc9\x03\xab\x85\x1dN@7\x17$,\xf8\xb4Q@\x7f8\xba\x07\xc5xS@\xe4\xa6J\xb2G\xc2<@2q1\xbe\x0c}G@\xcb\x0eA&\xc8BN@\t\x86Wl\x0f\x16Q@\x98\x0f\x01\x88\xfd\xafN@\xa7>\xa6\x98\x1b\x1c5@0b)\xe7]AG@o\x8fn-u\x03F@\xbf\xf0\x7f\xa7w\xc7H@]\x12\x9e]\t\xd1C@G\xd5=\xab\xf4\x9e3@\xc7S_\xde0\xbf,@\xa1\x12\x89oZ\x0fU@,t\xad3~UU@SdN?7\xf9S@vY\n\x8b\x0c\x97&@\xad\xc1\xcd\x103~\x13@\x82P%\x80\xa1\x18!@,\x08\xba\xa7>\x06N@j\x8f\xbfk\xbc\xe5P@"V\x19K\x0f\x89P@\xb9u\xb8\x068\xe8S@\xbb\x85t|hM\x17@%\xf01\x14\x12\xe0H@,`\xd0\x7f\xa5;R@\xdaG\x0b^\xc7\xd2:@n\xf7H\xc8\xedn&@\x1d\x8aN\xc3\x83?@@\xa3t\xc2\x12\'\xa8<@\xa2\xebZ\x12\xf1\xcb9@c\x1c*"\xfa/6@-\xef2\x9e\xedoP@\xbd\xcb\xb5\xe0\x1b7N@{6\xed\xbd\x15\xd2J@r:t\xcc\xebsL@[\x10g$\xfc\x88M@\xce]\xdc\x0cv\xfa#@\xbc/?\x01\xb4\x8aP@\xe3\x8b\x9aj\xecJP@\xf6\xa6\x8c4\x86\xb5=@\x88\x8aNE\xd7\xa1D@p\xff\xa2Zd\xbc?@\x16!_),\x94C@\xfd\xde\xfe\xab4\xaeQ@,;1\x7f\x10BK@\x0e\xfb\xd0\xc8\xe4dI@\x9e\x98y\xd7\xa9\xabL@\x98\xe5=\x16\x9d\x0eG@\x90PH\xea\x1a\x15S@\x0fc\xc2p\xedQJ@\xec&A]d\x109@Tk\x91\xb9\xcb\xc6?@\xe3\xa02L\x8e\x8f9@\xd3EQm \xe30@\xc1\xa7\xbe\'>\xad2@<B\x96#\t$(@\xa4\x08\xf3\xdc\xb9QI@xn\xfc\rN!0@(\xce\x92m/\xa6I@\xf1\xacy<s\xceG@\x1f\xf2\xf3t\x93\x08T@\x0c\x0f\x0ez|\x0cS@nj2\xaa\xef\xddT@6yn\xab\xdc\x0cF@\x10\xb7\xd1\xbb\x0e\xfbQ@\xe4\xf3[\\\x9d\xc3O@\x0c\x17\x03\x99FmD@\x03U\xc3\xb4A#C@\xfc2W\xb2l\x8f@@\x0cR\x99]w\x0bP@\xf8\xf7\xe1\xf3r\xae+@\xa0\x9d\xc4f~+P@K2\xda.h\xf8A@\xbf\x80n%\xd8\x1cM@}\xa5) \xb2\xa1D@|\xbb\x9a\xfa"=C@N\xce\x12&\xb09A@\x0c8%\x1fa\xce@@\xc36\x10\x876\x11H@*\x0er\xd09HH@\xcaO\xc2\xcd\x9d\x06L@/x\xa3h\xee\x08K@\x10]\xcc\xcf\xeb\xb7?@\xb42\x91\xbb\xf7k<@\xa4\xcc\r\xc2\xe7kC@\x87B\xccP*\xf93@\xce\xe0>?0zE@\x89\xf4e3\xa3\xbcQ@jWP\x8e\xd1XU@\x18\xa4L\xb5\xce\x15T@? \xcd\xaaR\x8c7@;\xb4KQ\xf4\x9bE@$\xf7\xd4\xf5\xe3\xcdT@\xfeq\xd2\xb7_\x8e8@Y<\x8a\x11\x8e!A@\x87/\x8e\xa1\xcbtR@\xe3\x99\xa1t\x7f\xedN@\xfczF\xb0\x7f\xe7;@\x07M\x8f~!\x90J@\r\xeb\xe9J\x1e}D@\xa2\xb0\x87=\xf5Z\r@\x12#]_qL2@\x95\xeb)t\xf9\xff&@\x0b\x8b(>)\xda"@\xbc\xc0\xfbe.r5@\xfe\x93:\xefReT@\xc3$\x92M\x89\x97U@\xcb\x80 7\xca\xde2@:\x82U|\x88]/@\x95\xea\xb0\xc8\x10\xb63@\xdb\xfe%4\x85K5@\xa1\x88_\xfcz\xe04@\x92\xbe9h\xd9,C@\x0e\xeb2\x92\xb8#\x1c@\x14\x04\x12\x9f\xde\x84U@\x81c\x94L\xbd\xb8R@\xdc\x1aW!\xab\xdeR@i\xd1q\x180\xd7\x1a@\xff\x18\xbe3\xed J@\xae\xb1K\xed\xe5\x8fK@\xb0\x8fFm6\xd8\x18@N7\x10\t\xdc\xb6(@l\xf2W\x98\x83Q\x15@5\t\xb8\xce\x98YS@P\xf3.\xa4+\x988@\xc2=\nHk\xddF@\xc3\xb26\tR\xf1d\xc0Gl\xd2K3\xdfd\xc0\xcci<`\x16"d\xc0\xf5\xedp\xc1\xe4\xddc\xc0\xcf\rr2\xdf\x9f\\\xc0\xb7YxS\xcf\xfa^\xc0\xcd\x03\xdf\x7f\xeb\xc2^\xc0\xdd\xa1"\x17\xdcM`\xc0k\x0bT\x85b"d\xc0?9\xfct\x12wd\xc0\xb4\xe3\nL\xe1Qc\xc0\\\xa0\x0e\xdc\x93-\\\xc0\xa6\xaaN\xf4\xe8\x05b\xc0s\x9f?\xf1gB`\xc0\xda\xcaI\xb0t2c\xc0\xb4\x8cC\x93[/b\xc0c!\xa3\xde\xed\xaeb\xc0\xf0\xdc\x1b\xd6;\xe8e\xc0\xe9j\x10\xe9\xda\x82e\xc02r\xa9\xe8\xd3\xc0e\xc0\x07\x0c\xfb\xb7\x01\xb8Y\xc0v\xdd\xe7Y\x93\xf1Z\xc0\xde)\x0ci\xdceb\xc0\xb0\xc5\xc2\x13j\xb6c\xc0\xd1/\x1d\xa79\x9eb\xc0\xae\x14\xf3\xdc\x82\xabc\xc0\x88\x0b\xacD\xd1\x19c\xc0\xb7S=\xdc\xa7sc\xc0{\x96\x15\rF\xd4`\xc0U\xa0\x04\xc9\x86q`\xc0IL\x8eq\xe2\xf7_\xc0\x9dT\xa0\xfa\xea\xa8_\xc0\xebQ\xf0\xf2\xbci\\\xc0\x8f\xfa\xa32)\xdc]\xc0P\xf4\xba\xc7\x82,\\\xc0<\xfac\xfa\x1d_e\xc0\xb1\xc4\x90v\xe0\xccd\xc0\x83\xd58te\xafd\xc0\x15m\xd4k&\x88d\xc0\xd9\xa0\xa3\x1cq d\xc0\x86s\x9d\xbc\x1f\x19d\xc0}t]R\x15\xd2\\\xc0\xa8\x05\xc7_5\x1a^\xc0{\xde\x95K\x006\\\xc0\xd0\x1a{@\xfdOe\xc0pau\xef\xba\xf4e\xc0#\x9a~A\x07\'a\xc0\xba\xde%\xe5j\x84`\xc0\\gx\x9eb<\\\xc0\xe3\x02\x9a\xa9\xfa\xa6Y\xc0\x9d\x14\x93\xc3\xd6\xb7]\xc0\x83&a\xd2\x89\x0ea\xc0\xc9\xcb\x0f\xe6\xd9\xb5d\xc0\xe4 m\xcc\x8dVe\xc0)=\x8b\xc5\x90\xacc\xc0\x15\x08g\xaa\xc2P_\xc0D\xf6\xe1\x00\xb9>`\xc0\x9bz=\xbbF\x06a\xc0\xa6\xd7\x18\x1d\xff\xbd^\xc0]\xa1\xf9U@4`\xc0 gM\xb6Ae^\xc0$,Q\xe4\xd7\xed\\\xc0\x88\xa8\\\xe8\xa4\xd9a\xc0\xbb\x7f2\x13)[b\xc0\x1fu\xd2\xc8\t\xa3a\xc0\xc7\x1d\xa6\x16\xcdTa\xc0\x8a\x03\x81\x80a\xd7`\xc0\x1a\xe8\xa8`v\xe3a\xc0p\x8a\xab\x83G\x83\\\xc0\x15\xeb\xb8\xa4\xd5\xea_\xc0\t\xfe\xb2\xb3i\x8aa\xc0\x19\x12\x13\xeb\xe9\xc5a\xc0\xd7\xaf\xc1\x99D\x92_\xc0\xdc\x9c\xab\x8b\xbeha\xc0\x03\xb8\x853\x02x`\xc0\xf9\\\x82\xc5\x9d\x94b\xc09\x81t\xc0\x8b\n[\xc0\xbc\xe5\x05\xbd\x17\x9f\\\xc0\\N!\x86av]\xc0\x9c,\x0f\x92\x17\xd2`\xc0\xdc`\x10\x9aT\x1c_\xc0\xe9t%G2\xcbY\xc0 \xf1\x9e\xab\xc1*[\xc0\xaa\xdc\xc9\x80\x84XY\xc0\x83\x8cA\xb2>\xddb\xc0\xc9\x9b\xad\xbf\xdd\x01c\xc0\xb1\xf0\xfc\x84\x18tZ\xc0\xb7\x16\xa6\x11=\x93Y\xc0h\x99\xd5\xc0\xbadX\xc0B\xc6$\xed\x15kZ\xc0{#\x8a\xbc\x9e\xa0X\xc0xm\xa0\xaa=\x81X\xc0\xfc\xa6\x0b3n\xcaZ\xc0\xa8\xc5+8\x04{[\xc0\x96rg\x96\xf3\xa4Z\xc0\xf6lW\xa6\x1djW\xc0\xa7>D5\xa5_X\xc0O\xba0\xbc\xe9\x96Z\xc0\x10/\xa6\xfa\x8f2Y\xc0\x94\xf4N^\xe2bX\xc0\x9aW\xc2\xfb3X[\xc0\xeb\xdb\x18zk\x9bX\xc0:\x8c\xb0=\xd6\xcad\xc0\x1e]?V\xe1\x07b\xc0n\'\xc0\xf7\x0f\xb2e\xc0\x85 t\x96+\x0eX\xc0\x93\xd7\xf1P\x89\xbfW\xc0\xa6y[\xb4V\x8fa\xc0&s\xd5`\x95\x86b\xc0\xb11\x1a\xe7\xae\x9cX\xc0\xa1\xd9.\xed\xfc\xd3\\\xc0\x9c\x99\x8f\xa6{\x84d\xc0\x01k\x9e\xb9\x0e\xceb\xc0\x17y\x88\xee^3c\xc0W4"\x17\x01\x84b\xc0\\-\tM]\x99]\xc0\xc8\x8b\xc2\x12\xfaRa\xc0\xcaH\xa2\xf4\xee\x1cX\xc0\xffK\xbc_9ea\xc0 l<\xa2I\xb6\\\xc0.\x1ct\x1a\x01,[\xc0\x8b\xaeq%\xdfVb\xc0a\x91\xc1\xcfmSe\xc0\xbd~\xfeOE\xf0b\xc0\xc2\x11\xd2t\xdb\xc0`\xc0\xbb$\x82\xe8\xd2\xd9_\xc0X\x13%6\xc2\xd8d\xc0\xf4`\xc9\xae\x0f\xd6e\xc0\xa1\xf6\xa1q\n$d\xc0\t\xf7\\\x19\xb5\x89c\xc0\x87\xd9\x1e\xf4k\xbb^\xc0`*\xd4#5td\xc0 \x08d\xfd\x7f\xa7e\xc0\x1aS\xf2L\xff\xcfd\xc0\x83\xd7\\\x95\xc8\xe5a\xc0\xc3#\xfayB\xc9Y\xc0\xea{\xa8x{Va\xc0[J\'K,\xbf#\xc0\x97\xefB\xe8g\x82"\xc0_\xfc\xeb\xd2\xfc\x14D\xc0\x19x\xf9"\xee\x9c;\xc0\x81\xb4Ur\'\xc5<\xc0J\xbaN\xc3\x01qD\xc0\x91\x94Vl\x85\xc9C\xc0\xa17~\xd6\xb3\xb3C\xc0\xfbeb\xb0\xb8\'F\xc0\xe0\x1b\xd1:&\xaa%\xc0[\xba\\WM\x0c1\xc0\x1d0/\xca\xeb=H\xc0fJ\xe6\\\x86AE\xc0\xb7\xe4\x14\xdf\x0b\xc8E\xc0\xb7;\xa3.\xea//\xc0v`p\x9b\xd1\xd3A\xc0\xa55Lq\xbb\x06A\xc0\xa32&O69C\xc0\xb5\xea\x87~\xab\x10D\xc0\x93\xe0F\x89\xac\xc77\xc0x\x8d\xcfw\x8fj1\xc0\xc7\xb1*\xbc\xd7\x8f9\xc0\x8a\xbf]u\x13)@\xc0\xdd\xa3\xdbs\xf8[1\xc0\xdd\xc4\x9b\x96K\x04C\xc0\x85\xf2\xf7\xe6=&F\xc0\xa6\xf7)(\nhI\xc0\xfa\xae)\xad\x11\x1eJ\xc0\xb7\x1d\xf3\x06GGP\xc0(\xf7\xc5\x98\xe0\xe7N\xc0~\x13o]8fS\xc0\xc6\xd5J\x11\xb2\xa75\xc0\xd3\x1eL\x9f\x88\x92.\xc0,\t\x01\xd8\t\x12I\xc0`3\x1dq\xaa\xc2I\xc0\xedP\xd0P\xd9\x15I\xc0\x9f\xbcq\x9a\xc8\xdbS\xc0\xd3\x10\xd6\x99\xfczS\xc0\x80\x0e\x9f\xd6a\x15U\xc0\xc7\xbf\xafq\xc4\xe0T\xc0\xf2\xac\xd1\xf1(\x03I\xc0\xd4\xfaS^:pL\xc0gpb\xa4@\xa6J\xc0=\xec\xeb\x8f\xb5\xc0J\xc0b\x8b\x16\xd3\x18\xd0\x1a\xc0\xab\t\x18\xfd\xc7C\x19\xc0\xd65\x01k\xda\x89K\xc0\xdc\xb4\xf0\x0b\x04\xf2-\xc0\x7f\x90X\xd0\xfb\x85S\xc0r\x00O\xad\xfd\x05Q\xc0\x08\xc7c\x01\x15sN\xc0\xcf>D\x04~wN\xc0\xe0\x1a\x19\x11\xb5\xcfK\xc0\x81\xa8\xad\xe1r\xc1L\xc0\x0f\xf6\xd6a\x1f\x90P\xc0\\\xfe\x9aZ\xbe\xbeR\xc0\x9c[\x07\\\x15\x8aS\xc0J\x89*=\xb07R\xc0x\xe2\x1c\xbd\xc3#T\xc0\x03<\x9f\xee\xba^@\xc0o\xe7\xb2\xbb\x97@C\xc0jf\xe8\xbb>\xa3$\xc0\x1a#\xef-~\xa1R\xc0\x98\x91qm\xd8[Q\xc0\x9d\xc2Umn\xedJ\xc0N\x82\x98N\x8dyS\xc00v\xe8\xf7\x07\xa5 \xc0\xddg\x90\xc6\xb4\xc42\xc0\x81\xf8g9\xde\xcaT\xc0\x89\x86\x08J\xc9\x93T\xc0\x18\xaa\x07\x9f<\xcc8\xc0\xca\xb4\xddm482\xc0\x03\xa4\x81\xa7dA@\xc04FQ+\x96@1\xc0\xb5\xd1\xac\xfd,<6\xc0\xff\x15I\xfdK\xa5>\xc0s\x9b\xb9\xf6\xca>"\xc0\xf9d\xe66\x02\xd0+\xc0E`\xd6a\x9f\xde:\xc0^\xab\xa6\\je:\xc0mrH\xce\xa3\x94K\xc0\xf3D33\xc2k3\xc0\n\x0b\x02\xfa{P4\xc0\x0c`Q\x06\x80\xdcL\xc0\xe8\xd4c[\r\xacN\xc0"\x12\xf5\x1b\x1a\x12Q\xc0\xd5p\xd5\x0c\x81\xa5P\xc0\xcc\x8e\x14]\xab\xfeQ\xc0\x14.\x81w\xf5\xd24\xc0\xc7\xe9\xa7J\xa3%*\xc0p\xd7\x9f%\x0f\xec\x12\xc0\x97G\x95\x1f+\xbf"\xc0Qx\xeb\xb8[\\N\xc0\xb9\xcc\xdbg\xea\xa2R\xc0\xe2\xe4\xd3\x81\xf8\x16P\xc0I2z\x11\xf4rQ\xc0! \x11\x96\x0b\xd8R\xc0/\x0b\xb4\xe4\xd1.P\xc0\xed\xdd\xd91\x84DU\xc0\xc9\xac\xa4\x7f:u(\xc0\xea\xa4\xca\xd4\xa6\x0eP\xc0~\xe2Y\xb0\x18\xfcB\xc0\xa92\x17r\xab\xe8Q\xc0bv|d\x94\xc0@\xc0\xe5\x02\x05L\xf5\xefT\xc0\x96\x7f9\xe1\xf8\xd6R\xc0\xe0{\x15;M\xe1\x15\xc0\xc9\xfd\xceI\xfe\x8f;\xc0h\xc0\xf4\xce\x85\x17@\xc0\xcb\xf5\xb4\xbfi\x8d?\xc0\xd8\x91\x10\xe2\x8a"H\xc0F?\x0e\xe7\xa5\xa8?\xc0\xdc\xe4\xcc\xcb\xce\xd69\xc0w\xf3]|m|P\xc0\x8c\x84\xd7\x1a*`\x10\xc0\xba\xcd\x9c\x97\xca\x15R\xc0\xb1@-g\x11EL\xc0r\x135q\xa7QJ\xc00 `\x05\x1b\xedP\xc0\xbdS\xdd\xed\xcd2M\xc0l\xf5J\xdb#\x0bU\xc0\x128\xdc\xa2\xc4\x98S\xc0\xe5\xf34\x82\xa2hU\xc0\x0e\x17\xcc\x14\xc8\xe8T\xc0b]\x18\x02\xb3\xb5A\xc0h\xd1k|F\x11@\xc0\x97\xd3\xe6\x86.\x17B\xc0\xd7=1\x8a\xb2\xebR\xc0\x8d\xb4\xe9\x0f_\xf9N\xc0\xb0\x82B\xde\xb5JO\xc0|#F\xad\xee\\F\xc0\x98}\x06\x10\xa0\x81F\xc0\x8e\xcd\xe1\x11\x93\x1bH\xc0\xba*\xea\xbe\xearC\xc0\rC\xea\xca\xf8"\x14\xc0*\x82\xcb\xb8\xcfoG\xc0\xcde\xb7\xb6\x9f\xa0Q\xc0\x8c\x13g\xdag\xfaR\xc0\xda\xc9\xc1\xef*cQ\xc0t,\xff[h\xcaT\xc0\x110\x90\xaf=\xdfR\xc0\xb2\xe7\xc8x\xdf\xc5S\xc0\xa2\xd9\xb2\x999\\.\xc0\xc0j@6\x7f\xdf\x1d\xc0I\xb4=\x98\t\x13!\xc0\x90\xa6s\xb3\xba\xecE\xc0\x83\x07\xbcR\xe8\xa8M\xc0$\xff\x04\xb3\xb0\x9dC\xc0\xb7)\x9d\x9b^\xfdQ\xc0\xbe?Si\x9b\x9cO\xc0\xff\xddc=k\x9fE\xc0g\x16V\xff\xae\xa2H\xc0\x12\xcekq{P*\xc0A)\xb9\xfe\x11e2\xc0\xb7\xa0\x94lO\xf4N\xc0\x90l\xe8\x89\x7f\x1dL\xc0f\x8a\xd4\xe3x\xc9P\xc0j\x99X\xa2\xb7:5\xc0\xe4<)\xe7F(:\xc0N\xd3\xa5\xf4\xd6\xda3\xc0[P\x97\xbc9ZU\xc0\x91e1`\xb2\x13U\xc05lIeY\x829\xc0\xe56B\xa3BHD\xc0\x03<\x82<o\x88E\xc0\xf0DU\x94J\xd0G\xc0x\x04Cfw\x8bB\xc0\x14N\x04\xa4\xba\x1dS\xc0/\xc2C+RFS\xc0\xdd\x8a\xcc\xbc\xf1?L\xc0\xa6\x9a\x1d\xee\xef\xf0K\xc0\xcc\x13\x91\xe5pdN\xc0eUW\x8e<\x84P\xc0a\x9e\x15\xc7v8U\xc0YC\xa5\xf7\x185T\xc0} +9V\xfcR\xc0\xe9\xcf\xbe,HJ9\xc0q\\\xbb8;\xde>\xc0{\xea*\xef\x03\x1e6\xc0K\x02-\x1b\xedu6\xc0G\x94\x86\xa3h\xed%\xc0\x19\x85\x995\x17[P\xc0\x00\xb9p\t\xb7\x19Q\xc0z\x10\x80v\x11uN\xc0pO5\xfc\xdd\xfbS\xc0Wv\x84[\xfcSJ\xc0\xb1\x83\xc4\xf0\xe1\xb1F\xc0\xb5as\x95c[H\xc0\xc4:j\xb3\x9a;T\xc0p\x171\x99~\tD\xc0R\xf7\x1fp\xd4\xe9C\xc0\xde\xf7\x9e\xfb\xb8DE\xc0F\xe4\xaf\xce\x83\xefA\xc0\x9b\xce\xc3\xc8\x9b\xd1G\xc0|\xf6@\xf60\xe4@\xc0O\xf5\x83\xd1\xf5\xdb<\xc0\n\xfa%v\xaf\x0e;\xc0\x8e[\xf4\xbc\x96\x7f>\xc0_i\x08q\xff9H\xc0\x10\xa1D\xbbk\x12P\xc0\xd25"\xd7\xad\xd9J\xc0\x138P\rI$K\xc0,\xfd-\xac<F.\xc0\x97\x99\xc9\x13\x91\xec\x1e\xc0\x92\x13\\\xb3\xa0\xfd,\xc0\xb8=z\xae\x16{5\xc0\x95C\xa1\xff?q@\xc0\x07\x1f.\x9a\xa1yT\xc0zVg\xa4\x14|T\xc0\xb7Q\xbe\xc9\xef\x16S\xc0R\xd4]b\xe6OB\xc0\x0b(\'\x94\x9f\x11S\xc0\xf3\x8c%\xd6Z%S\xc0\x8b\x8b\x1cf\x8e\xcbT\xc0\x8c\xb7\x13\x17\x9cb\x1f\xc0q\xe8\xaa\x8f\xb8\xf2.\xc0\xa5\xa9\x0e\xb0<UQ\xc0\x89\x14\xbd\x13\x1a\x005\xc0V;\x0fe\xa7tS\xc0\x1e\xdb\xa1\xcb\xa0\rU\xc0H\xe2\xe472\xee5\xc0\t\x8d\xcd\xfb\xbc[B\xc0\xdbQ\x10\xc2\xd0\x0b?\xc0\xd0\xb0\x10\xbbR\x031\xc0u\xff:51\xbf&\xc0\xa0\xbfM%\x9a`O\xc0\xca-O\x00\xbd*R\xc0\x84\x83\xb7O\x86\x86R\xc0\xa46\x971\xf1 R\xc0s\xc0N]\rpN\xc0Y\x1a_\x10\x1f\x02H\xc0"\xd6_\xd2 YG\xc0\xeda\xc7\xc0\x90\xd3 \xc0\xf8\x03\x89\xb0M\xed\x1e\xc0T\x8a\xda\x1a\x0c\xeaN\xc0\xd6\xad\xb4\x91\x96\xe6\x0e\xc0]:\x9b\xc5\x0e-I\xc0G8\xfd\x04\xdb](\xc0{\xa3Q\x0b\xf4\x1eQ\xc0\xf4z*Sf"I\xc0\x16H3\xb9\x1f\xd9Q\xc0\xf4\xa8Y@\x93k$\xc0L\xd5\x0f\x86\xd2\xe9>\xc0\xe0\x17\x8e#\xfb\xb8B\xc0\x16\x0fH\x96\x1a\x17C\xc0\x01k\x8b\x82^\n\x14\xc0\x10\xa6@\x98x&P\xc0\xee\x1f$&\xe8\xb3C\xc0\x96p:\xb3\x9c\xc6@\xc0PK\xa6\xf6\xf01=\xc0\xfa\x0b\xb2\x1c\xa9\x8d6\xc0u\x80\xcc<r\xb0<\xc0\xe4\x1dy\x9cZmU\xc0/1\xfe\x17\xfb\x96U\xc0\x9a_4\xa0\x14tK\xc0\xd3(\xe4A/<F\xc0\xb7j\xa0\xb7\x1a\x00A\xc0\x9a\xbc\x86i\xb9\xcbG\xc0\xc9\xad\n\xc2\xd4\nR\xc0\x02\xa6\xf0\x00!-6\xc0\xb0\xa657\xe5^\x1e\xc0\xde\xd3\xb1\x8f4"-\xc0\xd5r\x02\x99\x16\xdb#\xc0\xc2+\xc6\xbfb\x89.\xc0r\xd4{Vy\xe7I\xc0T\xcfc\x1eu-H\xc0\x93\xd2\x93V\xcb^L\xc0A\x874td\xf7\x14\xc0\xcb\x0fy=v\xb3N\xc0\xaap\xdb"\xc6I4\xc0\xc3\xc6\x14FD\x03,\xc0E\xf8\xfc\xdeg\x0cA\xc0\xf4p\xa5DW\x9aL\xc0\xae\x11\xce#\xec\xb2D\xc0Y\xca\x89\xa4\xf268\xc0"(\xe8Q\x11PU\xc0'
+p43
+tp44
+bsS'vertexconnectivity'
+p45
+Fnan
+sS'numberofvertices'
+p46
+I1286
+sS'r'
+p47
+g9
+(g10
+(I0
+tp48
+g12
+tp49
+Rp50
+(I1
+(I1286
+tp51
+g31
+I00
+S'\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA\x01\x00\x00\x00\xb1MXA'
+p52
+tp53
+bsS'average_vertex_connectivity'
+p54
+I25
+sS'segmentmarkers'
+p55
+Fnan
+sS'elementconnectivity'
+p56
+Fnan
+sS'y'
+p57
+g9
+(g10
+(I0
+tp58
+g12
+tp59
+Rp60
+(I1
+(I1286
+tp61
+g31
+I00
+S'\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\xb1MXA\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\xb1MX\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x83\xc10\xc0R$A\x0e~k\xe1?64ACr\t\xfcn\n>A\x82\xce9\x05.\xc5CA-\xe0\xff\x00\xb1MHA\xffi\xd1s\t\x92LA\xdaI\x80\xc8\x1fCPA\x1f\xdf\x0e\'\x9e\x0fRA\xff\x97\x1a?t\xa9SA\xa9\xe3\xaa\x8f$\x0cUA\xca\x7f\xe7D\xcc3VA\x17\xf7\xb7\x1e.\x1dWAI\xf2\x96\x86\xbb\xc5WA6\x0c\x83\xbb\x9b+XAv\x07}\xbb\x9b+XAh\x10|\x86\xbb\xc5WA\xf8\x08|\x1e.\x1dWA\x04b|D\xcc3VA\xb5E\x0f\x8f$\x0cUA\x887B>t\xa9SA\xb8\xa7\xde%\x9e\x0fRA\x04l.\xc7\x1fCPA\xa1\xc7}q\t\x92LAq\xcd\xe4\xfe\xb0MHA\xe0\xa1X\x03.\xc5CA\x88\xa9\'\xf9n\n>AC\x9bq\xdf?64A\x81i\xf7.\xc0R$A\xbc\x83\xc10\xc0R$\xc1\x0f~k\xe1?64\xc1@r\t\xfcn\n>\xc1\x85\xce9\x05.\xc5C\xc1-\xe0\xff\x00\xb1MH\xc1\x01j\xd1s\t\x92L\xc1\xdaI\x80\xc8\x1fCP\xc1!\xdf\x0e\'\x9e\x0fR\xc1\xfe\x97\x1a?t\xa9S\xc1\xa9\xe3\xaa\x8f$\x0cU\xc1\xca\x7f\xe7D\xcc3V\xc1\x17\xf7\xb7\x1e.\x1dW\xc1I\xf2\x96\x86\xbb\xc5W\xc16\x0c\x83\xbb\x9b+X\xc1v\x07}\xbb\x9b+X\xc1h\x10|\x86\xbb\xc5W\xc1\xf8\x08|\x1e.\x1dW\xc1\x04b|D\xcc3V\xc1\xb5E\x0f\x8f$\x0cU\xc1\x897B>t\xa9S\xc1\xb9\xa7\xde%\x9e\x0fR\xc1\x05l.\xc7\x1fCP\xc1\xa1\xc7}q\t\x92L\xc1r\xcd\xe4\xfe\xb0MH\xc1\xe0\xa1X\x03.\xc5C\xc1\x85\xa9\'\xf9n\n>\xc1Q\x9bq\xdf?64\xc1}i\xf7.\xc0R$\xc1v\x07}\xbb\x9b+XAh\x10|\x86\xbb\xc5WA\xf8\x08|\x1e.\x1dWA\x04b|D\xcc3VA\xb5E\x0f\x8f$\x0cUA\x897B>t\xa9SA\xb9\xa7\xde%\x9e\x0fRA\x04l.\xc7\x1fCPA\xa1\xc7}q\t\x92LAp\xcd\xe4\xfe\xb0MHA\xe0\xa1X\x03.\xc5CA\x85\xa9\'\xf9n\n>AH\x9bq\xdf?64A}i\xf7.\xc0R$A\xc5\x83\xc10\xc0R$\xc1\r~k\xe1?64\xc1Er\t\xfcn\n>\xc1\x81\xce9\x05.\xc5C\xc1,\xe0\xff\x00\xb1MH\xc1\x01j\xd1s\t\x92L\xc1\xdbI\x80\xc8\x1fCP\xc1\x1f\xdf\x0e\'\x9e\x0fR\xc1\xff\x97\x1a?t\xa9S\xc1\xa9\xe3\xaa\x8f$\x0cU\xc1\xca\x7f\xe7D\xcc3V\xc1\x17\xf7\xb7\x1e.\x1dW\xc1I\xf2\x96\x86\xbb\xc5W\xc16\x0c\x83\xbb\x9b+X\xc1v\x07}\xbb\x9b+X\xc1h\x10|\x86\xbb\xc5W\xc1\xf8\x08|\x1e.\x1dW\xc1\x04b|D\xcc3V\xc1\xb5E\x0f\x8f$\x0cU\xc1\x897B>t\xa9S\xc1\xb9\xa7\xde%\x9e\x0fR\xc1\x04l.\xc7\x1fCP\xc1\xa1\xc7}q\t\x92L\xc1p\xcd\xe4\xfe\xb0MH\xc1\xe0\xa1X\x03.\xc5C\xc1\x85\xa9\'\xf9n\n>\xc1H\x9bq\xdf?64\xc1}i\xf7.\xc0R$\xc1\xc5\x83\xc10\xc0R$A\r~k\xe1?64AEr\t\xfcn\n>A\x81\xce9\x05.\xc5CA,\xe0\xff\x00\xb1MHA\x01j\xd1s\t\x92LA\xdbI\x80\xc8\x1fCPA\x1f\xdf\x0e\'\x9e\x0fRA\xff\x97\x1a?t\xa9SA\xa9\xe3\xaa\x8f$\x0cUA\xca\x7f\xe7D\xcc3VA\x17\xf7\xb7\x1e.\x1dWAI\xf2\x96\x86\xbb\xc5WA6\x0c\x83\xbb\x9b+XA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\xd2\x1ep\x9a\xc80A9Y\xc5\t\xfeB1A\xd8\x1eI4\xc0\xfd8A\xf9\x17\x1d\xc0Y\x85<A\t\x06\xbd\xee}e-A\xe1\xe0\xed\x00\\\xfd\x1cA\x82\xd3\\\xde\xe8;#A}Xa<{#BA\xc4\xd1]\xd7\xe3\xd9FA\xd3\xee\xb3\x92y\x99CAG\x8ad\xec\xc7wWAfD^\xdc\xc0\xaeVA\x96\x9d^!p\x90VA\xc9#\xddsI\x9f A\x0c\xab\xe2\xb9\x18\x98\x1fA\xbb0_+sXTA\x07\x07\x9fT;\xb7UAv\x90\xc6ntrTA\xa1\xea\x11\xc3\xc1\xc1BA<\xa8\\\xeeB/FA\x075\x03j\x08\xd8DA\xbaI\xf4<m\x83DA\x87\x01\xbf\xbbb\x8dCA\xc0]\xf2\xcdK\x10?A_\x0e*\xb2\x80\x17XA\xeeS<\xf8\xe1\x8b"Ay\x1b\xc7\xfc\xbc\x80%A\xc7uF\x14\xc2\xdc/A3o\x17v\x19l\x1dA\xa8\xae\x9b\xa8]4>A_\xa7\x07\xf1\xc2Y8Aka\xcf\x92\x95\xc62AX\xcbp\x99\xf5\x99BA\xa3k\xf6M\xbf\x81NA\x89O\x16\x07\x8e\xc2PA\x1fo\xbe\xd5\x1f\nQA\x81R9h\x12VRA\x0b\x05\xeb\xa8\x9c\x92"A\xc1\xe2\xc4\xbf\xb3}\'A\xca\xd2\xaa\xd6\xb0<IAL\x86\x18\xa0\x15\xd7DAY+\x96\xc5\xa4;JA\xe48\xffO<\xe5FA\xa13\xafnE\xccDA]\xab\xca\xb2\xffj>A+\xad$9h\x90BA\xd0O\xbdi\xbc\xdfVAO\xa5\xb0\xaa\x16gVAd\x0f\xd2\rb\xabGA\x10\x87\x88\xcb\xda\xcbDA\x1b\xa3\r\xe3\x05DHA\xbd+\x10\xb2W"MA\xa4\xc0<d\x9a8JAcb\xf3hKHNAXn\xeb>}9SA\xe9\xf9\x0f\x8f0=QA\x01\xfe\xc2Y!;RA\xab\xc7\xbc\x0f\xadpPAJS\xf2\xe3\xace3A\xbf\x1f\xca\xe5}\x177A\xd2\x9e\x97\xf3|\x1eNA\xe8\x03\x9dvIF.A&{\xa8\x9cfGQA\xca\xf8\xde\xe2\xd6\'OA8\x8bL\xc56\x19MA\xcf\xb4\xd7\xb6\xfe\xfbBA\xba\x08\x9eT \xfb7A\xd0\xad\xebJ\xd9}.ARdo\xd2\x02\xd3?A\x1e\x03\xc0\xc7\xa3\xbeJA\x10^\x1b\x99A\x0eKAJ\x82R\x1f\xfe\x05GA\xb5\x8f\xfb!\xb7<FA\x1e9\xbb\x0crKCAs|\xa3\x01\xd7&VA\xf7f\x99M\xf2\'WA\xd4\xcae\xecr\x06IA1\x05\xeb\t4\x8eJA\x06YH\x92\xbd\xf3IA\x88\x12\x19b\xc0\xc97A\xdc\xbbG\xd9\x11LBAi\xb3z\xd2P4OAF\xfc\xb0\xd8\x1b66A/\xc8=\x90\xdb\x9e%A\xff\xe2\xa0\xbcG\xf5RAc>p\xf0\xe5\x05SA\x08#\xb7\xb4\xfe\xff0AC\nv\xb3\x96,QA)\xcbq\xef\xa5\xb0NA\xde\xb4\xaf>e\x07PA(V}\xe99\x05LA\x17I(\xc0\x96\xa8QA\xe5\xf8\x94\x05MsVA\x7fA\x9c\x1exY\x1eA\x17\x87R\xd7\\\xe7<A\xd4\xb3kw\xc7\xc08Aa`\x93\xd2\x03\x82UA\x90l\x14 @\xb4TA$\x0e\x95\xea|:TA8e\xc8\xdc\xbb\x88WA\x87\x9a\xbe\xfd\xaa\xf8WAZ\x86{\x16\xfc\xb0WA\xe0t\x1c\x85\x1f\xeeRAR\x8b)\xa5\x04\x904A\xdf\x1b\xc8\xb9`\x18SA|\x18)(g\x83UA\x1ce\x83\xaai\xdaSA>\x8bj\xd5,|@A\xf9:\xc8\xabY\x85#A\xf89m^{CPA\xb0rz]W\x86MA\xc3\xac\xf9q\xedc@A\xb3\xecq\xd7\x1bs:A\x10\\f\xcaL\x19GAM\x14\x0es\x17\xf8.A\xefJ\x07\xf3\x16\x90 A\xc4E\xe7\xd8@\xe1@A\x0bw\xf5d\xbaGWA\x87\xe5\xde\xb3\xdcOQA\x8a\xb06\xfd\xa3\x0bSAD(A\x1e\xde\xcdQA[\xe6N9\xb6\xd4UAR\x94\x03I?h-AYEb\x8b\xc0\x96JA\x11\xdc\xeb\x07\xf2,5A\x92\xdc\xe8\xdb\xcd\xeb A\x8eX\x90C\xf8\xa0UA\xc9\\!O\xd1">A\x00.\xdd\xe7\xda\xa8TA\xe4\x98j9\xf0\xacSA\xeaI\xa0\xaf\x85\x014A\xf6\x96\xc3Mh\x06?A\xd0~\'\x87\'`LAl\r\x13\xa1\xdcfUA\xec\xd3\xb7>*\x9cTA\xbaH\xda\xe8\x0b\xe8HA\xef\xeb\xc6\xde\x0fyOA\xaa\xaa\x19\xcfm\x99FA`\x08?2\xd5\xc2\x1d\xc1.\xb7\xbc\x9c\xdb~&\xc1\xcesK\x84`\xaf.\xc1\x8f\xfe.@zP#\xc1\xa4\xb7\xab\x03\x16\x08Q\xc1\x07\x95\n\xbef\xe2N\xc1\xdd\x15U\xf8,\xb4N\xc1\xac\xce\xe8\xe5g\x84P\xc1\x8d2\x8b\x06\xd7\x95W\xc1#\x99R\x9f\xa1\xd4W\xc1"\xc2\xec*\xf1.W\xc1\x19\xbd#8\t\xb8S\xc1Ck\xb3\xe7\xb0bR\xc1?\xa3\xd0\x08\x03>R\xc1\xb7\t`\xa3\x89\xae"\xc1q \xec]6! \xc1{\xa4]\xaf\xe3\x1a1\xc1\x8d\xc6\xe79\xd1\x1aW\xc1\xa3\xc5\x15c\x1d\xb1M\xc1\xb4\xf6d\xdf.\xb1P\xc1\xd2\x18\x15\xc8\xdd\xabP\xc1\xd29x\x0f\xc4zO\xc1U\xa8\x14yXlC\xc1\xf6\x9bz%+$C\xc1}0D\xef\xe98H\xc1\xfa\xceF\x01Z"%\xc1\xe0BCv_lU\xc1\x18\xcb\x8c\xbe[]I\xc1\\\xc3\xfd$s*E\xc1\xb4\xd7\xef\x13dHF\xc1X\xd5\x8aU\x96\xebJ\xc1\xc4\xf4\x0e{\x1a\x84F\xc1\xd7\x89\'\xb5\xef\xf9H\xc1b\xc51\xbf\x929E\xc1\xb0\xdf\xaf+\x8d\xe7I\xc1\x87\x06\xff\x02\xa3\nG\xc1\xb3\xd5\xbe}f\xe2B\xc1\n\xb0><i[F\xc1\xd1\xe5\xfe\xe5\xa6\xafA\xc1\x0f\xb1\xd9S\xe0ZR\xc1\xaa\xa8\x9f\xe9\x08\x9bV\xc1\xecz\xfb\xeb\xdfuW\xc1\xe1\xf0\x87\x14w/\x1b\xc1a\x02\xb1\xab\xe9\xc2#\xc1\xe9\xfc\xe4\xd4\xd620\xc1n\xa3n7\x93\xd57\xc19\xb3\xb3\xa0\x0b\xe1V\xc1\x87\xf8HG\xf4.V\xc1\x8d\xc5\xc5\x10U\x13S\xc1\xda`p[\xae\x01T\xc1\xe1+k2\x15\x8bQ\xc1j\x04\x18+>iA\xc1\xe4\xd3\xd2\xa9c\xec>\xc1\x12\xc8^n\x19\xe7P\xc1\xdbQ\x00\x06\x8b\xf4B\xc1\xa6VV\xab\xa2#=\xc1|j\\GxuT\xc1\xa8\xe3s\x95\xae\xd0I\xc1\xab(:\'K\xf2J\xc1\xc57\xfeG\xc3\xfdW\xc1#\xec\xc8*[0X\xc1QZj;\xb4\x92S\xc1VI[2\xb7`7\xc1\xac\x8bC\x17\x8a\xff@\xc1\x97\x95J>\xd5(@\xc1\x0f\x862r\\2V\xc1^(\xd1\xf7\xfb\xf9J\xc1^\xbc\xb0\xc5\xec\x84N\xc1\xd3V\x19\xd6\xf64>\xc1\x85H\x1bc,\xed5\xc1\xf6\x9f\xdd\x91lIG\xc1\xafW\xa8}"5R\xc1\x18d\x7f(\xe3\xc1P\xc1V\xbe\xf0\xbd\xa1\x89N\xc1\x1c\xb6&\rZ\xd4S\xc1n/D\xacW\xd5T\xc1\xbe\xaf\x95\x84\x949U\xc1iB\xaa1\xb1bR\xc1\x0bv\xb6l\x8f\x1a5\xc1\xa5g\xcf\xfe\x94TL\xc1 (\xbbl\x80\xc5M\xc1\xe2c\xf5JL\xc6S\xc1\x9e\xc1\xa6\x91\x08W<\xc1\xac\x14/6z23\xc1:\x13\xc1\xcd\xdf\x134\xc1X\xbe\xd5\x0bV\xd7F\xc1\x89\x93DH\xb1\xdaJ\xc1-\xb4\x7f;\xdf\xbe4\xc1\xe9\x97\x990h\x978\xc16\x11\xf8A\xebu\'\xc1\x99\xaa$\x9f\xc7\x00Q\xc1\x86\x031\xe0\xd7\xb8R\xc1U}\x9a\xaf9\x97Q\xc1Q\xef\x9c\xc9\xed_1\xc1\xbal\xc9]E\xf8U\xc1\xeb\xf6\xad\x02\xa05V\xc1\x84\xa6\xbc\x86\xc3\xb7\x1d\xc1\xdf\xb0\xe5W\xf8\xa9O\xc1~c>\xa4 \xbc\x1c\xc1[\xbb\xc1\xbd\xdb^\x16\xc1\x93V\xe5"\xf1\xa6,\xc1\xe7s\xecC\t\xa2:\xc1Z\xf6\xa4\xae\xe29S\xc1\x07\xc9T\xa7\xa7<T\xc1\x88\xf3\xde:\xabEU\xc1\xec\xcdjzA\xfeT\xc1\xcaq\xaa\x1e.\xa5U\xc1Uf\xc9\xa1Y\x91V\xc15\xdfF\x93\xa8\xa23\xc1\xda\xc4\xcf\x88|\xf2A\xc1\x8a\x14\x83\xe6\x90\x1dR\xc1\x87u\x16\x11\xe2\x07U\xc1k\xd2\x8a\x81|\xc2T\xc1%\x1cbp\xa4\x96,\xc1AbH\x80\x14 =\xc1\x8b\xdc\xf0\xe9\xeb0C\xc1\x9f\xefI]\x0c\x8a?\xc1\xdd\x14,\xa8Q\xfcD\xc1\x8f\xfdPm\x1a\xf7:\xc1\xc6\xc7\x83\xebN\x9bB\xc1\xd1\xd7Us!0A\xc1  \xf5\x9e\xc4\xeeG\xc1\x07\xd9R\xc1\xf0gN\xc1uh\xb1\xd0\xb0VP\xc1x\xfc\xf3\xde$\xf5C\xc1\\z\xaf^\x02lH\xc1m\x1b\x15\x86\xf8\xdeP\xc1\xc0\xf1\x04\x89\xe3\xc4U\xc1C\x8c+\x96\xdb-8\xc1\x8bV&\xd9\xa7\xec3\xc1Q\xdb\r=\xd1\x16=\xc1\xf6Y\xb6-P\xaf"\xc1\x93\x98\xd1\x0bB\xb3*\xc15E\xff{D\x12K\xc1`\xc1\xb1\xa4p\x1eM\xc1\x95\xd4[P\xe3:"\xc1\x8e\x814\x11\x92\xafL\xc1 \x16\x14\x19mk\x19\xc1\xf3\x94m\x9c5/7\xc1\xf6\xb3j\xb0c;@A\x01H\x0e{\xb9u7A\x04a\xdb\xcf\xe0a@A\xa837\xd2\xe2\x04NA\x86`,^\x00\x8bQA\x9e\r\x85\x0b\x7f\\$AXh\xd7\xba\xed\x84&A\xb0\xe2\xfe;\xbcC/A\xcb\x84#\x9f\xa9\x8c6A\xaa\xfe\xa4\xaeV@8A\xe25>\x88\'UDA\x84\xee\xb1\x1f\xec\x7fIA\xa9\xderzU(KA \xe0#\xc5M\x07GA\x01\x97`\x86>\x17XAW\x81\xfe\xb2u\xd1\x1dA\xa8P\xf4#\xe3\x81\x1cA\'\xfc\xd7\x92\x95\x06VA\x8a\x97\x92\x13\x7fmVA\xab#\x94\xd1\x99VUA\x8f/x\xaf\xd6!FA\xa2\x87z\xc0^WBA\xbe\xcfN\x19\xcf\x9d?A\xc9\x8db\xe6\x8b\x83<A\xb5\xa5\xe7\xee#\xd0EA(z\x8f\x97\x90\xb2BA\x9e;\xees\xa1\x05UA\xdc\x05Yy\xa0TTA"i\xcer\x0b\xd6UA\xa3FU\xa2\x92\xfeGA\n\x84\x15%\x87\xefQA\xf1\xc2\xe9\xf7\xb6\xf0PA\x13(\x02 \xd4yPAC\x851\x9c,\x85RAs\xc3\xac\xc38v\x1aA\x97\xbbq\x96\xcd\x1a"A\xa9PL\xe5\x82\xc2?A\xd4\xc1\x87\x90\x93\x0c/AS\x93\xa2a\xac3:A\x96\xe1}\xff\xe7\xf86A\xd7OG0\xc5\x0cBA\xfc\xeb\xc9U\xf8\xebVA\x01\x9f\xf1GA\x9fSA\xa9\x15\xe1\xcc\x15\xa50A\x00\x1a\xb9\x0b\xec\xc7.A\x1e\x83\x1a\x03\x8a\x1fTA\xb48\xeewJ\x8cQA\xac\xec\xa4\x9c\x9f!OA\x9b\x1b\x89_\xba\xce3A\x82x\xd0\x99\x10\'&A2\x00[\x85\x16\x90!A\n\xb5p\xe3\xb5V%AS#\x19q\x18\xbdLA\x92\xf8\xc3\x08\x04\x1dMA\x81&\xd2\xcd\xcd\xd9OA\t4c\x9f\x99\x8cIA\xe2\xff\x0f\x0c\xcb\xb2DA\x16,\xc7\xf88\x1cGA\xa1\xfbN\xce%\xf9@AV\x1d\xcc\xb7[?+A@\x9cO]ciLA\x88\xdf\xcc\xa6\xea\xe7GAZk\xdf\xa3\xdafVAm\xf2\xc8:a%WA7\xbd\xe9]YuUA\x7f"07\x8a~UA\xb4\xdc\x07\x97a0HA\xbb\xbf\x16\x04\x8b\x99FA\xac;\xf3\x87\x9eABAJ\x06\xffW\nkFA\x8d\xed\xce\x1aNPOA\x0bc\xa7\xed\xb2*OA\x06\xb8\x06\xb5\x14eQA\x17\xdc\xd6>p*3A\xbfr\x8b}o\xff5A\x17y\x0f;\xb4\x045A\xffh\x83\xf7]tJA\x9a\xccxYR\x90KA\xb1\x8cs\xf2\x9dDOA\x1a\xb6H\'\xf9\xbeOA\xa3\xbb[\xd1\xbd\xfeMA\xad7\xd2,\x0erJA\xe2P\x1c\x92\xcf\x8b\x1cA\xe8\xedz\x83\x18m!Aej\xb2>4\xa6KA\xfc\xf5]\x0b4\xfdRA\xa43\xeeJ\xde)TA\xc5J\x9d\x85\xaa\xd1RAL\xc3o:\xe4bVA\xe8L0\xff\n\xd8<A\xe4\x07p\x16\xf0\xc2;A\x8c\x03$Q{\x7fWA\xa0:_L\xb7\xf8WAm\x83\xf9\x00B\xb0WA\xf1X\x1b\xe8\x873KA\xe1\xe4\xf7\x9e\xc5\x9aNAAr\xa5\xb9\xe0\x88UA\xf5D\x90;\xcfFSArR!\x94r\x81QA\xbb\x85_\xbf$\xa0QAAq\x19\xe2\xcf\xd9RA\\\xfe\xa8\xf4D\x1aGA\xf8|\x81\xe9\xab{GAT\x10\xd3\xf8\xa6\x93WAs\xa0\xbf\x88\x85\xacVA\x7fL\xffl\xdc\xc5\x1fA\xc7J\x89M\xbey1A\x12&\x8b\xc2/`2AR\xdc\x18T\x83\x1b;A\r\xc6\xbe\xe7\xbfL<A\xeev\xf45llDA\x92,\xac\xe1\xdc?AAX\xbdY\xa4\xe6\xedAA\xcf\xaf\xb7*\x08\xbfEA\xbc\x0e\x12\xeb\x9a\x82TA\xaf(\xd3R4\x14UAv\xbc\xfe\xfdt=FA\xcaf{\xd3\x82\x9eCA\xa3\xc6\xbf\xf58\xb9\x1cA71T\xdb\x17\xa4\x18AII\x938\xcc9TAuj\x85x\xa5)WA\xeb\x08\x1d\xacM\x83TA1\xc2a\xf0\xac\x10SA\x82\xd0C\xc1\xd0"SA\x91<E.\xc3\xc4QAcn\xba\xeb\xd0\xb27An\xbbGPA\xad\'A\xc1\xa4\x9e\x8aO\xd1BA\xe4\x10_\xa2\x1b\xf9PA\x9bB\xee\xd5\x8c@CAkI\x99\xf9\xd1^3A4\xfbu\xfe\xb4\xb6DA\x99L\xde\xa4#a;A\xa4{@_\xb2\xe4NA\r\xd0W\x88\xa0jQA\x8a\xeb\xcdh\xb29KA\xa1IR\x8f~tKAS\xd8\x13\xea\xd1XJA\x00\xc6\xdc7\xe2/SA\xd2\x1f5;k\x97=A\x7fYn\x023\xe0/Am\'\xed%\x8b)$Ac\x97\x03\xd5\xd1\xcb\x1cA\xc8I\x86\xf4\xbaqIA\xc7\xa8a\x91\x83\xb0MA\x04\xb3\xbcA\xbe\xb7JA\x17P\n\xed(0NAj\x18r+y\xa6PA\xbb\'\xba\x01\xd7\x95WA\xa8~\xa9\xa7\xa1\xd4WAp\x06e\x1f\xf1.WA\xd9\xf7\xbf\xe4\x99\xb8SA\xc7v\x06\xbd\xa6cRA\n)\x9a\xda\xfd=RA\xb5@\xbe~Z\xe1"A\xb6\xab[\xab\xad\x07QA\x9fwuS\x01\xe1NA@e\xc2\xbej\xcfNA[\x0b\x10?\xc9\x1aWA\x87\xc9\xe2=[\x8fPAo\xb1l\xae\xbb!\x1dA\xb9\xd9D\x04\xe6\xca0A\xb6f\x8a\xb1\xb87IAE+Na\x919EAcKD\x05\x8b\xe7IA\xb7\x16\x0b\tc\xa28Ad\x9b\xc8\xec,#AA\xb0\xf2\xd7\x0eZ"%A\xec\x1d\x08\xac\x15nUA>\xba{\x89\xba\x03IA\xc9\x90\x85\x15\xb5@EA\xb4?\xa4=\x13tFA\xa4\x8a!~W\xd5TAk\xe7C9E\xf8UA%\xd9Y\'\x949UA\x93J\rl\x8a\nGA\xab\xd7k\x9ba\xe2BAQ\xde_Kd[FAt\xfdq!yXRA\x1f\xe2\xae>\x85\xbbAA\xa1\xaa\xe6F\xc3\xfdWA\xa2\x0b\x9b)[0XAv\xaf\x05\x8d#\x9bVA\x0ek\x91\xa6\xdfuWA9\xb3\xe0\xb1\xeaI4AP\xd6\xc1\x9a\x0b\xe1VA\xedD\xad8\xf4.VAu\xbb\xed\xb8\xec\xbePA\xa5\xd3\xb7)\xf7\x82OAQ9\xba0<\xf8<A?\xb5\xa1\xc8\x07\xe7PA\x90(\xebM\xdd\xf81A3\x0b\x1c\x9b\xa7<TA\xc5\xa4\xed*\xabEUA_\xf3\x19Q~\x17SA\xaa2fX\xdb\x01TA\xab/\xa9\x9a\xd6\xa9QA\xc6q\xf0\xf2Z\xf9BA\xd9\xd4\xd1/4:=AG\x94M\xbf\x17wTAE\x1a\r\x83\xa9\xd0IA\\\x18\xb8p=\xf2JA\xd4/\x94\xd2{,LA\x97aB\x14\x80\xc5MA\xe1\xd6\xcf^\x92\x94SAW\xdd\x13m?e7A\x9b2}N\x08\x04AA|0B\'i6@A@\x15\xf0b\\2VA&-\xc7#\xde\x7f Av\x07"<Y\xd4SA\x12r\xca\xf2\xaebRA\xeb\xba3U\x90\x1dRA=\xae=k"\xf9JA\x08J\x07?\x08\x8cNAW\x07lw\xe4h>AJwA\xb1@\x016AOEo+\xe1\x07UAE(\xf2sTHGA\x8f\xfd*]\xd0:RA\x97\xa7\xc5XJ\xc6SA\xdfS\x05\x8a\xde\xc1PA\x14\xba[\xc4:\x89NA\xd7E\xc2\x17\xf2/CAse\x10\x8b\x9a $A%\xb0z\x12\xe7 5A\xc0\x9a\xe7\x1d\xbd1;A!\xc7\xf0\x9f\xc7\x00QA1\xa9\xd1\xe1\xd7\xb8RA\x18\xe8&`9\x97QA\xd0v\x95\xf5\xca\xc84A\xba\xb3\xb7zZh9A\xf7_\x89:F\x972A\xd0\xd2W\xc5 \xbc\x1cA\xdfI\xcd\xbd\xdb^\x16A\x0e%\n8\xf1\xa6,A\x1c\xc6\xb3\xe3.%3A\x0f \x1bH_\xa4OA\xd8e\xf0x\xe29SAr \xb1u\xacq%A9rt\xfb\xaa\xde\x1aA]\x1ay\x8d\xac5VAWS\x0c\xec_\x92AAi\xc4\xaa\x8e\x05\x05=A\x1d\xe8@\xe1\xc70CA\xfbM\x9aG\x87\x89?AI\xf7[\x0e-\xfeTA^+\xc5wm\xfbDA\xdaD\x85\x0b\xc4\xeeGA\xc7\x13G\xd5U\x91VA\xad4\x0fb^\xea<A8\x1a\x8a.L\xcfAA^\xc6H\xd3\xd1\x9f:A\xeb\x1a\x93\x1a\x00\x052A\xd3\t\xff8\xd6\xf6,A\xac\xd0_sz\xac\x18A\xe1\xcbI\xe8y\xc2TA{\x9cWj\xdf#FA\xa7\xcd\xe7|)79Afm4\\\xa3\x96,AX\xd3\xa9\xce\x1aiAAY\x11,\xe3\xae\x97BA\x8fN\xb41\x82tKA\xc8\xa8\x7f\xfa6:FA\xff\x03\xdcr\xe3\xc4UA\x1d\xa1\xf5`\xafVPA\x11Q\xa3I\xf8\xdePA\xbd\xd4z\xc5\x1c\xf5CA\xee=N\xeb\xf3kHA\x82j\x87\x1c,G,A%k\xb63\xb4\xcd<A\xeb5\xe6Z\xce\xfcJA\xcf\x82\xd6\xe7\xa7\xa5UA\x94I\xa8F\x91\x19MA\x18\xc7\xdf_\x87\xf8&Ab\xa1\xdcu\xdb\x99!A\xac\xcal\x1e\x90\xafLA\xb6y\xf4\xd4\xec\x104A\x8f\xe8n\x02\xcbS0A\x05oPU\x90t7Aj\rX\xfd\x8d\xb3\x18A]"g\x90t\x0b!A\xfd\xcf\xef,l\xa2"AX\xd1\xc0\xaa\xdb\x99NA^\xeeTN\x10\xb1JAc\xb0\xc0\xbbnbLA\xb0\x8cTL\x95\xeb8A\x0f\x18\xb7h\xb7\x84AA\x16\xd1\xd7\x88\x98:PA\x8c\xd9\xc3\xb6.\x01QA\x93\xa2\x832\xce.UA{\xd5s%\x1b\xb1SA:\xbd\x82\xa9x\xceSA,\xb5\xee\xa4\x8a\xe1TAf\x8a\xd0(\xa9\xe9EA\x86\xb6X\xe7\x01\xb1\x1fA\x8f\xbc\xcd\xbf\xa9-2A\x06\xea\x9d\x8ak\xa2-A}q\xa4i\xa4eSA\xdf_\xe1\xf5\n\x00RA(,\ts\x87\r$A\xc9\x9a\x17\x15\x9c\x95PA\xff?\xdb~\xbaKPA\xf1\x97%a\xce\xc8QA\r\xea\x08r\xa6\xf3LA\x06(\xdf[$D@A\x00\xd1\x97E&\x0c8A\x9bd\xe5p)\xb9UA\x84\xa9g\xf0\x0b\x8fTA\x97\xf2\xdbb6\x91TA\x1b\xc1{`h\xb72A\xa6Qxd\xbeU A\x84\xa4)\x10t\xce,A}of\xa1\x89tPA\x07vD\xb4\xf0\xdbQA\xb6\x96\xd5\xf2!QPA\x8bV}\xd1\x1e\xfcQA\xe4\xa9\x19\xb2\x17\x19#A\x8a\x01\xd9)3q\x1bA\xb7K\\#\xa5\x8aQAo\x96\x92\xa4 ;1A\x13\xb5o\n!\x0c\x1fAR\x006\x88\xe1\x00JA\x10\xd1\xed\xdf\x87\xcfFA\xcf1\xe3s\xc3\x10EA\xa3\xa9{\xbe\x85\x14BA\xa6\xf4U\x93\xb1{AA\xdd\xe7\xad\xbd\x8c\xdaTAKt>\x8e\xe44SA\x825\xed\x8bjGTAb\x9c\xc9\xd762TA\x07\xe20=\x92\x9c!A\x02u\x16\x05s\x1bVA\xa1\x8a\xfb\xc8\xf4kUA\xcbx\xf33\xe5\x88<A\xad\xb6\n\xda\xc7\x06BA\xec\xd3\xceHv*9A$\x9a\x9d\x0e\xe2\x1aDA\xd2\xe8\x87\xc8\xd1\xa4VAPcK\xe4d\x94PA\x9684:s\x9cPA\x9c\\\x04\xa7\xb3:RA\xfe\x9a,\xe5\x80\x9eMA\xfe\x8d\x95\xb3\xdayWA?i\x82\xaa\xa18:A1F\xe5C\xd6[BA\x9b\x87#fK\xf6EA\x8e\x8cS<r\x8dAA\xe9\x05P\xb9(g;A\xfenB\xa5\x81Q=A\x04)[t\xcb\\3A\xb1\xfeD\xb9 \tMA\x8b\xec"~\x83\xb1:A\x93\xd5\xd5&\xac\xe2RAF\xc0\x1bd\xb4\xb2QAm\xe3;\x88 \x81VA\xbc\xc0\xe2\x9a<\xf1VA\t(\x0b\x1b\xd6MWA\x1c\xba2\x82\xb9\xd9PA\xdcI\xa0~\xe0\xa6HA.\xd7\x82\x0c(KIA\x12\x8c\x11\xbc|FOAi\x8aI\xe5a\x1fIA\xd1\xa4\t\xdb\x15GEA\xfa\x9bv(c\x82EA\xaa\x11\xee\xc4\x8c\x1f5A\x1a\xbd\xbc\xf0\x0c\xdfLA\xb7\xe29\xfcEr2Aj\'\xf2 "\xaaMA\x03%\r\x15\xc0Q:A\x95\xa8\xbe\x9e\x84?MAdZ\xfe\x0f\x83\x04KA/+\xef1\xfb\xbeIA\xa2%\x86\xf1\xe4dFA$\xa2\x9f@\xe0\rIAd\xc4L\xf5a\x8eIA\x08\x7fj\x7f\x06\xd8AA\xd7c7\x85\xe8lGA\xe1\xa3\xb2\xad\x86\xfeEA\x12\xf8\x9c\xce)\x18KA\x0e=\x13_EV>A.\x1d\xed\xea\x180HA\x05r\xc5A3&VA]\x8f\x0c"S\xeeWA\x89\xdct\xc7.\x9eWA\xb9z\xe2E\x14\xb3BA\x0cw}O\xcb?@A\xbf\'o\x808pSAN\x88\xbe\xac\x0f\xf8>A\xcd\xab\x08\xd6\xa5\x1aDA \xb84V\xb3\xffUAZI0\xb6\x07]UA\x9d\xed]\xd4i\xcf>A\x12\xef+\xf0\x01\x11EAKvwS\x17\x12IA\xfb\x87\x02ba\xd5\x18A>\x8e\xa2\xed9d5A5\x8e\xa5\xf3\xf0\'(A\x83\xa9\x146*\xb5&A\xa56\xa7\x0c\xacX6A\x9d\xdf\xec\xb3\xb4\xf5WA>B\xb0\xf8\x8b0XA\xe1\xd8\xeb\xdb}J;A\x08\xc0\x1f\xe9\x96o4A\xab\xf9\x13\xaaw\xeb:A\x8b\xd9\x8d\xde\xb1\x9e0A\xa9\xc3\xdf^\x89+3Az\x15Syw\x08NAjk:\x86\x91 %A\xe4\x00\x7f8.\xb6VA~}\xf1\x96\xd2\x92TAk\x03\xddEu@SA\xb8e8\xf5t\xdb!Ac\xefN)\xf5\xceQAU\xbd\x8b\xd0}\x11SA\x10\xd0\xd9\xd8+\x90#A3\xf9\xc95\x85\x961Af}v\x0f+O\x1eA;Fh\x8b\xc4\x8dUAlR\x87\x8c-\xd8BA\xdf.\x07\x92\xc0\x7fOA"\xc0\x9b\'\xb7\xfb0\xc1b\x0c\xba:\xae\xe02\xc1^yR\x06\xab\xf19\xc1-\x0b\xbb\xa6\xd3\xd6>\xc1\x80~\xa9\x90P\xe6L\xc1Qn\x8b\x0c\xe6\xcaH\xc1]dw\xbb\x11zL\xc1\xed\xc7\xceG\x12HH\xc1\xd8\xf2\'\xc7\x1e01\xc1^S\xfb\x88\r\x081\xc1\x80\x19\xce\x13^\xe18\xc1.~\xd0o\x05\xa45\xc1`\x0f\xab\x7f\x87\x0c&\xc1\xbd\xca\xa8\xf1\xa6R6\xc1v\xc7FCX\x15B\xc1\x08\x0e>\x08?\x1dG\xc1~P\x1f\x1a\x96\xbbC\xc1\xc3\xdd_\x10\xeb\xa8\x1f\xc1\x089*\xaf<h$\xc1<#\x7f\xe7#\xea \xc1o%\n0\x0e\x99W\xc1$\xfa\x873+\xffV\xc1\xd7\xb9\xd4\xc4\xd9\x07/\xc1Z\xdc\x1e\xa3\xa8i9\xc1\x13\x9a\xd7\x02\x80:@\xc1\x82\xbf\xc2\xb8\xfaVB\xc1\x19\x03\x90$\xeb\xd6E\xc1]\\$\x03\xc1KC\xc1C\xf3\xd7\xbd\xbf\x81N\xc1j\xcd\xd4^\x8e\xc2P\xc1\x80\xb9\x15\xfa"\nQ\xc1\xec\xc5Xq\xa0)R\xc1\x98\x9a\x9aG\xea\xf3U\xc16\xe9[q\x15\x15U\xc1x1\xf2\x8c)\\V\xc1\xfe\xd7\x10t\x7fE!\xc1(\xcc\x0b\xc1z\xe4$\xc1ZAZ\x80\r\x02!\xc1\x9d%G\xcc\n\x8d\x1b\xc1\xf4\x9e8y\xf2\x97>\xc1}\x1aV\x90\x1a\xe1=\xc1\x02V\x85\xa8\x8d\x1eT\xc1O\xebbE\x99\xcfS\xc1\x02d\x1b\x1f\x94lU\xc1Du\\\xf4~\xe1/\xc1\x15\xf5\xf7\x8bel\x1d\xc1\xc7\xd0)\xdf\xda\x94N\xc1\xd6\xe4\xd6\xef\xcf6Q\xc17\xf9\x94\x94d\x19>\xc1|\x0b6P\xbc\xe7B\xc1"\x1c\xfb\xf5\xf73+\xc1\'x\xf4f\xdf\xfb\x19\xc1\x08^\t$\x89\x957\xc1\xc0|?~\xa5\x99.\xc1a&\xb2\xee\x10\x9aB\xc1\xe7\xb5\x16\x03\xaa/S\xc1\xb2\xaa\r[dYR\xc1M#\xea\xc7\x84xP\xc1\xcd?48dGQ\xc1\xcd\x10\xb3!\xd7\'O\xc1(\x9b[ 6\x9bR\xc1\x82\xe0\xc9\x99v\nS\xc1YK\x91e\xd2\x9aL\xc1\x01j\xdd\xbf\x19:J\xc1\x85\xb3\xba;\x05PN\xc1|\x94\x18\x1a\xa4\xbeJ\xc1\x15~P7\xec\x0eK\xc1\xe7\x10\xb2\xf3\x0b\tG\xc1X\xe4\x86P\xbc\xe8H\xc1|\xc1\xe9\x01\xc3\xcfC\xc1\x95n\xeeh\x93\xe6F\xc1T\xbc\x14\xbe\xca\x92J\xc1X%\xaeI\xdd\xca?\xc1\xcd\x84\xaep\x95\x00E\xc1\x0c\x18>o\xdf;J\xc1,\xe0\\A\x8e]B\xc1xz\xb5\xaa\xb7\tF\xc1eo\x06?zbB\xc1\xf42cL\xe0\x8aD\xc1{\xc7\xe5\xc1&]D\xc1\x97\x92\x84\x14E4O\xc1\x87\xa3\xe3#\x16!U\xc1\xf8\xdfN\x93pWU\xc1q9\x1b\xda\xebDV\xc1\x06\xec\xef\xecJ@7\xc1UE\x07\xa4\xa2\xfa1\xc1:\x94\xfd\xef\xc5\xf4R\xc1\x87\xa1\xc87a\x05T\xc1\x04N\xe5/*\x16S\xc1P*""\x9bjV\xc1\x08\xae\xa0\x84\x97,Q\xc1Y\xb8\xd8z\xaa\xb0N\xc1\xda;jP\xd6\x05P\xc1;\xc1\xad\xce\xaacT\xc1\x81\x8f\x90aj\xaeQ\xc1\xdc\x89\x86\x0e\xc2%X\xc1Gk-\xaey7W\xc11g\xae\x12\x88\xe3L\xc1uqm3\x8d@J\xc1\xfcH\xd4\xc90\xcdW\xc1\xe1\xba\xe8\xc7IjV\xc1\xf5\x14\xaa/3\xfbW\xc1\xe3&\x00z=\xeb4\xc1B\xfc+\x97{v@\xc1\x93IAs\xa3\x92#\xc1\x81\xe5T\xfdI\xc7U\xc1T\xa9\xc9\xf9*\xabV\xc1\x91\xd0;\xbf\xb0\xd16\xc1\x11\x0c`\xab?\xa5H\xc1\xd4AY\xe0\xbb\xadF\xc1\xaa\xed\xbf\xdf-CP\xc1\xf2\xb5\xcbo*t:\xc1\x8e5n\xe5t&E\xc1\x90\xf4\xff`\xcd\x06D\xc1C\xbb\xea\xd9\xd7\xacG\xc17jq\xc5#\xe3T\xc1\xe8\x11d\x8fG\xd9@\xc1b\x00\x898(\x97T\xc1\x97o\xabY\x19Y<\xc1\xa1\xe2\x187\xfe\xcdQ\xc1\x91\x17\xdaCB\xa4S\xc13\xff\xa6d\xa1\x97J\xc1 nd\xfc\xa4o-\xc1\xbc\xcdL\xaa\xa9\x19G\xc1\x9d\xde\xc2\xd0\x1cbQ\xc1\x96h\xa9\xe6"<S\xc1\x08\x9aK\xb5\xbe*5\xc1\xb4\x94\x9e\xf5\x18\x1f!\xc1\x83u\xe4q\xca\x07?\xc1\x15w\xeb#*W>\xc1:=\xdeMH\'T\xc1`\xb8\x9c5\xe4\xd74\xc1\xc9\xaf\xb9\x95\xc8\x94\x1e\xc1U\x1b\xe7\x8aH\x000\xc1\x17\x9e\xeb\x94_^K\xc1\x06\x97\xa3_<9W\xc1g\x01Q\xab\xd8\xb0N\xc1|@z\x1c\xfb\x0f*\xc1)"R\x15\xa7\xb2%\xc1\x1d\x9b\x9d\xb9\xd01@\xc1\x9bw\xc9\x87\xa4\x0e5\xc1\xdf\x01U\xf3X\x97;\xc1\xbc\xb1o\xaa\xf1\xb1C\xc1\xa2ka%\x90|N\xc1i\x9dZw\x02\xc2N\xc1\xa0\x9c^eM\xdfP\xc1B\xef\x94@\xfe,/\xc1\xdf\xb2\xcf?/\xb07\xc1\xb1I\x9b\xbf`\xd2P\xc1\x85\xf13\xdf\x98=M\xc1\xfa>R\xe3\xbe\x90O\xc1\xaa\x05\x9e\xa5\xc6A7\xc1T/]V,$L\xc1\x13\xd1,\\\xa8\x04D\xc1\xfe~\x81\x97\xeflG\xc1\xe2\x98\xfb7O4F\xc1\xaf]\x11\xe9\xaa\x1a:\xc1\r\x04\xa3\x1fW\xc94\xc1O\xdee\x19Q\xd5>\xc13q\xf1\x95\xaf\x9dD\xc1\x1e\x80\xa1I\x9aW2\xc1b\xf9\xc8\x89 \xa8L\xc1\x84\xc5\x1b\x97"\x82P\xc1\xaa\xa5H\xf4U\xc6P\xc1\x83\x05\x94c\xcadB\xc1\xb4B\xb6\x97\xc9\x1cF\xc1\xcc\x17\x12C\xb4\xa1A\xc1R\xec\xd6\xff\x97gE\xc1\xee\x9e\xbe\x10\x89\xdcA\xc1\xa9\xe9\x89J\xc6\x809\xc1m\xa4\x00\x15\xfb\xdeQ\xc1d\xbbE\xd2\xf7\xf4R\xc1\x1a\xaa\x965~YR\xc15|\xb3%\xa45U\xc1\xbf7l\xe5f<V\xc1\xedn\xebu\x0bbV\xc1\xa3\xdf\x0e\xe9\xab1W\xc1\xffE2\x10E\rN\xc1\x90\xcc\x0c&\x80PP\xc1\x84#\xafy\xa4\x88M\xc1u\xf2\n\xdf\x12\x88P\xc1\xe9\x1c3\xaf\xf7\xee%\xc1\xef\x7f\x07\x07\xcf\xe5#\xc1\xc3\xa4\xcc\x9b\x0b\xb9S\xc1\x0b\x8b\x12\xca\xab\xe6"\xc1\x89\x815E\xbb\x13W\xc1\xd2S\xea\x93\x1cnV\xc1\xb92\x90c\x95\xf5T\xc1\xdd)\xf3\\\x17fT\xc1R\xae&\x01\x8e\x80S\xc1\x178\xf0\xcerrT\xc1\x9df\xf3\xeee\xbeU\xc1h\x13CdEbW\xc1/X\xe3MuxW\xc1\x10\xbd\x19\xcc\x80\xd5V\xc1\x7f[\xb5.+\xe6W\xc16\xea\xfcj\xdeMH\xc1\xc2\xf7}\xd3"\xf6K\xc1\xef\x9awqk[/\xc1A(\xd4\xb4\xc0<@\xc1?\x98 \x7f`\xad6\xc1\xf4\xd0HK\x1f\xf68\xc1\x01\xd9!\x89\x1d-J\xc1\x00\xcf\t\xbc\xda\x8c \xc1\x7f\xdf\x8c\xba\x18a1\xc1\xb0}\x83\xba\x06\xb7P\xc1\xd5-\x84\xa2\xac\x89R\xc1\x87<\xa0cY\x87@\xc1\xc2X\x9a\xf3c\x9c7\xc1VN\x00l\x1a\xb01\xc1\xdcG\xeb\xe2iK\x1f\xc1\x0b\xc4\xab\xae\x96\x14@\xc1\xf0\xa6o\x83\xf3cE\xc1\xa7G\xb4P\xc8x.\xc1`\x99\xd91\x0b\xca6\xc1\xb6\x85\xaf\t8\xebC\xc1\xaa\xe0\xb2\xf8\xadpD\xc1~i\xd0\xa5\xe0\xa8R\xc1\x9a8V)\xb3\xcc?\xc1_\xb2\x85\x01^9@\xc1\xb9?[Q\xd7WR\xc1E\xeas\xbe\x0c\xfaQ\xc1\xaa\xdcf4\xc4tS\xc1\xd4Uf\xc2\xa9"R\xc1h\x07\xe8\xf0\xd4\xfdR\xc1\x0e\x97(\x8ct\xe3?\xc1\xbf\xd2\x81\xcc\x99\xa54\xc13\xad\xeb\xc1\xe7\xf4\x1f\xc1+\xc7x/D\x98/\xc1\x17\x831\x9c\x19\xaaS\xc1\xeb\xc9\x1a\xdbs<T\xc1?\x89\xdeLN\xb4S\xc1\xc8\xe5\x16\x94\x13tQ\xc1t\xc5ujhfR\xc1$7#\xa0\xdcXJ\xc1\xc0\xdc\x03\xa8v\x9dU\xc1]\xdd\x91e\x0c\xb9#\xc1OU}{?e,\xc1\x90\xbe#\x89\xe2\xdd)\xc1:\xdd^\x94\x93\xe5T\xc1\xe1\x1e\x0e[\x94\xa6\x18\xc1\xe3\xdf\xb8q\x94\rN\xc1\n\x88\x14\xd4\r\xd7M\xc1<\xaf\xady\xfd[ \xc1T\xa2p`HiF\xc1e\xe3"\xb1\xcb\xd2I\xc1\xb3m\x0bC\xcd\x1fI\xc1\x15m\xbe\x17\xf2\x0fD\xc1\xf3\xa5\xfd\xe1q\x9dH\xc1!@\x9fb\xfc\xccD\xc1lF\x1a\x94\xaf\xe4T\xc1\x0c\xdd\x93\xcd\xbaX\x1b\xc1\x94<\x82\x80\x8e\x1fV\xc1\xdb2/\xd16>F\xc1\xb1\x85\\\x84\x81\xd9G\xc1f\xb8)\x9c\x7f\x87N\xc1\xe0:\xe0\x00\x85\x83L\xc1{\xe4ZPbgT\xc1#\xe2"\xecM\xb5S\xc1\x18\x1f\x11\xc4\x14,X\xc1\xb8\x98J\x15\xf6\xd0W\xc1;\xber\xdd\xc2\x88K\xc1\x13\xbeK#\x96rA\xc12\xf57\xc0\xcceI\xc1\x18M\xff\x04\x11\xdaP\xc1\x1f)E\x82VpP\xc1\x84R^1\xaa\x85U\xc1\xc8\x7f\x86\xac\x01|<\xc1\x11|\x89X]\xacJ\xc1\xe7\xdf\x90~FGI\xc1sm\xee\xc3\x82mI\xc1\xb2\xfa:\xedJ\x8e\x1c\xc1\x0cs`\xa3\xbc\xe1M\xc1c\x0f\x9c3\xf3\x8fV\xc1\xd1\xed\xaeh\xe7nW\xc1^[\xbax\x9d\xb2V\xc1U\x0c\xdf:ODU\xc1\xb63\x84\xf6i\x87T\xc1c\xb4\xe3<l\x92S\xc1\xe6*\nUd<3\xc1Sm\xda.\x88\xda#\xc1\x80\xe3\x85k\x17\xb1$\xc1\x897v\xa1/\x050\xc1\xfd\xaa\xae#\x98\xc28\xc1\xf8\xebx\x0c\x01\x003\xc1\xef\xcb\r\x97\xc3\x1dS\xc1rq\x17U\x04\x8bU\xc1\x1ae\xba\x0cd\x95P\xc1 \rp\xfd\xc3TR\xc1\xd5=\x1cJ\x1d\t6\xc1\x0b\x02\xf0\x98m{>\xc1\x16@\xf8\x1c\x165L\xc15\xfa\xc9\xf8\x94rH\xc1\xae\xaa,yH\xaeJ\xc1\xd6\x14\'\xd4\x00\x9d@\xc1+M\x83\x16\xc0\xd2D\xc1\xb1\xc3 :\xdb @\xc1\xf2\x89\xd3-\x9dmW\xc1\x8e\xc8\xaa2m~V\xc1[\x9fsw\xc9\xccD\xc1\xc0)\xc1\x8b*fN\xc1\x02UR\x9c\xac\tO\xc1,\x85\x1e\xc57&Q\xc1H<\x8d\xe3\xa3WK\xc1\x82\x9647\x98\x8a@\xc1\xc4\x90l$\xdea9\xc1U*\x15F\xdb4T\xc1\xab\xae\xf5:\xf1\xd4S\xc1\x0e\xa6\x86\xca\xd2\xb1T\xc1\x91\xb3I\x9e\xa1\x8dU\xc1w7R\x987;S\xc1\xa1\x1c\xd6]{\rR\xc1U\x9e9\xdf\x02\x0cW\xc1X\xb4\xed\xcbK\xc6:\xc1F\x1c8\x02\xbf\xc9A\xc1X\x9e\xba\t\x87\xa2:\xc1\xebi=\x9b\x90n)\xc1\r\xe4W]A\xcd\x1c\xc1\x80\xe50^h\x03R\xc1\xaf\xff\x82\x86]\xc4S\xc1X\xb6\x18\x85\xd3iR\xc1DK\xcc"q\xddV\xc1\xa6\xfa3\xa6E\xd5P\xc1~\xa7\xadN\xb1/N\xc1$\xa4\x1c\xf9\xb5\xd9M\xc1\xac\xa5r\xacL\x94W\xc1@\x0e;\xae+;J\xc1\xd4\xec\x0bo7\xffE\xc1^\xdc\xca\x94\xd9\x84I\xc1\x9d\xbdO\xc3\xa2\x08F\xc1\xa9~(\x0f/jJ\xc1\xe4\xd0T\xb2\x9c|F\xc1!?\xd3\xcf\xf0[B\xc10\x9f15\xcd\xbaB\xc1\x01\'\xecgC\xb0 \xc1X\xf4\x8ew\x95\xb8\x1b\xc1f\xeb\xec*[m0\xc1Z\xa0.{\x87\xc8M\xc1\xbeV\xd4\x00\x9cUK\xc1M\x05\xa1\x04\xac\x196\xc1a\xad\xe7T\x0c9&\xc1\xdf\xce\xc8\xd5\x94\xd63\xc1\xc7/,\x04:P<\xc1\r\x1f\xc0\x13\xe3HJ\xc15\x9e8_\xc7\xf8W\xc1I3m\x83ChJ\xc1\x9d\xb9HsL\x9dE\xc1\x8d\x11\x15\x01\xc3\xb17\xc1\xbc\xbf\xce$\x8f\x9eP\xc1\x9b\x8d`\x96\xa6\x7fM\xc1\xe2\xc5#\x15\x07\xa8P\xc1H\xa7\x12\xb4u\xe4 \xc1G\xed\xc9\xc5\xa7\xba1\xc12W\xfeq\xf7\xf2N\xc1V\xa3M\xe9\xd3dA\xc1\xf6F\xe1\xdaF\xb1U\xc1x\x86\xb6\x9a\xc0GN\xc1Tk\xba\xce\xc6\x883\xc1\xe1\x14\xc4\x88\xc4\x93=\xc1\x7f]\x99\xd0p,=\xc1\xfc0\x14\xd8xp1\xc1"\xa2AC\x0e\x08%\xc1\x1df;\xf2\x90cA\xc1\xae\xfb<\x1cF\x1eI\xc1\x92\xca7Dz\xebU\xc19\xc3\rPjRV\xc1\xcdv ^O\x9cE\xc1\xd8\x9f\xc6\xfa\xa7G@\xc1R\x9e.N\xe4oC\xc1v\xb5(^Z`,\xc1E\x1d1y\xd9\xc8)\xc1\xa3\xda6\xc4GuO\xc1D\x94\x8c\xd2$\x14\x1a\xc1\x01\xc7\x08\xf9>\xa9;\xc1z\xa8\x9b!A1#\xc1igG\xce\x02IU\xc1\xfc \x1bRqGR\xc1\xdb~\xcc7\x84\xecT\xc1w\xbb\xbb`)\xd7.\xc19\xb5\x8f\x03\xaf\x96H\xc1\x14>\xaaO\x11"M\xc1s5\x91#\x9f\xf8M\xc1?l\xf3\xce\x84` \xc1^R\xc9X\xe6\xf7S\xc1\x11\x9c{\x1e\xe2\xd2B\xc1\xb2\xa1t\xd8n\xe6I\xc1\xee\x87\xc0\x90n\x16F\xc1\xe1\x9a\x00\xc7\xac\xaf@\xc1{[\x82\x9c\x19\xe5D\xc1\x96 `t\xbd\xf6W\xc1\xc8\xacf\x80\x9b4X\xc1\x1a\xad\xcb\x026\x18S\xc1\xc7\x94hGf\xb3P\xc1\x80\x10\x10\xb7\xfe\x10H\xc1a\x8c(Z\x1csG\xc1e\xeb\xb3\xffJ\xa7Q\xc1\x05\xba\xa2\x9a\xc7t"\xc1V \'\xcb\x1a\x04(\xc1\'\x8f\xfa~\\`7\xc1Q\x82i\x99\xcf<0\xc1\x94\x97u\xd6\xadw7\xc1\xb9u\x99\r\xd7\xf1Q\xc1\xb0\xd0\xe9DH\x9cP\xc1~\xca\x04mI\xaaR\xc1-\xdcg\x0b\xb4\xca\x1f\xc1\xaf\xde\xfc\xa9\x058T\xc1\x93\x84\xce>\xc3m<\xc1\x1a\x0f~\x9b\xfe\x1b7\xc1\xd98\r\xcdG\xe6A\xc1\x18\xb9\x05\xfd_\x9cP\xc1`l\xd09\t\xe3L\xc1;\xfa\x9c[\x04o1\xc1\xe2Zk\xaf\xfbJT\xc1'
+p62
+tp63
+bsS'x'
+p64
+g9
+(g10
+(I0
+tp65
+g12
+tp66
+Rp67
+(I1
+(I1286
+tp68
+g31
+I00
+S'\x01\x00\x00\x00\xb1MXA\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\xb1MX\xc1\x18\xf1z"\xec\xce\xfa=Tq\x0e0\xce_\x91@Tq\x0e0\xce_\x91@v\x07}\xbb\x9b+XAh\x10|\x86\xbb\xc5WA\xf8\x08|\x1e.\x1dWA\x04b|D\xcc3VA\xb5E\x0f\x8f$\x0cUA\x897B>t\xa9SA\xb9\xa7\xde%\x9e\x0fRA\x04l.\xc7\x1fCPA\xa1\xc7}q\t\x92LAr\xcd\xe4\xfe\xb0MHA\xe0\xa1X\x03.\xc5CA\x85\xa9\'\xf9n\n>AN\x9bq\xdf?64A}i\xf7.\xc0R$A\xca\x83\xc10\xc0R$\xc1\x10~k\xe1?64\xc1Br\t\xfcn\n>\xc1\x82\xce9\x05.\xc5C\xc1*\xe0\xff\x00\xb1MH\xc1\xffi\xd1s\t\x92L\xc1\xdbI\x80\xc8\x1fCP\xc1\x1f\xdf\x0e\'\x9e\x0fR\xc1\xff\x97\x1a?t\xa9S\xc1\xaa\xe3\xaa\x8f$\x0cU\xc1\xca\x7f\xe7D\xcc3V\xc1\x17\xf7\xb7\x1e.\x1dW\xc1I\xf2\x96\x86\xbb\xc5W\xc16\x0c\x83\xbb\x9b+X\xc1v\x07}\xbb\x9b+X\xc1h\x10|\x86\xbb\xc5W\xc1\xf8\x08|\x1e.\x1dW\xc1\x03b|D\xcc3V\xc1\xb5E\x0f\x8f$\x0cU\xc1\x877B>t\xa9S\xc1\xb9\xa7\xde%\x9e\x0fR\xc1\x03l.\xc7\x1fCP\xc1\xa4\xc7}q\t\x92L\xc1t\xcd\xe4\xfe\xb0MH\xc1\xe1\xa1X\x03.\xc5C\xc1\x88\xa9\'\xf9n\n>\xc1P\x9bq\xdf?64\xc1\x83i\xf7.\xc0R$\xc1\xc5\x83\xc10\xc0R$A\r~k\xe1?64AEr\t\xfcn\n>A\x81\xce9\x05.\xc5CA,\xe0\xff\x00\xb1MHA\xfei\xd1s\t\x92LA\xdaI\x80\xc8\x1fCPA\x1f\xdf\x0e\'\x9e\x0fRA\xff\x97\x1a?t\xa9SA\xa9\xe3\xaa\x8f$\x0cUA\xca\x7f\xe7D\xcc3VA\x17\xf7\xb7\x1e.\x1dWAI\xf2\x96\x86\xbb\xc5WA6\x0c\x83\xbb\x9b+XA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00t\x881C\xf7j\xc6=8L\xa3\xf7\x86K\xd6=\xcc\xfe\xf7\xf1\x84\x91\xe0=q\x9an\xd6\xcd\xce\xe5=^0\x95#\xec\xce\xea=_i,c\xd9\x83\xef=h\xa4\x1e\x021\xf0\xf1=\xa3g\x151%\xec\xf3=\xb82T\x8a8\xb0\xf5=\xdap\x00\x14w7\xf7=\xc9Xgr\x97}\xf8=\x8e :\xee\x06\x7f\xf9=\xc9\xa4\x16z\xf38\xfa=\xddK\xb0\x9bS\xa9\xfa=Q\xa8\xa9\x9bS\xa9\xfa=\xa2\xfd\xf8y\xf38\xfa=8\x05\xf8\xed\x06\x7f\xf9=\xd20\xf1q\x97}\xf8=\r\xc9T\x13w7\xf7=N\x85e\x898\xb0\xf5=\xb2\xd5\xc5/%\xec\xf3=/\xf4\xa9\x001\xf0\xf1=\x97c\x9b`\xd9\x83\xef=\x8d\x8eB!\xec\xce\xea=[\xd6[\xd4\xcd\xce\xe5=t\x15a\xf0\x84\x91\xe0=\xfeEu\xf5\x86K\xd6=r78A\xf7j\xc6=\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00v\x07}\xbb\x9b+XAh\x10|\x86\xbb\xc5WA\xf8\x08|\x1e.\x1dWA\x04b|D\xcc3VA\xb5E\x0f\x8f$\x0cUA\x897B>t\xa9SA\xb9\xa7\xde%\x9e\x0fRA\x04l.\xc7\x1fCPA\xa1\xc7}q\t\x92LAp\xcd\xe4\xfe\xb0MHA\xe0\xa1X\x03.\xc5CA\x85\xa9\'\xf9n\n>AH\x9bq\xdf?64A}i\xf7.\xc0R$A\xc5\x83\xc10\xc0R$\xc1\r~k\xe1?64\xc1Er\t\xfcn\n>\xc1\x81\xce9\x05.\xc5C\xc1,\xe0\xff\x00\xb1MH\xc1\x01j\xd1s\t\x92L\xc1\xdbI\x80\xc8\x1fCP\xc1\x1f\xdf\x0e\'\x9e\x0fR\xc1\xff\x97\x1a?t\xa9S\xc1\xa9\xe3\xaa\x8f$\x0cU\xc1\xca\x7f\xe7D\xcc3V\xc1\x17\xf7\xb7\x1e.\x1dW\xc1I\xf2\x96\x86\xbb\xc5W\xc16\x0c\x83\xbb\x9b+X\xc1v\x07}\xbb\x9b+X\xc1h\x10|\x86\xbb\xc5W\xc1\xf8\x08|\x1e.\x1dW\xc1\x04b|D\xcc3V\xc1\xb5E\x0f\x8f$\x0cU\xc1\x897B>t\xa9S\xc1\xb9\xa7\xde%\x9e\x0fR\xc1\x04l.\xc7\x1fCP\xc1\xa1\xc7}q\t\x92L\xc1p\xcd\xe4\xfe\xb0MH\xc1\xe0\xa1X\x03.\xc5C\xc1\x85\xa9\'\xf9n\n>\xc1H\x9bq\xdf?64\xc1}i\xf7.\xc0R$\xc1\xc5\x83\xc10\xc0R$A\r~k\xe1?64AEr\t\xfcn\n>A\x81\xce9\x05.\xc5CA,\xe0\xff\x00\xb1MHA\x01j\xd1s\t\x92LA\xdbI\x80\xc8\x1fCPA\x1f\xdf\x0e\'\x9e\x0fRA\xff\x97\x1a?t\xa9SA\xa9\xe3\xaa\x8f$\x0cUA\xca\x7f\xe7D\xcc3VA\x17\xf7\xb7\x1e.\x1dWAI\xf2\x96\x86\xbb\xc5WA6\x0c\x83\xbb\x9b+XA\x89\xb5\x16\xca\x91:S\xc1\xf7x\x17\xe8\xa2\x84T\xc1(\xd4\x82\x97S\x0fS\xc1Ax8\xae\x976T\xc1\x10\xebI\xf3\x9c1Q\xc1\xd6b/BQHQ\xc1\xe0\x8aoD\xe1\xccR\xc1HB\x9e"\x1f\x8aR\xc1\x1a\x1aPF9\xfeP\xc1\xb9\xd3\xd8|\xf4\xeaP\xc1PD72\x02\x1d#\xc1r\x80u\xba&\x15\x1f\xc1\xafF\x88m\xd2\xce/\xc1\x84G\xb8\x95\xdc6T\xc1\xf5\xf5\xb8@\xb0\xd9W\xc1\x84h\xa3@\x96;2\xc1\xd3\x8e\x93+\x02W$\xc1m\xad\xd9z\xf8\x8f!\xc1\xcb\x9c\xa6\xd9\x1c\xf0U\xc1\xd10S;\x010U\xc1\xc1\xc4\xa0\xb8i\x0fU\xc1o\x9e\x93\xf23\x86T\xc1\xd6ik`\xa9\xafS\xc1\xfaas`\xf8\x1dU\xc1\xdb\xee%\xdeH\xe9\x1c\xc1\xa9\xd9\x93AfnJ\xc1?\xad\xd2y\xcf O\xc1\xb7\x03\xeaRN\xd0W\xc1\x84\xb9\x9c0\xc1)X\xc1\x1a\x08\xfa\\9DK\xc1\x0f9\xea^\x96\xb6H\xc1[\x13\xd7d$\xffK\xc1pBE0\x08VV\xc1\x03\xb0\x89S|\x1eN\xc1\x1cO\x08\xf7\xac\xb4M\xc1\x9eU~J)\x81J\xc1\xdb^\x85#\xd6\x87J\xc1\xdan\xea\xbe~\xfbA\xc16ba\nA=:\xc1\xa9\xdc\x85\x0e\x9b{C\xc1U\xb0\x17yn\x91H\xc1\xa1I\xc1\x1eHjG\xc1\xdc\xb1\xa2\x91r\x9cK\xc1\x88:\xc6\xd3\x1e0C\xc1\xb1G\xbfr\xa7W*\xc1\xef\x0f1\xa8\x82\xb8\x1d\xc1\xee\x97\x0cR\xb5\x0c?\xc1ZO\x88c\xfd\x8aB\xc1\xdf\xd5\x14\xdc\xd3M2\xc1\xb2\xc1\xc3\xf2\xbc\x957\xc1\x8d\xb4\xca\xccPj=\xc1\xca\xdf\xe1lO\xa1R\xc1}\x9c\x82>\xdc\x13T\xc1\xfb\\\xf67\x14\xcaR\xc1,W}%{\xf9J\xc1i7\x95\x99t\x15O\xc1\x93\xd0\x8cn;\xf0N\xc1\xabn\xc4\xcb\xd3/Q\xc1RNG-\xf7k@\xc1\xc8\xd3@~\x16\x8e5\xc1\x11\xb7M/\x8b\xc3P\xc1 \xca\x16\xa0d\xe2/\xc1\x0f\xb5\xed\xc0XjF\xc1\x93\xe4Y\x98\xe5\xcdI\xc1\x9a\xc9\xd1d]l<\xc1\xcf\xc8\x02\x0f=\xb7>\xc1\xf6+Y\xf1\x06\x11W\xc1g\x9d\xd3\x02s_W\xc1\x18\xa9\xe9\x8f\x89\xf96\xc1\x84\xc3\xbd\x01\xadcN\xc1\xfatP\xb8\x95\xceJ\xc1\x9dA<\xbe\xa1\xb2N\xc1\x12S\x06\xec\x13\x06#\xc1\x15\xea\x8b\x04+\x9e0\xc1F\xeb\xa6C]\xfa9\xc1\xbd\xe3ba\xcf\xac3\xc1\x95B\xd4\xe9\xc5\xc8S\xc1\x95\xc4^CD\xe4P\xc1\xad\xe8\x95y\x1fa$\xc1\x80P\xe7\x161\xe8O\xc1\xc0T~ 31N\xc1\xf3\x1c\xfeM*fE\xc1\x974\x1f~\r\x11#\xc1\xceD\x97\x82\nC\x1d\xc1\xb6\x8e\x18T2\xf85\xc1\xccZ\xe6\xcc\xfax%\xc1\xecn\x7f\x1fV\xc8G\xc1\xd2\xa9\xe0\x07\xad\x8e$\xc1\x82\r\x9a\x98\x8eK!\xc1p\x14\xaf\x83\xc6\xb73\xc1\x9d\x01\xf6\x034\xc73\xc1\x9dPi\x12v15\xc1\xb6\x18\x8e?&\xa8>\xc1\xb3\x10\x1a\xc9c\xe9.\xc1\x9f\xe8\x15\xa5\xfaE?\xc1\xe0\xee\xfc\xdf\x7fjD\xc1\xd1\xe6\xba\xac\xf0_A\xc1B\x9d\x98\x0c\xfc\xba@\xc1|\xac\xb8\xa9\x11\xdbE\xc1s\xa1\xa9`\xd5-7\xc1\xcbv\xf0\x91R\x04.\xc1\x9d)R\x82\x11F0\xc1m\xe8\xb3\x0b\xbd\x1fF\xc1V\xf9%\x90\xba\x7fU\xc1\xaa>\x1e\'}5B\xc1uKT\xd1\x15E5\xc1\xec|\xbb\x97\xdf\x8c;\xc1\xc5J\xcd[\x08\xa8F\xc1\xea\xd8e\xcfQ\xb1U\xc1\xc1+c\xb3M\xc1>\xc1\xd8:\xc6G\xc0\xc5B\xc1\'\xab\xf5Z(\xfaU\xc1H\xba\xd6\xe1cGW\xc1\xd7\xa2\x94!\xc5GU\xc1HO\xbfh\x10uD\xc1K+\xee\x91teF\xc1\xf9Br\xa6\xdc\x9cB\xc1\xef\x9c\xdb]U\xf97\xc1\x11Z\xa2\xb3\xe5\xdeP\xc1_\x04\xe88j\xeeM\xc1rKCo\x05}@\xc1\x93C)=&(D\xc1&\x1f\x1e\xee\xb1>V\xc1\x05\xdf~\x18\xdc@T\xc1]\xf3{\xfb3{V\xc1\x0b\xfbZ\x80\xfe\x05W\xc1\xc8\xc2A)\xbd\xf3E\xc1A\x92\xf9\x92\x17SQ\xc1\xb6)X\xc0\xa0\x8fG\xc1\x9f\x18\x1d\xbacmK\xc1)\x92>#\xdd\x03R\xc1L{\'\xc5Z\xb1V\xc1\xb4\x07\xfb\x94z?R\xc1F\xfe\x9b\x07{\xd3C\xc1\xdf\xe5\x8fx\xd4WI\xc1(\x87=\xa4%\xbbR\xc1\x88?\xed-\x97#Q\xc1+\x8fp\x1b\x9bTR\xc1\xadh\x1dl\xc9/X\xc1\xb33oe\x12\xe2W\xc1"k\n\n\x92\xf5W\xc1\xf5\x84\x19\xd2"ZW\xc15\xf7bi/\x00M\xc1\xeb\x07\xd9\x9f\x16\x1eP\xc1\xd7u\xce%0\xe5M\xc1h+\x9cl\xfc\x12P\xc1N\xcb[\xaf[K"\xc1\xf6\xdc\xd4\x0f-8/\xc1\xa7\x1a9\r\x00\xc82\xc10\xed\xc4\xd5\xf3\xf6E\xc11\x02\xf99\x02\xdeI\xc1\xf2\xe4\x91A\x8b}F\xc1\xbb:\t\x95UjV\xc1d\x9cE\xb0\x05LU\xc1\x10$\xda\x9e\xfalU\xc1\x94\x85\x17\xe4"\xfc9\xc1}X\xa6m\xb7\xdbR\xc1f\x9a\x12\xe3\xdb4Q\xc1*\x06\x9d\x0f\xe3\x8eQ\xc13\r\xdf\xc8c\x84Q\xc15\x12\xbdY!\xecU\xc1\t\x0b\xea\xdf/\x87U\xc1\xed\xda\x87\x17>\x9cT\xc1B\xeb\xde\xc3G\xe9\x1c\xc1\x9f~\x8b_\xe2pF\xc1\xe0.Q\x1aF\xe9R\xc1\xe8\xf9\x97Z\xa3\xdbS\xc1\x89\xf8U\x8d\xb2\x97R\xc1\x9a\x95\xc4\xe8\x84!T\xc1\xd0nT\xebGpU\xc1\x91\xc7\xb2Zx92\xc1F\x9dD\'\xecT$\xc1\x89\xber\xc8E\x8e!\xc1\x03\xaf\xb7\xa9s\xecM\xc1|\xe7Cb\xa3\xb4M\xc1\x0c8\xba\xf5\x18tJ\xc1\xf6\x81\x8f\xdb\x99oJ\xc1\xdd\xbf\x9f\xd9\xfaSO\xc1\xdd\x87\xd4\xcb;&A\xc1\xf2\x98e\xfc\x10n8\xc1\xabgJV\n>T\xc1\x1c\x162\xdf\xcd\x8cR\xc1\x11\xd8\xae{\xbc\x1aT\xc1lA\x9ak\x8dnW\xc1\xf15\x1d\x8f\xda\xb1)\xc1{~\xb2Yz\xf2!\xc1\xcacD\x12^OL\xc1\x80\x15:\x7f\x84\x00K\xc1\x82\x86\x10\xe7@\xd3O\xc1!P\xbf@\x00\x94V\xc1\xec\xdcV\x16\xf4\x94V\xc1\x88\x81\x9f\xd5\xa2&J\xc1\xe6F\xd6\x11\xc3oP\xc1\xedmp[\x8f\xd4N\xc1\xa8]?\xd5\xc5IH\xc1\xbb\xff;w>eF\xc1\xc7\x07w+\xd4\xcdI\xc1\xb2^\x1a&\xf1\xff\x1d\xc1TA\x1fgpV\x1b\xc1\xe5\xad:W\xcd\'I\xc1\x9d9\x11\xf0\x05q#\xc1\xeb\t\x97\xa6\x0fk\x1f\xc1\x1a\x0c&\xaf\x80$0\xc1\x81\xe3dT\xcd\xb67\xc1\xe9_\xb2\xcd\xabIN\xc1\xbby~\x197HJ\xc1\x9df\xdb\xacl::\xc1\xa82\x81v\x90n4\xc1\x15\x0c\xe8_\xeb\xd1P\xc1Tc\xa1\xfa\xca\xe2L\xc1\xae]W?T\x07G\xc1\x9dS\xfba\xcd<E\xc1\xa8c\x1a\x98.{;\xc1pA\xebLw\xa10\xc1\x04\x1a\x94\x00R\x897\xc1\x8eF\xa5\xc3\x93]B\xc1\x88\xc1[U}"W\xc1s\x0b\xe4\xfa\xc5\xd85\xc1\xad\x12\xf5\xefnx%\xc12,e+\xe5\x19B\xc17\x9e\xde\x82e\x17V\xc1\xa1\x1a@\x9c\x19oV\xc1\x94w\x90\xb1\x9bv?\xc1\x18\xcb\xafka9T\xc1N\xc2\xf9b\xa6SS\xc1c\xa4\xc0\xc5\x0f\x11G\xc1\xe9\x90\xcd\x84l~J\xc1.\xa4%\xd6\x08\x19J\xc1Gae\x81\xad\x8e$\xc1_\x83\xf8\x03\x92K!\xc1I\xfd\xcdG!\xcb3\xc1\x12o\xe0\xda|\xf5M\xc1\xdc\x80r\x08\x86\x121\xc1\x82\xbc\xc5;\x99\xf3@\xc1\x1e/\'\xa7\x94/N\xc19\xf7\x81\xa1\x8b.5\xc1)\x8b~V\xd5-7\xc1\x8fV\xe9\x91R\x04.\xc1\xb7\x8a\xb8y\x11F0\xc1\x14\xfa\xb9\xdcy[U\xc1s\xd9\xa5)F\xee2\xc1\xe6\xd3#\xe3\xb2\xe7 \xc1w\x00H^\xdeN\x1d\xc1\x19\xcfY\xc1\x89\xc5D\xc1l\xf2\x88WjUD\xc1\x1f\x15W\xf6\xf9h;\xc1Up}n\t\xe2P\xc12\x13\xdc\xfd\x1e\x03U\xc1O\xb9\x83\xb2q(<\xc1\x9d\xac\x071\xa4U>\xc1E;\x98\x9a\x15\x88B\xc1`X\xe1\rM\xf97\xc1\xd4N\x83\x8f\xf1BA\xc1\xd8.\x17ED\xb7@\xc1\xae\x8b\xc9\xf9[\xd4E\xc1\xc8\xd9\xcf&|\x17F\xc1\x95\xff\xa8\xed\x96DS\xc1%9\x08S_6R\xc1\x0f\x8em\xf9\xef\xf8S\xc1\xb6\xe1j\x9e_2B\xc1\xa6r&\x8f\x1e\xe1R\xc1\xa7\xb0\x1f\xf8\xbd\xb5>\xc1BZ\xfc\xc2\x0fB5\xc1\xd7\xa3{\xaa\xb5\x88;\xc1Q\x07\xae\t\xbc\xc5B\xc1\x1f\xf2\xf5\xe9\xcdl@\xc1j\x02\xce\x04\x82vT\xc1zC\xc6F\xcb\x83R\xc1\xf4:\x18\xb0\x9f\xa8Q\xc1V\x99\xedm\xc1\x97?\xc1\x9f\xf9g&\xcbWD\xc1`8\xeb\x1c\xd1\x11Q\xc1\xb9\xae\xb8\x141\xa2Q\xc1\x01L\x01\x93\xe6\xc2P\xc1\xb6\xd9C\x1a\xec{@\xc1?\x87\xd7GY\xa0F\xc1dX\xa4\x8b\x95\xc3C\xc1{k\xd5\x83\xaa91A\x9a\nw\x930\n%An\x9a\x1dv+\xde\x1dA4w\xf6\x00\x83\xe1RA\x10\xd4\x9f\xfc\xc5\xa2PAl=/)\xa7\xaaIA\x1eg\xd2\xd3\x98sDA\x9b\xa3\xfa\xe6\xb0\x97VA\x10NH\xc2e\xa8UA\xe5\xdb \x1f\x82^VA\x1c\x1bI\x1d\n\xd7!AC\x11T\x92v{TAG\xf3~lVWSA\xbf\'\xea\x10\x1d\xabTA\x18%z\xf4R/%A\r\x11\xcb\xc2\\\xb68A=\xe2\xa3\xae@\x8e@A\xfe\x9d\x94\x8d\'\xc6BAd\xec8{\xc2RBA|\xff\xec\x17\xf2\xbaFA\t+\x98\x1cVmBA\xdc\xcc\x8cIn0GAo\xef\xb9\xa1\xf2\'CA\xf1NE \x92\rIA\xee\xd3\xd2\x8b%aUA\x02\x18\xd33\xb0\xbcUA\xf9\x7f\xef\x9b\xa1\x8a8A\xcd\xae\xda]M\x911A\x01\xee\xf5\xd4\x07\xc6/A\x19Z\x8a\x95\xce\x99&Am\x17\xb0\\\xbb"NAs\xd8\xcb\xec\xdf\xb2PA\xd4\xb5V\xf0d\x1ePA\xb5h\x03\x18\xe9-NA\x19\xe9$?\x9c\xa0VA\x85s\x1eM\x9dGWAc\x9b\xbdK\xee\x86UA\x0fL6\xb1}\xe3WA\x94\xb8\xb7BHAWA8a\x03\xc3\xd8D5A 4\x06c\xf1bVA\xcf\xe5\x03\xad\x01\xa7=A\x93\xbaI+TfLAJO\xf0tS3=A /\x8201\x912A\x86\x98,\xce\x9f\xbfIA\x9e\xeeB\x884 !A&=\xeckV\x16#A\xd8ZO\x18\x87\xc0TA\xf6\x98\xf4\t\x1f\xb9UA\x12\xe8\xab.[@QA\xf7\x80\xd9w\xe4\xacNA\xfd\t\xfe\xf3m!IA\xb7L\x16z_>EA\xb6\xf6\xc6:s\xc8EA\xc0\x91\xa8\xe6K\x8fHAe\x9f\x00\xaf6GJA \x84\xba\xc6\xa5\x8eFAO\xc37\x85z\xe5JA\xb0e\xcf&m\xb5 A\x00]\xbcW}\xd9QA?\x80s\x1f\x16\x8fSA\x8c4?\x7f\xc2\xfa=A^V\xd4\xdd?\xfa5AD\xf4kY\xeb\xf4>Al\xd3A\x9a\x06\x11CA\x02\xcf\xd3x5@RA\x87.\x06\x14pcLA\xee/\x02x\x94SNA\x94\xe16\xac\x98\xd5OA\x98\x13\xf3\x87\xaePOA\x02\x8b\x8c\x0fb1MAr\xc6Wo\x06DJAc\xee{|\xdaAWA\x88hF\x80\xc5>BAC\xb3\x8a\x81\r\xb5FAA<\xe0\x8b"\xc2CAe\x1d!\xaa\x97\xbc=Az\xf0\xe8>\xa0PAA\xddXm\'\x85\xee8A-\xd0\xf9\x8c``3A\xe33\x81G\xb6=6Aow\xca\x85\xbb.XA\xbe7\xef]6\xe0WAl\xb8\x040]\x0bQA\x1a\x93\xff\xa4\x05\x06\x1cA/\xdd2\x82j\x88 A\x10\xbc@\x98/~0A\xb6\xa0\x98J\x95H5AG\xa2W\x10\xab\x84TA\xfb\xcfqV}\xa7<A\xc5\x8c\xa4\xee\x04Q\x1dA\xa4\x92s\x81!`\x16A\x9dC>>e\xa9,AP\xccj\xff\xf9\xcaOA(\x8f,\xd2h\xefQAG\x9e\xd7\xd5\x17\xbd A\x92\x93t\n\xaa\x03;A\xf3\x03\x15\xc9\xaee9A\xb3W\xd67\xf6\x7fAA9"\xb9\xfa7MBA\xf4Y^-9\xfc<A\x0b\xad\xabY\xadC4A7\xe7\x8bpE\x905A\xdc\xe9BU\x052"A~h-\xa3\x92\xd7RA\xe5-V\x8a\xaf<RA\xa4^\x0bgG1PA\x1e\xa4\x07UP\xc2PAc\xfb\x83F\xbbFRA\xe3}T\xb5j\xdf0A\xda\xe2\xe8Dc\xfdRA\xe7\xd2\x90\xd7\xb56QA\xcf\xbf\xe3;\xe3\x9cQA\xb1\x8c\x84?y\x8eFAq\xe5t;t]FA\xfes\x8fp\xb8\x83UA\xb1>\xf7\xe4(\xf5TA,\xcd6\x80\x9d\x03-A\xf3hN\xeac\xb0\x18AK\xc9\x99\xe8\xf7\xbf@A\xd9\xd8I\xf9\xf9B-A\\\x94\x95\x8d\xb7\x9dCA9\x80\x01\xca\xc7\x9fEA[\x83\xac\x95\x85\x91HA\xf5\xf69g\x03\x8eLA,\x9f\xd7D\x91\x94SA\x01e]|q\x18TA\x83\x13\xa9\xc8S\xc0:A\x99\x9f{y\xb701A[\x11\x01\x12\xb5\x17TA{;M\xb5]\xd5KA\x9fD@\x89h\xc9RA\xf1P\xa4y\x81\x98MA\xd8P\x8e\xc4\xcd\x93JAl*\x81\xee\x93\x92FA\xc3\xff\xd3\xa3\xb90\x1bA4\xb9\xec\xaeU\xaf-A \xafU\x99x;LA\x8a\x0c\xe4\xe7Z\xf2JA\xf6\x06pd\xfa\x86VAM[\xf7\x85\xe3\x9bV\xc1\xf2\xaa\xe3\xa1,wW\xc1\xa3\x04\xe9\x97l\xd2V\xc1\\"N\x9c\x10KT\xc1\x9f\xf5L\xf8\x99\xe5R\xc1\x18\x9e\xa9\xe1\xc52T\xc1\x90?D\xe3c\xfaR\xc1\xfd\xe4\xc9Ry\x96Q\xc1\xa6/\x87e[K"\xc1\x80.\x18\xe6)8/\xc1\xd3\x95_\x1f\x01\xc82\xc1~\x92\xf9 \x02\xf6E\xc1\x8ax\r\xe6\xae\xddI\xc1\x7f\x83\xc7\xfe\x9b}F\xc1\x86\xc3\xcaxy\xbdU\xc1\x8fAA\xb6\x83\x08M\xc1\x9b\xff\x10+\x99\'P\xc1\xf3\xe3\xbc\x9b\xfd\x02N\xc1w\n\xfb\xdb\xc1\xfc9\xc1\x02\xd3\x86y\xc5\x1fP\xc1]\xeai\xbbt\x93T\xc1\xc5\x15i\xf9aqT\xc1\xd5\xe8w\x8cr\xec0\xc1\xf0t\x8fT$U$\xc1\xb5\x83q\xbed\x8e!\xc1\x1bJL\x0f\xf2oW\xc1\xcf\xcfpC\x86\xa2V\xc1\x8e\x17c\xf0G\xe9\x1c\xc1\xb11\x03m\xa9kF\xc1w\x9fc\xfa/\x06S\xc1\xc1t\x9d\xd6>\xfbS\xc1G\xcc\x1c\xc2@\xa9R\xc1\x01\xc1\xce5~\xa10\xc15\xfc\xa7V\x89\x121\xc1\xa5B\xd1t\\\x897\xc1\xd2\xde\xc3&n\xecM\xc1\xd0\xd8\xa1\xf5\xac\xb4M\xc1\xce\xa0\x95F\x1dtJ\xc1n%\xcaj\reO\xc1.\xaaG\xa6\xfe~J\xc1]\x1e\n\xc6\xf1\xff\x1d\xc1\xc8\x8dYEqV\x1b\xc1i+R\x0b\xf3%A\xc1VL\x8ft\x15n8\xc1\xb1\x15HUf\x0fW\xc1Q<\xe4\xbb\xdb\xb1)\xc1\xd0\x0ef7\x7f\xf2!\xc1\x9a\xae\xb3"\x8c*Q\xc1\x14\xa1\x1f_\xdd\x9bQ\xc15\xb5\\\x90\x99\xbfV\xc11C\x12\xc0\xcc&J\xc1zx\xca\x94\xd2\x90W\xc1\x91\xf8\xcd\x18\xba\xe7 \xc1h\xf3\xbd\xae\xeaN\x1d\xc1a\x84\x11\xbc\x95PL\xc1\x1e\xf5`\xd2$\x04K\xc1x\x15\x9c\xda\xc5\xb0O\xc16\xee\xcf\xef\x13{P\xc1\xcfAF\xc9\x84\xfaN\xc1\x95\x91\x9c\xf6/HH\xc1\x88CL\xe8HeF\xc1+\xce\x95\xcf\xe8\xcdI\xc1y\xb7\x17\x1d5%6\xc1@5$\xc9vx%\xc1\xbf\x1f\x06\xc8w%I\xc13\xb3x\xbe\xb3\x1c#\xc1u\xaa:+\xca\x13\x1f\xc1\xf2\xaan\x9c\n\xcc/\xc1\xb9*\x11\xbc\xcd\xb67\xc1\x18#\xcc\xa1G\xfaW\xc1\xa8=sT>{;\xc1\x95\xf0\x17\xca\x9f]B\xc1\xd5\x11H\xdc{(<\xc1\xbe\xcf\xe2\xc9GJN\xc1W\xb4p\xd3\xd8KJ\xc1KU"\xe3A\xf79\xc1g.\xf2\xe7\x89\xac3\xc1\xb9\xe7\xf4\x03\xbaU>\xc1\xbf7\xfa\xe4\xc9\xd1P\xc1h\nR\xddx\xd7L\xc1\x12:\xff\xce\xf3\x19B\xc1\xed\xaa\xb6\x85g\x07G\xc1F&t\tk=E\xc12\x03u\xa4x\xe3U\xc1\x9c\x07t\xd2\xe7\x96S\xc1\xde\xcfw\xd1W\xa7>\xc1\xb8 w\x05\x10%V\xc1\xa9\x9cg\xc9\xad\x8e$\xc1\xea\xbd\xd4Z\x92K!\xc19H\xc9\xcb%\xcb3\xc1\xf6\x7f\xaa;\x98\x91U\xc1\x0cx8\x9c\x85\x8bJ\xc1\xd9$U\xd9\xca\x06N\xc1\x18z\n]\xd5-7\xc1!!\xfe\x8eR\x04.\xc1_\xee\x14z\x11F0\xc1\x04K\xd2\xfb\xde\x04Q\xc1.\xa9c\xbax/5\xc1&\xea\xe4VM\xee2\xc1\xc9>5\xaa\xf2\t?\xc1\xee\x14;\xeb\x89\x8aB\xc1\xe7\xd1#h\xe2\xf3@\xc1\xe1$\x8ai\xa6\xcfU\xc1\x1798\x9f\x15]A\xc1\x11\xce\x98\x9a\xe9\xb7@\xc1\x11!N\x1aC\xd5E\xc13f\x80\xe3\xae\xc6D\xc1\x17\xe6J\x85\xc3\x19F\xc1\x7f\xd3.\xd2c2B\xc1%~t\x1cmi;\xc1\x90n=le%U\xc1\xdc\xf3\xbb\xe2\x83\x15U\xc1\xd4mg\xa8\xf7pS\xc1\x14\xa7\xda\x9a\xe3\xcdR\xc1\xb3.mR*\xf7W\xc1\xd2G\xc6p\xa34X\xc1\x02\x1f\x83^2\x88B\xc1\x87:\x87qV\xc3T\xc1\x848\xe5\x8e\xf7\xa3T\xc1/\xc8\x08WN\xf97\xc1\xe0\xdb\x86\x04\xc3\xfdS\xc1\xa22?\xe3\xdb4R\xc1\xfa\x9d\xe0z\x9a\x1bS\xc16\x82m\xbe\xa0pU\xc1\xf7\r\x10>\xcel@\xc1B\x9bi\xaa\xce\xb5>\xc1\xcd\r\x80>\xbd\xc5B\xc1\xf9\xbe\x1d,uB5\xc1\x15\xa3\xf9\xa9\x08\x89;\xc1\xab\xd6+\xb1\xfb D\xc1L\x1d\xc3\xfe?\xbdQ\xc1\'\xd6\x1a\xd7\x94\x1dQ\xc1\x07\xb7\xaf7tTD\xc1\t"\x1d\x9c\x90\xb7Q\xc1\x10l \x04\x95$P\xc1\xcd\x13\xb8|\xb1\x10M\xc1\xfb@\x8ag\xf3{@\xc1\x1f\xf4\x04h[{G\xc1\xa9k\'\xe7\xaa\x8cJ\xc1\xf7e\xe8@\xb2\xd0C\xc1\r[8B\x0f\xf3E\xc1\x11K\xd6\xbd\xca\x13R\xc1\x9b\xcam\xf8\x13\x0eI\xc1P.-QIK"A\xae\x88\xe6>h\x0c!A\x16\xd5\xa0\xcb\xe361A\n\xda\xa5\x9e\x97?$Aq\xad\xc3e\xd7`\x1cAJ\x11\xff\xd0\x9f<2AC[\xb2\xdb?\xda A\x02\xedO\xe6\x1eeAA\xc6\x07\t\x0e\x18\xd8BA\xc6\xb46\x99\x92\xa8FA-\xd2\n\xbf}\n=A6\x14~=\xbe\xcf"A\xc3\x9a"\x18N\xdf,A\x17c\x86\xbf\x1c\xf70A\x00V\x8b[d\xc0 A\x87M\xd3\xcfU\xce>A\xcc\xaf\x12\xb2\x01\xa6CA}\xaf\x13\x83\x8a\xf89A\x9cfy\xf8\xdbvOA\x0f\xc0#\x99\xe0\xdbPA8\xdf\xfc5\xe8PNA|\x01x\xd2NzQA\x813Y\xb5b\xd0VA\xf5W\x13W\xb8uWA\xa8@BA\xc3\x87!A\\1\xa2\x8f5\xd6\x1aAQ\x17\x8e\x1b\x92S-A\x0b\xb7\xaa\xa2`mWA\x94\xea\x17<\xe2\xf2WA\xb6-\x10m\xb9\xf4WAYz8\xb0\xa8\xf6BA\x11\xbeI\xa0\x8bu=A\xa2\xd2\xc9\x03\xb5\xdd<A\xd9\x9eT\xf7:U*ADX\xaa\xb0\xe9eWA\xd3f\xa8\x90\';\x17A\xce\xedO#\n\x8b5A[E\xc0\xf6\xda\tAA\xf5mR`\xfa\x91CA)\xe2Z8^iTA\xde(\xa1\t\x9c\xdeTAB\xed\x8b\x0c\x91\xcaUA\x13\xba\xb8\xe1|*VA$\xcc4\x9c\x08\x81/AW\xc9Wc\xe9\xa9GAk?"\xd6(GLAQ\xe8\x1bW\x07oJAU\xc6\xe6E\xed3HA\x05\xa9\x85\xech\xffHAS\xfd=m\xf6\x87CA\xb0\xe8\x1a\x1a\xb3\xd2CAU)\x9a\xbc\x10\x01IA,\x9bw,|\x8bDA\xf7^\xf8bPXDA\x10;\x99\x00?\xb0HA\x92\x07\xe2e\x17\xae?AF\xeac\xa2c\xa3GA&\xa2\x9d,V\x1bKAyy\x88\xd0{^GA\xcakB\x082}LA\xf6e\xc9\xb8\xf2\xd66Avy\x14\x01\xc3\x044A\xfe\xa52v\xbf\xa0SA>\xf42.\x10\xbaQA\x9f,Xz\x86YRA2tF^\t\x91VAd\'KD\xf0\xaeUA3g\xa1\x88\xf5\xa2VA\xc3r\xed\x85H\xd1GA\x01\xab\xaa\xf4*\x13WA\x8f\xb0\xe7%\x12CNA\x8a"\xc3\x9a;\'PA]\xa8X\x1f\xa4O/A)\xde\x17\x80\x8d\x8c6A\x87{\n;\xfbX%A\xa3O\x9d\xddWcQA\x0c\xf0\x04s\xdf\x170A9f]\xf7\xd109A[\xf5\xdbx\x05\x15RA\xb7\xfb\xa7\xfb\xb8\xd6OA\xd9\td\xbb\xa3NPA~J\r\xcc\xb9\xd04A\xe6\x06\xa4\xef\x0foUAn\xc6v\x1b\xe9Q;A\xde\xdd\xee\xbd\xd2q9A\xc0\x17\xfa\x97\xe9_BA\xae\x13\xa3XY\xff=A|\x989\xe6RfRAc\x91\x9e1\x15\xb1SA\xb6\x014\xa1\xcb]SA\xff!\xd0\xc1\x9b\x11DA\x84\x94\xdc\xb4\xb4\x1dFA\r\xa1\xc5pO4AA\x90\xa2\xfe\xd1\xbe\xdc9AB/\xcf\xe2j\xf3RA \x0b\xca\xdb\xffQTA\x16\xd1Z\x9b\xcc\xd2PA\xd9njQ(\xdeTA;L\x89\x14\xc5\xfaIA&\xb5w\xa3\xe5\x98>A.\xa3\t>\x9f\xe3\x1eA\xa2\x9c8;F\x140A&\x98\x0c6$tUA\x07\xc4\xc9\xd1\xe1JAA\x7f\x03\xd9H\x05\x7f"A\xcbiW\x8d\xdd\xf1PA\x9b\x18\x86\xb6k\x83MA\xbe\xb6P\x93\x03\x869A,\x1d\x91XP\xdbFA\xf8\xb9rJ\x04\x17MA[4\x06*\xb6\x9a?A\xaa0\x9d\xf0\x07\xddLA\x8c\x91\x84\x80\xb13XA\x11\xadQ\x97\xfb+PA\xaf\xb7\xa4`\xcb\xaeMA\x01\xb6\x97\xff\xef\x18QA\xb4\xe1\x15\xff~qLA!\xeb\xebW\xb0\\,AWP\x8b\x82\x9d\x91\x18A\xd0\xfc\xcc9\x1e\xf6SA.\xaa\'\xcde2RA\x08\x8d&\xf1\xd1\xc8RA\xf5\x96\xfeS\xc5QEA\xc8c2\xe0\x92!IAm\x00\rV\xda\xfaRA\xc7rdN\x94fUA\x8c\xa5\x18s\xf1\xec\x18A\xe6\xc6U\x0f\xb296A\xa9p\x91K\xfb\xf13AX\x880\xbe\xf2\xf8RA\xbd1\xd6~\x00\x92KA$w)\x1f\x9f\x94JA\xd3\xbf\x12\x164xVA\xf6\xcb\xf5\xa6\xfa\x11TA!\xab\xc9\x90`NTA\x82\xe9l\n}E3A4\xd8\xf2\xec\xd0\x95TA\x03\xbb\xdep\xe4\xb4NA\xbd8\xddr\x957S\xc1\xd1\x1f\xeeG\xc4fT\xc1\x98\xc3\x0eY\x18\xe8R\xc1\xcb\xdaX\x04\x14\x04T\xc1\xe4%<\x8d\x96V:\xc1.\x07)\xaf\xfa\xab@\xc1[Xj\xd4{\x86B\xc1]\xff\x06[}\xb0D\xc1\x8c\xf3-\x12\x8a\x10I\xc1\xa1\xa5$6D)M\xc1S\x9b\xedh|&J\xc1K\xd8\x9e\xa0\xa4\x1d"\xc1\xa5\xb3W\xfa\xec\x8d.\xc1.\tU\xb9\xf4\xc72\xc1?\x9b\x87\x07!2R\xc1H\x1a\x07\'\x98\xcdP\xc1}\x16\xa9\x919\xbaP\xc1\x84\xb5I\xa7\xa8\xd9W\xc1"b\x1f\'\xa3[R\xc1M\xd6eQG4T\xc1\x80\x97i\xe9K\x935\xc1\xa3)\xd7\x9b%}=\xc1\xae\xea\xc3\x84>\x0f8\xc1\t\x14f\xffd\xfbN\xc19\xe0X\xed\x1c\xf3J\xc1\x82\xba\xe9\xb8S\xfcU\xc1aj`o\xf6@U\xc1\xde\xfc\xa1\xaaiHU\xc1\x9f\x1d\xb9\xf9{\x1eN\xc1\xce\x1c\xfdC\xac\xb4M\xc1\xb9\xd6~\xe8\x1b\x81J\xc1\xaf\xee5\xb5%\x04K\xc1;\xae&4\xc0:C\xc1V\xcbo\xfd"\xccG\xc1:8E\x96\xe0\xb3B\xc1\xc6\x81\x97\xdd_-K\xc1\x8e\x0eg \x01\x98E\xc1u\x00I Bk@\xc1\xbfH\xe2\x83\x02n8\xc1\xe2V\xba~\xdc:V\xc1\x1c\xfbK\xa7\xb8nU\xc1\xb9\x1b\xf6.y\x01C\xc1\xdd\xff\xad\xc8=AG\xc1\xe6\xbb\xe8I\xdf\x0cB\xc1\x16\xbe\xc5\x83-\xd0W\xc1\xb4\xa0\xfe\x82\xc0)X\xc1\xa1\xd3\xb6\xab\x1a\x86P\xc1a\xc2\xfb\xd2[&O\xc1\x03\xfa\xe4\xb5\x91{)\xc1\xf2\xdc\xd7[r\xea \xc1`\xc3\xc6\xc7\xe8\xff\x1d\xc1\xd9Rm\xdemV\x1b\xc1x^\xb1\xdf&\x1aW\xc10S\x9bh\xcd^W\xc1\x16\x98\xc1\xd4\x00VV\xc1\x8f\xd3\x0e9\x7f!K\xc1A\x01\x91K\x03\xc0N\xc1\xd4y\xd3\xe8Y,Q\xc15\xf9\x9ajLjF\xc1\xf2\x86\xd1Y\xe5\xcdI\xc1Z]\x97\xcf\x99\xe0F\xc1\xcc\xf2\xe0\x1bBWB\xc1*|"\xda\xf8\xd7R\xc1\r\xa2\xe6\x03\xa7\x13T\xc1\xea\xd6\x8bh\xae\xc7R\xc1\x8dG\x81\xc9\xaccN\xc1\x08\xa5\x99\x95\x19\xceJ\xc1\x1b\xa5@lx\xb0N\xc1\xc1R\x97\x0f\xe2;6\xc1.\x8e\xce\xf5\x1f\x97>\xc1\x012wh\xe1\x9bK\xc1\xa7\xe1l\x18\xa7\x1eQ\xc1)\x93\x7f\xecgW7\xc1\xb7\x1e\xfb"\xf5dH\xc1\xa0\xa0>\xc53jG\xc1\x81s\x8e\xe6\xc7#N\xc1\xe3\xfd\xf9\xa2=\xec,\xc1U\xb1&\x1e\xeb\xbe0\xc1j\x01\x0b\x13\x0c\xb55\xc1\xe8\x94\xb0\xd4\xa7\x0eD\xc1\xc4v\x06\x88lfE\xc1z\x9b\xa0\x19\xc7\xc83\xc1\xd2)Y\xa3\x84\xd7<\xc1=\x83\xd0f\x06\xef1\xc1sy6c"\xe6D\xc1$\x10\x9e\x18\xcc\xf2@\xc1I+\xf7Q\xe8y5\xc1\xb3vV\xa2Gv1\xc1\x7f"yZ\x81M$\xc1\xbf\x96\x14\xa0\x9e(9\xc1\x13\x1b<X\xae\x8e$\xc1\xe1\x8e\xd4*\x93K!\xc1U)4\x94N\xcb3\xc1\r\x80\x99\x8b\x18\x8f=\xc1\xa9\xb5\x95\xe3\xbe\r5\xc1Y\x851\xe9f\xb3\x18\xc1\xac\xe8\xbf\xcd\x1bo(\xc1\x99{+\xd7x\xf50\xc1\x08\x0f\xf9\x086\x03$\xc1UE^\xd5z8)\xc1\xa5.\x15\xfd@\x89?\xc1\x9cz\x13x_m,\xc1\x81fzr*\x84U\xc1\xc3\x04\xce\xb7z\xddF\xc1\xe4\xca\x1bV\xc0\xb0U\xc1\xd7\xdb\x16\xe39\xfe"\xc1\x1e\xae*\xba\x8d\xaf\x1f\xc1\x81k]\xe8T\xa9;\xc1V\tB\x85\x06\xe1S\xc1% \xe0Ap\xf2\x1a\xc1\xc1\x92\x05\xed\x14\xc4>\xc1O-\x9a\xd7JGW\xc1X;e\x124\xa5R\xc1\x00\x07\xfey%-T\xc1\x16\x9d\x02\xeeV\tS\xc1zX\xf9\xd2|\x95F\xc1\x84\xf3\x0cKA\x1bC\xc1\x08\x82\xb88\xdc\xa0"\xc1\x9b2\xec\xc1Df@\xc1\x16\x93U\xc6~}@\xc1o\xa6:\xdb\x05\x93:\xc1\x8b\x90\x836\xb8@T\xc1\x9c1\xbe\x1cN>V\xc1\x8dP\x86h\xb9GU\xc1Eo\x8bTr\xcdP\xc1&\xc3\x03\x95\x86jM\xc1:\xbf\xbb\xef\xd5\x83V\xc1\xbbP\x9a[4\x06W\xc1\r\xfe\xf9\x8f+\xb1V\xc1\x92Y\xf4[:HQ\xc1$\ty"\xa7\x1aJ\xc1\'\x93@\r\xaa\xbdQ\xc1Vd\x19\xc9m\x1cP\xc1A-\x01\xb7\x88\xa9P\xc14s\x81r\x86GR\xc1\xdb\xf9\x85j\x8d\xb15\xc1\xac+\xe8\xff\x08xQ\xc1\xde\xee\x03_\xbb\xb7RA\xbc\x85J-\'\xa5PA.\xc8\x9aO,0CA\xa1\xec\x08\r\xd3 DA)\xedg\xcc\x07 IA\x91\x01\r\x03\x19\xc0FA\xf7/\xbb\x1fXqRA\xe6E\x93\x90Q\xb8RAL})\xee\x8eHQA\xc5\xc8?Q\xbf]TA4\x82\xbe\xda\xedOSA\xad\x9c\xe8\xbbF\xc8MA\xf1\xb7\\\xc3\xaf\xe5OA\xc6\x04j\xe7Q\x98PA\xb5\xf2\x8a-P\xd5TA7W\xdf\x89.\x9dSA&\xe1\x9b\x01\x98\x9eMAG=\x86q\x85\x81MA\xf8\xb2\x9f\n\x1cWJA\xc1j\x14\x80\xfe\x9eMA\xb0@~z\xe3\x90PAl\xc8|Y\xb2\x1dPA\xd1\x1d\xa0\xd3\xddJPA;\xe1-\xc4\x8dVMA\xc5\xa30f>QRA\xa8\xb0}R\xde\xeaPA\\\xfd\x8cz\x8dYKAi\xbf\x83]\xd6\x7f<A\x8daI\xf5\x01\x844A\xe0\x05\x1e\xe1\x1c\xe62A=\x15\xf8\xb11\xd4"A\x12\n^\x8fG~VA\xa1\r\xecU\xf2SWA\xcef\xd2\tu\xd7MA\xce\xc7 \x0c\xb1"NA+\xe4bs\xc0\x9bNAu\xeb*\xc9D\xa6/A\xe0\x03m\t`\x083A\xcc\x95\xe4\'\xed\xc3!A\x07\x154P\x07\x1a%A\x1d\x8c\'\xee\xc51IAJ\x02\xb8\xe5\x13JEA\xb5\xaa\xc2\x08\xc4\x03FA\'\xab\x88}\xdfuHA\xd8\xa0\xc1\xae\xd8SWA\x95\xb5\x9a\xb2|xVA\x02]\xd37\x8f\x8aKA\x8fi\x93K*\xabAA\xd5\x8f*\x99\x9ev3A\x1a\xd1\xf7\xcc\x1d\nBA\xf5\nA\xf6\x1dUGA\x01\xa3\x03\\\'\xadFA\x0e5\xc5t"\xafJA\xe9A\xdd\x0f\x84\nJA\xb5\x8d0y\x1a"CA\x14b\xd4?\xdc\x189A*N\xce\xa0\x83\xaf3A\xf6oCN\x97&<A\xb1\x03\x91\xbe\xfe\xca/A\xd5\x92\xa0\x8aT\xe6RA\xfbN\xefB\xc2\x92QA\xf7\xb6\xf564\x87UA\xb2d\x95\x0b\xca\xfb!A\x8e_\xf6D\x15\x04!A\x97E\xa5\xf5u;2A\xb3!:\xeb\xber&AG\xd5m=\xe4HLA\xbc \x11\x15h\x92IA\xedJ!\xa6<\x04 A\xb8\xa4\xb8\x1d\xf1\x06$AK\xe38z3\xe3QA\xd5i`\xe5\xbf\xeeQAi\xb3\xe76\xb8\xc0;A\xa0\xadM\xd2T19A\xbd\xa3\xb8\x05\xe3\xaaSAi`l\xc6?\rRA{\x96\x1b7_\xb8WA@\xbce]\xce\x02WA\xb2/\xc9\x84*\xa8SA\xe2\xc1\x89\x81x\x97TA\xd47-\xb9\x9e\xf9IAUsf\xe8u\x8cVAe\xa1\xa9\xa9\xac\xe9UA\x84|\xecn\xfa+GAL\xc0Y\xa5\xe1\xa5CA\x02\x8c\x9b\x13C\xff>A\xbf![U\xa0i?A~\xd2\x9dT\x9f\xb68A\x06\xae]\xe0\xd2\xf5TA4^\xa6oK:VA\xf5\x028\x1a\xd4"XA\x1b{\xc0\x8e\xd1\xecWA_;\xdaA\x08\rFA:\xc6\xb6O\xed`6A\xec\xdc\xee\xd9\x8c\xeaBA\xec\xcfP\xc8\x17\xb19A\xb4\r\x19\xb6h43A\xa7@\xaawy\xdf8A\xa1w\x808\xfa\xd3\x1dA\x8b\xba\xf4z\xf0\xbfFAG\xf1\xf1\xec k\x1bA}/\x884w\x920AA\xde\xe5\xbb\x8f\xbf;A7\xd8\xbc\xe3M\x9e"A\xc0B\xbd\xe5aU\x1aA\xab\xb7=\x81\xaf./Ao\x19=\xeb\xb8ZUA\x9b\x07b\x15\xf8wUA\xdbu\xa3k.\x84TAa\x90\xf9\x07\x1euTAz%\t\x0f\xcf\xe4AA\xf5XC:\xac\xf5SA\x80^\xcc\xf7\rzUA\x19\x15;\xf4D\xa7BAv\x02\xee\xb5/\xe1WAb&h\xf7?,<Aw\xfc:\x1a\x86f=A;\x98\n\x9b\x9c5BA\x96uu\xb17\t9A7s\x97\xb6<\x8bAA@\xe4\x91(\xb0\xa7 A0<Bja30A"C\x0b\xaa\xa7\x85\x1dA;\xc3-\xde\xfe>%As% 4\xb5[SA\xc5\x1bf\xc2\xb4\xc6KA\xc8<\x04\xae\xdd\\QA\xc6\xaf\n\xdd\x1741A\xe1R\x8c\x1b\xfd\x84AA\xc9XA\x9d\xdcSFAD0\xf4\xc3\x13\xc2<A\xd2\x11^\xbfV\xa9JAD\xdeB\x89\xda\x96FA\x0b\xf0\xf8U\xf6\x83OA\xb0K}S\xb4BTA\x08\xd8!5!\xfdKA\x16\xf0D\xab\x0f\xf1?A\xa8.\xb1u\xad\x857A\x99\xdaP\xa6\x8f\xed@A\xdf\x8et\xe7`f$A\x00\xe6\xd2e6A5A\x03H~g\xd1,.A\xc3\x942\xb3i\xb9QA$\xfe!\x1et\xeeRA\xf0\x1a\x94\x18\xe0:QAW\xd2\xe4\xb1K\xad0A\x13\xbdljMa-A\xf5\x00\xf2e\x12E7Aje5n\xd9\xe78A\xbe\x90\xc9\xde\xfe\xbdEAK\xc2\xbc-\xb3\xa1QA\xee\x0c!\xda\x1b\x91OA\xf8Opr\x06\x91WA\xd7PA\xa3D\xeaVA\xa4\xed]\xb6\x97\x1c>A\xc4@\xda\x8b\xf0X@Ay\xbc\x9ao\xf7|6A\x01\n\xc8" bUA\x00\x0e\xb3\xaf\xf42UAJ}\x86\x83\xfeTVA\xd1\x8d\x13\xe9m\x18\x1eA\xb4\x1e\x1c\x00\xd6\xef!A\xdf\x83\x08+\x86\xcbUAx\x83G\xf5~\xc1QA\x1a_\xf8\xf0\x88\x9aPAJ\xf5DH\xfaIOA\xf9\x83\x86UW\x15RAv\x03\r=H\xdb\x1fA\x944\xd9YnA\x17A@2~\x87\xca\xbfJA\x12T$AD\xdfJA\x020\xd4\xf4k%GAF\xcf\xf8P\xf2!CA\xe4\xbc\xc2\xf7\xc3\x8e\x1bA\xc0\xf1(v\x80P\'AL\xfbw*3\x157A\x0b\x156\x0eiULA5\xb9\x9dla\xc2MA\x82\x1ao%abPAC\xca\xb7\'=\xc2>A\x0b\xd98\xfe\x9b\x95BAA\xdc\xde\x13\x00z@A=g\xc1`mM?A\xe8`\xab\x0b8|DA\xb8S\xbd\x96\xb1;0A0\x1f\x18\xfa\x00\xb0IA\xd8\xb5\xc7PG\xc7MA\xab\xdb/\xdb\x1a6JA\xf6`ni\xcc\x1b.A7\xe6$\xff\xd1-OA\xb1\x85\xc5J_`JA\x7f\x188\xee$\xd0KA\xf8\xc2UT{xNA\x8f\xd9\xfd\xc0\x98\x16HA\x07:\xa6Z]\xcePA~\xff\x15i"\xa8PAt\x83\x06\x7f\x8aURAv\x93W,TU,Ai\x00m\x7f\xe3\x90\x18A7cR\xef\x01\xa4\x1fAg\n\xd4\x9f\xa5\xe0EA\x8d\x13\x1cCZ\xa7CAv@\xc8\xb3\x92lTA(\xb4C\xc1FvTA\xfb\x03:\x19\xfe.SAU\xca\x8b\xde\xb1\xfcQA\xe2\x0e\x06\xd1\xabSTA\xb6\x9dby\xb7J+A|\xc1\xcd_\xb3\xeb\x1dA\x13\x12}K\x9a\xfb$A\xde4\x08\xc2X\xe0?A\x1e\xce\x19\rZ<0A\xbf\xc6\xcb\xa9S%,A\x8a\x14O!\xbe\xde\x1fAm@ \xe3-\xa5NA\xd2\xd9)W\xab\x02PAP\xd1\xbb"\x9fY7A\xff\xd6u\xd6\xe2\xa7VAKL(\xf8l\xb92A\xacare\x01\x8d\x18Ad43\xf6^BHA\x12[?E\x10\xd4CA\x8c\x89\xb1)v;HAY:C+g\x7fLA\x87PE\xec\x80#JAJ\x1bgZ}\xe81A\xa30\x9a\xad\x18[/AJ\x18P\x93\x0f\xf98Ax\x1cq_\x89 <AD`)\xd9\xb5\x148A\xb5\xc2_\xcd\xc8L=A\xe6\xfa\x9c\xcb\xa5QBA\xcaN\xd1\x01w\xfbWA\xad\x93\xf64B\xbdWA\x10\'\xd1\xd1\xf9\xd8@A2"\x0b\xcc\x08$XAOU\xc2\xd7\x1c\xec6A{\x85\x0c\x8e29FA\xc8\xa9\x0eYp\xc8@A\x046\xd9\x0b\x86bNAw\x0c\xa8\xc8\xc3-<A6\x7f\xc7\xeebgUA\x03\x1dg\xa0\n\x88TA\x89\xd7m\xf5i\x05SA,\x05\xf2I\x7f\x0eSA\xe58\x94\x8a\xebYWA\x84q\xf6\xc6_\xf6BAz:\x04\xads\xe9FA\x91\xbc\x8c\x8e\xf2\x86SAw\xae\xab\x12\xba\xc3SAH=\xfb\xb1\xd0\x16TA\x05\x90\xb8\xf9W\x17SA\x87)l\x89v\xc5\x1cA\\\x00z\xe4\xd1\xa4\x18Av\x82\xb7\x1d;\xd5JA\xf5\xefFE5\x03QA\xe5\x9c\x90\x99\xe2\xd6QA\xa8;bU5kEA\xf1%\xdbU\xa7\xb66A\xda\xb1;:\xb7\xa36A\xbd\x1cW\xe6\\\x85VA9\xec%\x19@}VAB\xee\xea\x98I1WA\xc7\xeb\x9a\\\n~UA`\x93*\x1d\xd0;LA\xde#\xffW\x9f\x8aMA|\xc2\x9a\x9a\xcf{HA\x04\xb9cX\xbb\xa8UAZ\x14\xf3b\xa3\x0bFAh\xec\' \xb59SA\xa0\x9a3r )WA\xd5\x04\x08\xa4\xc8pJA\xa0\x0fp\xab\xb8gEA\njI\xb9TbPA4RT\xba\xf0aCA\xd3\x9f\x15=,\xf9\x1aA'
+p69
+tp70
+bsS'z'
+p71
+g9
+(g10
+(I0
+tp72
+g12
+tp73
+Rp74
+(I1
+(I1286
+tp75
+g31
+I00
+S'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00D)\xca\xf9\xb0MX\xc1D)\xca\xf9\xb0MXA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x83\xc10\xc0R$\xc1\x0f~k\xe1?64\xc1Cr\t\xfcn\n>\xc1\x81\xce9\x05.\xc5C\xc1,\xe0\xff\x00\xb1MH\xc1\xffi\xd1s\t\x92L\xc1\xdaI\x80\xc8\x1fCP\xc1\x1f\xdf\x0e\'\x9e\x0fR\xc1\xff\x97\x1a?t\xa9S\xc1\xaa\xe3\xaa\x8f$\x0cU\xc1\xca\x7f\xe7D\xcc3V\xc1\x17\xf7\xb7\x1e.\x1dW\xc1I\xf2\x96\x86\xbb\xc5W\xc16\x0c\x83\xbb\x9b+X\xc1v\x07}\xbb\x9b+X\xc1h\x10|\x86\xbb\xc5W\xc1\xf8\x08|\x1e.\x1dW\xc1\x04b|D\xcc3V\xc1\xb5E\x0f\x8f$\x0cU\xc1\x887B>t\xa9S\xc1\xb9\xa7\xde%\x9e\x0fR\xc1\x05l.\xc7\x1fCP\xc1\xa1\xc7}q\t\x92L\xc1s\xcd\xe4\xfe\xb0MH\xc1\xe0\xa1X\x03.\xc5C\xc1\x85\xa9\'\xf9n\n>\xc1Q\x9bq\xdf?64\xc1}i\xf7.\xc0R$\xc1\xc5\x83\xc10\xc0R$A\x0f~k\xe1?64ACr\t\xfcn\n>A\x81\xce9\x05.\xc5CA,\xe0\xff\x00\xb1MHA\xffi\xd1s\t\x92LA\xdaI\x80\xc8\x1fCPA\x1f\xdf\x0e\'\x9e\x0fRA\xff\x97\x1a?t\xa9SA\xaa\xe3\xaa\x8f$\x0cUA\xca\x7f\xe7D\xcc3VA\x17\xf7\xb7\x1e.\x1dWAI\xf2\x96\x86\xbb\xc5WA6\x0c\x83\xbb\x9b+XAv\x07}\xbb\x9b+XAh\x10|\x86\xbb\xc5WA\xf8\x08|\x1e.\x1dWA\x04b|D\xcc3VA\xb5E\x0f\x8f$\x0cUA\x887B>t\xa9SA\xb9\xa7\xde%\x9e\x0fRA\x05l.\xc7\x1fCPA\xa1\xc7}q\t\x92LAs\xcd\xe4\xfe\xb0MHA\xe0\xa1X\x03.\xc5CA\x85\xa9\'\xf9n\n>AQ\x9bq\xdf?64A}i\xf7.\xc0R$A\xc5\x83\xc10\xc0R$A\x0f~k\xe1?64ACr\t\xfcn\n>A\x81\xce9\x05.\xc5CA,\xe0\xff\x00\xb1MHA\xffi\xd1s\t\x92LA\xdaI\x80\xc8\x1fCPA\x1f\xdf\x0e\'\x9e\x0fRA\xff\x97\x1a?t\xa9SA\xaa\xe3\xaa\x8f$\x0cUA\xca\x7f\xe7D\xcc3VA\x17\xf7\xb7\x1e.\x1dWAI\xf2\x96\x86\xbb\xc5WA6\x0c\x83\xbb\x9b+XAv\x07}\xbb\x9b+XAh\x10|\x86\xbb\xc5WA\xf8\x08|\x1e.\x1dWA\x04b|D\xcc3VA\xb5E\x0f\x8f$\x0cUA\x887B>t\xa9SA\xb9\xa7\xde%\x9e\x0fRA\x05l.\xc7\x1fCPA\xa1\xc7}q\t\x92LAs\xcd\xe4\xfe\xb0MHA\xe0\xa1X\x03.\xc5CA\x85\xa9\'\xf9n\n>AQ\x9bq\xdf?64A}i\xf7.\xc0R$A\xc5\x83\xc10\xc0R$\xc1\x0f~k\xe1?64\xc1Cr\t\xfcn\n>\xc1\x81\xce9\x05.\xc5C\xc1,\xe0\xff\x00\xb1MH\xc1\xffi\xd1s\t\x92L\xc1\xdaI\x80\xc8\x1fCP\xc1\x1f\xdf\x0e\'\x9e\x0fR\xc1\xff\x97\x1a?t\xa9S\xc1\xaa\xe3\xaa\x8f$\x0cU\xc1\xca\x7f\xe7D\xcc3V\xc1\x17\xf7\xb7\x1e.\x1dW\xc1I\xf2\x96\x86\xbb\xc5W\xc16\x0c\x83\xbb\x9b+X\xc1v\x07}\xbb\x9b+X\xc1h\x10|\x86\xbb\xc5W\xc1\xf8\x08|\x1e.\x1dW\xc1\x04b|D\xcc3V\xc1\xb5E\x0f\x8f$\x0cU\xc1\x887B>t\xa9S\xc1\xb9\xa7\xde%\x9e\x0fR\xc1\x05l.\xc7\x1fCP\xc1\xa1\xc7}q\t\x92L\xc1s\xcd\xe4\xfe\xb0MH\xc1\xe0\xa1X\x03.\xc5C\xc1\x85\xa9\'\xf9n\n>\xc1Q\x9bq\xdf?64\xc1}i\xf7.\xc0R$\xc1\x9e\t\x9f\xf2e\x84LA\xc9\x15.\xb1w\x94HAF\x830\xb5\xa3rKA\xb0\x00\xc9\xa4\x8d\xe9FA\x87\xecc=c\xc7PAf\xa3Z\x17\xae\xfdPAyp\x17\x91\xealNA\xbc\xfc\xb93\xa1\xaaIA\xe1\xc9Y\xad%.JA\xf3&\xee\xe6{\xdfLAC*\x97q9e7AyV\x93n\x05\x04AA\xb4\x81\x0f\xecD6@A\xe4\x00\xc1n\xa2\xa9JA\xa4E\x91\xdf\xed\xee0A\x84n\x02\xdf\xb2\xf9HA )\xa1\x81\x819EAp\x82<jw\xe7IA\xc7\xf3]\xe8x\x842A\x8f\xd8w\x1d3M1A>\xa7\xc7>\x96\xd28A\xb3\x05`\xa4\xe3\x06@A-\x94\xd4A\x88\xbdDA\x9b*\xc3\xf3?`BA\x96N\x8b8Z"%A\x96\xf0\xea:\x99CTA\x13UA\x11\xb0xRA.Z\x918\xa44&A\xf3\xd5\xd2\x8c-\x99\x1dA\xef\x01\x94?\x11\xa6RA\x81\x1e\x0f)\xd8\x05TA\xd7iP\xc1\x03NSA\xaf,T\xfcuW"AJ\xe3M\x89\xa4\xe8FA!\x81t\x9ba\xe2BA\xd1Q\xaf\xbc=UFA;I\x91\x90\x94\xb7AA(D \xca\x9fuVAk\xffbOl7WA\xb9}_\x84MXRA=\xa0\xbd\x02\xcd2RA\xd0\x07d\x07\x89\xc7PA\x0f\xc7\xa4\xda\xd4fPA\xe7R\xf6&\xae\xc2SA\x0f\x1fhQ\xd9\xd8VAo\xceN\xeaZbVA\xe9\x1c\x1cj\xeeq%A[\xadW\xe2\xbf\xdc\x1aA\x8f\x07\xa1\xbbk\xbaTAt9\x86\xd7\x1e)UAEk\x13\xa7\x89\xbbSA\x15s\x90\x91\x11h6A\x95\x11\xfevb\xa9/A\xef\xd4\xcf@\x85"\'A+WB\x0b\xb5\x089A\x94\xe9\xcb\x1a\xcf\xd2<AN\x14\xa9\xfd\xdbn1A\xb5\xec+\xd3c\xff3A\x16\x9f\x9e\xc6\xc2ZVA\xce\x1d\xac_\x11\xfcVA\xff\xd07\xde\x1f4BA.{\x12\xcd\x84\xacWAn\xaa\xb6\xd7M\xceIA\x10L\xf9\xa7@\xf2JA\x0e\xe6 Q\xca\x1fRA\xd3un\xd9\x9a\x03UA\x04\xd1 \xc6\xac\t3A\xb7~f\xb5\xe4\xd95Acd\xa8:\x04<VA\n\n;Y\x85\xe7JA\xa6\xa9\xa6\xd4\x153NA\x1bV@\xf1\x18\xd6MA%)\xce\xd4\xd3zUA\x15\x87\x1f\xad\x98\xeaUA\x82\xf9M\x1f\xe4g>A\r\xde"+1\x016Al`\xa9\xe5\x89!:A\x99y$\xea\xee\xb7FA7\xd0\xa2\xec\x16dTA\xa2\x1e\xd8\xc0\xcbWQA\xdd\xd2\x85\xeb\x95\xb4PA\x14\xb0G\'*\x83NA\xf0\x19\x19\x08P\x8aWA\xa3\xb3\x9aSZ\x15XA\x9fps\x81W\\LA\xd8 F\xf6c\xc5MAF\x9c\x041\xe5\xc3TAHH\xa1\x08\xc8\x00QA\xab\xf4;\xa5\xd9\xb8RA#\xf3\xe7\x11;\x97QA*&G3\xc2;SAU;\r\xbd\xc5\xabOA\xf7ab\x92\xb6 5A\x13\xbf1\xaeT\xebWA\x1d\xde\x97\xc8\xfd\xd8UA\x96\xf5\x8aLy+UA\xe4\xc0\x00\xc9\xa7\x02=A\x8a\xf59\x88\x89/CA\'b\x01\xa7;\x82?A\x06\x84\xc5\x9e \xbc\x1cAI\xea\xcf\xbd\xdb^\x16A\x96\x1b\x0c#\xf1\xa6,Ad\x1a<\x00r\xf8DA\xf2\x1f:\xd3\xab3DA>qdW\xa1\xedGA\x9a\xeff\x8e\xc6\xf4CA\x14\xf1gjDkHA\x04\x00\xe5\x8f\xfb\xdbSA/\xfa\xce3\xdf]EA\xe0\x1fN\xd5]WPA\xd1f\xc5U\xf8\xdePA\xea\xa2\xe2c\xdct9A\xe1-g\xaa\xfd\xf0!A/\xc8c\x9e*\xd0 A\xfc\xc2&l"\xb4UA*F\x044fxUA\x91\xf4\x88(\xe5\xcdTA^\xe2`\xfb\x9a\x96,A\x10\xeb,u\xaf"$A?\xe1\x1a{\\\xd5\x1fA\xef\xdd6\x08N\xafLAs\xa3\r(\xb5G,A\x9d\xbf!>&%BA\xf43\xd4\x17\xa2\xda\x1eA\xffA\xa8\x7feB>A\xda\xc4\xc5kI\xf6=A6-\xb3\x95^\xb0\x18A}W\xe2\xe5\x06\x94NA\xac\xa7\xb9\xc7\x1f\x064A\xe4\xaf\xb7L\xafv/A\xaf\xdb\xaa\x17\n\x0eOA\xc8\xe25\xdf\x95\x88/A\x11\x8cC\xfa\xaf\x08>A$\xd6]\xc8\xdaq7At\xdeDI\xffr"A\xf0Zvt\xc1hBAz\x0b?M?\x14<A\xc8\xb2p\'C\x89FA\ri\xad\xf7\x96\xc1\x17AJ\xe2%\x888\x1d,A\xf2,\x94\xe7{\x0f\x16A\xf5\x95\xb2\xc0\x90$9A\xa7K\x0b9\xfd\x01CAyf\x1bP6:CA\xb7f\x99\x94Q\xf0FAj\xeb\x19\xbb>\xd8>AJ\x1f\x97\xbf\xde\x995A\xf6\xa1\xf9\xf7\x14\xf5%A\xa8"\xfa\xb9\xafR6AO\x16\x84H\x0e\x06BAV\x9f\x1999zBA\x8a\xbc\xeaP\x9e\xedFA)\x8f\x94\x1d\xb71BAl\xed\x9e\x8ej\x11GAy|\x11G&JEA\xd0#\xfd\xd9\x0c\x99.Ab*\xd5\xf7\xab\x97.A\xf8\xf8T\xfe&\xf8/AA\xb7\xab\x0e\xb7\xd9 A7`\x1d\x1a\xd1\x058AJ\xe9-\x88\x7f\xc0/A\xca\x9c\xf8\x01\x1f\xde7AK\xabc\xb73\x861A\x84\xbb>\xb4\x80\x17XA:\xeb\x86\x12\xa9D#An\x11jc\xfb\xfd@A\'\xfb\xb2\x85\x8f]BA4\x10\xa2\xe2d\xfcEA9\x1c\x02\xe4\xe8s A_\x0b\xa1\x0f@\x98 A\xf6\x7f\xf5\xd7~XTA\xcbO\x81\xee>\xb7UA`\xf5\xfd_srTA\x0c\x85g\x0bY\x99NA\x1f\x07\xba\xe5\x90\xc2PAV|>\xfd,\rQA\xba\xeb\x11g\xb9`RA\xef\xd7b\x94\xe2,\'A6\x15k#\xd0\xca#A\xfa8\xdf\xea=\x8d\x1bA9\x0e4\xd8O\xafJA\xb5_\x91\xf8_\x03OA\xe9\xb3\xe9\\\x0f\x15JA9\nHL\x8f\xc3#A\xa7\x06\x91\xb8\x9f+>A\xdd?\x83|fWCA\x88\xbe\xe2\xaaX\x8f4A?\x8b\x1dI\xa0\xcb&AV\\\x03b\xcb\xca5A\x1f\xc2\xed\x92Y\x11"A\xd5~}\xf0UO2A\xd3"d\t\x97&GAm\xf9\x94\xaa7`NAG~7}\xc8QQAP\xa0b}p\xd83AF0\x0b\xbb*HQA\x9e\x19U=\xdc\'OA\'H\xe4b\x1f4+A`\x83*?\x03\xfc\x19AyRE]\xea\x19<A\xbd\xa5\xd9\xbf\xfbvWAr3\x80\x8f!\xafVA\x1f\x1c\x0e\xd9"\x90VA\x1b\xae\x89\xf6\xf5\xb3?A_\xc5\xd1 \x88\xc9JAM\x01\x98\xb9#6KA\xab-\x14\x00z&VA\xc1\xc5\xa0\x8f\xa3\x1eWA\xc0\x19\x18kJ>JA\xb6\x91\xeb\x97#p<A=\xc8\xd8_\xea\xa0JA\xb7\xc4)\xc47JOAVK\xf4\xcc\xe6\x83HAN\xae\xf02\xd9\x9bGAs^!\xc9\xe4\x8bDA\xa9I{\xf3_\xf2IA\xa0k\x82\ru\x045A\xba\x1e\x84\x94r\xfaRA\x03\x1d\x0bE\xdd\x05SA\xe7j\t\\\xf0\xb2EA\xdf\xeay\xd3\xcf\xf6<A\xabf\x8f\xce\xf0\n@AS\x80]#\xdepVA\x10MxT \xa0<A5\xf7\x97\xcb\xebG8A\x96\xa3x\xf3\x1c\xc1TAs\xe0\xf5\xb3#mSA\n"\x99F\xe1JTA\xa3\xbf\x9f\x19\x97,QA\xcec\x1a"\xaa\xb0NAN\xa9\x90\x05\xe9\x05PA\x88\xff\xc1\x85\x8c\xa3RA\xa1\x85/w\r\xf3BAy\xf1\x1d\xf1\xff84A#e\x07\xc6K\xf5RA\xfax\xd9\x8d\x9d\xa9QA\xc4\xf3a\xdd\xbb\x88WAt\xcb\xbe\xfd\xaa\xf8WA\xc5\xc6\xda\x16\xfc\xb0WAQY\xceGm\xfeBAe\xe6\xb7\xb9\xb3/LA\xda\x85\x13\x11.\x95JAf\xf94f}8GA\xae9\xb2\xeb\x9b\xf29A\xc8WldpU1A\xa5u\\\x0c\xbau7A\x19^\x01\xad_\xc7PA\xe2\xc1!\xefN\x91@A\xc5:\xa4\x00;/MAH\xae\xd1\x1a<\x10CA\xe5\xf7\x9d\xa3\x96/AAt\x8fw\xbf\xbaGWA\x83PN\x8e]\x85UA\x11\xacV4\xae\xb4TA"\x0cV\xb5\x89;TAV\xf0\xde\xa1u\xefRAIq\xe00\xfc`JAeU\xdbl\xeeBJAb[5\x9e\x81\xb7EA"(I\x87\xc3\x18SAX\xec}\x9aT(\x1cA<\xc7\xcc\x9f\x86EPA\xc3\xf1\x03\x1a\x81\x83UA+\x0f\x96\xac\x8b\xdaSA\xc8O\x9d\xa1Y\x86MA\xf9\xd7\xff\xe6d\x17<A \xfc\x17\xcduEGA\x06\x1c]U\xa2\xdeMA\xc5J\x9c\xc9\x17\x10NA\x9c=\xfaR\x85\xddVA4\xbe\xe4\xc9\x9e\xd1UA\xc0\xef\xe8\xca\'\x8cEA\x10%\xaf\xbc\xf3u@A\xebF\x1f(\\sQA\x04\xde"\xd7\x03\xceQA\xb9\xc5\x01\\wsUA\\\xdb\x08\xac\x11oUAT\xe99z\xf9\x7fVA\xdc,\xd4|\'pWA\xad\xfcQ\xa7$\xceVAl&\xe0E_\xd8\'A\xe9\xcd\xf3\x8b\xd6\xd7#A1z\xbb\xd4<{TApa?\xc3\xf8\xddUA\x9dw\x12\n\xb5\x1e@A\x9e\xc9?\xae^\xf4BA\xd8\xf2i\xediC=A\x11\x96\r\xf2I\xf6UALZUm\xd7m\'Ak\\X\xfeH\xb26A}"J\x15\xf9;6A\xd2\xc2L\xf3m\xfa\x1cA\xc5f\x81\xca]nWA\x87\xcbI\xa3\xde\xc7VA\xa6\xe8\x8f#\xc3\xb00A\x14\x1f\xd0\xba\x17\xdd\x1eA\x0b9\xbaRk\xdf#A\x9e\x06i\x1c\x0e\x94SA\x83\xd0\xcd._JSAE%c3+\xe4TA\x04\x81\xf3\x1d\x91\x91SA\xda=78\r\x98.A\x8e\xac\x823G/6A\xa4VY\xbd}\x14EA.\xfd5\xf4\x84$IA\x98\xbaW\xe1S\xceCA\xdf\xd6\x7f\xbb<\xf2TA\xf3=\xc6\xb0\xe3\xe69A\xc7j\x94]g\xef3A&"\x13\x08\x80\xd3>AU\x88m%7\xdf1Ah>\xcf\xc0RmAA\x10\x80\xe2\xd0\xd1h:A\xa0\x92\xd2]q\x06@A\x0e\xca\xc0\x14\xd9\xc2!AJ\x9d\xc9`&\x19%A\xff\xff=\x99>\x02WA\x07d\xa5?N\xb4&A\x10\xfbE\x9a;\xac)A6I/\xa8\xb3\xfc\x1fAr*\x11\x0f\xfd\xcdVA\xce\xd1\xbf-4\x8bWA\x84\x85h\xe9\xf4\xdf1A\x00\xdc\xb2 z\xadPA\xaeJ\xa1V\xf3\x82RA\xad\xb0p\x95\xb0GGA\xfe\xaf2\x0b\x9d\x14EAX\x05\xc5,1\xfaPAs)\x8f?\xad\xa9RAt\x80\xc9S\x12\x16NA\x1f\xd4\xe4\'\xc2NPA{\x99\xba\xc9\xcc\x8eMA\x97G\x98\xe3,\xa2PA\xba6\xa7\xb1\x02\xa2QA\x03\xb2\xb9\xc7\xfc)RA\xe0\xba\xef\xf3\xfc`RA\xf3pyx\x0b\xf9WAe\xba\xfe\x01;\xc3@A\xdd\x1eS\xd1M\'@A\xcc\x8eWv\xd7\xda6A\xc3P\xa6b\x95\xe43AS_r:\xeb\xc4@A\x96\xaa\x00\x0e[\x958AT\x82\x1b\xf1L\x19EA\x9c\xe9\xf5\x18\xbc+PA\x98\xcf\x06<\xdb\xa7PA\x8aY\x8a\xf1\xd7\x18MA\xf69\x1e\xe6E\tDA)\xc3\x02%\xa07GA9\xd9\xa6\x12\x0c\x81EA\x88\xb3[\xc0R\xb54Ab\x1bt\x13B\xd8UA\xfc\xed\xf8\xd9\x0b\xd6TAU\x18\xf2\x9f\xda\xd5QA\x92Pl\x96\x1a\x96RA\x9b\xfe0\xad\x81xPA\xfb\xdc\xbd\xe3\xffPQA\xb5\x06\x16\xfc\x1e\x80RA\xcda\xc4%p\x9eSA\x0e\x8f\xc6"\xfd1\x1aA?\'\x0e~\xdc\xdb/A\x9f\xe5"=\x1f\xe2DA\xf3rq\x8b+"NA8yll\xc2\xd1JA\xc2\xa1\x89m\x9b\xa1MA\xda\x93\x0c\xb9\xe0J?A\xa7h&\xff\xcb\xb1EA\x92\xdd\xf6\xd8\x95)VA4\x0e\xc4V\xc9\xb67A\x9a\x80\xa9\xb9\xa0\x01.A\xd27\xe6z\xe3U0An\xd5\xe8\x1a\xc7\xbcHA\xe1\xfa\x8eA*\x9b7A\xafuz\x0f\xb4#FA\xda_\xbc\x14GWJA\x96\xfe\x8a\xd0\x04<OA\xa7\xa8\xa4\x8c\xbc\x86LA#\xcd\x01eb\x9fHA\xb4\xbfg\x80\x1a\x1eTAf`E\xb6\xc8\xaaTA\xa8\xe9\xe5\x1e\xef\'#A\xadQTI\xb7\xe5@A8\xb5\xc4\xa8^qNA\xa7\xffTK\x07\xebNAMR\xd8\x02\x19\x88QA\x8cCK\x96w>PA\xbd\x8b\xeb\xbc\xf1\xbeLA\x90\x1c\xc3\xeb\x97\xa5UA\xee-=m\xec\xf3HA\xc9\x9b\x003\x9bAMA\x9f\xf3\xc9\x92+yIA \xc2\x85\xbf\x99*:A\x85\xaf\x89Q\xc5t2A \xf1/\x00\x82A A+qm\xac\x85\xb8=A\r\xc6Q\xf8\xd5\xf6WA\xb6\x13\xc3\xe1\x9b4XA\xe5\r\x1e\xb1\xe1\x1cEA\xbf\xd9\xac2o\x8a9A~\x00\x9bV\xed*AA4\xc92\xfc\xb3\x00EA\x06e&\xb5\x98\'AA\xb8S\xa2\x02\x01\xdd@A\xc1/\xda\xdc\x19>JA\x10k\xd6wN\xb0JA\xff\xe9o\xc6\x16cUA\x19\xf6\x8c\xe5\xfb\xdaPA6\x82\xba\xc8\x8bkCAW\xb5J\x8e\xb6SSA\xa87t\x92\xdb\xd7FA\x1e\x1d\xea\xa4\xe6\x05RAb\x16\xff\x059~JA\xe5=\xa6\xb26KIA\xec6\xa7\x0f\xc2\x0fTA\x13r%\x7f\x82\xb5SA\x92\x94\xab\x06\n\x85MA\xc4\xf4\xa1\x0b\xa1\x9b9A\xf0\xfb\xd9]1V5A\xa0\x02\xed\xe2\x94\xe7?\xc1\xe9\xc7\xd1\xf6l67\xc1\xb87I\xf3\xacQ@\xc1\xa3\xb2\xda\x80\n}0\xc1\x95\x15\xf7\xb5\xdf\x10-\xc1hn$!\xafr \xc1I\x92;LQ\x19\x1a\xc1\x0c;\xd3\x89O1 \xc1\xe6\xe1]#\xdf\x995\xc1#\x94\x044\x17\xf5%\xc1\xc6\xb0\xea\x92\xafR6\xc1\x01\xad\xc3\x9a\xbb\x04B\xc1\xfe\x90\x9b\x06\xdbvB\xc1\xa7]*b\x9e\xedF\xc1\xf5M\xf2\xac\x845E\xc1\x9b\xb4e\xb6\xb8\xf6B\xc1E\t\xed\xccp\x1cC\xc1\xb4\xabw\xaab\xa4F\xc1\xa1[\x1atr\x98.\xc1\xa3\x07\xd3\x19\xe9\x0c>\xc1\x98N\x81J?\x9cI\xc1\x9e\xba\x05\x9b\xde\xe8H\xc1\x80}\xb0\xa2kWT\xc1\xba\x17\x9cq>\xb7U\xc1N\xd0\xfd\xa3srT\xc1\x0f\x9aK\xec\x04\x9c\x1d\xc1:\x8dQ\x9fF\xb5!\xc1\x8d\xb4\xd9\xb3\x80\x17X\xc1s\x8f&Y\x0c,#\xc1+\xd7P\xd4\xbf\x01A\xc1\xaa7\tL\xce\xb7A\xc1\xb0\x12\xe2\xb7z\x93E\xc1\xa0\x89E\x9e\xd8\x9bG\xc1\'\xc2\xf5a\r\xf3B\xc1\xdfv\xf4K\xe3\x8bD\xc1\x11\xe9T\xf3p\x99N\xc1R\x96\xb7\x07\x8e\xc2P\xc1$\xf8U\xef,\rQ\xc1\xa1`kQ\x9c/&\xc1\x12\xc3\xec\xbbPXR\xc17\xd0nt\x1f4+\xc1a\xd5an\x03\xfc\x19\xc1bl\xe9(%\xc7#\xc1U3\xcc\x9d9\x8d\x1b\xc1\xdc\x8a\xea\\\xcd\x087\xc1h\x0c\xa8\xc0\x9f+>\xc1X\x92IwfWC\xc1"c\t\xc1O\x8e/\xc1\x88:\x14\xa4\x8f\xbf6\xc1\xf1\xb5\xf6t\xa242\xc1\x89\xa3\xfd9\x9b&G\xc1\xc6aw\xe7\xeb\x1d/\xc1+\x1a\xef\xec-\x95J\xc1S\xactb}8G\xc1k\xd5\xe2!dJ4\xc1#\xeb\xb5\x0cy|&\xc1V\xe4\xf4n\xb3\x025\xc1a\xb1\x81\x87\xa3DN\xc1u\x8a5Xn>Q\xc1dk*\xfdc\xc53\xc1\x15\xb9\xea=)HQ\xc1\xc66\x10\x01\xd7\'O\xc1[\x17\xf0+\xd3\x03S\xc1\x1c\xd99D\xdd\x05S\xc1_\xf5s^q\r<\xc1\x7f\xc4\x8a\x8c\xc8wW\xc1\x0f\x16\xf4/\xc2\xaeV\xc1\x0b\x92PLy\x90V\xc1\xb8\xa0\xeeS\xf6\xb3?\xc1\x89\xc6\x8a}Y\x1a+\xc1\x04uJ\x08\xe5\x83H\xc1\x97\xcd\xe2\xcd]\xf2I\xc1Vp\xdd\xf59/M\xc1\xd7\x19\x07\xd3\xb2\xc9J\xc1VP\xc8\x82\xa5*K\xc1\x0e~\x13L\xfb&V\xc1\xfa\xcd\x06\x12\xf5\'W\xc1\xc4\xc7\xada7\x10C\xc1\xcar#\xc1\x98?J\xc1\x1b\x84\xb3T\xe0c<\xc1a\x82\xce=\xeb\xb2E\xc1V\x04\x0eU\xe5\xa0J\xc1\x90\x9ch@1JO\xc1\x15\x15\xbfzF\xab1\xc1\x0f\x88]tLSL\xc1\x11\xa1;\xc9[sV\xc1S\xe1\xba!%h=\xc1\\\xe5|\x17\x97,Q\xc1\xfc\x84\x12\x1b\xaa\xb0N\xc1\x918\x8a\x03\xe9\x05P\xc1~\x91S;)\xd8C\xc1\xb3D\xa2e\xd1WS\xc1m\xdbkV\xbe\x89R\xc1s_\xd2\xdc\xbb\x88W\xc1H_\xcd\xfd\xaa\xf8W\xc1\x8e\x86p\x16\xfc\xb0W\xc1\x9d\xbcb7*\xadP\xc1\xde*\xcc\xa8\r\xacQ\xc1\'\x02\xc3\x17\xb3/L\xc1N\x81\xc6Q\xf9\xdfV\xc1b\xaaAB,gV\xc1Y}\x9d\x1c.74\xc1C\xab|\xa3\xe2\x928\xc1\x08\xa2\x99Vd\x82U\xc1Cq\xac.\x95\xb4T\xc1\xbd\xa1XSX;T\xc1\x8f0\x16i\xf9\xef9\xc1\x08\n\xd2\xa8\n\xefR\xc1\x8b\x1f6\xb5\xc2\x18S\xc1\xab\x9e\x89\xf9mu7\xc1x\x93\x02\xb6\xc3\x1aC\xc1#P\xa3lpY@\xc1&`\x90*\x07\xf4I\xc1\xbe-\xf3\xa6&rM\xc1<\x0f\x0eZh\xa6\x1c\xc1^G\xee\xe4\x95\xa0\x18\xc1j\xe8T-\x84/A\xc1\xb6`\xc0\xaa\x85U8\xc1\xa4\xc4\x04\xde\xd2YF\xc1\x8d\xc8\x94\xaf\xbaGW\xc1\x1c\xcc\xb4\xcd\x00xE\xc1@=\ri\xb1IJ\xc1*6\x84\x99\x88]8\xc1\x00 ?\xf0\xb1\xde%\xc1R\x00\x105e\x17<\xc1L\xa5\xdb\x18\x86EP\xc1\x8b\xbajgY\x86M\xc1\xe9\xad\x89\xb7|\x83U\xc1\x03\x11\x7f\xec\x88\xdaS\xc1\xc1\xe6f\x1b`\xd6U\xc1\xa5\x89G~\x0e\xf1M\xc1\xa8d\x8d\xf3\xbc\x81E\xc1H\xcb\xfa\x17qP1\xc1lD\'-\xee!@\xc1\xdd\x83\x7fH{\xf0Q\xc1`\xa9\xb2\x92\xebZS\xc1G4a\xef\x02\xceQ\xc1\xdb\xa5\xd3\xa5\xf7\xadT\xc1\xf0\\lL\xc4\xf1S\xc1\xb0;{(RgU\xc1\x8b\x98\xdb\xbf \xa1U\xc1\xf3g\x9d\x01\x8f\x1aP\xc1\nc\xa1\x1f\xff\xb1T\xc1\x88\xee\x94\x10`\xbeR\xc1\xea\t\xda5\xfd2T\xc1\x9a\xa8H\x17\tAS\xc1\x9b6.\xe3\xc9ZW\xc1 \x9a\xf0\x92\xc4\x99V\xc1\xcc-z\x98\xcc\x81Q\xc1\xdc\'\x8b\xb1M<Q\xc1F\xe1\xcce\xf5H@\xc1\xa0\xff%ls]E\xc1\xf8\xb7a\xc8\xf8\xbb@\xc1s\x86\x95\x8921D\xc1pu\x9a\xb5\xde\x90U\xc1@\x87\xd3v\xc7\xf3W\xc1\xcb\xe1A<\xbb~W\xc1\x07\x08\x98N\x96\xedW\xc1!\x0c\x8b\xc2l\xe8H\xc1\x9d\x08(\xbe]\x16J\xc1z \x83c\x1fIW\xc18\xca\xb2:\xa9\x81@\xc1\x80&\xe6\x18v\x939\xc1\xcf\x8d\xf3oF\xb7:\xc1\xf8\xf0\x92\xaa\xcedA\xc1g\xe1\x15\x10\xf8\x10 \xc1*\x16\'\xaeQM \xc1\x82\xd5\xa8?\x9dYE\xc1\xf9\x99\xb6\xece\xb4I\xc1\x0c\xcc\xdd\xe1\x14\xd6H\xc1\xf7\xe2Q\xdcP\xdb1\xc1\xd0]\x1b\xaf\x03\xc9,\xc1^\xa4\xf1\x1c\x896\x1f\xc1\xaa\xc3\xc6\xb1\x8bTN\xc1A\xd0\x1a\xb1e~M\xc16\xbc\x94\x1e\xb1\x80P\xc1\xb7\xbfB*\xf5\x02P\xc1$\xdb\x86\xfc\xcc}8\xc1@\xf1\xa0\xc7\t3X\xc1\xeetO\xcb\x0f\xdfO\xc1\xea\xa4\x1fE\x9dYV\xc13\xda"\xc4k)V\xc1\x15b\x81\x19\xe9\xda!\xc1jI\x1b\xa3\xf6\x034\xc1\x1f6o\xafQ\xa3!\xc1\xec2\x96K\xa7\xc80\xc1U\xd3\x89\x00\x18UV\xc14\xfb\x9b\x06\xd7\xc9/\xc1\xc10t\x8a\x11\xb32\xc1\xe4\x04\xeb\xe8\x9ai!\xc1\xd7\x13\xcb\xf9!\x1c8\xc1\x8c\x9f7\x04\x02\xbaT\xc1|f\x01\x94\xfe~$\xc1\xff\n9\xa7\x9e)7\xc1\xaf^\x18\xb6\x13\x95S\xc1\xeb\x83\xf5\xb7\xe2\x18T\xc1\x96A=\xe1\x0f(U\xc1\x87\\\x83\xf8\x1c]R\xc1\x00L\x9da\xe5-/\xc1w\xb2\x0b{\t\x8aJ\xc1\xa9\x84\x8b\\\xe4\xe4F\xc1\xe9XI\xad \x13F\xc1\xd7\xae_F\xc0\xf4I\xc1\x1c\xbf5\xda\xda\x10%\xc1:$\x82\x8b\x80\xdcV\xc1 \xbf\x07qT\x03F\xc1j\x89\x1f\xc0\x84\xf7H\xc1@winD\x9aJ\xc1_W\x94\xe0\xab|7\xc1\x8f\xdf\xb3\xeb\xa6W@\xc14\xcc\xd8\xe4R\x9d=\xc1\x0f\xc7RE\xf8\xdbN\xc1\xa0\xae\xfb\xb7\xa9\x95-\xc1\xfd[\xed\x0c^\xfb!\xc1\xfe\xcd\xb05\xc9@0\xc1\xac\xb6\x8a\x08\xae\x99@\xc1\x87\x83ujd\xd06\xc16\xe6s[yq9\xc1\xb5\xc4\xcc1\r\xbc \xc1R \xe21M\x8eT\xc1\xf3\xe6\xeeTq\xc6S\xc1\xb1\x06\x05B9\x821\xc14\x04\xd8\x80\xa1\xcaJ\xc1\x82\x1f2\xc7\xea\x16M\xc1"h\x18\x84\xfe)U\xc1\x88\xc2L\xf8`UD\xc1\x02\xce\x85\xe1\xebQR\xc10&#\x9b\x99\xffV\xc1`!?\xfcH\xebP\xc1\x9e\x8c\x9d\xefL)V\xc1\xd6g\xda\x96\xd9\xbc8\xc1P\x02\xc4n\xd4\x112\xc1\x8b\xa7\xf7\xf3\xa5@<\xc1`MK\x91*\x18S\xc1\xee}\x03\xfa\xe1\xa5Q\xc1\xf9J;Dh\xccR\xc1\xc3\xa1$\xf4\x8b\xa9U\xc1\xa8\xa0\xdc\x9a\xe9lC\xc1$Ez\xe4\xf7%>\xc1V\xa8X\xd2\xccGF\xc1\x89G\xc6r\x15\xc4C\xc1\xf3\xdc\xf0\xa0a\x9aP\xc1\'J\xde\xf6^\xc99\xc1\x07\x0f9\xd9\xb70.\xc1\x9e,Y\xe1\tX0\xc1\xce\x10U\xcbR9:\xc1\xdd\xb5\x84V\xee5U\xc1i\xd0\x99y\xa5\xceL\xc1\xe3@b\x98\xfd6O\xc1\xf7|\xbd.\xf1|P\xc18\x9e;\xfdZ?@\xc1j#y\xc68\x99\x1e\xc1R\xe3\xf3\xf6\xd9\xe1Q\xc10\xf7v\xafqmT\xc1E\x80G\xbeF\x04N\xc1\xb9)\x89\xb5Fb\x19\xc1\xd7\xe0&\x00\xfbUQ\xc1\xdea\x9f\xe2\xd9\x01S\xc1\x98 O8\xa2\tQ\xc1\xd0\xe3\xd4]I\xe6R\xc12\x17t\x7f\xac\t \xc18X\xe38|t\x1c\xc1\xcf\xe9\x86\x14$#H\xc1\xa1\xdfF\xd6\x93\x8eN\xc1%\x94\x99\xc1\xeb\xbfK\xc1\x06\xfc\x02\x1a1qU\xc1\xe9\xfa+\xeeR>T\xc1\x14\x14\x8f-\xae\xc1!\xc1\xe1\xb1|!9lF\xc1Psk\xec\xec\x04A\xc1Y\xd9\xc1\xde7^G\xc1\xf8\xebf\xfb\xb4\xf0K\xc1\xe9OL\x06S\x0cN\xc1hV\x18\x7f?FB\xc1\x1fbyG\x9bg<\xc1\xcc%\xd1\xb7\xb4\xddA\xc1;\x14I\xb8_\xf6I\xc1F\x00+a\xe8oJ\xc1*%kvAID\xc1|f\x99\xb2\x9e\xadA\xc1\x88\x0e\x18\x86e\xadD\xc1;\x92\x86-\xe2\x84L\xc1%\xe3y}\xd8\xabH\xc19\xd1\x1f\x8bf\xa6K\xc1\x1a\x92\x05\xd8\xb9\xdaF\xc1\xd7N*\xb3\x04fR\xc1fB,.\x9f+S\xc1\xa7\x85\x04\xfa\xc2aQ\xc1O\rh4JVR\xc1\xd1\x01oP\xf9_T\xc1T\xb7+\x9a\xd3\xf8R\xc1$\x01\xb2\x12\xfc\x84S\xc1\xfdv.H\xcf\x95W\xc1)3yx\xbd\xd7W\xc1\xc7\x8d\x0eE\xf2.W\xc1\x89\x1e\xbe\x0cw\xabJ\xc1\xb4\x0e\xc9H>pJ\xc1\x97\xc0h\xfdE9M\xc1GX\xf9b\xa2\xed0\xc1\xc4\x05K\x9a\xf3pO\xc1gr\xc6\xa0\x85\xaeJ\xc1\xde\x80\xce\x02\xd5Z!\xc1\xd6\x9f\xa7iY\xd9%\xc1CS\x1e#\xca9W\xc1\x11\x1f\x872\xb5\x9dQ\xc1\xa6\xa8>\xab\xe4\x86R\xc1\xb5\x17\x9b\x8b\x9eD3\xc1\xf2FB\xa9~\xc01\xc1\xb6\x0c\xb4\x1b\xd3\xb7:\xc1\xbb1fj\xa4\xe8F\xc1Aw\x9a}a\xe2B\xc1\xe9G\xd3\x07DUF\xc1\x14K\x15\xa2\xd8\xb2A\xc1kH\t~\x0b%0\xc1b\xf9\xd8\x02C/!\xc1\x10\xd37\xbc\x12\xcf\x1c\xc1\xc3\x9ba\n\x9e\x08T\xc1\xdb\xd9\x9f\xa8\xc8\x9dU\xc1\x8d.\x00L\xa4\xc6V\xc1bX\x1d\x19\xe1uW\xc1\xc8\xda0W\xad\xa78\xc1\xa5\x02 e\x0faA\xc1\xdd\xba\x9096\x8dC\xc14a\x06\n\r\xbf?\xc1\xfdq\x82\xd6$X<\xc1&u\x17\x1f\xa36&\xc1o@t\xa6o\x99\x1d\xc1M\xacWXeOB\xc1\x99_\x89~\xca\xc6<\xc1;Q\xd6\x8d~\xe3V\xc1yA;\'2JV\xc1o\xd1E\x05\xc4\xfdW\xc1eP\'T[0X\xc1\xb5\x07@\xfbK\xd72\xc1\xe9T0\xb9?\xdb5\xc1\x1b\x94F\xe0\xf7W"\xc18\xc6\xda \x1f\xd48\xc1\x97W[_\xe3\xc40\xc1\x91R4\x9d\x9c\xc73\xc1\x12ra\xf7^\xceI\xc1\xc0\x976\x9b@\xf2J\xc1[n\xd6\x9a\x96QE\xc1%\xe8\xbb\x18*\x00H\xc1\xee\x85\xf1\xe5\x0fG6\xc1\x89\x0f\xa0O\xf8\x9d/\xc1\xaf\xc2\x80{\x1d\xfd&\xc1=\xe2\xe4F\x85\xe7J\xc1\xac\x156\'\xeb2N\xc1\x8a\xc4\x06\xb3\xf6\xd5M\xc1\x03\x917\xbe\xa6\x1dT\xc1\x17:|\xf1v\xd5T\xc1\xe5\xf9\xb91\x9afP\xc1D\xa9\xd9\x92\xde\x00F\xc1C<\x82\xc2\xa16V\xc1\xd0B/m\xd45R\xc1\xddz\x053y\xc7P\xc1\xc5\x0e\xb6\xa6\xd8\xb5P\xc1g\xc6\xd2\xb4\xaf[U\xc1g\xe4\x96q\xe5\x1aV\xc1\xadl\x13\xdf\xedXU\xc1\x028W\x97L\xa8S\xc1o\xee\xc2\xb6\x07\x83N\xc1wK\xdeR\xd9\xe2E\xc1z\x04v\xd6T>B\xc1\xefH\xb6\xf8cGA\xc1\xea&\xc4\xc8\x8e(U\xc1\xdd\xd2Y$\x91TV\xc1\xfd\xa8\x19\xe1\xd5uL\xc1\xc0F\xa5]\x94"J\xc1\xea*\xb9\xdc\xd2\xa8M\xc1\xbb\xcb\xfeI\xe7\xe2;\xc1\xcb\x05\x01/\xc7\x00Q\xc1\xb35\x91\xb7\xd7\xb8R\xc1\xca\xa9Y\x8aG\x97Q\xc1\xdaS3\x11M\xf0E\xc1\x1d\xbd\xe5\xa5\xb8\xa4O\xc1E\xa5\x1e\xfa\xb52"\xc1\xd6\x1f,a*\x05:\xc1\xff\x00`\xbcu\x14S\xc1\x92+\x88\t\xe9LT\xc1K\xb6\xf5\xb1\x97\'.\xc1G\xfd\x92\x84xk4\xc1-\xf0\xfb\xc5\xdee\x1b\xc1\x88\xe1\xea\xfe/\tD\xc1\x7f\x0c\xddb\xd4\xcdS\xc16\x9d\xc3bk_E\xc1i\xc5j\xb6w\x0bE\xc1x4\x99\xcd\xa8\x12A\xc1\x97\x16\xf5\xa6\xf3\x96V\xc1\xfe\x07/\xb9&l:\xc1\xd72\xe1\xc6\x10nU\xc1\xe4\xb84HWWP\xc1\xd4\xb8\xd5\x10\xe1\xf2!\xc1\xf3\x15P\x0e\x17\xe8F\xc1\x10\xa4*41AB\xc1+\xb7\x91\x1c\xe4\xc6B\xc12Q\xf3\xc5Q\xbc4\xc1\xf0\xdb\x8d(\xcc\xb2T\xc1\xbd\x14s\x1d\x00fI\xc1\xb2\xf3X\xb7\xcb\xc0U\xc1\xbc\xd1\xbe\x95\xb8\xaeL\xc1(\xf0\xb7\x16\x11[I\xc1\xd3K\x06\x00\xb4\xc1\x1e\xc1$<H\xc3O&B\xc1\x93\x00\xd7\x13\xe6\xcb \xc1\xda\xb83:\xba\xd9#\xc1\xed\x93\xae\xd0\xbc\xaf \xc1\x95\xea\x18\\\x92\xdc=\xc1\xfbCF\xb4h\xec=\xc1Z\xd2x\x17\xa2\x8b/\xc1\x85\x15\xee\xf7\xaa\x9fN\xc1)(\xe4S\x94\x15.\xc1<\x8b\xc3\xa6t\x8bO\xc1\xe0\xec\x17\rf\x18R\xc1\xe4\xcd\x02\xc0\x05<Q\xc1(\xd5\x85\xeb\x10\xa5@\xc1\xf3>\x87IQ\xb92\xc1hi\xcb<\xebI<\xc1\xccw\xb4\xa2\xb0ONA\x99\x19\xd3Z\xf2\x7fQA\xd8[\xa7\x12M\xcfTA\xe5\x11w\x9d||UA\x9a\x9d\xc8 \xca\xa0SA\xfb\xe7\x83T\x1d\x16SA\x83wz\xe3~\x0c1Aa\xfe\xf93$\xd1\x1eA\x14W0gz\x91%A\x00Hm/OZIA\xd7\xff\xff\xf9"\x07KA\xb3\x07S\xc5n\x8aBA\xd0\xf2\x84H\xe8#FA\x173\xd9\xc2\xe7D@AwK\x07uj*FA\xdd\xe8\x01\r\xcb\x94&A:(t\x1crwPA\xaf\xc1B\x1e\x7f\xb6NAA\xab\xc0/\x1a%QA\r\xa3\x0b\xe7m!RA\x10\x89e\xb2\xad\x01QA,\x00\x80nLzPA\x84\x949\x80;\x98MA\x04\xc0\xc8\x95\xad\xd3RAh\xa0|\x0c\x8d<<A\xd0\x9b3\x80\x9c\x9a6A\x10\x8e\x80\xc0V\x1dFA\x15{X|\x8cVUA\xb25!,\xc8\x06UA\xe3\xd8\r\xe8^&VA\xce\x940\xcb^\xb1UA\xafK\x0c4.\xce!AP\x02\xdao\x94K#A\x8a\x88\x0c\xab\xbc\xe6;A\xb9\x9d\xb5\xfb\xd9\x81 A\x91}G{\xd9\xc41A\x04u8\x1c\x13`FAz\xe9i\xd7\xec\'AA\x02\t^\x96\xe5hBA\x8d\xd4J\xc0Z\r;A\xa6\x95\x9e9\xfe\xb7LA&\xd3\xe8\x12\x8d\x10MA\x9a\xb9Li\xa8\xb6OA\xdf\x9aU\x13\x1d\xe8IAm\x14\xbb\xb5U\xf88A:\xfd"\xbb\\\xd6AA^\xbf(\xd7\xff\xc1+A\xfd\xa5\xd9\xc2r\x84VA\x96!\xfb\xbc\xa7x7AG=\xadB\x7f\xe8#A\xb52H}\xb3A/A\xee\xca\xb9\xa6\xa4 ;A\x8d\xe8\x8a\x1c\xfc\xbc6A\x9d\xc1\n\x0cg\xe8\x1bA\xc1\xf4\xff\xe2O\x884A\xd9$C\xfcL\xf2 Ag\xc1Lm\xe6\x91/Ac\xbe1Vw\xc51A~Dp.\x8c\xc5\x1eA#H\xe5\xa40\x86BA\xddf\xfe\xdb\x85\x96BAT\xeaW\x87\x80&EA\x18f\x0b\x12\xfa\xcbVAV_\\\xeb}\x89WA/\xa6\xf2\'\xcb\nWA\xfc\xa5\xb2\x8c\xfeHTA\xea\xaa\xbe\xdb\x07\xa8SA\x17d;\xeb\xda4TA\x8c\x9b\xa1zd\x87QA\xb6\xcc!\xbc!\x08OA^\xcf\x04S\x08tLA\xaa\x7fX\x0c\x15\x9cNA\xebO\xd6\xc0S\xdeVA\xfcMwv?dWA5\x1ei\x05\xca\x98GA\x16Bq3+\x87HA\xad\xac\xc3^\xa5e-A\xab\xec\xda\x89cm5A\xb4\xad\xf8KT\x80DAT\xbb\x95]s\x8b?A6\x97\xc0ak.AAc-\xa9\xe6Wq1A\xbf\x86Z\x7f\x01\xbd:A\xa2$\xb1\xe1\xa5\xe7EA\x85\x93\'A\xf8&JA&\x08\xef\x1c\xc2\xa9HA\xa7\rv\x8a{JLA<\xb3\xcc\xc8\xf3\xb2KA\r\x15T\x88\xc5\xbcBA8\xd8gQ\x01\xba@A{\xf2\x82\x9e\x98= A\xcb\x887\xe5N\x0f\x1aA\x05^D\xc6\xdf\'BAm\x05Jj\xb7{HA\x9cDy\x98DAEA\xb8<\x9a\xc3\x84JOA?8\x0f\xd3\xc1DNA@\x1fc\xe6+tSA\xed@\xd1\xf6\x03\xe8EAo\x1b\xb6\x9d\xd3UUA\x17\xb9\xf8\xadS\xfbWA\xb0\xe2s\xa2|\xbaWA\xf3\x04P\x08\xe6\x93DA\x88Q;\x0b\x87$XAp8a\xb2\xc4\x07SA^\x94\x1a\x15\xd8\xc8RA\x85\xfe\xa0]1\xd8FA-,\xfe%\xad` A\x98\r)\xcfb\xd6\x1bA4\xaf\x8b\xdafL.A\xc8_\xbbD\x88?TAO\xbf\xfe\xd1\x80\x8c9A\xe8\x15j\xfcEo2A\xdd\x96\xf9/Uc@A\xfe\x9a\x16\x98\xd4\xbb0AqX\xdb\'\xab\xbc<A\xfd\xa5EU3RTAR\xe3\x1b}\xa3\x1eSA\xe3M@Q\x8a\xd8QAG!\x85s\xa4\x9eQAH)\x7f\xe1\xd2\x13JA\xf1\xd6VM\xc5CKA\xc3j\xd5\xdd\xdf\x86\x1bA"\'\xb2:\xe510A\xb4\xf0\xa3\xf8\xe0\x8b4Al\xccLSp\xefQA\x90\xcd\xbf\x16\x1e\x9fFA\xeb\x1dt\x1b\xce\xf9PA\xdc\xdf\x1b\xa6\xa28OAb+\xf7\xc3\xda\xe6\x1aA\xf4{\xf9\xf4\xba\x18VA\x14\xdd\x0er8\xaaNA\x9429\xad\xabjQA\x19x\x94\xf4\xbb\xe2JA\xe7\x10\x8e5f\x9bJA\xd6\x00\xf1\xb2\xba2JA\xcd1\xe6\xf6|\xe40\xc1\x8c*\xac\x9b\x0b\x1c%\xc1\xe3\xd9\'\x93\x19T\x1f\xc1\x06\xf5\xd8\xcb\xb9\xf7F\xc1\x0e\xd5\xd4D[\xbfG\xc1\xfc\xd4\x05\xb0\xc0\xcfK\xc1\x9ex\xf4W\x06\xd6O\xc1\xa2\x86\xb8\x1b\xc1\x12N\xc1v\x98[\x1c\xa6\xf1P\xc1\xd0\xf1w\x07\x19\x9bW\xc1\xc1\xce\xa5"\x986W\xc1P\xc3~\xc6*\x1dW\xc1\xe4\xe9\x14\xd9]OK\xc1)eI\xa8R\'\'\xc1\x0e\xeezB\xf3x!\xc1\x83\x9c\x14\xab\xc2\xc8"\xc1u\xb2q\x8b\xcf\xc3!\xc1k\xca\xee\x11\xda\xe2%\xc1\xd2\xbf\xe5I\x19NR\xc1"\xff\xea\xe9\xa3YS\xc1\xec\x8ez\xa1{\x85S\xc1-\x8f\x90\x9d3\r@\xc1w\x03\x1f\xf5\xbe\xed6\xc1\xde\x82\xb4\xd5\xf5\xbf4\xc1\x08\x8e\xf5\\e\xbc8\xc1&M\x1ew\xb0\xd9A\xc1\xdf\xe7>\x08\x17\xe0%\xc1!\xc2\xe0\x82k\xa4:\xc1\xb5\x13hR\x9c8A\xc1\xfc\x99\x14\x8e\xbf\xca<\xc1eF\x1dI}\x85A\xc1\xf7\x10\x9dp\x18\xc4V\xc1I\xc2\x99\xcbVjW\xc1-\x98\xfd\xc1\xdc\xd6\x1d\xc1*k\xac9\xffh0\xc1\xbd\x1d\x17ycV5\xc16\xe3H\n\x94\x877\xc1S\xa4\x00S\xf9\x84M\xc19w\xabv#\x02P\xc1.)\xd187y4\xc1\x1b\xfd\x8e\xa6\x0f\x94R\xc1\x01\xf0\x9c(\xa9\x08Q\xc1\x8f\x05\xdf\xf6j\xabP\xc1\x91\xfc\x8c\xb8\xac\xd5V\xc1\xf2\xecw,zbV\xc1\xca\xbb\xf3i *L\xc1\x88f\xb02\x7f\x8dG\xc1\xff\xd2\\\x16<9H\xc1}\xcbh\xcd\x14\xac<\xc1\xbf\xc4lR\x92\xdcG\xc15\xe8\x1d\xf7D\xc3G\xc10\x9bP\x17\x88\x02L\xc1\xfe\xf0\x06U\xab\x1d2\xc1@8 1\xe5\x80J\xc1\xbb/0\x95\xa12Q\xc1\x16\xe1-\xb5\xd8\x9fN\xc1\xbb\x8d-E\x04\xcdN\xc1,\xc3)\xf4\x8ewP\xc1\x8b\x9c\xc6\xfcv\xf7J\xc1\xfdZh\xc8\x0fCN\xc1~[\xe5o\xe4\xd4I\xc10U\xe5d\x10\xf4W\xc1>8\xb5\xe0f1X\xc1\xc6\xd1k\xb8I\xdfW\xc1\xe5\x1c \xc0"\x93O\xc1i3>\x88\xab\x87Q\xc1\x9d\xe2\x1e\xb9a\xeaG\xc1&\xdb\xc3e\xc4\xa1I\xc1\x1fR}\x02q%L\xc1z\xe6\x04\x05\x98vM\xc1\xc8q\x1a^\xe9r!\xc1\xdf\xd1AnO\xbb \xc19\xe4\njpQT\xc1\x04\x8b\xae]\x1c\x9cU\xc1\x10\xb1w,\xb9.V\xc1[\xf0+;\x1aCQ\xc1\xac\xe6\xce\xb3=\xfeR\xc1\x93\x85\x8br\xf1\x95Q\xc1yW\xfa\x7f\x03\xbfR\xc1\xbe!\x85Q>\xbdQ\xc1U\x8e8\x1c\xd2\xceQ\xc1\x11\xc0F\xaf\x95\x16\x15\xc1e\x88\x01\xafC\xd1C\xc11\xc4\\\xd9\r\xf3R\xc1\x13\x034\xd5s|T\xc1\xc3W\xdc-\xcd\xebT\xc1\x8d5\xce\xf2\xe6\xc3S\xc1\x84Rq#\x143S\xc1\x98K\x0f\x83(RT\xc1\x11\x8c\xb3\xcb\xc3?V\xc1\xc8\xbe\x11\xa25oT\xc1Z\xc0\xeaNT\xe0@\xc1\xef\xdf\x07\xf5}6:\xc1\xf5\xb8\x7f3\x9d\xebT\xc1\xe1\x96|8X\xb2U\xc1\x06\rkX5NT\xc1Od\x9d\xd6}`\x1b\xc1\xd4\x83;\'\xc8Z0\xc1\xbb\x8bI\xceZ\x80P\xc1GZa\n\xfaI"\xc1>X\xf2@I\x95V\xc1:\x94\n4#{U\xc1\xc4s\xe1K\x9bd@\xc1_\xc4Ph\xb1I4\xc1I\xb8Y\x13\xd6QD\xc1\xb1\x83A\x16\x07\xb2E\xc1\xde\xb8\x95U\xe5\xf40\xc1\xea\xed\x8d\xa0\x05U0\xc1\x0c\x05\xb1 \xa9j\x1b\xc1B\x7f\xef\xac\xc8\xab9\xc1\xc3^E\xda\xb93D\xc1\xfa(\xdb\xa7\xd2AS\xc1\x19\x15{\x16?\xd09\xc1\x86\x89[\xc9y\xabA\xc1\x8a\xfa\x98\xc0r\xadE\xc1*\x98%\x08\xfd\xa2E\xc1L6,!\xa5\x05-\xc1S\xa2\xb4\xae\t\xb0\x18\xc1yN\xaa\xc9?%;\xc1[\x96\x8dtv\xe52\xc1cN\x89\xf2\xf4\x97F\xc1o\x86\x95\x8f\xf5eR\xc1k^\x0c\x87\xf5jO\xc1\x1fr\x04\x1f\xbb\x85W\xc1\xf9\xc79\x06\xe2AA\xc1\xb4\x8b\xc6\x9f\x14~<\xc1\x9fz\xbe\xd5u\x188\xc1\x15\xc7\xf5\xa2jlC\xc1E\x08\xc0\x0c(\xa8@\xc17\x02\xb5\x0e\x97\xa7C\xc1i\xa4@\x93\xcf9C\xc1\x84h\x8e\x9c+\xb0E\xc1\xf9\x12\x0b\xa7s\x13?\xc1\x9d\x0b\x16H\x11\x1eJ\xc1_\x13\xca\x03\x8bE2\xc1*\x9f(}\x0eSR\xc1?\xdd\xde\xd7HLL\xc1\x9f\xfc&\xce?QE\xc1N\xf3\x9e5y\xdbU\xc1g\xe6\xaf%\xbe\x88J\xc1'
+p76
+tp77
+bsS'extractedvertices'
+p78
+Fnan
+sS'segments'
+p79
+Fnan
+sS'numberofelements'
+p80
+I2568
+sb.
Index: /issm/trunk/test/MITgcm/code_4003/shelfice_step_icemass.F
===================================================================
--- /issm/trunk/test/MITgcm/code_4003/shelfice_step_icemass.F	(revision 27034)
+++ /issm/trunk/test/MITgcm/code_4003/shelfice_step_icemass.F	(revision 27035)
@@ -45,8 +45,4 @@
 C     i,j, bi,bj  :: loop indices
       INTEGER bi,bj,i,j
-#ifdef ALLOW_CPL_ISSM
-      _RL  issm_density
-      issm_density = 917.
-#endif /* ALLOW_CPL_ISSM */
 
       IF ( SHELFICEMassStepping ) THEN
@@ -77,6 +73,5 @@
           DO j=1-OLy,sNy+OLy-1
            DO i=1-OLx+1,sNx+OLx-1
-             shelficeMass(i,j,bi,bj) =
-     &        R_shelfIce(i,j,bi,bj) * issm_density
+             shelficeMass(i,j,bi,bj) = -R_shelfIce(i,j,bi,bj) * rhoConst
            ENDDO
           ENDDO
Index: /issm/trunk/test/MITgcm/coupling_rules.txt
===================================================================
--- /issm/trunk/test/MITgcm/coupling_rules.txt	(revision 27034)
+++ /issm/trunk/test/MITgcm/coupling_rules.txt	(revision 27035)
@@ -10,8 +10,8 @@
 xC                     Nx*Ny       Real*8  10001005
 yC                     Nx*Ny       Real*8  10001006
-IceBase                Nx*Ny       Real*8  10001007
-    (in m, 0 is sea level, negative is below sea level, 9999 is no ice,
-     use density 917 kg/m^3)
-OceanMelt              Nx*Ny       Real*8  10001008
+OceanMelt              Nx*Ny       Real*8  10001007
+    melt_mesh[i]=-melt_mesh[i]/rho_ice; //heat flux provided by ocean is in kg/m^2/s
+IceBase                Nx*Ny       Real*8  10001008
+    in m, 0 is sea level, negative is below sea level, 9999 is no ice
 
 >>>> INITIALIZATION FROM SCRATCH
Index: /issm/trunk/test/MITgcm/input_4003/data.shelfice
===================================================================
--- /issm/trunk/test/MITgcm/input_4003/data.shelfice	(revision 27034)
+++ /issm/trunk/test/MITgcm/input_4003/data.shelfice	(revision 27035)
@@ -17,6 +17,4 @@
 #--
  SHELFICEtopoFile='shelficeTopo.Lin.bin',
- SHELFICEmassFile='shelficeMass.Lin.bin',
- SHELFICEMassDynTendFile='shelfice_dMdt.r02.bin',
-#SHELFICEwriteState = .TRUE.,
+ SHELFICEwriteState = .TRUE.,
  &
Index: sm/trunk/test/MITgcm/input_4003/data_uncoupled
===================================================================
--- /issm/trunk/test/MITgcm/input_4003/data_uncoupled	(revision 27034)
+++ 	(revision )
@@ -1,109 +1,0 @@
-# ====================
-# | Model parameters |
-# ====================
-#
-# Continuous equation parameters
- &PARM01
- tRef = 90*-1.9,
- sRef = 90*34.4,
- eosType='JMD95Z',
- HeatCapacity_Cp = 3974.0,
- rhoConst=1030.,
- gravity=9.81,
- viscAr=1.E-3,
- viscAh= 300.,
- no_slip_sides=.FALSE.,
- no_slip_bottom=.FALSE.,
- diffKhT= 10.,
- diffKrT=5.E-5,
- diffKhS= 10.,
- diffKrS=5.E-5,
- bottomDragQuadratic=2.5E-3,
- staggerTimestep = .TRUE.,
- tempAdvScheme=77,
- saltAdvScheme=77,
- vectorInvariantMomentum = .TRUE.,
-# momImplVertAdv=.TRUE.,
-#tempImplVertAdv=.TRUE.,
-#saltImplVertAdv=.TRUE.,
- implicitDiffusion = .TRUE.,
- implicitViscosity = .TRUE.,
- selectImplicitDrag = 2,
- implicitFreeSurface=.TRUE.,
- useRealFreshWaterFlux = .TRUE.,
- exactConserv=.TRUE.,
-# start NLFS (without rstar)
- nonlinFreeSurf=4,
- hFacInf=0.05,
- hFacSup=2.0,
-# end NLFS
- hFacMin=0.10,
-#integr_GeoPot = 1,
- ivdc_kappa = 1.,
- useJamartWetPoints=.TRUE.,
- selectBotDragQuadr=1,
-#bottomVisc_pCell=.TRUE.,
-#-
- readBinaryPrec=64,
- writeBinaryPrec=64,
- useSingleCpuIO=.TRUE.,
-#globalFiles=.TRUE.,
- debuglevel = 2,
- plotLevel = 0,
- &
-
-# Elliptic solver parameters
- &PARM02
- cg2dMaxIters=300,
- cg2dTargetResidual=1.E-11,
-#printResidualFreq=100,
- &
-
-#Time stepping parameters
- &PARM03
-#nIter0=2880,
-#nTimeSteps=288,
-#startTime=0.,
-#endTime=2592000.,
- deltaT=300.0,
- forcing_In_AB  = .FALSE.,
- abEps=0.1,
- pChkptFreq= 2592000.,
- chkptFreq = 2592000.,
- dumpFreq =  86400.,
- monitorFreq= 7200.,
- monitorSelect=1,
- monitorFreq=1800.,
- dumpFreq = 10800.,
-#- for testing purpose:
- nIter0=2898,
- nTimeSteps=20,
-#dumpFreq = 1200.,
- monitorFreq=1.,
- &
-
-# Gridding parameters
- &PARM04
- usingCartesianGrid=.FALSE.,
- usingSphericalPolarGrid=.TRUE.,
- delR=90*10.,
- delX=1*.125,
- delY=200*.0078125,
- xgOrigin = 0.,
- ygOrigin = -75.5,
- pCellMix_select=20,
- pcellMix_delR = 10.,
-#interViscAr_pCell = .TRUE.,
-#interDiffKr_pCell = .TRUE.,
- pCellMix_viscAr = 90*1.E-3,
- pCellMix_diffKr = 90*1.E-4,
-# current default: diffKzT=5.E-5, viscAz=1.E-3,
- &
-
-# Input datasets
- &PARM05
- bathyFile='bathy_flat.bin',
- hydrogThetaFile='temp_ini.bin',	
- hydrogSaltFile ='salt_ini.bin',
-# pSurfInitFile ='etai_ini.bin'
- &
Index: /issm/trunk/test/MITgcm/input_4004/data
===================================================================
--- /issm/trunk/test/MITgcm/input_4004/data	(revision 27035)
+++ /issm/trunk/test/MITgcm/input_4004/data	(revision 27035)
@@ -0,0 +1,100 @@
+# ====================
+# | Model parameters |
+# ====================
+#
+# Continuous equation parameters
+ &PARM01
+ tRef = 90*-1.9,
+ sRef = 90*34.4,
+ eosType='JMD95Z',
+ HeatCapacity_Cp = 3974.0,
+ rhoConst=1030.,
+ gravity=9.81,
+ viscAr=1.E-3,
+ viscAh= 300.,
+ no_slip_sides=.FALSE.,
+ no_slip_bottom=.FALSE.,
+ diffKhT= 10.,
+ diffKrT=5.E-5,
+ diffKhS= 10.,
+ diffKrS=5.E-5,
+ bottomDragQuadratic=2.5E-3,
+ staggerTimestep = .TRUE.,
+ tempAdvScheme=77,
+ saltAdvScheme=77,
+ vectorInvariantMomentum = .TRUE.,
+# momImplVertAdv=.TRUE.,
+#tempImplVertAdv=.TRUE.,
+#saltImplVertAdv=.TRUE.,
+ implicitDiffusion = .TRUE.,
+ implicitViscosity = .TRUE.,
+ selectImplicitDrag = 2,
+ implicitFreeSurface=.TRUE.,
+ useRealFreshWaterFlux = .TRUE.,
+ exactConserv=.TRUE.,
+# start NLFS (without rstar)
+ nonlinFreeSurf=4,
+ hFacInf=0.05,
+ hFacSup=2.0,
+# end NLFS
+ hFacMin=0.10,
+#integr_GeoPot = 1,
+ ivdc_kappa = 1.,
+ useJamartWetPoints=.TRUE.,
+ selectBotDragQuadr=1,
+#bottomVisc_pCell=.TRUE.,
+#-
+ readBinaryPrec=64,
+#writeBinaryPrec=64,
+ useSingleCpuIO=.TRUE.,
+#globalFiles=.TRUE.,
+ debuglevel = 5,
+ plotLevel = 0,
+ &
+
+# Elliptic solver parameters
+ &PARM02
+ cg2dMaxIters=300,
+ cg2dTargetResidual=1.E-11,
+#printResidualFreq=100,
+ &
+
+#Time stepping parameters
+ &PARM03
+ startTime=0.,
+ nTimeSteps=192,
+#endTime=2592000.,
+ deltaT=450.0,
+ forcing_In_AB  = .FALSE.,
+ abEps=0.1,
+ pChkptFreq= 2592000.,
+ chkptFreq = 2592000.,
+ dumpFreq =  450.,
+ monitorFreq=1.,
+ &
+
+# Gridding parameters
+ &PARM04
+ usingCartesianGrid=.FALSE.,
+ usingSphericalPolarGrid=.TRUE.,
+ delR=90*10.,
+ delX=3*.125,
+ delY=200*.0078125,
+ xgOrigin = 0.,
+ ygOrigin = -75.5,
+ pCellMix_select=20,
+ pcellMix_delR = 10.,
+#interViscAr_pCell = .TRUE.,
+#interDiffKr_pCell = .TRUE.,
+ pCellMix_viscAr = 90*1.E-3,
+ pCellMix_diffKr = 90*1.E-4,
+# current default: diffKzT=5.E-5, viscAz=1.E-3,
+ &
+
+# Input datasets
+ &PARM05
+ bathyFile='bathy_flat.bin',
+ hydrogThetaFile='temp_ini.bin',	
+ hydrogSaltFile ='salt_ini.bin',
+# pSurfInitFile ='etai_ini.bin'
+ &
Index: /issm/trunk/test/MITgcm/input_4004/data.diagnostics
===================================================================
--- /issm/trunk/test/MITgcm/input_4004/data.diagnostics	(revision 27035)
+++ /issm/trunk/test/MITgcm/input_4004/data.diagnostics	(revision 27035)
@@ -0,0 +1,69 @@
+# Diagnostic Package Choices
+#-----------------
+# for each output-stream:
+#  filename(n) : prefix of the output file name (only 8.c long) for outp.stream n
+#  frequency(n):< 0 : write snap-shot output every |frequency| seconds
+#               > 0 : write time-average output every frequency seconds
+#  timePhase(n)     : write at time = timePhase + multiple of |frequency|
+#  averagingFreq(n) : frequency (in s) for periodic averaging interval
+#  averagingPhase(n): phase     (in s) for periodic averaging interval
+#  repeatCycle(n)   : number of averaging intervals in 1 cycle
+#  levels(:,n) : list of levels to write to file (Notes: declared as REAL)
+#                 when this entry is missing, select all common levels of this list
+#  fields(:,n) : list of diagnostics fields (8.c) (see "available_diagnostics.log"
+#                 file for the list of all available diag. in this particular config)
+#-----------------
+ &DIAGNOSTICS_LIST
+# diag_mnc     = .FALSE.,
+  dumpAtLast   = .TRUE.,
+  fields(1:13,1) = 'ETAN    ','RSURF   ','oceTAUX ','oceTAUY ',
+                   'oceQnet ','oceFWflx','MXLDEPTH',
+                   'SHIfwFlx','SHIhtFlx','SHIgammT','SHIgammS',
+                   'SHI_mass','SHIuStar',
+#                  'surForcT','surForcS','TFLUX   ','SFLUX   ','oceFreez',
+#                  'TRELAX  ','SRELAX  ',
+#  fields(1,1)='ETAN'
+   filename(1) = 'surfDiag',
+   frequency(1) =  450.,
+#-
+  fields(1:10,2) = 'UVEL    ','VVEL    ','WVEL    ',
+                   'THETA   ','SALT    ','RHOAnoma', 'CONVADJ'
+                   'hFactorC','hFactorW','hFactorS',
+   filename(2) = 'dynDiag',
+  fileFlags(2) = '  h     ',
+  frequency(2) =  450.,
+#-
+  fields(1:7,3) =  'ETAN    ','RSURF   ',
+                   'oceQnet ','oceFWflx',
+                   'SHIfwFlx','SHIhtFlx','SHIuStar',
+#  filename(3) = 'surfInst',
+  frequency(3) =  -450.,
+  timePhase(3) = 0.,
+#-
+  fields(1:8,4)  = 'UVEL    ','VVEL    ','WVEL    ',
+                   'THETA   ','SALT    ',
+                   'hFactorC','hFactorW','hFactorS',
+#  filename(4) = 'dynInst',
+  frequency(4) =  -450.,
+  timePhase(4) = 0.,
+ &
+
+#--------------------
+# Parameter for Diagnostics of per level statistics:
+#--------------------
+#  diagSt_mnc (logical): write stat-diags to NetCDF files (default=diag_mnc)
+#  diagSt_regMaskFile : file containing the region-mask to read-in
+#  nSetRegMskFile   : number of region-mask sets within the region-mask file
+#  set_regMask(i)   : region-mask set-index that identifies the region "i"
+#  val_regMask(i)   : region "i" identifier value in the region mask
+#--for each output-stream:
+#  stat_fName(n) : prefix of the output file name (max 80c long) for outp.stream n
+#  stat_freq(n):< 0 : write snap-shot output every |stat_freq| seconds
+#               > 0 : write time-average output every stat_freq seconds
+#  stat_phase(n)    : write at time = stat_phase + multiple of |stat_freq|
+#  stat_region(:,n) : list of "regions" (default: 1 region only=global)
+#  stat_fields(:,n) : list of selected diagnostics fields (8.c) in outp.stream n
+#                (see "available_diagnostics.log" file for the full list of diags)
+#--------------------
+ &DIAG_STATIS_PARMS
+ &
Index: /issm/trunk/test/MITgcm/input_4004/data.obcs
===================================================================
--- /issm/trunk/test/MITgcm/input_4004/data.obcs	(revision 27035)
+++ /issm/trunk/test/MITgcm/input_4004/data.obcs	(revision 27035)
@@ -0,0 +1,32 @@
+# Open-boundaries
+ &OBCS_PARM01
+ OB_Jnorth=3*200,
+ useOBCSprescribe=.TRUE.,
+#OBWuFile='uVel_obc.bin',
+ OBNvFile='vVel_obc.bin',
+ OBNtFile='temp_obc.bin',
+ OBNsFile='salt_obc.bin',
+ OBCS_u1_adv_T=1,
+ OBCS_u1_adv_S=1,
+#--
+ useOBCSsponge=.TRUE.,
+ useLinearSponge = .TRUE.,
+#- default is =T for these specific switches:
+#OBCSsponge_VatNS=.TRUE.,
+ OBCSsponge_UatNS=.FALSE.,
+#--
+ OBCSprintDiags = .FALSE.,
+ &
+
+# Orlanski parameters (skipped with #undef ALLOW_ORLANSKI)
+#&OBCS_PARM02
+#Cmax=0.45,
+#cVelTimeScale=1000.,
+#&
+
+# Sponge layer parameters
+ &OBCS_PARM03
+ spongeThickness = 10,
+ Vrelaxobcsbound = 864000.,
+ Urelaxobcsbound = 864000.,
+ &
Index: /issm/trunk/test/MITgcm/input_4004/data.pkg
===================================================================
--- /issm/trunk/test/MITgcm/input_4004/data.pkg	(revision 27035)
+++ /issm/trunk/test/MITgcm/input_4004/data.pkg	(revision 27035)
@@ -0,0 +1,6 @@
+# Packages (lines beginning "#" are comments)
+ &PACKAGES
+ useOBCS=.TRUE.,
+ useShelfIce=.TRUE.,
+ useDiagnostics = .TRUE.,
+ &
Index: /issm/trunk/test/MITgcm/input_4004/data.shelfice
===================================================================
--- /issm/trunk/test/MITgcm/input_4004/data.shelfice	(revision 27035)
+++ /issm/trunk/test/MITgcm/input_4004/data.shelfice	(revision 27035)
@@ -0,0 +1,20 @@
+# ===================================
+# | Parameters for SHELFICE package |
+# ===================================
+ &SHELFICE_PARM01
+ SHELFICEconserve = .TRUE.,
+ SHELFICEuseGammaFrict = .TRUE.,
+ SHELFICEDragQuadratic = 0.0015,
+ shiCdrag = 0.0015,
+ SHELFICEselectDragQuadr= 2,
+ SHELFICEMassStepping = .TRUE.,
+#--
+ SHELFICEremeshFrequency = 450.0,
+#- need to satisfy: splitThrs > 1 + mergeThrs / Sdz
+#       with: Sdz = min{ delR(k+1)/delR(k) }_[k=1:Nr-1]
+ SHELFICEsplitThreshold = 1.12,
+ SHELFICEmergeThreshold = 0.10,
+#--
+ SHELFICEtopoFile='shelficeTopo.Lin.bin',
+ SHELFICEwriteState = .TRUE.,
+ &
Index: /issm/trunk/test/MITgcm/input_4004/eedata
===================================================================
--- /issm/trunk/test/MITgcm/input_4004/eedata	(revision 27035)
+++ /issm/trunk/test/MITgcm/input_4004/eedata	(revision 27035)
@@ -0,0 +1,11 @@
+# Example "eedata" file
+# Lines beginning "#" are comments
+#  nTx      :: No. threads per process in X
+#  nTy      :: No. threads per process in Y
+# debugMode :: print debug msg (sequence of S/R calls)
+ &EEPARMS
+ useCoupler=.TRUE.,
+ debugMode=.TRUE.,
+ &
+# Note: Some systems use & as the namelist terminator (as shown here).
+#       Other systems use a / character.
Index: /issm/trunk/test/MITgcm/input_4004/eedata_uncoupled
===================================================================
--- /issm/trunk/test/MITgcm/input_4004/eedata_uncoupled	(revision 27035)
+++ /issm/trunk/test/MITgcm/input_4004/eedata_uncoupled	(revision 27035)
@@ -0,0 +1,10 @@
+# Example "eedata" file
+# Lines beginning "#" are comments
+#  nTx      :: No. threads per process in X
+#  nTy      :: No. threads per process in Y
+# debugMode :: print debug msg (sequence of S/R calls)
+ &EEPARMS
+ useCoupler=.FALSE.,
+ &
+# Note: Some systems use & as the namelist terminator (as shown here).
+#       Other systems use a / character.
Index: /issm/trunk/test/MITgcm/install.sh
===================================================================
--- /issm/trunk/test/MITgcm/install.sh	(revision 27034)
+++ /issm/trunk/test/MITgcm/install.sh	(revision 27035)
@@ -7,9 +7,9 @@
 ################################################################################
 
-# Download source
-git clone --depth=1 https://github.com/MITgcm/MITgcm.git
+# # Download source
+# git clone --depth=1 https://github.com/MITgcm/MITgcm.git
 
-# Move source to 'install' directory
-mv MITgcm install
+# # Move source to 'install' directory
+# mv MITgcm install
 
 ################################################################################
@@ -18,10 +18,14 @@
 #
 
-# # Download source
-# wget https://github.com/MITgcm/MITgcm/archive/refs/tags/checkpoint67x.tar.gz
+# Constants
+#
+VER="68h"
 
-# # Uncompress source
-# tar -xvzf checkpoint67x.tar.gz
+# Download source
+wget https://github.com/MITgcm/MITgcm/archive/refs/tags/checkpoint${VER}.tar.gz
 
-# # Move source to 'install' directory
-# mv MITgcm-checkpoint67x install
+# Uncompress source
+tar -xvzf checkpoint${VER}.tar.gz
+
+# Move source to 'install' directory
+mv MITgcm-checkpoint${VER} install
Index: /issm/trunk/test/MITgcm/tools/lookat_4003.m
===================================================================
--- /issm/trunk/test/MITgcm/tools/lookat_4003.m	(revision 27035)
+++ /issm/trunk/test/MITgcm/tools/lookat_4003.m	(revision 27035)
@@ -0,0 +1,124 @@
+pn='~/mitgcm/slr/components/issm/trunk-jpl/test/NightlyRun/';
+p1=[pn 'RunUncoupled/'];
+p2=[pn 'run/'];
+
+for ts=30:34
+    v1=readbin([p2 'R_shelfIce1_' myint2str(ts,10) '.data'],[3 200]);
+    v2=readbin([p2 'R_shelfIce2_' myint2str(ts,10) '.data'],[3 200]);
+    u=readbin([p2 'U.' myint2str(ts,10) '.data'],[3 200 90]);
+    v=readbin([p2 'V.' myint2str(ts,10) '.data'],[3 200 90]);
+    w=readbin([p2 'W.' myint2str(ts,10) '.data'],[3 200 90]);
+    clf, subplot(511), plot(v1(2,:)), title(ts)
+    subplot(512), plot(v2(2,:)-v1(2,:)), title('draft change')
+    subplot(513), mypcolor(1:200,-1:-1:-90,squeeze(u(2,:,:))'); title('U'), colorbar
+    subplot(514), mypcolor(1:200,-1:-1:-90,squeeze(v(2,:,:))'); title('V'), colorbar
+    subplot(515), mypcolor(1:200,-1:-1:-90,squeeze(w(2,:,:))'); title('W'), colorbar
+    pause
+end
+
+
+    clf
+    subplot(311), mypcolor(v1), title(ts)
+    subplot(312), mypcolor(v2), title(ts)
+    subplot(313), mypcolor(v2-v1)
+    
+for ts=1:10  
+    v1=readbin([p2 'SHICE_fwFlux.' myint2str(ts,10) '.data'],[3 200]);
+    clf
+    subplot(311), mypcolor(v1), title(ts), colorbar
+pause
+end
+
+
+    v2=readbin([p2 'SHICE_fwFlux.' myint2str(ts,10) '.data'],[3 200]);
+
+
+clf
+for ts=5, disp(ts)
+    T=readbin([p2 'T.' myint2str(ts,10) '.data'],[3 200 90]);
+    S=readbin([p2 'S.' myint2str(ts,10) '.data'],[3 200 90]);
+    U=readbin([p2 'U.' myint2str(ts,10) '.data'],[3 200 90]);
+    V=readbin([p2 'V.' myint2str(ts,10) '.data'],[3 200 90]);
+    W=readbin([p2 'W.' myint2str(ts,10) '.data'],[3 200 90]);
+    for k=1:90, disp(k)
+        clf
+        subplot(321), plot(S(2,:,k)), title('S')
+        subplot(322), plot(T(2,:,k)), title('T')
+        subplot(323), plot(U(2,:,k)), title('U')
+        subplot(324), plot(V(2,:,k)), title('V')
+        subplot(325), plot(W(2,:,k)), title('W')
+        pause
+    end
+end
+
+
+clf
+for ts=1:8, disp(ts)
+    T=readbin([p2 'T.' myint2str(ts,10) '.data'],[3 200 90]);
+    S=readbin([p2 'S.' myint2str(ts,10) '.data'],[3 200 90]);
+    U=readbin([p2 'U.' myint2str(ts,10) '.data'],[3 200 90]);
+    V=readbin([p2 'V.' myint2str(ts,10) '.data'],[3 200 90]);
+    W=readbin([p2 'W.' myint2str(ts,10) '.data'],[3 200 90]);
+    clf
+    subplot(321), mypcolor(squeeze(S(2,:,:))'), title('S'), colorbar
+    subplot(322), mypcolor(squeeze(T(2,:,:))'), title('T'), colorbar
+    subplot(323), mypcolor(squeeze(U(2,:,:))'), title('U'), colorbar
+    subplot(324), mypcolor(squeeze(V(2,:,:))'), title('V'), colorbar
+    subplot(325), mypcolor(squeeze(W(2,:,:))'), title('W'), colorbar
+    pause
+end
+
+
+
+
+
+
+ts=8;
+v1=readbin([p2 'R_shelfIce1_' myint2str(ts,10) '.data'],[3 200]);
+v2=readbin([p2 'R_shelfIce2_' myint2str(ts,10) '.data'],[3 200]);
+clf
+subplot(311), mypcolor(v1); title('R_shelfIce1'), colorbar
+subplot(312), mypcolor(v2); title('R_shelfIce2'), colorbar
+subplot(313), mypcolor(v2-v1); title('diff'), colorbar
+
+figure(2)
+clf
+plot(1:200,v1(2,:),'o-',1:200,v2(2,:),'o-',1:200,v2(2,:)-v1(2,:),'o-')
+
+ts=0;
+fld='R_shelfIce1_';
+v1=readbin([p2 fld myint2str(ts,10) '.data'],[3 200]);
+fld='R_shelfIce2_';
+for ts=0:8:184
+    v2=readbin([p2 fld myint2str(ts,10) '.data'],[3 200]);
+    clf
+    subplot(311), mypcolor(v1); title(ts-8), colorbar
+    subplot(312), mypcolor(v2); title(ts), colorbar
+    subplot(313), mypcolor(v2-v1); title('diff'), colorbar
+    pause
+    v1=v2;
+end
+
+fld='surfDiag';
+ts=2;
+v1=rdmds([p1 fld],ts);
+v2=rdmds([p2 fld],ts);
+clf
+fld={'ETAN','RSURF','oceTAUX','oceTAUY','oceQnet','oceFWflx', ...
+     'MXLDEPTH','SHIfwFlx','SHIhtFlx','SHIgammT','SHIgammS', ...
+     'SHI_mass','SHIuStar'};
+for i=1:length(fld)
+    subplot(311), mypcolor(v1(:,:,i)); title(fld{i}), colorbar
+    subplot(312), mypcolor(v2(:,:,i)); title('coupled'), colorbar
+    subplot(313), mypcolor(v2(:,:,i)-v1(:,:,i)); title('coupled-uncoupled'), colorbar
+    pause
+end
+
+fld='Eta';
+ts=1;
+v1=rdmds([p1 fld],ts);
+v2=rdmds([p2 fld],ts);
+clf
+subplot(311), mypcolor(v1); title(fld), colorbar
+subplot(312), mypcolor(v2); title('coupled'), colorbar
+subplot(313), mypcolor(v2-v1); title('coupled-uncoupled'), colorbar
Index: /issm/trunk/test/MITgcm/tools/lookat_4004.m
===================================================================
--- /issm/trunk/test/MITgcm/tools/lookat_4004.m	(revision 27035)
+++ /issm/trunk/test/MITgcm/tools/lookat_4004.m	(revision 27035)
@@ -0,0 +1,44 @@
+clear, close all
+pn='~/mitgcm/slr/components/issm/trunk-jpl/test/NightlyRun/run/';
+figure(1), clf, orient tall, wysiwyg
+for ts=0:4
+    r1=readbin([pn 'R_shelfIce1_' myint2str(ts+1,10) '.data'],[3 200]);
+    r2=readbin([pn 'R_shelfIce2_' myint2str(ts,10) '.data'],[3 200]);
+    subplot(5,1,ts+1), mypcolor(r2-r1); colorbar
+end
+
+for ts=1:5
+    figure(ts+1), clf, orient tall, wysiwyg
+    e=readbin([pn 'Eta.' myint2str(ts,10) '.data'],[3 200]);
+    p=readbin([pn 'PHL.' myint2str(ts,10) '.data'],[3 200]);
+    f=readbin([pn 'SHICE_fwFlux.' myint2str(ts,10) '.data'],[3 200]);
+    h=readbin([pn 'SHICE_heatFlux.' myint2str(ts,10) '.data'],[3 200]);
+    ph=readbin([pn 'PH.' myint2str(ts,10) '.data'],[3 200 90]);
+    clf, subplot(511), mypcolor(e); title(['Eta @ ts=' int2str(ts)]), colorbar
+    subplot(512), mypcolor(p); title('PHL'), colorbar
+    subplot(513), mypcolor(f); title('SHICE fwFlux'), colorbar
+    subplot(514), mypcolor(h); title('SHICE heatFlux'), colorbar
+    subplot(515), mypcolor(1:200,-1:-1:-90,squeeze(ph(2,:,:))'); title('PH'), colorbar
+end
+
+for ts=0:5
+    figure(ts+7), clf, orient tall, wysiwyg
+    r2=readbin([pn 'R_shelfIce2_' myint2str(ts,10) '.data'],[3 200]);
+    if ts<5
+        r1=readbin([pn 'R_shelfIce1_' myint2str(ts+1,10) '.data'],[3 200]);
+    end
+    s =readbin([pn 'S.' myint2str(ts,10) '.data'],[3 200 90]);
+    t =readbin([pn 'T.' myint2str(ts,10) '.data'],[3 200 90]);
+    u =readbin([pn 'U.' myint2str(ts,10) '.data'],[3 200 90]);
+    v =readbin([pn 'V.' myint2str(ts,10) '.data'],[3 200 90]);
+    w =readbin([pn 'W.' myint2str(ts,10) '.data'],[3 200 90]);
+    in=find(~s); s(in)=nan; t(in)=nan;
+    clf,
+    subplot(711), mypcolor(r2); title(['draft @ ts=' int2str(ts)]), colorbar
+    subplot(712), mypcolor(r2-r1); title('draft change'), colorbar
+    subplot(713), pcolorcen(1:200,-1:-1:-90,squeeze(s(2,:,:))'); title('S'), colorbar
+    subplot(714), pcolorcen(1:200,-1:-1:-90,squeeze(t(2,:,:))'); title('T'), colorbar
+    subplot(715), pcolorcen(1:200,-1:-1:-90,squeeze(u(2,:,:))'); title('U'), colorbar
+    subplot(716), pcolorcen(1:200,-1:-1:-90,squeeze(v(2,:,:))'); title('V'), colorbar
+    subplot(717), pcolorcen(1:200,-1:-1:-90,squeeze(w(2,:,:))'); title('W'), colorbar
+end
Index: /issm/trunk/test/NightlyRun/runme.m
===================================================================
--- /issm/trunk/test/NightlyRun/runme.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/runme.m	(revision 27035)
@@ -2,5 +2,5 @@
 %RUNME - test deck for ISSM nightly runs
 %
-%   In a test deck directory (for example, test/NightlyRun) the following 
+%   In a test deck directory (for example, test/NightlyRun) the following
 %   command will launch all existing tests,
 %
@@ -29,4 +29,5 @@
 %                      'update':   update the archive
 %                      'valgrind': check for memory leaks (default value of md.debug.valgrind needs to be changed manually)
+%                      'ncExport': export netCDF file
 %      'stoponerror'   1 or 0
 %
@@ -69,5 +70,5 @@
 %GET procedure {{{
 procedure=getfieldvalue(options,'procedure','check');
-if ~ismember(procedure,{'check','update','valgrind'})
+if ~ismember(procedure,{'check','update','valgrind','ncExport'})
 	disp('runme warning: procedure not supported, defaulting to test ''check''')
 	procedure='check';
@@ -217,4 +218,8 @@
 			end
 
+		%PRODUCE nc files?
+		elseif strcmpi(procedure,'ncExport'),
+			export_netCDF(md, ['test' num2str(id) 'ma.nc'])
+
 		%ELSE: CHECK TEST
 		else,
Index: /issm/trunk/test/NightlyRun/runme.py
===================================================================
--- /issm/trunk/test/NightlyRun/runme.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/runme.py	(revision 27035)
@@ -10,5 +10,5 @@
 from glob import glob
 import os
-import re
+from re import search, split
 from sys import float_info
 from traceback import format_exc
@@ -18,5 +18,5 @@
 try:
     from arch import archread
-except: # ISSM_DIR is not on path
+except:  # ISSM_DIR is not on path
     import devpath
 
@@ -26,4 +26,7 @@
 from IdToName import IdToName
 from parallelrange import parallelrange
+from loadmodel import loadmodel
+from solve import solve
+from importlib import import_module
 
 
@@ -31,5 +34,5 @@
     """RUNME - test deck for ISSM nightly runs
 
-    In a test deck directory (for example, test/NightlyRun) the following 
+    In a test deck directory (for example, test/NightlyRun) the following
     command will launch all existing tests,
 
@@ -41,8 +44,8 @@
 
     Options:
-        -i/--id         Followed by the list of ids or (parts of) test names 
+        -i/--id         Followed by the list of ids or (parts of) test names
                         requested
-        -e/--exclude    Ids or (parts of) test names to be excluded (same 
-                        format as id). Does nothing if 'id' is specified with 
+        -e/--exclude    Ids or (parts of) test names to be excluded (same
+                        format as id). Does nothing if 'id' is specified with
                         different values.
         -b/--benchmark  'all'           : (all of the tests)
@@ -60,4 +63,6 @@
         -p/--procedure  'check'         : run the test (default)
                         'update'        : update the archive
+                        'runFromNC'     : run from an existing nc file
+
 
     Usage:
@@ -80,8 +85,8 @@
 
     TODO:
-    - At '#disp test result', make sure precision of output matches that of 
+    - At '#disp test result', make sure precision of output matches that of
     MATLAB.
-    - Check for failures that do not raise exceptions (for example, 'Standard 
-    exception'; see also jenkins/jenkins.sh). These should be counted as 
+    - Check for failures that do not raise exceptions (for example, 'Standard
+    exception'; see also jenkins/jenkins.sh). These should be counted as
     failures.
     """
@@ -97,5 +102,5 @@
     # }}}
     #GET procedure {{{
-    if procedure not in ['check', 'update']:
+    if procedure not in ['check', 'update', 'runFromNC']:
         print(("runme warning: procedure '{}' not supported, defaulting to test 'check'.".format(procedure)))
         procedure = 'check'
@@ -112,5 +117,5 @@
     #GET ids  {{{
     flist = glob('test*.py')  #File name must start with 'test' and must end by '.py' and must be different than 'test.py'
-    list_ids = [int(re.search(r'\d+',file.split('.')[0]).group()) for file in flist if not file == 'test.py'] # Keep test id only (skip 'test' and '.py')
+    list_ids = [int(search(r'\d+',file.split('.')[0]).group()) for file in flist if not file == 'test.py'] # Keep test id only (skip 'test' and '.py')
 
     i1, i2 = parallelrange(rank, numprocs, len(list_ids))  #Get tests for this cpu only
@@ -128,4 +133,18 @@
     test_ids = test_ids.difference(exclude_ids)
     # }}}
+    if procedure == 'runFromNC':
+        #That is a bamg test
+        test_ids = test_ids.difference([119, 514])
+        # that is smbGEMB format is weird for the test
+        test_ids = test_ids.difference([243, 244, 252, 253])
+        #those are amr runs where the index is missing from fieldnames
+        test_ids = test_ids.difference([462, 463, 464, 465])
+        #test247 solves for thermal and transient which makes it complex to check
+        test_ids = test_ids.difference([247])
+        #test 902 is running two models with different stepping
+        test_ids = test_ids.difference([902])
+        #I have a size issue in 517 needs investigation
+        test_ids = test_ids.difference([517])
+
     #Process Ids according to benchmarks {{{
     if benchmark == 'nightly':
@@ -165,5 +184,9 @@
             os.chdir(root)
             id_string = IdToName(id)
-            exec(compile(open('test{}.py'.format(id)).read(), 'test{}.py'.format(id), 'exec'), globals())
+            print(("----------------running-----------------------"))
+            if procedure == 'runFromNC':
+                Tmod = import_module('test{}'.format(id))
+            else:
+                exec(compile(open('test{}.py'.format(id)).read(), 'test{}.py'.format(id), 'exec'), globals())
 
             #UPDATE ARCHIVE?
@@ -185,5 +208,133 @@
                     archwrite(archive_file, archive_name + '_field' + str(k + 1), field)
                 print(("File {} saved. \n".format(os.path.join('..', 'Archives', archive_name + '.arch'))))
-
+            elif procedure == 'runFromNC':
+                print(("----------------loadingNC-----------------------"))
+                mdl = loadmodel('test{}ma.nc'.format(id))
+                for key in mdl.results.__dict__.keys():
+                    if 'Solution' in key:
+                        solvetype = split('Solution', key)[0]
+
+                #we save the results, scrap them and solve.
+                loaded_res = mdl.results
+                mdl.results = []
+                mdl = solve(mdl, solvetype)
+
+                #we loop on the field_names from the nghtly test
+                for k, fieldname in enumerate(Tmod.field_names):
+                    try:
+                        #first look for indexing
+                        if search(r'\d+$', fieldname):
+                            index = int(search(r'\d+$', fieldname).group()) - 1
+                            fieldname = fieldname[:search(r'\d+$', fieldname).start()]
+                        elif 'FirstStep' in fieldname:
+                            index = 0
+                            fieldname = fieldname[:search('FirstStep', fieldname).start()]
+                        elif 'SecondStep' in fieldname:
+                            index = 1
+                            fieldname = fieldname[:search('SecondStep', fieldname).start()]
+                        elif 'ThirdStep' in fieldname:
+                            index = 2
+                            fieldname = fieldname[:search('ThirdStep', fieldname).start()]
+                        else:
+                            index = 0
+
+                        #Then check if the key exists in the loaded results
+                        try:
+                            reskeys = mdl.results.__dict__[solvetype + 'Solution'][index].__dict__.keys()
+                        except TypeError:
+                            # most probably a steady state so no subscripting
+                            reskeys = mdl.results.__dict__[solvetype + 'Solution'].__dict__.keys()
+                        if fieldname not in reskeys:
+                            sufixes = ["P1bubble", "P1bubbleCondensed", "LliboutryDuval", "CuffeyTemperate", "SSA", "HO", "FS", "P1xP", "P2xP",
+                                       'MINI', 'MINIcondensed', 'TaylorHood', 'XTaylorHood', 'LATaylorHood', 'CrouzeixRaviart', 'LACrouzeixRaviart']
+                            namedifs = {'Misfits': 'J',
+                                        'D': 'DamageDbar',
+                                        'F': 'DamageF',
+                                        'MaterialsRheologyB': 'MaterialsRheologyBbar',
+                                        'SedimentWaterHead': 'SedimentHead',
+                                        'EplWaterHead': 'EplHead',
+                                        'SedimentWaterHeadSubstep': 'SedimentHeadSubstep',
+                                        'EplWaterHeadSubstep': 'EplHeadSubstep',
+                                        'Volume': 'IceVolume',
+                                        'Bed': 'Base',
+                                        'SMB': 'SmbMassBalance'}
+
+                            if fieldname in namedifs.keys():
+                                #Some fields are not consistent
+                                fieldname = namedifs[fieldname]
+                            elif any([suf in fieldname for suf in sufixes]):
+                                #some test have loops that mess up with naming
+                                try:
+                                    sufix = sufixes[np.squeeze(np.where([suf in fieldname for suf in sufixes]))]
+                                except TypeError:
+                                    #probably severalmatches, we take the last one which should be the good one (Needs to be controled in the list above)
+                                    sufix = sufixes[np.squeeze(np.where([suf in fieldname for suf in sufixes]))[-1]]
+                                fieldname = fieldname[:search(sufix, fieldname).start()]
+                            elif fieldname.endswith("P") and index == 1:
+                                #we are looking for P2 but 2 as been considered as an index and so shifted by -1
+                                fieldname = fieldname[:-1]
+                            else:
+                                # could be that the index selected above is part of the name
+                                fieldname = fieldname + str(index + 1)
+                        try:
+                            field = mdl.results.__dict__[solvetype + 'Solution'][index].__dict__[fieldname]
+                            loaded_field = loaded_res.__dict__[solvetype + 'Solution'][index].__dict__[fieldname]
+                        except TypeError:
+                            # most probably a steady state so no subscripting
+                            try:
+                                field = mdl.results.__dict__[solvetype + 'Solution'].__dict__[fieldname]
+                                loaded_field = loaded_res.__dict__[solvetype + 'Solution'].__dict__[fieldname]
+                            except KeyError:
+                                print("WARNING: {}{} does not exist and checking will be skipped".format(fieldname, index + 1))
+                                continue
+                        except KeyError:
+                            print("WARNING: {}{} does not exist and checking will be skipped".format(fieldname, index + 1))
+                            continue
+
+                        ref = Tmod.field_values[k]
+                        #Get tolerance
+                        tolerance = Tmod.field_tolerances[k]
+                        #compute differences for the results computed from the nc file
+                        error_diff = np.amax(np.abs(ref - field), axis=0) / (np.amax(np.abs(ref), axis=0) + float_info.epsilon)
+                        if not np.isscalar(error_diff):
+                            error_diff = error_diff[0]
+
+                        #compute the differences for the results of the nc file
+                        load_diff = np.amax(np.abs(np.squeeze(ref) - loaded_field), axis=0) / (np.amax(np.abs(np.squeeze(ref)), axis=0) + float_info.epsilon)
+                        if not np.isscalar(load_diff):
+                            load_diff = load_diff[0]
+
+                        #disp test result
+                        if (np.any(error_diff > tolerance) or np.isnan(error_diff)) and (np.any(load_diff > tolerance) or np.isnan(load_diff)):
+                            if abs(error_diff - load_diff) < tolerance:
+                                print(('WARNING difference: {:7.2g} > {:7.2g} test id: {} field: {}{} differs from computation but equal to saved results'.format(error_diff, tolerance, id, fieldname, index + 1)))
+                            else:
+                                print(('ERROR difference: {:7.2g} > {:7.2g} test id: {} field: {}{} is false in both loaded and computed results'.format(error_diff, tolerance, id, fieldname, index + 1)))
+                                errorcount += 1
+                                erroredtest_list.append(id)
+                        elif (np.any(error_diff > tolerance) or np.isnan(error_diff)):
+                            print(('ERROR   difference: {:7.2g} > {:7.2g} test id: {} test name: {} field: {}{}'.format(error_diff, tolerance, id, id_string, fieldname, index + 1)))
+                            errorcount += 1
+                            erroredtest_list.append(id)
+                        elif (np.any(load_diff > tolerance) or np.isnan(load_diff)):
+                            print(('SAVEERROR difference: {:7.2g} > {:7.2g} test id: {} test name: {} saved result : {}{}'.format(load_diff, tolerance, id, id_string, fieldname, index + 1)))
+                            errorcount += 1
+                            erroredtest_list.append(id)
+                        else:
+                            print(('SUCCESS difference: {:7.2g} < {:7.2g} test id: {} test name: {} field: {}{}'.format(error_diff, tolerance, id, id_string, fieldname, index + 1)))
+                        #disp only if errors for the results
+
+                    except Exception as message:
+                        #something went wrong, print failure message:
+                        print((format_exc()))
+                        if output == 'nightly':
+                            fid = open(os.path.join(ISSM_DIR, 'nightlylog', 'pythonerror.log'), 'a')
+                            fid.write('%s' % message)
+                            fid.write('\n------------------------------------------------------------------\n')
+                            fid.close()
+                            print(('FAILURE difference: N/A test id: {} test name: {} field: {}'.format(id, id_string, fieldname)))
+                        else:
+                            print(('FAILURE difference: N/A test id: {} test name: {} field: {}'.format(id, id_string, fieldname)))
+                            raise RuntimeError(message)
             #ELSE: CHECK TEST
             else:
Index: /issm/trunk/test/NightlyRun/test101.py
===================================================================
--- /issm/trunk/test/NightlyRun/test101.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test101.py	(revision 27035)
@@ -2,9 +2,9 @@
 from model import *
 from socket import gethostname
-from triangle import *
-from setmask import *
-from parameterize import *
-from setflowequation import *
-from solve import *
+from triangle import triangle
+from setmask import setmask
+from parameterize import parameterize
+from setflowequation import setflowequation
+from solve import solve
 from massfluxatgate import massfluxatgate
 from generic import generic
Index: /issm/trunk/test/NightlyRun/test124.js
===================================================================
--- /issm/trunk/test/NightlyRun/test124.js	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test124.js	(revision 27035)
@@ -22,7 +22,7 @@
 	'Vx3','Vy3','Vel3','Pressure3','Bed3','Surface3','Thickness3'];
 field_tolerances=[
-	2e-09,3e-9,3e-9,3e-9,1e-13,1e-12,1e-12,
-	2e-09,3e-9,3e-9,3e-9,1e-10,1e-10,1e-10,
-	3e-09,3e-9,3e-9,3e-9,1e-10,1e-10,1e-10];
+	2e-09,3e-9,3e-9,3e-9,1e-13,1e-12,7e-8,
+	2e-09,3e-9,3e-9,3e-9,1e-10,1e-10,2e-7,
+	3e-09,3e-9,3e-9,3e-9,1e-10,1e-10,3e-7];
 field_values=[
 	(md.results.TransientSolution[0](1).Vx),
Index: /issm/trunk/test/NightlyRun/test124.m
===================================================================
--- /issm/trunk/test/NightlyRun/test124.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test124.m	(revision 27035)
@@ -21,7 +21,7 @@
 	'Vx3','Vy3','Vel3','Pressure3','Bed3','Surface3','Thickness3'};
 field_tolerances={...
-	2e-09,3e-9,3e-9,3e-9,1e-13,1e-12,1e-12,...
-	2e-09,3e-9,3e-9,3e-9,1e-10,1e-10,1e-10,...
-	3e-09,3e-9,3e-9,3e-9,1e-10,1e-10,1e-10};
+	2e-09,3e-9,3e-9,3e-9,1e-13,1e-12,7e-8,...
+	2e-09,3e-9,3e-9,3e-9,1e-10,1e-10,2e-7,...
+	3e-09,3e-9,3e-9,3e-9,1e-10,1e-10,3e-7};
 field_values={...
 	(md.results.TransientSolution(1).Vx),...
Index: /issm/trunk/test/NightlyRun/test124.py
===================================================================
--- /issm/trunk/test/NightlyRun/test124.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test124.py	(revision 27035)
@@ -27,7 +27,7 @@
                'Vx2', 'Vy2', 'Vel2', 'Pressure2', 'Bed2', 'Surface2', 'Thickness2',
                'Vx3', 'Vy3', 'Vel3', 'Pressure3', 'Bed3', 'Surface3', 'Thickness3']
-field_tolerances = [2e-09, 3e-9, 3e-9, 3e-9, 1e-13, 1e-12, 1e-12,
-                    2e-09, 3e-9, 3e-9, 3e-9, 1e-10, 1e-10, 1e-10,
-                    3e-09, 3e-9, 3e-9, 3e-9, 1e-10, 1e-10, 1e-10]
+field_tolerances = [2e-09, 3e-9, 3e-9, 3e-9, 1e-13, 1e-12, 7e-8,
+                    2e-09, 3e-9, 3e-9, 3e-9, 1e-10, 1e-10, 2e-7,
+                    3e-09, 3e-9, 3e-9, 3e-9, 1e-10, 1e-10, 3e-7]
 field_values = [md.results.TransientSolution[0].Vx,
                 md.results.TransientSolution[0].Vy,
Index: /issm/trunk/test/NightlyRun/test127.m
===================================================================
--- /issm/trunk/test/NightlyRun/test127.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test127.m	(revision 27035)
@@ -1,11 +1,11 @@
-%Test Name: SquareShelfConstrainedStressMLHO2d
+%Test Name: SquareShelfConstrainedStressMOLHO2d
 md=triangle(model(),'../Exp/Square.exp',50000.);
 md=setmask(md,'all','');
 md=parameterize(md,'../Par/SquareShelfConstrained.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.cluster=generic('name',oshostname(),'np',2);
 
 %output
-%FIXME compute the stress components for MLHO
+%FIXME compute the stress components for MOLHO
 md.stressbalance.requested_outputs={'default','VxSurface','VySurface','VxShear','VyShear','VxBase','VyBase','MassFlux1','MassFlux2','MassFlux3','MassFlux4','MassFlux5','MassFlux6'};
 %md.stressbalance.requested_outputs={'default','DeviatoricStressxx','DeviatoricStressyy','DeviatoricStressxy','MassFlux1','MassFlux2','MassFlux3','MassFlux4','MassFlux5','MassFlux6'};
@@ -18,5 +18,5 @@
 	massfluxatgate('name','MassFlux6','profilename',['../Exp/MassFlux6.exp'],'definitionstring','Outputdefinition6')...
 	};
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Stressbalance');
 
Index: /issm/trunk/test/NightlyRun/test127.py
===================================================================
--- /issm/trunk/test/NightlyRun/test127.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test127.py	(revision 27035)
@@ -1,3 +1,3 @@
-#Test Name: SquareShelfConstrainedStressMLHO2d
+#Test Name: SquareShelfConstrainedStressMOLHO2d
 from model import *
 from socket import gethostname
@@ -9,13 +9,13 @@
 from massfluxatgate import massfluxatgate
 from generic import generic
-from SetMLHOBC import SetMLHOBC
+from SetMOLHOBC import SetMOLHOBC
 
 md = triangle(model(), '../Exp/Square.exp', 50000)
 md = setmask(md, 'all', '')
 md = parameterize(md, '../Par/SquareShelfConstrained.py')
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.cluster = generic('name', gethostname(), 'np', 2)
 #outputs
-#FIXME compute the stress components for MLHO
+#FIXME compute the stress components for MOLHO
 md.stressbalance.requested_outputs = ['default', 'VxSurface', 'VySurface', 'VxShear', 'VyShear', 'VxBase', 'VyBase', 'MassFlux1', 'MassFlux2', 'MassFlux3', 'MassFlux4', 'MassFlux5', 'MassFlux6']
 #md.stressbalance.requested_outputs = ['default', 'DeviatoricStressxx', 'DeviatoricStressyy', 'DeviatoricStressxy', 'MassFlux1', 'MassFlux2', 'MassFlux3', 'MassFlux4', 'MassFlux5', 'MassFlux6']
@@ -26,5 +26,5 @@
                                    massfluxatgate('name', 'MassFlux5', 'profilename', '../Exp/MassFlux5.exp', 'definitionstring', 'Outputdefinition5'),
                                    massfluxatgate('name', 'MassFlux6', 'profilename', '../Exp/MassFlux6.exp', 'definitionstring', 'Outputdefinition6')]
-md = SetMLHOBC(md)
+md = SetMOLHOBC(md)
 md = solve(md, 'Stressbalance')
 
Index: /issm/trunk/test/NightlyRun/test128.m
===================================================================
--- /issm/trunk/test/NightlyRun/test128.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test128.m	(revision 27035)
@@ -1,11 +1,11 @@
-%Test Name: SquareShelfConstrainedTranMLHO2d
+%Test Name: SquareShelfConstrainedTranMOLHO2d
 md=triangle(model(),'../Exp/Square.exp',150000.);
 md=setmask(md,'all','');
 md=parameterize(md,'../Par/SquareShelfConstrained.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.cluster=generic('name',oshostname(),'np',3);
 md.transient.requested_outputs={'IceVolume','VxShear','VyShear','VxBase','VyBase','VxSurface','VySurface'};
 
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Transient');
 
Index: /issm/trunk/test/NightlyRun/test128.py
===================================================================
--- /issm/trunk/test/NightlyRun/test128.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test128.py	(revision 27035)
@@ -1,4 +1,5 @@
-#Test Name: SquareShelfConstrainedTranMLHO2d
+#Test Name: SquareShelfConstrainedTranMOLHO2d
 from model import *
+from SetMOLHOBC import SetMOLHOBC
 from socket import gethostname
 from triangle import *
@@ -12,14 +13,14 @@
 md = setmask(md, 'all', '')
 md = parameterize(md, '../Par/SquareShelfConstrained.py')
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.cluster = generic('name', gethostname(), 'np', 3)
 md.transient.requested_outputs = ['IceVolume','VxSurface','VySurface','VxShear','VyShear','VxBase','VyBase']
 
-md = SetMLHOBC(md);
+md = SetMOLHOBC(md)
 md = solve(md, 'Transient')
 
 #Fields and tolerances to track changes
-field_names = ['Vx1', 'Vy1', 'Vel1', 'Pressure1', 'VxShear1', 'VyShear1', 'VxBase1', 'VyBase1', 'VxSurface1', 'VySurface1', 'Bed1', 'Surface1', 'Thickness1', 'Volume1', 
-            'Vx2', 'Vy2', 'Vel2', 'Pressure2', 'VxShear2', 'VyShear2', 'VxBase2', 'VyBase2', 'VxSurface2', 'VySurface2', 'Bed2', 'Surface2', 'Thickness2', 'Volume2', 
+field_names = ['Vx1', 'Vy1', 'Vel1', 'Pressure1', 'VxShear1', 'VyShear1', 'VxBase1', 'VyBase1', 'VxSurface1', 'VySurface1', 'Bed1', 'Surface1', 'Thickness1', 'Volume1',
+            'Vx2', 'Vy2', 'Vel2', 'Pressure2', 'VxShear2', 'VyShear2', 'VxBase2', 'VyBase2', 'VxSurface2', 'VySurface2', 'Bed2', 'Surface2', 'Thickness2', 'Volume2',
             'Vx3', 'Vy3', 'Vel3', 'Pressure3', 'VxShear3', 'VyShear3', 'VxBase3', 'VyBase3', 'VxSurface3', 'VySurface3', 'Bed3', 'Surface3', 'Thickness3', 'Volume3']
 field_tolerances = [1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13,
Index: /issm/trunk/test/NightlyRun/test129.m
===================================================================
--- /issm/trunk/test/NightlyRun/test129.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test129.m	(revision 27035)
@@ -1,7 +1,7 @@
-%Test Name: SquareShelfConstrainedRestartTranMLHO2d
+%Test Name: SquareShelfConstrainedRestartTranMOLHO2d
 md=triangle(model(),'../Exp/Square.exp',150000.);
 md=setmask(md,'all','');
 md=parameterize(md,'../Par/SquareShelfConstrained.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.cluster=generic('name',oshostname(),'np',1);
 md.transient.requested_outputs={'IceVolume','TotalSmb','VxShear','VyShear','VxBase','VyBase','VxSurface','VySurface'};
@@ -14,5 +14,5 @@
 md.settings.output_frequency=2;
 
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Transient');
 md2=solve(md,'Transient','restart',1);
Index: /issm/trunk/test/NightlyRun/test129.py
===================================================================
--- /issm/trunk/test/NightlyRun/test129.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test129.py	(revision 27035)
@@ -1,5 +1,6 @@
-#Test Name: SquareShelfConstrainedRestartTranMLHO2d
+#Test Name: SquareShelfConstrainedRestartTranMOLHO2d
 from model import *
 from socket import gethostname
+from SetMOLHOBC import SetMOLHOBC
 from triangle import *
 from setmask import *
@@ -13,5 +14,5 @@
 md = setmask(md, 'all', '')
 md = parameterize(md, '../Par/SquareShelfConstrained.py')
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.cluster = generic('name', gethostname(), 'np', 1)
 md.transient.requested_outputs = ['IceVolume', 'TotalSmb', 'VxShear','VyShear','VxBase','VyBase','VxSurface','VySurface']
@@ -23,5 +24,5 @@
 md.timestepping.final_time = 19
 md.settings.output_frequency = 2
-md = SetMLHOBC(md);
+md = SetMOLHOBC(md)
 
 md = solve(md, 'Transient')
Index: /issm/trunk/test/NightlyRun/test134.m
===================================================================
--- /issm/trunk/test/NightlyRun/test134.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test134.m	(revision 27035)
@@ -5,5 +5,7 @@
 md = md.sampling.setparameters(md,2e5,1);
 md.sampling.seed = 100;
+md.sampling.phi = zeros(md.mesh.numberofvertices,1);
 md.cluster=generic('name',oshostname(),'np',1);
+md.cluster.np=1;
 md=solve(md,'smp');
 
Index: /issm/trunk/test/NightlyRun/test2002.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2002.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2002.m	(revision 27035)
@@ -3,5 +3,13 @@
 %mesh earth:
 md=model;
-md.mesh=gmshplanet('radius',6.371012*10^3,'resolution',700.);
+
+% %Generate and save mesh
+% SlcMesh=gmshplanet('radius',6.371012*10^3,'resolution',700.);
+% save('../Data/SlcTestMesh.mat','SlcMesh');
+% md.mesh=SlcMesh;
+
+%Load precomputed mesh
+load('../Data/SlcTestMesh.mat');
+md.mesh=SlcMesh; %700 km resolution mesh
 
 %Geometry for the bed, arbitrary thickness of 100: 
@@ -83,5 +91,5 @@
 md.transient.ismasstransport=1;
 md.transient.isslc=1;
-md.solidearth.requested_outputs={'Sealevel','Bed'};
+md.solidearth.requested_outputs={'Sealevel','Bed','SealevelBarystaticIceLoad', 'SealevelBarystaticIceArea', 'SealevelBarystaticIceWeights'};
 
 % max number of iteration reverted back to 10 (i.e., the original default value)
Index: /issm/trunk/test/NightlyRun/test2002.py
===================================================================
--- /issm/trunk/test/NightlyRun/test2002.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2002.py	(revision 27035)
@@ -1,6 +1,6 @@
 #Test Name: EarthSlc
 import numpy as np
-
-from gmshplanet import *
+import pickle
+#from gmshplanet import *
 from gmtmask import *
 from lovenumbers import *
@@ -12,5 +12,13 @@
 
 md = model()
-md.mesh = gmshplanet('radius', 6.371012 * 1e3, 'resolution', 700.) # 700 km resolution mesh
+
+## Generate and save mesh (need to uncomment import of gmshplanet as well)
+# md.mesh = gmshplanet('radius', 6.371012 * 1e3, 'resolution', 700.) # 700 km resolution mesh
+# with open('../Data/SlcTestMesh.pkl', 'wb') as slc_test_mesh_file:
+#     pickle.dump(md.mesh, slc_test_mesh_file)
+
+# Load precomputed mesh
+with open('../Data/SlcTestMesh.pkl', 'rb') as slc_test_mesh_file:
+    md.mesh = pickle.load(slc_test_mesh_file)
 
 # Geometry for the bed, arbitrary thickness of 100
@@ -97,5 +105,5 @@
 md.transient.ismasstransport = 1
 md.transient.isslc = 1
-md.solidearth.requested_outputs = ['Sealevel', 'Bed']
+md.solidearth.requested_outputs = ['Sealevel', 'Bed', 'SealevelBarystaticIceLoad', 'SealevelBarystaticIceArea', 'SealevelBarystaticIceWeights']
 
 # Max number of iterations reverted back to 10 (i.e., the original default value)
Index: /issm/trunk/test/NightlyRun/test2003.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2003.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2003.m	(revision 27035)
@@ -1,7 +1,9 @@
 %Test Name: EarthSlc_rotationalFeedback
+
 
 %mesh earth:
 md=model;
-md.mesh=gmshplanet('radius',6.371012*10^3,'resolution',700.);
+load ../Data/SlcTestMesh.mat;
+md.mesh=SlcMesh; %700 km resolution mesh
 
 %Geometry for the bed, arbitrary thickness of 1000: 
Index: /issm/trunk/test/NightlyRun/test2003.py
===================================================================
--- /issm/trunk/test/NightlyRun/test2003.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2003.py	(revision 27035)
@@ -1,6 +1,6 @@
 #Test Name: EarthSlc_rotationalFeedback
 import numpy as np
+import pickle
 from socket import gethostname
-from gmshplanet import *
 from gmtmask import *
 from lovenumbers import *
@@ -12,5 +12,8 @@
 
 md = model()
-md.mesh = gmshplanet('radius', 6.371012 * 1e3, 'resolution', 700.) # 700 km resolution mesh
+
+# Load precomputed mesh
+with open('../Data/SlcTestMesh.pkl', 'rb') as slc_test_mesh_file:
+    md.mesh = pickle.load(slc_test_mesh_file)
 
 # Geometry for the bed, arbitrary thickness of 100
Index: /issm/trunk/test/NightlyRun/test2004.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2004.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2004.m	(revision 27035)
@@ -362,5 +362,5 @@
 if plotting,
 	flags=ones(sl.earth.mesh.numberofelements,1);
-	for i=1:length(sl.eltransitions),
+	for i=1:length(sl.eltransitions)
 		flags(sl.eltransitions{i})=i;
 	end
@@ -422,6 +422,6 @@
 md.solidearth.settings.viscous=0;
 md.solidearth.requested_outputs= {'default',...
-	'DeltaIceThickness','Sealevel','SealevelUGrd',...
-	'SealevelchangeBarystaticMask','SealevelchangeBarystaticOceanMask'};
+	'DeltaIceThickness','Sealevel','Bed',...
+	'SealevelBarystaticIceMask','SealevelBarystaticOceanMask'};
 md=solve(md,'Transient');
 Seustatic=md.results.TransientSolution.Sealevel;
Index: /issm/trunk/test/NightlyRun/test2004.py
===================================================================
--- /issm/trunk/test/NightlyRun/test2004.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2004.py	(revision 27035)
@@ -465,7 +465,7 @@
     'DeltaIceThickness',
     'Sealevel',
-    'SealevelUGrd',
-    'SealevelchangeBarystaticMask',
-    'SealevelchangeBarystaticOceanMask',
+    'Bed',
+    'SealevelBarystaticIceMask',
+    'SealevelBarystaticOceanMask',
 ]
 md = solve(md, 'Transient')
Index: /issm/trunk/test/NightlyRun/test2005.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2005.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2005.m	(revision 27035)
@@ -3,5 +3,6 @@
 %mesh earth:
 md=model;
-md.mesh=gmshplanet('radius',6.371012*10^3,'resolution',700.);
+load ../Data/SlcTestMesh.mat;
+md.mesh=SlcMesh; %700 km resolution mesh
 
 %Geometry for the bed, arbitrary thickness of 100: 
Index: /issm/trunk/test/NightlyRun/test2005.py
===================================================================
--- /issm/trunk/test/NightlyRun/test2005.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2005.py	(revision 27035)
@@ -1,6 +1,5 @@
 #Test Name: EarthSlc
 import numpy as np
-
-from gmshplanet import *
+import pickle
 from gmtmask import *
 from lovenumbers import *
@@ -14,5 +13,8 @@
 # Mesh earth
 md = model()
-md.mesh = gmshplanet('radius', 6.371012 * 1e3, 'resolution', 700.) #700 km resolution mesh
+
+# Load precomputed mesh
+with open('../Data/SlcTestMesh.pkl', 'rb') as slc_test_mesh_file:
+    md.mesh = pickle.load(slc_test_mesh_file)
 
 # Geometry for the bed, arbitrary thickness of 100
Index: /issm/trunk/test/NightlyRun/test2006.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2006.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2006.m	(revision 27035)
@@ -3,5 +3,6 @@
 %mesh earth:
 md=model;
-md.mesh=gmshplanet('radius',6.371012*10^3,'resolution',700.);
+load ../Data/SlcTestMesh.mat;
+md.mesh=SlcMesh; %700 km resolution mesh
 
 %Geometry for the bed, arbitrary thickness of 100: 
Index: /issm/trunk/test/NightlyRun/test2006.py
===================================================================
--- /issm/trunk/test/NightlyRun/test2006.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2006.py	(revision 27035)
@@ -1,7 +1,7 @@
 #Test Name: EarthSlc Dakota Sampling glaciers
 import numpy as np
+import pickle
 from socket import gethostname
 from dmeth_params_set import *
-from gmshplanet import *
 from gmtmask import *
 from lovenumbers import *
@@ -18,5 +18,8 @@
 md = model()
 md.cluster = generic('name', gethostname(), 'np', 5)
-md.mesh = gmshplanet('radius', 6.371012 * 1e3, 'resolution', 700.) #700 km resolution mesh
+
+# Load precomputed mesh
+with open('../Data/SlcTestMesh.pkl', 'rb') as slc_test_mesh_file:
+    md.mesh = pickle.load(slc_test_mesh_file)
 
 # Geometry for the bed, arbitrary thickness of 100
Index: /issm/trunk/test/NightlyRun/test2007.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2007.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2007.m	(revision 27035)
@@ -3,5 +3,6 @@
 %mesh earth:
 md=model;
-md.mesh=gmshplanet('radius',6.371012*10^3,'resolution',700.);
+load ../Data/SlcTestMesh.mat;
+md.mesh=SlcMesh; %700 km resolution mesh
 
 %Geometry for the bed, arbitrary
@@ -15,4 +16,5 @@
 longe=md.mesh.long;
 time=0:0.5:5;
+%The offline solution pattern is a degree (2,1) spherical harmonic
 md.solidearth.external=offlinesolidearthsolution;
 md.solidearth.external.displacementup=.5*sind(late).*cosd(late).*cosd(longe) .*time;
Index: /issm/trunk/test/NightlyRun/test2008.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2008.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2008.m	(revision 27035)
@@ -3,5 +3,6 @@
 %mesh earth:
 md=model;
-md.mesh=gmshplanet('radius',6.371012*10^3,'resolution',700.);
+load ../Data/SlcTestMesh.mat;
+md.mesh=SlcMesh; %700 km resolution mesh
 
 %Geometry for the bed, arbitrary thickness of 100: 
@@ -99,5 +100,5 @@
 longe=md.mesh.long;
 time=0:1;
-Y22=1.5*(1.+cosd(2.*late)).*cosd(2.*longe);
+Y22=1.5*(1.+cosd(2.*late)).*cosd(2.*longe);%The additional solidearth signal is a degree (2,2) spherical harmonic
 md.solidearth.external=additionalsolidearthsolution;
 md.solidearth.external.displacementup=0.5*Y22 .*time;
Index: /issm/trunk/test/NightlyRun/test2010.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2010.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2010.m	(revision 27035)
@@ -3,5 +3,6 @@
 %mesh earth:
 md=model;
-md.mesh=gmshplanet('radius',6.371012*10^3,'resolution',700.);
+load ../Data/SlcTestMesh.mat;
+md.mesh=SlcMesh; %700 km resolution mesh
 
 %Geometry for the bed, arbitrary thickness of 100:
@@ -98,13 +99,11 @@
 eus=md.results.TransientSolution.Bslc;
 slc=md.results.TransientSolution.Sealevel;
-moixz=md.results.TransientSolution.SealevelInertiaTensorXZ / (1/(1-tide_love_k2/tide_love_k2secular) * (1+load_love_k2)/(moi_p-moi_e) );
-moiyz=md.results.TransientSolution.SealevelInertiaTensorYZ / (1/(1-tide_love_k2/tide_love_k2secular) * (1+load_love_k2)/(moi_p-moi_e) );
-moizz=md.results.TransientSolution.SealevelInertiaTensorZZ / ( -(1+load_love_k2)/moi_p);
+moixz=md.results.TransientSolution.SealevelchangePolarMotionX / (1/(1-tide_love_k2/tide_love_k2secular) * (1+load_love_k2)/(moi_p-moi_e) );
+moiyz=md.results.TransientSolution.SealevelchangePolarMotionY / (1/(1-tide_love_k2/tide_love_k2secular) * (1+load_love_k2)/(moi_p-moi_e) );
+moizz=md.results.TransientSolution.SealevelchangePolarMotionZ / ( -(1+load_love_k2)/moi_p);
 
 areaice=md.results.TransientSolution.SealevelBarystaticIceArea;
+areaice(isnan(areaice))=0;
 loadice=md.results.TransientSolution.SealevelBarystaticIceLoad;
-
-% analytical moi => just checking FOR ICE only!!! {{{
-% ...have to mute ** slc induced MOI in Tria.cpp ** prior to the comparison
 rad_e = md.solidearth.planetradius;
 
@@ -113,6 +112,6 @@
 moi_xz = sum(-loadice.*areaice.*rad_e^2.*sin(lat).*cos(lat).*cos(lon));
 moi_yz = sum(-loadice.*areaice.*rad_e^2.*sin(lat).*cos(lat).*sin(lon));
-moi_zz = sum(-loadice.*areaice.*rad_e^2.*(1.0-sin(lat).^2));
-theoretical_value_check=[moixz/moi_xz moiyz/moi_yz moizz/moi_zz]
+moi_zz = sum(-loadice.*areaice.*rad_e^2.*(-1.0/3.0+sin(lat).^2));
+theoretical_value_check=[moixz/moi_xz moiyz/moi_yz moizz/moi_zz]; % should yield [1.0 1.0 1.0]
 % }}}
 
Index: /issm/trunk/test/NightlyRun/test2010.py
===================================================================
--- /issm/trunk/test/NightlyRun/test2010.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2010.py	(revision 27035)
@@ -1,6 +1,6 @@
 #Test Name: MomentOfIntertia
 import numpy as np
+import pickle
 from socket import gethostname
-from gmshplanet import *
 from gmtmask import *
 from lovenumbers import *
@@ -12,5 +12,8 @@
 # Mesh earth
 md = model()
-md.mesh = gmshplanet('radius', 6.371012 * 1e3, 'resolution', 700.) #700 km resolution mesh
+
+# Load precomputed mesh
+with open('../Data/SlcTestMesh.pkl', 'rb') as slc_test_mesh_file:
+    md.mesh = pickle.load(slc_test_mesh_file)
 
 # Geometry for the bed, arbitrary thickness of 100
@@ -115,13 +118,13 @@
 eus = md.results.TransientSolution.Bslc
 slc = md.results.TransientSolution.Sealevel
-moixz = md.results.TransientSolution.SealevelInertiaTensorXZ / (1 / (1 - tide_love_k2 / tide_love_k2secular) * (1 + load_love_k2) / (moi_p - moi_e))
-moiyz = md.results.TransientSolution.SealevelInertiaTensorYZ / (1 / (1 - tide_love_k2 / tide_love_k2secular) * (1 + load_love_k2) / (moi_p - moi_e))
-moizz = md.results.TransientSolution.SealevelInertiaTensorZZ / ( -(1 + load_love_k2) / moi_p)
+moixz = md.results.TransientSolution.SealevelchangePolarMotionX / (1 / (1 - tide_love_k2 / tide_love_k2secular) * (1 + load_love_k2) / (moi_p - moi_e))
+moiyz = md.results.TransientSolution.SealevelchangePolarMotionY / (1 / (1 - tide_love_k2 / tide_love_k2secular) * (1 + load_love_k2) / (moi_p - moi_e))
+moizz = md.results.TransientSolution.SealevelchangePolarMotionZ / ( -(1 + load_love_k2) / moi_p)
 
 areaice = md.results.TransientSolution.SealevelBarystaticIceArea
+areaice[np.isnan(areaice)] = 0
+print(np.isnan(areaice))
+print(np.sum(areaice))
 loadice = md.results.TransientSolution.SealevelBarystaticIceLoad
-
-# analytical moi = > just checking FOR ICE only!!! {{{
-# ...have to mute ** slc induced MOI in Tria.cpp**prior to the comparison
 rad_e = md.solidearth.planetradius
 
@@ -130,8 +133,6 @@
 moi_xz = sum(-loadice * areaice * pow(rad_e, 2) * np.sin(lat) * np.cos(lat) * np.cos(lon))
 moi_yz = sum(-loadice * areaice * pow(rad_e, 2) * np.sin(lat) * np.cos(lat) * np.sin(lon))
-moi_zz = sum(-loadice * areaice * pow(rad_e, 2) * (1 - np.sin(lat) ** 2))
-theoretical_value_check = [moixz / moi_xz, moiyz / moi_yz, moizz / moi_zz]
-print('\ntheoretical_value_check =\n')
-print('\t{}\n'.format(theoretical_value_check))
+moi_zz = sum(-loadice * areaice * pow(rad_e, 2) * (-1.0 / 3.0 + np.sin(lat) ** 2))
+theoretical_value_check = [moixz / moi_xz, moiyz / moi_yz, moizz / moi_zz] # Should yield [1.0, 1.0, 1.0]
 # }}}
 
Index: /issm/trunk/test/NightlyRun/test2011.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2011.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2011.m	(revision 27035)
@@ -3,5 +3,6 @@
 %mesh earth:
 md=model;
-md.mesh=gmshplanet('radius',6.371012*10^3,'resolution',700.);
+load ../Data/SlcTestMesh.mat;
+md.mesh=SlcMesh; %700 km resolution mesh
 
 %Geometry for the bed, arbitrary thickness of 1000: 
@@ -111,6 +112,10 @@
 bslc2=-sum(dHavg.*area)*md.materials.rho_ice/md.materials.rho_water/oceanarea;
 
+%need to change precision before subtraction because of differences in results 
+%at high precision under macOS versus Linux (print values of bslc and bslc2 to %verify that the difference is negligible)
+bslc_diff=single(bslc2)-single(bslc);
+
 %Fields and tolerances to track changes
 field_names={'BarystaticIce','BarystaticIce2','BarystaticIceDiff'};
 field_tolerances={1e-13,1e-13,1e-13};
-field_values={bslc,bslc2,bslc2-bslc};
+field_values={bslc,bslc2,bslc_diff};
Index: /issm/trunk/test/NightlyRun/test2012.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2012.m	(revision 27035)
+++ /issm/trunk/test/NightlyRun/test2012.m	(revision 27035)
@@ -0,0 +1,134 @@
+%Test Name: EarthSlc Hydrology loading
+
+%mesh earth:
+md=model;
+load ../Data/SlcTestMesh.mat;
+md.mesh=SlcMesh; %700 km resolution mesh
+
+%Geometry for the bed, arbitrary thickness of 100: 
+md.geometry.bed=zeros(md.mesh.numberofvertices,1);
+md.geometry.base=md.geometry.bed;
+md.geometry.thickness=100*ones(md.mesh.numberofvertices,1);
+md.geometry.surface=md.geometry.bed+md.geometry.thickness;
+
+%solidearth loading:  {{{
+md.hydrology=hydrologytws();
+md.hydrology.spcwatercolumn=[md.geometry.thickness;0];
+md.smb.mass_balance=zeros(md.mesh.numberofvertices,1);
+
+%antarctica
+xe=md.mesh.x(md.mesh.elements)*[1;1;1]/3;
+ye=md.mesh.y(md.mesh.elements)*[1;1;1]/3;
+ze=md.mesh.z(md.mesh.elements)*[1;1;1]/3;
+re=sqrt(xe.^2+ye.^2+ze.^2);
+
+late=asind(ze./re);
+longe=atan2d(ye,xe);
+pos=find(late < -80);
+md.hydrology.spcwatercolumn(md.mesh.elements(pos,:))=md.hydrology.spcwatercolumn(md.mesh.elements(pos,:))-100;
+posant=pos;
+
+%greenland
+pos=find(late>60 & late<90 & longe>-75 & longe<-15);
+md.hydrology.spcwatercolumn(md.mesh.elements(pos,:))=md.hydrology.spcwatercolumn(md.mesh.elements(pos,:))-100;
+posgre=pos;
+
+%elastic loading from love numbers:
+md.solidearth.lovenumbers=lovenumbers('maxdeg',1000);
+
+%}}}
+%mask:  {{{
+mask=gmtmask(md.mesh.lat,md.mesh.long);
+oceanmask=-ones(md.mesh.numberofvertices,1);
+pos=find(mask==0); oceanmask(pos)=1;
+
+icemask=ones(md.mesh.numberofvertices,1);
+icemask(md.mesh.elements(posant))=-1;
+icemask(md.mesh.elements(posgre))=-1;
+
+md.mask.ice_levelset=icemask;
+md.mask.ocean_levelset=oceanmask;
+% }}}
+
+%time stepping: 
+md.timestepping.start_time=0;
+md.timestepping.time_step=1;
+md.timestepping.final_time=1;
+
+%masstransport:
+md.basalforcings.groundedice_melting_rate=zeros(md.mesh.numberofvertices,1);
+md.basalforcings.floatingice_melting_rate=zeros(md.mesh.numberofvertices,1);
+md.initialization.vx=zeros(md.mesh.numberofvertices,1);
+md.initialization.vy=zeros(md.mesh.numberofvertices,1);
+md.initialization.sealevel=zeros(md.mesh.numberofvertices,1);
+md.initialization.str=0;
+md.initialization.watercolumn=zeros(md.mesh.numberofvertices,1);
+
+%Materials: 
+md.materials=materials('hydro');
+
+%Miscellaneous
+md.miscellaneous.name='test2012';
+
+%Solution parameters
+md.cluster.np=3;
+md.solidearth.settings.reltol=NaN;
+md.solidearth.settings.abstol=1e-3;
+md.solidearth.settings.sealevelloading=1;
+md.solidearth.settings.isgrd=1;
+md.solidearth.settings.ocean_area_scaling=0;
+md.solidearth.settings.grdmodel=1;
+
+%Physics: 
+md.transient.issmb=0; 
+md.transient.isstressbalance=0;
+md.transient.isthermal=0;
+md.transient.ismasstransport=0;
+md.transient.ishydrology=1;
+md.transient.isslc=1;
+md.solidearth.requested_outputs={'Sealevel','Bed'};
+
+% max number of iteration reverted back to 10 (i.e., the original default value)
+md.solidearth.settings.maxiter=10;
+
+%eustatic run:
+md.solidearth.settings.selfattraction=0;
+md.solidearth.settings.elastic=0;
+md.solidearth.settings.rotation=0;
+md.solidearth.settings.viscous=0;
+
+md=solve(md,'Transient');
+Seustatic=md.results.TransientSolution.Sealevel;
+Beustatic=md.results.TransientSolution.Bed;
+
+%eustatic + selfattraction run:
+md.solidearth.settings.selfattraction=1;
+md.solidearth.settings.elastic=0;
+md.solidearth.settings.rotation=0;
+md.solidearth.settings.viscous=0;
+md=solve(md,'tr');
+Sselfattraction=md.results.TransientSolution.Sealevel;
+Bselfattraction=md.results.TransientSolution.Bed;
+
+%eustatic + selfattraction + elastic run:
+md.solidearth.settings.selfattraction=1;
+md.solidearth.settings.elastic=1;
+md.solidearth.settings.rotation=0;
+md.solidearth.settings.viscous=0;
+md=solve(md,'tr');
+Selastic=md.results.TransientSolution.Sealevel;
+Belastic=md.results.TransientSolution.Bed;
+
+%eustatic + selfattraction + elastic + rotation run:
+md.solidearth.settings.selfattraction=1;
+md.solidearth.settings.elastic=1;
+md.solidearth.settings.rotation=1;
+md.solidearth.settings.viscous=0;
+md=solve(md,'tr');
+Srotation=md.results.TransientSolution.Sealevel;
+Brotation=md.results.TransientSolution.Bed;
+
+%Fields and tolerances to track changes
+field_names={'Seustatic','Sselfattraction','Selastic','Srotation','Beustatic','Bselfattraction','Belastic','Brotation'};
+field_tolerances={1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13};
+field_values={Seustatic,Sselfattraction,Selastic,Srotation,Beustatic,Bselfattraction,Belastic,Brotation};
Index: /issm/trunk/test/NightlyRun/test2013.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2013.m	(revision 27035)
+++ /issm/trunk/test/NightlyRun/test2013.m	(revision 27035)
@@ -0,0 +1,159 @@
+%Test Name: EarthSlc_Geometry
+
+step=[1 2];
+if any(step==1)
+%mesh earth:
+md=model;
+load ../Data/SlcTestMesh.mat;
+md.mesh=SlcMesh; %700 km resolution mesh
+
+%Geometry for the bed, arbitrary thickness of 1000: 
+md.geometry.bed=-ones(md.mesh.numberofvertices,1);
+md.geometry.base=md.geometry.bed;
+md.geometry.thickness=1000*ones(md.mesh.numberofvertices,1);
+md.geometry.surface=md.geometry.bed+md.geometry.thickness;
+
+%parameterize slc solution:
+%solidearth loading:  {{{
+md.masstransport.spcthickness=[md.geometry.thickness;0];
+md.smb.mass_balance=zeros(md.mesh.numberofvertices,1);
+
+xe=md.mesh.x(md.mesh.elements)*[1;1;1]/3;
+ye=md.mesh.y(md.mesh.elements)*[1;1;1]/3;
+ze=md.mesh.z(md.mesh.elements)*[1;1;1]/3;
+re=sqrt(xe.^2+ye.^2+ze.^2);
+
+late=asind(ze./re);
+longe=atan2d(ye,xe);
+
+%greenland
+pos=find(late>60 & late<90 & longe>-75 & longe<-15);
+md.masstransport.spcthickness(md.mesh.elements(:,:))= md.masstransport.spcthickness(md.mesh.elements(:,:))-1000;
+posice=pos;
+
+%elastic loading from love numbers:
+md.solidearth.lovenumbers=lovenumbers('maxdeg',100);
+%}}}
+%mask:  {{{
+mask=gmtmask(md.mesh.lat,md.mesh.long);
+icemask=ones(md.mesh.numberofvertices,1);
+icemask(md.mesh.elements(posice,:))=-1;
+md.mask.ice_levelset=icemask;
+oceanmask=-ones(md.mesh.numberofvertices,1);
+pos=find(mask==0); oceanmask(pos)=3;
+md.mask.ocean_levelset=oceanmask;
+
+% use model representation of ocean area (not the true area)
+md.solidearth.settings.ocean_area_scaling = 0;
+
+%materials
+md.initialization.temperature=273.25*ones(md.mesh.numberofvertices,1);
+md.initialization.sealevel=zeros(md.mesh.numberofvertices,1);
+md.initialization.str=0;
+
+md.basalforcings.groundedice_melting_rate=zeros(md.mesh.numberofvertices,1);
+md.basalforcings.floatingice_melting_rate=zeros(md.mesh.numberofvertices,1);
+md.initialization.vx=zeros(md.mesh.numberofvertices,1);
+md.initialization.vy=zeros(md.mesh.numberofvertices,1);
+
+%Miscellaneous
+md.miscellaneous.name='test2013';
+
+%Solution parameters
+md.solidearth.settings.reltol=NaN;
+md.solidearth.settings.abstol=1e-3;
+md.solidearth.settings.sealevelloading=0;
+md.solidearth.settings.grdocean=0;
+md.solidearth.settings.isgrd=1;
+md.solidearth.settings.ocean_area_scaling=0;
+md.solidearth.settings.grdmodel=1;
+md.solidearth.settings.horiz=1;
+md.settings.results_on_nodes = {'SealevelBarystaticIceWeights'};
+md.solidearth.requested_outputs={'SealevelBarystaticIceLoad', 'SealevelBarystaticIceWeights', 'SealevelBarystaticIceArea', 'SealevelBarystaticIceMask', 'SealevelBarystaticIceLatbar', 'SealevelBarystaticIceLongbar'};
+
+%Physics: 
+md.transient.issmb=0;
+md.transient.isstressbalance=0;
+md.transient.isthermal=0;
+md.transient.ismasstransport=1;
+md.transient.isslc=1;
+
+md.timestepping.start_time=0;
+md.timestepping.time_step=1;
+md.timestepping.final_time=1;
+
+%slc:
+md.solidearth.settings.selfattraction=1;
+md.solidearth.settings.elastic=0;
+md.solidearth.settings.rotation=0;
+md.solidearth.settings.viscous=0;
+md.cluster=generic('name',oshostname(),'np',3);
+%md.verbose=verbose('111111111');
+md=solve(md,'Transient');
+
+weights=md.results.TransientSolution.SealevelBarystaticIceWeights;
+mask=md.results.TransientSolution.SealevelBarystaticIceMask;
+loads=md.results.TransientSolution.SealevelBarystaticIceLoad;
+areas=md.results.TransientSolution.SealevelBarystaticIceArea;
+longbar=md.results.TransientSolution.SealevelBarystaticIceLongbar;
+latbar=md.results.TransientSolution.SealevelBarystaticIceLatbar;
+
+
+%Fields and tolerances to track changes
+field_names     ={'Mask', 'LoadAreas', 'SurfaceLoad', 'LoadWeights','LatitudeLoadBarycenter', 'LongitudeLoadBarycenter'};
+field_tolerances={1e-13,1e-13,1e-13,1e-13,1e-13,1e-13};
+field_values={mask,areas,loads,weights,latbar, longbar};
+
+
+end
+if any(step==2)
+%use this to check visually the load-related inputs
+
+	 plotmodel(md,'data',md.mask.ocean_levelset,'contourlevels', {0},'contouronly',1, 'contourcolor', 'b')  
+	 co=get(gca,'children');
+	 coo=struct;
+	for i=1:length(co)
+		coo(i).XData=co(i).XData;
+		coo(i).YData=co(i).YData;
+		coo(i).ZData=co(i).ZData;
+	end	
+
+	 plotmodel(md,'data',md.mask.ice_levelset,'contourlevels', {0},'contouronly',1, 'contourcolor', 'r')  
+	 ci=get(gca,'children');
+	cii=struct;
+	for i=1:length(ci)
+		cii(i).XData=ci(i).XData;
+		cii(i).YData=ci(i).YData;
+		cii(i).ZData=ci(i).ZData;
+	end	
+
+	close all
+
+	subplot(2,2,1)
+	 for i=1:md.mesh.numberofelements
+		patch('XData',md.mesh.x(md.mesh.elements(i,:)), 'YData',md.mesh.y(md.mesh.elements(i,:)), 'ZData',md.mesh.z(md.mesh.elements(i,:)),'facecolor', 'interp', 'facevertexcdata',weights(i,:)')
+		hold on
+	end
+
+	for i=1:length(coo)
+		plot3(coo(i).XData,coo(i).YData,coo(i).ZData, 'color', [0 0 .8],'linewidth',1.5)
+	end
+
+	for i=1:length(cii)
+		plot3(cii(i).XData,cii(i).YData,cii(i).ZData, 'color', [.7 0 .7],'linewidth',1.5)
+	end
+
+	x=md.solidearth.planetradius* (cosd(latbar).*cosd(longbar));
+	y=md.solidearth.planetradius* (cosd(latbar).*sind(longbar));
+	z=md.solidearth.planetradius* (sind(latbar));
+	ind=find(mask>0);
+	plot3(x(ind),y(ind),z(ind), 'kx')
+	axis tight; title('Load weights & barycenters');set(gca,'Fontsize', 14);
+
+	 plotmodel(md,'data', loads,'subplot',[2 2 2]);title('Average load [kg.m^-2]')
+	 plotmodel(md,'data', mask,'subplot',[2 2 3]); title('Phi')
+	 plotmodel(md,'data', areas,'subplot',[2 2 4]); title('Load areas [m^2]') 
+
+
+end
+
Index: /issm/trunk/test/NightlyRun/test2021.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2021.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2021.m	(revision 27035)
@@ -4,5 +4,6 @@
 
 md=model;
-md.mesh=gmshplanet('radius',6.371012*10^3,'resolution',700.); %700 km resolution mesh
+load ../Data/SlcTestMesh.mat;
+md.mesh=SlcMesh; %700 km resolution mesh
 
 % read in love numbers.
Index: /issm/trunk/test/NightlyRun/test2051.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2051.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2051.m	(revision 27035)
@@ -5,20 +5,31 @@
 md=parameterize(md,'../Par/GiaIvinsBenchmarksAB.par');
 
+%GIA Ivins, 2 layer model.
+md.solidearth.settings.grdmodel=2;
+md.solidearth.settings.isgrd=1;
+md.initialization.sealevel=zeros(md.mesh.numberofvertices,1);
+
 %% indicate what you want to compute 
-md.gia.cross_section_shape=1;    % for square-edged x-section 
+md.solidearth.settings.cross_section_shape=1;    % for square-edged x-section 
+md.solidearth.settings.grdocean=0;  %do not compute sea level, only deformation
+md.solidearth.settings.sealevelloading=0;  %do not compute sea level, only deformation
 
 % evaluation time (termed start_time) 
-md.timestepping.start_time=2002100; % after 2 kyr of deglaciation 
+
+md.timestepping.time_step=2002100; % after 2 kyr of deglaciation 
+md.timestepping.start_time=-md.timestepping.time_step; % need one time step before t=0 to generate a thickness change at t=0
 md.timestepping.final_time=2500000; % 2,500 kyr
 
 %% define loading history {{{ 
-md.geometry.thickness=[...
+md.masstransport.spcthickness=[...
 	[md.geometry.thickness*0.0; 0.0],...
 	[md.geometry.thickness; 1000],...
 	[md.geometry.thickness; 2000000],...
 	[md.geometry.thickness*0.0; 2000100],...
-	[md.geometry.thickness*0.0; md.timestepping.start_time],...
+	[md.geometry.thickness*0.0; md.timestepping.start_time+2*md.timestepping.time_step],...
 	];
 % }}} 
+
+md.geometry.bed=zeros(md.mesh.numberofvertices,1);
 
 % find out elements that have zero loads throughout the loading history.
@@ -26,39 +37,52 @@
 md.mask.ice_levelset(pos)=1; % no ice
 
+%Physics: 
+md.transient.issmb=0; 
+md.transient.isstressbalance=0;
+md.transient.isthermal=0;
+md.transient.ismasstransport=1;
+md.transient.isslc=1;
+
 md.cluster=generic('name',oshostname(),'np',3);
 md.verbose=verbose('1111111');
+md.solidearth.requested_outputs={'Sealevel','BedGRD'};
 
 %% solve for GIA deflection 
-md=solve(md,'Gia');
+md=solve(md,'Transient');
 
 %Test Name: GiaIvinsBenchmarksAB2dA1
-U_AB2dA1 = md.results.GiaSolution.UGia; 
-URate_AB2dA1 = md.results.GiaSolution.UGiaRate; 
+U_AB2dA1 = md.results.TransientSolution.BedGRD; 
+%URate_AB2dA1 = md.results.TransientSolution.UGiaRate; 
 
 %Test Name: GiaIvinsBenchmarksAB2dA2
 %% different evaluation time. {{{ 
-md.timestepping.start_time=2005100; % after 5 kyr of deglaciation
-md.geometry.thickness(end,end) = md.timestepping.start_time;
+md.timestepping.time_step=2005100;% after 5 kyr of deglaciation
+md.timestepping.start_time=-md.timestepping.time_step; % need one time step before t=0 to generate a thickness change at t=0
+md.masstransport.spcthickness(end,end) = md.timestepping.start_time+2*md.timestepping.time_step;
 
-md=solve(md,'Gia');
+md=solve(md,'Transient');
 
-U_AB2dA2 = md.results.GiaSolution.UGia; 
-URate_AB2dA2 = md.results.GiaSolution.UGiaRate; 
+U_AB2dA2 = md.results.TransientSolution.BedGRD; 
+%URate_AB2dA2 = md.results.TransientSolution.BedGRDRate; 
 % }}} 
 
 %Test Name: GiaIvinsBenchmarksAB2dA3
 %% different evaluation time. {{{ 
-md.timestepping.start_time=2010100; % after 10 kyr of deglaciation 
-md.geometry.thickness(end,end) = md.timestepping.start_time; 
+md.timestepping.time_step=2010100;% after 10 kyr of deglaciation
+md.timestepping.start_time=-md.timestepping.time_step; % need one time step before t=0 to generate a thickness change at t=0
+md.masstransport.spcthickness(end,end) = md.timestepping.start_time+2*md.timestepping.time_step; 
 
-md=solve(md,'Gia');
+md=solve(md,'Transient');
 
-U_AB2dA3 = md.results.GiaSolution.UGia; 
-URate_AB2dA3 = md.results.GiaSolution.UGiaRate; 
+U_AB2dA3 = md.results.TransientSolution.BedGRD; 
+%URate_AB2dA3 = md.results.TransientSolution.UGiaRate; 
 % }}} 
 
 %Fields and tolerances to track changes
-field_names     ={'U_AB2dA1','URate_AB2dA1','U_AB2dA2','URate_AB2dA2','U_AB2dA3','URate_AB2dA3'};
-field_tolerances={1e-13,1e-13,1e-13,1e-13,1e-13,1e-13};
-field_values={U_AB2dA1,URate_AB2dA1,U_AB2dA2,URate_AB2dA2,U_AB2dA3,URate_AB2dA3}; 
+field_names     ={'U_AB2dA1','U_AB2dA2','U_AB2dA3'};
+field_tolerances={1e-13,1e-13,1e-13};
+field_values={U_AB2dA1,U_AB2dA2,U_AB2dA3};
+% field_names     ={'U_AB2dA1','URate_AB2dA1','U_AB2dA2','URate_AB2dA2','U_AB2dA3','URate_AB2dA3'};
+% field_tolerances={1e-13,1e-13,1e-13,1e-13,1e-13,1e-13};
+% field_values={U_AB2dA1,URate_AB2dA1,U_AB2dA2,URate_AB2dA2,U_AB2dA3,URate_AB2dA3};
 
Index: /issm/trunk/test/NightlyRun/test2051.py
===================================================================
--- /issm/trunk/test/NightlyRun/test2051.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2051.py	(revision 27035)
@@ -16,58 +16,81 @@
 md = parameterize(md, '../Par/GiaIvinsBenchmarksAB.py')
 
-# indicate what you want to compute
-md.gia.cross_section_shape = 1  # for square-edged x-section
+# GIA Ivins, 2 layer model
+md.solidearth.settings.grdmodel = 2
+md.solidearth.settings.isgrd = 1
+md.initialization.sealevel = np.zeros((md.mesh.numberofvertices,))
 
-# evaluation time (termed start_time)
-md.timestepping.start_time = 2002100  # after 2 kyr of deglaciation
-md.timestepping.final_time = 2500000  # 2,500 kyr
+# Indicate what you want to compute
+md.solidearth.settings.cross_section_shape = 1 # For square-edged x-section
+md.solidearth.settings.grdocean = 0 # Do not compute sea level, only deformation
+md.solidearth.settings.sealevelloading = 0 # Do not compute sea level, only deformation
 
-# define loading history
-md.geometry.thickness = np.array([
+# Evaluation time (termed start_time)
+md.timestepping.time_step = 2002100 # after 2 kyr of deglaciation
+md.timestepping.start_time = -md.timestepping.time_step # Need one time step before t = 0 to generate a thickness change at t = 0
+md.timestepping.final_time = 2500000 # 2,500 kyr
+
+# Define loading history
+md.masstransport.spcthickness = np.array([
     np.append(md.geometry.thickness * 0.0, 0.0),
     np.append(md.geometry.thickness, 1000),
     np.append(md.geometry.thickness, 2000000),
     np.append(md.geometry.thickness * 0.0, 2000100),
-    np.append(md.geometry.thickness * 0.0, md.timestepping.start_time)
+    np.append(md.geometry.thickness * 0.0, md.timestepping.start_time + 2 * md.timestepping.time_step)
     ]).T
 
-# find out the elements that have zero loads throughout the loading history
+md.geometry.bed = np.zeros((md.mesh.numberofvertices,))
+
+# Find out the elements that have zero loads throughout the loading history
 pos = np.where(np.abs(md.geometry.thickness[0:-2, :].sum(axis=1)) == 0)[0]
-md.mask.ice_levelset[pos] = 1 # no ice
+md.mask.ice_levelset[pos] = 1 # No ice
+
+# Physics
+md.transient.issmb = 0
+md.transient.isstressbalance = 0
+md.transient.isthermal = 0
+md.transient.ismasstransport = 1
+md.transient.isslc = 1
 
 md.cluster = generic('name', gethostname(), 'np', 3)
 md.verbose = verbose('1111111')
+md.solidearth.requested_outputs = ['Sealevel', 'BedGRD']
 
-# solve for GIA deflection
-md = solve(md, 'Gia')
+# Solve for GIA deflection
+md = solve(md, 'Transient')
 
 # Test Name: GiaIvinsBenchmarksAB2dA1
-U_AB2dA1 = md.results.GiaSolution.UGia
-URate_AB2dA1 = md.results.GiaSolution.UGiaRate
+U_AB2dA1 = md.results.TransientSolution.BedGRD
+#URate_AB2dA1 = md.results.TransientSolution.UGiaRate
 
 # Test Name: GiaIvinsBenchmarksAB2dA2
 # different evaluation time # {{{
-md.timestepping.start_time = 2005100 # after 5 kyr of deglaciation
-md.geometry.thickness[-1, -1] = md.timestepping.start_time
+md.timestepping.time_step = 2005100 # After 5 kyr of deglaciation
+md.timestepping.start_time = -md.timestepping.time_step # Need one time step before t = 0 to generate a thickness change at t = 0
+md.masstransport.spcthickness[-1, -1] = md.timestepping.start_time + 2 * md.timestepping.time_step
 
-md = solve(md, 'Gia')
+md = solve(md, 'Transient')
 
-U_AB2dA2 = md.results.GiaSolution.UGia
-URate_AB2dA2 = md.results.GiaSolution.UGiaRate
+U_AB2dA2 = md.results.TransientSolution.BedGRD
+#URate_AB2dA2 = md.results.TransientSolution.BedGRDRate
 # }}}
 
 # Test Name: GiaIvinsBenchmarksAB2dA3
 # different evaluation time # {{{
-md.timestepping.start_time = 2010100 # after 10 kyr of deglaciation
-md.geometry.thickness[-1, -1] = md.timestepping.start_time
+md.timestepping.time_step = 2010100 # After 10 kyr of deglaciation
+md.timestepping.start_time = -md.timestepping.time_step # Need one time step before t = 0 to generate a thickness change at t = 0
+md.masstransport.spcthickness[-1, -1] = md.timestepping.start_time + 2 * md.timestepping.time_step
 
-md = solve(md, 'Gia')
+md = solve(md, 'Transient')
 
-U_AB2dA3 = md.results.GiaSolution.UGia
-URate_AB2dA3 = md.results.GiaSolution.UGiaRate
+U_AB2dA3 = md.results.TransientSolution.BedGRD
+#URate_AB2dA3 = md.results.TransientSolution.UGiaRate
 # }}}
 
 # Fields and tolerances to track changes
-field_names = ['U_AB2dA1','URate_AB2dA1','U_AB2dA2','URate_AB2dA2','U_AB2dA3','URate_AB2dA3']
-field_tolerances = [1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13]
-field_values = [U_AB2dA1, URate_AB2dA1, U_AB2dA2, URate_AB2dA2, U_AB2dA3, URate_AB2dA3]
+field_names = ['U_AB2dA1','U_AB2dA2','U_AB2dA3']
+field_tolerances = [1e-13, 1e-13, 1e-13]
+field_values = [U_AB2dA1, U_AB2dA2, U_AB2dA3]
+# field_names = ['U_AB2dA1','URate_AB2dA1','U_AB2dA2','URate_AB2dA2','U_AB2dA3','URate_AB2dA3']
+# field_tolerances = [1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13]
+# field_values = [U_AB2dA1, URate_AB2dA1, U_AB2dA2, URate_AB2dA2, U_AB2dA3, URate_AB2dA3]
Index: /issm/trunk/test/NightlyRun/test2070.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2070.m	(revision 27035)
+++ /issm/trunk/test/NightlyRun/test2070.m	(revision 27035)
@@ -0,0 +1,71 @@
+%Test Name: ElasticLoveNumbers
+%Forward Love number solution for a viscoelastic earth, model M3-L70-V01 from
+%Spada, G., Barletta, V. R., Klemann, V., Riva, R. E. M., Martinec, Z.,
+%Gasperini, P., Lund, B., Wolf, D., Vermeersen, L. L. A. and King, M. A.
+%(2011), A benchmark study for glacial isostatic adjustment codes. Geophysical
+%Journal International, 185: 106--132. doi:10.1111/j.1365-246X.2011.04952.x
+
+md=model();
+md.cluster=generic('name',oshostname(),'np',2);
+
+md.materials=materials('litho');
+md.miscellaneous.name='test2070';
+md.groundingline.migration='None';
+
+md.verbose=verbose('all');
+md.verbose=verbose('1111111111111111');
+cst=365.25*24*3600*1000;
+
+md.materials.numlayers=6;
+md.materials.radius =  [10 1222.5 3.4800e+03   5.7010e+03   5.9510e+03   6.3010e+03   6.3710e+03]'*1e3;
+md.materials.density=  [1.0750e4 1.0750e+04   4.9780e+03   3.8710e+03   3.4380e+03   3.0370e+03]';
+md.materials.lame_mu=  [1e-5         0   2.2834e+00   1.0549e+00   7.0363e-01   5.0605e-01]'*1e11;
+md.materials.viscosity=[0            0   2.0000e+00   1.0000e+00   1.0000e+00   1.0000e+25]'*1e21;
+md.materials.lame_lambda=md.materials.lame_mu*0+5e17;
+md.materials.issolid=[1 0 1 1 1 1]';
+md.materials.rheologymodel=zeros(md.materials.numlayers,1);
+md.materials.burgers_mu=md.materials.lame_mu/3;
+md.materials.burgers_viscosity=md.materials.viscosity/10;
+md.materials.ebm_alpha= ones(md.materials.numlayers,1)*.9;
+md.materials.ebm_delta= ones(md.materials.numlayers,1)*0.2;
+md.materials.ebm_taul= ones(md.materials.numlayers,1)*54*60; %54min
+md.materials.ebm_tauh= ones(md.materials.numlayers,1)*18.6*cst/1e3; %18.6yr
+
+md.love.allow_layer_deletion=1;
+md.love.frequencies=[0];
+md.love.nfreq=length(md.love.frequencies);
+md.love.sh_nmin=1;
+md.love.sh_nmax=10000;
+md.love.underflow_tol=1e-20;
+md.love.pw_threshold=1e-3;
+md.love.Gravitational_Constant=6.6732e-11;
+md.love.integration_steps_per_layer=100;
+md.love.allow_layer_deletion=1;
+md.love.forcing_type=11;
+md.love.chandler_wobble=0;
+md.love.complex_computation=0;
+md.love.istemporal=0;
+%md.love.time=(linspace(1/12,10, 10*12))'*cst/1e3;
+
+md.love.love_kernels=1;
+
+md=solve(md,'lv');
+
+h=md.results.LoveSolution.LoveHf;
+l=md.results.LoveSolution.LoveLf;
+k=md.results.LoveSolution.LoveKf;
+
+md.love.forcing_type=9;
+md.love.sh_nmin=2;
+md=solve(md,'lv');
+
+th=md.results.LoveSolution.LoveHf;
+tl=md.results.LoveSolution.LoveLf;
+tk=md.results.LoveSolution.LoveKf;
+
+%Fields and tolerances to track changes
+
+field_names     ={'LoveH_loading_elastic','LoveK_loading_elastic','LoveL_loading_elastic','LoveH_tidal_elastic','LoveK_tidal_elastic','LoveL_tidal_elastic'};
+field_tolerances={2.0e-8,2.0e-8,2.0e-8,2.0e-8,2.0e-8,2.0e-8};
+field_values={h,k,l,th,tk,tl};
+
Index: /issm/trunk/test/NightlyRun/test2071.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2071.m	(revision 27035)
+++ /issm/trunk/test/NightlyRun/test2071.m	(revision 27035)
@@ -0,0 +1,126 @@
+%Test Name: TemporalLoveNumbers
+%Forward Love number solution for a viscoelastic earth, model M3-L70-V01 from
+%Spada, G., Barletta, V. R., Klemann, V., Riva, R. E. M., Martinec, Z.,
+%Gasperini, P., Lund, B., Wolf, D., Vermeersen, L. L. A. and King, M. A.
+%(2011), A benchmark study for glacial isostatic adjustment codes. Geophysical
+%Journal International, 185: 106--132. doi:10.1111/j.1365-246X.2011.04952.x
+
+md=model();
+md.cluster=generic('name',oshostname(),'np',3);
+
+md.materials=materials('litho');
+md.miscellaneous.name='test2071';
+md.groundingline.migration='None';
+
+md.verbose=verbose('all');
+md.verbose=verbose('1111111111111111');
+yts=365.25*24*3600;
+
+md.materials.numlayers=6;
+md.materials.radius =  [10 1222.5 3.4800e+03   5.7010e+03   5.9510e+03   6.3010e+03   6.3710e+03]'*1e3;
+md.materials.density=  [1.0750e4 1.0750e+04   4.9780e+03   3.8710e+03   3.4380e+03   3.0370e+03]';
+md.materials.lame_mu=  [1e-5         0   2.2834e+00   1.0549e+00   7.0363e-01   5.0605e-01]'*1e11;
+md.materials.viscosity=[0            0   2.0000e+00   1.0000e+00   1.0000e+00   1.0000e+25]'*1e21;
+md.materials.lame_lambda=md.materials.lame_mu*0+5e17;
+md.materials.issolid=[1 0 1 1 1 1]';
+md.materials.rheologymodel=zeros(md.materials.numlayers,1);
+md.materials.burgers_mu=md.materials.lame_mu/3;
+md.materials.burgers_viscosity=md.materials.viscosity/10;
+md.materials.ebm_alpha= ones(md.materials.numlayers,1)*.9;
+md.materials.ebm_delta= ones(md.materials.numlayers,1)*0.2;
+md.materials.ebm_taul= ones(md.materials.numlayers,1)*54*60; %54min
+md.materials.ebm_tauh= ones(md.materials.numlayers,1)*18.6*yts; %18.6yr
+
+md.love.allow_layer_deletion=1;
+md.love.frequencies=[0];
+md.love.nfreq=length(md.love.frequencies);
+md.love.sh_nmin=1;
+md.love.sh_nmax=1000;
+md.love.underflow_tol=1e-20;
+md.love.pw_threshold=1e-3;
+md.love.Gravitational_Constant=6.6732e-11;
+md.love.integration_steps_per_layer=100;
+md.love.allow_layer_deletion=1;
+md.love.forcing_type=11;
+md.love.chandler_wobble=0;
+md.love.complex_computation=0;
+
+md.love.istemporal=1;
+md.love.n_temporal_iterations=8;
+md.love.time=[0; (logspace(0,4.3, 99))'*yts];
+md.love=md.love.build_frequencies_from_time;
+md.love.love_kernels=1;
+md.solidearth.lovenumbers.tk2secular= 0.9668;
+md.solidearth.rotational.equatorialmoi=8.0131e37;
+md.solidearth.rotational.polarmoi=8.0394e37;
+md.solidearth.rotational.angularvelocity=7.292115e-5;
+
+md=solve(md,'lv');
+
+h=md.results.LoveSolution.LoveHt;
+l=md.results.LoveSolution.LoveLt;
+k=md.results.LoveSolution.LoveKt;
+
+%Fields and tolerances to track changes
+field_names     ={'LoveH_loading_temporal','LoveK_loading_temporal','LoveL_loading_temporal'};
+field_tolerances={3.0e-7,3.0e-7,8.0e-8};
+field_values={h,k,l};
+
+spada=0;
+if (spada)
+	t=md.love.time/yts;
+	addpath ../Data/
+	load spada.mat
+	load spada_n1.mat;
+	s_weak=[9 12 15];
+
+	hspada(:,s_weak)=[];
+	kspada(:,s_weak)=[];
+	lspada(:,s_weak)=[];
+
+	hts=zeros(length(t),257);
+	lts=zeros(length(t),257);
+	kts=zeros(length(t),257);
+
+	d=1;
+	hts(:,d+1)=hspada_n1(2);
+	lts(:,d+1)=lspada_n1(2);
+	kts(:,d+1)=-1;
+	for mo=1:9 
+		hts(:,d+1)=hts(:,d+1)-hspada_n1(3+mo)./sspada_n1(1+mo).*(1-exp(t/1e3*sspada_n1(1+mo)));
+		lts(:,d+1)=lts(:,d+1)-lspada_n1(3+mo)./sspada_n1(1+mo).*(1-exp(t/1e3*sspada_n1(1+mo)));
+	end
+
+	for d=2:256
+		hts(:,d+1)=hspada(d-1,2);
+		lts(:,d+1)=lspada(d-1,2);
+		kts(:,d+1)=kspada(d-1,2);
+		for mo=1:9 
+			hts(:,d+1)=hts(:,d+1)-hspada(d-1,3+mo)./sspada(d-1,1+mo).*(1-exp(t/1e3*sspada(d-1,1+mo)));
+			lts(:,d+1)=lts(:,d+1)-lspada(d-1,3+mo)./sspada(d-1,1+mo).*(1-exp(t/1e3*sspada(d-1,1+mo)));
+			kts(:,d+1)=kts(:,d+1)-kspada(d-1,3+mo)./sspada(d-1,1+mo).*(1-exp(t/1e3*sspada(d-1,1+mo)));
+		end
+	end
+end
+
+return
+
+
+h=md.results.LoveSolution.LoveHt;
+l=md.results.LoveSolution.LoveLt;
+k=md.results.LoveSolution.LoveKt;
+ht=h';
+lt=l';
+kt=k';
+th=md.results.LoveSolution.LoveTidalHt';
+tl=md.results.LoveSolution.LoveTidalLt';
+tk=md.results.LoveSolution.LoveTidalKt';
+tht=ht*0;tht(3,:)=th(3,:);
+tkt=kt*0;tkt(3,:)=tk(3,:);
+tlt=lt*0;tlt(3,:)=tl(3,:);
+pmtf1=md.results.LoveSolution.LovePMTF1t(:,3)';
+pmtf2=md.results.LoveSolution.LovePMTF2t(:,3)';
+time=md.love.time/yts;
+
+save ../Data/lnb_temporal ht kt lt tht tkt tlt pmtf1 pmtf2 time;
+
Index: /issm/trunk/test/NightlyRun/test2072.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2072.m	(revision 27035)
+++ /issm/trunk/test/NightlyRun/test2072.m	(revision 27035)
@@ -0,0 +1,70 @@
+%Test Name: ElasticLoveNumbers_HighlyLayeredEarth
+%Forward Love number solution for a viscoelastic earth, model M3-L70-V01 from
+%Spada, G., Barletta, V. R., Klemann, V., Riva, R. E. M., Martinec, Z.,
+%Gasperini, P., Lund, B., Wolf, D., Vermeersen, L. L. A. and King, M. A.
+%(2011), A benchmark study for glacial isostatic adjustment codes. Geophysical
+%Journal International, 185: 106--132. doi:10.1111/j.1365-246X.2011.04952.x
+
+md=model();
+md.cluster=generic('name',oshostname(),'np',3);
+
+md.materials=materials('litho');
+md.miscellaneous.name='test2072';
+md.groundingline.migration='None';
+
+md.verbose=verbose('all');
+md.verbose=verbose('1111111111111111');
+cst=365.25*24*3600*1000;
+
+
+%Model VSS96 from Vermeersen, L.L.A., Sabadini, R. & Spada, G., 1996a. Analytical visco-elastic relaxation models, Geophys. Res. Lett., 23, 697–700.
+md.materials.radius=[10, 1222.5, 3480., 3600., 3630.5, 3700., 3900., 4000., 4200., 4300., 4500., 4600., 4800., 4900., 5100., 5200., 5400., 5500., 5600.5, 5650., 5701., 5736., 5771.5, 5821., 5951., 5970.5, 6016., 6061., 6150.5, 6151.5, 6251., 6371.]'*1e3;
+md.materials.lame_mu=[1e-5, 0., 2.933, 2.8990002, 2.8550003, 2.7340002, 2.675, 2.559, 2.502, 2.388, 2.331, 2.215, 2.157, 2.039, 1.979, 1.8560001, 1.794, 1.73, 1.639, 1.2390001, 1.224, 1.21, 1.128, 0.97700006, 0.906, 0.79, 0.773, 0.741, 0.656, 0.665, 0.602]'*1e11;
+md.materials.density=[10925., 10925., 5506.42, 5491.45, 5456.57, 5357.06, 5307.24, 5207.13, 5156.69, 5054.69, 5002.99, 4897.83, 4844.22, 4734.6, 4678.44, 4563.07, 4503.72, 4443.16, 4412.41, 3992.14, 3983.99, 3975.84, 3912.82, 3786.78, 3723.78, 3516.39, 3489.51, 3435.78, 3359.5, 3367.1, 3184.3]';
+md.materials.viscosity=[0., 0., 7.999999999999999E+21, 8.5E+21, 8.999999999999999E+21, 3.E+22, 4.E+22, 5.0000000000000004E+22, 6.E+22, 5.0000000000000004E+22, 4.5E+22, 3.E+22, 2.5000000000000002E+22, 1.7999999999999998E+22, 1.3E+22, 7.999999999999999E+21, 6.999999999999999E+21, 6.5E+21, 6.E+21, 5.5E+21, 5.E+21, 4.4999999999999995E+21, 3.9999999999999995E+21, 2.5E+21, 1.9999999999999997E+21, 1.5E+21, 9.999999999999999E+20, 6.E+20, 5.5000000000000007E+20, 2.E+20, 1.E40]';
+md.materials.lame_lambda=md.materials.lame_mu*0+5e17;
+md.materials.issolid=md.materials.lame_mu>0;
+md.materials.numlayers=length(md.materials.lame_mu);
+md.materials.burgers_mu=md.materials.lame_mu;
+md.materials.burgers_viscosity=md.materials.viscosity;
+md.materials.rheologymodel=md.materials.issolid*0;
+md.materials.burgers_mu=md.materials.lame_mu/3;
+md.materials.burgers_viscosity=md.materials.viscosity/10;
+md.materials.ebm_alpha= ones(md.materials.numlayers,1)*.9;
+md.materials.ebm_delta= ones(md.materials.numlayers,1)*0.2;
+md.materials.ebm_taul= ones(md.materials.numlayers,1)*54*60; %54min
+md.materials.ebm_tauh= ones(md.materials.numlayers,1)*18.6*cst/1e3; %18.6yr
+
+md.love.allow_layer_deletion=1;
+md.love.frequencies=[0];
+md.love.nfreq=length(md.love.frequencies);
+md.love.sh_nmin=1;
+md.love.sh_nmax=256;
+md.love.underflow_tol=1e-20;
+md.love.pw_threshold=1e-3;
+md.love.Gravitational_Constant=6.6732e-11;
+md.love.integration_steps_per_layer=100;
+md.love.allow_layer_deletion=1;
+md.love.forcing_type=11;
+md.love.chandler_wobble=0;
+md.love.complex_computation=0;
+md.love.istemporal=1;
+md.love.n_temporal_iterations=8;
+%md.love.time=[0; (logspace(-3,6, 202))'*cst];
+md.love.time=[0; 10.^([-3.0000e+00  -2.1045e+00  -1.2090e+00  -3.1343e-01   5.8209e-01   1.4776e+00   2.3731e+00   3.2687e+00   4.1642e+00   5.0597e+00   5.9552e+00])'*cst];
+md.love=md.love.build_frequencies_from_time;
+
+md.love.love_kernels=1;
+
+md=solve(md,'lv');
+
+h=md.results.LoveSolution.LoveHt;
+l=md.results.LoveSolution.LoveLt;
+k=md.results.LoveSolution.LoveKt;
+
+%Fields and tolerances to track changes
+
+field_names     ={'LoveH_loading_elastic','LoveK_loading_elastic','LoveL_loading_elastic'};
+field_tolerances={3.0e-6,1.0e-5,5.0e-7};
+field_values={h,k,l};
+
Index: /issm/trunk/test/NightlyRun/test2084.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2084.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2084.m	(revision 27035)
@@ -7,7 +7,7 @@
 
 md=model();
-md.cluster=generic('name',oshostname(),'np',1);
+md.cluster=generic('name',oshostname(),'np',8);
 
-% set validation=1 for comparing against the Spada benchark.
+% set validation=1 for comparing against the Spada benchmark.
 validation=0; 
 
@@ -17,4 +17,5 @@
 
 md.verbose=verbose('all');
+md.verbose=verbose('1111111111111111');
 cst=365.25*24*3600*1000;
 
@@ -36,16 +37,23 @@
 
 md.love.allow_layer_deletion=1;
-md.love.frequencies=([0]*2*pi)'/cst;
+md.love.frequencies=[0; (logspace(-6,3, 1000))'/cst];
 md.love.nfreq=length(md.love.frequencies);
 md.love.sh_nmin=1;
-md.love.sh_nmax=256;
+md.love.sh_nmax=1000;
 md.love.underflow_tol=1e-20;
+md.love.pw_threshold=1e-3;
 md.love.Gravitational_Constant=6.6732e-11;
-md.love.integration_steps_per_layer=200;
+md.love.integration_steps_per_layer=100;
+md.love.allow_layer_deletion=1;
+md.love.forcing_type=11;
+md.love.chandler_wobble=0;
+md.love.complex_computation=0;
 
 md.love.istemporal=1;
 md.love.n_temporal_iterations=8;
-%md.love.time=(logspace(-4,5, 2))'*cst;
-md.love.time=(logspace(-1,2, 50))'*cst;
+%md.love.time=(logspace(-6,5, 2))'*cst;
+md.love.time=[0; (logspace(-3,5, 24))'*cst];
+
+%md.love.time=(linspace(1/12,10, 10*12))'*cst/1e3;
 md.love.love_kernels=1;
 if md.love.istemporal
@@ -55,7 +63,7 @@
 md=solve(md,'lv');
 
-ht2=md.results.LoveSolution.LoveHr;
-lt2=md.results.LoveSolution.LoveLr;
-kt2=md.results.LoveSolution.LoveKr;
+ht=md.results.LoveSolution.LoveHt';
+lt=md.results.LoveSolution.LoveLt';
+kt=md.results.LoveSolution.LoveKt';
 t=md.love.time/cst*1e3;
 
@@ -69,8 +77,83 @@
 field_tolerances={2.0e-8,2.0e-8,2.0e-8};
 field_values={...
-	(md.results.LoveSolution.LoveHr(:,1)),...
-	(md.results.LoveSolution.LoveKr(:,1)),...
-	(md.results.LoveSolution.LoveLr(:,1)),...
+	(md.results.LoveSolution.LoveHt(:,1)),...
+	(md.results.LoveSolution.LoveKt(:,1)),...
+	(md.results.LoveSolution.LoveLt(:,1)),...
 	};
+
+return
+
+if false
+addpath('../../../../invGIA/Spada_benchmark/')
+load spada.mat
+s_weak=[9 12 15];
+
+hspada(:,s_weak)=[];
+kspada(:,s_weak)=[];
+lspada(:,s_weak)=[];
+
+hts=zeros(length(t),md.love.sh_nmax+1);
+lts=zeros(length(t),md.love.sh_nmax+1);
+kts=zeros(length(t),md.love.sh_nmax+1);
+for d=max(2,md.love.sh_nmin):md.love.sh_nmax
+hts(:,d+1)=hspada(d-1,2);
+lts(:,d+1)=lspada(d-1,2);
+kts(:,d+1)=kspada(d-1,2);
+for mo=1:9 
+hts(:,d+1)=hts(:,d+1)-hspada(d-1,3+mo)./sspada(d-1,1+mo).*(1-exp(t/1e3*sspada(d-1,1+mo)));
+lts(:,d+1)=lts(:,d+1)-lspada(d-1,3+mo)./sspada(d-1,1+mo).*(1-exp(t/1e3*sspada(d-1,1+mo)));
+kts(:,d+1)=kts(:,d+1)-kspada(d-1,3+mo)./sspada(d-1,1+mo).*(1-exp(t/1e3*sspada(d-1,1+mo)));
+end
+end
+close all
+
+if md.love.sh_nmin==md.love.sh_nmax
+subplot(2,3,1)
+plot(t/cst*1e3,ht(:,md.love.sh_nmin+1),'x-',t/cst*1e3,hts);
+set(gca, 'xscale', 'log'); shading flat;
+title('h')
+
+subplot(2,3,2)
+plot(t/cst*1e3,lt(:,md.love.sh_nmin+1),'x-',t/cst*1e3,lts);
+set(gca, 'xscale', 'log'); shading flat;
+title('l')
+
+subplot(2,3,3)
+plot(t/cst*1e3,kt(:,md.love.sh_nmin+1),'x-',t/cst*1e3,kts);
+set(gca, 'xscale', 'log'); shading flat;
+title('k')
+
+subplot(2,3,4)
+plot(t/cst*1e3,log10(abs((ht-hts)./hts))');
+set(gca, 'xscale', 'log'); shading flat;
+
+subplot(2,3,5)
+plot(t/cst*1e3,log10(abs((lt-lts)./lts))');
+set(gca, 'xscale', 'log'); shading flat;
+title('l')
+
+subplot(2,3,6)
+plot(t/cst*1e3,log10(abs((kt-kts)./kts))');
+set(gca, 'xscale', 'log'); shading flat;
+title('k')
+else
+
+[T,N]=meshgrid(t/cst*1e3,0:md.love.sh_nmax);
+subplot(1,3,1)
+pcolor(T,N,log10(abs((ht-hts)./hts))');
+set(gca, 'xscale', 'log'); shading flat;colorbar;
+title('h')
+
+subplot(1,3,2)
+pcolor(T,N,log10(abs((lt-lts)./lts))');
+set(gca, 'xscale', 'log'); shading flat;colorbar;
+title('l')
+
+subplot(1,3,3)
+pcolor(T,N,log10(abs((kt-kts)./kts))');
+set(gca, 'xscale', 'log'); shading flat;colorbar;
+title('k')
+end
+
 
 % validate elastic loading solutions against the Spada benchmark. {{{ 
@@ -100,147 +183,5 @@
 	% 
 end 
+
+end
 % }}} 
-
-md.love.frequencies=([1e-3 1e-2 1e-1 1 -1e-3 -1e-2 -1e-1 -1]*2*pi)'/cst;
-md.love.nfreq=length(md.love.frequencies);
-md.love.sh_nmax=256;
-md.materials.burgers_mu=md.materials.lame_mu;
-md.materials.burgers_viscosity=md.materials.viscosity;
-
-md=solve(md,'lv');
-
-%Fields and tolerances to track changes
-field_names     ={field_names{:},'LoveH_loading_realpart','LoveK_loading_realpart','LoveL_loading_realpart','LoveH_loading_imagpart','LoveK_loading_imagpart','LoveL_loading_imagpart'};
-field_tolerances={field_tolerances{:},5e-7,5e-7,5e-7,5e-7,5e-7,5e-7};
-field_values={field_values{:},...
-	(md.results.LoveSolution.LoveHr(:,:)),...
-	(md.results.LoveSolution.LoveKr(:,:)),...
-	(md.results.LoveSolution.LoveLr(:,:)),...
-	(md.results.LoveSolution.LoveHi(:,:)),...
-	(md.results.LoveSolution.LoveKi(:,:)),...
-	(md.results.LoveSolution.LoveLi(:,:)),...
-	};
-
-md.love.forcing_type=9;
-md.love.sh_nmin=2;
-md.love.frequencies=([0 1e-3 1e-2 1e-1 1 -1e-3 -1e-2 -1e-1 -1]*2*pi)'/cst;
-md.love.nfreq=length(md.love.frequencies);
-md=solve(md,'lv');
-
-% validate elastic tidal solutions against the Spada benchmark. {{{ 
-if validation 
-	spada_solutions = load('spada_elastic_tidal_deg_h_l_k'); 
-	spada_d = spada_solutions(:,1); 
-	spada_h = spada_solutions(:,2); 
-	spada_l = spada_solutions(:,3); 
-	spada_k = spada_solutions(:,4); 
-
-	%rename ISSM solutions.  
-	issm_d = [2:md.love.sh_nmax];  
-	issm_h = md.results.LoveSolution.LoveHr(3:end,1); 
-	issm_l = md.results.LoveSolution.LoveLr(3:end,1); 
-	issm_k = md.results.LoveSolution.LoveKr(3:end,1); 
-
-	% relative difference for each degree, except for zero and one. 
-	diff_h = 1 - issm_h./spada_h;  
-	diff_l = 1 - issm_l./spada_l;  
-	diff_k = 1 - issm_k./spada_k;  
-
-	% k seems to have larger relative difference at higher degrees, although values approach zero. 
-	figure 
-	plot(spada_d,issm_k./spada_k);
-
-	figure 
-	plot(spada_d,[diff_h diff_l diff_k]); grid on; 
-	legend('h','l','k'); title('tidal love'); 
-else
-	% 
-end 
-% }}} 
-
-%tidal love numbers
-field_names     ={field_names{:},'LoveH_tidal_elastic','LoveK_tidal_elastic','LoveL_tidal_elastic','LoveH_tidal_realpart','LoveK_tidal_realpart','LoveL_tidal_realpart','LoveH_tidal_imagpart','LoveK_tidal_imagpart','LoveL_tidal_imagpart'};
-field_tolerances={field_tolerances{:},8e-6,8e-6,8e-6,8e-6,8e-6,8e-6,8e-6,8e-6,8e-6};
-field_values={field_values{:},...
-	(md.results.LoveSolution.LoveHr(:,1)),...
-	(md.results.LoveSolution.LoveKr(:,1)),...
-	(md.results.LoveSolution.LoveLr(:,1)),...
-	(md.results.LoveSolution.LoveHr(:,2:end)),...
-	(md.results.LoveSolution.LoveKr(:,2:end)),...
-	(md.results.LoveSolution.LoveLr(:,2:end)),...
-	(md.results.LoveSolution.LoveHi(:,2:end)),...
-	(md.results.LoveSolution.LoveKi(:,2:end)),...
-	(md.results.LoveSolution.LoveLi(:,2:end)),...
-	};
-
-%Many layers PREM-based model
-%data=load('../Data/PREM_500layers');
-%md.love.sh_nmin=1;
-%md.materials.radius=data(2:end-2,1);
-%md.materials.density=data(3:end-2,2);
-%md.materials.lame_lambda=data(3:end-2,3);
-%md.materials.lame_mu=data(3:end-2,4);
-%md.materials.issolid=data(3:end-2,4)>0;
-%ind=find(md.materials.issolid==0);
-%md.materials.density(ind(1))=sum((md.materials.radius(ind+1).^3-md.materials.radius(ind).^3).*md.materials.density(ind))/(md.materials.radius(ind(end)+1).^3-md.materials.radius(ind(1)+1).^3);
-%md.materials.lame_lambda(ind(1))=sum((md.materials.radius(ind+1).^3-md.materials.radius(ind).^3).*md.materials.lame_lambda(ind))/(md.materials.radius(ind(end)+1).^3-md.materials.radius(ind(1)+1).^3);
-%md.materials.lame_mu(ind(1))=sum((md.materials.radius(ind+1).^3-md.materials.radius(ind).^3).*md.materials.lame_mu(ind))/(md.materials.radius(ind(end)+1).^3-md.materials.radius(ind(1)).^3);
-%md.materials.radius(ind(2:end)+1)=[];
-%md.materials.density(ind(2:end))=[];
-%md.materials.lame_lambda(ind(2:end))=[];
-%md.materials.lame_mu(ind(2:end))=[];
-%md.materials.issolid(ind(2:end))=[];
-%md.materials.viscosity=10.^interp1([0 3479e3 3480e3 3680e3 5720e3 5800e3 6270e3 6371e3], log10([1e8 1e8 5e21 1e23 1e22 1e20 1e21 1e40]), md.materials.radius(2:end),'PCHIP');
-%md.materials.viscosity=md.materials.viscosity.*md.materials.issolid;
-%md.materials.burgers_mu=md.materials.lame_mu;
-%md.materials.burgers_viscosity=md.materials.viscosity;
-%md.materials.rheologymodel=md.materials.issolid*0;
-%md.love.forcing_type=11;
-%md.materials.numlayers=length(md.materials.viscosity);
-%md=solve(md,'lv');
-%
-%field_names     ={field_names{:},'LoveH_loadingVSS96_elastic','LoveK_loadingVSS96_elastic','LoveL_loadingVSS96_elastic','LoveH_loadingVSS96_realpart','LoveK_loadingVSS96_realpart','LoveL_loadingVSS96_realpart','LoveH_loadingVSS96_imagpart','LoveK_loadingVSS96_imagpart','LoveL_loadingVSS96_imagpart'};
-%field_tolerances={field_tolerances{:},2e-6,2e-6,2e-6,2e-6,2e-6,2e-6,2e-6,2e-6,2e-6};
-%field_values={field_values{:},...
-%	(md.results.LoveSolution.LoveHr(:,1)),...
-%	(md.results.LoveSolution.LoveKr(:,1)),...
-%	(md.results.LoveSolution.LoveLr(:,1)),...
-%	(md.results.LoveSolution.LoveHr(:,2:end)),...
-%	(md.results.LoveSolution.LoveKr(:,2:end)),...
-%	(md.results.LoveSolution.LoveLr(:,2:end)),...
-%	(md.results.LoveSolution.LoveHi(:,2:end)),...
-%	(md.results.LoveSolution.LoveKi(:,2:end)),...
-%	(md.results.LoveSolution.LoveLi(:,2:end)),...
-%	};
-
-%Model VSS96 from Vermeersen, L.L.A., Sabadini, R. & Spada, G., 1996a. Analytical visco-elastic relaxation models, Geophys. Res. Lett., 23, 697–700.
-md.materials.radius=[10, 1222.5, 3480., 3600., 3630.5, 3700., 3900., 4000., 4200., 4300., 4500., 4600., 4800., 4900., 5100., 5200., 5400., 5500., 5600.5, 5650., 5701., 5736., 5771.5, 5821., 5951., 5970.5, 6016., 6061., 6150.5, 6151.5, 6251., 6371.]'*1e3;
-md.materials.lame_mu=[1e-5, 0., 2.933, 2.8990002, 2.8550003, 2.7340002, 2.675, 2.559, 2.502, 2.388, 2.331, 2.215, 2.157, 2.039, 1.979, 1.8560001, 1.794, 1.73, 1.639, 1.2390001, 1.224, 1.21, 1.128, 0.97700006, 0.906, 0.79, 0.773, 0.741, 0.656, 0.665, 0.602]'*1e11;
-md.materials.density=[10925., 10925., 5506.42, 5491.45, 5456.57, 5357.06, 5307.24, 5207.13, 5156.69, 5054.69, 5002.99, 4897.83, 4844.22, 4734.6, 4678.44, 4563.07, 4503.72, 4443.16, 4412.41, 3992.14, 3983.99, 3975.84, 3912.82, 3786.78, 3723.78, 3516.39, 3489.51, 3435.78, 3359.5, 3367.1, 3184.3]';
-md.materials.viscosity=[0., 0., 7.999999999999999E+21, 8.5E+21, 8.999999999999999E+21, 3.E+22, 4.E+22, 5.0000000000000004E+22, 6.E+22, 5.0000000000000004E+22, 4.5E+22, 3.E+22, 2.5000000000000002E+22, 1.7999999999999998E+22, 1.3E+22, 7.999999999999999E+21, 6.999999999999999E+21, 6.5E+21, 6.E+21, 5.5E+21, 5.E+21, 4.4999999999999995E+21, 3.9999999999999995E+21, 2.5E+21, 1.9999999999999997E+21, 1.5E+21, 9.999999999999999E+20, 6.E+20, 5.5000000000000007E+20, 2.E+20, 1.E40]';
-md.materials.lame_lambda=md.materials.lame_mu*0+5e14;
-md.materials.issolid=md.materials.lame_mu>0;
-md.materials.numlayers=length(md.materials.lame_mu);
-md.materials.burgers_mu=md.materials.lame_mu;
-md.materials.burgers_viscosity=md.materials.viscosity;
-md.materials.rheologymodel=md.materials.issolid*0;
-md.love.forcing_type=11;
-md.love.sh_nmin=1;
-md.love.sh_nmax=100;
-md=solve(md,'lv');
-md.love.frequencies=([0 1e-3 1e-2 1 -1e-3 -1e-2 -1]*2*pi)'/cst;
-md.love.nfreq=length(md.love.frequencies);
-
-field_names     ={field_names{:},'LoveH_loadingVSS96_elastic','LoveK_loadingVSS96_elastic','LoveL_loadingVSS96_elastic','LoveH_loadingVSS96_realpart','LoveK_loadingVSS96_realpart','LoveL_loadingVSS96_realpart','LoveH_loadingVSS96_imagpart','LoveK_loadingVSS96_imagpart','LoveL_loadingVSS96_imagpart'};
-field_tolerances={field_tolerances{:},2e-6,2e-6,2e-6,2e-6,2e-6,2e-6,2e-6,2e-6,2e-6};
-field_values={field_values{:},...
-	(md.results.LoveSolution.LoveHr(:,1)),...
-	(md.results.LoveSolution.LoveKr(:,1)),...
-	(md.results.LoveSolution.LoveLr(:,1)),...
-	(md.results.LoveSolution.LoveHr(:,2:end)),...
-	(md.results.LoveSolution.LoveKr(:,2:end)),...
-	(md.results.LoveSolution.LoveLr(:,2:end)),...
-	(md.results.LoveSolution.LoveHi(:,2:end)),...
-	(md.results.LoveSolution.LoveKi(:,2:end)),...
-	(md.results.LoveSolution.LoveLi(:,2:end)),...
-	};
Index: /issm/trunk/test/NightlyRun/test2084.py
===================================================================
--- /issm/trunk/test/NightlyRun/test2084.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2084.py	(revision 27035)
@@ -15,7 +15,7 @@
 
 md = model()
-md.cluster = generic('name', gethostname(), 'np', 1)
+md.cluster = generic('name', gethostname(), 'np', 8)
 
-# Set validation=1 for comparing against the Spada benchark
+# Set validation=1 for comparing against the Spada benchmark
 validation = 0
 
@@ -25,4 +25,5 @@
 
 md.verbose = verbose('all')
+md.verbose = verbose('1111111111111111')
 cst = 365.25 * 24 * 3600 * 1000
 
@@ -48,199 +49,46 @@
 
 md.love.allow_layer_deletion = 1
-md.love.frequencies = (np.array([0]) * 2 * np.pi).reshape(-1, 1) / cst
+md.love.frequencies = np.vstack(([0], np.logspace(-6, 3, 1000).reshape(-1, 1) / cst))
 md.love.nfreq = len(md.love.frequencies)
 md.love.sh_nmin = 1
-md.love.sh_nmax = 256
+md.love.sh_nmax = 1000
 md.love.underflow_tol = 1e-20
+md.love.pw_threshold = 1e-3
 md.love.Gravitational_Constant = 6.6732e-11
-md.love.integration_steps_per_layer = 200
+md.love.integration_steps_per_layer = 100
+md.love.allow_layer_deletion = 1
+md.love.forcing_type = 11
+md.love.chandler_wobble = 0
+md.love.complex_computation = 0
 
 md.love.istemporal = 1
 md.love.n_temporal_iterations = 8
-#md.love.time = np.logspace(-4, 5, 2).reshape(-1, 1) * cst
-md.love.time = np.logspace(-1, 2, 50).reshape(-1, 1) * cst
+#md.love.time = np.logspace(-6, 5, 2).reshape(-1, 1) * cst
+md.love.time = np.vstack(([0], np.logspace(-3, 5, 24).reshape(-1, 1) * cst))
+
+#md.love.time = np.linspace(1/12, 10, 10 * 12).reshape(-1, 1) * cst / 1e3
 md.love.love_kernels = 1
 if md.love.istemporal:
-    md.love = md.love.build_frequencies_from_time
+    md.love = md.love.build_frequencies_from_time()
 
 md = solve(md, 'lv')
 
-ht2 = md.results.LoveSolution.LoveHr
-lt2 = md.results.LoveSolution.LoveLr
-kt2 = md.results.LoveSolution.LoveKr
+ht = md.results.LoveSolution.LoveHt.reshape(-1, 1)
+lt = md.results.LoveSolution.LoveLt.reshape(-1, 1)
+kt = md.results.LoveSolution.LoveKt.reshape(-1, 1)
 t = md.love.time / cst * 1e3
 
-#Fields and tolerances to track changes
-#loading love numbers
+# Fields and tolerances to track changes
+# loading love numbers
 field_names = ['LoveH_loading_elastic', 'LoveK_loading_elastic', 'LoveL_loading_elastic']
 field_tolerances = [2.0e-8, 2.0e-8, 2.0e-8]
 field_values = [
-    np.array(md.results.LoveSolution.LoveHr)[:, 0],
-    np.array(md.results.LoveSolution.LoveKr)[:, 0],
-    np.array(md.results.LoveSolution.LoveLr)[:, 0]
+    np.array(md.results.LoveSolution.LoveHt)[:, 0],
+    np.array(md.results.LoveSolution.LoveKt)[:, 0],
+    np.array(md.results.LoveSolution.LoveLt)[:, 0]
 ]
-
-# Validate elastic loading solutions against the Spada benchmark {{{
 
 # TODO:
 # - Implement read from file and comparison
 # - Implement plot
-#
-
-#}}}
-
-md.love.frequencies = (np.array([1e-3, 1e-2, 1e-1, 1, -1e-3, -1e-2, -1e-1, -1]) * 2 * np.np.pi).reshape(-1, 1) / cst
-md.love.nfreq = len(md.love.frequencies)
-md.love.sh_nmax = 256
-md.materials.burgers_mu = md.materials.lame_mu
-md.materials.burgers_viscosity = md.materials.viscosity
-
-md = solve(md, 'lv')
-
-#Fields and tolerances to track changes
-field_names += ['LoveH_loading_realpart', 'LoveK_loading_realpart', 'LoveL_loading_realpart', 'LoveH_loading_imagpart', 'LoveK_loading_imagpart', 'LoveL_loading_imagpart']
-field_tolerances += [5e-7, 5e-7, 5e-7, 5e-7, 5e-7, 5e-7]
-field_values += [
-    np.array(md.results.LoveSolution.LoveHr),
-    np.array(md.results.LoveSolution.LoveKr),
-    np.array(md.results.LoveSolution.LoveLr),
-    np.array(md.results.LoveSolution.LoveHi),
-    np.array(md.results.LoveSolution.LoveKi),
-    np.array(md.results.LoveSolution.LoveLi)
-]
-
-md.love.forcing_type = 9
-md.love.sh_nmin = 2
-md.love.frequencies = ((np.array([0, 1e-3, 1e-2, 1e-1, 1, -1e-3, -1e-2, -1e-1, -1]) * 2 * np.pi).reshape(-1, 1) / cst)
-md.love.nfreq = len(md.love.frequencies)
-md = solve(md, 'lv')
-
-# Validate elastic tidal solutions against the Spada benchmark #{{{
-
-# TODO:
-# - Implement read from file and comparison
-# - Implement plot
-#
-
-#}}}
-
-#tidal love numbers, check
-field_names += ['LoveH_tidal_elastic', 'LoveK_tidal_elastic', 'LoveL_tidal_elastic', 'LoveH_tidal_realpart', 'LoveK_tidal_realpart', 'LoveL_tidal_realpart', 'LoveH_tidal_imagpart', 'LoveK_tidal_imagpart', 'LoveL_tidal_imagpart']
-field_tolerances += [8e-6, 8e-6, 8e-6, 8e-6, 8e-6, 8e-6, 8e-6, 8e-6, 8e-6]
-field_values += [
-    np.array(md.results.LoveSolution.LoveHr)[:, 0],
-    np.array(md.results.LoveSolution.LoveKr)[:, 0],
-    np.array(md.results.LoveSolution.LoveLr)[:, 0],
-    np.array(md.results.LoveSolution.LoveHr)[:, 1:],
-    np.array(md.results.LoveSolution.LoveKr)[:, 1:],
-    np.array(md.results.LoveSolution.LoveLr)[:, 1:],
-    np.array(md.results.LoveSolution.LoveHi)[:, 1:],
-    np.array(md.results.LoveSolution.LoveKi)[:, 1:],
-    np.array(md.results.LoveSolution.LoveLi)[:, 1:]
-]
-
-# Many layers PREM-based model
-#data = load('../Data/PREM_500layers')
-#md.love.sh_nmin = 1
-#md.materials.radius = data(2:end - 2, 1)
-#md.materials.density = data(3:end - 2, 2)
-#md.materials.lame_lambda = data(3:end - 2, 3)
-#md.materials.lame_mu = data(3:end - 2, 4)
-#md.materials.issolid = data(3:end - 2, 4) > 0
-#ind = find(md.materials.issolid = 0)
-#md.materials.density(ind(1))=sum((md.materials.radius(ind + 1).^3 - md.materials.radius(ind).^3). * md.materials.density(ind)) / (md.materials.radius(ind(end) + 1).^3 - md.materials.radius(ind(1) + 1).^3)
-#md.materials.lame_lambda(ind(1))=sum((md.materials.radius(ind + 1).^3 - md.materials.radius(ind).^3). * md.materials.lame_lambda(ind)) / (md.materials.radius(ind(end) + 1).^3 - md.materials.radius(ind(1) + 1).^3)
-#md.materials.lame_mu(ind(1))=sum((md.materials.radius(ind + 1).^3 - md.materials.radius(ind).^3). * md.materials.lame_mu(ind)) / (md.materials.radius(ind(end) + 1).^3 - md.materials.radius(ind(1)).^3)
-#md.materials.radius(ind(2:end) + 1) = []
-#md.materials.density(ind(2:end)) = []
-#md.materials.lame_lambda(ind(2:end)) = []
-#md.materials.lame_mu(ind(2:end)) = []
-#md.materials.issolid(ind(2:end)) = []
-#md.materials.viscosity = 10.^interp1([0 3479e3 3480e3 3680e3 5720e3 5800e3 6270e3 6371e3], log10([1e8 1e8 5e21 1e23 1e22 1e20 1e21 1e40]), md.materials.radius(2:end), 'PCHIP')
-#md.materials.viscosity = md.materials.viscosity. * md.materials.issolid
-#md.materials.burgers_mu = md.materials.lame_mu
-#md.materials.burgers_viscosity = md.materials.viscosity
-#md.materials.rheologymodel = md.materials.issolid * 0
-#md.love.forcing_type = 11
-#md.materials.numlayers = len(md.materials.viscosity)
-#md = solve(md, 'lv')
-#
-#field_names = [field_names, 'LoveH_loadingVSS96_elastic', 'LoveK_loadingVSS96_elastic', 'LoveL_loadingVSS96_elastic', 'LoveH_loadingVSS96_realpart', 'LoveK_loadingVSS96_realpart', 'LoveL_loadingVSS96_realpart', 'LoveH_loadingVSS96_imagpart', 'LoveK_loadingVSS96_imagpart', 'LoveL_loadingVSS96_imagpart']
-#field_tolerances = [field_tolerances, 4.3e-9, 4.3e-9, 4.3e-9, 4.3e-9, 4.3e-9, 4.3e-9, 4.3e-9, 4.3e-9, 4.3e-9]
-#field_values = [field_values,
-#       (md.results.LoveSolution.LoveHr[:][0]),
-#       (md.results.LoveSolution.LoveKr[:][0]),
-#       (md.results.LoveSolution.LoveLr[:][0]),
-#       (md.results.LoveSolution.LoveHr[:][1:]),
-#       (md.results.LoveSolution.LoveKr[:][1:]),
-#       (md.results.LoveSolution.LoveLr[:][1:]),
-#       (md.results.LoveSolution.LoveHi[:][1:]),
-#       (md.results.LoveSolution.LoveKi[:][1:]),
-#       (md.results.LoveSolution.LoveLi[:][1:]),
-#       ]
-
-# Model VSS96 from Vermeersen, L.L.A., Sabadini, R. & Spada, G., 1996a. Analytical visco-elastic relaxation models, Geophys. Res. Lett., 23, 697-700.
-md.materials.radius = np.array([10, 1222.5, 3480., 3600., 3630.5, 3700., 3900., 4000.,
-                                4200., 4300., 4500., 4600., 4800., 4900., 5100., 5200.,
-                                5400., 5500., 5600.5, 5650., 5701., 5736., 5771.5,
-                                5821., 5951., 5970.5, 6016., 6061., 6150.5, 6151.5,
-                                6251., 6371.]).reshape(-1, 1) * 1e3
-md.materials.lame_mu = np.array([1e-5, 0., 2.933, 2.8990002, 2.8550003, 2.7340002, 2.675,
-                                2.559, 2.502, 2.388, 2.331, 2.215, 2.157, 2.039, 1.979,
-                                1.8560001, 1.794, 1.73, 1.639, 1.2390001, 1.224, 1.21,
-                                1.128, 0.97700006, 0.906, 0.79, 0.773, 0.741, 0.656, 0.665,
-                                0.602]).reshape(-1, 1) * 1e11
-md.materials.density = np.array([10925., 10925., 5506.42, 5491.45, 5456.57, 5357.06,
-                                5307.24, 5207.13, 5156.69, 5054.69, 5002.99, 4897.83,
-                                4844.22, 4734.6, 4678.44, 4563.07, 4503.72, 4443.16,
-                                4412.41, 3992.14, 3983.99, 3975.84, 3912.82, 3786.78,
-                                3723.78, 3516.39, 3489.51, 3435.78, 3359.5, 3367.1,
-                                3184.3]).reshape(-1, 1)
-md.materials.viscosity = np.array([0., 0., 7.999999999999999e+21, 8.5e+21,
-                                   8.999999999999999e+21, 3.e+22, 4.e+22,
-                                   5.0000000000000004e+22, 6.e+22,
-                                   5.0000000000000004e+22, 4.5e+22, 3.e+22,
-                                   2.5000000000000002e+22, 1.7999999999999998e+22,
-                                   1.3e+22, 7.999999999999999e+21, 6.999999999999999e+21,
-                                   6.5e+21, 6.e+21, 5.5e+21, 5.e+21, 4.4999999999999995e+21,
-                                   3.9999999999999995e+21, 2.5e+21,
-                                   1.9999999999999997e+21, 1.5e+21, 9.999999999999999e+20,
-                                   6.e+20, 5.5000000000000007e+20, 2.e+20,
-                                   1.E40]).reshape(-1, 1)
-md.materials.lame_lambda = np.array(md.materials.lame_mu) * 0 + 5e14
-md.materials.issolid = np.ones(len(md.materials.lame_mu)).reshape(-1, 1)
-md.materials.issolid[1] = 0
-md.materials.numlayers = len(md.materials.lame_mu)
-md.materials.burgers_mu = md.materials.lame_mu
-md.materials.burgers_viscosity = md.materials.viscosity
-md.materials.rheologymodel = md.materials.issolid * 0
-md.love.forcing_type = 11
-md.love.sh_nmin = 1
-md.love.sh_nmax = 100
-md = solve(md, 'lv')
-md.love.frequencies = (np.array([0, 1e-3, 1e-2, 1, -1e-3, -1e-2, -1]) * 2 * np.pi).reshape(-1, 1) / cst
-md.love.nfreq = len(md.love.frequencies)
-
-field_names += [
-    'LoveH_loadingVSS96_elastic',
-    'LoveK_loadingVSS96_elastic',
-    'LoveL_loadingVSS96_elastic',
-    'LoveH_loadingVSS96_realpart',
-    'LoveK_loadingVSS96_realpart',
-    'LoveL_loadingVSS96_realpart',
-    'LoveH_loadingVSS96_imagpart',
-    'LoveK_loadingVSS96_imagpart',
-    'LoveL_loadingVSS96_imagpart'
-]
-field_tolerances += [2e-6, 2e-6, 2e-6, 2e-6, 2e-6, 2e-6, 2e-6, 2e-6, 2e-6]
-field_values += [
-    np.array(md.results.LoveSolution.LoveHr)[:, 0],
-    np.array(md.results.LoveSolution.LoveKr)[:, 0],
-    np.array(md.results.LoveSolution.LoveLr)[:, 0],
-    np.array(md.results.LoveSolution.LoveHr)[:, 1:],
-    np.array(md.results.LoveSolution.LoveKr)[:, 1:],
-    np.array(md.results.LoveSolution.LoveLr)[:, 1:],
-    np.array(md.results.LoveSolution.LoveHi)[:, 1:],
-    np.array(md.results.LoveSolution.LoveKi)[:, 1:],
-    np.array(md.results.LoveSolution.LoveLi)[:, 1:]
-]
+# - Implement validation of elastic loading solutions against the Spada benchmark
Index: /issm/trunk/test/NightlyRun/test2085.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2085.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2085.m	(revision 27035)
@@ -8,65 +8,75 @@
 
 % for volumetric potential
-	md=model();
-	
-	md.materials=materials('litho');
-
-	md.materials.numlayers = 40;
-	md.love.forcing_type = 9;
-
-	md.materials.density=zeros(md.materials.numlayers,1)+5511;
-	md.materials.lame_mu=zeros(md.materials.numlayers,1)+0.75e11;
-	md.materials.viscosity=zeros(md.materials.numlayers,1)+1e21;
-	md.materials.lame_lambda=zeros(md.materials.numlayers,1)+5e17;
-	md.materials.issolid=ones(md.materials.numlayers,1);
-	md.materials.isburgers=zeros(md.materials.numlayers,1);
-	md.materials.burgers_mu=md.materials.lame_mu/3;
-	md.materials.burgers_viscosity=md.materials.viscosity/10;
-
-	md.materials.radius =  linspace(10e3,6371e3,md.materials.numlayers+1)';
-	md.love.g0 = 9.8134357285509388; % directly grabbed from fourierlovesolver for this particular case. 
-
-	md.love.allow_layer_deletion=1;
-	md.love.frequencies=0;
-	md.love.nfreq=length(md.love.frequencies); % TODO: Why are we grabbing length of a scalar here?
-
-	md.love.sh_nmin = 2;
-	md.love.sh_nmax = 200;
-	md.love.love_kernels=1; 
-
-	md.miscellaneous.name='kernels';
-	md.cluster=generic('name',oshostname(),'np',1);
-	md.verbose=verbose('111111101');
-	
-	md=solve(md,'lv');
-
-	% save yi's for all layers except for the inner-most one, at select degrees. 
-	degrees = [2 20 200];  % we archive solutions for degrees 2, 20, 200 
-
-	% extract love kernels {{{ 
-	% degree 2. 
-	y1_tidal_degree002 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(1)+1,1,2:end,1)));
-	y2_tidal_degree002 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(1)+1,1,2:end,2)));
-	y3_tidal_degree002 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(1)+1,1,2:end,3)));
-	y4_tidal_degree002 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(1)+1,1,2:end,4)));
-	y5_tidal_degree002 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(1)+1,1,2:end,5)));
-	y6_tidal_degree002 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(1)+1,1,2:end,6)));
-
-	% degree 20. 
-	y1_tidal_degree020 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(2)+1,1,2:end,1)));
-	y2_tidal_degree020 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(2)+1,1,2:end,2)));
-	y3_tidal_degree020 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(2)+1,1,2:end,3)));
-	y4_tidal_degree020 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(2)+1,1,2:end,4)));
-	y5_tidal_degree020 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(2)+1,1,2:end,5)));
-	y6_tidal_degree020 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(2)+1,1,2:end,6)));
-
-	% degree 200. 
-	y1_tidal_degree200 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(3)+1,1,2:end,1)));
-	y2_tidal_degree200 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(3)+1,1,2:end,2)));
-	y3_tidal_degree200 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(3)+1,1,2:end,3)));
-	y4_tidal_degree200 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(3)+1,1,2:end,4)));
-	y5_tidal_degree200 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(3)+1,1,2:end,5)));
-	y6_tidal_degree200 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(3)+1,1,2:end,6)));
-	% }}} 
+md=model();
+md.groundingline.migration='None';
+
+md.materials=materials('litho');
+cst=365.25*24*3600*1000;
+
+md.materials.numlayers = 40;
+md.love.forcing_type = 9;
+
+md.materials.density=zeros(md.materials.numlayers,1)+5511;
+md.materials.lame_mu=zeros(md.materials.numlayers,1)+0.75e11;
+md.materials.lame_lambda=zeros(md.materials.numlayers,1)+5e17;
+md.materials.issolid=ones(md.materials.numlayers,1);
+md.materials.rheologymodel=zeros(md.materials.numlayers,1);
+
+%the following isn't used here but needs to have arrays of consistent size with the rest of the materials
+md.materials.viscosity=zeros(md.materials.numlayers,1)+1e21;
+md.materials.burgers_mu=md.materials.lame_mu/3;
+md.materials.burgers_viscosity=md.materials.viscosity/10;
+md.materials.ebm_alpha= ones(md.materials.numlayers,1)*0.9;
+md.materials.ebm_delta= ones(md.materials.numlayers,1)*0.2;
+md.materials.ebm_taul= ones(md.materials.numlayers,1)*54*60; %54min
+md.materials.ebm_tauh= ones(md.materials.numlayers,1)*18.6*cst/1e3; %18.6yr
+
+md.materials.radius =  linspace(10e3,6371e3,md.materials.numlayers+1)';
+md.love.g0 = 9.8134357285509388; % directly grabbed from fourierlovesolver for this particular case. 
+
+md.love.allow_layer_deletion=1;
+md.love.frequencies=0;
+md.love.nfreq=1;
+md.love.istemporal=0;
+
+md.love.sh_nmin = 2;
+md.love.sh_nmax = 200;
+md.love.love_kernels=1; 
+
+md.miscellaneous.name='kernels';
+md.cluster=generic('name',oshostname(),'np',3);
+md.verbose=verbose('111111101');
+
+md=solve(md,'lv');
+
+% save yi's for all layers except for the inner-most one, at select degrees. 
+degrees = [2 20 200];  % we archive solutions for degrees 2, 20, 200 
+kernels=reshape(md.results.LoveSolution.LoveKernels, [md.love.sh_nmax+1 md.love.nfreq md.materials.numlayers+1 6]);
+
+% extract love kernels {{{ 
+% degree 2.
+y1_tidal_degree002 = squeeze(kernels(degrees(1)+1,1,2:end,1));
+y2_tidal_degree002 = squeeze(kernels(degrees(1)+1,1,2:end,2));
+y3_tidal_degree002 = squeeze(kernels(degrees(1)+1,1,2:end,3));
+y4_tidal_degree002 = squeeze(kernels(degrees(1)+1,1,2:end,4));
+y5_tidal_degree002 = squeeze(kernels(degrees(1)+1,1,2:end,5));
+y6_tidal_degree002 = squeeze(kernels(degrees(1)+1,1,2:end,6));
+
+% degree 20. 
+y1_tidal_degree020 = squeeze(kernels(degrees(2)+1,1,2:end,1));
+y2_tidal_degree020 = squeeze(kernels(degrees(2)+1,1,2:end,2));
+y3_tidal_degree020 = squeeze(kernels(degrees(2)+1,1,2:end,3));
+y4_tidal_degree020 = squeeze(kernels(degrees(2)+1,1,2:end,4));
+y5_tidal_degree020 = squeeze(kernels(degrees(2)+1,1,2:end,5));
+y6_tidal_degree020 = squeeze(kernels(degrees(2)+1,1,2:end,6));
+
+% degree 200. 
+y1_tidal_degree200 = squeeze(kernels(degrees(3)+1,1,2:end,1));
+y2_tidal_degree200 = squeeze(kernels(degrees(3)+1,1,2:end,2));
+y3_tidal_degree200 = squeeze(kernels(degrees(3)+1,1,2:end,3));
+y4_tidal_degree200 = squeeze(kernels(degrees(3)+1,1,2:end,4));
+y5_tidal_degree200 = squeeze(kernels(degrees(3)+1,1,2:end,5));
+y6_tidal_degree200 = squeeze(kernels(degrees(3)+1,1,2:end,6));
+% }}} 
 
 % validate tidal potential solutions against the analytic solutions. {{{ 
@@ -100,10 +110,11 @@
 	depth = (max(param.radius)-param.radius)/1000; % km.
 
-	y1 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(:,1,:,1)));
-	y2 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(:,1,:,2)));
-	y3 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(:,1,:,3)));
-	y4 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(:,1,:,4)));
-	y5 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(:,1,:,5)));
-	y6 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(:,1,:,6)));
+	kernels=reshape(md.results.LoveSolution.LoveKernels, [md.love.sh_nmax+1 md.love.nfreq md.materials.numlayers+1 6]);
+	y1 = squeeze(kernels(:,1,:,1));
+	y2 = squeeze(kernels(:,1,:,2));
+	y3 = squeeze(kernels(:,1,:,3));
+	y4 = squeeze(kernels(:,1,:,4));
+	y5 = squeeze(kernels(:,1,:,5));
+	y6 = squeeze(kernels(:,1,:,6));
 	
 	set(0,'DefaultAxesFontSize',16,'DefaultTextFontSize',15,'DefaultAxesLineWidth',1,...
@@ -165,5 +176,4 @@
 	legend(axes6,'n=2','n=4','n=8','n=16','n=32'); 
 	%export_fig('/Users/adhikari/issm/trunk-jpl/src/m/contrib/adhikari/issm_vs_analytic_loading_homogeneous.pdf'); 
-	
 else
 	% 
@@ -172,33 +182,33 @@
 
 % for surface load. 
-
-	md.love.forcing_type = 11;
-	md=solve(md,'lv');
-
-	% extract love kernels {{{ 
-	% degree 2. 
-	y1_loading_degree002 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(1)+1,1,2:end,1)));
-	y2_loading_degree002 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(1)+1,1,2:end,2)));
-	y3_loading_degree002 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(1)+1,1,2:end,3)));
-	y4_loading_degree002 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(1)+1,1,2:end,4)));
-	y5_loading_degree002 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(1)+1,1,2:end,5)));
-	y6_loading_degree002 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(1)+1,1,2:end,6)));
-
-	% degree 20. 
-	y1_loading_degree020 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(2)+1,1,2:end,1)));
-	y2_loading_degree020 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(2)+1,1,2:end,2)));
-	y3_loading_degree020 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(2)+1,1,2:end,3)));
-	y4_loading_degree020 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(2)+1,1,2:end,4)));
-	y5_loading_degree020 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(2)+1,1,2:end,5)));
-	y6_loading_degree020 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(2)+1,1,2:end,6)));
-
-	% degree 200. 
-	y1_loading_degree200 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(3)+1,1,2:end,1)));
-	y2_loading_degree200 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(3)+1,1,2:end,2)));
-	y3_loading_degree200 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(3)+1,1,2:end,3)));
-	y4_loading_degree200 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(3)+1,1,2:end,4)));
-	y5_loading_degree200 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(3)+1,1,2:end,5)));
-	y6_loading_degree200 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(degrees(3)+1,1,2:end,6)));
-	% }}} 
+md.love.forcing_type = 11;
+md=solve(md,'lv');
+kernels=reshape(md.results.LoveSolution.LoveKernels, [md.love.sh_nmax+1 md.love.nfreq md.materials.numlayers+1 6]);
+
+% extract love kernels {{{ 
+% degree 2. 
+y1_loading_degree002 = squeeze(kernels(degrees(1)+1,1,2:end,1));
+y2_loading_degree002 = squeeze(kernels(degrees(1)+1,1,2:end,2));
+y3_loading_degree002 = squeeze(kernels(degrees(1)+1,1,2:end,3));
+y4_loading_degree002 = squeeze(kernels(degrees(1)+1,1,2:end,4));
+y5_loading_degree002 = squeeze(kernels(degrees(1)+1,1,2:end,5));
+y6_loading_degree002 = squeeze(kernels(degrees(1)+1,1,2:end,6));
+
+% degree 20. 
+y1_loading_degree020 = squeeze(kernels(degrees(2)+1,1,2:end,1));
+y2_loading_degree020 = squeeze(kernels(degrees(2)+1,1,2:end,2));
+y3_loading_degree020 = squeeze(kernels(degrees(2)+1,1,2:end,3));
+y4_loading_degree020 = squeeze(kernels(degrees(2)+1,1,2:end,4));
+y5_loading_degree020 = squeeze(kernels(degrees(2)+1,1,2:end,5));
+y6_loading_degree020 = squeeze(kernels(degrees(2)+1,1,2:end,6));
+
+% degree 200. 
+y1_loading_degree200 = squeeze(kernels(degrees(3)+1,1,2:end,1));
+y2_loading_degree200 = squeeze(kernels(degrees(3)+1,1,2:end,2));
+y3_loading_degree200 = squeeze(kernels(degrees(3)+1,1,2:end,3));
+y4_loading_degree200 = squeeze(kernels(degrees(3)+1,1,2:end,4));
+y5_loading_degree200 = squeeze(kernels(degrees(3)+1,1,2:end,5));
+y6_loading_degree200 = squeeze(kernels(degrees(3)+1,1,2:end,6));
+% }}} 
 
 % validate loading solutions against the analytic solutions. {{{ 
@@ -225,10 +235,11 @@
 	depth = (max(param.radius)-param.radius)/1000; % km.
 
-	y1 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(:,1,:,1)));
-	y2 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(:,1,:,2)));
-	y3 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(:,1,:,3)));
-	y4 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(:,1,:,4)));
-	y5 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(:,1,:,5)));
-	y6 = squeeze(cell2mat(md.results.LoveSolution.LoveKernelsReal(:,1,:,6)));
+	kernels=reshape(md.results.LoveSolution.LoveKernels, [md.love.sh_nmax+1 md.love.nfreq md.materials.numlayers+1 6]);
+	y1 = squeeze(kernels(:,1,:,1));
+	y2 = squeeze(kernels(:,1,:,2));
+	y3 = squeeze(kernels(:,1,:,3));
+	y4 = squeeze(kernels(:,1,:,4));
+	y5 = squeeze(kernels(:,1,:,5));
+	y6 = squeeze(kernels(:,1,:,6));
 	
 	set(0,'DefaultAxesFontSize',16,'DefaultTextFontSize',15,'DefaultAxesLineWidth',1,...
@@ -290,5 +301,4 @@
 	legend(axes6,'n=2','n=4','n=8','n=16','n=32'); 
 	%export_fig('/Users/adhikari/issm/trunk-jpl/src/m/contrib/adhikari/issm_vs_analytic_tidal_homogeneous.pdf'); 
-	
 else
 	% 
Index: /issm/trunk/test/NightlyRun/test2085.py
===================================================================
--- /issm/trunk/test/NightlyRun/test2085.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2085.py	(revision 27035)
@@ -16,6 +16,8 @@
 # For volumetric potential
 md = model()
+md.groundingline.migration = 'None'
 
 md.materials = materials('litho')
+cst = 365.25 * 24 * 3600 * 1000
 
 md.materials.numlayers = 40
@@ -24,10 +26,16 @@
 md.materials.density = np.zeros((md.materials.numlayers, 1)) + 5511
 md.materials.lame_mu = np.zeros((md.materials.numlayers, 1)) + 0.75e11
+md.materials.lame_lambda = np.zeros((md.materials.numlayers, 1)) + 5e17
+md.materials.issolid = np.ones((md.materials.numlayers, 1))
+md.materials.rheologymodel = np.zeros((md.materials.numlayers, 1))
+
+# The following isn't used here but needs to hhave arrays of consistent size with the rest of the materials
 md.materials.viscosity = np.zeros((md.materials.numlayers, 1)) + 1e21
-md.materials.lame_lambda = np.zeros((md.materials.numlayers, 1)) + 0.5e17
-md.materials.issolid = np.ones((md.materials.numlayers, 1))
-md.materials.isburgers = np.zeros((md.materials.numlayers, 1))
 md.materials.burgers_mu = md.materials.lame_mu / 3
 md.materials.burgers_viscosity = md.materials.viscosity / 10
+md.materials.ebm_alpha = np.ones((md.materials.numlayers, 1)) * 0.9
+md.materials.ebm_delta = np.ones((md.materials.numlayers, 1)) * 0.2
+md.materials.ebm_taul = np.ones((md.materials.numlayers, 1)) * 54 * 60 # 54 min
+md.materials.ebm_tauh = np.ones((md.materials.numlayers, 1)) * 18.6 * cst / 1e3 # 18.6 yr
 
 md.materials.radius = np.linspace(10e3, 6371e3, md.materials.numlayers + 1).reshape(-1, 1)
@@ -37,4 +45,5 @@
 md.love.frequencies = 0
 md.love.nfreq = 1
+md.love.istemporal = 0
 
 md.love.sh_nmin = 2
@@ -43,5 +52,5 @@
 
 md.miscellaneous.name = 'kernels'
-md.cluster = generic('name', gethostname(), 'np', 1)
+md.cluster = generic('name', gethostname(), 'np', 3)
 md.verbose = verbose('111111101')
 
@@ -49,61 +58,62 @@
 
 # Save yi's for all layers except for the inner-most one, at select degrees.
-degrees = [2, 20, 200] # we archive solutions for degrees 2, 20, 200
+degrees = [1, 19, 199] # we archive solutions for degrees 2, 20, 200
+kernels = np.reshape(md.results.LoveSolution.LoveKernels, (md.love.sh_nmax + 1, md.love.nfreq, md.materials.numlayers + 1, 6), order='F')
 
 # Extract love kernels #{{{
 # degree 2
-y1_tidal_degree002 = md.results.LoveSolution.LoveKernelsReal[degrees[0],0,1:,0].squeeze()
-y2_tidal_degree002 = md.results.LoveSolution.LoveKernelsReal[degrees[0],0,1:,1].squeeze()
-y3_tidal_degree002 = md.results.LoveSolution.LoveKernelsReal[degrees[0],0,1:,2].squeeze()
-y4_tidal_degree002 = md.results.LoveSolution.LoveKernelsReal[degrees[0],0,1:,3].squeeze()
-y5_tidal_degree002 = md.results.LoveSolution.LoveKernelsReal[degrees[0],0,1:,4].squeeze()
-y6_tidal_degree002 = md.results.LoveSolution.LoveKernelsReal[degrees[0],0,1:,5].squeeze()
+y1_tidal_degree002 = kernels[degrees[0]+1,0,1:,0].squeeze()
+y2_tidal_degree002 = kernels[degrees[0]+1,0,1:,1].squeeze()
+y3_tidal_degree002 = kernels[degrees[0]+1,0,1:,2].squeeze()
+y4_tidal_degree002 = kernels[degrees[0]+1,0,1:,3].squeeze()
+y5_tidal_degree002 = kernels[degrees[0]+1,0,1:,4].squeeze()
+y6_tidal_degree002 = kernels[degrees[0]+1,0,1:,5].squeeze()
 
 # degree 20
-y1_tidal_degree020 = md.results.LoveSolution.LoveKernelsReal[degrees[1],0,1:,0].squeeze()
-y2_tidal_degree020 = md.results.LoveSolution.LoveKernelsReal[degrees[1],0,1:,1].squeeze()
-y3_tidal_degree020 = md.results.LoveSolution.LoveKernelsReal[degrees[1],0,1:,2].squeeze()
-y4_tidal_degree020 = md.results.LoveSolution.LoveKernelsReal[degrees[1],0,1:,3].squeeze()
-y5_tidal_degree020 = md.results.LoveSolution.LoveKernelsReal[degrees[1],0,1:,4].squeeze()
-y6_tidal_degree020 = md.results.LoveSolution.LoveKernelsReal[degrees[1],0,1:,5].squeeze()
+y1_tidal_degree020 = kernels[degrees[1]+1,0,1:,0].squeeze()
+y2_tidal_degree020 = kernels[degrees[1]+1,0,1:,1].squeeze()
+y3_tidal_degree020 = kernels[degrees[1]+1,0,1:,2].squeeze()
+y4_tidal_degree020 = kernels[degrees[1]+1,0,1:,3].squeeze()
+y5_tidal_degree020 = kernels[degrees[1]+1,0,1:,4].squeeze()
+y6_tidal_degree020 = kernels[degrees[1]+1,0,1:,5].squeeze()
 
 # degree 200
-y1_tidal_degree200 = md.results.LoveSolution.LoveKernelsReal[degrees[2],0,1:,0].squeeze()
-y2_tidal_degree200 = md.results.LoveSolution.LoveKernelsReal[degrees[2],0,1:,1].squeeze()
-y3_tidal_degree200 = md.results.LoveSolution.LoveKernelsReal[degrees[2],0,1:,2].squeeze()
-y4_tidal_degree200 = md.results.LoveSolution.LoveKernelsReal[degrees[2],0,1:,3].squeeze()
-y5_tidal_degree200 = md.results.LoveSolution.LoveKernelsReal[degrees[2],0,1:,4].squeeze()
-y6_tidal_degree200 = md.results.LoveSolution.LoveKernelsReal[degrees[2],0,1:,5].squeeze()
+y1_tidal_degree200 = kernels[degrees[2]+1,0,1:,0].squeeze()
+y2_tidal_degree200 = kernels[degrees[2]+1,0,1:,1].squeeze()
+y3_tidal_degree200 = kernels[degrees[2]+1,0,1:,2].squeeze()
+y4_tidal_degree200 = kernels[degrees[2]+1,0,1:,3].squeeze()
+y5_tidal_degree200 = kernels[degrees[2]+1,0,1:,4].squeeze()
+y6_tidal_degree200 = kernels[degrees[2]+1,0,1:,5].squeeze()
 #}}}
 
 # For surface load
 md.love.forcing_type = 11
-
 md = solve(md,'lv')
+kernels = np.reshape(md.results.LoveSolution.LoveKernels, (md.love.sh_nmax + 1, md.love.nfreq, md.materials.numlayers + 1, 6), order='F')
 
 # Extract love kernels #{{{
 # degree 2
-y1_loading_degree002 = md.results.LoveSolution.LoveKernelsReal[degrees[0],0,1:,0].squeeze()
-y2_loading_degree002 = md.results.LoveSolution.LoveKernelsReal[degrees[0],0,1:,1].squeeze()
-y3_loading_degree002 = md.results.LoveSolution.LoveKernelsReal[degrees[0],0,1:,2].squeeze()
-y4_loading_degree002 = md.results.LoveSolution.LoveKernelsReal[degrees[0],0,1:,3].squeeze()
-y5_loading_degree002 = md.results.LoveSolution.LoveKernelsReal[degrees[0],0,1:,4].squeeze()
-y6_loading_degree002 = md.results.LoveSolution.LoveKernelsReal[degrees[0],0,1:,5].squeeze()
+y1_loading_degree002 = kernels[degrees[0]+1,0,1:,0].squeeze()
+y2_loading_degree002 = kernels[degrees[0]+1,0,1:,1].squeeze()
+y3_loading_degree002 = kernels[degrees[0]+1,0,1:,2].squeeze()
+y4_loading_degree002 = kernels[degrees[0]+1,0,1:,3].squeeze()
+y5_loading_degree002 = kernels[degrees[0]+1,0,1:,4].squeeze()
+y6_loading_degree002 = kernels[degrees[0]+1,0,1:,5].squeeze()
 
 # degree 20
-y1_loading_degree020 = md.results.LoveSolution.LoveKernelsReal[degrees[1],0,1:,0].squeeze()
-y2_loading_degree020 = md.results.LoveSolution.LoveKernelsReal[degrees[1],0,1:,1].squeeze()
-y3_loading_degree020 = md.results.LoveSolution.LoveKernelsReal[degrees[1],0,1:,2].squeeze()
-y4_loading_degree020 = md.results.LoveSolution.LoveKernelsReal[degrees[1],0,1:,3].squeeze()
-y5_loading_degree020 = md.results.LoveSolution.LoveKernelsReal[degrees[1],0,1:,4].squeeze()
-y6_loading_degree020 = md.results.LoveSolution.LoveKernelsReal[degrees[1],0,1:,5].squeeze()
+y1_loading_degree020 = kernels[degrees[1]+1,0,1:,0].squeeze()
+y2_loading_degree020 = kernels[degrees[1]+1,0,1:,1].squeeze()
+y3_loading_degree020 = kernels[degrees[1]+1,0,1:,2].squeeze()
+y4_loading_degree020 = kernels[degrees[1]+1,0,1:,3].squeeze()
+y5_loading_degree020 = kernels[degrees[1]+1,0,1:,4].squeeze()
+y6_loading_degree020 = kernels[degrees[1]+1,0,1:,5].squeeze()
 
 # degree 200
-y1_loading_degree200 = md.results.LoveSolution.LoveKernelsReal[degrees[2],0,1:,0].squeeze()
-y2_loading_degree200 = md.results.LoveSolution.LoveKernelsReal[degrees[2],0,1:,1].squeeze()
-y3_loading_degree200 = md.results.LoveSolution.LoveKernelsReal[degrees[2],0,1:,2].squeeze()
-y4_loading_degree200 = md.results.LoveSolution.LoveKernelsReal[degrees[2],0,1:,3].squeeze()
-y5_loading_degree200 = md.results.LoveSolution.LoveKernelsReal[degrees[2],0,1:,4].squeeze()
-y6_loading_degree200 = md.results.LoveSolution.LoveKernelsReal[degrees[2],0,1:,5].squeeze()
+y1_loading_degree200 = kernels[degrees[2]+1,0,1:,0].squeeze()
+y2_loading_degree200 = kernels[degrees[2]+1,0,1:,1].squeeze()
+y3_loading_degree200 = kernels[degrees[2]+1,0,1:,2].squeeze()
+y4_loading_degree200 = kernels[degrees[2]+1,0,1:,3].squeeze()
+y5_loading_degree200 = kernels[degrees[2]+1,0,1:,4].squeeze()
+y6_loading_degree200 = kernels[degrees[2]+1,0,1:,5].squeeze()
 #}}}
 
Index: /issm/trunk/test/NightlyRun/test2090.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2090.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2090.m	(revision 27035)
@@ -3,5 +3,6 @@
 %mesh earth:
 md=model;
-md.mesh=gmshplanet('radius',6.371012*10^3,'resolution',700.);
+load ../Data/SlcTestMesh.mat;
+md.mesh=SlcMesh; %700 km resolution mesh
 
 %Geometry for the bed, arbitrary thickness of 1000: 
@@ -37,16 +38,18 @@
 %still use the lovenumbers constructor to initialize the fields: 
 load ../Data/lnb_temporal.mat
-md.solidearth.lovenumbers=lovenumbers('maxdeg',1000);
-md.solidearth.lovenumbers.timefreq=[0];
+%md.solidearth.lovenumbers=lovenumbers('maxdeg',1000);
+%md.solidearth.lovenumbers.timefreq=[0];
 
-md.solidearth.lovenumbers.h=[h1'];
-md.solidearth.lovenumbers.k=[k1'];
-md.solidearth.lovenumbers.l=[l1'];
+md.solidearth.lovenumbers.h=[ht];
+md.solidearth.lovenumbers.k=[kt];
+md.solidearth.lovenumbers.l=[lt];
 %md.solidearth.lovenumbers.h=repmat(md.solidearth.lovenumbers.h,1,100);
 %md.solidearth.lovenumbers.k=repmat(md.solidearth.lovenumbers.k,1,100);
 %md.solidearth.lovenumbers.l=repmat(md.solidearth.lovenumbers.l,1,100);
-md.solidearth.lovenumbers.th=repmat(md.solidearth.lovenumbers.th,1,101);
-md.solidearth.lovenumbers.tk=repmat(md.solidearth.lovenumbers.tk,1,101);
-md.solidearth.lovenumbers.tl=repmat(md.solidearth.lovenumbers.tl,1,101);
+md.solidearth.lovenumbers.th=tht;
+md.solidearth.lovenumbers.tk=tkt;
+md.solidearth.lovenumbers.tl=tlt;
+md.solidearth.lovenumbers.pmtf_colinear=pmtf1;
+md.solidearth.lovenumbers.pmtf_ortho=pmtf2;
 md.solidearth.lovenumbers.timefreq=time;
 
@@ -92,5 +95,5 @@
 
 %Solution parameters
-md.cluster.np=3;
+md.cluster.np=10;
 md.solidearth.settings.reltol=NaN;
 md.solidearth.settings.abstol=1e-3;
@@ -117,5 +120,5 @@
 md.solidearth.settings.elastic=1;
 md.solidearth.settings.viscous=1;
-md.solidearth.settings.rotation=0;
+md.solidearth.settings.rotation=1;
 md=solve(md,'tr');
 
Index: /issm/trunk/test/NightlyRun/test2091.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2091.m	(revision 27035)
+++ /issm/trunk/test/NightlyRun/test2091.m	(revision 27035)
@@ -0,0 +1,273 @@
+%Test Name: ViscoElasticEarthSlc
+
+%mesh earth:
+md=model;md.mesh=mesh3dsurface();
+re= md.solidearth.planetradius;
+phi1=(0:10:360)/180*pi;
+phi2=(0:10:360)/180*pi;
+
+dom=struct;
+dom.x=cos(phi1')*re*pi;
+dom.y=sin(phi1')*re*pi;dom.y(end)=dom.y(1);
+dom.nods=length(dom.x);   
+
+co=struct;
+rad=re*pi*[linspace(1e-3,1,3)/18];
+for i=1:length(rad);
+co(i).x=cos(phi2')*rad(i);
+co(i).y=sin(phi2')*rad(i);co(i).y(end)=co(i).y(1);
+co(i).nods=length(co(i).x);co(i).closed=1;co(i).density=1;co(i).name='Icedisklimit';co(i).Geometry='Polygon';
+co(i).BoundingBox=[min(co(i).x) min(co(i).y); max(co(i).x) max(co(i).y)];
+end
+
+defaultoptions={'KeepVertices',0,'MaxCornerAngle',0.0000000001,'NoBoundaryRefinement',1}; 
+md2d=bamg(model,'domain',dom,'subdomains',co,'hmin',100e3,'hmax',10000e3,defaultoptions{:});
+
+colat=sqrt(md2d.mesh.x.^2+md2d.mesh.y.^2)/re;
+lon=atan2(md2d.mesh.y,md2d.mesh.x);
+
+x=sin(colat).*cos(lon)*re;
+y=sin(colat).*sin(lon)*re;
+z=cos(colat)*re;
+
+md.mesh.x=x;md.mesh.y=y;md.mesh.z=z;md.mesh.lat=90-colat*180/pi;md.mesh.long=lon*180/pi;
+md.mesh.r=sqrt(x.^2+y.^2+z.^2);
+md.mesh.numberofelements=md2d.mesh.numberofelements;md.mesh.numberofvertices=md2d.mesh.numberofvertices;
+md.mesh.elements=md2d.mesh.elements;
+md.mesh.vertexconnectivity=NodeConnectivity(md.mesh.elements,md.mesh.numberofvertices);
+md.mesh.area=GetAreas3DTria(md.mesh.elements,md.mesh.x,md.mesh.y,md.mesh.z);
+
+
+%md.mesh=gmshplanet('radius',6.371012*10^3,'resolution',500.);
+
+%Geometry for the bed, arbitrary thickness of 1000: 
+md.geometry.bed=-zeros(md.mesh.numberofvertices,1);
+md.geometry.base=md.geometry.bed;
+md.geometry.thickness=0*ones(md.mesh.numberofvertices,1);
+md.geometry.surface=md.geometry.bed+md.geometry.thickness;
+
+
+%parameterize solidearth solution:
+%solidearth loading:  {{{
+md.masstransport.spcthickness=[md.geometry.thickness;0];
+md.materials.rho_ice=931;
+
+
+md.smb.mass_balance=zeros(md.mesh.numberofvertices,1);
+%antarctica
+xe=md.mesh.x(md.mesh.elements)*[1;1;1]/3;
+ye=md.mesh.y(md.mesh.elements)*[1;1;1]/3;
+ze=md.mesh.z(md.mesh.elements)*[1;1;1]/3;
+re=sqrt(xe.^2+ye.^2+ze.^2);
+
+late=asind(ze./re);
+longe=atan2d(ye,xe);
+%arctic
+pos=find(late>=80);
+pos1=find(md.mesh.lat>=80);
+md.masstransport.spcthickness(:)=0;
+md.masstransport.spcthickness(pos1)=md.masstransport.spcthickness(pos1) +1500*sqrt((cosd(90-md.mesh.lat(pos1))-cosd(10))./(1-cosd(10)));
+%md.masstransport.spcthickness(pos1)=md.masstransport.spcthickness(pos1) +1000;
+posgre=pos;
+
+%visco-elastic loading from love numbers that we load ourselves. We 
+%still use the lovenumbers constructor to initialize the fields: 
+load ../Data/lnb_temporal.mat
+%md.solidearth.lovenumbers=lovenumbers('maxdeg',1000);
+%md.solidearth.lovenumbers.timefreq=[0];
+
+maxdeg=129;
+mindeg=1;
+
+md.solidearth.lovenumbers.h=ht;
+md.solidearth.lovenumbers.h(maxdeg+1,:)=0;
+%md.solidearth.lovenumbers.h(maxdeg+2,:)=0;
+%md.solidearth.lovenumbers.h(maxdeg+3:end,:)=[];
+md.solidearth.lovenumbers.h(1:mindeg,:)=0;
+md.solidearth.lovenumbers.k=kt;
+md.solidearth.lovenumbers.k(maxdeg+1,:)=-1;
+%md.solidearth.lovenumbers.k(maxdeg+2,:)=0;
+%md.solidearth.lovenumbers.k(maxdeg+3:end,:)=[];
+md.solidearth.lovenumbers.k(1:mindeg,:)=-1;
+md.solidearth.lovenumbers.l=lt;
+md.solidearth.lovenumbers.l(maxdeg+1,:)=0;
+%md.solidearth.lovenumbers.l(maxdeg+2,:)=0;
+%md.solidearth.lovenumbers.l(maxdeg+3:end,:)=[];
+md.solidearth.lovenumbers.l(1:mindeg,:)=0;
+%md.solidearth.lovenumbers.h=repmat(md.solidearth.lovenumbers.h,1,100);
+%md.solidearth.lovenumbers.k=repmat(md.solidearth.lovenumbers.k,1,100);
+%md.solidearth.lovenumbers.l=repmat(md.solidearth.lovenumbers.l,1,100);
+md.solidearth.lovenumbers.th=tht(1:maxdeg+1,:);
+md.solidearth.lovenumbers.tk=tkt(1:maxdeg+1,:);
+md.solidearth.lovenumbers.tl=tlt(1:maxdeg+1,:);
+md.solidearth.lovenumbers.pmtf_colinear=pmtf1;
+md.solidearth.lovenumbers.pmtf_ortho=pmtf2;
+md.solidearth.lovenumbers.timefreq=time;
+
+%}}}
+%mask:  {{{
+%mask=gmtmask(md.mesh.lat,md.mesh.long);
+oceanmask=ones(md.mesh.numberofvertices,1);
+
+icemask=ones(md.mesh.numberofvertices,1);
+icemask(pos1)=-1;
+
+
+md.mask.ice_levelset=icemask*1e-3;
+md.mask.ocean_levelset=oceanmask;
+% }}}
+
+%time stepping: 
+md.timestepping.start_time=0;
+md.timestepping.time_step=1000;
+md.timestepping.final_time=12000;
+
+time1=md.timestepping.start_time:md.timestepping.time_step:md.timestepping.final_time;
+md.masstransport.spcthickness=repmat(md.masstransport.spcthickness, [1 length(time1)]);
+%md.masstransport.spcthickness(1:end-1,3:end)=0;
+md.masstransport.spcthickness(end,:)=time1;
+
+md.basalforcings.groundedice_melting_rate=zeros(md.mesh.numberofvertices,1);
+md.basalforcings.floatingice_melting_rate=zeros(md.mesh.numberofvertices,1);
+md.initialization.vx=zeros(md.mesh.numberofvertices,1);
+md.initialization.vy=zeros(md.mesh.numberofvertices,1);
+md.initialization.sealevel=zeros(md.mesh.numberofvertices,1);
+md.initialization.bottompressure=zeros(md.mesh.numberofvertices,1);
+md.initialization.dsl=zeros(md.mesh.numberofvertices,1);
+md.initialization.str=0;
+
+%Materials: 
+md.materials=materials('hydro');
+
+%Miscellaneous
+md.miscellaneous.name='test2091';
+
+%Solution parameters
+md.cluster.np=3;
+md.solidearth.settings.reltol=NaN;
+md.solidearth.settings.abstol=1e-3;
+md.solidearth.settings.sealevelloading=0;
+md.solidearth.settings.grdocean=0;
+md.solidearth.settings.isgrd=1;
+md.solidearth.settings.ocean_area_scaling=0;
+md.solidearth.settings.grdmodel=1;
+md.solidearth.settings.timeacc=md.timestepping.time_step;
+md.solidearth.settings.degacc=.01;
+
+%Physics:
+md.transient.issmb=0; 
+md.transient.isstressbalance=0;
+md.transient.isthermal=0;
+md.transient.ismasstransport=1;
+md.transient.isslc=1;
+md.solidearth.requested_outputs={'SealevelGRD','BedGRD', 'BedNorthGRD', 'BedEastGRD', 'SealevelBarystaticIceLoad', 'SealevelBarystaticIceWeights', 'SealevelBarystaticIceArea', 'SealevelBarystaticIceMask', 'SealevelBarystaticIceLatbar', 'SealevelBarystaticIceLongbar'};
+md.settings.results_on_nodes = {'SealevelBarystaticIceWeights'};
+
+% max number of iteration reverted back to 10 (i.e., the original default value)
+md.solidearth.settings.maxiter=10;
+
+%eustatic + selfattraction + elastic + rotation run:
+md.solidearth.settings.selfattraction=1;
+md.solidearth.settings.elastic=1;
+md.solidearth.settings.viscous=1;
+md.solidearth.settings.rotation=0;
+md.solidearth.settings.horiz=1;
+
+md=solve(md,'tr');
+
+
+
+%%validation against spada curves
+clear S B H E
+for i=1:length(time1)-1
+S(:,i)=md.results.TransientSolution(i).SealevelGRD;
+B(:,i)=md.results.TransientSolution(i).BedGRD;
+H(:,i)=md.results.TransientSolution(i).BedNorthGRD;
+E(:,i)=md.results.TransientSolution(i).BedEastGRD;
+end
+
+S=cumsum(S,2);
+B=cumsum(B,2);
+H=cumsum(H,2);
+E=cumsum(E,2); %E should theoretically be 0, in practice there is a residual due to the resolution and imperfect symmetry of the ice load. This can serve as an accuracy check of the horizontals
+
+%Fields and tolerances to track changes
+field_names={'Sealevel','Bed', 'Horizontals'};
+field_tolerances={1e-13,1e-13,1e-13};
+field_values={S,B,H};
+
+return
+%Spada benchmark curves
+[ali,ia,~]=unique(90-md.mesh.lat);
+fid=fopen('../Data/SpadaBenchmark/T1-2/GS-disp_t0_d1_cap.dat');
+ dat=textscan(fid,'%f','headerlines',16);
+ dat2=reshape(dat{1}, [5 180*10+2]);
+ ur(:,1)=dat2(2,:);
+ ut(:,1)=dat2(3,:);
+ g(:,1)=dat2(5,:);
+ fid=fopen('../Data/SpadaBenchmark/T1-2/GS-disp_t1_d1_cap.dat');
+ dat=textscan(fid,'%f','headerlines',16);
+ dat2=reshape(dat{1}, [5 180*10+2]);
+ ur(:,end+1)=dat2(2,:);
+ ut(:,end+1)=dat2(3,:);
+ g(:,end+1)=dat2(5,:);
+ fid=fopen('../Data/SpadaBenchmark/T1-2/GS-disp_t2_d1_cap.dat');
+ dat=textscan(fid,'%f','headerlines',16);
+ dat2=reshape(dat{1}, [5 180*10+2]);     
+ ur(:,end+1)=dat2(2,:);
+ ut(:,end+1)=dat2(3,:);
+ g(:,end+1)=dat2(5,:);
+ fid=fopen('../Data/SpadaBenchmark/T1-2/GS-disp_t5_d1_cap.dat');
+ dat=textscan(fid,'%f','headerlines',16);
+ dat2=reshape(dat{1}, [5 180*10+2]);     
+ ur(:,end+1)=dat2(2,:);
+ ut(:,end+1)=dat2(3,:);
+ g(:,end+1)=dat2(5,:);
+ fid=fopen('../Data/SpadaBenchmark/T1-2/GS-disp_t10_d1_cap.dat');
+ dat=textscan(fid,'%f','headerlines',16);
+ dat2=reshape(dat{1}, [5 180*10+2]);     
+ ur(:,end+1)=dat2(2,:);
+ ut(:,end+1)=dat2(3,:);
+ g(:,end+1)=dat2(5,:);
+
+%correction factor for total mass in Spada vs us
+fact=3.607171340900778E+018/sum(md.results.TransientSolution(1).SealevelBarystaticIceLoad.*md.results.TransientSolution(1).SealevelBarystaticIceArea);
+[ali,ia,~]=unique(90-md.mesh.lat);
+
+clear uri;
+clear uti;
+clear gi;
+for i=1:5
+	uri(:,i)=interp1(dat2(1,1:end-1)',ur(1:end-1,i),ali);
+	uti(:,i)=interp1(dat2(1,1:end-1)',ut(1:end-1,i),ali);
+	gi(:,i)=interp1(dat2(1,1:end-1)',g(1:end-1,i),ali);
+end
+indB=[1 2 3 6 11];%curves at 0, 1, 2, 5 and 10kyr
+
+
+return
+subplot(2,3,1)
+plot(ali,B(ia,indB)*fact,'.',ali,uri)
+title('bedrock up');
+
+subplot(2,3,2)
+plot(ali,-H(ia,indB)*fact,'.', ali,uti) %minus sign is because unit vector e_North=-e_theta (colatitude direction)
+title('bedrock horiz');
+
+subplot(2,3,3)
+plot(ali,(S(ia,indB))*fact,'.',ali,gi)
+title('Geoid');
+
+subplot(2,3,4)
+plot(ali,B(ia,indB)*fact-uri)
+title('Bedrock up error');
+
+subplot(2,3,5)
+plot(ali,-H(ia,indB)*fact-uti)
+title('Bedrock horiz error');
+
+subplot(2,3,6)
+plot(ali,(S(ia,indB))*fact-gi)
+title('Geoid error');
+
+
Index: /issm/trunk/test/NightlyRun/test2092.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2092.m	(revision 27035)
+++ /issm/trunk/test/NightlyRun/test2092.m	(revision 27035)
@@ -0,0 +1,217 @@
+%Test Name: PolarMotion
+
+%mesh earth:
+md=model;md.mesh=mesh3dsurface();
+re= md.solidearth.planetradius;
+phi1=(0:10:360)/180*pi;
+phi2=(0:10:360)/180*pi;
+
+dom=struct;
+dom.x=cos(phi1')*re*pi;
+dom.y=sin(phi1')*re*pi;dom.y(end)=dom.y(1);
+dom.nods=length(dom.x);   
+
+co=struct;
+rad=re*pi*[linspace(1e-1,1,3)/18];
+for i=1:length(rad);
+co(i).x=cos(phi2')*rad(i);
+co(i).y=sin(phi2')*rad(i);co(i).y(end)=co(i).y(1);
+co(i).nods=length(co(i).x);co(i).closed=1;co(i).density=1;co(i).name='Icedisklimit';co(i).Geometry='Polygon';
+co(i).BoundingBox=[min(co(i).x) min(co(i).y); max(co(i).x) max(co(i).y)];
+end
+
+defaultoptions={'KeepVertices',0,'MaxCornerAngle',0.0000000001,'NoBoundaryRefinement',1}; 
+md2d=bamg(model,'domain',dom,'subdomains',co,'hmin',50e3,'hmax',10000e3,defaultoptions{:});
+
+colat=sqrt(md2d.mesh.x.^2+md2d.mesh.y.^2)/re;
+lon=atan2(md2d.mesh.y,md2d.mesh.x);
+
+x=sin(colat).*cos(lon)*re;
+y=sin(colat).*sin(lon)*re;
+z=cos(colat)*re;
+
+%load
+longL=75;
+latL=65;
+
+%rotate mesh around load center
+R1=[cosd(90-latL) 0 sind(90-latL) ;0 1 0; -sind(90-latL) 0 cosd(90-latL)];
+R2=[cosd(longL) -sind(longL) 0; sind(longL) cosd(longL) 0; 0 0 1];
+
+for i=1:length(x);
+	coord= R2*R1*[x(i);y(i);z(i)];
+	x(i)=coord(1);
+	y(i)=coord(2);
+	z(i)=coord(3);
+end
+
+colat=acos(z/re);
+lon=atan2(y,x);
+
+
+md.mesh.x=x;md.mesh.y=y;md.mesh.z=z;md.mesh.lat=90-colat*180/pi;md.mesh.long=lon*180/pi;
+md.mesh.r=sqrt(x.^2+y.^2+z.^2);
+md.mesh.numberofelements=md2d.mesh.numberofelements;md.mesh.numberofvertices=md2d.mesh.numberofvertices;
+md.mesh.elements=md2d.mesh.elements;
+md.mesh.vertexconnectivity=NodeConnectivity(md.mesh.elements,md.mesh.numberofvertices);
+%md.mesh.area=averaging(md,GetAreas3DTria(md.mesh.elements,md.mesh.x,md.mesh.y,md.mesh.z),4);
+md.mesh.area=GetAreas3DTria(md.mesh.elements,md.mesh.x,md.mesh.y,md.mesh.z);
+
+%Geometry for the bed
+md.geometry.bed=-zeros(md.mesh.numberofvertices,1);
+md.geometry.base=md.geometry.bed;
+md.geometry.thickness=0*ones(md.mesh.numberofvertices,1);
+md.geometry.surface=md.geometry.bed+md.geometry.thickness;
+
+
+%parameterize solidearth solution:
+%solidearth loading:  {{{
+md.masstransport.spcthickness=[md.geometry.thickness;0];
+md.materials.rho_ice=931;
+
+
+md.smb.mass_balance=zeros(md.mesh.numberofvertices,1);
+%antarctica
+xe=md.mesh.x(md.mesh.elements)*[1;1;1]/3;
+ye=md.mesh.y(md.mesh.elements)*[1;1;1]/3;
+ze=md.mesh.z(md.mesh.elements)*[1;1;1]/3;
+re=sqrt(xe.^2+ye.^2+ze.^2);
+
+late=asind(ze./re);
+longe=atan2d(ye,xe);
+
+
+longi=md.mesh.long;
+lati=md.mesh.lat;
+delPhi=abs(lati-latL); delLambda=abs(longi-longL); if (delLambda>pi)delLambda=2*pi-delLambda; end
+alpha=2.*asin(sqrt(sind(delPhi/2).^2+cosd(lati).*cosd(latL).*sind(delLambda/2).^2));
+
+pos=find(alpha<=10/180*pi-0.01);
+
+%mass=3.607171340900778E+018;
+area_element=GetAreasSphericalTria(md.mesh.elements,md.mesh.lat,md.mesh.long,md.solidearth.planetradius);
+
+%md.masstransport.spcthickness(md.mesh.elements(pos,:))=mass/md.materials.rho_ice/area_element(pos);
+md.masstransport.spcthickness(pos,1)=1500 * sqrt( (cos(alpha(pos)) - cosd(10)) /(1-cosd(10)) );
+
+
+%visco-elastic loading from love numbers that we load ourselves. We 
+%still use the lovenumbers constructor to initialize the fields: 
+load ../Data/lnb_temporal.mat
+%md.solidearth.lovenumbers=lovenumbers('maxdeg',1000);
+%md.solidearth.lovenumbers.timefreq=[0];
+
+maxdeg=3;
+mindeg=2;
+
+md.solidearth.lovenumbers.h=ht;
+md.solidearth.lovenumbers.h(maxdeg+1,:)=0;
+%md.solidearth.lovenumbers.h(maxdeg+2,:)=0;
+%md.solidearth.lovenumbers.h(maxdeg+3:end,:)=[];
+md.solidearth.lovenumbers.h(1:mindeg,:)=0;
+md.solidearth.lovenumbers.k=kt;
+md.solidearth.lovenumbers.k(maxdeg+1,:)=-1;
+%md.solidearth.lovenumbers.k(maxdeg+2,:)=0;
+%md.solidearth.lovenumbers.k(maxdeg+3:end,:)=[];
+md.solidearth.lovenumbers.k(1:mindeg,:)=-1;
+md.solidearth.lovenumbers.l=lt;
+md.solidearth.lovenumbers.l(maxdeg+1,:)=0;
+%md.solidearth.lovenumbers.l(maxdeg+2,:)=0;
+%md.solidearth.lovenumbers.l(maxdeg+3:end,:)=[];
+md.solidearth.lovenumbers.l(1:mindeg,:)=0;
+md.solidearth.lovenumbers.th=tht(1:maxdeg+1,:);
+md.solidearth.lovenumbers.tk=tkt(1:maxdeg+1,:);
+md.solidearth.lovenumbers.tl=tlt(1:maxdeg+1,:);
+md.solidearth.lovenumbers.pmtf_colinear=pmtf1;
+md.solidearth.lovenumbers.pmtf_ortho=pmtf2;
+md.solidearth.lovenumbers.timefreq=time;
+md.solidearth.rotational.equatorialmoi=8.0131e37;
+md.solidearth.rotational.polarmoi=8.0394e37;
+md.solidearth.rotational.angularvelocity=7.292115e-5;
+
+%}}}
+%mask:  {{{
+oceanmask=ones(md.mesh.numberofvertices,1);
+icemask=ones(md.mesh.numberofvertices,1);
+icemask(pos)=-1;
+
+
+md.mask.ice_levelset=icemask;
+md.mask.ocean_levelset=oceanmask;
+% }}}
+
+%time stepping: 
+md.timestepping.start_time=0;
+md.timestepping.time_step=1000;
+md.timestepping.final_time=11000;
+
+time1=md.timestepping.start_time:md.timestepping.time_step:md.timestepping.final_time;
+md.masstransport.spcthickness=repmat(md.masstransport.spcthickness, [1 length(time1)]);
+%md.masstransport.spcthickness(1:end-1,3:end)=0;
+md.masstransport.spcthickness(end,:)=time1;
+
+md.basalforcings.groundedice_melting_rate=zeros(md.mesh.numberofvertices,1);
+md.basalforcings.floatingice_melting_rate=zeros(md.mesh.numberofvertices,1);
+md.initialization.vx=zeros(md.mesh.numberofvertices,1);
+md.initialization.vy=zeros(md.mesh.numberofvertices,1);
+md.initialization.sealevel=zeros(md.mesh.numberofvertices,1);
+md.initialization.bottompressure=zeros(md.mesh.numberofvertices,1);
+md.initialization.dsl=zeros(md.mesh.numberofvertices,1);
+md.initialization.str=0;
+
+%Materials: 
+md.materials=materials('hydro');
+
+%Miscellaneous
+md.miscellaneous.name='test2092';
+
+%Solution parameters
+md.cluster.np=3;
+md.solidearth.settings.reltol=NaN;
+md.solidearth.settings.abstol=1e-3;
+md.solidearth.settings.sealevelloading=0;
+md.solidearth.settings.grdocean=0;
+md.solidearth.settings.isgrd=1;
+md.solidearth.settings.ocean_area_scaling=0;
+md.solidearth.settings.grdmodel=1;
+md.solidearth.settings.timeacc=md.timestepping.time_step;
+md.solidearth.settings.degacc=.1;
+
+%Physics:
+md.transient.issmb=0; 
+md.transient.isstressbalance=0;
+md.transient.isthermal=0;
+md.transient.ismasstransport=1;
+md.transient.isslc=1;
+md.solidearth.requested_outputs={'SealevelBarystaticIceLoad'};
+
+% max number of iteration reverted back to 10 (i.e., the original default value)
+md.solidearth.settings.maxiter=10;
+
+%eustatic + selfattraction + elastic + rotation run:
+md.solidearth.settings.selfattraction=1;
+md.solidearth.settings.elastic=1;
+md.solidearth.settings.viscous=1;
+md.solidearth.settings.rotation=1;
+md.solidearth.settings.horiz=0;
+
+md=solve(md,'tr');
+clear m1 m2 m3
+for i=1:length(time1)-1
+m1(i)=md.results.TransientSolution(i).SealevelchangePolarMotionX;
+m2(i)=md.results.TransientSolution(i).SealevelchangePolarMotionY;
+m3(i)=md.results.TransientSolution(i).SealevelchangePolarMotionZ;
+end
+
+%Fields and tolerances to track changes
+field_names={'PolarmotionX','PolarmotionY', 'PolarmotionZ'};
+field_tolerances={1e-13,1e-13,1e-13};
+field_values={m1,m2,m3};
+
+return
+subplot(1,2,1)
+plot(time1(2:end-1),m1(2:end)*180/pi *1e6/md.timestepping.time_step, time1(2:end-1),m2(2:end)*180/pi*1e6/md.timestepping.time_step);
+
+subplot(1,2,2)
+plot(time1(1:end-1),cumsum(m1)*180/pi, time1(1:end-1),cumsum(m2)*180/pi)
+
Index: /issm/trunk/test/NightlyRun/test2101.m
===================================================================
--- /issm/trunk/test/NightlyRun/test2101.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2101.m	(revision 27035)
@@ -4,5 +4,6 @@
 %mesh earth: 
 md=model; 
-md.mesh=gmshplanet('radius',6.371012*10^3,'resolution',700);
+load ../Data/SlcTestMesh.mat;
+md.mesh=SlcMesh; %700 km resolution mesh
 
 % define load 
Index: /issm/trunk/test/NightlyRun/test2101.py
===================================================================
--- /issm/trunk/test/NightlyRun/test2101.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test2101.py	(revision 27035)
@@ -1,9 +1,7 @@
 #Test Name: EarthEsa
 #Elastostatic adjustment for an elemental ice unloading
+import numpy as np
+import pickle
 from socket import gethostname
-
-import numpy as np
-
-from gmshplanet import *
 from gmtmask import *
 from lovenumbers import *
@@ -15,5 +13,8 @@
 #mesh earth:
 md = model()
-md.mesh = gmshplanet('radius', 6.371012 * 1e3, 'resolution', 700)
+
+# Load precomputed mesh
+with open('../Data/SlcTestMesh.pkl', 'rb') as slc_test_mesh_file:
+    md.mesh = pickle.load(slc_test_mesh_file)
 
 #define load
Index: /issm/trunk/test/NightlyRun/test233.js
===================================================================
--- /issm/trunk/test/NightlyRun/test233.js	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test233.js	(revision 27035)
@@ -17,5 +17,5 @@
 	'Vx3','Vy3','Vz3','Vel3','Pressure3','Bed3','Surface3','Thickness3','Temperature3','BasalforcingsGroundediceMeltingRate3', 
 	'Vx4','Vy4','Vz4','Vel4','Pressure4','Bed4','Surface4','Thickness4','Temperature4','BasalforcingsGroundediceMeltingRate4'];
-field_tolerances=[1e-09,2e-09,1e-09,2e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09, 
+field_tolerances=[2e-09,2e-09,1e-09,2e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09, 
 	1e-09,2e-09,1e-08,2e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-06, 
 	1e-08,2e-09,1e-08,2e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-06, 
Index: /issm/trunk/test/NightlyRun/test233.m
===================================================================
--- /issm/trunk/test/NightlyRun/test233.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test233.m	(revision 27035)
@@ -16,5 +16,5 @@
 	'Vx3','Vy3','Vz3','Vel3','Pressure3','Bed3','Surface3','Thickness3','Temperature3','BasalforcingsGroundediceMeltingRate3', ...
 	'Vx4','Vy4','Vz4','Vel4','Pressure4','Bed4','Surface4','Thickness4','Temperature4','BasalforcingsGroundediceMeltingRate4'};
-field_tolerances={1e-09,2e-09,1e-09,2e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09, ...
+field_tolerances={2e-09,2e-09,1e-09,2e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09, ...
 	1e-09,2e-09,1e-08,2e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-06, ...
 	1e-08,2e-09,1e-08,2e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-06, ...
Index: /issm/trunk/test/NightlyRun/test233.py
===================================================================
--- /issm/trunk/test/NightlyRun/test233.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test233.py	(revision 27035)
@@ -26,5 +26,5 @@
                'Vx3', 'Vy3', 'Vz3', 'Vel3', 'Pressure3', 'Bed3', 'Surface3', 'Thickness3', 'Temperature3', 'BasalforcingsGroundediceMeltingRate3',
                'Vx4', 'Vy4', 'Vz4', 'Vel4', 'Pressure4', 'Bed4', 'Surface4', 'Thickness4', 'Temperature4', 'BasalforcingsGroundediceMeltingRate4']
-field_tolerances = [1e-09, 2e-09, 1e-09, 2e-09, 1e-09, 1e-09, 1e-09, 1e-09, 1e-09, 1e-09,
+field_tolerances = [2e-09, 2e-09, 1e-09, 2e-09, 1e-09, 1e-09, 1e-09, 1e-09, 1e-09, 1e-09,
                     1e-09, 2e-09, 1e-08, 2e-09, 1e-09, 1e-09, 1e-09, 1e-09, 1e-09, 1e-06,
                     1e-08, 2e-09, 1e-08, 2e-09, 1e-09, 1e-09, 1e-09, 1e-09, 1e-09, 1e-06,
Index: /issm/trunk/test/NightlyRun/test247.py
===================================================================
--- /issm/trunk/test/NightlyRun/test247.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test247.py	(revision 27035)
@@ -1,3 +1,3 @@
-#Test Name: SquareShelfTranIspddIsdeltaO18pdNoInterpSSA2d 
+#Test Name: SquareShelfTranIspddIsdeltaO18pdNoInterpSSA2d
 import numpy as np
 from model import *
@@ -57,10 +57,10 @@
 tim1 = np.linspace(1,12,12)/12
 
-md.smb.temperatures_reconstructed[md.mesh.numberofvertices,0:12] = tim1 
+md.smb.temperatures_reconstructed[md.mesh.numberofvertices,0:12] = tim1
 md.smb.temperatures_reconstructed[md.mesh.numberofvertices,12:24] = tim1+3
 md.smb.temperatures_reconstructed[md.mesh.numberofvertices,24:36] = tim1+5
 
 md.smb.precipitations_reconstructed[md.mesh.numberofvertices,0:12] = tim1
-md.smb.precipitations_reconstructed[md.mesh.numberofvertices,12:24] = tim1+3 
+md.smb.precipitations_reconstructed[md.mesh.numberofvertices,12:24] = tim1+3
 md.smb.precipitations_reconstructed[md.mesh.numberofvertices,24:36] = tim1+5
 
@@ -68,5 +68,5 @@
 # spc
 md.thermal.spctemperature=np.mean(md.smb.temperatures_presentday[0:md.mesh.numberofvertices,0:12],axis=1)-10.
-md.initialization.temperature=md.thermal.spctemperature 
+md.initialization.temperature=md.thermal.spctemperature
 
 md.smb.s0p = np.maximum(md.geometry.surface.reshape(-1, 1),np.zeros((md.mesh.numberofvertices,1)))
@@ -89,5 +89,5 @@
 md.thermal.isdrainicecolumn = 0
 
-md=solve(md,'thermal')
+md = solve(md, 'thermal')
 
 md.initialization.temperature = md.results.ThermalSolution.Temperature
@@ -121,54 +121,54 @@
 
 #Fields and tolerances to track changes
-field_names = ['Vx1','Vy1','Vz1','Vel1','Pressure1','Bed1','Surface1','Thickness1','Temperature1','Enthalpy1','SmbMassBalance1',
-   'Vx2','Vy2','Vz2','Vel2','Pressure2','Bed2','Surface2','Thickness2','Temperature2','Enthalpy2','SmbMassBalance2',
-   'Vx3','Vy3','Vz3','Vel3','Pressure3','Bed3','Surface3','Thickness3','Temperature3','Enthalpy3','SmbMassBalance3',
-   'Vx4','Vy4','Vz4','Vel4','Pressure4','Bed4','Surface4','Thickness4','Temperature4','Enthalpy4','SmbMassBalance4']
-field_tolerances=[1e-09,1e-09,1e-09,1e-09,1e-10,1e-10,1e-10,1e-10,1e-10,1e-10,1e-13,
-   1e-09,1e-09,1e-09,1e-09,1e-10,1e-10,1e-10,1e-10,1e-10,1e-10,1e-13,
-   1e-09,1e-09,1e-09,1e-09,1e-10,1e-10,1e-10,1e-10,1e-10,1e-10,1e-13,
-   1e-09,1e-09,1e-09,1e-09,1e-10,1e-10,1e-10,1e-10,1e-10,1e-10,1e-13]
+field_names = ['Vx1', 'Vy1', 'Vz1', 'Vel1', 'Pressure1', 'Bed1', 'Surface1', 'Thickness1', 'Temperature1', 'Enthalpy1', 'SmbMassBalance1',
+               'Vx2', 'Vy2', 'Vz2', 'Vel2', 'Pressure2', 'Bed2', 'Surface2', 'Thickness2', 'Temperature2', 'Enthalpy2', 'SmbMassBalance2',
+               'Vx3', 'Vy3', 'Vz3', 'Vel3', 'Pressure3', 'Bed3', 'Surface3', 'Thickness3', 'Temperature3', 'Enthalpy3', 'SmbMassBalance3',
+               'Vx4', 'Vy4', 'Vz4', 'Vel4', 'Pressure4', 'Bed4', 'Surface4', 'Thickness4', 'Temperature4', 'Enthalpy4', 'SmbMassBalance4']
+field_tolerances=[1e-09, 1e-09, 1e-09, 1e-09, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-13,
+   1e-09, 1e-09, 1e-09, 1e-09, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-13,
+   1e-09, 1e-09, 1e-09, 1e-09, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-13,
+   1e-09, 1e-09, 1e-09, 1e-09, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-13]
 field_values = [md.results.TransientSolution[0].Vx,
-   md.results.TransientSolution[0].Vy,
-   md.results.TransientSolution[0].Vz,
-   md.results.TransientSolution[0].Vel,
-   md.results.TransientSolution[0].Pressure,
-   md.results.TransientSolution[0].Base,
-   md.results.TransientSolution[0].Surface,
-   md.results.TransientSolution[0].Thickness,
-   md.results.TransientSolution[0].Temperature,
-   md.results.TransientSolution[0].Enthalpy,
-   md.results.TransientSolution[0].SmbMassBalance,
-   md.results.TransientSolution[1].Vx,
-   md.results.TransientSolution[1].Vy,
-   md.results.TransientSolution[1].Vz,
-   md.results.TransientSolution[1].Vel,
-   md.results.TransientSolution[1].Pressure,
-   md.results.TransientSolution[1].Base,
-   md.results.TransientSolution[1].Surface,
-   md.results.TransientSolution[1].Thickness,
-   md.results.TransientSolution[1].Temperature,
-   md.results.TransientSolution[1].Enthalpy,
-   md.results.TransientSolution[1].SmbMassBalance,
-   md.results.TransientSolution[2].Vx,
-   md.results.TransientSolution[2].Vy,
-   md.results.TransientSolution[2].Vz,
-   md.results.TransientSolution[2].Vel,
-   md.results.TransientSolution[2].Pressure,
-   md.results.TransientSolution[2].Base,
-   md.results.TransientSolution[2].Surface,
-   md.results.TransientSolution[2].Thickness,
-   md.results.TransientSolution[2].Temperature,
-   md.results.TransientSolution[2].Enthalpy,
-   md.results.TransientSolution[2].SmbMassBalance,
-   md.results.TransientSolution[3].Vx,
-   md.results.TransientSolution[3].Vy,
-   md.results.TransientSolution[3].Vz,
-   md.results.TransientSolution[3].Vel,
-   md.results.TransientSolution[3].Pressure,
-   md.results.TransientSolution[3].Base,
-   md.results.TransientSolution[3].Surface,
-   md.results.TransientSolution[3].Thickness,
-   md.results.TransientSolution[3].Temperature,
-   md.results.TransientSolution[3].Enthalpy,
-   md.results.TransientSolution[3].SmbMassBalance]
+                md.results.TransientSolution[0].Vy,
+                md.results.TransientSolution[0].Vz,
+                md.results.TransientSolution[0].Vel,
+                md.results.TransientSolution[0].Pressure,
+                md.results.TransientSolution[0].Base,
+                md.results.TransientSolution[0].Surface,
+                md.results.TransientSolution[0].Thickness,
+                md.results.TransientSolution[0].Temperature,
+                md.results.TransientSolution[0].Enthalpy,
+                md.results.TransientSolution[0].SmbMassBalance,
+                md.results.TransientSolution[1].Vx,
+                md.results.TransientSolution[1].Vy,
+                md.results.TransientSolution[1].Vz,
+                md.results.TransientSolution[1].Vel,
+                md.results.TransientSolution[1].Pressure,
+                md.results.TransientSolution[1].Base,
+                md.results.TransientSolution[1].Surface,
+                md.results.TransientSolution[1].Thickness,
+                md.results.TransientSolution[1].Temperature,
+                md.results.TransientSolution[1].Enthalpy,
+                md.results.TransientSolution[1].SmbMassBalance,
+                md.results.TransientSolution[2].Vx,
+                md.results.TransientSolution[2].Vy,
+                md.results.TransientSolution[2].Vz,
+                md.results.TransientSolution[2].Vel,
+                md.results.TransientSolution[2].Pressure,
+                md.results.TransientSolution[2].Base,
+                md.results.TransientSolution[2].Surface,
+                md.results.TransientSolution[2].Thickness,
+                md.results.TransientSolution[2].Temperature,
+                md.results.TransientSolution[2].Enthalpy,
+                md.results.TransientSolution[2].SmbMassBalance,
+                md.results.TransientSolution[3].Vx,
+                md.results.TransientSolution[3].Vy,
+                md.results.TransientSolution[3].Vz,
+                md.results.TransientSolution[3].Vel,
+                md.results.TransientSolution[3].Pressure,
+                md.results.TransientSolution[3].Base,
+                md.results.TransientSolution[3].Surface,
+                md.results.TransientSolution[3].Thickness,
+                md.results.TransientSolution[3].Temperature,
+                md.results.TransientSolution[3].Enthalpy,
+                md.results.TransientSolution[3].SmbMassBalance]
Index: /issm/trunk/test/NightlyRun/test248.m
===================================================================
--- /issm/trunk/test/NightlyRun/test248.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test248.m	(revision 27035)
@@ -1,10 +1,10 @@
-%Test Name: SquareShelfStressMLHO2d
+%Test Name: SquareShelfStressMOLHO2d
 md=triangle(model(),'../Exp/Square.exp',150000.);
 md=setmask(md,'all','');
 md=parameterize(md,'../Par/SquareShelf.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.cluster=generic('name',oshostname(),'np',3);
 md.stressbalance.requested_outputs={'default','VxSurface','VySurface','VxShear','VyShear','VxBase','VyBase'};
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Stressbalance');
 
Index: /issm/trunk/test/NightlyRun/test248.py
===================================================================
--- /issm/trunk/test/NightlyRun/test248.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test248.py	(revision 27035)
@@ -1,20 +1,19 @@
-#Test Name: SquareShelfStressMLHO2d
+#Test Name: SquareShelfStressMOLHO2d
 from model import *
 from socket import gethostname
-from triangle import *
-from setmask import *
-from parameterize import *
-from setflowequation import *
-from solve import *
-
-from ContourToMesh import *
+from triangle import triangle
+from setmask import setmask
+from parameterize import parameterize
+from setflowequation import setflowequation
+from solve import solve
+from SetMOLHOBC import SetMOLHOBC
 
 md = triangle(model(), '../Exp/Square.exp', 150000)
 md = setmask(md, 'all', '')
 md = parameterize(md, '../Par/SquareShelf.py')
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.cluster = generic('name', gethostname(), 'np', 3)
 md.stressbalance.requested_outputs = ['default', 'VxSurface', 'VySurface', 'VxShear', 'VyShear', 'VxBase', 'VyBase']
-md = SetMLHOBC(md);
+md = SetMOLHOBC(md)
 md = solve(md, 'Stressbalance')
 
@@ -27,7 +26,7 @@
                 md.results.StressbalanceSolution.Pressure,
                 md.results.StressbalanceSolution.VxSurface,
-                md.results.StressbalanceSolution.VySurface, 
+                md.results.StressbalanceSolution.VySurface,
                 md.results.StressbalanceSolution.VxShear,
-                md.results.StressbalanceSolution.VyShear, 
+                md.results.StressbalanceSolution.VyShear,
                 md.results.StressbalanceSolution.VxBase,
                 md.results.StressbalanceSolution.VyBase]
Index: /issm/trunk/test/NightlyRun/test249.m
===================================================================
--- /issm/trunk/test/NightlyRun/test249.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test249.m	(revision 27035)
@@ -1,11 +1,11 @@
-%Test Name: SquareShelfTranMLHO2d
+%Test Name: SquareShelfTranMOLHO2d
 md=triangle(model(),'../Exp/Square.exp',150000.);
 md=setmask(md,'all','');
 md=parameterize(md,'../Par/SquareShelf.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.cluster=generic('name',oshostname(),'np',3);
 md.transient.requested_outputs={'default','FloatingArea','GroundedArea','TotalGroundedBmb','TotalFloatingBmb'};
 md.basalforcings.floatingice_melting_rate(:)=1;
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Transient');
 
Index: /issm/trunk/test/NightlyRun/test249.py
===================================================================
--- /issm/trunk/test/NightlyRun/test249.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test249.py	(revision 27035)
@@ -1,12 +1,13 @@
-#Test Name: SquareShelfTranMLHO2d
+#Test Name: SquareShelfTranMOLHO2d
 
 from model import *
 from socket import gethostname
-from triangle import *
-from setmask import *
-from parameterize import *
-from setflowequation import *
-from solve import *
+from triangle import triangle
+from setmask import setmask
+from parameterize import parameterize
+from setflowequation import setflowequation
+from solve import solve
 from generic import generic
+from SetMOLHOBC import SetMOLHOBC
 
 md = triangle(model(), '../Exp/Square.exp', 150000)
@@ -14,8 +15,8 @@
 md = parameterize(md, '../Par/SquareShelf.py')
 md.basalforcings.floatingice_melting_rate[:] = 1.
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.cluster = generic('name', gethostname(), 'np', 3)
 md.transient.requested_outputs = ['default', 'FloatingArea', 'GroundedArea', 'TotalFloatingBmb', 'TotalGroundedBmb']
-md = SetMLHOBC(md);
+md = SetMOLHOBC(md)
 md = solve(md, 'Transient')
 
Index: /issm/trunk/test/NightlyRun/test252.py
===================================================================
--- /issm/trunk/test/NightlyRun/test252.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test252.py	(revision 27035)
@@ -72,8 +72,8 @@
 nlayers = md.results.TransientSolution[0].SmbT.shape[1]
 for i in range(1, len(md.results.TransientSolution)):
-    nlayers=np.minimum(md.results.TransientSolution[i].SmbT.shape[1], nlayers)
+    nlayers = np.minimum(md.results.TransientSolution[i].SmbT.shape[1], nlayers)
 
 #Fields and tolerances to track changes
-field_names = ['Layers','SmbDz1', 'SmbT1', 'SmbD1', 'SmbRe1', 'SmbGdn1', 'SmbGsp1', 'SmbA1', 'SmbEC1', 'SmbMassBalance1', 'SmbMAdd1', 'SmbDzAdd1', 'SmbFAC1',
+field_names = ['Layers', 'SmbDz1', 'SmbT1', 'SmbD1', 'SmbRe1', 'SmbGdn1', 'SmbGsp1', 'SmbA1', 'SmbEC1', 'SmbMassBalance1', 'SmbMAdd1', 'SmbDzAdd1', 'SmbFAC1',
                'SmbDz2', 'SmbT2', 'SmbD2', 'SmbRe2', 'SmbGdn2', 'SmbGsp2', 'SmbA2', 'SmbEC2', 'SmbMassBalance2', 'SmbMAdd2', 'SmbDzAdd2', 'SmbFAC2',
                'SmbDz3', 'SmbT3', 'SmbD3', 'SmbRe3', 'SmbGdn3', 'SmbGsp3', 'SmbA3', 'SmbEC3', 'SmbMassBalance3', 'SmbMAdd3', 'SmbDzAdd3', 'SmbFAC3',
Index: /issm/trunk/test/NightlyRun/test254.m
===================================================================
--- /issm/trunk/test/NightlyRun/test254.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test254.m	(revision 27035)
@@ -1,7 +1,7 @@
-%Test Name: SquareShelfConstrainedMLHO
+%Test Name: SquareShelfConstrainedMOLHO
 md=triangle(model(),'../Exp/Square.exp',150000.);
 md=setmask(md,'all','');
 md=parameterize(md,'../Par/SquareShelf.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.cluster=generic('name',oshostname(),'np',3);
 
@@ -58,5 +58,5 @@
 
 md.stressbalance.requested_outputs={'default','VySurface','VyShear','VyBase'};
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Stressbalance');
 
Index: /issm/trunk/test/NightlyRun/test254.py
===================================================================
--- /issm/trunk/test/NightlyRun/test254.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test254.py	(revision 27035)
@@ -1,3 +1,3 @@
-#Test Name: SquareShelfConstrainedMLHO
+#Test Name: SquareShelfConstrainedMOLHO
 from model import *
 from socket import gethostname
@@ -9,5 +9,5 @@
 from paterson import paterson
 from solve import solve
-from SetMLHOBC import SetMLHOBC
+from SetMOLHOBC import SetMOLHOBC
 from generic import generic
 
@@ -15,5 +15,5 @@
 md = setmask(md, 'all', '')
 md = parameterize(md, '../Par/SquareShelf.py')
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.cluster = generic('name', gethostname(), 'np', 3)
 
@@ -71,5 +71,5 @@
 
 md.stressbalance.requested_outputs = ['default', 'VySurface', 'VyShear', 'VyBase']
-md = SetMLHOBC(md)
+md = SetMOLHOBC(md)
 md = solve(md, 'Stressbalance')
 
Index: /issm/trunk/test/NightlyRun/test255.m
===================================================================
--- /issm/trunk/test/NightlyRun/test255.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test255.m	(revision 27035)
@@ -1,10 +1,10 @@
-%Test Name: SquareShelfStressMLHO2dTransientIncrHydro
+%Test Name: SquareShelfStressMOLHO2dTransientIncrHydro
 md=triangle(model(),'../Exp/Square.exp',150000.);
 md=setmask(md,'all','');
 md=parameterize(md,'../Par/SquareShelf.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.cluster=generic('name',oshostname(),'np',3);
 md.masstransport.hydrostatic_adjustment='Incremental';
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Transient');
 
Index: /issm/trunk/test/NightlyRun/test255.py
===================================================================
--- /issm/trunk/test/NightlyRun/test255.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test255.py	(revision 27035)
@@ -1,3 +1,3 @@
-#Test Name: SquareShelfStressMLHO2dTransientIncrHydro
+#Test Name: SquareShelfStressMOLHO2dTransientIncrHydro
 from model import *
 from socket import gethostname
@@ -7,13 +7,13 @@
 from setflowequation import setflowequation
 from solve import solve
-from SetMLHOBC import SetMLHOBC
+from SetMOLHOBC import SetMOLHOBC
 
 md = triangle(model(), '../Exp/Square.exp', 150000.)
 md = setmask(md, 'all', '')
 md = parameterize(md, '../Par/SquareShelf.py')
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.cluster = generic('name', gethostname(), 'np', 3)
 md.masstransport.hydrostatic_adjustment = 'Incremental'
-md = SetMLHOBC(md)
+md = SetMOLHOBC(md)
 md = solve(md, 'Transient')
 
Index: /issm/trunk/test/NightlyRun/test256.m
===================================================================
--- /issm/trunk/test/NightlyRun/test256.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test256.m	(revision 27035)
@@ -1,11 +1,11 @@
-%Test Name: SquareShelfStressMLHO2dTransientIncrNonHydro
+%Test Name: SquareShelfStressMOLHO2dTransientIncrNonHydro
 md=triangle(model(),'../Exp/Square.exp',150000.);
 md=setmask(md,'all','');
 md=parameterize(md,'../Par/SquareShelf.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.geometry.base=md.geometry.base+50.; md.geometry.surface=md.geometry.surface+50.;
 md.cluster=generic('name',oshostname(),'np',1);
 md.masstransport.hydrostatic_adjustment='Incremental';
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Transient');
 
Index: /issm/trunk/test/NightlyRun/test256.py
===================================================================
--- /issm/trunk/test/NightlyRun/test256.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test256.py	(revision 27035)
@@ -1,10 +1,11 @@
-#Test Name: SquareShelfStressMLHO2dTransientIncrNonHydro
+#Test Name: SquareShelfStressMOLHO2dTransientIncrNonHydro
 from model import *
 from socket import gethostname
-from triangle import *
-from setmask import *
-from parameterize import *
-from setflowequation import *
-from solve import *
+from triangle import triangle
+from setmask import setmask
+from parameterize import parameterize
+from setflowequation import setflowequation
+from solve import solve
+from SetMOLHOBC import SetMOLHOBC
 
 
@@ -12,10 +13,10 @@
 md = setmask(md, 'all', '')
 md = parameterize(md, '../Par/SquareShelf.py')
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.geometry.base = md.geometry.base + 50.
 md.geometry.surface = md.geometry.surface + 50.
 md.cluster = generic('name', gethostname(), 'np', 1)
 md.masstransport.hydrostatic_adjustment = 'Incremental'
-md = SetMLHOBC(md);
+md = SetMOLHOBC(md)
 md = solve(md, 'Transient')
 
Index: /issm/trunk/test/NightlyRun/test257.m
===================================================================
--- /issm/trunk/test/NightlyRun/test257.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test257.m	(revision 27035)
@@ -45,4 +45,6 @@
 md.smb.ar_timestep    = 2.0; %timestep of the autoregressive model [yr]
 md.smb.phi            = [[0.2,0.1,0.05,0.01];[0.4,0.2,-0.2,0.1];[0.4,-0.4,0.1,-0.1]];
+md.smb.lapserates     = [0.01,0.0;0.01,-0.01;0.0,-0.01];
+md.smb.elevationbins  = [100;150;100];
 
 %Stochastic forcing
@@ -51,4 +53,5 @@
 md.stochasticforcing.covariance          = [[0.15 0.08 -0.02];[0.08 0.12 -0.05];[-0.02 -0.05 0.1]]; %global covariance among- and between-fields
 md.stochasticforcing.randomflag          = 0; %fixed random seeds
+md.stochasticforcing.stochastictimestep  = 1.0;
 
 md=solve(md,'Transient');
Index: /issm/trunk/test/NightlyRun/test257.py
===================================================================
--- /issm/trunk/test/NightlyRun/test257.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test257.py	(revision 27035)
@@ -43,5 +43,5 @@
 md.smb = SMBautoregression()
 md.smb.num_basins = 3  # number of basins
-md.smb.basin_id = idbasin - 1  # prescribe basin ID number to elements; # NOTE: offset because of 1-based vertex indexing
+md.smb.basin_id = idbasin  # prescribe basin ID number to elements;
 md.smb.beta0 = np.array([[0.5, 1.2, 1.5]])  # intercept values of SMB in basins [m ice eq./yr]
 md.smb.beta1 = np.array([[0.0, 0.01, -0.01]])  # trend values of SMB in basins [m ice eq./yr^2]
@@ -50,4 +50,6 @@
 md.smb.ar_timestep = 2.0  #timestep of the autoregressive model [yr]
 md.smb.phi = np.array([[0.2, 0.1, 0.05, 0.01], [0.4, 0.2, -0.2, 0.1], [0.4, -0.4, 0.1, -0.1]])
+md.smb.lapserates        = np.array([[0.01,0.0],[0.01,-0.01],[0.0,-0.01]])
+md.smb.elevationbins  = np.array([100,150,100]).reshape(md.smb.num_basins,1)
 
 # Stochastic forcing
@@ -56,5 +58,5 @@
 md.stochasticforcing.covariance = np.array([[0.15, 0.08, -0.02], [0.08, 0.12, -0.05], [-0.02, -0.05, 0.1]])  # global covariance among- and between-fields
 md.stochasticforcing.randomflag = 0  # fixed random seeds
-
+md.stochasticforcing.stochastictimestep  = 1.0
 
 md = solve(md, 'Transient')
Index: /issm/trunk/test/NightlyRun/test317.py
===================================================================
--- /issm/trunk/test/NightlyRun/test317.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test317.py	(revision 27035)
@@ -20,5 +20,5 @@
 
 #Fields and tolerances to track changes
-field_names = ['Vx1', 'Vy1', 'Vz1', 'Vel1', 'Pressure1', 'Bed1', 'Surface1', 'Thickness1', 'Temperature1', 'BasalforcingsGroundediceMeltingRate1', 'GroundedArea1', 'FloatingArea1', 'TotalFloatingBmb1', 'TotalGroundedBmb1'
+field_names = ['Vx1', 'Vy1', 'Vz1', 'Vel1', 'Pressure1', 'Bed1', 'Surface1', 'Thickness1', 'Temperature1', 'BasalforcingsGroundediceMeltingRate1', 'GroundedArea1', 'FloatingArea1', 'TotalFloatingBmb1', 'TotalGroundedBmb1',
                'Vx2', 'Vy2', 'Vz2', 'Vel2', 'Pressure2', 'Bed2', 'Surface2', 'Thickness2', 'Temperature2', 'BasalforcingsGroundediceMeltingRate2', 'GroundedArea2', 'FloatingArea2', 'TotalFloatingBmb2', 'TotalGroundedBmb2',
                'Vx3', 'Vy3', 'Vz3', 'Vel3', 'Pressure3', 'Bed3', 'Surface3', 'Thickness3', 'Temperature3', 'BasalforcingsGroundediceMeltingRate3', 'GroundedArea3', 'FloatingArea3', 'TotalFloatingBmb2', 'TotalGroundedBmb2']
Index: /issm/trunk/test/NightlyRun/test3204.m
===================================================================
--- /issm/trunk/test/NightlyRun/test3204.m	(revision 27035)
+++ /issm/trunk/test/NightlyRun/test3204.m	(revision 27035)
@@ -0,0 +1,112 @@
+%Test Name: SquareShelfTransientCalibrationNBEcodipackCheckpoint
+
+%Same as test3201 but with checkpointing 1
+
+%Generate observations
+md = model;
+md = triangle(model(),'../Exp/Square.exp',100000.);
+md = setmask(md,'all','');
+md = parameterize(md,'../Par/SquareShelf.par');
+md = setflowequation(md,'SSA','all');
+md.cluster = generic('np',2);
+
+%Create real time series for B
+md.timestepping.interp_forcing = 0;
+md.timestepping.final_time = 2*md.timestepping.time_step;
+md.materials.rheology_B = 1.8e8*ones(md.mesh.numberofelements,2);
+md.materials.rheology_B(find(mean(md.mesh.x(md.mesh.elements),2)<mean(md.mesh.y(md.mesh.elements),2)),2)=1.4e8;
+md.materials.rheology_B=[md.materials.rheology_B;0.01 2*md.timestepping.time_step]; 
+
+%Initial values
+md.initialization.vx = zeros(md.mesh.numberofvertices,1);
+md.initialization.vy = zeros(md.mesh.numberofvertices,1);
+md.initialization.pressure = zeros(md.mesh.numberofvertices,1);
+md.initialization.temperature = zeros(md.mesh.numberofvertices,1);
+md.basalforcings.geothermalflux = zeros(md.mesh.numberofvertices,1);
+md.thermal.spctemperature = NaN(md.mesh.numberofvertices,1);
+
+md = solve(md,'tr');
+
+%Modify rheology, now constant
+md.materials.rheology_B(1:end-1,:) = 1.8e8;
+
+%Set cost function
+count = 1;
+for i=1:numel(md.results.TransientSolution)
+	vx_obs = md.results.TransientSolution(i).Vx;
+	vy_obs = md.results.TransientSolution(i).Vy;
+	z_obs  = md.results.TransientSolution(i).Surface;
+
+	time   = md.results.TransientSolution(i).time;
+	weights= ones(md.mesh.numberofvertices,1);
+
+	md.outputdefinition.definitions{count}=cfsurfacelogvel('name',['LogVelMis' num2str(count)],...
+		'definitionstring',['Outputdefinition' num2str(count)],...
+		'vxobs_string','VxObs','vxobs',vx_obs,...
+		'vyobs_string','VyObs','vyobs',vy_obs,...
+		'weights',weights,'weights_string','WeightsSurfaceObservation',...
+		'datatime',time);
+	md.autodiff.dependents{count} = dependent('name',['Outputdefinition' num2str(count)],'type','scalar','fos_reverse_index',1);
+	count = count+1;
+
+	md.outputdefinition.definitions{count}=cfsurfacesquare('name',['VyMisfit' num2str(count)],...
+		'definitionstring',['Outputdefinition' num2str(count)],...
+		'model_string','Vy','observation_string','VyObs',...
+		'observation',vy_obs/md.constants.yts,'weights',weights,'weights_string','WeightsSurfaceObservation',...
+		'datatime',time);
+	md.autodiff.dependents{count} = dependent('name',['Outputdefinition' num2str(count)],'type','scalar','fos_reverse_index',1);
+	count = count+1;
+
+	md.outputdefinition.definitions{count}=cfsurfacesquare('name',['VxMisfit' num2str(count)],...
+		'definitionstring',['Outputdefinition' num2str(count)],...
+		'model_string','Vx','observation_string','VxObs',...
+		'observation',vx_obs/md.constants.yts,'weights',500*weights,'weights_string','WeightsSurfaceObservation',...
+		'datatime',time);
+	md.autodiff.dependents{count} = dependent('name',['Outputdefinition' num2str(count)],'type','scalar','fos_reverse_index',1);
+	count = count+1;
+
+	md.outputdefinition.definitions{count}=cfsurfacesquare('name',['DEMMisfit' num2str(count)],...
+		'definitionstring',['Outputdefinition' num2str(count)],...
+		'model_string','Surface','observation_string','SurfaceObservation',...
+		'observation',z_obs,...
+		'weights',1/(md.constants.yts)*weights,...
+		'weights_string','WeightsSurfaceObservation',...
+		'datatime',time);
+	md.autodiff.dependents{count} = dependent('name',['Outputdefinition' num2str(count)],'type','scalar','fos_reverse_index',1);
+	count = count+1;
+end
+
+%Independent
+min_params = md.materials.rheology_B; min_params(1:end-1,:) = cuffey(273);
+max_params = md.materials.rheology_B; max_params(1:end-1,:) = cuffey(200);
+md.autodiff.independents{1} = independent('name','MaterialsRheologyBbar',...
+	'md_name','md.materials.rheology_B',...
+	'control_size',size(md.materials.rheology_B,2),...
+	'type','vertex',... %Really needed??
+	'min_parameters',min_params,...
+	'max_parameters',max_params,...
+	'control_scaling_factor',1e8);
+
+md.inversion=adm1qn3inversion(md.inversion);
+md.inversion.iscontrol=1;
+md.inversion.maxiter=3;
+md.inversion.maxsteps=md.inversion.maxiter;
+md.inversion.dxmin=1e-5;
+md.autodiff.isautodiff=1;
+md.autodiff.driver='fos_reverse';
+md.settings.checkpoint_frequency = 1;
+
+%Go solve!
+md.verbose=verbose(0);
+md=solve(md,'tr');
+%plotmodel(md,'axis#all','tight','data',md.results.TransientSolution(1).MaterialsRheologyBbar(:,1),'caxis#all',[ 1.3 1.9]*10^8,'title','B1',...
+%'data',md.results.TransientSolution(1).MaterialsRheologyBbar(:,2),'title','B2')
+
+%Fields and tolerances to track changes
+field_names     ={'Gradient','Misfit','Rheology'};
+field_tolerances={1e-12,1e-12,1e-12};
+field_values={...
+	(md.results.TransientSolution(1).Gradient1),...
+	(md.results.TransientSolution(1).J),...
+	(md.results.TransientSolution(1).MaterialsRheologyBbar),...
+	};
Index: /issm/trunk/test/NightlyRun/test3205.m
===================================================================
--- /issm/trunk/test/NightlyRun/test3205.m	(revision 27035)
+++ /issm/trunk/test/NightlyRun/test3205.m	(revision 27035)
@@ -0,0 +1,114 @@
+%Test Name: SquareShelfTransientCalibrationNBVcodipackCheckpoint
+
+%Same as test3202 but with checkpointing 1
+
+%Generate observations
+md = model;
+md=triangle(model(),'../Exp/Square.exp',100000.);
+md = setmask(md,'all','');
+md = parameterize(md,'../Par/SquareShelf.par');
+md = setflowequation(md,'SSA','all');
+md.cluster = generic('np',2);
+
+%Create real time series for B
+md.timestepping.interp_forcing = 0;
+md.timestepping.final_time = 2*md.timestepping.time_step;
+md.materials.rheology_B = 1.8e8*ones(md.mesh.numberofvertices,2);
+md.materials.rheology_B(find(md.mesh.x<md.mesh.y),2)=1.4e8;
+md.materials.rheology_B=[md.materials.rheology_B;0.01 2*md.timestepping.time_step];
+
+%Initial values
+md.initialization.vx = zeros(md.mesh.numberofvertices,1);
+md.initialization.vy = zeros(md.mesh.numberofvertices,1);
+md.initialization.pressure = zeros(md.mesh.numberofvertices,1);
+md.initialization.temperature = zeros(md.mesh.numberofvertices,1);
+md.basalforcings.geothermalflux = zeros(md.mesh.numberofvertices,1);
+md.thermal.spctemperature = NaN(md.mesh.numberofvertices,1);
+
+md = solve(md,'tr');
+%plotmodel(md,'axis#all','tight','data',md.materials.rheology_B(1:end-1,1),'caxis#all',[ 1.3 1.9]*10^8,'title','"True" B',...
+%'data',md.materials.rheology_B(1:end-1,2),'title','"True" B 2')
+
+%Modify rheology, now constant
+md.materials.rheology_B(1:end-1,:) = 1.8e8;
+
+%Set cost function
+count = 1;
+for i=1:numel(md.results.TransientSolution)
+	vx_obs = md.results.TransientSolution(i).Vx;
+	vy_obs = md.results.TransientSolution(i).Vy;
+	z_obs  = md.results.TransientSolution(i).Surface;
+
+	time   = md.results.TransientSolution(i).time;
+	weights= ones(md.mesh.numberofvertices,1);
+
+	md.outputdefinition.definitions{count}=cfsurfacelogvel('name',['LogVelMis' num2str(count)],...
+		'definitionstring',['Outputdefinition' num2str(count)],...
+		'vxobs_string','VxObs','vxobs',vx_obs,...
+		'vyobs_string','VyObs','vyobs',vy_obs,...
+		'weights',weights,'weights_string','WeightsSurfaceObservation',...
+		'datatime',time);
+	md.autodiff.dependents{count} = dependent('name',['Outputdefinition' num2str(count)],'type','scalar','fos_reverse_index',1);
+	count = count+1;
+
+	md.outputdefinition.definitions{count}=cfsurfacesquare('name',['VyMisfit' num2str(count)],...
+		'definitionstring',['Outputdefinition' num2str(count)],...
+		'model_string','Vy','observation_string','VyObs',...
+		'observation',vy_obs/md.constants.yts,'weights',weights,'weights_string','WeightsSurfaceObservation',...
+		'datatime',time);
+	md.autodiff.dependents{count} = dependent('name',['Outputdefinition' num2str(count)],'type','scalar','fos_reverse_index',1);
+	count = count+1;
+
+	md.outputdefinition.definitions{count}=cfsurfacesquare('name',['VxMisfit' num2str(count)],...
+		'definitionstring',['Outputdefinition' num2str(count)],...
+		'model_string','Vx','observation_string','VxObs',...
+		'observation',vx_obs/md.constants.yts,'weights',500*weights,'weights_string','WeightsSurfaceObservation',...
+		'datatime',time);
+	md.autodiff.dependents{count} = dependent('name',['Outputdefinition' num2str(count)],'type','scalar','fos_reverse_index',1);
+	count = count+1;
+
+	md.outputdefinition.definitions{count}=cfsurfacesquare('name',['DEMMisfit' num2str(count)],...
+		'definitionstring',['Outputdefinition' num2str(count)],...
+		'model_string','Surface','observation_string','SurfaceObservation',...
+		'observation',z_obs,...
+		'weights',1/(md.constants.yts)*weights,...
+		'weights_string','WeightsSurfaceObservation',...
+		'datatime',time);
+	md.autodiff.dependents{count} = dependent('name',['Outputdefinition' num2str(count)],'type','scalar','fos_reverse_index',1);
+	count = count+1;
+end
+
+%Independent
+min_params = md.materials.rheology_B; min_params(1:end-1,:) = cuffey(273);
+max_params = md.materials.rheology_B; max_params(1:end-1,:) = cuffey(200);
+md.autodiff.independents{1} = independent('name','MaterialsRheologyBbar',...
+	'md_name','md.materials.rheology_B',...
+	'control_size',size(md.materials.rheology_B,2),...
+	'type','vertex',... %Really needed??
+	'min_parameters',min_params,...
+	'max_parameters',max_params,...
+	'control_scaling_factor',1e8);
+
+md.inversion=adm1qn3inversion(md.inversion);
+md.inversion.iscontrol=1;
+md.inversion.maxiter=4;
+md.inversion.maxsteps=md.inversion.maxiter;
+md.inversion.dxmin=1e-5;
+md.autodiff.isautodiff=1;
+md.autodiff.driver='fos_reverse';
+md.settings.checkpoint_frequency = 1;
+
+%Go solve!
+md.verbose=verbose(0);
+md=solve(md,'tr');
+%plotmodel(md,'axis#all','tight','data',md.results.TransientSolution(1).MaterialsRheologyBbar(:,1),'caxis#all',[ 1.3 1.9]*10^8,'title','B1',...
+%'data',md.results.TransientSolution(1).MaterialsRheologyBbar(:,2),'title','B2')
+
+%Fields and tolerances to track changes
+field_names     ={'Gradient','Misfit','Rheology'};
+field_tolerances={1e-12,1e-12,1e-12};
+field_values={...
+	(md.results.TransientSolution(1).Gradient1),...
+	(md.results.TransientSolution(1).J),...
+	(md.results.TransientSolution(1).MaterialsRheologyBbar),...
+	};
Index: /issm/trunk/test/NightlyRun/test330.m
===================================================================
--- /issm/trunk/test/NightlyRun/test330.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test330.m	(revision 27035)
@@ -1,10 +1,10 @@
-%Test Name: SquareSheetConstrainedStressMLHO2d
+%Test Name: SquareSheetConstrainedStressMOLHO2d
 md=triangle(model(),'../Exp/Square.exp',150000.);
 md=setmask(md,'','');
 md=parameterize(md,'../Par/SquareSheetConstrained.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.cluster=generic('name',oshostname(),'np',3);
 md.stressbalance.requested_outputs={'default','VxSurface','VySurface','VxShear','VyShear','VxBase','VyBase'};
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Stressbalance');
 
Index: /issm/trunk/test/NightlyRun/test330.py
===================================================================
--- /issm/trunk/test/NightlyRun/test330.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test330.py	(revision 27035)
@@ -1,3 +1,3 @@
-#Test Name: SquareSheetConstrainedStressMLHO2d
+#Test Name: SquareSheetConstrainedStressMOLHO2d
 from model import *
 from socket import gethostname
@@ -7,5 +7,5 @@
 from setflowequation import setflowequation
 from solve import solve
-from SetMLHOBC import SetMLHOBC
+from SetMOLHOBC import SetMOLHOBC
 
 
@@ -13,8 +13,8 @@
 md = setmask(md, '', '')
 md = parameterize(md, '../Par/SquareSheetConstrained.py')
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.cluster = generic('name', gethostname(), 'np', 3)
 md.stressbalance.requested_outputs = ['default', 'VxSurface', 'VySurface', 'VxShear', 'VyShear', 'VxBase', 'VyBase']
-md = SetMLHOBC(md)
+md = SetMOLHOBC(md)
 md = solve(md, 'Stressbalance')
 
Index: /issm/trunk/test/NightlyRun/test332.m
===================================================================
--- /issm/trunk/test/NightlyRun/test332.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test332.m	(revision 27035)
@@ -1,9 +1,9 @@
-%Test Name: SquareSheetConstrainedTranMLHO2d
+%Test Name: SquareSheetConstrainedTranMOLHO2d
 md=triangle(model(),'../Exp/Square.exp',150000.);
 md=setmask(md,'','');
 md=parameterize(md,'../Par/SquareSheetConstrained.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.cluster=generic('name',oshostname(),'np',3);
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Transient');
 
Index: /issm/trunk/test/NightlyRun/test332.py
===================================================================
--- /issm/trunk/test/NightlyRun/test332.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test332.py	(revision 27035)
@@ -1,3 +1,3 @@
-#Test Name: SquareSheetConstrainedTranMLHO2d
+#Test Name: SquareSheetConstrainedTranMOLHO2d
 from model import *
 from socket import gethostname
@@ -7,12 +7,12 @@
 from setflowequation import setflowequation
 from solve import solve
-from SetMLHOBC import SetMLHOBC
+from SetMOLHOBC import SetMOLHOBC
 
 md = triangle(model(), '../Exp/Square.exp', 150000.)
 md = setmask(md, '', '')
 md = parameterize(md, '../Par/SquareSheetConstrained.py')
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.cluster = generic('name', gethostname(), 'np', 3)
-md = SetMLHOBC(md)
+md = SetMOLHOBC(md)
 md = solve(md, 'Transient')
 
Index: /issm/trunk/test/NightlyRun/test333.m
===================================================================
--- /issm/trunk/test/NightlyRun/test333.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test333.m	(revision 27035)
@@ -1,7 +1,7 @@
-%Test Name: SquareSheetConstrainedCMDragMLHO
+%Test Name: SquareSheetConstrainedCMDragMOLHO
 md=triangle(model(),'../Exp/Square.exp',200000.);
 md=setmask(md,'','');
 md=parameterize(md,'../Par/SquareSheetConstrained.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 
 %control parameters
@@ -19,5 +19,5 @@
 
 md.cluster=generic('name',oshostname(),'np',3);
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Stressbalance');
 
Index: /issm/trunk/test/NightlyRun/test333.py
===================================================================
--- /issm/trunk/test/NightlyRun/test333.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test333.py	(revision 27035)
@@ -1,11 +1,12 @@
-#Test Name: SquareSheetConstrainedCMDragMLHO
+#Test Name: SquareSheetConstrainedCMDragMOLHO
 import numpy as np
 from model import *
 from socket import gethostname
-from triangle import *
-from setmask import *
-from parameterize import *
-from setflowequation import *
-from solve import *
+from triangle import triangle
+from setmask import setmask
+from parameterize import parameterize
+from setflowequation import setflowequation
+from solve import solve
+from SetMOLHOBC import SetMOLHOBC
 
 
@@ -13,5 +14,5 @@
 md = setmask(md, '', '')
 md = parameterize(md, '../Par/SquareSheetConstrained.py')
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 
 #control parameters
@@ -32,5 +33,5 @@
 
 md.cluster = generic('name', gethostname(), 'np', 3)
-md = SetMLHOBC(md);
+md = SetMOLHOBC(md)
 md = solve(md, 'Stressbalance')
 
Index: /issm/trunk/test/NightlyRun/test334.m
===================================================================
--- /issm/trunk/test/NightlyRun/test334.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test334.m	(revision 27035)
@@ -1,7 +1,7 @@
-%Test Name: SquareShelfCMBMLHO
+%Test Name: SquareShelfCMBMOLHO
 md=triangle(model(),'../Exp/Square.exp',200000.);
 md=setmask(md,'all','');
 md=parameterize(md,'../Par/SquareShelf.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 
 %control parameters
@@ -20,5 +20,5 @@
 
 md.cluster=generic('name',oshostname(),'np',3);
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Stressbalance');
 
Index: /issm/trunk/test/NightlyRun/test334.py
===================================================================
--- /issm/trunk/test/NightlyRun/test334.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test334.py	(revision 27035)
@@ -1,17 +1,18 @@
-#Test Name: SquareShelfCMBMLHO
+#Test Name: SquareShelfCMBMOLHO
 from model import *
 from socket import gethostname
 import numpy as np
-from triangle import *
-from setmask import *
-from parameterize import *
-from setflowequation import *
-from solve import *
+from triangle import triangle
+from setmask import setmask
+from parameterize import parameterize
+from setflowequation import setflowequation
+from solve import solve
 from generic import generic
+from SetMOLHOBC import SetMOLHOBC
 
 md = triangle(model(), '../Exp/Square.exp', 200000)
 md = setmask(md, 'all', '')
 md = parameterize(md, '../Par/SquareShelf.py')
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 
 # control parameters
@@ -32,5 +33,5 @@
 
 md.cluster = generic('name', gethostname(), 'np', 3)
-md = SetMLHOBC(md);
+md = SetMOLHOBC(md)
 md = solve(md, 'Stressbalance')
 
Index: /issm/trunk/test/NightlyRun/test335.m
===================================================================
--- /issm/trunk/test/NightlyRun/test335.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test335.m	(revision 27035)
@@ -1,11 +1,11 @@
-%Test Name: SquareSheetConstrainedStressMLHO3d
+%Test Name: SquareSheetConstrainedStressMOLHO3d
 md=triangle(model(),'../Exp/Square.exp',200000.);
 md=setmask(md,'','');
 md=parameterize(md,'../Par/SquareSheetConstrained.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md = extrude(md, 5, 1);
 md.cluster=generic('name',oshostname(),'np',3);
 md.stressbalance.requested_outputs={'default','VxSurface','VySurface','VxShear','VyShear','VxBase','VyBase'};
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Stressbalance');
 
Index: /issm/trunk/test/NightlyRun/test335.py
===================================================================
--- /issm/trunk/test/NightlyRun/test335.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test335.py	(revision 27035)
@@ -1,3 +1,3 @@
-#Test Name: SquareSheetConstrainedStressMLHO2d
+#Test Name: SquareSheetConstrainedStressMOLHO2d
 from model import *
 from socket import gethostname
@@ -7,5 +7,5 @@
 from setflowequation import setflowequation
 from solve import solve
-from SetMLHOBC import SetMLHOBC
+from SetMOLHOBC import SetMOLHOBC
 
 
@@ -13,6 +13,6 @@
 md = setmask(md, '', '')
 md = parameterize(md, '../Par/SquareSheetConstrained.py')
-md = setflowequation(md, 'MLHO', 'all')
-md = SetMLHOBC(md)
+md = setflowequation(md, 'MOLHO', 'all')
+md = SetMOLHOBC(md)
 md.extrude(5, 1.)
 md.cluster = generic('name', gethostname(), 'np', 3)
Index: /issm/trunk/test/NightlyRun/test4003.m
===================================================================
--- /issm/trunk/test/NightlyRun/test4003.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test4003.m	(revision 27035)
@@ -4,5 +4,4 @@
 %Script control parameters
 steps=1:11;
-%steps=[1:3 6:11];
 
 %To download and recompile MITgcm from scratch:
@@ -41,7 +40,14 @@
     jEnd = Ny*3/4;  % where ice-shelf ends
     j2   = jEnd+1;
+    
+    % initial ocean conditions
+    T_sfc = -2;
+    T_bot = -1.9;
+    S_sfc = 34.2;
+    S_bot = 34.3;
 
     savedata(org, Nx, Ny, nPx, nPy, Nz, dLong, dLat, delZ, xgOrigin, ygOrigin, ...
-             rho_ice, rho_water, di, H, Hmin, Hmax, jEnd, j2, gravity, prec);
+             rho_ice, rho_water, di, H, Hmin, Hmax, jEnd, j2, gravity, prec, ...
+             T_sfc,T_bot,S_sfc,S_bot);
 end
 % }}}
@@ -82,4 +88,5 @@
         draft(i,:)=Hmin+dHdy*[-1:Ny-2]*dLat;
     end
+    draft(:,j2:Ny)=0;
 
     ice_mask=ones(Nx,Ny);
@@ -137,18 +144,4 @@
     fid=fopen(namF,'w','b'); fwrite(fid,draft,prec);fclose(fid);
     
-    var=([1:Ny]-2)/(jEnd-2);
-    dMdt_fy=zeros(Nx,Ny);
-    for i=1:Nx
-        dMdt_fy(i,:)=-cos(pi*var);
-        dMdt_fy(i,1)=0; dMdt_fy(i,j2:Ny)=0;
-    end    
-    %- rate of change due to ice-stream dynamics
-    rateDyn=rho_water*0.1/3600;  sfx='r02';
-    dMdt=rateDyn*dMdt_fy;
-    namF=sprintf('%s.%s.%s','run/shelfice_dMdt',sfx,'bin');
-    fid=fopen(namF,'w','b'); fwrite(fid,dMdt,prec);fclose(fid);
-
-    T_sfc = -1.9;
-    T_bot = 2;
     del_T = (T_bot - T_sfc)/(59*delZ);
     tref=zeros(1,Nz);
@@ -161,6 +154,4 @@
     fid=fopen(namF,'w','b'); fwrite(fid,tref,prec);fclose(fid);
 
-    S_sfc = 34.2;
-    S_bot = 34.7;
     del_S = (S_bot - S_sfc)/(59*delZ);
     sref=zeros(1,Nz);
@@ -193,9 +184,4 @@
     namF='run/salt_ini.bin';
     fid=fopen(namF,'w','b'); fwrite(fid,var,prec);fclose(fid);
-
-    rhoAvr=rho_water-1.345;
-    mIce=-rhoAvr*draft;
-    namF='run/shelficeMass.Lin.bin';
-    fid=fopen(namF,'w','b'); fwrite(fid,mIce,prec);fclose(fid);
     % }}}
 
@@ -413,21 +399,15 @@
     fid=fopen(namF,'w','b'); fwrite(fid,bathymetry,prec);fclose(fid);
     
+    draft=md.results.TransientSolution(end).Base;
+    draft=reshape(draft,[Nx+1,Ny+1]);
+    pos=ones(Nx+1,Ny+1);
+    pos(find(md.mask.ice_levelset>0))=0;
+    draft=draft.*pos;
+    draft=draft(1:Nx,1:Ny)+draft(2:end,1:Ny)+draft(1:Nx,2:end)+draft(2:end,2:end);
+    pos=pos(1:Nx,1:Ny)+pos(2:end,1:Ny)+pos(1:Nx,2:end)+pos(2:end,2:end);
+    draft(find(pos))=draft(find(pos))./pos(find(pos));
     namF='run/shelficeTopo.Lin.bin';
     fid=fopen(namF,'w','b'); fwrite(fid,draft,prec);fclose(fid);
     
-    var=([1:Ny]-2)/(jEnd-2);
-    dMdt_fy=zeros(Nx,Ny);
-    for i=1:Nx
-        dMdt_fy(i,:)=-cos(pi*var);
-        dMdt_fy(i,1)=0; dMdt_fy(i,j2:Ny)=0;
-    end    
-    %- rate of change due to ice-stream dynamics
-    rateDyn=rho_water*0.1/3600;  sfx='r02';
-    dMdt=rateDyn*dMdt_fy;
-    namF=sprintf('%s.%s.%s','run/shelfice_dMdt',sfx,'bin');
-    fid=fopen(namF,'w','b'); fwrite(fid,dMdt,prec);fclose(fid);
-
-    T_sfc = -1.9;
-    T_bot = 2;
     del_T = (T_bot - T_sfc)/(59*delZ);
     tref=zeros(1,Nz);
@@ -440,6 +420,4 @@
     fid=fopen(namF,'w','b'); fwrite(fid,tref,prec);fclose(fid);
 
-    S_sfc = 34.2;
-    S_bot = 34.7;
     del_S = (S_bot - S_sfc)/(59*delZ);
     sref=zeros(1,Nz);
@@ -472,9 +450,4 @@
     namF='run/salt_ini.bin';
     fid=fopen(namF,'w','b'); fwrite(fid,var,prec);fclose(fid);
-
-    rhoAvr=rho_water-1.345;
-    mIce=-rhoAvr*draft;
-    namF='run/shelficeMass.Lin.bin';
-    fid=fopen(namF,'w','b'); fwrite(fid,mIce,prec);fclose(fid);
     % }}}
     % }}}
Index: /issm/trunk/test/NightlyRun/test4004.m
===================================================================
--- /issm/trunk/test/NightlyRun/test4004.m	(revision 27035)
+++ /issm/trunk/test/NightlyRun/test4004.m	(revision 27035)
@@ -0,0 +1,427 @@
+%Test Name: IceOceanCoupling Dan Goldberg'd setup
+%ISSM/MITgcm coupled set-up
+%
+%Script control parameters
+steps=1:10;
+
+%To download and recompile MITgcm from scratch:
+!rm -rf ${ISSM_DIR}/test/MITgcm/install
+!rm -rf ${ISSM_DIR}/test/MITgcm/build/*
+!rm -rf Models
+
+%Organizer
+!mkdir Models
+org=organizer('repository','Models','prefix','IceOcean.','steps',steps);
+
+presentdirectory=pwd;
+
+% {{{ Parameters:
+if perform(org,'Parameters'),
+    Nx=3;   % number of longitude cells
+    Ny=200; % number of latitude cells
+    Nz=90;  % number of MITgcm vertical cells
+    nPx=1;  % number of MITgcm processes to use in x direction
+    nPy=8;  % number of MITgcm processes to use in y direction
+    xgOrigin=0;     % origin of longitude
+    ygOrigin=-75.5; % origin of latitude
+    dLong=.125;     % longitude grid spacing
+    dLat=dLong/16;  % latitude grid spacing
+    delZ=10;        % thickness of vertical levels (m)
+    gravity= 9.81;  % gravity (m^2/s)
+    rho_ice=917;
+    rho_water=1030;
+    di=rho_ice/rho_water;
+    prec = 'real*8'; % precision of MITgcm input binary files
+
+    % bathymetry and ice sheet geometry
+    H = -900;	    % water depth in the ice shelf cavity
+    Hmin = -600;    % deepest point of cavern		
+    Hmax = -300;    % shallowest point of cavern
+    jEnd = Ny*3/4;  % where ice-shelf ends
+    j2   = jEnd+1;
+    
+    % initial ocean conditions
+    T_sfc = -2;
+    T_bot = -1.9;
+    S_sfc = 34.2;
+    S_bot = 34.3;
+
+    savedata(org, Nx, Ny, nPx, nPy, Nz, dLong, dLat, delZ, xgOrigin, ygOrigin, ...
+             rho_ice, rho_water, di, H, Hmin, Hmax, jEnd, j2, gravity, prec, ...
+             T_sfc,T_bot,S_sfc,S_bot);
+end
+% }}}
+% {{{ Bathymetry:
+if perform(org,'Bathymetry'),
+
+    loaddata(org,'Parameters');
+
+    %create lat,lon
+    latg = ygOrigin+[0:Ny-1]*dLat;
+    latc = latg+dLat/2;
+    long = xgOrigin+[0:Nx-1]*dLong;
+    lonc = long+dLong/2;
+    [lat lon]=meshgrid(latc,lonc);
+    zC=-delZ*([1:Nz]-0.5);
+    zF=-delZ*[0:Nz];
+    
+    %create bathymetry:
+    bathymetry = ones(Nx,Ny)*H;
+    bathymetry(:,end) = 0;
+
+    %save bathymetry file for MITgcm
+    savedata(org,lat,lon,bathymetry);
+
+end
+% }}}
+% {{{ IceSheetGeometry:
+if perform(org,'IceSheetGeometry'),
+
+    loaddata(org,'Parameters');
+    loaddata(org,'Bathymetry');
+    latmin=min(lat(:));
+    latmax=max(lat(:));
+
+    dHdy = (Hmax-Hmin)/dLat/(jEnd-2); %Slope of ice shelf
+    draft=bathymetry;
+    for i=1:Nx
+        draft(i,:)=Hmin+dHdy*[-1:Ny-2]*dLat;
+    end
+    draft(:,j2:Ny)=0;
+
+    ice_mask=ones(Nx,Ny);
+    ice_mask(:,j2:Ny)=0;
+    iceshelf_mask=ice_mask;
+    thickness=abs(draft)/di;
+    
+    savedata(org,ice_mask,iceshelf_mask,draft,thickness);
+    
+    close all, figure(2), clf
+    subplot(411), pcolorcen(bathymetry); colorbar, title('bathymetry')
+    subplot(412), pcolorcen(ice_mask); colorbar, title('ice and iceshelf mask')
+    subplot(413), pcolorcen(draft); colorbar, title('draft')
+    subplot(414), pcolorcen(thickness); colorbar, title('thickness')
+    
+end
+% }}}
+
+%Configure MITgcm
+% {{{ GetMITgcm:
+if perform(org,'GetMITgcm'),
+  system([pwd '/../MITgcm/get_mitgcm.sh']);
+end
+% }}}
+% {{{ BuildMITgcm:
+if perform(org,'BuildMITgcm'),
+    system(['../MITgcm/build_4003.sh generic ' pwd '/../MITgcm']);
+end
+% }}}
+addpath(recursivepath([pwd '/../MITgcm']));
+% {{{ RunUncoupledMITgcm:
+if perform(org,'RunUncoupledMITgcm'),
+
+    loaddata(org,'Parameters');
+    loaddata(org,'Bathymetry');
+    loaddata(org,'IceSheetGeometry');
+
+    % rename previous run directory and create new one
+    if exist ('run.old')
+        !\rm -rf run.old
+    end
+    if exist ('run')
+        !\mv run run.old
+    end
+    !\mkdir run
+    !\cp ../MITgcm/build/mitgcmuv run
+    !\cp ../MITgcm/input_4004/* run
+    !\cp ../MITgcm/input_4004/eedata_uncoupled run/eedata
+    
+    % {{{ Construct MITgcm binary input files
+    namF='run/bathy_flat.bin';
+    fid=fopen(namF,'w','b'); fwrite(fid,bathymetry,prec);fclose(fid);
+    
+    namF='run/shelficeTopo.Lin.bin';
+    fid=fopen(namF,'w','b'); fwrite(fid,draft,prec);fclose(fid);
+    
+    del_T = (T_bot - T_sfc)/(59*delZ);
+    tref=zeros(1,Nz);
+    for k = 1:Nz;
+        tref(k) = T_sfc + del_T*((k-20)*delZ);
+        tref(k)= max(T_sfc,min(tref(k),T_bot));
+    end
+    namF='run/temp_obc.bin';
+    tref=[tref; tref; tref];
+    fid=fopen(namF,'w','b'); fwrite(fid,tref,prec);fclose(fid);
+
+    del_S = (S_bot - S_sfc)/(59*delZ);
+    sref=zeros(1,Nz);
+    for k = 1:Nz;
+        sref(k) = S_sfc + del_S*((k-20)*delZ);
+        sref(k)= max(S_sfc,min(sref(k),S_bot));
+    end
+    namF='run/salt_obc.bin';
+    sref=[sref; sref; sref];
+    fid=fopen(namF,'w','b'); fwrite(fid,sref,prec);fclose(fid);
+
+    zax=[1:Nz];
+    v1=2.5e-2;
+    var=1+Nz-2*zax; var=var/(Nz-1);
+    vobc=v1*var;
+    namF='run/vVel_obc.bin';
+    vobc=[vobc; vobc; vobc];
+    fid=fopen(namF,'w','b'); fwrite(fid,vobc,prec);fclose(fid);
+
+    var=zeros(Nx,Ny,Nz);
+    for i=1:Nx, for j=1:Ny
+            var(i,j,:)=tref(1,:);
+        end, end
+    namF='run/temp_ini.bin';
+    fid=fopen(namF,'w','b'); fwrite(fid,var,prec);fclose(fid);
+
+    for i=1:Nx, for j=1:Ny
+            var(i,j,:)=sref(1,:);
+        end, end
+    namF='run/salt_ini.bin';
+    fid=fopen(namF,'w','b'); fwrite(fid,var,prec);fclose(fid);
+    % }}}
+
+    cd run
+    eval(['!mpirun -np ' int2str(nPx*nPy) ' ./mitgcmuv']);
+    cd ..
+end
+% }}}
+
+%Configure ISSM
+% {{{ CreateMesh:
+if perform(org,'CreateMesh'),
+
+    loaddata(org,'Parameters');
+
+    %create model:
+    md=model();
+
+    %Grab lat,long from MITgcm:
+    long=readbin('run/XC.data',[Nx Ny]);
+    lat=readbin('run/YC.data',[Nx Ny]);
+
+    %project lat,long:
+    [x,y]=ll2xy(lat(:),long(:),-1);
+    index=[];
+    %  C  D
+    %  A  B
+    for j=1:(Ny-1),
+        for i=1:(Nx-1),
+            A=(j-1)*(Nx)+i;
+            B=(j-1)*(Nx)+i+1;
+            C=j*(Nx)+i;
+            D=j*(Nx)+i+1;
+            index(end+1,:)=[A B C];
+            index(end+1,:)=[C B D];
+        end
+    end
+
+    %fill mesh and model:
+    md=meshconvert(md,index,x,y);
+    md.mesh.lat=lat(:);
+    md.mesh.long=long(:);
+
+    savemodel(org,md);
+
+end
+% }}}
+% {{{ MeshGeometry:
+if perform(org,'MeshGeometry'),
+
+    loaddata(org,'Parameters');
+    loaddata(org,'CreateMesh');
+    loaddata(org,'Bathymetry');
+    loaddata(org,'IceSheetGeometry');
+
+    %start filling some of the fields
+    md.geometry.bed=bathymetry(:);
+    md.geometry.thickness=thickness(:);
+    md.geometry.base=-917/1028*md.geometry.thickness;
+    md.geometry.surface=md.geometry.base+md.geometry.thickness;
+
+    %nothing passes icefront:
+    pos=find((~ice_mask(:) & ice_mask(:)~=0) | thickness(:)==0);
+    md.geometry.thickness(pos)=1;
+    md.geometry.surface(pos)=(1-di)*md.geometry.thickness(pos);
+    md.geometry.base(pos)=-di*md.geometry.thickness(pos);
+
+    %level sets:
+    md.mask.ice_levelset=iceshelf_mask(:);
+    pos=find(md.mask.ice_levelset==1); md.mask.ice_levelset(pos)=-1;
+    pos=find(md.mask.ice_levelset==0); md.mask.ice_levelset(pos)=1;
+    md.mask.ocean_levelset=-ones(md.mesh.numberofvertices,1);
+
+    savemodel(org,md);
+
+end
+% }}}
+% {{{ ParameterizeIce:
+if perform(org,'ParameterizeIce'),
+
+	loaddata(org,'MeshGeometry');
+
+	%miscellaneous
+	md.miscellaneous.name='test4004';
+
+	%initial velocity:
+	md.initialization.vx=zeros(md.mesh.numberofvertices,1);
+	md.initialization.vy=zeros(md.mesh.numberofvertices,1);
+	md.initialization.vz=zeros(md.mesh.numberofvertices,1);
+
+	%friction:
+	md.friction.coefficient=0*ones(md.mesh.numberofvertices,1);
+	pos=find(md.mask.ocean_levelset>0);
+	md.friction.coefficient(pos)=5;
+	md.friction.p=ones(md.mesh.numberofelements,1);
+	md.friction.q=ones(md.mesh.numberofelements,1);
+
+	%temperatures and surface mass balance:
+	md.initialization.temperature=(273.15-22)*ones(md.mesh.numberofvertices,1);
+	md.initialization.pressure=md.materials.rho_ice*md.constants.g*(md.geometry.surface-md.geometry.base);
+	md.smb.mass_balance = 0*ones(md.mesh.numberofvertices,1);
+
+	%Flow law
+	md.materials.rheology_B=paterson(md.initialization.temperature);
+	md.materials.rheology_n=3*ones(md.mesh.numberofelements,1);
+	md.damage.D=zeros(md.mesh.numberofvertices,1);
+	md.damage.spcdamage=NaN*ones(md.mesh.numberofvertices,1);
+
+	%the spcs going
+	md.stressbalance.spcvx=NaN*ones(md.mesh.numberofvertices,1);
+	md.stressbalance.spcvy=NaN*ones(md.mesh.numberofvertices,1);
+	md.stressbalance.spcvz=NaN*ones(md.mesh.numberofvertices,1);
+	md.stressbalance.referential=NaN*ones(md.mesh.numberofvertices,6);
+	md.stressbalance.loadingforce=0*ones(md.mesh.numberofvertices,3);
+	md.masstransport.spcthickness=NaN*ones(md.mesh.numberofvertices,1);
+
+	%get some flux at the ice divide:
+	pos=find(md.mesh.lat==min(md.mesh.lat));
+	md.masstransport.spcthickness(pos)=md.geometry.thickness(pos);
+	md.stressbalance.spcvy(pos)=800;
+	md.stressbalance.spcvx(pos)=0;
+
+	%deal with boundaries, excluding icefront:
+	pos=find(md.mesh.long==min(md.mesh.long) | md.mesh.long==max(md.mesh.long));
+	md.stressbalance.spcvx(pos)=0;
+
+	point1=find(md.mesh.y==min(md.mesh.y)); point2=find(md.mesh.x==max(md.mesh.x));
+	costheta=(md.mesh.x(point2)-md.mesh.x(point1))/sqrt((md.mesh.x(point2)-md.mesh.x(point1)).^2+(md.mesh.y(point2)-md.mesh.y(point1)).^2);
+	sintheta=(md.mesh.y(point2)-md.mesh.y(point1))/sqrt((md.mesh.x(point2)-md.mesh.x(point1)).^2+(md.mesh.y(point2)-md.mesh.y(point1)).^2);
+	md.stressbalance.referential(:,1:3)=repmat([costheta,sintheta,0],md.mesh.numberofvertices,1);
+	md.stressbalance.referential(:,4:6)=repmat([-sintheta,costheta,0],md.mesh.numberofvertices,1);
+
+	md.basalforcings.groundedice_melting_rate=zeros(md.mesh.numberofvertices,1);
+	md.basalforcings.floatingice_melting_rate=zeros(md.mesh.numberofvertices,1);
+	md.thermal.spctemperature=[md.initialization.temperature; 1]; %impose observed temperature on surface
+	md.basalforcings.geothermalflux=.064*ones(md.mesh.numberofvertices,1);
+
+	%flow equations:
+	md=setflowequation(md,'SSA','all');
+
+	savemodel(org,md);
+end
+% }}}
+
+%Run MITgcm/ISSM
+% {{{ RunCoupledMITgcmISSM:
+if perform(org,'RunCoupledMITgcmISSM'),
+
+    loaddata(org,'Parameters');
+    loaddata(org,'Bathymetry');
+    loaddata(org,'IceSheetGeometry');
+    loaddata(org,'ParameterizeIce');
+
+    % {{{ prepare ISSM
+    md.transient.isoceancoupling=1;
+    md.transient.isgroundingline=0;
+    md.transient.isthermal=0;
+    md.groundingline.migration='SubelementMigration';
+    md.groundingline.melt_interpolation='NoMeltOnPartiallyFloating';
+    md.groundingline.friction_interpolation='SubelementFriction2';
+    md.masstransport.stabilization=1;
+    md.timestepping.coupling_time=1/24/365/100;          % 1/100 hour in decimal years
+    md.timestepping.time_step=1/24/365/100;              % 1/100 hour in decimal years
+    md.timestepping.final_time=23/24/365;            % hour 23 in decimal years
+    md.cluster=generic('name',oshostname(),'np',2);
+    md.cluster.npocean=nPx*nPy;
+    md.cluster.np=2;
+    md.cluster.executionpath=[pwd '/run'];
+    md.transient.requested_outputs={'default','MaskOceanLevelset'};
+    md.masstransport.requested_outputs={'default','BasalforcingsFloatingiceMeltingRate'};
+    % }}}
+    % {{{ prepare MITgcm
+    % rename previous run directory and create new one
+    if exist ('run.old')
+        !\rm -rf run.old
+    end
+    if exist ('run')
+        !\mv run run.old
+    end
+    !\mkdir run
+    !\cp ../MITgcm/build/mitgcmuv run
+    !\cp ../MITgcm/input_4004/* run
+    
+    % {{{ Construct MITgcm binary input files
+    namF='run/bathy_flat.bin';
+    fid=fopen(namF,'w','b'); fwrite(fid,bathymetry,prec);fclose(fid);
+
+    namF='run/shelficeTopo.Lin.bin';
+    fid=fopen(namF,'w','b'); fwrite(fid,draft,prec);fclose(fid);
+
+    del_T = (T_bot - T_sfc)/(59*delZ);
+    tref=zeros(1,Nz);
+    for k = 1:Nz;
+        tref(k) = T_sfc + del_T*((k-20)*delZ);
+        tref(k)= max(T_sfc,min(tref(k),T_bot));
+    end
+    namF='run/temp_obc.bin';
+    tref=[tref; tref; tref];
+    fid=fopen(namF,'w','b'); fwrite(fid,tref,prec);fclose(fid);
+
+    del_S = (S_bot - S_sfc)/(59*delZ);
+    sref=zeros(1,Nz);
+    for k = 1:Nz;
+        sref(k) = S_sfc + del_S*((k-20)*delZ);
+        sref(k)= max(S_sfc,min(sref(k),S_bot));
+    end
+    namF='run/salt_obc.bin';
+    sref=[sref; sref; sref];
+    fid=fopen(namF,'w','b'); fwrite(fid,sref,prec);fclose(fid);
+
+    zax=[1:Nz];
+    v1=2.5e-2;
+    var=1+Nz-2*zax; var=var/(Nz-1);
+    vobc=v1*var;
+    namF='run/vVel_obc.bin';
+    vobc=[vobc; vobc; vobc];
+    fid=fopen(namF,'w','b'); fwrite(fid,vobc,prec);fclose(fid);
+
+    var=zeros(Nx,Ny,Nz);
+    for i=1:Nx, for j=1:Ny
+            var(i,j,:)=tref(1,:);
+        end, end
+    namF='run/temp_ini.bin';
+    fid=fopen(namF,'w','b'); fwrite(fid,var,prec);fclose(fid);
+
+    for i=1:Nx, for j=1:Ny
+            var(i,j,:)=sref(1,:);
+        end, end
+    namF='run/salt_ini.bin';
+    fid=fopen(namF,'w','b'); fwrite(fid,var,prec);fclose(fid);
+    % }}}
+    % }}}
+
+    md=solveiceocean(md,'Transient','runtimename',false);
+
+    savemodel(org,md);
+    
+    plotmodel(md,'data',md.results.TransientSolution(end).Vel,'data',md.results.TransientSolution(end).Thickness)
+
+%eval(['!mpiexec -np ' int2str(md.cluster.np) ' ' md.cluster.codepath '/issm_ocean.exe TransientSolution ' pwd ' ' md.miscellaneous.name ' ']);
+%eval(['!mpiexec -np ' int2str(md.cluster.np) ' ' md.cluster.codepath '/issm_ocean.exe TransientSolution ' pwd ' ' md.miscellaneous.name ' : -np ' int2str(nPx*nPy) ' ./mitgcmuv']);
+end
+% }}}
Index: /issm/trunk/test/NightlyRun/test427.py
===================================================================
--- /issm/trunk/test/NightlyRun/test427.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test427.py	(revision 27035)
@@ -2,9 +2,9 @@
 from model import *
 from socket import gethostname
-
-from setmask import *
-from parameterize import *
-from setflowequation import *
-from solve import *
+from triangle import triangle
+from setmask import setmask
+from parameterize import parameterize
+from setflowequation import setflowequation
+from solve import solve
 
 md = triangle(model(), '../Exp/Square.exp', 150000.)
Index: /issm/trunk/test/NightlyRun/test436.py
===================================================================
--- /issm/trunk/test/NightlyRun/test436.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test436.py	(revision 27035)
@@ -3,9 +3,9 @@
 from model import *
 from socket import gethostname
-from triangle import *
-from setmask import *
-from parameterize import *
-from setflowequation import *
-from solve import *
+from triangle import triangle
+from setmask import setmask
+from parameterize import parameterize
+from setflowequation import setflowequation
+from solve import solve
 
 md = triangle(model(), '../Exp/Square.exp', 150000.)
@@ -26,5 +26,5 @@
 for i in ['LliboutryDuval', 'CuffeyTemperate']:
     print(' ')
-    print(' == == == Testing rheology law: ' + i + ' = ')
+    print(' ====== Testing rheology law: ' + i + ' = ')
 
     md.materials.rheology_law = i
Index: /issm/trunk/test/NightlyRun/test443.py
===================================================================
--- /issm/trunk/test/NightlyRun/test443.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test443.py	(revision 27035)
@@ -3,10 +3,9 @@
 from model import *
 from socket import gethostname
-
-from triangle import *
-from setmask import *
-from parameterize import *
-from setflowequation import *
-from solve import *
+from triangle import triangle
+from setmask import setmask
+from parameterize import parameterize
+from setflowequation import setflowequation
+from solve import solve
 from frictioncoulomb import frictioncoulomb
 from ContourToMesh import ContourToMesh
Index: /issm/trunk/test/NightlyRun/test446.m
===================================================================
--- /issm/trunk/test/NightlyRun/test446.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test446.m	(revision 27035)
@@ -1,10 +1,10 @@
-%Test Name: SquareSheetShelfStressMLHO2d
+%Test Name: SquareSheetShelfStressMOLHO2d
 md=triangle(model(),'../Exp/Square.exp',150000.);
 md=setmask(md,'../Exp/SquareShelf.exp','');
 md=parameterize(md,'../Par/SquareSheetShelf.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.cluster=generic('name',oshostname(),'np',3);
 md.stressbalance.requested_outputs={'default','VxSurface','VySurface','VxShear','VyShear','VxBase','VyBase'};
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Stressbalance');
 
Index: /issm/trunk/test/NightlyRun/test446.py
===================================================================
--- /issm/trunk/test/NightlyRun/test446.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test446.py	(revision 27035)
@@ -1,19 +1,19 @@
-#Test Name: SquareSheetShelfStressMLHO2d
+#Test Name: SquareSheetShelfStressMOLHO2d
 from model import *
 from socket import gethostname
-
-from triangle import *
-from setmask import *
-from parameterize import *
-from setflowequation import *
-from solve import *
+from triangle import triangle
+from setmask import setmask
+from parameterize import parameterize
+from setflowequation import setflowequation
+from solve import solve
+from SetMOLHOBC import SetMOLHOBC
 
 md = triangle(model(), '../Exp/Square.exp', 150000.)
 md = setmask(md, '../Exp/SquareShelf.exp', '')
 md = parameterize(md, '../Par/SquareSheetShelf.py')
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.cluster = generic('name', gethostname(), 'np', 3)
 md.stressbalance.requested_outputs = ['default', 'VxSurface', 'VySurface', 'VxShear', 'VyShear', 'VxBase', 'VyBase']
-md = SetMLHOBC(md);
+md = SetMOLHOBC(md);
 md = solve(md, 'Stressbalance')
 
Index: /issm/trunk/test/NightlyRun/test447.m
===================================================================
--- /issm/trunk/test/NightlyRun/test447.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test447.m	(revision 27035)
@@ -1,3 +1,3 @@
-%Test Name: SquareSheetShelfTranMLHO2d
+%Test Name: SquareSheetShelfTranMOLHO2d
 md=triangle(model(),'../Exp/Square.exp',150000.);
 md=setmask(md,'../Exp/SquareShelf.exp','');
@@ -13,8 +13,8 @@
 md.transient.isthermal=0;
 md.transient.isgroundingline=1;
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.cluster=generic('name',oshostname(),'np',3);
 md.transient.requested_outputs={'default','GroundedArea','FloatingArea','TotalFloatingBmb','TotalGroundedBmb','TotalSmb'};
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Transient');
 
Index: /issm/trunk/test/NightlyRun/test447.py
===================================================================
--- /issm/trunk/test/NightlyRun/test447.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test447.py	(revision 27035)
@@ -1,3 +1,3 @@
-#Test Name: SquareSheetShelfTranMLHO2d
+#Test Name: SquareSheetShelfTranMOLHO2d
 import numpy as np
 from model import *
@@ -8,5 +8,5 @@
 from setflowequation import setflowequation
 from solve import solve
-from SetMLHOBC import SetMLHOBC
+from SetMOLHOBC import SetMOLHOBC
 from frictioncoulomb import frictioncoulomb
 from generic import generic
@@ -25,8 +25,8 @@
 md.transient.isthermal = False
 md.transient.isgroundingline = True
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.cluster = generic('name', gethostname(), 'np', 3)
 md.transient.requested_outputs = ['default', 'GroundedArea', 'FloatingArea', 'TotalFloatingBmb', 'TotalGroundedBmb', 'TotalSmb']
-md = SetMLHOBC(md)
+md = SetMOLHOBC(md)
 md = solve(md, 'Transient')
 
Index: /issm/trunk/test/NightlyRun/test448.m
===================================================================
--- /issm/trunk/test/NightlyRun/test448.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test448.m	(revision 27035)
@@ -1,3 +1,3 @@
-%Test Name: RoundSheetShelfGLMigrationMLHO2d
+%Test Name: RoundSheetShelfGLMigrationMOLHO2d
 radius=1.e6;
 shelfextent=2.e5;
@@ -16,5 +16,5 @@
 md=setmask(md,flags,''); 
 md=parameterize(md,'../Par/RoundSheetShelf.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.cluster=generic('name',oshostname(),'np',3);
 
@@ -25,5 +25,5 @@
 md.transient.isgroundingline=1;
 
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 %test different grounding line dynamics.
 md.groundingline.migration='AggressiveMigration';
Index: /issm/trunk/test/NightlyRun/test448.py
===================================================================
--- /issm/trunk/test/NightlyRun/test448.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test448.py	(revision 27035)
@@ -1,11 +1,12 @@
-#Test Name: RoundSheetShelfGLMigrationMLHO2d
+#Test Name: RoundSheetShelfGLMigrationMOLHO2d
 import numpy as np
 from model import *
 from socket import gethostname
-from roundmesh import *
-from setmask import *
-from parameterize import *
-from setflowequation import *
-from solve import *
+from roundmesh import roundmesh
+from setmask import setmask
+from parameterize import parameterize
+from setflowequation import setflowequation
+from solve import solve
+from SetMOLHOBC import SetMOLHOBC
 
 
@@ -27,5 +28,5 @@
 md = setmask(md, flags, '')
 md = parameterize(md, '../Par/RoundSheetShelf.py')
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.cluster = generic('name', gethostname(), 'np', 3)
 
@@ -38,5 +39,5 @@
 #test different grounding line dynamics.
 md.groundingline.migration = 'AggressiveMigration'
-md = SetMLHOBC(md);
+md = SetMOLHOBC(md)
 md = solve(md, 'Transient')
 element_on_iceshelf_agressive = md.results.TransientSolution[0].MaskOceanLevelset
Index: /issm/trunk/test/NightlyRun/test449.m
===================================================================
--- /issm/trunk/test/NightlyRun/test449.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test449.m	(revision 27035)
@@ -1,3 +1,3 @@
-%Test Name: MISMIP3DMLHO
+%Test Name: MISMIP3DMOLHO
 md=triangle(model(),'../Exp/Square.exp',100000.);
 md=setmask(md,'../Exp/SquareShelf.exp','');
@@ -12,5 +12,5 @@
 md.geometry.base(pos)=md.geometry.bed(pos);
 md.geometry.surface=md.geometry.base+md.geometry.thickness;
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 
 %Boundary conditions:
@@ -45,5 +45,5 @@
 
 md.cluster=generic('name',oshostname(),'np',3);
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Transient');
 
Index: /issm/trunk/test/NightlyRun/test449.py
===================================================================
--- /issm/trunk/test/NightlyRun/test449.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test449.py	(revision 27035)
@@ -1,3 +1,3 @@
-#Test Name: MISMIP3DMLHO
+#Test Name: MISMIP3DMOLHO
 import numpy as np
 from model import *
@@ -8,5 +8,5 @@
 from setflowequation import setflowequation
 from solve import solve
-from SetMLHOBC import SetMLHOBC
+from SetMOLHOBC import SetMOLHOBC
 from generic import generic
 
@@ -24,5 +24,5 @@
 md.geometry.base[pos] = md.geometry.bed[pos]
 md.geometry.surface = md.geometry.base + md.geometry.thickness
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 
 #Boundary conditions:
@@ -59,5 +59,5 @@
 
 md.cluster = generic('name', gethostname(), 'np', 3)
-md = SetMLHOBC(md)
+md = SetMOLHOBC(md)
 md = solve(md, 'Transient')
 #print md.results.TransientSolution[0].BasalforcingsFloatingiceMeltingRate
Index: /issm/trunk/test/NightlyRun/test518.m
===================================================================
--- /issm/trunk/test/NightlyRun/test518.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test518.m	(revision 27035)
@@ -1,10 +1,10 @@
-%Test Name: PigStressMLHO2d
+%Test Name: PigStressMOLHO2d
 md=triangle(model(),'../Exp/Pig.exp',20000.);
 md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
 md=parameterize(md,'../Par/Pig.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.cluster=generic('name',oshostname(),'np',3);
 md.stressbalance.requested_outputs={'default','VxSurface','VySurface','VxShear','VyShear','VxBase','VyBase'};
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Stressbalance');
 
Index: /issm/trunk/test/NightlyRun/test518.py
===================================================================
--- /issm/trunk/test/NightlyRun/test518.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test518.py	(revision 27035)
@@ -1,10 +1,12 @@
-#Test Name: PigStressMLHO2d
+
+#Test Name: PigStressMOLHO2d
 from model import *
 from socket import gethostname
-from triangle import *
-from setmask import *
-from parameterize import *
-from setflowequation import *
-from solve import *
+from triangle import triangle
+from setmask import setmask
+from parameterize import parameterize
+from setflowequation import setflowequation
+from solve import solve
+from SetMOLHOBC import SetMOLHOBC
 
 
@@ -12,8 +14,8 @@
 md = setmask(md, '../Exp/PigShelves.exp', '../Exp/PigIslands.exp')
 md = parameterize(md, '../Par/Pig.py')
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.cluster = generic('name', gethostname(), 'np', 3)
 md.stressbalance.requested_outputs = ['default', 'VxSurface', 'VySurface', 'VxShear', 'VyShear', 'VxBase', 'VyBase']
-md = SetMLHOBC(md);
+md = SetMOLHOBC(md)
 md = solve(md, 'Stressbalance')
 
Index: /issm/trunk/test/NightlyRun/test519.m
===================================================================
--- /issm/trunk/test/NightlyRun/test519.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test519.m	(revision 27035)
@@ -1,7 +1,7 @@
-%Test Name: PigTranMLHO2d
+%Test Name: PigTranMOLHO2d
 md=triangle(model(),'../Exp/Pig.exp',20000.);
 md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
 md=parameterize(md,'../Par/Pig.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.cluster=generic('name',oshostname(),'np',3);
 md.geometry.bed=md.geometry.base;
@@ -9,5 +9,5 @@
 md.mesh.scale_factor=0.9*ones(md.mesh.numberofvertices,1);
 md.transient.requested_outputs={'default','IceVolume','IceVolumeScaled','GroundedArea','GroundedAreaScaled','FloatingArea','FloatingAreaScaled','TotalSmb','TotalSmbScaled','TotalFloatingBmb','TotalFloatingBmbScaled'};
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Transient');
 
Index: /issm/trunk/test/NightlyRun/test519.py
===================================================================
--- /issm/trunk/test/NightlyRun/test519.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test519.py	(revision 27035)
@@ -1,3 +1,3 @@
-#Test Name: PigTranMLHO2d
+#Test Name: PigTranMOLHO2d
 import numpy as np
 from model import *
@@ -8,5 +8,5 @@
 from setflowequation import setflowequation
 from solve import solve
-from SetMLHOBC import SetMLHOBC
+from SetMOLHOBC import SetMOLHOBC
 from generic import generic
 
@@ -14,9 +14,9 @@
 md = setmask(md, '../Exp/PigShelves.exp', '../Exp/PigIslands.exp')
 md = parameterize(md, '../Par/Pig.py')
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.mesh.scale_factor = 0.9 * np.ones((md.mesh.numberofvertices))
 md.transient.requested_outputs = ['default', 'IceVolume', 'IceVolumeScaled', 'GroundedArea', 'GroundedAreaScaled', 'FloatingArea', 'FloatingAreaScaled', 'TotalSmb', 'TotalSmbScaled', 'TotalFloatingBmb', 'TotalFloatingBmbScaled']
 md.cluster = generic('name', gethostname(), 'np', 3)
-md = SetMLHOBC(md)
+md = SetMOLHOBC(md)
 md = solve(md, 'Transient')
 
Index: /issm/trunk/test/NightlyRun/test541.m
===================================================================
--- /issm/trunk/test/NightlyRun/test541.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test541.m	(revision 27035)
@@ -35,6 +35,6 @@
 field_tolerances={...
 	1e-11,2e-11,2e-11,1e-12,2e-11,6e-12,9e-12,1e-12,...
-	1e-11,2e-11,2e-11,1e-12,2e-11,...
-	2e-11,1e-11,1e-11,9e-12,2e-11,2e-11,2e-11,1e-11,...
+	1e-11,2e-11,2e-11,2e-9,2e-11,...
+	2e-11,1e-11,1e-11,9e-12,2e-11,3e-11,2e-11,1e-11,...
 	1e-11,2e-11,2e-11,8e-08,2e-11,...
 	2e-10,1e-10,1e-10,1e-10,1e-10,1e-10,1e-10,1e-9,...
Index: /issm/trunk/test/NightlyRun/test541.py
===================================================================
--- /issm/trunk/test/NightlyRun/test541.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test541.py	(revision 27035)
@@ -42,6 +42,6 @@
                'IceVolume10', 'IceVolumeAboveFloatation10', 'TotalSmb10', 'TotalGroundedBmb10', 'TotalFloatingBmb10']
 field_tolerances = [1e-11, 2e-11, 2e-11, 1e-12, 2e-11, 6e-12, 9e-12, 1e-12,
-                    1e-11, 2e-11, 2e-11, 1e-12, 2e-11,
-                    2e-11, 1e-11, 1e-11, 9e-12, 2e-11, 2e-11, 2e-11, 1e-11,
+                    1e-11, 2e-11, 2e-11, 2e-9, 2e-11,
+                    2e-11, 1e-11, 1e-11, 9e-12, 2e-11, 3e-11, 2e-11, 1e-11,
                     1e-11, 2e-11, 2e-11, 8e-08, 2e-11,
                     2e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-9,
Index: /issm/trunk/test/NightlyRun/test542.py
===================================================================
--- /issm/trunk/test/NightlyRun/test542.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test542.py	(revision 27035)
@@ -1,14 +1,13 @@
 #Test Name: PigTranFrontalforcingsrignot
 import numpy as np
-
-from calvingvonmises import *
-from frontalforcingsrignot import *
+from calvingvonmises import calvingvonmises
+from frontalforcingsrignot import frontalforcingsrignot
 from socket import gethostname
 from model import *
-from parameterize import *
-from setflowequation import *
-from setmask import *
-from solve import *
-from triangle import *
+from parameterize import parameterize
+from setflowequation import setflowequation
+from setmask import setmask
+from solve import solve
+from triangle import triangle
 
 
@@ -35,10 +34,10 @@
 md.frontalforcings = frontalforcingsrignot()
 md.frontalforcings.num_basins = 2
-md.frontalforcings.basin_id = idbasin - 1  # NOTE: offset because of 1-based vertex indexing
+md.frontalforcings.basin_id = idbasin
 md.frontalforcings.subglacial_discharge = 0.1 * np.ones((md.mesh.numberofvertices,))
 md.frontalforcings.thermalforcing = 0.5 * np.ones((md.mesh.numberofvertices,))
 for elem in range(md.mesh.numberofelements):
     if idbasin[elem] == 2:
-        md.frontalforcings.thermalforcing[md.mesh.elements[elem, 0:3] - 1] = 1.5  # NOTE: offset because of 1-based vertex indexing
+        md.frontalforcings.thermalforcing[md.mesh.elements[elem, 0:3] - 1] = 1.5  #NOTE: offset because of 1-based vertex indexing
 
 md.transient.ismovingfront = 1
@@ -51,14 +50,11 @@
 
 # Fields and tolerances to track changes
-field_names = [
-    'Vx1', 'Vy1', 'Vel1', 'Pressure1', 'Bed1', 'Surface1', 'Thickness1', 'MaskIceLevelset1', 'CalvingMetlingRate1',
-    'Vx2', 'Vy2', 'Vel2', 'Pressure2', 'Bed2', 'Surface2', 'Thickness2', 'MaskIceLevelset2', 'CalvingMetlingRate2',
-    'Vx10', 'Vy10', 'Vel10', 'Pressure10', 'Bed10', 'Surface10', 'Thickness10', 'MaskIceLevelset10', 'CalvingMetlingRate10'
-]
+field_names = ['Vx1', 'Vy1', 'Vel1', 'Pressure1', 'Bed1', 'Surface1', 'Thickness1', 'MaskIceLevelset1', 'CalvingMetlingRate1',
+               'Vx2', 'Vy2', 'Vel2', 'Pressure2', 'Bed2', 'Surface2', 'Thickness2', 'MaskIceLevelset2', 'CalvingMetlingRate2',
+               'Vx10', 'Vy10', 'Vel10', 'Pressure10', 'Bed10', 'Surface10', 'Thickness10', 'MaskIceLevelset10', 'CalvingMetlingRate10']
 field_tolerances = [
     1e-11, 2e-11, 2e-11, 1e-12, 2e-11, 6e-12, 9e-12, 1e-12, 1e-9,
     2e-11, 1e-11, 1e-11, 9e-12, 2e-1, 2e-11, 2e-11, 1e-11, 1e-9,
-    2e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-9, 1e-9
-]
+    2e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-9, 1e-9]
 field_values = [
     md.results.TransientSolution[0].Vx,
Index: /issm/trunk/test/NightlyRun/test543.py
===================================================================
--- /issm/trunk/test/NightlyRun/test543.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test543.py	(revision 27035)
@@ -1,13 +1,12 @@
 #Test Name: PigTranStochasticforcing
 import numpy as np
-
-from frontalforcingsrignotautoregression import *
+from frontalforcingsrignotautoregression import frontalforcingsrignotautoregression
 from socket import gethostname
 from model import *
-from parameterize import *
-from setflowequation import *
-from setmask import *
-from solve import *
-from triangle import *
+from parameterize import parameterize
+from setflowequation import setflowequation
+from setmask import setmask
+from solve import solve
+from triangle import triangle
 
 
@@ -41,11 +40,11 @@
             idb_df[ii] = 2
 #Dimensionalities
-nb_tf    = 2
-nb_clv   = 2
+nb_tf = 2
+nb_clv  = 2
 nb_flmlt = 2
 
 # Calving parameters
 md.mask.ice_levelset = 1e4 * (md.mask.ice_levelset + 0.5)
-md.calving.calvingrate = 0.3*np.ones((md.mesh.numberofvertices,))
+md.calving.calvingrate = 0.3 * np.ones((md.mesh.numberofvertices,))
 md.levelset.spclevelset = np.full((md.mesh.numberofvertices,), np.nan)
 md.levelset.migration_max = 10.0
@@ -53,5 +52,5 @@
 md.frontalforcings = frontalforcingsrignotautoregression()
 md.frontalforcings.num_basins = nb_tf
-md.frontalforcings.basin_id = idb_tf - 1  # NOTE: offset because of 1-based vertex indexing
+md.frontalforcings.basin_id = idb_tf
 md.frontalforcings.subglacial_discharge = 0.1 * np.ones((md.mesh.numberofvertices,))
 md.frontalforcings.beta0 = np.array([[0.05, 0.01]])  # intercept values of TF in basins [C]
@@ -62,11 +61,11 @@
 md.frontalforcings.phi = np.array([[0.1, -0.1, 0.01, -0.01], [0.2, -0.2, 0.1, 0.0]])  # autoregressive parameters
 #Floating Ice Melt parameters
-md.basalforcings.floatingice_melting_rate = 0.1*np.ones((md.mesh.numberofvertices,))
+md.basalforcings.floatingice_melting_rate = 0.1 * np.ones((md.mesh.numberofvertices,))
 
 #Covariance matrix
-covtf            = 1e-4*np.identity(nb_tf)
-covclv           = 1e-1*np.identity(nb_clv)
-covclv[0,0]      = 1/10*covclv[0,0]
-covflmlt         = 0.05*np.identity(nb_flmlt)
+covtf = 1e-4 * np.identity(nb_tf)
+covclv = 1e-1 * np.identity(nb_clv)
+covclv[0, 0] = 1 / 10 * covclv[0, 0]
+covflmlt = 0.05 * np.identity(nb_flmlt)
 #covglob          = np.zeros([6,6])
 #covglob[0:2,0:2] = covtf
@@ -75,5 +74,10 @@
 
 #Hard-coding covariance matrix because python is complaining
-covglob = np.array([[1e-4,0.,0.,0.,0.,0.],[0.,1e-4,0.,0.,0.,0.],[0.,0.,1e-2,0.,0.,0.],[0.,0.,0.,1e-1,0.,0.],[0.,0.,0.,0.,0.05,0.],[0.,0.,0.,0.,0.,0.05]])
+covglob = np.array([[1e-4, 0., 0., 0., 0., 0.],
+                    [0., 1e-4, 0., 0., 0., 0.],
+                    [0., 0., 1e-2, 0., 0., 0.],
+                    [0., 0., 0., 1e-1, 0., 0.],
+                    [0., 0., 0., 0., 0.05, 0.],
+                    [0., 0., 0., 0., 0., 0.05]])
 #testchol = np.linalg.cholesky(covglob)
 #print(testchol)
@@ -81,14 +85,14 @@
 # Stochastic forcing
 md.stochasticforcing.isstochasticforcing = 1
-md.stochasticforcing.fields = ['FrontalForcingsRignotAutoregression','DefaultCalving','FloatingMeltRate']
+md.stochasticforcing.fields = ['FrontalForcingsRignotAutoregression', 'DefaultCalving', 'FloatingMeltRate']
 md.stochasticforcing.defaultdimension = 2
-md.stochasticforcing.default_id       = idb_df-1 #NOTE: offset because of 1-based vertex indexing
-md.stochasticforcing.covariance       = covglob # global covariance among- and between-fields
-md.stochasticforcing.randomflag       = 0 # determines true/false randomness
+md.stochasticforcing.default_id = idb_df
+md.stochasticforcing.covariance = covglob  # global covariance among- and between-fields
+md.stochasticforcing.randomflag = 0  # determines true/false randomness
 
-md.transient.ismovingfront   = 1
+md.transient.ismovingfront = 1
 md.transient.isgroundingline = 1
 
-md.transient.requested_outputs = ['default', 'CalvingCalvingrate','CalvingMeltingrate','BasalforcingsFloatingiceMeltingRate']
+md.transient.requested_outputs = ['default', 'CalvingCalvingrate', 'CalvingMeltingrate', 'BasalforcingsFloatingiceMeltingRate']
 md.cluster = generic('name', gethostname(), 'np', 2)
 md = solve(md, 'Transient')
@@ -96,14 +100,12 @@
 # Fields and tolerances to track changes
 field_names = [
-    'Vx1' ,'Vy1' ,'Vel1' ,'Thickness1' ,'MaskIceLevelset1' ,'CalvingCalvingrate1' ,'CalvingMeltingrate1' ,'BasalforcingsFloatingiceMeltingRate1',
-    'Vx2' ,'Vy2' ,'Vel2' ,'Thickness2' ,'MaskIceLevelset2' ,'CalvingCalvingrate1' ,'CalvingMeltingrate2' ,'BasalforcingsFloatingiceMeltingRate2',
-    'Vx10','Vy10','Vel10','Thickness10','MaskIceLevelset10','CalvingCalvingrate10','CalvingMeltingrate10','BasalforcingsFloatingiceMeltingRate10'
-]
+    'Vx1', 'Vy1', 'Vel1', 'Thickness1', 'MaskIceLevelset1', 'CalvingCalvingrate1', 'CalvingMeltingrate1', 'BasalforcingsFloatingiceMeltingRate1',
+    'Vx2', 'Vy2', 'Vel2', 'Thickness2', 'MaskIceLevelset2', 'CalvingCalvingrate1', 'CalvingMeltingrate2', 'BasalforcingsFloatingiceMeltingRate2',
+    'Vx10', 'Vy10', 'Vel10', 'Thickness10', 'MaskIceLevelset10', 'CalvingCalvingrate10', 'CalvingMeltingrate10', 'BasalforcingsFloatingiceMeltingRate10']
 
 field_tolerances = [
-    1e-11,2e-11,2e-11,1e-11,1e-9,1e-10,1e-10,1e-10,
-    2e-11,1e-11,1e-11,9e-11,2e-9,1e-10,1e-10,1e-10,
-    2e-10,1e-10,1e-10,1e-10,5e-9,1e-10,1e-10,1e-10
-]
+    1e-11, 2e-11, 2e-11, 1e-11, 1e-9, 1e-10, 1e-10, 1e-10,
+    2e-11, 1e-11, 1e-11, 9e-11, 2e-9, 1e-10, 1e-10, 1e-10,
+    2e-10, 1e-10, 1e-10, 1e-10, 5e-9, 1e-10, 1e-10, 1e-10]
 field_values = [
     md.results.TransientSolution[0].Vx,
@@ -130,4 +132,3 @@
     md.results.TransientSolution[9].CalvingCalvingrate,
     md.results.TransientSolution[9].CalvingMeltingrate,
-    md.results.TransientSolution[9].BasalforcingsFloatingiceMeltingRate
-]
+    md.results.TransientSolution[9].BasalforcingsFloatingiceMeltingRate]
Index: /issm/trunk/test/NightlyRun/test544.m
===================================================================
--- /issm/trunk/test/NightlyRun/test544.m	(revision 27035)
+++ /issm/trunk/test/NightlyRun/test544.m	(revision 27035)
@@ -0,0 +1,117 @@
+%Test Name: PigTranAutoregressionAndStochasticforcings 
+md=triangle(model(),'../Exp/Pig.exp',8000.);
+md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+md=parameterize(md,'../Par/Pig.par');
+md=setflowequation(md,'SSA','all');
+md.timestepping.start_time = 0;
+md.timestepping.time_step  = 1;
+md.timestepping.final_time = 10;
+
+%Basin separation
+idb     = zeros(md.mesh.numberofelements,1);
+iid1    = find(md.mesh.x>=-1.6e6);
+for ii=1:md.mesh.numberofelements
+    for vertex=1:3
+        if any(iid1==md.mesh.elements(ii,vertex)) %one vertex in basin 1
+            idb(ii) = 1;
+        end
+    end
+    if idb(ii)==0 %no vertex was found in basin 1
+        idb(ii) = 2;
+    end
+end
+nb_bas = 2;
+
+%SMB
+md.smb                = SMBautoregression();
+md.smb.num_basins     = nb_bas; %number of basins
+md.smb.basin_id       = idb; %prescribe basin ID number to elements
+md.smb.beta0          = [0.5,1.2]; %intercept values of SMB in basins [m ice eq./yr]
+md.smb.beta1          = [0.0,0.01]; %trend values of SMB in basins [m ice eq./yr^2]
+md.smb.ar_initialtime = md.timestepping.start_time;
+md.smb.ar_order       = 4;
+md.smb.ar_timestep    = 2.0; %timestep of the autoregressive model [yr]
+md.smb.phi            = [[0.2,0.1,0.05,0.01];[0.4,0.2,-0.2,0.1]];
+
+%Calving
+md.mask.ice_levelset           = 1e4*(md.mask.ice_levelset + 0.5);
+md.calving.calvingrate         = 0.1*ones(md.mesh.numberofvertices,1);
+md.levelset.spclevelset        = NaN(md.mesh.numberofvertices,1);
+md.levelset.migration_max      = 10.0;
+md.frontalforcings.meltingrate = zeros(md.mesh.numberofvertices,1);
+
+% Basal forcing implementation
+md.basalforcings = autoregressionlinearbasalforcings();
+md.basalforcings.num_basins     = nb_bas; %number of basins
+md.basalforcings.basin_id       = idb; %prescribe basin ID number to elements
+md.basalforcings.beta0          = [1.0,2.50]; %intercept values of DeepwaterMelt in basins [m/yr]
+md.basalforcings.beta1          = [0.2,0.01]; %trend values of DeepwaterMelt in basins [m/yr^2]
+md.basalforcings.ar_initialtime = md.timestepping.start_time;
+md.basalforcings.ar_order       = 1;
+md.basalforcings.ar_timestep    = 1.0; %timestep of the autoregressive model [yr]
+md.basalforcings.phi            = [0.0;0.1];
+md.basalforcings.deepwater_elevation       = [-1000,-1520];
+md.basalforcings.upperwater_elevation      = [0,-50];
+md.basalforcings.upperwater_melting_rate   = [0.0,0.0];
+md.basalforcings.groundedice_melting_rate  = zeros(md.mesh.numberofvertices,1);
+
+% Covariance matrix
+covsmb      = 3*eye(nb_bas);
+covclv      = 1e-1*eye(nb_bas);
+covclv(1,1) = 1/10*covclv(1,1);
+covdwm      = 400*eye(nb_bas);
+covglob     = blkdiag(covsmb,covclv,covdwm);
+
+% Stochastic forcing
+md.stochasticforcing.isstochasticforcing = 1;
+md.stochasticforcing.fields              = [{'SMBautoregression'},{'DefaultCalving'},{'BasalforcingsDeepwaterMeltingRateAutoregression'}];
+md.stochasticforcing.defaultdimension    = 2;
+md.stochasticforcing.default_id          = idb;
+md.stochasticforcing.covariance          = covglob; %global covariance among- and between-fields
+md.stochasticforcing.randomflag          = 0; %determines true/false randomness
+
+md.transient.ismovingfront     = 1;
+md.transient.requested_outputs = {'default','SmbMassBalance','BasalforcingsFloatingiceMeltingRate','BasalforcingsSpatialDeepwaterMeltingRate'};
+md.transient.isstressbalance = 1;
+md.transient.ismasstransport = 1;
+md.transient.issmb           = 1;
+md.transient.isthermal       = 0;
+md.transient.isgroundingline = 1;
+
+md.cluster=generic('name',oshostname(),'np',2);
+md=solve(md,'Transient');
+
+%Fields and tolerances to track changes
+field_names ={...
+   'Vx1' ,'Vy1' ,'Vel1' ,'Thickness1', 'SmbMassBalance1', 'BasalforcingsFloatingiceMeltingRate1', 'BasalforcingsSpatialDeepwaterMeltingRate1',...
+   'Vx2' ,'Vy2' ,'Vel2' ,'Thickness2', 'SmbMassBalance2' ,'BasalforcingsFloatingiceMeltingRate2', 'BasalforcingsSpatialDeepwaterMeltingRate2',...
+   'Vx3' ,'Vy3' ,'Vel3' ,'Thickness3', 'SmbMassBalance3' ,'BasalforcingsFloatingiceMeltingRate3', 'BasalforcingsSpatialDeepwaterMeltingRate3',...
+   };
+field_tolerances={...
+   1e-11,1e-11,2e-11,1e-11,1e-10,1e-9,1e-10,...
+   1e-11,1e-11,2e-11,9e-11,1e-10,1e-9,1e-10,...
+   2e-10,2e-10,2e-10,1e-10,1e-10,1e-9,1e-10,...
+   };
+field_values={...
+   (md.results.TransientSolution(1).Vx),...
+   (md.results.TransientSolution(1).Vy),...
+   (md.results.TransientSolution(1).Vel),...
+   (md.results.TransientSolution(1).Thickness),...
+   (md.results.TransientSolution(1).SmbMassBalance),...
+   (md.results.TransientSolution(1).BasalforcingsFloatingiceMeltingRate),...
+   (md.results.TransientSolution(1).BasalforcingsSpatialDeepwaterMeltingRate),...
+   (md.results.TransientSolution(5).Vx),...
+   (md.results.TransientSolution(5).Vy),...
+   (md.results.TransientSolution(5).Vel),...
+   (md.results.TransientSolution(5).Thickness),...
+   (md.results.TransientSolution(5).SmbMassBalance),...
+   (md.results.TransientSolution(5).BasalforcingsFloatingiceMeltingRate),...
+   (md.results.TransientSolution(5).BasalforcingsSpatialDeepwaterMeltingRate),...
+	(md.results.TransientSolution(10).Vx),...
+	(md.results.TransientSolution(10).Vy),...
+	(md.results.TransientSolution(10).Vel),...
+	(md.results.TransientSolution(10).Thickness),...
+   (md.results.TransientSolution(10).SmbMassBalance),...
+	(md.results.TransientSolution(10).BasalforcingsFloatingiceMeltingRate),...
+   (md.results.TransientSolution(10).BasalforcingsSpatialDeepwaterMeltingRate),...
+	};
Index: /issm/trunk/test/NightlyRun/test544.py
===================================================================
--- /issm/trunk/test/NightlyRun/test544.py	(revision 27035)
+++ /issm/trunk/test/NightlyRun/test544.py	(revision 27035)
@@ -0,0 +1,126 @@
+#Test Name: PigTranAutoregressionAndStochasticforcings
+import numpy as np
+from autoregressionlinearbasalforcings import autoregressionlinearbasalforcings
+from SMBautoregression import SMBautoregression
+from stochasticforcing import stochasticforcing
+from socket import gethostname
+from model import *
+from parameterize import parameterize
+from setflowequation import setflowequation
+from setmask import setmask
+from solve import solve
+from triangle import triangle
+
+
+md = triangle(model(), '../Exp/Pig.exp', 8000)
+md = setmask(md, '../Exp/PigShelves.exp', '../Exp/PigIslands.exp')
+md = parameterize(md, '../Par/Pig.py')
+md = setflowequation(md, 'SSA', 'all')
+md.timestepping.start_time = 0
+md.timestepping.time_step = 1
+md.timestepping.final_time = 10
+
+# Basin separation
+idb = np.zeros((md.mesh.numberofelements,))
+iid1 = np.where(md.mesh.x >= -1.6e6)[0]
+for ii in range(md.mesh.numberofelements):
+    for vertex in range(3):
+        if md.mesh.elements[ii][vertex] - 1 in iid1:  # one vertex in basin 1; NOTE: offset because of 1-based vertex indexing
+            idb[ii] = 1
+    if idb[ii] == 0:  # no vertex was found in basin 1
+        for vertex in range(3):
+            idb[ii] = 2
+nb_bas = 2
+
+#SMB
+md.smb = SMBautoregression()
+md.smb.num_basins = nb_bas  # number of basins
+md.smb.basin_id = idb  # prescribe basin ID number to elements;
+md.smb.beta0 = np.array([[0.5, 1.2]])  # intercept values of SMB in basins [m ice eq./yr]
+md.smb.beta1 = np.array([[0.0, 0.01]])  # trend values of SMB in basins [m ice eq./yr^2]
+md.smb.ar_initialtime = md.timestepping.start_time
+md.smb.ar_order = 4
+md.smb.ar_timestep = 2.0  #timestep of the autoregressive model [yr]
+md.smb.phi = np.array([[0.2, 0.1, 0.05, 0.01], [0.4, 0.2, -0.2, 0.1]])
+
+#Calving
+md.mask.ice_levelset = 1e4*(md.mask.ice_levelset + 0.5)
+md.calving.calvingrate = 0.1*np.ones((md.mesh.numberofvertices,))
+md.levelset.spclevelset = np.full((md.mesh.numberofvertices,), np.nan)
+md.levelset.migration_max = 10.0
+md.frontalforcings.meltingrate = np.zeros((md.mesh.numberofvertices,))
+
+#Basal forcing implementation
+md.basalforcings = autoregressionlinearbasalforcings()
+md.basalforcings.num_basins = nb_bas
+md.basalforcings.basin_id  = idb
+md.basalforcings.beta0 = np.array([[1.0, 2.50]])  # intercept values of DeepwaterMelt in basins [m/yr]
+md.basalforcings.beta1  = np.array([[0.2, 0.01]])  # trend values of DeepwaterMelt in basins [m/yr^2]
+md.basalforcings.ar_initialtime = md.timestepping.start_time  # initial time in the AR model parameterization [yr]
+md.basalforcings.ar_order  = 1
+md.basalforcings.ar_timestep  = 1.0  # timestep of the autoregressive model [yr]
+md.basalforcings.phi  = np.array([[0.0], [0.1]])  # autoregressive parameters
+md.basalforcings.deepwater_elevation = np.array([[-1000, -1520]])
+md.basalforcings.upperwater_elevation = np.array([[0, -50]])
+md.basalforcings.upperwater_melting_rate = np.array([[0,0]])
+md.basalforcings.groundedice_melting_rate = np.zeros((md.mesh.numberofvertices,))
+
+#Covariance matrix (hard-coding)
+covglob = np.array([[3.0, 0., 0., 0., 0., 0.],
+                    [0., 3.0, 0., 0., 0., 0.],
+                    [0., 0., 0.01, 0., 0., 0.],
+                    [0., 0., 0., 0.1, 0., 0.],
+                    [0., 0., 0., 0., 400, 0.],
+                    [0., 0., 0., 0., 0., 400]])
+
+#Stochastic forcing
+md.stochasticforcing.isstochasticforcing = 1
+md.stochasticforcing.fields = ['SMBautoregression', 'DefaultCalving', 'BasalforcingsDeepwaterMeltingRateAutoregression']
+md.stochasticforcing.defaultdimension = 2
+md.stochasticforcing.default_id = idb
+md.stochasticforcing.covariance = covglob  # global covariance among- and between-fields
+md.stochasticforcing.randomflag = 0  # determines true/false randomness
+
+md.transient.ismovingfront = 1
+md.transient.requested_outputs = ['default', 'SmbMassBalance', 'BasalforcingsFloatingiceMeltingRate', 'BasalforcingsSpatialDeepwaterMeltingRate']
+md.transient.isstressbalance = 1
+md.transient.ismasstransport = 1
+md.transient.issmb = 1
+md.transient.isthermal = 0
+md.transient.isgroundingline = 1
+
+md.cluster = generic('name', gethostname(), 'np', 2)
+md = solve(md, 'Transient')
+
+# Fields and tolerances to track changes
+field_names = [
+    'Vx1', 'Vy1', 'Vel1', 'Thickness1', 'SmbMassBalance1', 'BasalforcingsFloatingiceMeltingRate1', 'BasalforcingsSpatialDeepwaterMeltingRate1',
+    'Vx5', 'Vy5', 'Vel5', 'Thickness5', 'SmbMassBalance5', 'BasalforcingsFloatingiceMeltingRate5', 'BasalforcingsSpatialDeepwaterMeltingRate5',
+    'Vx10', 'Vy10', 'Vel10', 'Thickness10', 'SmbMassBalance10', 'BasalforcingsFloatingiceMeltingRate10', 'BasalforcingsSpatialDeepwaterMeltingRate10']
+
+field_tolerances = [
+    1e-11, 1e-11, 2e-11, 1e-11, 1e10, 1e-9, 1e-10,
+    1e-11, 1e-11, 2e-11, 9e-11, 1e10, 1e-9, 1e-10,
+    2e-10, 2e-10, 2e-10, 1e-10, 1e10, 1e-9, 1e-10]
+field_values = [
+    md.results.TransientSolution[0].Vx,
+    md.results.TransientSolution[0].Vy,
+    md.results.TransientSolution[0].Vel,
+    md.results.TransientSolution[0].Thickness,
+    md.results.TransientSolution[0].SmbMassBalance,
+    md.results.TransientSolution[0].BasalforcingsFloatingiceMeltingRate,
+    md.results.TransientSolution[0].BasalforcingsSpatialDeepwaterMeltingRate,
+    md.results.TransientSolution[4].Vx,
+    md.results.TransientSolution[4].Vy,
+    md.results.TransientSolution[4].Vel,
+    md.results.TransientSolution[4].Thickness,
+    md.results.TransientSolution[4].SmbMassBalance,
+    md.results.TransientSolution[4].BasalforcingsFloatingiceMeltingRate,
+    md.results.TransientSolution[4].BasalforcingsSpatialDeepwaterMeltingRate,
+    md.results.TransientSolution[9].Vx,
+    md.results.TransientSolution[9].Vy,
+    md.results.TransientSolution[9].Vel,
+    md.results.TransientSolution[9].Thickness,
+    md.results.TransientSolution[9].SmbMassBalance,
+    md.results.TransientSolution[9].BasalforcingsFloatingiceMeltingRate,
+    md.results.TransientSolution[9].BasalforcingsSpatialDeepwaterMeltingRate]
Index: /issm/trunk/test/NightlyRun/test612.py
===================================================================
--- /issm/trunk/test/NightlyRun/test612.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test612.py	(revision 27035)
@@ -2,5 +2,6 @@
 import numpy as np
 from model import *
-from setmask import *
+from setmask import setmask
+from setflowequation import setflowequation
 from triangle import triangle
 from parameterize import parameterize
Index: /issm/trunk/test/NightlyRun/test621.py
===================================================================
--- /issm/trunk/test/NightlyRun/test621.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test621.py	(revision 27035)
@@ -12,17 +12,17 @@
 
 md = triangle(model(), '../Exp/79North.exp', 6000)
-md = setmask(md, '../Exp/79NorthShelf.exp','')
+md = setmask(md, '../Exp/79NorthShelf.exp', '')
 md = parameterize(md, '../Par/79North.py')
 md = setflowequation(md, 'SSA', 'all')
 
 #Default friction
-md.friction         = friction()
-md.friction.coefficient = 30*np.ones(md.mesh.numberofvertices)
-md.friction.p           = 1*np.ones((md.mesh.numberofelements))
-md.friction.q           = 1*np.ones((md.mesh.numberofelements))
+md.friction = friction()
+md.friction.coefficient = 30 * np.ones(md.mesh.numberofvertices)
+md.friction.p = np.ones((md.mesh.numberofelements))
+md.friction.q = np.ones((md.mesh.numberofelements))
 
 # Basin separation default
-idb_df = np.zeros((md.mesh.numberofelements,))
-iid1 = np.where(md.mesh.y<=-1.08e6)[0]
+idb_df = np.zeros((md.mesh.numberofelements))
+iid1 = np.where(md.mesh.y <= -1.08e6)[0]
 for ii in range(md.mesh.numberofelements):
     for vertex in range(3):
@@ -33,59 +33,49 @@
             idb_df[ii] = 2
 #Covariance matrix
-covPw = np.array([[0.75e10,0.0],[0.0,0.5e10]])
+covPw = np.array([[0.75e10, 0.0], [0.0, 0.5e10]])
 
 # Stochastic forcing
 md.stochasticforcing.isstochasticforcing = 1
-md.stochasticforcing.fields              = ['FrictionWaterPressure']
-md.stochasticforcing.defaultdimension    = 2
-md.stochasticforcing.default_id          = idb_df-1 #NOTE: offset because of 1-based vertex indexing
-md.stochasticforcing.covariance          = covPw # global covariance
-md.stochasticforcing.randomflag          = 0 # determines true/false randomness
+md.stochasticforcing.fields = ['FrictionWaterPressure']
+md.stochasticforcing.defaultdimension = 2
+md.stochasticforcing.default_id = idb_df
+md.stochasticforcing.covariance = covPw  # global covariance
+md.stochasticforcing.randomflag = 0  # determines true/false randomness
 
-md.transient.issmb              = 0;
-md.transient.ismasstransport    = 1;
-md.transient.isstressbalance    = 1;
-md.transient.isthermal          = 0;
-md.transient.isgroundingline    = 0;
+md.transient.issmb = 0
+md.transient.ismasstransport = 1
+md.transient.isstressbalance = 1
+md.transient.isthermal = 0
+md.transient.isgroundingline = 0
 
 md.transient.requested_outputs = ['default', 'FrictionWaterPressure']
 md.timestepping.start_time = 0
-md.timestepping.time_step  = 1
+md.timestepping.time_step = 1
 md.timestepping.final_time = 5
-md.cluster = generic('name',gethostname(),'np',3)
+md.cluster = generic('name', gethostname(), 'np', 3)
 md = solve(md, 'Transient')
 
 # Fields and tolerances to track changes
-field_names = [
-    'Vx1','Vy1','Vel1','Thickness1','FrictionWaterPressure1',
-    'Vx2','Vy2','Vel2','Thickness2','FrictionWaterPressure2',
-    'Vx10','Vy10','Vel10','Thickness10','FrictionWaterPressure10'
-    ]
+field_names = ['Vx1', 'Vy1', 'Vel1', 'Thickness1', 'FrictionWaterPressure1',
+               'Vx2', 'Vy2', 'Vel2', 'Thickness2', 'FrictionWaterPressure2',
+               'Vx10', 'Vy10', 'Vel10', 'Thickness10', 'FrictionWaterPressure10']
 
-field_tolerances = [
-    2e-10,2e-10,2e-10,2e-10,2e-10,
-    4e-10,4e-10,4e-10,4e-10,4e-10,
-    8e-10,8e-10,8e-10,8e-10,8e-10
-    ]
+field_tolerances = [2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
+                    4e-10, 4e-10, 4e-10, 4e-10, 4e-10,
+                    8e-10, 8e-10, 8e-10, 8e-10, 8e-10]
 
-field_values = [
-    md.results.TransientSolution[0].Vx,
-    md.results.TransientSolution[0].Vy,
-    md.results.TransientSolution[0].Vel,
-    md.results.TransientSolution[0].Thickness,
-    md.results.TransientSolution[0].FrictionWaterPressure,
-    md.results.TransientSolution[1].Vx,
-    md.results.TransientSolution[1].Vy,
-    md.results.TransientSolution[1].Vel,
-    md.results.TransientSolution[1].Thickness,
-    md.results.TransientSolution[1].FrictionWaterPressure,
-    md.results.TransientSolution[4].Vx,
-    md.results.TransientSolution[4].Vy,
-    md.results.TransientSolution[4].Vel,
-    md.results.TransientSolution[4].Thickness,
-    md.results.TransientSolution[4].FrictionWaterPressure
-    ]
-    
-
-
-
+field_values = [md.results.TransientSolution[0].Vx,
+                md.results.TransientSolution[0].Vy,
+                md.results.TransientSolution[0].Vel,
+                md.results.TransientSolution[0].Thickness,
+                md.results.TransientSolution[0].FrictionWaterPressure,
+                md.results.TransientSolution[1].Vx,
+                md.results.TransientSolution[1].Vy,
+                md.results.TransientSolution[1].Vel,
+                md.results.TransientSolution[1].Thickness,
+                md.results.TransientSolution[1].FrictionWaterPressure,
+                md.results.TransientSolution[4].Vx,
+                md.results.TransientSolution[4].Vy,
+                md.results.TransientSolution[4].Vel,
+                md.results.TransientSolution[4].Thickness,
+                md.results.TransientSolution[4].FrictionWaterPressure]
Index: /issm/trunk/test/NightlyRun/test701.py
===================================================================
--- /issm/trunk/test/NightlyRun/test701.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test701.py	(revision 27035)
@@ -66,5 +66,5 @@
     md.flowequation.fe_FS = i
     md = solve(md, 'Stressbalance')
-    field_names = field_names + [['Vx' + i], ['Vy' + i], ['Vel' + i], ['Pressure' + i]]
+    field_names = field_names + ['Vx' + i, 'Vy' + i, 'Vel' + i, 'Pressure' + i]
     field_tolerances = field_tolerances + [9e-5, 9e-5, 9e-5, 1e-10]
     field_values = field_values + [md.results.StressbalanceSolution.Vx,
Index: /issm/trunk/test/NightlyRun/test810.m
===================================================================
--- /issm/trunk/test/NightlyRun/test810.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test810.m	(revision 27035)
@@ -1,7 +1,7 @@
-%Test Name: ValleyGlacierLevelsetMLHO2d
+%Test Name: ValleyGlacierLevelsetMOLHO2d
 md=triangle(model(),'../Exp/Square.exp',50000);
 md=setmask(md,'','');
 md=parameterize(md,'../Par/ValleyGlacierShelf.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.levelset.stabilization=2;
 md.cluster=generic('name',oshostname(),'np',3);
@@ -15,5 +15,5 @@
 md.transient.isgroundingline=1;
 
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Transient');
 
Index: /issm/trunk/test/NightlyRun/test810.py
===================================================================
--- /issm/trunk/test/NightlyRun/test810.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test810.py	(revision 27035)
@@ -1,10 +1,11 @@
-#Test Name: ValleyGlacierLevelsetMLHO2d
+#Test Name: ValleyGlacierLevelsetMOLHO2d
 from model import *
 from socket import gethostname
-from triangle import *
-from setmask import *
-from parameterize import *
-from setflowequation import *
-from solve import *
+from triangle import triangle
+from setmask import setmask
+from parameterize import parameterize
+from setflowequation import setflowequation
+from solve import solve
+from SetMOLHOBC import SetMOLHOBC
 
 md = triangle(model(), '../Exp/Square.exp', 50000)
@@ -12,5 +13,5 @@
 md = parameterize(md, '../Par/ValleyGlacierShelf.py')
 md.levelset.stabilization = 2
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.cluster = generic('name', gethostname(), 'np', 3)
 
@@ -22,5 +23,5 @@
 md.transient.isthermal = False
 md.transient.isgroundingline = True
-md = SetMLHOBC(md);
+md = SetMOLHOBC(md)
 
 md = solve(md, 'Transient')
Index: /issm/trunk/test/NightlyRun/test811.m
===================================================================
--- /issm/trunk/test/NightlyRun/test811.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test811.m	(revision 27035)
@@ -1,7 +1,7 @@
-%Test Name: ValleyGlacierLevelsetCalvingMLHO2d
+%Test Name: ValleyGlacierLevelsetCalvingMOLHO2d
 md=triangle(model(),'../Exp/Square.exp',50000);
 md=setmask(md,'','');
 md=parameterize(md,'../Par/ValleyGlacierShelf.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.cluster=generic('name',oshostname(),'np',3);
 
@@ -18,5 +18,5 @@
 md.levelset.migration_max = 1e10;
 
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Transient');
 
Index: /issm/trunk/test/NightlyRun/test811.py
===================================================================
--- /issm/trunk/test/NightlyRun/test811.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test811.py	(revision 27035)
@@ -1,3 +1,3 @@
-#Test Name: ValleyGlacierLevelsetCalvingMLHO2d
+#Test Name: ValleyGlacierLevelsetCalvingMOLHO2d
 import numpy as np
 from model import *
@@ -8,5 +8,5 @@
 from setflowequation import setflowequation
 from solve import solve
-from SetMLHOBC import SetMLHOBC
+from SetMOLHOBC import SetMOLHOBC
 from generic import generic
 
@@ -14,5 +14,5 @@
 md = setmask(md, '', '')
 md = parameterize(md, '../Par/ValleyGlacierShelf.py')
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.cluster = generic('name', gethostname(), 'np', 3)
 
@@ -29,5 +29,5 @@
 md.levelset.migration_max = 1e10
 
-md = SetMLHOBC(md)
+md = SetMOLHOBC(md)
 md = solve(md, 'Transient')
 
Index: /issm/trunk/test/NightlyRun/test812.m
===================================================================
--- /issm/trunk/test/NightlyRun/test812.m	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test812.m	(revision 27035)
@@ -1,7 +1,7 @@
-%Test Name: SquareShelfLevelsetCalvingMLHO2dLevermann
+%Test Name: SquareShelfLevelsetCalvingMOLHO2dLevermann
 md=triangle(model(),'../Exp/Square.exp',50000.);
 md=setmask(md,'all','');
 md=parameterize(md,'../Par/SquareShelf.par');
-md=setflowequation(md,'MLHO','all');
+md=setflowequation(md,'MOLHO','all');
 md.cluster=generic('name',oshostname(),'np',3);
 
@@ -35,5 +35,5 @@
 md.transient.requested_outputs={'default','StrainRateparallel','StrainRateperpendicular','Calvingratex','Calvingratey','CalvingCalvingrate'};
 
-md=SetMLHOBC(md);
+md=SetMOLHOBC(md);
 md=solve(md,'Transient');
 
Index: /issm/trunk/test/NightlyRun/test812.py
===================================================================
--- /issm/trunk/test/NightlyRun/test812.py	(revision 27034)
+++ /issm/trunk/test/NightlyRun/test812.py	(revision 27035)
@@ -1,3 +1,3 @@
-#Test Name: SquareShelfLevelsetCalvingMLHO2dLevermann
+#Test Name: SquareShelfLevelsetCalvingMOLHO2dLevermann
 import numpy as np
 from socket import gethostname
@@ -8,10 +8,10 @@
 from solve import solve
 from triangle import triangle
-from SetMLHOBC import SetMLHOBC
+from SetMOLHOBC import SetMOLHOBC
 
 md = triangle(model(), '../Exp/Square.exp', 50000.)
 md = setmask(md, 'all', '')
 md = parameterize(md, '../Par/SquareShelf.py')
-md = setflowequation(md, 'MLHO', 'all')
+md = setflowequation(md, 'MOLHO', 'all')
 md.cluster = generic('name', gethostname(), 'np', 3)
 
@@ -45,5 +45,5 @@
 md.transient.requested_outputs = ['default', 'StrainRateparallel', 'StrainRateperpendicular', 'Calvingratex', 'Calvingratey', 'CalvingCalvingrate']
 
-md = SetMLHOBC(md);
+md = SetMOLHOBC(md);
 md = solve(md, 'Transient')
 
Index: /issm/trunk/test/NightlyRun/test813.m
===================================================================
--- /issm/trunk/test/NightlyRun/test813.m	(revision 27035)
+++ /issm/trunk/test/NightlyRun/test813.m	(revision 27035)
@@ -0,0 +1,59 @@
+%Test Name: SquareShelfLevelsetKillberg
+md=triangle(model(),'../Exp/Square.exp',50000.);
+md=setmask(md,'all','');
+md=parameterize(md,'../Par/SquareSheetShelf.par');
+md=setflowequation(md,'SSA','all');
+md.cluster=generic('name',oshostname(),'np',3);
+
+x = md.mesh.x;
+xmin = min(x);
+xmax = max(x);
+Lx = (xmax-xmin);
+alpha = 2./3.;
+md.mask.ice_levelset = ((x - alpha*Lx)>0) - ((x - alpha*Lx)<0);
+
+% a very special border case that fails the previous version of killberg 20220427
+icebergid = 59;
+ids = [141,144,139, 58, 263];
+md.mask.ice_levelset(ids) = 1;
+md.mask.ocean_levelset = -md.mask.ice_levelset;
+md.mask.ocean_levelset(142) = 1;
+md.mask.ocean_levelset(141) = 1;
+md.mask.ocean_levelset(143) = 1;
+md.mask.ocean_levelset(144) = 1;
+md.mask.ocean_levelset(139) = 1;
+md.mask.ice_levelset(icebergid) = -1;
+
+md.levelset.kill_icebergs=1;
+
+md.timestepping.time_step=10;
+md.timestepping.final_time=30;
+
+%Transient
+md.transient.isstressbalance=0;
+md.transient.ismasstransport=1;
+md.transient.issmb=1;
+md.transient.isthermal=0;
+md.transient.isgroundingline=0;
+md.transient.ismovingfront=1;
+
+md.calving.calvingrate=zeros(md.mesh.numberofvertices,1);
+md.frontalforcings.meltingrate=10000*ones(md.mesh.numberofvertices,1);
+md.levelset.spclevelset=md.mask.ice_levelset;
+
+md=solve(md,'Transient');
+
+%Fields and tolerances to track changes
+field_names     ={'MaskIceLevelsetwithIceberg','MaskIceLevelset1',...
+	'MaskIceLevelset2',...
+	'MaskIceLevelset3'};
+field_tolerances={1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,...
+	2e-11,2e-11,2e-11,1e-11,1e-11,1e-11,5e-11,...
+	2e-11,2e-11,2e-11,1e-11,1e-11,1e-11,5e-11};
+field_values={...
+	md.mask.ice_levelset,...
+	md.results.TransientSolution(1).MaskIceLevelset,...
+	md.results.TransientSolution(2).MaskIceLevelset,...
+	md.results.TransientSolution(3).MaskIceLevelset,...
+	};
+
Index: /issm/trunk/test/Par/GiaIvinsBenchmarksAB.par
===================================================================
--- /issm/trunk/test/Par/GiaIvinsBenchmarksAB.par	(revision 27034)
+++ /issm/trunk/test/Par/GiaIvinsBenchmarksAB.par	(revision 27035)
@@ -14,15 +14,16 @@
 md.geometry.surface=md.geometry.thickness+md.geometry.base; 
 
+
+%GIA parameters specific to Experiments A  and B
+
+md.materials=materials('litho','ice');
+md.materials.numlayers=2;
+md.materials.radius =  [10 6271e3 6371e3]; %100km litosphere, the rest is mantle material
+md.materials.density=  [3.38e3 3.36e3];
+md.materials.lame_mu=  [1.45e11         6.7e10];
+md.materials.viscosity=[1e21            1e40];
+
 %Ice density used for benchmarking, not 917 kg/m^3
 md.materials.rho_ice=1000; %kg m^3
-
-%GIA parameters specific to Experiments A  and B
-md.gia=giaivins();
-md.gia.mantle_viscosity=10^21*ones(md.mesh.numberofvertices,1);    %in Pa.s
-md.gia.lithosphere_thickness=100*ones(md.mesh.numberofvertices,1); %in km
-md.materials.lithosphere_shear_modulus=6.7*10^10;                  %in Pa
-md.materials.lithosphere_density=3.36;                             %in g/cm^3
-md.materials.mantle_shear_modulus=1.45*10^11;                      %in Pa
-md.materials.mantle_density=3.38;                                  %in g/cm^3
 
 
Index: /issm/trunk/test/Par/GiaIvinsBenchmarksAB.py
===================================================================
--- /issm/trunk/test/Par/GiaIvinsBenchmarksAB.py	(revision 27034)
+++ /issm/trunk/test/Par/GiaIvinsBenchmarksAB.py	(revision 27035)
@@ -6,9 +6,9 @@
 
 from arch import *
-from giaivins import giaivins
 from InterpFromMeshToMesh2d import *
+from materials import *
 from paterson import *
+from SetIceSheetBC import *
 from verbose import *
-from SetIceSheetBC import *
 
 
@@ -28,17 +28,15 @@
 md.geometry.surface = md.geometry.thickness + md.geometry.base.reshape(-1, 1)  #would otherwise create a 91x91 matrix
 
-#Ice density used for benchmarking, not 917 kg/m^3
-md.materials.rho_ice = 1000  #kg/m^3
+# GIA parameters specific to Experiments A and B
+md.materials = materials('litho', 'ice')
+md.materials.radius = [10, 6271e3, 6371e3] # 100km lithosphere, the rest is mantle material
+md.materials.density = [3.38e3, 3.36e3]
+md.materials.lame_u = [1.45e11, 6.7e10]
+md.materials.viscosity = [1e21, 1e40]
 
-#GIA parameters specific to Experiments A and B
-md.gia=giaivins();
-md.gia.mantle_viscosity = 1e21 * np.ones((md.mesh.numberofvertices, 1))  #in Pa.s
-md.gia.lithosphere_thickness = 100 * np.ones((md.mesh.numberofvertices, 1))  #in km
-md.materials.lithosphere_shear_modulus = 6.7 * 1e10  #in Pa
-md.materials.lithosphere_density = 3.36  #in g/cm^3
-md.materials.mantle_shear_modulus = 1.45 * 1e11  #in Pa
-md.materials.mantle_density = 3.38  #in g/cm^3
+# Ice density used for benchmarking, not 917 kg/m^3
+md.materials.rho_ice = 1000 # kg/m^3
 
-#Initial velocity
+# Initial velocity
 x = archread('../Data/SquareSheetConstrained.arch', 'x')
 y = archread('../Data/SquareSheetConstrained.arch', 'y')
@@ -57,10 +55,10 @@
 md.initialization.pressure = np.zeros((md.mesh.numberofvertices, 1))
 
-#Materials
+# Materials
 md.initialization.temperature = (273. - 20.) * np.ones((md.mesh.numberofvertices, 1))
 md.materials.rheology_B = paterson(md.initialization.temperature)
 md.materials.rheology_n = 3. * np.ones((md.mesh.numberofelements, 1))
 
-#Friction
+# Friction
 md.friction.coefficient = 20. * np.ones((md.mesh.numberofvertices, 1))
 md.friction.coefficient[np.where(md.mask.ocean_levelset < 0.)] = 0.
@@ -68,5 +66,5 @@
 md.friction.q = np.ones((md.mesh.numberofelements, 1))
 
-#Numerical parameters
+# Numerical parameters
 md.groundingline.migration = 'None'
 md.masstransport.stabilization = 1
@@ -81,8 +79,8 @@
 md.timestepping.final_time = 3.
 
-#Boundary conditions:
+# Boundary conditions:
 md = SetIceSheetBC(md)
 
-#Change name so that no test have the same name
+# Change name so that no test have the same name
 if len(inspect.stack()) > 2:
     md.miscellaneous.name = os.path.basename(inspect.stack()[2][1]).split('.')[0]
