[r-cran-vgam] 13/63: Import Upstream version 0.7-8

Andreas Tille tille at debian.org
Tue Jan 24 13:54:22 UTC 2017


This is an automated email from the git hooks/post-receive script.

tille pushed a commit to branch master
in repository r-cran-vgam.

commit 9effe6eb4b224f15cae78619268a0d1724c14120
Author: Andreas Tille <tille at debian.org>
Date:   Tue Jan 24 14:16:47 2017 +0100

    Import Upstream version 0.7-8
---
 DESCRIPTION                      |    8 +-
 NAMESPACE                        |   48 +-
 NEWS                             |   59 +
 R/aamethods.q                    |   73 +-
 R/add1.vglm.q                    |    2 +-
 R/attrassign.R                   |    2 +-
 R/bAIC.q                         |  110 ++
 R/build.terms.vlm.q              |    2 +-
 R/calibrate.q                    |    2 +-
 R/cao.R                          |    2 +-
 R/cao.fit.q                      |    7 +-
 R/coef.vlm.q                     |   10 +-
 R/cqo.R                          |    2 +-
 R/cqo.fit.q                      |    2 +-
 R/deviance.vlm.q                 |    2 +-
 R/effects.vglm.q                 |    2 +-
 R/family.aunivariate.q           |  302 +++-
 R/family.basics.q                |    2 +-
 R/family.binomial.q              |  414 ++++--
 R/family.bivariate.q             |    2 +-
 R/family.categorical.q           |  120 +-
 R/family.censored.q              |    2 +-
 R/family.circular.q              |    2 +-
 R/family.extremes.q              |   35 +-
 R/family.fishing.q               |   80 ++
 R/family.functions.q             |    2 +-
 R/family.genetic.q               |    2 +-
 R/family.glmgam.q                |  137 +-
 R/family.loglin.q                |    4 +-
 R/family.mixture.q               |   22 +-
 R/family.nonlinear.q             |   41 +-
 R/family.normal.q                |  122 +-
 R/family.positive.q              |  274 +++-
 R/family.qreg.q                  |  485 +++----
 R/family.rcqo.q                  |    2 +-
 R/family.rrr.q                   |   33 +-
 R/family.survival.q              |    2 +-
 R/family.ts.q                    |    2 +-
 R/family.univariate.q            |  236 ++-
 R/family.vglm.q                  |    2 +-
 R/family.zeroinf.q               |  458 ++++--
 R/fitted.vlm.q                   |    6 +-
 R/generic.q                      |    2 +-
 R/links.q                        |    2 +-
 R/logLik.vlm.q                   |    7 +-
 R/model.matrix.vglm.q            |   71 +-
 R/mux.q                          |    5 +-
 R/plot.vglm.q                    |   94 +-
 R/predict.vgam.q                 |    4 +-
 R/predict.vglm.q                 |   11 +-
 R/predict.vlm.q                  |  126 +-
 R/print.summary.others.q         |    9 +-
 R/print.vglm.q                   |   18 +-
 R/print.vlm.q                    |    5 +-
 R/qrrvglm.control.q              |    2 +-
 R/qtplot.q                       |    4 +-
 R/residuals.vlm.q                |    2 +-
 R/rrvglm.R                       |    2 +-
 R/rrvglm.control.q               |    2 +-
 R/rrvglm.fit.q                   |    4 +-
 R/s.q                            |    2 +-
 R/s.vam.q                        |    2 +-
 R/smart.R                        |    2 +-
 R/step.vglm.q                    |    2 +-
 R/summary.others.q               |    2 +-
 R/summary.vgam.q                 |    7 +-
 R/summary.vglm.q                 |    6 +-
 R/summary.vlm.q                  |    2 +-
 R/uqo.R                          |    2 +-
 R/vgam.R                         |    2 +-
 R/vgam.control.q                 |    2 +-
 R/vgam.fit.q                     |    2 +-
 R/vgam.match.q                   |    2 +-
 R/vglm.R                         |  107 +-
 R/vglm.control.q                 |    2 +-
 R/vglm.fit.q                     |    5 +-
 R/vlm.R                          |    2 +-
 R/vlm.wfit.q                     |    4 +-
 R/vsmooth.spline.q               |   37 +-
 R/zzz.R                          |    2 +-
 data/ruge.R                      |    6 +-
 data/wffc.R                      | 2924 ++++++++++++++++++++++++++++++++++++++
 data/wffc.indiv.R                |   94 ++
 data/wffc.nc.R                   |  351 +++++
 data/wffc.teams.R                |   14 +
 man/AICvlm.Rd                    |  100 ++
 man/DeLury.Rd                    |  176 +++
 man/VGAM-package.Rd              |   19 +-
 man/alaplace3.Rd                 |    4 +-
 man/benfUC.Rd                    |  130 ++
 man/betabin.ab.Rd                |   24 +-
 man/betabinUC.Rd                 |   20 +-
 man/betabinomial.Rd              |   22 +-
 man/binom2.or.Rd                 |   12 +-
 man/binom2.rho.Rd                |   50 +-
 man/binom2.rhoUC.Rd              |  120 ++
 man/binomialff.Rd                |   10 +-
 man/bisa.Rd                      |    2 +-
 man/bminz.Rd                     |    5 +-
 man/brat.Rd                      |    2 +-
 man/calibrate.Rd                 |    2 +-
 man/cao.Rd                       |   10 +-
 man/chest.Rd                     |    2 +
 man/cqo.Rd                       |    4 +-
 man/cumulative.Rd                |   45 +-
 man/enzyme.Rd                    |   10 +-
 man/erf.Rd                       |    7 +-
 man/fitted.vlm.Rd                |    4 +-
 man/fnormUC.Rd                   |    2 +-
 man/fnormal1.Rd                  |    4 +-
 man/gev.Rd                       |    8 +-
 man/grc.Rd                       |    6 +-
 man/lirat.Rd                     |    6 +-
 man/lms.bcg.Rd                   |   28 +-
 man/lms.bcn.Rd                   |   27 +-
 man/lms.yjn.Rd                   |   29 +-
 man/logUC.Rd                     |   15 +-
 man/logff.Rd                     |    6 +-
 man/loglinb2.Rd                  |   19 +-
 man/lqnorm.Rd                    |    6 +-
 man/lvplot.rrvglm.Rd             |    4 +-
 man/micmen.Rd                    |   38 +-
 man/mix2exp.Rd                   |    2 +-
 man/mix2normal1.Rd               |   16 +-
 man/mix2poisson.Rd               |    3 +-
 man/model.matrixvlm.Rd           |    8 +-
 man/multinomial.Rd               |   59 +-
 man/negbinomial.Rd               |   77 +-
 man/normal1.Rd                   |    2 +-
 man/notdocumentedyet.Rd          |    5 +-
 man/nzc.Rd                       |   15 +-
 man/persp.qrrvglm.Rd             |   12 +-
 man/plotvgam.control.Rd          |   15 +-
 man/poissonff.Rd                 |   17 +-
 man/posbinomUC.Rd                |    7 +-
 man/posnegbinUC.Rd               |  118 ++
 man/posnegbinomial.Rd            |   31 +-
 man/posnormUC.Rd                 |   14 +-
 man/posnormal1.Rd                |   10 +-
 man/pospoisUC.Rd                 |    4 +-
 man/pospoisson.Rd                |    2 +-
 man/riceUC.Rd                    |    2 +-
 man/riceff.Rd                    |    4 +-
 man/rposnegbin.Rd                |   85 --
 man/rrvglm-class.Rd              |   12 +
 man/rrvglm.Rd                    |    6 +-
 man/rrvglm.control.Rd            |   44 +-
 man/ruge.Rd                      |    9 +-
 man/s.Rd                         |    9 +-
 man/skellam.Rd                   |   14 +-
 man/skellamUC.Rd                 |    3 +-
 man/tikuv.Rd                     |    3 +-
 man/trplot.qrrvglm.Rd            |    6 +-
 man/undocumented-methods.Rd      |    7 +
 man/uqo.Rd                       |    2 +-
 man/vgam-class.Rd                |   21 +-
 man/vgam.Rd                      |   17 +-
 man/vglm-class.Rd                |   12 +
 man/vglm.Rd                      |   15 +-
 man/vonmises.Rd                  |   12 +-
 man/vsmooth.spline.Rd            |    4 +-
 man/wffc.P2star.Rd               |   71 +
 man/wffc.Rd                      |  184 +++
 man/wffc.indiv.Rd                |   49 +
 man/wffc.nc.Rd                   |   52 +
 man/wffc.teams.Rd                |   44 +
 man/zanegbinUC.Rd                |   79 +
 man/zanegbinomial.Rd             |   32 +-
 man/zapoisUC.Rd                  |   77 +
 man/zapoisson.Rd                 |   14 +-
 man/zibinomUC.Rd                 |    2 +-
 man/{zinbUC.Rd => zinegbinUC.Rd} |   44 +-
 man/zinegbinomial.Rd             |   10 +-
 man/zipebcom.Rd                  |    9 +-
 man/zipfUC.Rd                    |    2 +-
 man/zipoisUC.Rd                  |   10 +-
 man/zipoisson.Rd                 |   10 +-
 src/fgam.f                       |   12 +-
 src/lerchphi.c                   |    5 +-
 src/lms.f                        |   36 +-
 src/rgam.f                       |  212 +--
 src/testf90.f90                  |   20 +
 src/tyeepolygamma.f              |   25 +
 src/vgam.f                       | 1080 +++++++-------
 184 files changed, 8482 insertions(+), 2354 deletions(-)

diff --git a/DESCRIPTION b/DESCRIPTION
index bb043a1..0f6845b 100755
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,10 +1,10 @@
 Package: VGAM
-Version: 0.7-7
-Date: 2008-05-14
+Version: 0.7-8
+Date: 2009-02-05
 Title: Vector Generalized Linear and Additive Models
 Author: Thomas W. Yee <t.yee at auckland.ac.nz>
 Maintainer: Thomas Yee <t.yee at auckland.ac.nz> 
-Depends: R (>= 2.4.0), splines, methods, stats, stats4
+Depends: R (>= 2.5.0), splines, methods, stats, stats4
 Description: Vector generalized linear and additive models, and
     associated models (Reduced-Rank VGLMs, Quadratic RR-VGLMs,
     Reduced-Rank VGAMs). This package fits many models and
@@ -15,4 +15,4 @@ License: GPL-2
 URL: http://www.stat.auckland.ac.nz/~yee/VGAM
 LazyLoad: yes
 LazyData: yes
-Packaged: Wed May 14 11:18:25 2008; yee
+Packaged: Thu Feb  5 13:51:42 2009; yee
diff --git a/NAMESPACE b/NAMESPACE
index d34113f..686ac9f 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -70,6 +70,7 @@ dinv.gaussian, pinv.gaussian, rinv.gaussian, wald, expexp1, expexp)
 
 
 export(A1A2A3, a2m, AAaa.nohw,
+AICvlm, AICvgam, AICrrvglm, 
 anova.vgam,
 anova.vglm, 
 beta4,
@@ -166,7 +167,7 @@ vglm.multinomial.deviance.control, vglm.vcategorical.control,
 vlm, vlm.control,
 vnonlinear.control,
 wweights, yeo.johnson,
-zipf, dzipf, pzipf,
+dzipf, pzipf, zipf,
 zeta, zetaff,
 dzeta)
 
@@ -175,11 +176,18 @@ export(lm2vlm.model.matrix)
 
 
 
- importFrom(stats, model.matrix)
- importFrom(stats, model.frame)
- importFrom(stats, terms)
+ importFrom("stats", model.matrix)
+ importFrom("stats", model.frame)
+ importFrom("stats", terms)
 
 
+  importFrom("stats", "coef")
+  importFrom("stats", "logLik")
+  importFrom("graphics", "plot")
+  importFrom("stats", "vcov")
+
+  importFrom("stats", "AIC")
+
 
 
 
@@ -199,7 +207,8 @@ export(dgpd, pgpd, qgpd, rgpd, gpd)
 export(dgev, pgev, qgev, rgev, gev, egev)
 export(dlaplace, plaplace, qlaplace, rlaplace, laplace)
 export(dalaplace, palaplace, qalaplace, ralaplace,
-        alaplace1, alaplace2, alaplace3)
+       alaplace1.control,
+       alaplace1, alaplace2, alaplace3)
 export(dcard, pcard, qcard, rcard, cardioid)
 export(fff, fff.control,
        mbesselI0,
@@ -213,8 +222,9 @@ dbetageom, pbetageom, rbetageom, betageometric,
 betaprime,
 betaII,
 zipebcom,
-binom2.or, dbinom2.or, rbinom2.or,
-binom2.rho, binomialff, biplot.rrvglm, brat,
+binom2.or,  dbinom2.or,  rbinom2.or,
+binom2.rho, dbinom2.rho, rbinom2.rho,
+binomialff, biplot.rrvglm, brat,
 bratt, Brat, calibrate.qrrvglm.control, calibrate.qrrvglm,
 calibrate, cao.control,
 cao, ccoef, cdf.lmscreg, cgo, chisq, clo, 
@@ -233,6 +243,7 @@ export(dggamma, pggamma, qggamma, rggamma)
 
 
 export(
+dbenf, pbenf, qbenf, rbenf,
 genbetaII, genpoisson, geometric,
 dlino, plino, qlino, rlino, lino, 
 grc, 
@@ -254,17 +265,15 @@ export(
 meplot, meplot.default, meplot.vlm,
 guplot, guplot.default, guplot.vlm,
 negbinomial, normal1, tobit, Opt, 
-dzinb, pzinb, qzinb, rzinb, zinegbinomial,
 persp.qrrvglm, plotdeplot.lmscreg, plotqrrvglm, plotqtplot.lmscreg,
 plotvgam.control, plotvgam, 
 cenpoisson,
 poissonff,
-dposnorm, pposnorm, qposnorm, rposnorm, posnormal1,
 dposbinom, pposbinom, qposbinom, rposbinom, posbinomial,
-posnegbinomial,
+dposnegbin, pposnegbin, qposnegbin, rposnegbin, posnegbinomial,
+dposnorm, pposnorm, qposnorm, rposnorm, posnormal1,
 dpospois, ppospois, qpospois, rpospois, pospoisson,
-qtplot.lmscreg, quasibinomialff, quasipoissonff, rdiric, 
-rig, rposnegbin,
+qtplot.lmscreg, quasibinomialff, quasipoissonff, rdiric, rig,
 rrar, rrvglm.control,
 rrvglm.optim.control)
 
@@ -278,17 +287,23 @@ qrrvglm.control,
 uqo.control, uqo,
 vgam.control, vgam, vglm.control, vglm,
 vsmooth.spline,
-weibull, yip88, zanegbinomial, zapoisson,
+weibull, yip88,
+dzanegbin, pzanegbin, qzanegbin, rzanegbin, zanegbinomial,
+dzapois, pzapois, qzapois, rzapois, zapoisson,
+dzibinom, pzibinom, qzibinom, rzibinom, zibinomial,
+dzinegbin, pzinegbin, qzinegbin, rzinegbin, zinegbinomial,
 dzipois, pzipois, qzipois, rzipois, zipoisson,
 mix2exp, mix2normal1, mix2poisson,
 mix2exp.control, mix2normal1.control, mix2poisson.control,
 skewnormal1, dsnorm, rsnorm,
-tikuv, dtikuv, ptikuv, qtikuv, rtikuv,
-dzibinom, pzibinom, qzibinom, rzibinom, zibinomial)
+tikuv, dtikuv, ptikuv, qtikuv, rtikuv)
 
 
 
 
+export(DeLury,
+       wffc.P1, wffc.P1star, wffc.P2, wffc.P2star
+)
 
 
 exportClasses("vglmff", "vlm", "vglm", "vgam",
@@ -316,6 +331,7 @@ exportMethods(
 "terms",
 "model.frame",
 "model.matrix",
+"AIC",
 "deviance", "logLik", "vcov",
 "calibrate", "cdf", "ccoef", "df.residual",
 "lv", "Max", "Opt", "Tol",
diff --git a/NEWS b/NEWS
index 4fc85e2..7e96c2d 100755
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,65 @@
 	**************************************************
 
 
+                CHANGES IN VGAM VERSION 0.7-8
+
+NEW FEATURES
+
+    o   [dpqr]benf() written for Benford's distribution.
+    o   plog() and dlog() improved.
+    o   multinomial() now has a refLevel argument to specify the
+        reference or baseline level of the factor.
+    o   binom2.or() has a new argument 'morerobust'.
+    o   Renamed arguments in mix2normal1().
+    o   DeLury() written.
+    o   [dpqr]-type functions related to the negative binomial distribution
+        have changed wrt argument names and order. 
+    o   [pq]posnegbin(), [dpqr]zapois(), [dr]zanegbin() written.
+    o   [dpqr]zinb() renamed to [dpqr]zinegbin().
+    o   lms.bcn(), lms.bcg(), lms.yjn() have zero=c(1,3) as the new default.
+        This will increase the chances of successive convergence.
+    o   Renamed arguments in lms.bcn(), lms.bcg(), lms.yjn(), e.g.,
+        link.sigma is now lsigma.
+        Some new arguments added too, e.g., llambda.
+    o   Works for R 2.5.0 and later (not 2.4.0 and later).
+        Compatible with R 2.7.2.
+    o   Contains Fortran 90 code (since 0.7-7, actually). This will
+        cause problems on older Linux machines without such a
+        compiler. Actually, removing the .f90 file(s) will not be too
+        much of a problem as there is very little F90 code in use by
+        the package at the moment.
+    o   New functions: dbinom2.rho(), rbinom2.rho(), dposnegbin(), 
+    o   New data: wffc, wffc.indiv, wffc.teams, wffc.nc.
+    o   Improved functions: binom2.rho(), micmen(), negbinomial(),
+        poissonff(), posnegbinomial(), zanegbinomial(),
+    o   A new form2 argument has been added to vglm().
+        VGAM family functions such as micmen() have the regressor inputted
+        using form2 now, rather than the regressor argument.
+        The resulting usage is a more elegant.
+        Fitted objects have a few more slots and formulas put in set
+        places on the object.
+    o	AIC() methods functions has been modified.
+
+
+BUG FIXES
+
+    o   The big bug whereby vgam(... ~ s(x), ... ) did not work under
+        Windows was due to a single array element that was not initialized.
+        Evidently, Linux compilers seemed to have set it to zero.
+        Funny, the code has worked for decade or so...
+    o   dposbinom() was buggy at x=0. Also it now handles size=0 and
+        prob=0 or prob=1.
+    o   pzipois() was buggy at x<0.
+    o   dbetabin.ab(log=T) was incorrect outside its support.
+    o   zipf() did not handle 0 < s < 1.
+    o   data(ruge) was faulty.
+    o   summary(rrvglmObject) failed.
+    o   persp.cao(ylim=) did not work.
+    o   plotvgam() failed when se=TRUE and which.cf was specified.
+
+
+
+
                 CHANGES IN VGAM VERSION 0.7-7
 
 NEW FEATURES
diff --git a/R/aamethods.q b/R/aamethods.q
index f735ecc..9f054e1 100644
--- a/R/aamethods.q
+++ b/R/aamethods.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -166,6 +166,7 @@ if(is.R())
 setClass("vlm", representation(
       "assign"       = "list",
       "call"         = "call",
+      "callXm2"      = "call",
       "coefficients" = if(is.R()) "numeric" else "named",
       "constraints"  = "list",
       "contrasts"    = "list",
@@ -192,6 +193,8 @@ setClass("vlm", representation(
       "terms"        = "list",
       "weights"      = "matrix",
       "x"            = if(is.R()) "matrix" else "model.matrix",
+      "Xm2"          = if(is.R()) "matrix" else "model.matrix",
+      "Ym2"          = if(is.R()) "matrix" else "model.matrix",
       "xlevels"      = "list",
       "y"            = "matrix")
 ) else 
@@ -318,6 +321,8 @@ prototype(anova=data.frame())) else
       "terms"        = "list",
       "weights"      = "matrix",
       "x"            = if(is.R()) "matrix" else "model.matrix",
+      "Xm2"          = if(is.R()) "matrix" else "model.matrix",
+      "Ym2"          = if(is.R()) "matrix" else "model.matrix",
       "xlevels"      = "list",
       "y"            = "matrix")
 )
@@ -392,60 +397,6 @@ setGeneric("Coefficients", function(object, ...)
 
 
 
-if(FALSE) {
-
-if(!isGeneric("AIC"))
-    setGeneric("AIC", function(object, ..., k=2) standardGeneric("AIC"),
-           package="VGAM")
-
-AIC.vlm = function(object, ..., k=2) {
-    ed = object at misc$estimated.dispersion
-    no.dpar = if(length(ed) && is.logical(ed) && ed)
-        length(object at misc$dispersion) else 0 
-    -2 * logLik(object, ...) + k * (length(coef(object)) + no.dpar)
-}
-
-AIC.vgam = function(object, ..., k=2) {
-    ed = object at misc$estimated.dispersion
-    no.dpar = if(length(ed) && is.logical(ed) && ed)
-        length(object at misc$dispersion) else 0 
-    nldf = if(is.Numeric(object at nl.df)) sum(object at nl.df) else 0
-    -2 * logLik(object, ...) + k * (length(coef(object)) + no.dpar + nldf)
-}
-
-AIC.rrvglm = function(object, ..., k=2) {
-    ed = object at misc$estimated.dispersion
-    no.dpar = if(length(ed) && is.logical(ed) && ed)
-        length(object at misc$dispersion) else 0 
-    elts.tildeA = (object at misc$M - object at control$Rank) * object at control$Rank
-    -2 * logLik(object, ...) + k * (length(coef(object)) + no.dpar + elts.tildeA)
-}
-
-AIC.qrrgvlm = function(object, ..., k=2) {
-    stop("this function not written yet")
-}
-
-setMethod("AIC", "vlm",
-         function(object, ..., k=2)
-         AIC.vlm(object, ..., k=k))
-
-setMethod("AIC", "vglm",
-         function(object, ..., k=2)
-         AIC.vlm(object, ..., k=k))
-
-setMethod("AIC", "vgam",
-         function(object, ..., k=2)
-         AIC.vgam(object, ..., k=k))
-
-setMethod("AIC", "rrvglm",
-         function(object, ..., k=2)
-         AIC.rrvglm(object, ..., k=k))
-
-setMethod("AIC", "qrrvglm",
-         function(object, ..., k=2)
-         AIC.qrrvglm(object, ..., k=k))
-}
-
 if(!isGeneric("logLik"))
     setGeneric("logLik", function(object, ...) standardGeneric("logLik"),
            package="VGAM")
@@ -562,5 +513,17 @@ if(!isGeneric("weights"))
 
 
 
+if(!isGeneric("AIC"))
+    setGeneric("AIC", function(object, ..., k=2) standardGeneric("AIC"),
+           package="VGAM")
+
+
+
+
+
+
+
+
+
 
 
diff --git a/R/add1.vglm.q b/R/add1.vglm.q
index 4162d6d..14ac247 100644
--- a/R/add1.vglm.q
+++ b/R/add1.vglm.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/attrassign.R b/R/attrassign.R
index d568440..d80e1c0 100644
--- a/R/attrassign.R
+++ b/R/attrassign.R
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/bAIC.q b/R/bAIC.q
new file mode 100644
index 0000000..152bbf2
--- /dev/null
+++ b/R/bAIC.q
@@ -0,0 +1,110 @@
+# These functions are
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
+
+
+
+
+
+
+
+
+if(TRUE) {
+
+
+AICvlm = function(object, ..., k=2) {
+    estdisp = object at misc$estimated.dispersion
+    no.dpar = if(length(estdisp) && is.logical(estdisp) && estdisp)
+        length(object at misc$dispersion) else 0
+    -2 * logLik.vlm(object, ...) + k * (length(coefvlm(object)) + no.dpar)
+}
+
+AICvgam = function(object, ..., k=2) {
+    estdisp = object at misc$estimated.dispersion
+    no.dpar = if(length(estdisp) && is.logical(estdisp) && estdisp)
+        length(object at misc$dispersion) else 0 
+    nldf = if(is.Numeric(object at nl.df)) sum(object at nl.df) else 0
+    -2 * logLik.vlm(object, ...) + k * (length(coefvlm(object)) + no.dpar + nldf)
+}
+
+AICrrvglm = function(object, ..., k=2) {
+    estdisp = object at misc$estimated.dispersion
+    no.dpar = if(length(estdisp) && is.logical(estdisp) && estdisp)
+        length(object at misc$dispersion) else 0 
+    elts.tildeA = (object at misc$M - object at control$Rank) * object at control$Rank
+    -2 * logLik.vlm(object, ...) + k * (length(coefvlm(object)) +
+    no.dpar + elts.tildeA)
+}
+
+AICqrrgvlm = function(object, ..., k=2) {
+    stop("this function not written yet")
+}
+
+setMethod("AIC", "vlm",
+         function(object, ..., k=2)
+         AICvlm(object, ..., k=k))
+
+setMethod("AIC", "vglm",
+         function(object, ..., k=2)
+         AICvlm(object, ..., k=k))
+
+setMethod("AIC", "vgam",
+         function(object, ..., k=2)
+         AICvgam(object, ..., k=k))
+
+setMethod("AIC", "rrvglm",
+         function(object, ..., k=2)
+         AICrrvglm(object, ..., k=k))
+
+setMethod("AIC", "qrrvglm",
+         function(object, ..., k=2)
+         AICqrrvglm(object, ..., k=k))
+}
+
+
+if(FALSE) {
+
+
+
+AICvglm = function(object, ..., k=2) {
+    crit = logLik.vlm(object, ...)
+    -2 * crit + k * length(coef(object))
+}
+
+
+
+
+
+AICrrvglm = function(object, ..., k=2) {
+    stop("not working yet")
+    crit = logLik.vlm(object)
+    sign = -2
+    if(!length(crit) || !is.numeric(crit)) {
+        crit = deviance(object)
+        sign = 1
+    }
+    if(!length(crit) || !is.numeric(crit))
+        stop("can't get at the deviance or loglikelihood of the object")
+
+    sign * crit + 2 * (length(coef(object)) +
+    object at control$rank * (object at misc$M - object at control$rank))
+}
+
+
+
+    # setGeneric("AIC", function(object, ..., k = 2) standardGeneric("AIC"))
+
+setMethod("AIC", signature(object="vglm"),
+           function(object, ..., k=2)
+           AICvglm(object, ..., k=k))
+
+
+
+setMethod("AIC", signature(object="rrvglm"),
+           function(object, ..., k=2)
+           AICrrvglm(object, ..., k=k))
+
+
+}
+
+
+
diff --git a/R/build.terms.vlm.q b/R/build.terms.vlm.q
index 9439027..4551040 100644
--- a/R/build.terms.vlm.q
+++ b/R/build.terms.vlm.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/calibrate.q b/R/calibrate.q
index 9bebf9e..cff6e66 100644
--- a/R/calibrate.q
+++ b/R/calibrate.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/cao.R b/R/cao.R
index 686277e..d88d900 100644
--- a/R/cao.R
+++ b/R/cao.R
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/cao.fit.q b/R/cao.fit.q
index 0001107..cc03a18 100644
--- a/R/cao.fit.q
+++ b/R/cao.fit.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -1633,7 +1633,7 @@ persp.cao = function(x,
     MSratio = M / NOS  # First value is g(mean) = quadratic form in lv
 
     xlim = if(length(xlim)) xlim else range(coefobj at lv[,1])
-    if(!length(ylim)) {
+    if(!length(ylim.orig <- ylim)) {
         ylim = if(Rank==1) c(0, max(fvmat)*stretch) else range(coefobj at lv[,2])
     }
     xlim = rep(xlim, length=2)
@@ -1668,7 +1668,8 @@ persp.cao = function(x,
 
     if(Rank==1) {
         if(plot.it) {
-            ylim = c(0, max(fitvals[,whichSpecies.numer])*stretch) # A revision
+            if(!length(ylim.orig))
+                ylim = c(0, max(fitvals[,whichSpecies.numer])*stretch) # A revision
             col = rep(col, len=length(whichSpecies.numer))
             lty = rep(lty, len=length(whichSpecies.numer))
             lwd = rep(lwd, len=length(whichSpecies.numer))
diff --git a/R/coef.vlm.q b/R/coef.vlm.q
index 5df7239..ac16497 100644
--- a/R/coef.vlm.q
+++ b/R/coef.vlm.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -166,15 +166,15 @@ Coef.vlm <- function(object, ...) {
        object at misc$intercept.only &&
        trivial.constraints(object at constraints)) {
 
-        answer = eta2theta(rbind(coef(object)),
-                           link=object at misc$link,
-                           earg=object at misc$earg)
+        answer = eta2theta(rbind(coefvlm(object)),
+                           link = object at misc$link,
+                           earg = object at misc$earg)
         answer = c(answer)
         if(length(ntmp2 <- names(tmp2)) == object at misc$M)
             names(answer) = ntmp2
         answer
     } else {
-        coef(object, ... )
+        coefvlm(object, ... )
     }
 }
 
diff --git a/R/cqo.R b/R/cqo.R
index f343d6c..aef3edc 100644
--- a/R/cqo.R
+++ b/R/cqo.R
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 cqo <- function(formula,
diff --git a/R/cqo.fit.q b/R/cqo.fit.q
index 60892e1..7531f3b 100644
--- a/R/cqo.fit.q
+++ b/R/cqo.fit.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/deviance.vlm.q b/R/deviance.vlm.q
index 646218e..67e3e9b 100644
--- a/R/deviance.vlm.q
+++ b/R/deviance.vlm.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/effects.vglm.q b/R/effects.vglm.q
index f6af963..cf930f8 100644
--- a/R/effects.vglm.q
+++ b/R/effects.vglm.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/family.aunivariate.q b/R/family.aunivariate.q
index 25a2457..934c648 100644
--- a/R/family.aunivariate.q
+++ b/R/family.aunivariate.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -336,26 +336,42 @@ riceff = function(lvee="loge", lsigma="loge",
 
 
 dskellam = function(x, mu1, mu2, log=FALSE) {
-    log.arg = log
-    rm(log)
+    log.arg = log; rm(log)
     if( !is.logical( log.arg ) || length( log.arg )!=1 )
         stop("bad input for 'log.arg'")
-    if( log.arg ) {
+
+    L = max(length(x), length(mu1), length(mu2))
+    x = rep(x, len=L); mu1 = rep(mu1, len=L); mu2 = rep(mu2, len=L);
+    ok2 <- is.finite(mu1) && is.finite(mu2) & (mu1 >= 0) & (mu2 >= 0)
+    ok3 <- (mu1 == 0) & (mu2 >  0)
+    ok4 <- (mu1 >  0) & (mu2 == 0)
+    ok5 <- (mu1 == 0) & (mu2 == 0)
+    if(log.arg) {
         ans = -mu1 - mu2 + 2 * sqrt(mu1*mu2) +
               0.5 * x * log(mu1) - 0.5 * x * log(mu2) +
               log(besselI(2 * sqrt(mu1*mu2), nu=x, expon=TRUE))
+        ans[ok3] = dpois(x=-x[ok3], lambda=mu2[ok3], log=TRUE)
+        ans[ok4] = dpois(x=-x[ok4], lambda=mu1[ok4], log=TRUE)
+        ans[ok5] = dpois(x= x[ok5], lambda=0.0,      log=TRUE)
+        ans[x != round(x)] = log(0.0)
     } else {
         ans = (mu1/mu2)^(x/2) * exp(-mu1-mu2 + 2 * sqrt(mu1*mu2)) *
               besselI(2 * sqrt(mu1*mu2), nu=x, expon=TRUE)
+        ans[ok3] = dpois(x=-x[ok3], lambda=mu2[ok3])
+        ans[ok4] = dpois(x=-x[ok4], lambda=mu1[ok4])
+        ans[ok5] = dpois(x= x[ok5], lambda=0.0)
+        ans[x != round(x)] = 0.0
     }
-    ans[(x != round(x))] = 0
-    ans[!is.finite(mu1) | !is.finite(mu2) | (mu1 <= 0) | (mu2 <= 0)] = NA
+    ans[!ok2] = NaN
     ans
 }
 
 
+
+
+
+
 rskellam = function(n, mu1, mu2) {
-    if(!is.Numeric(n, integ=TRUE,allow=1)) stop("bad input for argument \"n\"")
     rpois(n, mu1) - rpois(n, mu2)
 }
 
@@ -393,7 +409,8 @@ skellam = function(lmu1="loge", lmu2="loge",
            "Mean:     mu1-mu2", "\n",
            "Variance: mu1+mu2"),
     constraints=eval(substitute(expression({
-        constraints = cm.vgam(matrix(1,M,1), x, .parallel, constraints, int= TRUE)
+        constraints = cm.vgam(matrix(1,M,1), x, .parallel, constraints,
+                              int=TRUE)
         constraints = cm.zero.vgam(constraints, x, .zero, M)
     }), list( .parallel=parallel, .zero=zero ))),
     initialize=eval(substitute(expression({
@@ -409,8 +426,8 @@ skellam = function(lmu1="loge", lmu2="loge",
                               lm.wfit(x=x, y=y, w=w, method="qr")
             var.y.est = sum(w * junk$resid^2) / junk$df.residual
             mean.init = weighted.mean(y, w)
-            mu1.init = max((var.y.est + mean.init) / 2, 0.01)
-            mu2.init = max((var.y.est - mean.init) / 2, 0.01)
+            mu1.init = max((var.y.est + mean.init)/2, 0.01)
+            mu2.init = max((var.y.est - mean.init)/2, 0.01)
             mu1.init = rep(if(length( .imu1)) .imu1 else mu1.init, length=n)
             mu2.init = rep(if(length( .imu2)) .imu2 else mu2.init, length=n)
             etastart = cbind(theta2eta(mu1.init, .lmu1, earg= .emu1),
@@ -440,9 +457,10 @@ skellam = function(lmu1="loge", lmu2="loge",
             if( is.logical( .parallel ) && length( .parallel )==1 &&
                 .parallel )
                 sum(w * log(besselI(2*mu1, nu=y, expon=TRUE))) else
-                sum(w * (-mu1 - mu2 + 2 * sqrt(mu1*mu2) +
+                sum(w * (-mu1 - mu2 +
                         0.5 * y * log(mu1) -
                         0.5 * y * log(mu2) +
+                        2 * sqrt(mu1*mu2) +  # Use this when expon=TRUE
                         log(besselI(2 * sqrt(mu1*mu2), nu=y, expon=TRUE))))
             }
     }, list( .lmu1=lmu1, .lmu2=lmu2,
@@ -805,4 +823,266 @@ slash = function(lmu="identity", lsigma="loge", emu=list(), esigma=list(),
 
 
 
+dnefghs = function(x, tau) {
+    ans = sin(pi*tau) * exp((1-tau)*x) / (pi*(1+exp(x)))
+    ans[(tau < 0) | (tau > 1)] = NA
+    ans
+}
+
+
+
+nefghs = function(link="logit", earg=list(), itau=NULL, method.init=1)
+{
+    if(length(itau) && !is.Numeric(itau, positi=TRUE) || any(itau >= 1))
+        stop("argument \"itau\" must be in (0,1)")
+    if(mode(link) != "character" && mode(link) != "name")
+        link = as.character(substitute(link))
+    if(!is.list(earg)) earg = list()
+    if(!is.Numeric(method.init, allow=1, integ=TRUE, posit=TRUE) ||
+       method.init > 2)
+        stop("'method.init' must be 1 or 2")
+
+    new("vglmff",
+    blurb=c("Natural exponential family generalized hyperbolic ",
+            "secant distribution\n",
+            "f(y) = sin(pi*tau)*exp((1-tau)*y)/(pi*(1+exp(y))\n\n",
+            "Link:    ",
+            namesof("tau", link, earg=earg), "\n\n",
+            "Mean:     pi / tan(pi * tau)\n"),
+    initialize=eval(substitute(expression({
+        if(ncol(cbind(y)) != 1)
+            stop("response must be a vector or a one-column matrix")
+        predictors.names = namesof("tau", .link, earg=.earg, tag=FALSE) 
+
+        if(!length(etastart)) {
+            wmeany = if( .method.init == 1) weighted.mean(y,w) else
+                     median(rep(y,w))
+            if(abs(wmeany) < 0.01) wmeany = 0.01
+            tau.init = atan(pi / wmeany) / pi + 0.5
+            tau.init[tau.init < 0.03] = 0.03
+            tau.init[tau.init > 0.97] = 0.97
+            tau.init = rep( if(length( .itau )) .itau else tau.init, len=n)
+            etastart = theta2eta(tau.init, .link, earg=.earg)
+        }
+    }), list( .link=link, .earg=earg, .itau=itau, .method.init=method.init ))),
+    inverse=eval(substitute(function(eta, extra=NULL) {
+        tau = eta2theta(eta, .link, earg=.earg)
+        pi / tan(pi * tau)
+    }, list( .link=link, .earg=earg ))),
+    last=eval(substitute(expression({
+        misc$link = c(tau= .link)
+        misc$earg = list(tau = .earg)
+        misc$expected = TRUE
+        misc$method.init= .method.init
+    }), list( .link=link, .earg=earg, .method.init=method.init ))),
+    loglikelihood=eval(substitute(
+        function(mu,y,w,residuals= FALSE,eta, extra=NULL) {
+        tau = eta2theta(eta, .link, earg=.earg)
+        if(residuals) stop("loglikelihood residuals not implemented yet") else
+        sum(w * (log(sin(pi*tau)) - log(pi) + (1-tau)*y - log1p(exp(y))) )
+    }, list( .link=link, .earg=earg ))),
+    vfamily=c("nefghs"),
+    deriv=eval(substitute(expression({
+        tau = eta2theta(eta, .link, earg=.earg)
+        dl.dtau = pi / tan(pi * tau) - y
+        dtau.deta = dtheta.deta(tau, .link, earg=.earg)
+        w * dl.dtau * dtau.deta
+    }), list( .link=link, .earg=earg ))),
+    weight = eval(substitute(expression({
+        d2l.dtau2 = (pi / sin(pi * tau))^2
+        wz = d2l.dtau2 * dtau.deta^2
+        w * wz
+    }), list( .link = link ))))
+}
+
+
+
+
+logF = function(lshape1="loge", lshape2="loge",
+                eshape1=list(), eshape2=list(),
+                ishape1=NULL, ishape2=1,
+                method.init=1)
+{
+    if(length(ishape1) && !is.Numeric(ishape1, positi=TRUE))
+        stop("argument \"ishape1\" must be positive")
+    if( # length(ishape2) &&
+       !is.Numeric(ishape2, positi=TRUE))
+        stop("argument \"ishape2\" must be positive")
+    if(mode(lshape1) != "character" && mode(lshape1) != "name")
+        lshape1 = as.character(substitute(lshape1))
+    if(mode(lshape2) != "character" && mode(lshape2) != "name")
+        lshape2 = as.character(substitute(lshape2))
+    if(!is.list(eshape1)) eshape1 = list()
+    if(!is.list(eshape2)) eshape2 = list()
+    if(!is.Numeric(method.init, allow=1, integ=TRUE, posit=TRUE) ||
+       method.init > 2)
+        stop("'method.init' must be 1 or 2")
+
+    new("vglmff",
+    blurb=c("log F distribution\n",
+            "f(y) = exp(-shape2*y)/(beta(shape1,shape2)*",
+            "(1+exp(-y))^(shape1+shape2))\n\n",
+            "Link:    ",
+            namesof("shape1", lshape1, earg=eshape1),
+            ", ",
+            namesof("shape2", lshape2, earg=eshape2),
+            "\n\n",
+            "Mean:     digamma(shape1) - digamma(shape2)"),
+    initialize=eval(substitute(expression({
+        if(ncol(cbind(y)) != 1)
+            stop("response must be a vector or a one-column matrix")
+        predictors.names = c(
+            namesof("shape1", .lshape1, earg=.eshape1, tag=FALSE),
+            namesof("shape2", .lshape2, earg=.eshape2, tag=FALSE))
+
+        if(!length(etastart)) {
+            wmeany = if( .method.init == 1) weighted.mean(y,w) else
+                     median(rep(y,w))
+
+
+            shape1.init = shape2.init = rep( .ishape2, len=n)
+            shape1.init = if(length( .ishape1)) rep( .ishape1, len=n) else {
+                index1 = (y > wmeany)
+                shape1.init[index1] = shape2.init[index1] + 1/1
+                shape1.init[!index1] = shape2.init[!index1] - 1/1
+                shape1.init = pmax(shape1.init, 1/8)
+                shape1.init
+            }
+            etastart = cbind(theta2eta(shape1.init, .lshape1, earg=.eshape1),
+                             theta2eta(shape2.init, .lshape2, earg=.eshape2))
+        }
+    }), list( .lshape1=lshape1, .lshape2=lshape2,
+              .eshape1=eshape1, .eshape2=eshape2,
+              .ishape1=ishape1, .ishape2=ishape2,
+              .method.init=method.init ))),
+    inverse=eval(substitute(function(eta, extra=NULL) {
+        shape1 = eta2theta(eta[,1], .lshape1, earg=.eshape1)
+        shape2 = eta2theta(eta[,2], .lshape2, earg=.eshape2)
+        digamma(shape1) - digamma(shape2)
+    }, list( .lshape1=lshape1, .lshape2=lshape2,
+             .eshape1=eshape1, .eshape2=eshape2 ))),
+    last=eval(substitute(expression({
+        misc$link = c(shape1= .lshape1, shape2= .lshape2)
+        misc$earg = list(shape1= .eshape1, shape2= .eshape2)
+        misc$expected = TRUE
+        misc$method.init= .method.init
+    }), list( .lshape1=lshape1, .lshape2=lshape2,
+              .eshape1=eshape1, .eshape2=eshape2,
+              .method.init=method.init ))),
+    loglikelihood=eval(substitute(
+        function(mu,y,w,residuals= FALSE,eta, extra=NULL) {
+        shape1 = eta2theta(eta[,1], .lshape1, earg=.eshape1)
+        shape2 = eta2theta(eta[,2], .lshape2, earg=.eshape2)
+        if(residuals) stop("loglikelihood residuals not implemented yet") else
+        sum(w * (-shape2*y - lbeta(shape1, shape2) -
+                (shape1 + shape2) * log1p(exp(-y))) )
+    }, list( .lshape1=lshape1, .lshape2=lshape2,
+             .eshape1=eshape1, .eshape2=eshape2 ))),
+    vfamily=c("logF"),
+    deriv=eval(substitute(expression({
+        shape1 = eta2theta(eta[,1], .lshape1, earg=.eshape1)
+        shape2 = eta2theta(eta[,2], .lshape2, earg=.eshape2)
+        tmp888 = digamma(shape1 + shape2) - log1p(exp(-y))
+        dl.dshape1 = tmp888 - digamma(shape1)
+        dl.dshape2 = tmp888 - digamma(shape2) - y
+        dshape1.deta = dtheta.deta(shape1, .lshape1, earg=.eshape1)
+        dshape2.deta = dtheta.deta(shape2, .lshape2, earg=.eshape2)
+        w * cbind(dl.dshape1 * dshape1.deta, dl.dshape2 * dshape2.deta)
+    }), list( .lshape1=lshape1, .lshape2=lshape2,
+              .eshape1=eshape1, .eshape2=eshape2 ))),
+    weight = eval(substitute(expression({
+        tmp888 = trigamma(shape1 + shape2)
+        d2l.dshape12 = trigamma(shape1) - tmp888
+        d2l.dshape22 = trigamma(shape2) - tmp888
+        d2l.dshape1shape2 = -tmp888
+        wz = matrix(0, n, dimm(M))
+        wz[,iam(1,1,M=M)] = d2l.dshape12 * dshape1.deta^2
+        wz[,iam(2,2,M=M)] = d2l.dshape22 * dshape2.deta^2
+        wz[,iam(1,2,M=M)] = d2l.dshape1shape2 * dshape1.deta * dshape2.deta
+        w * wz
+    }), list( .lshape1=lshape1, .lshape2=lshape2,
+              .eshape1=eshape1, .eshape2=eshape2 ))))
+}
+
+
+dbenf = function(x, ndigits=1, log=FALSE) {
+    if(!is.Numeric(ndigits, allow=1, posit=TRUE, integ=TRUE) || ndigits > 2)
+        stop("argument 'ndigits' must be 1 or 2")
+    lowerlimit = ifelse(ndigits==1, 1, 10)
+    upperlimit = ifelse(ndigits==1, 9, 99)
+    log.arg = log; rm(log)
+    ans = x * NA
+    indexTF = is.finite(x) & (x >= lowerlimit)
+    ans[indexTF] = log10(1 + 1/x[indexTF])
+    ans[!is.na(x) & !is.nan(x) & ((x < lowerlimit) |
+        (x > upperlimit) |
+        (x != round(x)))] = 0.0
+    if(log.arg) log(ans) else ans
+}
+
+
+rbenf = function(n, ndigits=1) {
+    if(!is.Numeric(ndigits, allow=1, posit=TRUE, integ=TRUE) || ndigits > 2)
+        stop("argument 'ndigits' must be 1 or 2")
+    lowerlimit = ifelse(ndigits==1, 1, 10)
+    upperlimit = ifelse(ndigits==1, 9, 99)
+    use.n = if((length.n <- length(n)) > 1) length.n else
+            if(!is.Numeric(n, integ=TRUE, allow=1)) 
+                stop("bad input for argument \"n\"") else n
+    myrunif = runif(use.n)
+    ans = rep(lowerlimit, length = use.n)
+    for(ii in (lowerlimit+1):upperlimit) {
+        indexTF = (pbenf(ii-1, ndigits=ndigits) < myrunif) &
+                  (myrunif <= pbenf(ii, ndigits=ndigits))
+        ans[indexTF] = ii
+    }
+    ans
+}
+
+
+pbenf = function(q, ndigits=1, log.p=FALSE) {
+    if(!is.Numeric(ndigits, allow=1, posit=TRUE, integ=TRUE) || ndigits > 2)
+        stop("argument 'ndigits' must be 1 or 2")
+    lowerlimit = ifelse(ndigits==1, 1, 10)
+    upperlimit = ifelse(ndigits==1, 9, 99)
+    ans = q * NA
+    floorq = floor(q)
+    indexTF = is.finite(q) & (floorq >= lowerlimit)
+    ans[indexTF] = log10(1 + floorq[indexTF]) - ifelse(ndigits==1, 0, 1)
+    ans[!is.na(q) & !is.nan(q) & (q>=upperlimit)] = 1
+    ans[!is.na(q) & !is.nan(q) & (q< lowerlimit)] = 0
+    if(log.p) log(ans) else ans
+}
+
+
+
+
+qbenf = function(p, ndigits=1) {
+    if(!is.Numeric(ndigits, allow=1, posit=TRUE, integ=TRUE) || ndigits > 2)
+        stop("argument 'ndigits' must be 1 or 2")
+    lowerlimit = ifelse(ndigits==1, 1, 10)
+    upperlimit = ifelse(ndigits==1, 9, 99)
+    bad = !is.na(p) & !is.nan(p) & ((p < 0) | (p > 1))
+    if(any(bad))
+        stop("bad input for 'p'")
+
+    ans = rep(lowerlimit, length = length(p))
+    for(ii in (lowerlimit+1):upperlimit) {
+        indexTF = is.finite(p) &
+                  (pbenf(ii-1, ndigits=ndigits) < p) &
+                  (p <= pbenf(ii, ndigits=ndigits))
+        ans[indexTF] = ii
+    }
+
+    ans[is.na(p) | is.nan(p)] = NA
+    ans[!is.na(p) & !is.nan(p) & (p==0)] = lowerlimit
+    ans[!is.na(p) & !is.nan(p) & (p==1)] = upperlimit
+    ans
+}
+
+
+
+
+
+
 
diff --git a/R/family.basics.q b/R/family.basics.q
index 3b07bec..afaa560 100644
--- a/R/family.basics.q
+++ b/R/family.basics.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/family.binomial.q b/R/family.binomial.q
index 5a4e408..18d3e9e 100644
--- a/R/family.binomial.q
+++ b/R/family.binomial.q
@@ -1,13 +1,12 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
 process.binomial2.data.vgam <- expression({
 
 
-    if(!is.matrix(y))
-    {
+    if(!is.matrix(y)) {
         yf <- as.factor(y)
         lev <- levels(yf)
         llev <- length(lev)
@@ -19,9 +18,7 @@ process.binomial2.data.vgam <- expression({
         colnamesy <- paste(lev, ":", c("00","01","10","11"), sep="")
         dimnames(y) <- list(names(yf), colnamesy)
         input.type <- 1
-    } else
-    if(ncol(y)==2)
-    {
+    } else if(ncol(y)==2) {
         if(!all(y==0 | y==1))
             stop("response must contains 0's and 1's only")
         col.index <- y[,2] + 2*y[,1] + 1    # 1:4
@@ -30,9 +27,7 @@ process.binomial2.data.vgam <- expression({
         y[cbind(1:nn,col.index)] <- 1
         dimnames(y) <- list(dimnames(y)[[1]], c("00","01","10","11"))
         input.type <- 2
-    } else
-    if(ncol(y)==4)
-    {
+    } else if(ncol(y)==4) {
         input.type <- 3
     } else
         stop("response unrecognized")
@@ -304,7 +299,7 @@ rbinom2.or = function(n, mu1,
 binom2.or = function(lmu="logit", lmu1=lmu, lmu2=lmu, loratio="loge",
                      emu=list(), emu1=emu, emu2=emu, eoratio=list(),
                      imu1=NULL, imu2=NULL, ioratio = NULL,
-                     zero=3, exchangeable=FALSE, tol=0.001)
+                     zero=3, exchangeable=FALSE, tol=0.001, morerobust=FALSE)
 {
     if(mode(lmu) != "character" && mode(lmu) != "name")
         lmu = as.character(substitute(lmu))
@@ -387,27 +382,49 @@ binom2.or = function(lmu="logit", lmu1=lmu, lmu2=lmu, loratio="loge",
     }, list( .lmu1=lmu1, .lmu2=lmu2,
              .emu1=emu1, .emu2=emu2, .eoratio=eoratio,
              .loratio=loratio ))),
-    loglikelihood= function(mu, y, w, residuals = FALSE, eta, extra=NULL)
-        if(residuals) stop("loglikelihood residuals not implemented yet") else
-        sum(w * y * log(mu)),
+    loglikelihood=eval(substitute(
+        function(mu, y, w, residuals = FALSE, eta, extra=NULL) {
+            if(residuals) stop("loglikelihood residuals not implemented yet") else {
+                if( .morerobust) {
+                    vsmallno =  1.0e4 * .Machine$double.xmin
+                    mu.use = mu
+                    mu.use[mu.use < vsmallno] = vsmallno
+                    sum(w * y * log(mu.use))
+                } else
+                    sum(w * y * log(mu))
+        }
+        }, list( .morerobust=morerobust ))),
     vfamily=c("binom2.or", "binom2"),
     deriv=eval(substitute(expression({
-        pmargin = cbind(mu[,3]+mu[,4], mu[,2]+mu[,4])
-        oratio = mu[,4]*mu[,1] / (mu[,2]*mu[,3])
+        smallno = 1.0e4 * .Machine$double.eps
+iii = c(46,55,63)
+iii = c(39)
+iii = 1:n
+        mu.use = mu
+        mu.use[mu.use < smallno] = smallno
+        mu.use[mu.use > 1-smallno] = 1-smallno
+        pmargin = cbind(mu.use[,3]+mu.use[,4], mu.use[,2]+mu.use[,4])
+        pmargin[,1] = pmax(smallno,   pmargin[,1])
+        pmargin[,1] = pmin(1-smallno, pmargin[,1])
+        pmargin[,2] = pmax(smallno,   pmargin[,2])
+        pmargin[,2] = pmin(1-smallno, pmargin[,2])
+
+        oratio = mu.use[,4]*mu.use[,1] / (mu.use[,2]*mu.use[,3])
+        use.oratio = pmax(smallno, oratio)
         a.temp = 1 + (pmargin[,1]+pmargin[,2])*(oratio-1)
         b.temp = -4 * oratio * (oratio-1) * pmargin[,1] * pmargin[,2]
         temp9 = sqrt(a.temp^2 + b.temp)
 
         coeff12 = -0.5 + (2*oratio*pmargin - a.temp) / (2*temp9)
-        dl.dmu1 = coeff12[,2] * (y[,1]/mu[,1]-y[,3]/mu[,3]) -
-           (1+coeff12[,2]) * (y[,2]/mu[,2]-y[,4]/mu[,4])
+        dl.dmu1 = coeff12[,2] * (y[,1]/mu.use[,1]-y[,3]/mu.use[,3]) -
+           (1+coeff12[,2]) * (y[,2]/mu.use[,2]-y[,4]/mu.use[,4])
     
-        dl.dmu2 = coeff12[,1] * (y[,1]/mu[,1]-y[,2]/mu[,2]) -
-           (1+coeff12[,1]) * (y[,3]/mu[,3]-y[,4]/mu[,4])
+        dl.dmu2 = coeff12[,1] * (y[,1]/mu.use[,1]-y[,2]/mu.use[,2]) -
+           (1+coeff12[,1]) * (y[,3]/mu.use[,3]-y[,4]/mu.use[,4])
     
-        coeff3 = (y[,1]/mu[,1] - y[,2]/mu[,2] - y[,3]/mu[,3] + y[,4]/mu[,4])
-        Vab = 1 / (1/mu[,1] + 1/mu[,2] + 1/mu[,3] + 1/mu[,4])
-        dp11.doratio = Vab / oratio
+        coeff3 = (y[,1]/mu.use[,1] - y[,2]/mu.use[,2] - y[,3]/mu.use[,3] + y[,4]/mu.use[,4])
+        Vab = pmax(smallno, 1 / (1/mu.use[,1] + 1/mu.use[,2] + 1/mu.use[,3] + 1/mu.use[,4]))
+        dp11.doratio = Vab / use.oratio
         dl.doratio = coeff3 * dp11.doratio
 
         w * cbind(dl.dmu1 * dtheta.deta(pmargin[,1], .lmu1, earg= .emu1),
@@ -417,17 +434,18 @@ binom2.or = function(lmu="logit", lmu1=lmu, lmu2=lmu, loratio="loge",
               .emu1=emu1, .emu2=emu2, .eoratio=eoratio,
               .loratio=loratio ))),
     weight=eval(substitute(expression({
-        Deltapi = mu[,3]*mu[,2] - mu[,4]*mu[,1]
-        myDelta  = mu[,1] * mu[,2] * mu[,3] * mu[,4]
+        Deltapi = mu.use[,3]*mu.use[,2] - mu.use[,4]*mu.use[,1]
+        myDelta  = pmax(smallno, mu.use[,1] * mu.use[,2] * mu.use[,3] * mu.use[,4])
         pqmargin = pmargin * (1-pmargin)
+        pqmargin[pqmargin < smallno] = smallno
 
         wz = matrix(0, n, 4)
         wz[,iam(1,1,M)] = (pqmargin[,2] * Vab / myDelta) *
                           dtheta.deta(pmargin[,1], .lmu1, earg= .emu1)^2
         wz[,iam(2,2,M)] = (pqmargin[,1] * Vab / myDelta) *
                           dtheta.deta(pmargin[,2], .lmu2, earg= .emu2)^2
-        wz[,iam(3,3,M)] = (Vab / oratio^2) *
-                          dtheta.deta(oratio, .loratio, earg= .eoratio)^2
+        wz[,iam(3,3,M)] = (Vab / use.oratio^2) *
+                          dtheta.deta(use.oratio, .loratio, earg= .eoratio)^2
         wz[,iam(1,2,M)] = (Vab * Deltapi / myDelta) *
                           dtheta.deta(pmargin[,1], .lmu1, earg= .emu1) *
                           dtheta.deta(pmargin[,2], .lmu2, earg= .emu2)
@@ -438,98 +456,246 @@ binom2.or = function(lmu="logit", lmu1=lmu, lmu2=lmu, loratio="loge",
 }
 
 
+dbinom2.rho = function(mu1,
+                      mu2=if(exchangeable) mu1 else stop("'mu2' not specified"),
+                       rho=0,
+                       exchangeable=FALSE,
+                       colnames=c("00", "01", "10", "11"),
+                       ErrorCheck=TRUE)
+{
+    if(ErrorCheck) {
+        if(!is.Numeric(mu1, positive=TRUE) || max(mu1) >= 1)
+            stop("bad input for argument 'mu1'") 
+        if(!is.Numeric(mu2, positive=TRUE) || max(mu2) >= 1)
+            stop("bad input for argument 'mu2'") 
+        if(!is.Numeric(rho) || min(rho) <= -1 || max(rho) >= 1)
+            stop("bad input for argument 'rho'") 
+        if(exchangeable && max(abs(mu1 - mu2)) > 0.00001)
+            stop("argument 'exchangeable' is TRUE but 'mu1' and 'mu2' differ") 
+    }
+
+    n = max(length(mu1), length(mu2), length(rho))
+    rho = rep(rho, len=n)
+    mu1 = rep(mu1, len=n)
+    mu2 = rep(mu2, len=n)
+    eta1 = qnorm(mu1)
+    eta2 = qnorm(mu2)
+    p11 = pnorm2(eta1, eta2, rho)
+    p01 = mu2 - p11
+    p10 = mu1 - p11
+    p00 = 1 - p01 - p10 - p11
+    matrix(c(p00,p01,p10,p11), n, 4, dimnames=list(NULL,colnames))
+}
+
+
+
+rbinom2.rho = function(n, mu1,
+                      mu2=if(exchangeable) mu1 else stop("'mu2' not specified"),
+                       rho=0,
+                       exchangeable=FALSE,
+                       twoCols=TRUE,
+             colnames=if(twoCols) c("y1","y2") else c("00", "01", "10", "11"),
+                       ErrorCheck=TRUE)
+{
+    if(ErrorCheck) {
+        if(!is.Numeric(n, integer=TRUE, posit=TRUE, allow=1))
+            stop("bad input for argument 'n'")
+        if(!is.Numeric(mu1, positive=TRUE) || max(mu1) >= 1)
+            stop("bad input for argument 'mu1'") 
+        if(!is.Numeric(mu2, positive=TRUE) || max(mu2) >= 1)
+            stop("bad input for argument 'mu2'") 
+        if(!is.Numeric(rho) || min(rho) <= -1 || max(rho) >= 1)
+            stop("bad input for argument 'rho'") 
+        if(exchangeable && max(abs(mu1 - mu2)) > 0.00001)
+            stop("argument 'exchangeable' is TRUE but 'mu1' and 'mu2' differ") 
+    }
+
+    dmat = dbinom2.rho(mu1=mu1, mu2=mu2, rho=rho, exchang=exchangeable,
+                       ErrorCheck=ErrorCheck)
+
+    answer = matrix(0, n, 2, dimnames=list(NULL, if(twoCols) colnames else NULL))
+    yy = runif(n)
+    cs1 = dmat[,"00"] + dmat[,"01"]
+    cs2 = cs1 + dmat[,"10"]
+    index = (dmat[,"00"] < yy) & (yy <= cs1)
+    answer[index,2] = 1
+    index = (cs1 < yy) & (yy <= cs2)
+    answer[index,1] = 1
+    index = (yy > cs2)
+    answer[index,] = 1
+    if(twoCols) answer else {
+        answer4 = matrix(0, n, 4, dimnames=list(NULL, colnames))
+        answer4[cbind(1:n, 1 + 2*answer[,1] + answer[,2])] = 1
+        answer4
+    }
+}
+
+
 
+binom2.rho.control <- function(save.weight=TRUE, ...)
+{
+    list(save.weight=save.weight)
+}
 
 
 
-binom2.rho <- function(lrho="rhobit", erho=list(),
-                       init.rho=0.4, zero=3, exchangeable=FALSE)
+binom2.rho = function(lrho="rhobit", erho=list(),
+                      imu1=NULL, imu2=NULL, 
+                      init.rho=NULL,
+                      zero=3, exchangeable=FALSE, nsimEIM=NULL)
 {
 
     if(mode(lrho) != "character" && mode(lrho) != "name")
-        lrho <- as.character(substitute(lrho))
+        lrho = as.character(substitute(lrho))
     if(!is.list(erho)) erho = list()
+    lmu12 = "probit"
+    emu12 = list()
+    if(is.Numeric(nsimEIM)) {
+        if(!is.Numeric(nsimEIM, allow=1, integ=TRUE))
+            stop("bad input for argument 'nsimEIM'")
+        if(nsimEIM <= 100)
+            warning("'nsimEIM' should be an integer greater than 100")
+    }
 
     new("vglmff",
     blurb=c("Bivariate probit model\n",
            "Links:    ",
-           "probit(mu1), probit(mu2); ",
+            namesof("mu1", lmu12, earg= emu12), ", ",
+            namesof("mu2", lmu12, earg= emu12), ", ",
             namesof("rho", lrho, earg= erho)),
     constraints=eval(substitute(expression({
-        constraints <- cm.vgam(matrix(c(1,1,0,0,0,1),3,2), x, 
-                               .exchangeable, constraints, intercept.apply=TRUE)
-        constraints <- cm.zero.vgam(constraints, x, .zero, M)
+        constraints = cm.vgam(matrix(c(1,1,0,0,0,1),3,2), x, 
+                              .exchangeable, constraints, intercept.apply=TRUE)
+        constraints = cm.zero.vgam(constraints, x, .zero, M)
     }), list( .exchangeable=exchangeable, .zero=zero ))),
     deviance=Deviance.categorical.data.vgam,
     initialize=eval(substitute(expression({
         eval(process.binomial2.data.vgam)
-        predictors.names <- c(
-                      namesof("mu1", "probit", earg= list(), short=TRUE),
-                      namesof("mu2", "probit", earg= list(), short=TRUE),
-                      namesof("rho", .lrho, earg= .erho, short=TRUE))
-        if(is.null(etastart))
-            etastart <- cbind(theta2eta(mu[,3]+mu[,4], "probit", earg= list()),
-                              theta2eta(mu[,2]+mu[,4], "probit", earg= list()),
-                              theta2eta(.init.rho, .lrho, earg= .erho))
-    }), list( .lrho=lrho, .erho=erho, .init.rho=init.rho ))),
+        predictors.names = c(
+                      namesof("mu1", .lmu12, earg= .emu12, short=TRUE),
+                      namesof("mu2", .lmu12, earg= .emu12, short=TRUE),
+                      namesof("rho", .lrho,  earg= .erho,  short=TRUE))
+
+        if(is.null( .nsimEIM)) {
+             save.weight <- control$save.weight <- FALSE
+        }
+        if(is.null(etastart)) {
+            mu1.init= if(is.Numeric(.imu1)) rep(.imu1, len=n) else mu[,3]+mu[,4]
+            mu2.init= if(is.Numeric(.imu2)) rep(.imu2, len=n) else mu[,2]+mu[,4]
+            rho.init = if(is.Numeric(.init.rho)) rep( .init.rho, len=n) else {
+                temp4 = oratio = mu[,1] * mu[,4] / (mu[,2] * mu[,3])
+                temp4[oratio <= 0.1] = -0.6
+                temp4[oratio >  0.1] = -0.4
+                temp4[oratio >  0.5] = -0.2
+                temp4[oratio >  0.9] = -0.1
+                temp4[oratio >  1.1] =  0.1
+                temp4[oratio >  2.0] =  0.3
+                temp4[oratio >  6.0] =  0.6
+                temp4[oratio > 15.0] =  0.8
+                temp4
+            }
+            etastart = cbind(theta2eta(mu1.init, .lmu12, earg= .emu12),
+                             theta2eta(mu2.init, .lmu12, earg= .emu12),
+                             theta2eta(rho.init, .lrho, earg= .erho))
+        }
+    }), list( .lmu12=lmu12, .emu12=emu12, .nsimEIM=nsimEIM,
+              .lrho=lrho, .erho=erho, 
+              .imu1=imu1, .imu2=imu2, .init.rho=init.rho ))),
     inverse=eval(substitute(function(eta, extra=NULL) {
-        pm <- cbind(pnorm(eta[,1]),pnorm(eta[,2]))
-        rho <- eta2theta(eta[,3], .lrho, earg= .erho)
-        p11 <- pnorm2(eta[,1], eta[,2], rho)
-        p01 <- pm[,2]-p11
-        p10 <- pm[,1]-p11
-        p00 <- 1-p01-p10-p11
+        pmargin = cbind(eta2theta(eta[,1], .lmu12, earg= .emu12),
+                        eta2theta(eta[,2], .lmu12, earg= .emu12))
+        rho = eta2theta(eta[,3], .lrho, earg= .erho)
+        p11 = pnorm2(eta[,1], eta[,2], rho)
+        p01 = pmargin[,2]-p11
+        p10 = pmargin[,1]-p11
+        p00 = 1-p01-p10-p11
         cbind("00"=p00, "01"=p01, "10"=p10, "11"=p11)
-    }, list( .lrho=lrho, .erho=erho ))),
+    }, list( .lmu12=lmu12, .emu12=emu12, .lrho=lrho, .erho=erho ))),
     last=eval(substitute(expression({
-        misc$link <- c(mu1 = "probit", mu2 = "probit", rho = .lrho)
-        misc$earg <- list(mu1 = list(), mu2 = list(), rho = .erho)
-    }), list( .lrho=lrho, .erho=erho ))),
-    link=eval(substitute(function(mu, extra=NULL) {
-        if(is.null(extra))
-            stop("rho must be passed into $link through \"extra\"")
-        pm <- cbind(mu[,3]+mu[,4], mu[,2]+mu[,4])
-        cbind("probit(mu1)"=qnorm(pm[,1]),
-              "probit(mu2)"=qnorm(pm[,2]),
-              "link(rho)"=theta2eta(extra, .lrho, earg= .erho))
-    }, list( .lrho=lrho, .erho=erho ))),
+        misc$link = c(mu1 = .lmu12, mu2 = .lmu12, rho = .lrho)
+        misc$earg = list(mu1 = .emu12, mu2 = .emu12, rho = .erho)
+        misc$nsimEIM = .nsimEIM
+        misc$expected = TRUE
+    }), list( .lmu12=lmu12, .emu12=emu12, .lrho=lrho, .erho=erho,
+              .nsimEIM=nsimEIM ))),
     vfamily=c("binom2.rho", "binom2"),
     deriv=eval(substitute(expression({
-        pm <- cbind(pnorm(eta[,1]),pnorm(eta[,2]))
-        rho <- eta2theta(eta[,3], .lrho, earg= .erho)
-        p11 <- pnorm2(eta[,1], eta[,2], rho)
-        p01 <- pm[,2]-p11
-        p10 <- pm[,1]-p11
-        p00 <- 1-p01-p10-p11
-
-        B <- (eta[,2]-rho*eta[,1])/sqrt(1-rho^2)
-        A <- (eta[,1]-rho*eta[,2])/sqrt(1-rho^2)
-        phi1 <- dnorm(eta[,1])
-        phi2 <- dnorm(eta[,2])
-        PhiA <- pnorm(A)
-        PhiB <- pnorm(B)
-
-        ff <- dnorm2(eta[,1], eta[,2], rho)
-        d1 = phi1*(PhiB*(y[,4]/p11-y[,2]/p01) + (1-PhiB)*(y[,3]/p10-y[,1]/p00))
-        d2 = phi2*(PhiA*(y[,4]/p11-y[,3]/p10) + (1-PhiA)*(y[,2]/p01-y[,1]/p00))
-        dl.drho <- (y[,4]/p11-y[,3]/p10-y[,2]/p01+y[,1]/p00)* ff
-        drho.deta <- dtheta.deta(rho, .lrho, earg= .erho)
-        w * cbind(d1, d2, dl.drho * drho.deta)
-    }), list( .lrho=lrho, .erho=erho ))),
+        pmargin = cbind(eta2theta(eta[,1], .lmu12, earg= .emu12),
+                        eta2theta(eta[,2], .lmu12, earg= .emu12))
+        rhovec = eta2theta(eta[,3], .lrho, earg= .erho)
+        p11 = pnorm2(eta[,1], eta[,2], rhovec)
+        p01 = pmargin[,2]-p11
+        p10 = pmargin[,1]-p11
+        p00 = 1-p01-p10-p11
+
+        ABmat = (eta[,1:2] - rhovec*eta[,2:1]) / sqrt(1-rhovec^2)
+        PhiA = pnorm(ABmat[,1])
+        PhiB = pnorm(ABmat[,2])
+        onemPhiA = pnorm(ABmat[,1], lower.tail=FALSE)
+        onemPhiB = pnorm(ABmat[,2], lower.tail=FALSE)
+
+        smallno = 1000 * .Machine$double.eps
+        p00[p00 < smallno] = smallno
+        p01[p01 < smallno] = smallno
+        p10[p10 < smallno] = smallno
+        p11[p11 < smallno] = smallno
+
+        dprob00 = dnorm2(eta[,1], eta[,2], rhovec)
+        dl.dprob1 = PhiB*(y[,4]/p11-y[,2]/p01) + onemPhiB*(y[,3]/p10-y[,1]/p00)
+        dl.dprob2 = PhiA*(y[,4]/p11-y[,3]/p10) + onemPhiA*(y[,2]/p01-y[,1]/p00)
+        dl.drho = (y[,4]/p11-y[,3]/p10-y[,2]/p01+y[,1]/p00) * dprob00
+        dprob1.deta = dtheta.deta(pmargin[,1], .lmu12, earg= .emu12)
+        dprob2.deta = dtheta.deta(pmargin[,2], .lmu12, earg= .emu12)
+        drho.deta = dtheta.deta(rhovec, .lrho, earg= .erho)
+        dthetas.detas = cbind(dprob1.deta, dprob2.deta, drho.deta)
+
+        w * cbind(dl.dprob1, dl.dprob2, dl.drho) * dthetas.detas
+    }), list( .lmu12=lmu12, .emu12=emu12, .lrho=lrho, .erho=erho ))),
     weight=eval(substitute(expression({
-        wz <- matrix(as.numeric(NA), n, dimm(M))  # 6=dimm(M)
-        wz[,iam(1,1,M)] = phi1^2*(PhiB^2*(1/p11+1/p01)+(1-PhiB)^2*(1/p10+1/p00))
-        wz[,iam(2,2,M)] = phi2^2*(PhiA^2*(1/p11+1/p10)+(1-PhiA)^2*(1/p01+1/p00))
-        wz[,iam(1,2,M)] = phi1*phi2*(PhiA*PhiB/p11 + (1-PhiA)*(1-PhiB)/p00 -
-                    PhiA*(1-PhiB)/p10 - (1-PhiA)*PhiB/p01)
-        d2l.drhoeta1 <- ff*phi1*(PhiB*(1/p11+1/p01) - (1-PhiB)*(1/p10+1/p00))
-        wz[,iam(1,3,M)] <- d2l.drhoeta1 * drho.deta
-        d2l.drhoeta2 <- ff*phi2*(PhiA*(1/p11+1/p10) - (1-PhiA)*(1/p01+1/p00))
-        wz[,iam(2,3,M)] <- d2l.drhoeta2 * drho.deta
-        d2l.drho2 <- ff^2 * (1/p11+1/p01+1/p10+1/p00)
-        wz[,iam(3,3,M)] <-  d2l.drho2 * drho.deta^2
-        wz * w
-    }), list( .lrho=lrho, .erho=erho ))))
+        if(is.null( .nsimEIM)) {
+            d2l.dprob1prob1 = PhiB^2 *(1/p11+1/p01) + onemPhiB^2 *(1/p10+1/p00)
+            d2l.dprob2prob2 = PhiA^2 *(1/p11+1/p10) + onemPhiA^2 *(1/p01+1/p00)
+            d2l.dprob1prob2 = PhiA * (PhiB/p11 - onemPhiB/p10) +
+                              onemPhiA * (onemPhiB/p00 - PhiB/p01)
+            d2l.dprob1rho = (PhiB*(1/p11+1/p01) -
+                             onemPhiB*(1/p10+1/p00)) * dprob00
+            d2l.dprob2rho = (PhiA*(1/p11+1/p10) -
+                             onemPhiA*(1/p01+1/p00)) * dprob00
+            d2l.drho2 = (1/p11+1/p01+1/p10+1/p00) * dprob00^2
+            wz = matrix(0, n, dimm(M))  # 6=dimm(M)
+            wz[,iam(1,1,M)] = d2l.dprob1prob1 * dprob1.deta^2
+            wz[,iam(2,2,M)] = d2l.dprob2prob2 * dprob2.deta^2
+            wz[,iam(1,2,M)] = d2l.dprob1prob2 * dprob1.deta * dprob2.deta
+            wz[,iam(1,3,M)] = d2l.dprob1rho * dprob1.deta * drho.deta
+            wz[,iam(2,3,M)] = d2l.dprob2rho * dprob2.deta * drho.deta
+            wz[,iam(3,3,M)] = d2l.drho2 * drho.deta^2
+        } else {
+            run.varcov = 0
+            ind1 = iam(NA, NA, M=M, both=TRUE, diag=TRUE)
+            for(ii in 1:( .nsimEIM )) {
+                ysim = rbinom2.rho(n=n, mu1=pmargin[,1], mu2=pmargin[,2],
+                                   twoCols=FALSE, rho=rhovec)
+                dl.dprob1 = PhiB * (ysim[,4]/p11-ysim[,2]/p01) +
+                            onemPhiB * (ysim[,3]/p10-ysim[,1]/p00)
+                dl.dprob2 = PhiA * (ysim[,4]/p11-ysim[,3]/p10) +
+                            onemPhiA * (ysim[,2]/p01-ysim[,1]/p00)
+                dl.drho = (ysim[,4]/p11-ysim[,3]/p10 -
+                           ysim[,2]/p01+ysim[,1]/p00) * dprob00
+
+                rm(ysim)
+                temp3 = cbind(dl.dprob1, dl.dprob2, dl.drho)
+                run.varcov = ((ii-1) * run.varcov +
+                           temp3[,ind1$row.index] * temp3[,ind1$col.index]) / ii
+            }
+            wz = if(intercept.only)
+                matrix(apply(run.varcov, 2, mean),
+                       n, ncol(run.varcov), byrow=TRUE) else run.varcov
+    
+            wz = wz * dthetas.detas[,ind1$row] * dthetas.detas[,ind1$col]
+        }
+        w * wz
+    }), list( .nsimEIM=nsimEIM, .lmu12=lmu12, .emu12=emu12, .lrho=lrho,
+              .erho=erho ))))
 }
 
 
@@ -538,8 +704,7 @@ dnorm2 <- function(x, y, r)
     exp(-0.5*(x^2+y^2-2*x*y*r)/(1-r^2)) / (2*pi*sqrt(1-r^2))
 
 
-pnorm2 <- function(ah, ak, r) 
-{ 
+pnorm2 <- function(ah, ak, r) { 
 
     ans <- ah 
     size <- length(ah)
@@ -622,7 +787,10 @@ size.binomial <- function(prob=0.5, link="loge", earg=list())
 
 
 
+
 dbetabin.ab = function(x, size, shape1, shape2, log = FALSE) {
+    log.arg = log
+    rm(log)
     if(!is.Numeric(x)) stop("bad input for argument \"x\"")
     if(!is.Numeric(size, posit=TRUE, integer=TRUE))
         stop("bad input for argument \"size\"")
@@ -632,13 +800,15 @@ dbetabin.ab = function(x, size, shape1, shape2, log = FALSE) {
     x = rep(x, len=L); size = rep(size, len=L);
     shape1 = rep(shape1, len=L); shape2 = rep(shape2, len=L);
     answer = 0 * x
-    if(length(ok <- round(x) == x & x >= 0 & x <= size))
-        answer[ok] = if(log) lchoose(size[ok], x[ok]) +
-                     lbeta(shape1[ok]+x[ok], shape2[ok]+size[ok]-x[ok]) -
-                     lbeta(shape1[ok], shape2[ok]) else 
-                     choose(size[ok], x[ok]) *
-                     beta(shape1[ok]+x[ok],
-                     shape2[ok]+size[ok]-x[ok]) / beta(shape1[ok], shape2[ok])
+    ok <- round(x) == x & x >= 0 & x <= size
+    answer[ok] = lchoose(size[ok], x[ok]) +
+                 lbeta(shape1[ok]+x[ok], shape2[ok]+size[ok]-x[ok]) -
+                 lbeta(shape1[ok], shape2[ok])
+    if(log.arg) {
+        answer[!ok] = log(0.0)
+    } else {
+        answer[ok] = exp(answer[ok])
+    }
     answer
 }
 
@@ -1081,8 +1251,6 @@ zipebcom   = function(lmu12="cloglog", lphi12="logit", loratio="loge",
                       addRidge=0.001)
 {
 
-
-
     if(mode(lphi12) != "character" && mode(lphi12) != "name")
         lphi12 = as.character(substitute(lphi12))
     if(mode(loratio) != "character" && mode(loratio) != "name")
@@ -1171,23 +1339,17 @@ zipebcom   = function(lmu12="cloglog", lphi12="logit", loratio="loge",
         smallno = .Machine$double.eps^(2/4)
         A1vec[A1vec > 1.0 -smallno] = 1.0 - smallno
 
-
         phivec = eta2theta(eta[,2], .lphi12, earg= .ephi12)
         pmargin = matrix((1 - phivec) * A1vec, n, 2)
         oratio = eta2theta(eta[,3], .loratio, earg= .eoratio)
 
-
-
         Vab = 1 / (1/mu[,1] + 1/mu[,2] + 1/mu[,3] + 1/mu[,4])
         Vabc = 1/mu[,1] + 1/mu[,2]
         denom3 = 2 * oratio * mu[,2] + mu[,1] + mu[,4]
         temp1 = oratio * mu[,2] + mu[,4]
         dp11star.dp1unstar = 2*(1-phivec)*Vab * Vabc
-
         dp11star.dphi1 = -2 * A1vec * Vab * Vabc
-
         dp11star.doratio = Vab / oratio 
-
         yandmu = (y[,1]/mu[,1] - y[,2]/mu[,2] - y[,3]/mu[,3] + y[,4]/mu[,4])
         dp11.doratio = Vab / oratio
         check.dl.doratio = yandmu * dp11.doratio
@@ -1196,58 +1358,32 @@ zipebcom   = function(lmu12="cloglog", lphi12="logit", loratio="loge",
         dl.dmu1 = dp11star.dp1unstar * yandmu + (1-phivec) * cyandmu
         dl.dphi1 = dp11star.dphi1 * yandmu - A1vec * cyandmu
         dl.doratio = check.dl.doratio
-
         dthetas.detas = cbind(dtheta.deta(A1vec,  .lmu12,   earg= .emu12),
                               dtheta.deta(phivec, .lphi12,  earg= .ephi12),
                               dtheta.deta(oratio, .loratio, earg= .eoratio))
         w * cbind(dl.dmu1, dl.dphi1, dl.doratio) * dthetas.detas
-    }), list( .tol=tol,
-              .lmu12=lmu12, .lphi12=lphi12, .loratio=loratio,
+    }), list( .lmu12=lmu12, .lphi12=lphi12, .loratio=loratio,
               .emu12=emu12, .ephi12=ephi12, .eoratio=eoratio ))),
     weight=eval(substitute(expression({
-        myvarfun1 = function(y, mu, a=1, b=0) (a-2*b)^2 / mu[,1] +
-            (b-a)^2 * (1/mu[,2] +  1/mu[,3]) + a^2 / mu[,4]
-
-        mycovfun1 = function(y, mu, a1=1, b1=0, a2=1, b2=0)
-            (a1-2*b1)*(a2-2*b2) / mu[,1] +
-            (b1-a1) * (b2-a2) * (1/mu[,2] +  1/mu[,3]) +
-            a1 * a2 / mu[,4]
-
         wz = matrix(0, n, 4)
         alternwz11 = 2*(1-phivec)^2 *(2/mu[,1] + 1/mu[,2] - 2*Vab*Vabc^2) *
                      (dthetas.detas[,1])^2
         wz[,iam(1,1,M)] = alternwz11
 
-
         alternwz22 = 2* A1vec^2 *(2/mu[,1] + 1/mu[,2] - 2*Vab*Vabc^2) *
                      (dthetas.detas[,2])^2
         wz[,iam(2,2,M)] = alternwz22
 
-
-
-
-
         alternwz12 = -2*A1vec*(1-phivec)*(2/mu[,1] + 1/mu[,2] - 2*Vab*Vabc^2) *
                      dthetas.detas[,1] * dthetas.detas[,2]
         wz[,iam(1,2,M)] = alternwz12
 
-
-
-
         alternwz33 = (Vab / oratio^2) * dthetas.detas[,3]^2
         wz[,iam(3,3,M)] = alternwz33
 
-
-
-
-
-
         wz[,1:2] = wz[,1:2] * (1 + .addRidge)
-
         w * wz
-    }), list( .tol=tol, .addRidge = addRidge,
-              .lmu12=lmu12, .lphi12=lphi12, .loratio=loratio,
-              .emu12=emu12, .ephi12=ephi12, .eoratio=eoratio ))))
+    }), list( .addRidge = addRidge ))))
 }
 
 
diff --git a/R/family.bivariate.q b/R/family.bivariate.q
index 1926ade..a7db3be 100644
--- a/R/family.bivariate.q
+++ b/R/family.bivariate.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/family.categorical.q b/R/family.categorical.q
index c8e0687..1945542 100644
--- a/R/family.categorical.q
+++ b/R/family.categorical.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -26,8 +26,7 @@ process.categorical.data.vgam = expression({
     if(!exists("delete.zero.colns") ||
       (exists("delete.zero.colns") && delete.zero.colns)) {
         sumy2 = as.vector(t(y) %*% rep(1,nrow(y)))
-        if(any(index <- sumy2==0))
-        {
+        if(any(index <- sumy2==0)) {
             y = y[,!index,drop = FALSE]
             sumy2 = sumy2[!index]
             if(all(index) || ncol(y)<=1) stop("y matrix has 0 or 1 columns")
@@ -36,8 +35,7 @@ process.categorical.data.vgam = expression({
         }
     }
 
-    if(any(miss <- nvec==0))
-    {
+    if(any(miss <- nvec==0)) {
         warning(paste(sm <- sum(miss),
                       "observation(s) deleted (zero counts)"))
         x = x[!miss,,drop = FALSE]
@@ -360,12 +358,34 @@ vglm.vcategorical.control = function(maxit=30, trace=FALSE, panic=TRUE, ...)
 
 
 
-multinomial = function(zero=NULL, parallel=FALSE, nointercept=NULL)
+multinomial = function(zero=NULL, parallel=FALSE, nointercept=NULL,
+                       refLevel="last")
 {
+    if(length(refLevel) != 1) stop("the length of 'refLevel' must be one")
+    if(is.character(refLevel)) {
+        if(refLevel != "last") stop('if a character, refLevel must be "last"')
+        refLevel = -1
+    } else if(is.factor(refLevel)) {
+        if(is.ordered(refLevel)) warning("'refLevel' is from an ordered factor")
+        refLevel = as.character(refLevel) == levels(refLevel)
+        refLevel = (1:length(refLevel))[refLevel]
+        if(!is.Numeric(refLevel, allow=1, integer=TRUE, posit=TRUE))
+            stop("could not coerce 'refLevel' into a single positive integer")
+    } else if(!is.Numeric(refLevel, allow=1, integer=TRUE, posit=TRUE))
+            stop("\"refLevel\" must be a single positive integer")
 
     new("vglmff",
     blurb=c("Multinomial logit model\n\n", 
-           "Links:    log(mu[,j]/mu[,M+1])\n",
+           if(refLevel < 0)
+           "Links:    log(mu[,j]/mu[,M+1]), j=1:M,\n" else {
+               if(refLevel==1)
+                   paste("Links:    log(mu[,j]/mu[,", refLevel,
+                         "]), j=2:(M+1),\n", sep="") else
+                   paste("Links:    log(mu[,j]/mu[,", refLevel,
+                         "]), j=c(1:", refLevel-1,
+                         ",", refLevel+1, ":(M+1)),\n",
+                     sep="")
+           },
            "Variance: mu[,j]*(1-mu[,j]); -mu[,j]*mu[,k]"),
     constraints=eval(substitute(expression({
 
@@ -377,52 +397,87 @@ multinomial = function(zero=NULL, parallel=FALSE, nointercept=NULL)
                                intercept.apply=FALSE)
         constraints = cm.zero.vgam(constraints, x, .zero, M)
         constraints = cm.nointercept.vgam(constraints, x, .nointercept, M)
-    }), list( .parallel=parallel, .zero=zero, .nointercept=nointercept ))),
+    }), list( .parallel=parallel, .zero=zero, .nointercept=nointercept,
+              .refLevel=refLevel ))),
     deviance=Deviance.categorical.data.vgam,
-    initialize=expression({
+    initialize=eval(substitute(expression({
         delete.zero.colns = TRUE 
         eval(process.categorical.data.vgam)
         M = ncol(y)-1
-        predictors.names = paste("log(mu[,",1:M,"]/mu[,",M+1,"])",sep="")
+        use.refLevel = if( .refLevel < 0) M+1 else .refLevel
+        if(use.refLevel > (M+1))
+            stop("argument 'refLevel' has a value that is too high")
+        allbut.refLevel = (1:(M+1))[-use.refLevel]
+        predictors.names = paste("log(mu[,", allbut.refLevel,
+                                 "]/mu[,", use.refLevel, "])", sep="")
         y.names = paste("mu", 1:(M+1), sep="")
-    }),
-    inverse=function(eta, extra=NULL) {
+    }), list( .refLevel = refLevel ))),
+    inverse=eval(substitute( function(eta, extra=NULL) {
         if(any(is.na(eta)))
             warning("there are NAs in eta in slot inverse")
-        phat = cbind(exp(eta), 1) 
+        M = ncol(cbind(eta))
+        if( (.refLevel < 0) || (.refLevel == M+1)) {
+            phat = cbind(exp(eta), 1)
+        } else if( .refLevel == 1) {
+            phat = cbind(1, exp(eta))
+        } else {
+            use.refLevel = if( .refLevel < 0) M+1 else .refLevel
+            etamat = cbind(eta[,1:( .refLevel - 1)], 0,
+                           eta[,( .refLevel ):M])
+            phat = exp(etamat)
+        }
         ans = phat / as.vector(phat %*% rep(1, ncol(phat)))
         if(any(is.na(ans)))
             warning("there are NAs here in slot inverse")
         ans
-    }, 
-    last=expression({
+    }), list( .refLevel = refLevel )),
+    last=eval(substitute(expression({
+        misc$refLevel = if( .refLevel < 0) M+1 else .refLevel
         misc$link = "mlogit"
         misc$earg = list(mlogit = list()) # vector("list", M)
 
         dy = dimnames(y)
         if(!is.null(dy[[2]]))
             dimnames(fit$fitted.values) = dy
-    }),
-    link=function(mu, extra=NULL)
-        log(mu[,-ncol(mu)]/mu[,ncol(mu)]),
+    }), list( .refLevel = refLevel ))),
+    link=eval(substitute( function(mu, extra=NULL) {
+        if( .refLevel < 0) {
+            log(mu[,-ncol(mu)] / mu[,ncol(mu)])
+        } else {
+            use.refLevel = if( .refLevel < 0) ncol(mu) else .refLevel
+            log(mu[,-( use.refLevel )] / mu[, use.refLevel ])
+        }
+    }), list( .refLevel = refLevel )),
     loglikelihood= function(mu, y, w, residuals = FALSE, eta, extra=NULL)
         if(residuals) stop("loglikelihood residuals not implemented yet") else
         sum(w * y * log(mu)), 
     vfamily=c("multinomial", "vcategorical"),
-    deriv=expression({
-        w * (y[,-ncol(y)] - mu[,-ncol(y)])
-    }),
-    weight= expression({
-        tiny = (mu < .Machine$double.eps^.5) | 
-                (mu > 1 - .Machine$double.eps^.5)
-
-        if(M==1) wz = mu[,1] * (1-mu[,1]) else {
+    deriv=eval(substitute(expression({
+        if( .refLevel < 0) {
+            w * (y[,-ncol(y)] - mu[,-ncol(y)])
+        } else {
+            use.refLevel = if( .refLevel < 0) M+1 else .refLevel
+            w * (y[,-use.refLevel] - mu[,-use.refLevel])
+        }
+    }), list( .refLevel=refLevel ))),
+    weight=eval(substitute(expression({
+        mytiny = (mu < sqrt(.Machine$double.eps)) | 
+                 (mu > 1 - sqrt(.Machine$double.eps))
+
+        use.refLevel = if( .refLevel < 0) M+1 else .refLevel
+
+        if(M==1) wz = mu[,3-use.refLevel] * (1-mu[,3-use.refLevel]) else {
             index = iam(NA, NA, M, both=TRUE, diag=TRUE)
+            myinc = (index$row.index >= use.refLevel)
+            index$row.index[myinc] = index$row.index[myinc] + 1
+            myinc = (index$col.index >= use.refLevel)
+            index$col.index[myinc] = index$col.index[myinc] + 1
+
             wz = -mu[,index$row] * mu[,index$col]
-            wz[,1:M] = wz[,1:M] + mu[,1:M]
+            wz[,1:M] = wz[,1:M] + mu[, -use.refLevel ]
         }
 
-        atiny = (tiny %*% rep(1, ncol(mu))) > 0 # apply(tiny, 1, any) 
+        atiny = (mytiny %*% rep(1, ncol(mu))) > 0 # apply(mytiny, 1, any)
         if(any(atiny)) {
             if(M==1) wz[atiny] = wz[atiny] * (1 + .Machine$double.eps^0.5) +
                            .Machine$double.eps else 
@@ -430,7 +485,7 @@ multinomial = function(zero=NULL, parallel=FALSE, nointercept=NULL)
                              .Machine$double.eps
         }
         w * wz
-    }))
+    }), list( .refLevel = refLevel ))))
 }
 
 
@@ -490,6 +545,10 @@ cumulative = function(link="logit", earg = list(),
         answer
     }, list( .earg=earg, .link=link, .mv = mv ) )),
     initialize=eval(substitute(expression({
+
+        if(colnames(x)[1] != "(Intercept)")
+            stop("there is no intercept term!")
+
         extra$mv = .mv
         if( .mv ) {
             checkCut(y)  # Check the input; stops if there is an error.
@@ -828,6 +887,7 @@ brat = function(refgp="last",
     if(!is.character(refgp) &&
        !is.Numeric(refgp, allow=1, integer=TRUE, posit=TRUE))
         stop("\"refgp\" must be a single positive integer")
+
     new("vglmff",
     blurb=c(paste("Bradley-Terry model (without ties)\n\n"), 
            "Links:   ",
@@ -1525,8 +1585,6 @@ scumulative = function(link="logit", earg = list(),
     vfamily=c("scumulative", "vcategorical"),
     deriv=eval(substitute(expression({
         ooz = iter %% 2
- print("ooz")
- print( ooz )
 
         J = extra$J
         mu.use = pmax(mu, .Machine$double.eps * 1.0e-0)
diff --git a/R/family.censored.q b/R/family.censored.q
index d3b15a3..ac1f6d3 100644
--- a/R/family.censored.q
+++ b/R/family.censored.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/family.circular.q b/R/family.circular.q
index 2e6af92..81fbd63 100644
--- a/R/family.circular.q
+++ b/R/family.circular.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/family.extremes.q b/R/family.extremes.q
index 7fa17f9..538468f 100644
--- a/R/family.extremes.q
+++ b/R/family.extremes.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -148,11 +148,11 @@ gev <- function(llocation="identity",
         lp = length(cent)
         fv = matrix(as.numeric(NA), nrow(eta), lp)
         if(lp) {
-            for(i in 1:lp) {
-                yp = -log(cent[i]/100)
-                fv[!iszero,i] = loc[!iszero] - sigma[!iszero] *
+            for(ii in 1:lp) {
+                yp = -log(cent[ii]/100)
+                fv[!iszero,ii] = loc[!iszero] - sigma[!iszero] *
                                 (1 - yp^(-xi[!iszero])) / xi[!iszero]
-                fv[iszero,i] = loc[iszero] - sigma[iszero] * log(yp)
+                fv[iszero,ii] = loc[iszero] - sigma[iszero] * log(yp)
             }
             dimnames(fv) = list(dimnames(eta)[[1]],
                                 paste(as.character(cent), "%", sep=""))
@@ -464,11 +464,11 @@ egev <- function(llocation="identity",
         lp <- length(cent)
         fv <- matrix(as.numeric(NA), nrow(eta), lp)
         if(lp) {
-            for(i in 1:lp) {
-                yp = -log(cent[i]/100)
-                fv[!iszero,i] = loc[!iszero] - sigma[!iszero] *
+            for(ii in 1:lp) {
+                yp = -log(cent[ii]/100)
+                fv[!iszero,ii] = loc[!iszero] - sigma[!iszero] *
                                 (1 - yp^(-xi[!iszero])) / xi[!iszero]
-                fv[iszero,i] = loc[iszero] - sigma[iszero] * log(yp)
+                fv[iszero,ii] = loc[iszero] - sigma[iszero] * log(yp)
             }
             dimnames(fv) = list(dimnames(eta)[[1]],
                                 paste(as.character(cent), "%", sep=""))
@@ -700,19 +700,18 @@ gumbel <- function(llocation="identity",
         sigma = eta2theta(eta[,2], .lscale, earg= .escale )  # sigma
         Percentiles = extra$percentiles
         lp = length(Percentiles)  # may be 0
-        if(lp) {
+        if(lp > 0) {
             mpv = extra$mpv
             mu = matrix(as.numeric(NA), nrow(eta), lp + mpv) # lp could be 0
             Rvec = extra$R
-            if(1 <= lp)
-            for(i in 1:lp) {
-                ci = if(is.Numeric(Rvec)) Rvec * (1 - Percentiles[i] / 100) else
-                    -log( Percentiles[i] / 100)
-                mu[,i] = loc - sigma * log(ci)
+            for(ii in 1:lp) {
+                ci = if(is.Numeric(Rvec)) Rvec * (1 - Percentiles[ii] / 100) else
+                    -log(Percentiles[ii] / 100)
+                mu[,ii] = loc - sigma * log(ci)
             }
             if(mpv) 
                 mu[,ncol(mu)] = loc - sigma * log(log(2))
-            dmn2 = if(lp>=1) paste(as.character(Percentiles), "%", sep="") else NULL
+            dmn2 = paste(as.character(Percentiles), "%", sep="")
             if(mpv) 
                 dmn2 = c(dmn2, "MPV")
             dimnames(mu) = list(dimnames(eta)[[1]], dmn2)
@@ -1011,7 +1010,7 @@ gpd = function(threshold=0,
             A = 1 + xi*ystar/sigma
             mytolerance = .Machine$double.eps
             bad <- (A<=mytolerance)   # Range violation
-            if(any(sum(w[bad]))) {
+            if(any(bad) && any(w[bad] != 0)) {
                 cat("There are some range violations\n")
                 if(exists("flush.console")) flush.console()
             }
@@ -1033,7 +1032,7 @@ gpd = function(threshold=0,
         A = 1 + xi*ystar/sigma
         mytolerance = .Machine$double.eps
         bad <- (A <= mytolerance)
-        if(any(sum(w[bad]))) {
+        if(any(bad) && any(w[bad] != 0)) {
             cat(sum(w[bad],na.rm=TRUE), # "; ignoring them"
                 "observations violating boundary constraints\n")
             if(exists("flush.console")) flush.console()
diff --git a/R/family.fishing.q b/R/family.fishing.q
new file mode 100644
index 0000000..4757edb
--- /dev/null
+++ b/R/family.fishing.q
@@ -0,0 +1,80 @@
+# These functions are Copyright (C) 1998-2008 T. W. Yee   All rights reserved.
+
+# "family.fishing.q"
+# Last modified: 01/12/08, 02/12/08
+# Copyright Thomas W. Yee (2008)
+
+
+# ====================================================================
+# 20081201
+
+DeLury = function(catch, effort,
+                  type=c("DeLury","Leslie"),
+                  ricker=FALSE) {
+# 20081202; this function has been checked not ok
+    type = match.arg(type, c("DeLury","Leslie"))[1]
+    if(!is.logical(ricker)) stop("bad input for 'ricker'")
+    if((LLL <- Lcatch <- length(catch)) != (Leffort <- length(effort)))
+        stop("length(catch) != length(effort)")
+
+    CPUE = catch / effort
+    if(type == "DeLury") {
+        Et = cumsum(effort) - ifelse(ricker, 0.5, 1) * effort
+        logCPUE = log(CPUE)
+        lmfit = lm(logCPUE ~ Et, x=TRUE)
+        myq = catchabilityCoefficient = -coef(lmfit)[2]
+        N0 = exp(coef(lmfit)["(Intercept)"]) / myq
+    } else {
+        Kt = cumsum(catch) - ifelse(ricker, 0.5, 1) * catch
+        lmfit = lm(CPUE ~ Kt, x=TRUE)
+        myq = catchabilityCoefficient = -coef(lmfit)[2]
+        N0 = coef(lmfit)["(Intercept)"] / myq
+    }
+
+    rlist =
+    list(catch=catch,
+         effort=effort,
+         type=type,
+         N0 = N0,
+         CPUE = CPUE,
+         lmfit=lmfit)
+    if(type == "DeLury") {
+        rlist$E = Et
+    } else {
+        rlist$K = Kt
+    }
+    rlist
+}
+
+
+
+# ======================================================================
+# 20081201
+# Transferred over from my own files and then modified here.
+
+# length is in metres
+wffc.P1     = function(length, min.eligible=0.18)
+    ifelse(length >= min.eligible, 100 + 20 * ceiling(100*length), 0)
+wffc.P1star = function(length, min.eligible=0.18)
+    ifelse(length >= min.eligible, 100 + 2000 * length, 0)
+
+# This was in the original mss. but problem is P2 does not return an integer
+#wffc.P2     = function(y, min.eligible=0.18)
+#    P1(y) + ifelse(y >= min.eligible, 0.7*ceiling(100*(y-min.eligible))^2, 0)
+#wffc.P2star = function(y, min.eligible=0.18)
+#    P1star(y) + ifelse(y >= min.eligible, 7000 * (y-min.eligible)^2, 0)
+
+# 7/6/08; This returns an integer
+wffc.P2     = function(length, min.eligible=0.18)
+    wffc.P1(length) +
+    ifelse(length >= min.eligible,
+           ceiling(100*(length-min.eligible))^2, 0)
+wffc.P2star = function(length, min.eligible=0.18)
+    wffc.P1star(length) +
+    ifelse(length >= min.eligible, 10000 * (length-min.eligible)^2, 0)
+
+
+# ======================================================================
+
+
+
diff --git a/R/family.functions.q b/R/family.functions.q
index cc5dd61..2d9b8dc 100644
--- a/R/family.functions.q
+++ b/R/family.functions.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/family.genetic.q b/R/family.genetic.q
index e4ab14f..575e6e5 100644
--- a/R/family.genetic.q
+++ b/R/family.genetic.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/family.glmgam.q b/R/family.glmgam.q
index c7a771c..78c06ce 100644
--- a/R/family.glmgam.q
+++ b/R/family.glmgam.q
@@ -1,110 +1,10 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
 
 
-if(FALSE)
-quasiff = function(link="polw",
-                   earg=if(link=="powl") list(power=1) else list(),
-                   dispersion=0)
-{
-    warning("link=powl doesn't work yet")
-    estimated.dispersion <- dispersion==0
-
-    if(mode(link )!= "character" && mode(link )!= "name")
-        link <- as.character(substitute(link))
-    if(!is.list(earg)) earg = list()
-
-
-
-    result <- 
-    new("vglmff",
-    blurb=c("Quasi family\n\n",
-           "Link:     ", namesof("mu", link, earg=earg), "\n",
-           "Variance: ", ifelse(power.variance==1, variance,
-           paste(variance, "^", power.variance, sep=""))),
-    deviance= function(mu, y, w, residuals = FALSE, eta, extra=NULL) {
-        pow <- extra$power.variance
-        thing <- extra$variance
-        if(thing=="mu" && (pow==1 || pow==2))
-            stop("this deviance function not right")
-
-        devy  <- y^(2-pow) / (1-pow) - y^(2-pow) / (2-pow)
-        devmu <- y * mu^(1-pow) / (1-pow) - mu^(2-pow) / (2-pow)
-        devi <- 2 * (devy - devmu)
-        if(residuals) {
-            sign(y - mu) * sqrt(abs(devi) * w)
-        } else sum(w * devi)
-    },
-    initialize=eval(substitute(expression({
-        extra$link <- .link
-        extra$variance <- .variance
-        extra$power.variance <- .power.variance
-
-        if(.variance=="mu(1-mu)") {
-            delete.zero.colns <- TRUE 
-            eval(process.categorical.data.vgam)
-    
-            mustart <- mustart[,1]
-            y <- y[,1]
-        } else {
-            mustart <- y + 0.167 * (y == 0)
-        }
-
-
-    }), list( .link=link, .variance=variance,
-              .earg=earg, .power.variance=power.variance ))),
-    inverse=eval(substitute(function(eta, extra=NULL) {
-        eta2theta(eta, link= .link, earg=.earg)
-    }, list( .link=link,
-              .earg=earg ))),
-    last=eval(substitute(expression({
-        dpar <- .dispersion
-        if(!dpar) {
-            temp <- w * dmu.deta^2
-            dpar <- sum( w * (y-mu)^2 * wz / temp ) / (length(mu) - ncol(x))
-        }
-        misc$dispersion <- dpar
-        misc$default.dispersion <- 0
-        misc$estimated.dispersion <- .estimated.dispersion
-        misc$power.variance <- .power.variance
-        misc$link = c("mu" = .link )
-    }), list( .dispersion=dispersion,
-              .earg=earg, .estimated.dispersion=estimated.dispersion,
-            .link=link, .power.variance=power.variance ))),
-    link=eval(substitute(function(mu, extra=NULL) {
-        theta2eta(mu, link= .link, earg=.earg)
-    }, list( .link=link,
-              .earg=earg ))),
-    vfamily="quasiff",
-    deriv=eval(substitute(expression({
-        pow <- extra$power.variance
-        thing <- extra$variance
-        dQ.dmu <- if(thing=="mu") (y-mu)/mu^pow else (y-mu)/(mu*(1-mu))^pow
-        dmu.deta <- dtheta.deta(theta=mu, link= .link, earg=.earg)
-        w * dQ.dmu * dmu.deta
-    }), list( .link=link, .power.variance=power.variance,
-              .earg=earg ))),
-    weight=eval(substitute(expression({
-        d2Q.dmu2 <- if(thing=="mu") 1 / mu^pow else 
-            1 / (mu*(1-mu))^pow
-        w * dmu.deta^2 * d2Q.dmu2
-    }), list( .link=link, .power.variance=power.variance,
-              .earg=earg ))))
-
-    if(variance=="mu") {
-        if(power.variance==1)
-            result at deviance <- poissonff()@deviance
-        if(power.variance==2)
-            result at deviance <- gammaff()@deviance
-    } else {
-        result at deviance <- if(power.variance==1) binomialff()@deviance else NULL 
-    }
-
-    result
-}
 
 
 
@@ -557,6 +457,7 @@ inv.gaussianff <- function(lmu="loge", llambda="loge",
 
 poissonff <- function(link="loge", earg=list(),
                       dispersion=1, onedpar=FALSE,
+                      imu=NULL, method.init=1,
                       parallel=FALSE, zero=NULL)
 {
 
@@ -564,6 +465,11 @@ poissonff <- function(link="loge", earg=list(),
     if(mode(link )!= "character" && mode(link )!= "name")
         link <- as.character(substitute(link))
     if(!is.list(earg)) earg = list()
+    if(!is.Numeric(method.init, allow=1, integ=TRUE, posit=TRUE) ||
+       method.init > 3)
+        stop("'method.init' must be 1 or 2 or 3")
+    if(length(imu) && !is.Numeric(imu, posit=TRUE))
+        stop("bad input for argument 'imu'")
 
     new("vglmff",
     blurb=c("Poisson distribution\n\n",
@@ -581,10 +487,12 @@ poissonff <- function(link="loge", earg=list(),
             2 * sum(w * devi)
     },
     initialize=eval(substitute(expression({
+        y = as.matrix(y)
+        M = ncoly = ncol(y)
+
         if(is.R()) assign("CQO.FastAlgorithm",
             ( .link == "loge"), envir = VGAMenv) else
             CQO.FastAlgorithm <<- ( .link == "loge")
-        M = if(is.matrix(y)) ncol(y) else 1
         dn2 = if(is.matrix(y)) dimnames(y)[[2]] else NULL
         dn2 = if(length(dn2)) {
             paste("E[", dn2, "]", sep="") 
@@ -593,11 +501,22 @@ poissonff <- function(link="loge", earg=list(),
         }
         predictors.names = namesof(if(M>1) dn2 else "mu", .link,
             earg= .earg, short=TRUE)
-        mu = pmax(y, 1/8) # y + 0.167 * (y == 0)
-        if(!length(etastart))
-            etastart <- theta2eta(mu, link= .link, earg= .earg)
+
+        if(!length(etastart)) {
+            mu.init = pmax(y, 1/8)
+            for(iii in 1:ncol(y)) {
+                if( .method.init == 2) {
+                    mu.init[,iii] = weighted.mean(y[,iii], w) + 1/8
+                } else if( .method.init == 3) {
+                    mu.init[,iii] = median(y[,iii]) + 1/8
+                }
+            }
+            if(length(.imu))
+                mu.init = matrix( .imu, n, ncoly, byrow=TRUE)
+            etastart <- theta2eta(mu.init, link= .link, earg= .earg)
+        }
     }), list( .link=link, .estimated.dispersion=estimated.dispersion,
-              .earg=earg ))),
+              .method.init=method.init, .imu=imu, .earg=earg ))),
     inverse=eval(substitute(function(eta, extra=NULL) {
         mu = eta2theta(eta, link= .link, earg= .earg)
         mu
@@ -631,12 +550,14 @@ poissonff <- function(link="loge", earg=list(),
         misc$expected = TRUE
         misc$link = rep( .link, length=M)
         names(misc$link) = if(M>1) dn2 else "mu"
+        misc$method.init = .method.init
 
         misc$earg = vector("list", M)
         names(misc$earg) = names(misc$link)
         for(ii in 1:M) misc$earg[[ii]] = .earg
-    }), list( .dispersion=dispersion, .estimated.dispersion=estimated.dispersion,
-            .onedpar=onedpar, .link=link, .earg=earg ))),
+    }), list( .dispersion=dispersion, .method.init=method.init,
+              .estimated.dispersion=estimated.dispersion,
+              .onedpar=onedpar, .link=link, .earg=earg ))),
     link=eval(substitute(function(mu, extra=NULL) {
         theta2eta(mu, link= .link, earg= .earg)
     }, list( .link=link, .earg=earg ))),
diff --git a/R/family.loglin.q b/R/family.loglin.q
index b9167b3..f6c14ac 100644
--- a/R/family.loglin.q
+++ b/R/family.loglin.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -10,7 +10,7 @@ loglinb2 <- function(exchangeable=FALSE, zero=NULL)
     new("vglmff",
     blurb=c("Log-linear model for binary data\n\n",
            "Links:    ",
-           "Identity: u_1, u_2, u_{12}",
+           "Identity: u1, u2, u12",
            "\n"),
     constraints=eval(substitute(expression({
         constraints <- cm.vgam(matrix(c(1,1,0, 0,0,1), 3, 2), x,
diff --git a/R/family.mixture.q b/R/family.mixture.q
index 09e8ac2..ad76ff6 100644
--- a/R/family.mixture.q
+++ b/R/family.mixture.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -20,7 +20,7 @@ mix2normal1 = function(lphi="logit",
                        esd1=list(), esd2=list(),
                        iphi=0.5, imu1=NULL, imu2=NULL, isd1=NULL, isd2=NULL,
                        qmu=c(0.2, 0.8),
-                       ESD=TRUE,
+                       equalsd=TRUE,
                        nsimEIM=100,
                        zero=1)
 {
@@ -47,8 +47,8 @@ mix2normal1 = function(lphi="logit",
     if(!is.list(emu2)) emu2 = list()
     if(!is.list(esd1)) esd1 = list()
     if(!is.list(esd2)) esd2 = list()
-    if(!is.logical(ESD) || length(ESD) != 1)
-        stop("bad input for argument \"ESD\"")
+    if(!is.logical(equalsd) || length(equalsd) != 1)
+        stop("bad input for argument \"equalsd\"")
     if(!is.Numeric(nsimEIM, allow=1, integ=TRUE) || nsimEIM <= 10)
         stop("'nsimEIM' should be an integer greater than 10")
 
@@ -63,10 +63,10 @@ mix2normal1 = function(lphi="logit",
            "Mean:     phi*mu1 + (1-phi)*mu2\n",
            "Variance: phi*sd1^2 + (1-phi)*sd2^2 + phi*(1-phi)*(mu1-mu2)^2"),
     constraints=eval(substitute(expression({
-        constraints = cm.vgam(rbind(diag(4), c(0,0,1,0)), x, .ESD,
+        constraints = cm.vgam(rbind(diag(4), c(0,0,1,0)), x, .equalsd,
                               constraints, int=TRUE)
         constraints = cm.zero.vgam(constraints, x, .zero, M)
-    }), list(.zero=zero, .ESD=ESD))),
+    }), list(.zero=zero, .equalsd=equalsd))),
     initialize=eval(substitute(expression({
         if(ncol(y <- cbind(y)) != 1)
             stop("the response must be a vector or one-column matrix")
@@ -88,10 +88,10 @@ mix2normal1 = function(lphi="logit",
             sorty = sort(y)
             init.sd1 = rep(if(length(.isd1)) .isd1 else sd(sorty[ind.1]), len=n)
             init.sd2 = rep(if(length(.isd2)) .isd2 else sd(sorty[ind.2]), len=n)
-            if( .ESD ) {
+            if( .equalsd ) {
                 init.sd1 = init.sd2 = (init.sd1 + init.sd2)/2
                 if(!all.equal( .esd1, .esd2 ))
-                    stop("'esd1' and 'esd2' must be equal if ESD=TRUE")
+                    stop("'esd1' and 'esd2' must be equal if equalsd=TRUE")
             }
             etastart = cbind(theta2eta(init.phi, .lphi, earg= .ephi),
                              theta2eta(init.mu1,  .lmu, earg= .emu1),
@@ -101,7 +101,7 @@ mix2normal1 = function(lphi="logit",
         }
     }), list(.lphi=lphi, .lmu=lmu, .iphi=iphi, .imu1=imu1, .imu2=imu2,
              .ephi=ephi, .emu1=emu1, .emu2=emu2, .esd1=esd1, .esd2=esd2,
-             .ESD=ESD,
+             .equalsd=equalsd,
              .lsd=lsd, .isd1=isd1, .isd2=isd2, .qmu=qmu))),
     inverse=eval(substitute(function(eta, extra=NULL){
         phi = eta2theta(eta[,1], link= .lphi, earg= .ephi)
@@ -116,9 +116,9 @@ mix2normal1 = function(lphi="logit",
         misc$earg = list("phi"= .ephi, "mu1"= .emu1,
                          "sd1"= .esd1, "mu2"= .emu2, "sd2"= .esd2)
         misc$expected = TRUE
-        misc$ESD = .ESD
+        misc$equalsd = .equalsd
         misc$nsimEIM = .nsimEIM
-    }), list(.lphi=lphi, .lmu=lmu, .lsd=lsd, .ESD=ESD,
+    }), list(.lphi=lphi, .lmu=lmu, .lsd=lsd, .equalsd=equalsd,
              .ephi=ephi, .emu1=emu1, .emu2=emu2, .esd1=esd1, .esd2=esd2,
              .nsimEIM=nsimEIM ))),
     loglikelihood=eval(substitute(
diff --git a/R/family.nonlinear.q b/R/family.nonlinear.q
index bc42c64..f4fc928 100644
--- a/R/family.nonlinear.q
+++ b/R/family.nonlinear.q
@@ -1,19 +1,17 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
 
 
 
-
-vnonlinear.control <- function(regressor, save.weight=TRUE, ...)
+vnonlinear.control <- function(save.weight=TRUE, ...)
 {
 
 
 
-    list(regressor=regressor,
-         save.weight=as.logical(save.weight)[1])
+    list(save.weight=as.logical(save.weight)[1])
 }
 
 
@@ -28,6 +26,7 @@ micmen <- function(rpar=0.001, divisor=10,
 {
 
 
+
     estimated.dispersion <- dispersion==0
 
     if(mode(link1) != "character" && mode(link1) != "name")
@@ -39,7 +38,7 @@ micmen <- function(rpar=0.001, divisor=10,
 
     new("vglmff",
     blurb=c("Michaelis-Menton regression model\n",
-           "Y_i=theta1 * x_i / (theta2 + x_i) + e_i\n\n",
+           "Y_i = theta1 * u_i / (theta2 + u_i) + e_i\n\n",
            "Links:    ",
            namesof("theta1", link1, earg=earg1), ", ",
            namesof("theta2", link2, earg=earg2),
@@ -59,8 +58,13 @@ micmen <- function(rpar=0.001, divisor=10,
         if(ncol(cbind(y)) != 1)
             stop("response must be a vector or a one-column matrix")
 
-        uvec = control$regressor   # This is the regressor
-        extra$uvec = uvec          # Needed for @inverse
+        if(!length(Xm2))
+            stop("regressor not found")
+        if(ncol(as.matrix(Xm2)) != 1)
+            stop(paste("regressor not found or is not a vector. Use the",
+                 "'form2' argument without an intercept"))
+        Xm2 = as.vector(Xm2) # Make sure
+        extra$Xm2 = Xm2          # Needed for @inverse
 
         predictors.names <-
           c(namesof("theta1", .link1, earg= .earg1, tag=FALSE),
@@ -69,9 +73,9 @@ micmen <- function(rpar=0.001, divisor=10,
         if(length(mustart) || length(coefstart))
             stop("can't handle mustart or coefstart")
         if(!length(etastart)) {
-            index <- (1:n)[uvec>quantile(uvec, prob=.85)]
+            index <- (1:n)[Xm2>quantile(Xm2, prob=.85)]
             init1 <- median(y[index])
-            init2 <- median(init1*uvec/y - uvec)
+            init2 <- median(init1*Xm2/y - Xm2)
 
             if(length(.init1)) init1 = .init1
             if(length(.init2)) init2 = .init2
@@ -80,7 +84,7 @@ micmen <- function(rpar=0.001, divisor=10,
                 rep(theta2eta(init1, .link1, earg= .earg1), len=n),
                 rep(theta2eta(init2, .link2, earg= .earg2), len=n))
         } else {
-            stop("can't handle etastart or mustart")
+            stop("cannot handle etastart or mustart")
         }
 
     }), list(.init1=init1, .init2=init2,
@@ -89,7 +93,7 @@ micmen <- function(rpar=0.001, divisor=10,
     inverse=eval(substitute(function(eta, extra=NULL) {
         theta1 <- eta2theta(eta[,1], .link1, earg= .earg1)
         theta2 <- eta2theta(eta[,2], .link2, earg= .earg2)
-        theta1 * extra$uvec / (theta2 + extra$uvec)
+        theta1 * extra$Xm2 / (theta2 + extra$Xm2)
     }, list(.link1=link1, .link2=link2,
             .earg1=earg1, .earg2=earg2 ))),
     last=eval(substitute(expression({
@@ -99,6 +103,7 @@ micmen <- function(rpar=0.001, divisor=10,
         fit$df.residual <- n - rank   # Not n.big - rank
         fit$df.total <- n             # Not n.big
 
+        extra$Xm2 = NULL             # Regressor is in control$regressor 
         dpar <- .dispersion
         if(!dpar) {
             dpar <- sum(w * (y-mu)^2) / (n - p.big)
@@ -116,7 +121,7 @@ micmen <- function(rpar=0.001, divisor=10,
             rpar = max(rpar / .divisor, 1000 * .Machine$double.eps)
         } else {
             rpar = .rpar
-            d3 = deriv3(~ theta1 * uvec / (theta2 + uvec),
+            d3 = deriv3(~ theta1 * Xm2 / (theta2 + Xm2),
                         c("theta1","theta2"), hessian=FALSE)
         }
 
@@ -126,8 +131,8 @@ micmen <- function(rpar=0.001, divisor=10,
         if(TRUE) {
             dmus.dthetas  = attr(eval(d3), "gradient")
         } else {
-            dmu.dtheta1 <- uvec / (theta2 + uvec)
-            dmu.dtheta2 <- -theta1 * uvec / (uvec + theta2)^2
+            dmu.dtheta1 <- Xm2 / (theta2 + Xm2)
+            dmu.dtheta2 <- -theta1 * Xm2 / (Xm2 + theta2)^2
             dmus.dthetas  = cbind(dmu.dtheta1, dmu.dtheta2)
         }
 
@@ -136,10 +141,10 @@ micmen <- function(rpar=0.001, divisor=10,
 
         if(TRUE) {
             index = iam(NA, NA, M=M, both=TRUE)
-            temp = dmus.dthetas * dthetas.detas
+            temp200809 = dmus.dthetas * dthetas.detas
             if(M>1)
-                temp[,2:M] = temp[,2:M] + sqrt(rpar)
-            w * (y-mu) * temp
+                temp200809[,2:M] = temp200809[,2:M] + sqrt(rpar)
+            w * (y-mu) * temp200809
         } else {
             w * (y-mu) *
             cbind(dmus.dthetas[,1] * dthetas.detas[,1],
diff --git a/R/family.normal.q b/R/family.normal.q
index 2c50d36..d9b587f 100644
--- a/R/family.normal.q
+++ b/R/family.normal.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -119,19 +119,28 @@ gaussianff = function(dispersion=0, parallel=FALSE, zero=NULL)
 
 
 
-dposnorm = function(x, mean=0, sd=1) {
+
+dposnorm = function(x, mean=0, sd=1, log=FALSE) {
+    log.arg = log
+    rm(log)
+    if(!is.logical(log.arg) || length(log.arg)!=1)
+        stop("bad input for argument \"log\"")
     L = max(length(x), length(mean), length(sd))
     x = rep(x, len=L); mean = rep(mean, len=L); sd = rep(sd, len=L);
-    ifelse(x < 0, 0, dnorm(x=x, mean=mean, sd=sd) /
-                     (1-pnorm(q=0, mean=mean, sd=sd)))
+
+    if(log.arg) {
+        ifelse(x < 0, log(0), dnorm(x, m=mean, sd=sd, log=TRUE) -
+               pnorm(mean/sd, log=TRUE))
+    } else {
+        ifelse(x < 0, 0, dnorm(x=x, me=mean, sd=sd) / pnorm(mean/sd))
+    }
 }
 
 pposnorm = function(q, mean=0, sd=1) {
     L = max(length(q), length(mean), length(sd))
     q = rep(q, len=L); mean = rep(mean, len=L); sd = rep(sd, len=L);
     ifelse(q < 0, 0, (pnorm(q=q, mean=mean, sd=sd) -
-                      pnorm(q=0, mean=mean, sd=sd)) /
-                     (1-pnorm(q=0, mean=mean, sd=sd)))
+                      pnorm(q=0, mean=mean, sd=sd)) / pnorm(q= mean/sd))
 }
 
 qposnorm = function(p, mean=0, sd=1) {
@@ -143,22 +152,27 @@ qposnorm = function(p, mean=0, sd=1) {
 rposnorm = function(n, mean=0, sd=1) {
     if(!is.Numeric(n, integ=TRUE, posit=TRUE))
         stop("bad input for argument \"n\"")
-    y = rnorm(n, mean=mean, sd=sd)
     mean = rep(mean, length=n)
     sd = rep(sd, length=n)
-    repeat {
-        index = y < 0
-        if(any(index)) {
-            y[index] = rnorm(n=sum(index), mean=mean[index], sd=sd[index])
-        } else break
-    }
-    y
+    qnorm(p=runif(n, min=pnorm(0, m=mean, sd=sd)), m=mean, sd=sd)
 }
 
-posnormal1 = function(lmean="identity", lsd="loge",
-                      emean=list(), esd=list(),
-                      imean=NULL, isd=NULL, zero=NULL)
+
+
+ posnormal1.control <- function(save.weight=TRUE, ...) {
+    list(save.weight=save.weight)
+}
+
+
+
+
+ posnormal1 = function(lmean="identity", lsd="loge",
+                       emean=list(), esd=list(),
+                       imean=NULL, isd=NULL,
+                       nsimEIM=100, zero=NULL)
 {
+ warning("this VGAM family function is not working properly yet")
+
     if(mode(lmean) != "character" && mode(lmean) != "name")
         lmean = as.character(substitute(lmean))
     if(mode(lsd) != "character" && mode(lsd) != "name")
@@ -169,6 +183,9 @@ posnormal1 = function(lmean="identity", lsd="loge",
         stop("bad input for argument \"isd\"")
     if(!is.list(emean)) emean = list()
     if(!is.list(esd)) esd = list()
+    if(length(nsimEIM))
+        if(!is.Numeric(nsimEIM, allow=1, integ=TRUE) || nsimEIM <= 10)
+            stop("'nsimEIM' should be an integer greater than 10")
 
     new("vglmff",
     blurb=c("Positive (univariate) normal distribution\n\n",
@@ -198,22 +215,22 @@ posnormal1 = function(lmean="identity", lsd="loge",
     inverse=eval(substitute(function(eta, extra=NULL) {
         mymu = eta2theta(eta[,1], .lmean, earg= .emean)
         mysd = eta2theta(eta[,2], .lsd, earg= .esd)
-        mymu + mysd * dnorm(-mymu/mysd) / (1-pnorm(-mymu/mysd))
+        mymu + mysd * dnorm(-mymu/mysd) / pnorm(mymu/mysd)
     }, list( .lmean=lmean, .lsd=lsd, .emean=emean, .esd=esd ))),
     last=eval(substitute(expression({
         misc$link = c("mean"= .lmean, "sd"= .lsd)
         misc$earg = list("mean"= .emean, "sd"= .esd )
         misc$expected = TRUE
-    }), list( .lmean=lmean, .lsd=lsd, .emean=emean, .esd=esd ))),
+        misc$nsimEIM = .nsimEIM
+    }), list( .lmean=lmean, .lsd=lsd, .emean=emean, .esd=esd,
+              .nsimEIM=nsimEIM ))),
     loglikelihood=eval(substitute(
         function(mu,y,w,residuals= FALSE,eta, extra=NULL) {
         mymu = eta2theta(eta[,1], .lmean, earg= .emean)
         mysd = eta2theta(eta[,2], .lsd, earg= .esd)
         if(residuals) stop("loglikelihood residuals not implemented yet") else {
-        if(is.R())
-            sum(w*(dnorm(y, m=mymu, sd=mysd, log=TRUE) -
-                   pnorm(-mymu/mysd, log=TRUE, lower.tail=FALSE))) else
-            sum(w*(-log(mysd)-0.5*((y-mymu)/mysd)^2 -log1p(-pnorm(-mymu/mysd))))
+
+            sum(w * dposnorm(x=y, m=mymu, sd=mysd, log=TRUE))
         }
     }, list( .lmean=lmean, .lsd=lsd, .emean=emean, .esd=esd ))),
     vfamily=c("posnormal1"),
@@ -222,27 +239,52 @@ posnormal1 = function(lmean="identity", lsd="loge",
         mysd = eta2theta(eta[,2], .lsd, earg= .esd)
         zedd = (y-mymu) / mysd
         temp7 = dnorm(-mymu/mysd)
-        temp8 = if(is.R()) pnorm(-mymu/mysd, low=FALSE) else 1-pnorm(-mymu/mysd)
-        temp8 = temp8 * mysd
-        dl.dmu = zedd / mysd - temp7 / temp8
-        dl.dsd = (mymu*temp7/temp8 + zedd^2 - 1) / mysd
+        temp8 = pnorm(mymu/mysd) * mysd
+        dl.dmu = zedd / mysd^2 - temp7 / temp8
+        dl.dsd = (mymu*temp7/temp8 + zedd^3 / mysd - 1) / mysd
         dmu.deta = dtheta.deta(mymu, .lmean, earg= .emean)
         dsd.deta = dtheta.deta(mysd, .lsd, earg= .esd)
-        w * cbind(dl.dmu * dmu.deta,
-                  dl.dsd * dsd.deta)
+        dthetas.detas = cbind(dmu.deta, dsd.deta)
+        w * dthetas.detas * cbind(dl.dmu, dl.dsd)
     }), list( .lmean=lmean, .lsd=lsd, .emean=emean, .esd=esd ))),
     weight=eval(substitute(expression({
-        wz = matrix(as.numeric(NA), n, dimm(M))
-        ed2l.dmu2 = (1 - temp7*mymu/temp8) / mysd^2  - (temp7/temp8)^2
-        ed2l.dmusd = (temp7 /(mysd * temp8)) * (1 + (mymu/mysd)^2 +
-                     mymu*temp7 / temp8)
-        ed2l.dsd2 = 2 / mysd^2  - (temp7 * mymu /(mysd^2 * temp8)) *
-                    (1 + (mymu/mysd)^2 + mymu*temp7/temp8)
-        wz[,iam(1,1,M)] = ed2l.dmu2  * dmu.deta^2
-        wz[,iam(2,2,M)] = ed2l.dsd2  * dsd.deta^2
-        wz[,iam(1,2,M)] = ed2l.dmusd * dsd.deta * dmu.deta
-        w * wz
-    }), list( .lmean=lmean, .lsd=lsd, .emean=emean, .esd=esd ))))
+        run.varcov = 0
+        ind1 = iam(NA, NA, M=M, both=TRUE, diag=TRUE)
+        if(length( .nsimEIM )) {
+            for(ii in 1:( .nsimEIM )) {
+                ysim <- rposnorm(n, m=mymu, sd=mysd)
+                zedd = (ysim-mymu) / mysd
+                temp7 = dnorm(-mymu/mysd)
+                temp8 = pnorm(mymu/mysd) * mysd
+                dl.dmu = zedd / mysd^2 - temp7 / temp8
+                dl.dsd = (mymu*temp7/temp8 + zedd^3 / mysd - 1) / mysd
+
+                rm(ysim)
+                temp3 = matrix(c(dl.dmu, dl.dsd), n, 2)
+                run.varcov = ((ii-1) * run.varcov +
+                           temp3[,ind1$row.index]*temp3[,ind1$col.index]) / ii
+            }
+            wz = if(intercept.only)
+                matrix(apply(run.varcov, 2, mean),
+                       n, ncol(run.varcov), byrow=TRUE) else run.varcov
+
+            wz = wz * dthetas.detas[,ind1$row] * dthetas.detas[,ind1$col]
+            wz = w * matrix(wz, n, dimm(M))
+        } else {
+            wz = matrix(as.numeric(NA), n, dimm(M))
+            ed2l.dmu2 = (1 - temp7*mymu/temp8) / mysd^2  - (temp7/temp8)^2
+            ed2l.dmusd = (temp7 /(mysd * temp8)) * (1 + (mymu/mysd)^2 +
+                         mymu*temp7 / temp8)
+            ed2l.dsd2 = 2 / mysd^2  - (temp7 * mymu /(mysd^2 * temp8)) *
+                        (1 + (mymu/mysd)^2 + mymu*temp7/temp8)
+            wz[,iam(1,1,M)] = ed2l.dmu2  * dmu.deta^2
+            wz[,iam(2,2,M)] = ed2l.dsd2  * dsd.deta^2
+            wz[,iam(1,2,M)] = ed2l.dmusd * dsd.deta * dmu.deta
+            wz = w * wz
+        }
+        wz
+    }), list( .lmean=lmean, .lsd=lsd, .emean=emean, .esd=esd,
+              .nsimEIM=nsimEIM ))))
 }
 
 
diff --git a/R/family.positive.q b/R/family.positive.q
index 36923fc..a661399 100644
--- a/R/family.positive.q
+++ b/R/family.positive.q
@@ -1,21 +1,108 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
 
 
-posnegbinomial = function(lmunb = "loge", lk = "loge",
-                          emunb =list(), ek = list(),
-                          ik = NULL, zero = -2, cutoff = 0.995,
-                          method.init=1)
+
+
+dposnegbin = function(x, size, prob=NULL, munb=NULL, log=FALSE) {
+    if (length(munb)) {
+        if (length(prob))
+            stop("'prob' and 'munb' both specified")
+        prob <- size/(size + munb)
+    }
+    if(!is.logical(log.arg <- log)) stop("bad input for 'log'")
+    rm(log)
+
+    L = max(length(x), length(prob), length(size))
+    x = rep(x, len=L); prob = rep(prob, len=L); size = rep(size, len=L);
+
+    ans = dnbinom(x=x, size=size, prob=prob, log=log.arg)
+    index0 = x==0
+
+    if(log.arg) {
+        ans[ index0] = log(0.0)
+        ans[!index0] = ans[!index0] - log1p(-dnbinom(x=0 * x[!index0],
+                       size=size[!index0], prob=prob[!index0]))
+    } else {
+        ans[ index0] = 0.0
+        ans[!index0] = ans[!index0] / pnbinom(q=0 * x[!index0],
+                       size=size[!index0], prob=prob[!index0], lower.tail=FALSE)
+    }
+    ans
+}
+
+
+pposnegbin = function(q, size, prob=NULL, munb=NULL) {
+    if (length(munb)) {
+        if (length(prob))
+            stop("'prob' and 'munb' both specified")
+        prob <- size/(size + munb)
+    }
+    L = max(length(q), length(prob), length(size))
+    q = rep(q, len=L); prob = rep(prob, len=L); size = rep(size, len=L);
+
+    ifelse(q<1, 0, (pnbinom(q,   size=size, prob=prob) -
+                    dnbinom(q*0, size=size, prob=prob)) / pnbinom(q*0,
+                            size=size, prob=prob, lower.tail = FALSE))
+}
+
+
+qposnegbin = function(p, size, prob=NULL, munb=NULL) {
+    if (length(munb)) {
+        if (length(prob))
+            stop("'prob' and 'munb' both specified")
+        prob <- size/(size + munb)
+    }
+    if(!is.Numeric(p, posit=TRUE) || any(p >= 1))
+        stop("bad input for argument \"p\"")
+    qnbinom(p * pnbinom(q=p*0, size=size, prob=prob, lower.tail = FALSE) +
+            dnbinom(x=p*0, size=size, prob=prob), size=size, prob=prob)
+}
+
+
+rposnegbin = function(n, size, prob=NULL, munb=NULL) {
+    if (length(munb)) {
+        if (length(prob))
+            stop("'prob' and 'munb' both specified")
+        prob <- size/(size + munb)
+    }
+    if(!is.Numeric(n, positive=TRUE, integer=TRUE, allow=1))
+        stop("'n' must be a single positive integer")
+    ans = rnbinom(n, size=size, prob=prob)
+
+    index = (ans == 0)
+    size = rep(size, len=length(ans))
+    prob = rep(prob, len=length(ans))
+    while(any(index)) {
+        more = rnbinom(n=sum(index), size=size[index], prob=prob[index])
+        ans[index] = more
+        index = (ans == 0)
+    }
+    ans
+}
+
+
+
+
+
+
+
+ posnegbinomial = function(lmunb = "loge", lk = "loge",
+                           emunb =list(), ek = list(),
+                           ik = NULL, zero = -2, cutoff = 0.995,
+                           shrinkage.init=0.95, method.init=1)
 {
     if(!is.Numeric(cutoff, allow=1) || cutoff<0.8 || cutoff>=1)
         stop("range error in the argument \"cutoff\"")
     if(!is.Numeric(method.init, allow=1, integ=TRUE, posit=TRUE) ||
-       method.init > 3) stop("argument \"method.init\" must be 1, 2 or 3")
+       method.init > 2) stop("argument \"method.init\" must be 1 or 2")
     if(length(ik) && !is.Numeric(ik, posit=TRUE))
         stop("bad input for argument \"ik\"")
+    if(!is.Numeric(shrinkage.init, allow=1) || shrinkage.init < 0 ||
+       shrinkage.init > 1) stop("bad input for argument \"shrinkage.init\"")
 
     if(mode(lmunb) != "character" && mode(lmunb) != "name")
         lmunb = as.character(substitute(lmunb))
@@ -41,38 +128,38 @@ posnegbinomial = function(lmunb = "loge", lk = "loge",
         y = as.matrix(y) 
         M = 2 * ncol(y) 
         extra$NOS = NOS = ncoly = ncol(y)  # Number of species
-        predictors.names = c(namesof(if(NOS==1) "munb" else
-            paste("munb", 1:NOS, sep=""), .lmunb, earg= .emunb, tag= FALSE),
+        predictors.names = c(
+            namesof(if(NOS==1) "munb" else paste("munb", 1:NOS, sep=""),
+                    .lmunb, earg= .emunb, tag= FALSE),
             namesof(if(NOS==1) "k" else paste("k", 1:NOS, sep=""),
-            .lk, earg= .ek, tag= FALSE))
+                    .lk, earg= .ek, tag= FALSE))
         predictors.names = predictors.names[interleave.VGAM(M, M=2)]
         if(!length(etastart)) {
-            if( .method.init == 3) {
-                mu.init = y + 1/8
-            } else {
-                mu.init = y
-                for(iii in 1:ncol(y))
-                    mu.init[,iii] = if( .method.init == 2)
-                        weighted.mean(y[,iii], w=w) else
-                        median(rep(y[,iii], w)) + 1/8
+            mu.init = y
+            for(iii in 1:ncol(y)) {
+                use.this = if( .method.init == 2) {
+                    weighted.mean(y[,iii], w)
+                } else {
+                    median(y[,iii])
+                }
+                mu.init[,iii] = (1- .sinit) * y[,iii] + .sinit * use.this
             }
+
             if( is.Numeric( .ik )) {
                 kmat0 = matrix( .ik, nr=n, nc=NOS, byrow=TRUE)
             } else {
+                posnegbinomial.Loglikfun =
+                    function(kmat, y, x, w, extraargs) {
+                    munb = extraargs
+                    sum(w * dposnegbin(x=y, size=kmat, munb=munb, log=TRUE))
+                    }
+                k.grid = 2^((-6):6)
                 kmat0 = matrix(0, nr=n, nc=NOS)
-                Loglikfun = function(y, munb, kmat, w) {
-                    p0 = (kmat / (kmat + munb))^kmat
-        sum(w * (y * log(munb/(munb+kmat)) + kmat*log(kmat/(munb+kmat)) +
-                 lgamma(y+kmat) - lgamma(kmat) - lgamma(y+1) - 
-                 (if(is.R()) log1p(-p0) else log1p(-p0)))) }
-
-                k.grid = rvar = 2^((-3):6)
                 for(spp. in 1:NOS) {
-                    for(ii in 1:length(k.grid))
-                        rvar[ii] = Loglikfun(y=y[,spp.], mu=mu.init[,spp.],
-                                             kmat=k.grid[ii], w=w)
-                    try.this = k.grid[rvar == max(rvar)]
-                    kmat0[,spp.] = try.this
+                    kmat0[,spp.] = getMaxMin(k.grid,
+                                      objfun=posnegbinomial.Loglikfun,
+                                      y=y[,spp.], x=x, w=w,
+                                      extraargs= mu.init[,spp.])
                 }
             }
             p00 = (kmat0 / (kmat0 + mu.init))^kmat0
@@ -82,6 +169,7 @@ posnegbinomial = function(lmunb = "loge", lk = "loge",
         }
     }), list( .lmunb=lmunb, .lk=lk, .ik=ik,
               .emunb=emunb, .ek=ek,
+              .sinit=shrinkage.init,
               .method.init=method.init ))),
     inverse=eval(substitute(function(eta, extra=NULL) {
         NOS = ncol(eta) / 2
@@ -113,11 +201,10 @@ posnegbinomial = function(lmunb = "loge", lk = "loge",
         NOS = ncol(eta) / 2
         munb = eta2theta(eta[,2*(1:NOS)-1,drop=FALSE], .lmunb, earg= .emunb )
         kmat = eta2theta(eta[,2*(1:NOS),drop=FALSE], .lk, earg= .ek )
-        p0 = (kmat / (kmat + munb))^kmat
-        if(residuals) stop("loglikelihood residuals not implemented yet") else
-        sum(w * (y * log(munb/(munb+kmat)) + kmat*log(kmat/(munb+kmat)) +
-                 lgamma(y+kmat) - lgamma(kmat) - lgamma(y+1) -
-                 (if(is.R()) log1p(-p0) else log1p(-p0))))
+        if(residuals) stop("loglikelihood residuals not implemented yet") else {
+            sum(w * dposnegbin(x=y, size=kmat, munb=munb, log=TRUE))
+        }
+
     }, list( .lmunb=lmunb, .lk=lk,
              .emunb=emunb, .ek=ek ))),
     vfamily=c("posnegbinomial"),
@@ -176,12 +263,20 @@ posnegbinomial = function(lmunb = "loge", lk = "loge",
 
 
 
-dpospois = function(x, lambda) {
+
+
+dpospois = function(x, lambda, log=FALSE) {
+    if(!is.logical(log.arg <- log)) stop("bad input for 'log'")
+    rm(log)
     if(!is.Numeric(lambda, posit=TRUE))
         stop("bad input for argument \"lambda\"")
     L = max(length(x), length(lambda))
     x = rep(x, len=L); lambda = rep(lambda, len=L); 
-    ans = ifelse(x==0, 0, -dpois(x, lambda) / expm1(-lambda))
+    ans = if(log.arg) {
+        ifelse(x==0, log(0.0), dpois(x, lambda, log=TRUE) - log1p(-exp(-lambda)))
+    } else {
+        ifelse(x==0, 0, -dpois(x, lambda) / expm1(-lambda))
+    }
     ans
 }
 
@@ -210,11 +305,11 @@ rpospois = function(n, lambda) {
         stop("bad input for argument \"lambda\"")
     ans = rpois(n, lambda)
     lambda = rep(lambda, len=n)
-    index = ans == 0
+    index = (ans == 0)
     while(any(index)) {
         more = rpois(sum(index), lambda[index])
         ans[index] = more
-        index = ans == 0
+        index = (ans == 0)
     }
     ans
 }
@@ -222,8 +317,8 @@ rpospois = function(n, lambda) {
 
 
 
-pospoisson = function(link="loge", earg=list(), expected=TRUE,
-                      ilambda=NULL, method.init=1)
+ pospoisson = function(link="loge", earg=list(), expected=TRUE,
+                       ilambda=NULL, method.init=1)
 {
     if(!missing(link))
         link = as.character(substitute(link))
@@ -233,7 +328,7 @@ pospoisson = function(link="loge", earg=list(), expected=TRUE,
     if(length( ilambda) && !is.Numeric(ilambda, posit=TRUE))
         stop("bad input for argument \"ilambda\"")
     if(!is.Numeric(method.init, allow=1, integ=TRUE, posit=TRUE) ||
-       method.init > 2) stop("argument \"method.init\" must be 1 or 2")
+       method.init > 3) stop("argument \"method.init\" must be 1 or 2 or 3")
 
     new("vglmff",
     blurb=c("Positive-Poisson distribution\n\n",
@@ -242,18 +337,27 @@ pospoisson = function(link="loge", earg=list(), expected=TRUE,
            "\n"),
     initialize=eval(substitute(expression({
         y = as.matrix(y)
+        if(any(y < 1))
+            stop("all y values must be in 1,2,3,...")
+        if(any(y != round(y )))
+            stop("the response must be integer-valued")
+
         predictors.names = namesof(if(ncol(y)==1) "lambda"
             else paste("lambda", 1:ncol(y), sep=""), .link,
             earg= .earg, tag=FALSE)
         if( .method.init == 1) {
-            lambda.init = apply(y, 2, weighted.mean, w=w)
+            lambda.init = apply(y, 2, median) + 1/8
+            lambda.init = matrix(lambda.init, n, ncol(y), byrow=TRUE)
+        } else if( .method.init == 2) {
+            lambda.init = apply(y, 2, weighted.mean, w=w) + 1/8
             lambda.init = matrix(lambda.init, n, ncol(y), byrow=TRUE)
         } else {
             lambda.init = -y / expm1(-y)
         }
+        if(length( .ilambda))
+            lambda.init = lambda.init*0 + .ilambda
         if(!length(etastart))
-            etastart = theta2eta(if(length( .ilambda)) (y*0 + .ilambda) else
-                lambda.init, .link, earg= .earg)
+            etastart = theta2eta(lambda.init, .link, earg= .earg)
     }), list( .link=link, .earg= earg,
               .ilambda=ilambda, .method.init=method.init ))),
     inverse=eval(substitute(function(eta, extra=NULL) {
@@ -272,8 +376,9 @@ pospoisson = function(link="loge", earg=list(), expected=TRUE,
     loglikelihood=eval(substitute(
         function(mu,y,w,residuals=FALSE, eta,extra=NULL) {
         lambda = eta2theta(eta, .link, earg= .earg ) 
-        if(residuals) stop("loglikelihood residuals not implemented yet") else
-        sum(w * (y*log(lambda) - log1p(-exp(-lambda)) - lambda))
+        if(residuals) stop("loglikelihood residuals not implemented yet") else {
+            sum(w * dpospois(x=y, lambda=lambda, log=TRUE))
+        }
     }, list( .link=link, .earg= earg ))),
     vfamily=c("pospoisson"),
     deriv=eval(substitute(expression({
@@ -298,8 +403,8 @@ pospoisson = function(link="loge", earg=list(), expected=TRUE,
 
 
 
-posbinomial = function(link="logit", earg=list())
-{
+
+ posbinomial = function(link="logit", earg=list()) {
 
     if(!missing(link))
         link = as.character(substitute(link))
@@ -311,14 +416,20 @@ posbinomial = function(link="logit", earg=list())
            namesof("p", link, earg= earg, tag=FALSE), "\n"),
     initialize=eval(substitute(expression({
       	eval(binomialff(link= .link)@initialize)
+        yint = round(y*w)
+        if(max(abs(yint - y*w)) > 0.0001)
+            warning("rounding y*w to an integer")
+        if(any(y <= 0))
+            stop("the response must only contain positive values")
         predictors.names = namesof("p", .link, earg= .earg , tag=FALSE)
 	if(length(extra)) extra$w = w else extra = list(w=w)
         if(!length(etastart))
 	    etastart = cbind(theta2eta(mustart, .link, earg= .earg ))
     }), list( .link = link, .earg=earg ))),
-    inverse=eval(substitute(function(eta, extra=NULL){
-        theta = eta2theta(eta, .link, earg= .earg )
-        theta/(1-(1-theta)^(extra$w))},
+    inverse=eval(substitute(function(eta, extra=NULL) {
+        mymu = eta2theta(eta, .link, earg= .earg )
+        mymu / (1-(1-mymu)^(extra$w))
+    },
     list(.link=link, .earg=earg ))),
     last=eval(substitute(expression({
         extra$w = NULL   # Kill it off 
@@ -327,27 +438,32 @@ posbinomial = function(link="logit", earg=list())
     }), list( .link=link, .earg=earg ))),
     loglikelihood=eval(substitute(
         function(mu,y,w,residuals=FALSE,eta,extra=NULL) {
-        yi = round(y*w)
-        theta = eta2theta(eta, .link, earg= .earg )
-        if(residuals) stop("loglikelihood residuals not implemented yet") else
-        sum(yi*log(theta)+(w-yi)*log1p(-theta)-log1p(-(1-theta)^w))
+        yint = round(y*w)
+        mymu = eta2theta(eta, .link, earg= .earg )
+        if(max(abs(w - round(w))) > 0.0001) {
+            warning("rounding w to an integer")
+            w = round(w)
+        }
+        if(residuals) stop("loglikelihood residuals not implemented yet") else {
+            sum(w * dposbinom(x=yint, size=w, prob=mymu, log=TRUE))
+        }
     }, list( .link=link, .earg=earg ))),
     vfamily=c("posbinomial"),
     deriv=eval(substitute(expression({
-        yi = round(y*w)     
-        theta = eta2theta(eta, .link, earg= .earg )
-        dldtheta = yi/theta-(w-yi)/(1-theta)-w*(1-theta)^(w-1) /
-                    (1-(1-theta)^w)
-        dthetadeta = dtheta.deta(theta, .link, earg= .earg )
-        dldtheta * dthetadeta
+        yint = round(y*w)     
+        mymu = eta2theta(eta, .link, earg= .earg )
+        dl.dmymu = yint/mymu - (w-yint)/(1-mymu) -
+                   w*(1-mymu)^(w-1) / (1-(1-mymu)^w)
+        dmymu.deta = dtheta.deta(mymu, .link, earg= .earg )
+        dl.dmymu * dmymu.deta
     }), list( .link=link, .earg=earg ))),
     weight=eval(substitute(expression({
-        temp = 1 - (1-theta)^w
-        temp2 = (1-theta)^2
-        ed2ldtheta2 = -w/(theta*temp) - w/temp2 + w*theta/(temp2*temp) +
-            w*(w-1)* (1-theta)^(w-2) /temp +
+        temp = 1 - (1-mymu)^w
+        temp2 = (1-mymu)^2
+        ed2l.dmymu2 = -w/(mymu*temp) - w/temp2 + w*mymu/(temp2*temp) +
+            w * (w-1) * (1-mymu)^(w-2) /temp +
             w^2 * temp2^(w-1) / temp^2
-        wz = -(dthetadeta^2) * ed2ldtheta2
+        wz = -(dmymu.deta^2) * ed2l.dmymu2
         wz
     }), list( .link=link, .earg=earg ))))
 }
@@ -355,14 +471,25 @@ posbinomial = function(link="logit", earg=list())
 
 
 dposbinom = function(x, size, prob, log = FALSE) {
-    if(!is.Numeric(prob, positive=TRUE)) 
-        stop("no zero or non-numeric values allowed for argument \"prob\"")
+    log.arg = log
+    rm(log)
     L = max(length(x), length(size), length(prob))
     x = rep(x, len=L); size = rep(size, len=L); prob = rep(prob, len=L);
-    ifelse(x==0, 0, dbinom(x=x, size=size, prob=prob, log=log) /
-          (1 - (1-prob)^size))
-}
 
+    answer = NaN * x
+    is0 <- (x == 0)
+    ok2 <- prob > 0 & prob <= 1 & size == round(size) & size > 0
+    answer = dbinom(x=x,   size=size, prob=prob, log=TRUE) -
+             log1p(-dbinom(x=0*x, size=size, prob=prob))
+    answer[!ok2] = NaN
+    if(log.arg) {
+        answer[is0 & ok2]  = log(0.0)
+    } else {
+        answer = exp(answer)
+        answer[is0 & ok2] = 0.0
+    }
+    answer
+}
 
 pposbinom = function(q, size, prob, lower.tail = TRUE, log.p = FALSE) {
     if(!is.Numeric(prob, positive=TRUE)) 
@@ -382,20 +509,19 @@ qposbinom = function(p, size, prob, lower.tail = TRUE, log.p = FALSE) {
            lower.tail=lower.tail, log.p=log.p)
 }
 
-
 rposbinom = function(n, size, prob) {
     if(!is.Numeric(n, posit=TRUE, allow=1, integ=TRUE))
         stop("bad input for argument \"n\"")
     if(!is.Numeric(prob, positive=TRUE)) 
         stop("no zero or non-numeric values allowed for argument \"prob\"")
     ans = rbinom(n=n, size=size, prob=prob)
-    index = ans == 0
+    index = (ans == 0)
     size = rep(size, len=length(ans))
     prob = rep(prob, len=length(ans))
     while(any(index)) {
         more = rbinom(n=sum(index), size[index], prob=prob[index])
         ans[index] = more
-        index = ans == 0
+        index = (ans == 0)
     }
     ans
 }
diff --git a/R/family.qreg.q b/R/family.qreg.q
index df8db5b..e299857 100644
--- a/R/family.qreg.q
+++ b/R/family.qreg.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -21,29 +21,37 @@ lms.yjn.control <- function(trace=TRUE, ...)
 
 
 lms.bcn <- function(percentiles=c(25,50,75),
-                    zero=NULL,
-                    link.mu="identity",
-                    link.sigma="loge",
-                    emu=list(), esigma=list(),
+                    zero=c(1,3),
+                    llambda="identity",
+                    lmu="identity",
+                    lsigma="loge",
+                    elambda=list(), emu=list(), esigma=list(),
                     dfmu.init=4,
                     dfsigma.init=2,
-                    init.lambda=1,
-                    init.sigma=NULL)
+                    ilambda=1,
+                    isigma=NULL)
 {
-    if(mode(link.sigma) != "character" && mode(link.sigma) != "name")
-        link.sigma = as.character(substitute(link.sigma))
-    if(mode(link.mu) != "character" && mode(link.mu) != "name")
-        link.mu = as.character(substitute(link.mu))
+    if(mode(llambda) != "character" && mode(llambda) != "name")
+        llambda = as.character(substitute(llambda))
+    if(mode(lmu) != "character" && mode(lmu) != "name")
+        lmu = as.character(substitute(lmu))
+    if(mode(lsigma) != "character" && mode(lsigma) != "name")
+        lsigma = as.character(substitute(lsigma))
+    if(!is.list(elambda)) elambda = list()
     if(!is.list(emu)) emu = list()
     if(!is.list(esigma)) esigma = list()
+    if(!is.Numeric(ilambda))
+        stop("bad input for argument 'ilambda'")
+    if(length(isigma) && !is.Numeric(isigma, posit=TRUE))
+        stop("bad input for argument 'isigma'")
 
     new("vglmff",
         blurb=c("LMS Quantile Regression ",
                 "(Box-Cox transformation to normality)\n",
             "Links:    ",
-            "lambda", ", ",
-            namesof("mu", link=link.mu, earg= emu), ", ",
-            namesof("sigma", link=link.sigma, earg= esigma)),
+            namesof("lambda", link=llambda, earg= elambda), ", ",
+            namesof("mu", link=lmu, earg= emu), ", ",
+            namesof("sigma", link=lsigma, earg= esigma)),
     constraints=eval(substitute(expression({
         constraints = cm.zero.vgam(constraints, x, .zero, M)
     }), list(.zero=zero))),
@@ -54,17 +62,17 @@ lms.bcn <- function(percentiles=c(25,50,75),
             stop("negative responses not allowed")
 
         predictors.names =
-            c(namesof("lambda", "identity"),
-              namesof("mu",  .link.mu, earg= .emu,  short= TRUE),
-              namesof("sigma",  .link.sigma, earg= .esigma,  short= TRUE))
+            c(namesof("lambda", .llambda, earg= .elambda,  short= TRUE),
+              namesof("mu",  .lmu, earg= .emu,  short= TRUE),
+              namesof("sigma",  .lsigma, earg= .esigma,  short= TRUE))
  
         if(!length(etastart)) {
 
             fit500=vsmooth.spline(x=x[,min(ncol(x),2)],y=y,w=w, df= .dfmu.init)
             fv.init = c(predict(fit500, x=x[,min(ncol(x),2)])$y)
 
-            lambda.init = if(is.Numeric( .init.lambda)) .init.lambda else 1.0
-            sigma.init = if(is.null(.init.sigma)) {
+            lambda.init = if(is.Numeric( .ilambda)) .ilambda else 1.0
+            sigma.init = if(is.null(.isigma)) {
                 myratio = ((y/fv.init)^lambda.init - 1) / lambda.init
                 if(is.Numeric( .dfsigma.init)) {
                     fit600 = vsmooth.spline(x=x[,min(ncol(x),2)], y=myratio^2,
@@ -72,113 +80,112 @@ lms.bcn <- function(percentiles=c(25,50,75),
                     sqrt(c(abs(predict(fit600, x=x[,min(ncol(x),2)])$y)))
                 } else 
                     sqrt(var(myratio))
-            } else .init.sigma
+            } else .isigma
  
-            etastart = cbind(lambda.init,
-                              theta2eta(fv.init, .link.mu, earg= .emu),
-                              theta2eta(sigma.init,  .link.sigma, earg= .esigma))
+            etastart = cbind(theta2eta(lambda.init, .llambda, earg= .elambda),
+                             theta2eta(fv.init,     .lmu, earg= .emu),
+                             theta2eta(sigma.init,  .lsigma, earg= .esigma))
         }
-    }), list(.link.sigma=link.sigma,
-             .link.mu=link.mu,
-             .esigma=esigma, .emu=emu,
-             .dfmu.init=dfmu.init,
-             .dfsigma.init=dfsigma.init,
-             .init.lambda=init.lambda,
-             .init.sigma=init.sigma))),
+    }), list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+              .elambda=elambda, .emu=emu, .esigma=esigma, 
+              .dfmu.init=dfmu.init,
+              .dfsigma.init=dfsigma.init,
+              .ilambda=ilambda, .isigma=isigma ))),
     inverse=eval(substitute(function(eta, extra=NULL) {
-        eta[,2] = eta2theta(eta[,2], .link.mu, earg= .emu)
-        eta[,3] = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+        eta[,1] = eta2theta(eta[,1], .llambda, earg= .elambda)
+        eta[,2] = eta2theta(eta[,2], .lmu, earg= .emu)
+        eta[,3] = eta2theta(eta[,3], .lsigma, earg= .esigma)
         qtplot.lms.bcn(percentiles= .percentiles, eta=eta)
-    }, list(.percentiles=percentiles,
-            .link.mu=link.mu,
-            .esigma=esigma, .emu=emu,
-            .link.sigma=link.sigma))),
+    }, list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+             .elambda=elambda, .emu=emu, .esigma=esigma, 
+             .percentiles=percentiles ))),
     last=eval(substitute(expression({
         misc$percentiles = .percentiles
-        misc$links = c(lambda = "identity", mu = .link.mu, sigma = .link.sigma)
-        misc$earg = list(lambda = list(), mu = .emu, sigma = .esigma)
+        misc$links = c(lambda = .llambda, mu = .lmu, sigma = .lsigma)
+        misc$earg = list(lambda = .elambda, mu = .emu, sigma = .esigma)
         misc$true.mu = FALSE    # $fitted is not a true mu
         if(control$cdf) {
             post$cdf = cdf.lms.bcn(y, eta0=matrix(c(lambda,mymu,sigma), 
                 ncol=3, dimnames=list(dimnames(x)[[1]], NULL)))
         }
-    }), list(.percentiles=percentiles,
-            .link.mu=link.mu,
-            .esigma=esigma, .emu=emu,
-            .link.sigma=link.sigma))),
+    }), list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+              .elambda=elambda, .emu=emu, .esigma=esigma, 
+              .percentiles=percentiles ))),
     loglikelihood=eval(substitute(
         function(mu,y,w, residuals= FALSE, eta, extra=NULL) {
-            lambda = eta[,1]
-            mu = eta2theta(eta[,2], .link.mu, earg= .emu)
-            sigma = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+            lambda = eta2theta(eta[,1], .llambda, earg= .elambda)
+            mu = eta2theta(eta[,2], .lmu, earg= .emu)
+            sigma = eta2theta(eta[,3], .lsigma, earg= .esigma)
             z = ((y/mu)^lambda - 1) / (lambda * sigma)
          if(residuals) stop("loglikelihood residuals not implemented yet") else
             sum(w * (lambda * log(y/mu) - log(sigma) - 0.5*z^2))
-        }, list(.link.sigma=link.sigma,
-                .esigma=esigma, .emu=emu,
-                .link.mu=link.mu))),
+        }, list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+                 .elambda=elambda, .emu=emu, .esigma=esigma ))),
     vfamily=c("lms.bcn", "lmscreg"),
     deriv=eval(substitute(expression({
-        lambda = eta[,1]
-        mymu = eta2theta(eta[,2], .link.mu, earg= .emu)
-        sigma = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+        lambda = eta2theta(eta[,1], .llambda, earg= .elambda)
+        mymu   = eta2theta(eta[,2], .lmu, earg= .emu)
+        sigma  = eta2theta(eta[,3], .lsigma, earg= .esigma)
         z = ((y/mymu)^lambda - 1) / (lambda * sigma)
         z2m1 = z * z - 1
-        d1 = z*(z - log(y/mymu) / sigma) / lambda - z2m1 * log(y/mymu)
-        d2 = z / (mymu * sigma) + z2m1 * lambda / mymu
-        d2 = d2 * dtheta.deta(mymu, .link.mu, earg= .emu)
-        d3 = z2m1 / sigma
-        d3 = d3 * dtheta.deta(sigma, .link.sigma, earg= .esigma)
-        w * cbind(d1, d2, d3)
-    }), list(.link.sigma=link.sigma, .link.mu=link.mu,
-             .esigma=esigma, .emu=emu ))),
+        dl.dlambda = z*(z - log(y/mymu) / sigma) / lambda - z2m1 * log(y/mymu)
+        dl.dmu = z / (mymu * sigma) + z2m1 * lambda / mymu
+        dl.dsigma = z2m1 / sigma
+        dlambda.deta  = dtheta.deta(lambda, .llambda, earg= .elambda)
+        dmu.deta  = dtheta.deta(mymu, .lmu, earg= .emu)
+        dsigma.deta = dtheta.deta(sigma, .lsigma, earg= .esigma)
+        w * cbind(dl.dlambda * dlambda.deta,
+                  dl.dmu * dmu.deta,
+                  dl.dsigma * dsigma.deta)
+    }), list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+              .elambda=elambda, .emu=emu, .esigma=esigma ))),
     weight=eval(substitute(expression({
         wz = matrix(as.numeric(NA), n, 6)
-        wz[,iam(1,1,M)] = (7 * sigma^2 / 4)
-        wz[,iam(2,2,M)] = (1 + 2*(lambda * sigma)^2) / (mymu*sigma)^2 *
-                           dtheta.deta(mymu, .link.mu, earg= .emu)^2
-        wz[,iam(3,3,M)] = (2 / sigma^2) *
-                           dtheta.deta(sigma, .link.sigma, earg= .esigma)^2
-        wz[,iam(1,2,M)] = (-1 / (2 * mymu)) *
-                           dtheta.deta(mymu, .link.mu, earg= .emu)
-        wz[,iam(1,3,M)] = (lambda * sigma) *
-                           dtheta.deta(sigma, .link.sigma, earg= .esigma)
-        wz[,iam(2,3,M)] = (2 * lambda / (mymu * sigma)) *
-                           dtheta.deta(sigma, .link.sigma, earg= .esigma) *
-                           dtheta.deta(mymu, .link.mu, earg= .emu)
+        wz[,iam(1,1,M)] = (7 * sigma^2 / 4) * dlambda.deta^2
+        wz[,iam(2,2,M)] = (1 + 2*(lambda*sigma)^2)/(mymu*sigma)^2 * dmu.deta^2
+        wz[,iam(3,3,M)] = (2 / sigma^2) * dsigma.deta^2
+        wz[,iam(1,2,M)] = (-1 / (2 * mymu)) * dlambda.deta * dmu.deta
+        wz[,iam(1,3,M)] = (lambda * sigma) * dlambda.deta * dsigma.deta
+        wz[,iam(2,3,M)] = (2*lambda/(mymu * sigma)) * dmu.deta * dsigma.deta
         wz * w
-    }), list(.link.sigma=link.sigma, .link.mu=link.mu,
-             .esigma=esigma, .emu=emu ))))
+    }), list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+              .elambda=elambda, .emu=emu, .esigma=esigma ))))
 }
 
 
 
 lms.bcg = function(percentiles=c(25,50,75),
-                          zero=NULL,
-                          link.mu="identity",
-                          link.sigma="loge",
-                          emu=list(), esigma=list(),
-                          dfmu.init=4,
-                          dfsigma.init=2,
-                          init.lambda=1,
-                          init.sigma=NULL)
+                   zero=c(1,3),
+                   llambda="identity",
+                   lmu="identity",
+                   lsigma="loge",
+                   elambda=list(), emu=list(), esigma=list(),
+                   dfmu.init=4,
+                   dfsigma.init=2,
+                   ilambda=1,
+                   isigma=NULL)
 {
-    if(mode(link.sigma) != "character" && mode(link.sigma) != "name")
-        link.sigma = as.character(substitute(link.sigma))
-    if(mode(link.mu) != "character" && mode(link.mu) != "name")
-        link.mu = as.character(substitute(link.mu))
+    if(mode(llambda) != "character" && mode(llambda) != "name")
+        llambda = as.character(substitute(llambda))
+    if(mode(lmu) != "character" && mode(lmu) != "name")
+        lmu = as.character(substitute(lmu))
+    if(mode(lsigma) != "character" && mode(lsigma) != "name")
+        lsigma = as.character(substitute(lsigma))
+    if(!is.list(elambda)) elambda = list()
     if(!is.list(emu)) emu = list()
     if(!is.list(esigma)) esigma = list()
+    if(!is.Numeric(ilambda))
+        stop("bad input for argument 'ilambda'")
+    if(length(isigma) && !is.Numeric(isigma, posit=TRUE))
+        stop("bad input for argument 'isigma'")
 
     new("vglmff",
     blurb=c("LMS Quantile Regression ",
             "(Box-Cox transformation to a Gamma distribution)\n",
             "Links:    ",
-            "lambda",
-            ", ",
-            namesof("mu", link=link.mu, earg= emu),
-            ", ",
-            namesof("sigma", link=link.sigma, earg= esigma)),
+            namesof("lambda", link=llambda, earg= elambda), ", ",
+            namesof("mu", link=lmu, earg= emu), ", ",
+            namesof("sigma", link=lsigma, earg= esigma)),
     constraints=eval(substitute(expression({
         constraints = cm.zero.vgam(constraints, x, .zero, M)
     }), list(.zero=zero))),
@@ -188,18 +195,19 @@ lms.bcg = function(percentiles=c(25,50,75),
       if(any(y<0, na.rm = TRUE))
             stop("negative responses not allowed")
 
-        predictors.names = c(namesof("lambda", "identity"),
-            namesof("mu",  .link.mu, earg= .emu,  short=TRUE),
-            namesof("sigma",  .link.sigma, earg= .esigma, short=TRUE))
+        predictors.names = c(
+            namesof("lambda", .llambda, earg= .elambda,  short=TRUE),
+            namesof("mu",     .lmu, earg= .emu,  short=TRUE),
+            namesof("sigma",  .lsigma, earg= .esigma, short=TRUE))
 
         if(!length(etastart)) {
 
             fit500=vsmooth.spline(x=x[,min(ncol(x),2)],y=y,w=w, df= .dfmu.init)
             fv.init = c(predict(fit500, x=x[,min(ncol(x),2)])$y)
 
-            lambda.init = if(is.Numeric( .init.lambda)) .init.lambda else 1.0
+            lambda.init = if(is.Numeric( .ilambda)) .ilambda else 1.0
 
-            sigma.init = if(is.null(.init.sigma)) {
+            sigma.init = if(is.null(.isigma)) {
                myratio=((y/fv.init)^lambda.init-1)/lambda.init #~(0,var=sigma^2)
                 if(is.numeric( .dfsigma.init) && is.finite( .dfsigma.init)) {
                     fit600 = vsmooth.spline(x=x[,min(ncol(x),2)],
@@ -208,100 +216,97 @@ lms.bcg = function(percentiles=c(25,50,75),
                     sqrt(c(abs(predict(fit600, x=x[,min(ncol(x),2)])$y)))
                 } else 
                     sqrt(var(myratio))
-            } else .init.sigma
+            } else .isigma
 
-            etastart = cbind(lambda.init,
-                             theta2eta(fv.init,  .link.mu, earg= .emu),
-                             theta2eta(sigma.init,  .link.sigma, earg= .esigma))
+            etastart = cbind(theta2eta(lambda.init,  .llambda, earg= .elambda),
+                             theta2eta(fv.init,      .lmu, earg= .emu),
+                             theta2eta(sigma.init,   .lsigma, earg= .esigma))
         }
-    }), list(.link.sigma=link.sigma,
-             .link.mu=link.mu,
-             .esigma=esigma, .emu=emu,
-             .dfmu.init=dfmu.init,
-             .dfsigma.init=dfsigma.init,
-             .init.lambda=init.lambda,
-             .init.sigma=init.sigma))),
+    }), list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+              .elambda=elambda, .emu=emu, .esigma=esigma, 
+              .dfmu.init=dfmu.init,
+              .dfsigma.init=dfsigma.init,
+              .ilambda=ilambda, .isigma=isigma ))),
     inverse=eval(substitute(function(eta, extra=NULL) {
-        eta[,2] = eta2theta(eta[,2], .link.mu, earg= .emu)
-        eta[,3] = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+        eta[,1] = eta2theta(eta[,1], .llambda, earg= .elambda)
+        eta[,2] = eta2theta(eta[,2], .lmu, earg= .emu)
+        eta[,3] = eta2theta(eta[,3], .lsigma, earg= .esigma)
         qtplot.lms.bcg(percentiles= .percentiles, eta=eta)
-    }, list(.percentiles=percentiles,
-            .link.mu=link.mu,
-            .esigma=esigma, .emu=emu,
-            .link.sigma=link.sigma))),
+    }, list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+             .elambda=elambda, .emu=emu, .esigma=esigma, 
+             .percentiles=percentiles ))),
     last=eval(substitute(expression({
         misc$percentiles = .percentiles
-        misc$link = c(lambda = "identity", mu = .link.mu, sigma = .link.sigma)
-        misc$earg = list(lambda = list(), mu = .emu, sigma = .esigma)
+        misc$link = c(lambda = .llambda, mu = .lmu, sigma = .lsigma)
+        misc$earg = list(lambda = .elambda, mu = .emu, sigma = .esigma)
         misc$true.mu = FALSE    # $fitted is not a true mu
         if(control$cdf) {
             post$cdf = cdf.lms.bcg(y, eta0=matrix(c(lambda,mymu,sigma), 
                 ncol=3, dimnames=list(dimnames(x)[[1]], NULL)))
         }
-    }), list(.percentiles=percentiles,
-            .link.mu=link.mu,
-             .esigma=esigma, .emu=emu,
-            .link.sigma=link.sigma))),
+    }), list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+              .elambda=elambda, .emu=emu, .esigma=esigma, 
+              .percentiles=percentiles ))),
     loglikelihood=eval(substitute(
         function(mu,y,w, residuals= FALSE, eta, extra=NULL) {
-            lambda = eta[,1]
-            mu = eta2theta(eta[,2], .link.mu, earg= .emu)
-            sigma = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+            lambda = eta2theta(eta[,1], .llambda, earg= .elambda)
+            mu = eta2theta(eta[,2], .lmu, earg= .emu)
+            sigma = eta2theta(eta[,3], .lsigma, earg= .esigma)
             g = (y/mu)^lambda
             theta = 1 / (sigma * lambda)^2
          if(residuals) stop("loglikelihood residuals not implemented yet") else
             sum(w * (log(abs(lambda)) + theta*(log(theta)+log(g)-g) - 
                      lgamma(theta) - log(y)))
-        }, list(.link.sigma=link.sigma,
-                .esigma=esigma, .emu=emu,
-                .link.mu=link.mu))),
+        }, list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+                 .elambda=elambda, .emu=emu, .esigma=esigma ))),
     vfamily=c("lms.bcg", "lmscreg"),
     deriv=eval(substitute(expression({
-        lambda = eta[,1]
-        mymu = eta2theta(eta[,2], .link.mu, earg= .emu)
-        sigma = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+        lambda = eta2theta(eta[,1], .llambda, earg= .elambda)
+        mymu = eta2theta(eta[,2], .lmu, earg= .emu)
+        sigma = eta2theta(eta[,3], .lsigma, earg= .esigma)
 
         g = (y/mymu)^lambda
         theta = 1 / (sigma * lambda)^2
         dd = digamma(theta)
 
-        dl.dlambda = (1 + 2*theta*(dd+g-1-log(theta) -
-                      0.5 * (g+1)*log(g))) / lambda
+        dl.dlambda = (1 + 2*theta*(dd+g-1-log(theta)-0.5*(g+1)*log(g)))/lambda
         dl.dmu = lambda * theta * (g-1) / mymu
         dl.dsigma = 2*theta*(dd+g-log(theta * g)-1) / sigma
-        dsigma.deta = dtheta.deta(sigma, link=.link.sigma, earg= .esigma)
+        dlambda.deta = dtheta.deta(lambda, link=.llambda, earg= .elambda)
+        dmu.deta = dtheta.deta(mymu, link=.lmu, earg= .emu)
+        dsigma.deta = dtheta.deta(sigma, link=.lsigma, earg= .esigma)
 
-        cbind(dl.dlambda,
-              dl.dmu * dtheta.deta(mymu, link= .link.mu, earg= .emu),
-              dl.dsigma * dsigma.deta) * w
-    }), list(.link.sigma=link.sigma, .link.mu=link.mu,
-             .esigma=esigma, .emu=emu ))),
+        cbind(dl.dlambda * dlambda.deta,
+              dl.dmu     * dmu.deta,
+              dl.dsigma  * dsigma.deta) * w
+    }), list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+              .elambda=elambda, .emu=emu, .esigma=esigma ))),
     weight=eval(substitute(expression({
-        tt = trigamma(theta)
- 
+        tritheta = trigamma(theta)
         wz = matrix(0, n, 6)
 
         if(TRUE) {
             part2 = dd + 2/theta - 2*log(theta)
-            wz[,iam(1,1,M)] = (1 + theta*(tt*(1+4*theta) - 4*(1+1/theta) -
-                log(theta)*(2/theta - log(theta)) + dd*part2)) / lambda^2
+            wz[,iam(1,1,M)] = ((1 + theta*(tritheta*(1+4*theta) -
+                               4*(1+1/theta) - log(theta)*(2/theta -
+                               log(theta)) + dd*part2)) / lambda^2) *
+                              dlambda.deta^2
         } else {
             temp = mean( g*(log(g))^2 )
-            wz[,iam(1,1,M)] = (4*theta*(theta*tt-1) -1+ theta*temp)/lambda^2
+            wz[,iam(1,1,M)] = ((4*theta*(theta*tritheta-1) -1 +
+                               theta*temp)/lambda^2) *
+                              dlambda.deta^2
         }
 
-        wz[,iam(2,2,M)] = 1 / (mymu*sigma)^2  *
-                           dtheta.deta(mymu, .link.mu, earg= .emu)^2
-        wz[,iam(3,3,M)] = (4*theta*(theta*tt-1) / sigma^2) *
-                           dtheta.deta(sigma, .link.sigma, earg= .esigma)^2
-        wz[,iam(1,2,M)] = -theta * (dd + 1/theta - log(theta)) / mymu
-        wz[,iam(1,2,M)] = wz[,iam(1,2,M)] * 
-                           dtheta.deta(mymu, .link.mu, earg= .emu)
-        wz[,iam(1,3,M)] = 2 * theta^1.5 * (2 * theta * tt - 2 -
-                           1/theta) * dtheta.deta(sigma, .link.sigma, earg= .esigma)
+        wz[,iam(2,2,M)] = dmu.deta^2 / (mymu*sigma)^2
+        wz[,iam(3,3,M)] = (4*theta*(theta*tritheta-1)/sigma^2) * dsigma.deta^2
+        wz[,iam(1,2,M)] = (-theta * (dd + 1/theta - log(theta)) / mymu) *
+                          dlambda.deta * dmu.deta
+        wz[,iam(1,3,M)] = 2 * theta^1.5 * (2 * theta * tritheta - 2 -
+                           1/theta) * dlambda.deta * dsigma.deta
         wz * w
-    }), list(.link.sigma=link.sigma, .link.mu=link.mu,
-             .esigma=esigma, .emu=emu ))))
+    }), list( .llambda=llambda, .lmu=lmu, .lsigma=lsigma,
+              .elambda=elambda, .emu=emu, .esigma=esigma ))))
 }
 
 
@@ -532,38 +537,42 @@ lms.yjn2.control <- function(save.weight=TRUE, ...)
 }
 
 lms.yjn2 = function(percentiles=c(25,50,75),
-                    zero=NULL,
-                    link.lambda="identity",
-                    link.mu="identity",
-                    link.sigma="loge",
+                    zero=c(1,3),
+                    llambda="identity",
+                    lmu="identity",
+                    lsigma="loge",
                     elambda=list(), emu=list(), esigma=list(),
                     dfmu.init=4,
                     dfsigma.init=2,
-                    init.lambda=1.0,
-                    init.sigma=NULL,
+                    ilambda=1.0,
+                    isigma=NULL,
                     yoffset=NULL,
                     nsimEIM=250)
 {
 
-    if(mode(link.lambda) != "character" && mode(link.lambda) != "name")
-        link.lambda = as.character(substitute(link.lambda))
-    if(mode(link.mu) != "character" && mode(link.mu) != "name")
-        link.mu = as.character(substitute(link.mu))
-    if(mode(link.sigma) != "character" && mode(link.sigma) != "name")
-        link.sigma = as.character(substitute(link.sigma))
+    if(mode(llambda) != "character" && mode(llambda) != "name")
+        llambda = as.character(substitute(llambda))
+    if(mode(lmu) != "character" && mode(lmu) != "name")
+        lmu = as.character(substitute(lmu))
+    if(mode(lsigma) != "character" && mode(lsigma) != "name")
+        lsigma = as.character(substitute(lsigma))
     if(!is.list(elambda)) elambda = list()
     if(!is.list(emu)) emu = list()
     if(!is.list(esigma)) esigma = list()
+    if(!is.Numeric(ilambda))
+        stop("bad input for argument 'ilambda'")
+    if(length(isigma) && !is.Numeric(isigma, posit=TRUE))
+        stop("bad input for argument 'isigma'")
 
     new("vglmff",
     blurb=c("LMS Quantile Regression (Yeo-Johnson transformation",
             " to normality)\n",
             "Links:    ",
-            namesof("lambda", link=link.lambda, earg= elambda),
+            namesof("lambda", link=llambda, earg= elambda),
             ", ",
-            namesof("mu", link=link.mu, earg= emu),
+            namesof("mu", link=lmu, earg= emu),
             ", ",
-            namesof("sigma", link=link.sigma, earg= esigma)),
+            namesof("sigma", link=lsigma, earg= esigma)),
     constraints=eval(substitute(expression({
         constraints = cm.zero.vgam(constraints, x, .zero, M)
     }), list(.zero=zero))),
@@ -571,9 +580,9 @@ lms.yjn2 = function(percentiles=c(25,50,75),
       if(ncol(cbind(y)) != 1)
           stop("response must be a vector or a one-column matrix")
         predictors.names =
-          c(namesof("lambda", .link.lambda, earg= .elambda, short= TRUE),
-            namesof("mu",     .link.mu,     earg= .emu,     short= TRUE),
-            namesof("sigma",  .link.sigma, earg= .esigma,  short= TRUE))
+          c(namesof("lambda", .llambda, earg= .elambda, short= TRUE),
+            namesof("mu",     .lmu,     earg= .emu,     short= TRUE),
+            namesof("sigma",  .lsigma, earg= .esigma,  short= TRUE))
 
         y.save = y
         yoff = if(is.Numeric( .yoffset)) .yoffset else -median(y) 
@@ -581,7 +590,7 @@ lms.yjn2 = function(percentiles=c(25,50,75),
         y = y + yoff
 
         if(!length(etastart)) {
-            lambda.init = if(is.Numeric( .init.lambda)) .init.lambda else 1.
+            lambda.init = if(is.Numeric( .ilambda)) .ilambda else 1.
 
             y.tx = yeo.johnson(y, lambda.init)
             fv.init = 
@@ -593,7 +602,7 @@ lms.yjn2 = function(percentiles=c(25,50,75),
                 rep(weighted.mean(y, w), len=n)
             }
 
-            sigma.init = if(!is.Numeric(.init.sigma)) {
+            sigma.init = if(!is.Numeric(.isigma)) {
                               if(is.Numeric( .dfsigma.init) && smoothok) {
                                    fit710 = vsmooth.spline(x=x[,min(ncol(x),2)],
                                             y=(y.tx - fv.init)^2,
@@ -604,34 +613,34 @@ lms.yjn2 = function(percentiles=c(25,50,75),
                                    sqrt( sum( w * (y.tx - fv.init)^2 ) / sum(w) )
                               }
                           } else
-                              .init.sigma
+                              .isigma
 
             etastart = matrix(0, n, 3)
-            etastart[,1] = theta2eta(lambda.init, .link.lambda, earg=.elambda)
-            etastart[,2] = theta2eta(fv.init, .link.mu, earg=.emu)
-            etastart[,3] = theta2eta(sigma.init, .link.sigma, earg=.esigma)
+            etastart[,1] = theta2eta(lambda.init, .llambda, earg=.elambda)
+            etastart[,2] = theta2eta(fv.init, .lmu, earg=.emu)
+            etastart[,3] = theta2eta(sigma.init, .lsigma, earg=.esigma)
 
         }
-    }), list(.link.lambda=link.lambda, .link.mu=link.mu, .link.sigma=link.sigma,
+    }), list(.llambda=llambda, .lmu=lmu, .lsigma=lsigma,
              .elambda=elambda, .emu=emu, .esigma=esigma, 
              .dfmu.init=dfmu.init,
              .dfsigma.init=dfsigma.init,
-             .init.lambda=init.lambda,
+             .ilambda=ilambda,
              .yoffset=yoffset,
-             .init.sigma=init.sigma))),
+             .isigma=isigma))),
     inverse=eval(substitute(function(eta, extra=NULL) {
-        eta[,1] = eta2theta(eta[,1], .link.lambda, earg= .elambda)
-        eta[,3] = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+        eta[,1] = eta2theta(eta[,1], .llambda, earg= .elambda)
+        eta[,3] = eta2theta(eta[,3], .lsigma, earg= .esigma)
         qtplot.lms.yjn(percentiles= .percentiles, eta=eta, yoffset= extra$yoff)
     }, list(.percentiles=percentiles,
             .esigma=esigma, .elambda=elambda,
-            .link.lambda=link.lambda,
-            .link.sigma=link.sigma))),
+            .llambda=llambda,
+            .lsigma=lsigma))),
     last=eval(substitute(expression({
         misc$expected = TRUE
         misc$nsimEIM = .nsimEIM
         misc$percentiles = .percentiles
-        misc$link = c(lambda= .link.lambda, mu= .link.mu, sigma= .link.sigma)
+        misc$link = c(lambda= .llambda, mu= .lmu, sigma= .lsigma)
         misc$earg = list(lambda = .elambda, mu = .emu, sigma = .esigma)
         misc$true.mu = FALSE # $fitted is not a true mu
         misc[["yoffset"]] = extra$yoffset
@@ -646,27 +655,27 @@ lms.yjn2 = function(percentiles=c(25,50,75),
     }), list(.percentiles=percentiles,
              .elambda=elambda, .emu=emu, .esigma=esigma, 
              .nsimEIM=nsimEIM,
-             .link.lambda=link.lambda, .link.mu=link.mu, .link.sigma=link.sigma ))),
+             .llambda=llambda, .lmu=lmu, .lsigma=lsigma ))),
     loglikelihood=eval(substitute(
         function(mu,y,w, residuals= FALSE, eta, extra=NULL) {
-            lambda = eta2theta(eta[,1], .link.lambda, earg= .elambda)
-            mu = eta2theta(eta[,2], .link.mu, earg= .emu)
-            sigma = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+            lambda = eta2theta(eta[,1], .llambda, earg= .elambda)
+            mu = eta2theta(eta[,2], .lmu, earg= .emu)
+            sigma = eta2theta(eta[,3], .lsigma, earg= .esigma)
             psi = yeo.johnson(y, lambda)
          if(residuals) stop("loglikelihood residuals not implemented yet") else
             sum(w * (-log(sigma) - 0.5 * ((psi-mu)/sigma)^2 +
                      (lambda-1) * sign(y) * log1p(abs(y))))
         }, list( .elambda=elambda, .emu=emu, .esigma=esigma, 
-                 .link.lambda=link.lambda, .link.mu=link.mu,
-                 .link.sigma=link.sigma ))),
+                 .llambda=llambda, .lmu=lmu,
+                 .lsigma=lsigma ))),
     vfamily=c("lms.yjn2", "lmscreg"),
     deriv=eval(substitute(expression({
-        lambda = eta2theta(eta[,1], .link.lambda, earg= .elambda)
-        mymu = eta2theta(eta[,2], .link.mu, earg= .emu)
-        sigma = eta2theta(eta[,3], .link.sigma, earg= .esigma)
-        dlambda.deta = dtheta.deta(lambda, link=.link.lambda, earg= .elambda)
-        dmu.deta = dtheta.deta(mymu, link=.link.mu, earg= .emu)
-        dsigma.deta = dtheta.deta(sigma, link=.link.sigma, earg= .esigma)
+        lambda = eta2theta(eta[,1], .llambda, earg= .elambda)
+        mymu = eta2theta(eta[,2], .lmu, earg= .emu)
+        sigma = eta2theta(eta[,3], .lsigma, earg= .esigma)
+        dlambda.deta = dtheta.deta(lambda, link=.llambda, earg= .elambda)
+        dmu.deta = dtheta.deta(mymu, link=.lmu, earg= .emu)
+        dsigma.deta = dtheta.deta(sigma, link=.lsigma, earg= .esigma)
 
         psi = yeo.johnson(y, lambda)
         d1 = yeo.johnson(y, lambda, deriv=1)
@@ -677,8 +686,8 @@ lms.yjn2 = function(percentiles=c(25,50,75),
         dthetas.detas = cbind(dlambda.deta, dmu.deta, dsigma.deta)
         w * cbind(dl.dlambda, dl.dmu, dl.dsigma) * dthetas.detas
     }), list( .elambda=elambda, .emu=emu, .esigma=esigma, 
-              .link.lambda=link.lambda, .link.mu=link.mu,
-                 .link.sigma=link.sigma ))),
+              .llambda=llambda, .lmu=lmu,
+                 .lsigma=lsigma ))),
     weight=eval(substitute(expression({
 
 
@@ -706,22 +715,22 @@ lms.yjn2 = function(percentiles=c(25,50,75),
         wz = run.varcov * dthetas.detas[,ind1$row] * dthetas.detas[,ind1$col]
         dimnames(wz) = list(rownames(wz), NULL)  # Remove the colnames
         wz * w
-    }), list(.link.sigma=link.sigma,
+    }), list(.lsigma=lsigma,
              .esigma=esigma, .elambda=elambda,
              .nsimEIM=nsimEIM,
-             .link.lambda=link.lambda))))
+             .llambda=llambda))))
 }
 
 
 lms.yjn <- function(percentiles=c(25,50,75),
-                    zero=NULL,
-                    link.lambda="identity",
-                    link.sigma="loge",
+                    zero=c(1,3),
+                    llambda="identity",
+                    lsigma="loge",
                     elambda=list(), esigma=list(),
                     dfmu.init=4,
                     dfsigma.init=2,
-                    init.lambda=1.0,
-                    init.sigma=NULL,
+                    ilambda=1.0,
+                    isigma=NULL,
                     rule=c(10,5),
                     yoffset=NULL,
                     diagW=FALSE, iters.diagW=6)
@@ -729,10 +738,10 @@ lms.yjn <- function(percentiles=c(25,50,75),
 
 
 
-    if(mode(link.sigma) != "character" && mode(link.sigma) != "name")
-        link.sigma = as.character(substitute(link.sigma))
-    if(mode(link.lambda) != "character" && mode(link.lambda) != "name")
-        link.lambda = as.character(substitute(link.lambda))
+    if(mode(lsigma) != "character" && mode(lsigma) != "name")
+        lsigma = as.character(substitute(lsigma))
+    if(mode(llambda) != "character" && mode(llambda) != "name")
+        llambda = as.character(substitute(llambda))
     if(!is.list(elambda)) elambda = list()
     if(!is.list(esigma)) esigma = list()
 
@@ -744,9 +753,9 @@ lms.yjn <- function(percentiles=c(25,50,75),
     blurb=c("LMS Quantile Regression ",
             "(Yeo-Johnson transformation to normality)\n",
             "Links:    ",
-            namesof("lambda", link=link.lambda, earg= elambda),
+            namesof("lambda", link=llambda, earg= elambda),
             ", mu, ",
-            namesof("sigma", link=link.sigma, earg= esigma)),
+            namesof("sigma", link=lsigma, earg= esigma)),
     constraints=eval(substitute(expression({
         constraints = cm.zero.vgam(constraints, x, .zero, M)
     }), list(.zero=zero))),
@@ -754,9 +763,9 @@ lms.yjn <- function(percentiles=c(25,50,75),
       if(ncol(cbind(y)) != 1)
           stop("response must be a vector or a one-column matrix")
         predictors.names =
-          c(namesof("lambda", .link.lambda, earg= .elambda, short= TRUE),
+          c(namesof("lambda", .llambda, earg= .elambda, short= TRUE),
                 "mu",
-            namesof("sigma",  .link.sigma, earg= .esigma,  short= TRUE))
+            namesof("sigma",  .lsigma, earg= .esigma,  short= TRUE))
 
         y.save = y
         yoff = if(is.Numeric( .yoffset)) .yoffset else -median(y) 
@@ -765,7 +774,7 @@ lms.yjn <- function(percentiles=c(25,50,75),
 
         if(!length(etastart)) {
 
-            lambda.init = if(is.Numeric( .init.lambda)) .init.lambda else 1.0
+            lambda.init = if(is.Numeric( .ilambda)) .ilambda else 1.0
 
             y.tx = yeo.johnson(y, lambda.init)
             if(smoothok <- (length(unique(sort(x[,min(ncol(x),2)]))) > 7)) {
@@ -776,7 +785,7 @@ lms.yjn <- function(percentiles=c(25,50,75),
                 fv.init = rep(weighted.mean(y, w), len=n)
             }
 
-            sigma.init = if(!is.Numeric(.init.sigma)) {
+            sigma.init = if(!is.Numeric(.isigma)) {
                               if(is.Numeric( .dfsigma.init) && smoothok) {
                                    fit710 = vsmooth.spline(x=x[,min(ncol(x),2)],
                                             y=(y.tx - fv.init)^2,
@@ -787,32 +796,32 @@ lms.yjn <- function(percentiles=c(25,50,75),
                                    sqrt( sum( w * (y.tx - fv.init)^2 ) / sum(w) )
                               }
                           } else
-                              .init.sigma
+                              .isigma
 
-            etastart = cbind(theta2eta(lambda.init,.link.lambda, earg=.elambda),
+            etastart = cbind(theta2eta(lambda.init,.llambda, earg=.elambda),
                              fv.init,
-                             theta2eta(sigma.init, .link.sigma, earg=.esigma))
+                             theta2eta(sigma.init, .lsigma, earg=.esigma))
 
         }
-    }), list(.link.sigma=link.sigma,
-             .link.lambda=link.lambda,
+    }), list(.lsigma=lsigma,
+             .llambda=llambda,
              .esigma=esigma, .elambda=elambda,
              .dfmu.init=dfmu.init,
              .dfsigma.init=dfsigma.init,
-             .init.lambda=init.lambda,
+             .ilambda=ilambda,
              .yoffset=yoffset,
-             .init.sigma=init.sigma))),
+             .isigma=isigma))),
     inverse=eval(substitute(function(eta, extra=NULL) {
-        eta[,1] = eta2theta(eta[,1], .link.lambda, earg= .elambda)
-        eta[,3] = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+        eta[,1] = eta2theta(eta[,1], .llambda, earg= .elambda)
+        eta[,3] = eta2theta(eta[,3], .lsigma, earg= .esigma)
         qtplot.lms.yjn(percentiles= .percentiles, eta=eta, yoffset= extra$yoff)
     }, list(.percentiles=percentiles,
              .esigma=esigma, .elambda=elambda,
-            .link.lambda=link.lambda,
-            .link.sigma=link.sigma))),
+            .llambda=llambda,
+            .lsigma=lsigma))),
     last=eval(substitute(expression({
         misc$percentiles = .percentiles
-        misc$link = c(lambda= .link.lambda, mu= "identity", sigma= .link.sigma)
+        misc$link = c(lambda= .llambda, mu= "identity", sigma= .lsigma)
         misc$earg = list(lambda = .elambda, mu = list(), sigma = .esigma)
         misc$true.mu = FALSE    # $fitted is not a true mu
         misc[["yoffset"]] = extra$yoff
@@ -826,24 +835,24 @@ lms.yjn <- function(percentiles=c(25,50,75),
         }
     }), list(.percentiles=percentiles,
              .esigma=esigma, .elambda=elambda,
-            .link.lambda=link.lambda,
-            .link.sigma=link.sigma))),
+            .llambda=llambda,
+            .lsigma=lsigma))),
     loglikelihood=eval(substitute(
         function(mu,y,w, residuals= FALSE, eta, extra=NULL) {
-            lambda = eta2theta(eta[,1], .link.lambda, earg= .elambda)
+            lambda = eta2theta(eta[,1], .llambda, earg= .elambda)
             mu = eta[,2]
-            sigma = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+            sigma = eta2theta(eta[,3], .lsigma, earg= .esigma)
             psi = yeo.johnson(y, lambda)
          if(residuals) stop("loglikelihood residuals not implemented yet") else
             sum(w * (-log(sigma) - 0.5 * ((psi-mu)/sigma)^2 +
                      (lambda-1) * sign(y) * log1p(abs(y))))
         }, list( .esigma=esigma, .elambda=elambda,
-                 .link.sigma=link.sigma, .link.lambda=link.lambda))),
+                 .lsigma=lsigma, .llambda=llambda))),
     vfamily=c("lms.yjn", "lmscreg"),
     deriv=eval(substitute(expression({
-        lambda = eta2theta(eta[,1], .link.lambda, earg= .elambda)
+        lambda = eta2theta(eta[,1], .llambda, earg= .elambda)
         mymu = eta[,2]
-        sigma = eta2theta(eta[,3], .link.sigma, earg= .esigma)
+        sigma = eta2theta(eta[,3], .lsigma, earg= .esigma)
 
         psi = yeo.johnson(y, lambda)
         d1 = yeo.johnson(y, lambda, deriv=1)
@@ -852,14 +861,14 @@ lms.yjn <- function(percentiles=c(25,50,75),
         dl.dlambda = -AA * d1 /sigma + sign(y) * log1p(abs(y))
         dl.dmu = AA / sigma 
         dl.dsigma = (AA^2 -1) / sigma
-        dlambda.deta = dtheta.deta(lambda, link=.link.lambda, earg= .elambda)
-        dsigma.deta = dtheta.deta(sigma, link=.link.sigma, earg= .esigma)
+        dlambda.deta = dtheta.deta(lambda, link=.llambda, earg= .elambda)
+        dsigma.deta = dtheta.deta(sigma, link=.lsigma, earg= .esigma)
 
         cbind(dl.dlambda * dlambda.deta,
               dl.dmu,
               dl.dsigma * dsigma.deta) * w
     }), list( .esigma=esigma, .elambda=elambda,
-              .link.sigma=link.sigma, .link.lambda=link.lambda ))),
+              .lsigma=lsigma, .llambda=llambda ))),
     weight=eval(substitute(expression({
         wz = matrix(0, n, 6)
 
@@ -990,12 +999,12 @@ lms.yjn <- function(percentiles=c(25,50,75),
 
         wz = wz * w
         wz
-    }), list(.link.sigma=link.sigma,
+    }), list(.lsigma=lsigma,
              .esigma=esigma, .elambda=elambda,
              .rule=rule,
              .diagW=diagW,
              .iters.diagW=iters.diagW,
-             .link.lambda=link.lambda))))
+             .llambda=llambda))))
 }
 
 
diff --git a/R/family.rcqo.q b/R/family.rcqo.q
index c3635fc..33992da 100644
--- a/R/family.rcqo.q
+++ b/R/family.rcqo.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/family.rrr.q b/R/family.rrr.q
index ce3e7f4..fa98d11 100644
--- a/R/family.rrr.q
+++ b/R/family.rrr.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -1387,8 +1387,8 @@ printrrvglm <- function(x, ...)
 
     if(length(deviance(x)))
         cat("Residual Deviance:", format(deviance(x)), "\n")
-    if(length(logLik(x)))
-        cat("Log-likelihood:", format(logLik(x)), "\n")
+    if(length(vll <- logLik.vlm(x)))
+        cat("Log-likelihood:", format(vll), "\n")
 
     if(length(x at criterion)) {
         ncrit <- names(x at criterion)
@@ -1543,8 +1543,8 @@ get.rrvglm.se1 <- function(fit, omit13= FALSE, kill.all= FALSE,
     Rank <- fit at control$Rank  # fit at misc$Nested.Rank   
 
     Amat <- fit at constraints[[colx2.index[1]]]
-    Bmat <- if(p1) coef(fit, mat= TRUE)[colx1.index,,drop=FALSE] else NULL
-    C.try <- coef(fit, mat= TRUE)[colx2.index,,drop=FALSE]
+    Bmat <- if(p1) coefvlm(fit, mat= TRUE)[colx1.index,,drop=FALSE] else NULL
+    C.try <- coefvlm(fit, mat= TRUE)[colx2.index,,drop=FALSE]
     Cmat <- C.try %*% Amat %*% solve(t(Amat) %*% Amat)
 
     x1mat <- if(p1) fit at x[,colx1.index,drop=FALSE] else NULL
@@ -1672,7 +1672,7 @@ get.rrvglm.se1 <- function(fit, omit13= FALSE, kill.all= FALSE,
     cov1122 <- solve(sfit1122 at cov.unscaled)
     dimnames(cov1122) = list(d8, d8)
 
-    lcs = length(coef(sfit1122))
+    lcs = length(coefvlm(sfit1122))
     log.vec11 = (lcs-(M-Rank-length(Structural.zero))*Rank+1):lcs
     cov11 = cov1122[log.vec11,  log.vec11, drop=FALSE]
     cov12 = cov1122[ log.vec11, -log.vec11, drop=FALSE]
@@ -2311,7 +2311,7 @@ lvplot.rrvglm = function(object,
                          Acex=par()$cex,
                          Acol=par()$col,
                          Apch=NULL,
-                         Clabels=dimnames(Cmat)[[1]],
+                         Clabels=rownames(Cmat),
                          Cadj=par()$adj,
                          Ccex=par()$cex,
                          Ccol=par()$col, 
@@ -2325,7 +2325,7 @@ lvplot.rrvglm = function(object,
                          spch=NULL,
                          scex=par()$cex,
                          scol=par()$col,
-                         slabels=dimnames(x2mat)[[1]],
+                         slabels=rownames(x2mat),
                          ...)
 {
 
@@ -2447,8 +2447,13 @@ Coef.rrvglm <- function(object, ...) {
     colx2.index = object at control$colx2.index
     p1 = length(colx1.index)
     Amat <- object at constraints[[colx2.index[1]]]
-    B1mat <- if(p1) coef(object, mat= TRUE)[colx1.index,,drop=FALSE] else NULL
-    C.try <- coef(object, mat= TRUE)[colx2.index,,drop=FALSE]
+
+    B1mat = if(p1) coefvlm(object, mat=TRUE)[colx1.index,,drop=FALSE] else NULL
+
+
+    C.try <- coefvlm(object, mat= TRUE)[colx2.index,,drop=FALSE]
+
+
     Cmat <- C.try %*% Amat %*% solve(t(Amat) %*% Amat)
 
 
@@ -2696,7 +2701,7 @@ trplot.qrrvglm = function(object,
                           whichSpecies=NULL,
                           add=FALSE, plot.it=TRUE,
                           label.sites=FALSE, 
-                          sitenames = dimnames(object at y)[[1]],
+                          sitenames = rownames(object at y),
                           axes.equal = TRUE,
                           cex=par()$cex,
                           col=1:(nos*(nos-1)/2),
@@ -2908,6 +2913,7 @@ persp.qrrvglm = function(x, varlvI = FALSE, reference = NULL,
                   main="",
                   ticktype = "detailed", 
                   col = if(Rank==1) par()$col else "white",
+                  llty=par()$lty, llwd=par()$lwd,
                   add1 = FALSE,
                   ...) {
     oylim = ylim
@@ -2966,12 +2972,15 @@ persp.qrrvglm = function(x, varlvI = FALSE, reference = NULL,
             if(!length(oylim))
             ylim = c(0, max(fitvals[,whichSpecies.numer])*stretch) # A revision
             col = rep(col, len=length(whichSpecies.numer))
+            llty = rep(llty, leng=length(whichSpecies.numer))
+            llwd = rep(llwd, leng=length(whichSpecies.numer))
             if(!add1)
             matplot(lv1, fitvals, xlab=xlab, ylab=ylab, type="n", 
                     main=main, xlim=xlim, ylim=ylim, ...) 
             for(j in 1:length(whichSpecies.numer)) {
                 ptr2 = whichSpecies.numer[j]  # points to species column
-                lines(lv1, fitvals[,ptr2], col=col[j], ...)
+                lines(lv1, fitvals[,ptr2], col=col[j],
+                      lty=llty[j], lwd=llwd[j], ...)
                 if(labelSpecies) {
                     ptr1=(1:nrow(fitvals))[max(fitvals[,ptr2])==fitvals[,ptr2]]
                     ptr1 = ptr1[1]
diff --git a/R/family.survival.q b/R/family.survival.q
index b26459a..ce4acf9 100644
--- a/R/family.survival.q
+++ b/R/family.survival.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/family.ts.q b/R/family.ts.q
index 12b114e..95e275c 100644
--- a/R/family.ts.q
+++ b/R/family.ts.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/family.univariate.q b/R/family.univariate.q
index 9c58dfe..1cb39f4 100644
--- a/R/family.univariate.q
+++ b/R/family.univariate.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -625,8 +625,8 @@ dirmul.old = function(link="loge", earg=list(), init.alpha = 0.01,
 
         if(TRUE && intercept.only) {
             sumw = sum(w)
-            for(i in 1:ncol(wz))
-                wz[,i] = sum(wz[,i]) / sumw
+            for(ii in 1:ncol(wz))
+                wz[,ii] = sum(wz[,ii]) / sumw
             pooled.weight = TRUE
             wz = w * wz   # Put back the weights
         } else
@@ -1146,7 +1146,9 @@ cauchy = function(llocation="identity", lscale="loge",
         misc$expected = TRUE
         misc$link = c("location"= .llocation, "scale"=.lscale)
         misc$earg = list(location= .elocation, scale= .escale)
+        misc$method.init = .method.init
     }), list( .escale=escale, .elocation=elocation,
+              .method.init=method.init,
               .llocation=llocation, .lscale=lscale ))),
     loglikelihood=eval(substitute(
         function(mu,y,w,residuals= FALSE,eta, extra=NULL) {
@@ -3113,16 +3115,22 @@ lognormal3 = function(lmeanlog="identity", lsdlog="loge",
 
 interleave.VGAM = function(L, M) c(matrix(1:L, nrow=M, byrow=TRUE))
 
-negbinomial = function(lmu = "loge", lk = "loge",
-                       emu =list(), ek=list(),
-                       ik = NULL, cutoff = 0.995, Maxiter=5000,
-                       deviance.arg=FALSE, method.init=1, shrinkage.init=0.95,
-                       zero = -2)
+negbinomial.control <- function(save.weight=TRUE, ...)
+{
+    list(save.weight=save.weight)
+}
+
+ negbinomial = function(lmu = "loge", lk = "loge",
+                        emu =list(), ek=list(),
+                        ik = NULL, nsimEIM=100, cutoff = 0.995, Maxiter=5000,
+                        deviance.arg=FALSE, method.init=1, shrinkage.init=0.95,
+                        zero = -2)
 {
 
 
 
 
+
     if(length(ik) && !is.Numeric(ik, posit=TRUE))
         stop("bad input for argument \"ik\"")
     if(!is.Numeric(cutoff, allow=1) || cutoff<0.8 || cutoff>=1)
@@ -3133,6 +3141,12 @@ negbinomial = function(lmu = "loge", lk = "loge",
        method.init > 2) stop("argument \"method.init\" must be 1 or 2")
     if(!is.Numeric(shrinkage.init, allow=1) || shrinkage.init < 0 ||
        shrinkage.init > 1) stop("bad input for argument \"shrinkage.init\"")
+    if(!is.null(nsimEIM)) {
+        if(!is.Numeric(nsimEIM, allow=1, integ=TRUE))
+            stop("bad input for argument 'nsimEIM'")
+        if(nsimEIM <= 10)
+            warning("'nsimEIM' should be an integer greater than 10, say")
+    }
 
     if(mode(lmu) != "character" && mode(lmu) != "name")
         lmu = as.character(substitute(lmu))
@@ -3164,6 +3178,10 @@ negbinomial = function(lmu = "loge", lk = "loge",
            is.Numeric( .zero, allow=1) && .zero != -2)
             stop("argument zero=-2 is required")
 
+        if(any(y<0))
+            stop("negative values not allowed for the negbinomial family")
+        if(any(round(y) != y))
+            stop("integer-values only allowed for the negbinomial family")
         y = as.matrix(y) 
         M = 2 * ncol(y) 
         NOS = ncoly = ncol(y)  # Number of species
@@ -3172,6 +3190,11 @@ negbinomial = function(lmu = "loge", lk = "loge",
             namesof(if(NOS==1) "k" else paste("k",1:NOS,sep=""), .lk, earg=.ek,
             tag=FALSE))
         predictors.names = predictors.names[interleave.VGAM(M, M=2)]
+
+        if(is.null( .nsimEIM)) {
+             save.weight <- control$save.weight <- FALSE
+        }
+
         if(!length(etastart)) {
             mu.init = y
             for(iii in 1:ncol(y)) {
@@ -3181,18 +3204,20 @@ negbinomial = function(lmu = "loge", lk = "loge",
                     median(y[,iii]) + 1/16
                 }
                 mu.init[,iii] = (1- .sinit)*(y[,iii]+1/16) + .sinit * use.this
+                max.use.this =  7 * use.this + 10
+                vecTF = (mu.init[,iii] > max.use.this)
+                if(any(vecTF))
+                    mu.init[vecTF,iii] = max.use.this
             }
 
             if( is.Numeric( .k.init )) {
                 kay.init = matrix( .k.init, nr=n, nc=NOS, byrow=TRUE)
             } else {
                 negbinomial.Loglikfun = function(kmat, y, x, w, extraargs) {
-                     mu = extraargs
-                     sum(w * (y * log(mu/(mu+kmat)) +
-                              kmat*log(kmat/(mu+kmat)) + lgamma(y+kmat) -
-                              lgamma(kmat) - lgamma(y+1)))
+                    mu = extraargs
+                    sum(w * dnbinom(x=y, mu=mu, size=kmat, log=TRUE))
                 }
-                k.grid = 2^((-3):6)
+                k.grid = 2^((-6):6)
                 kay.init = matrix(0, nr=n, nc=NOS)
                 for(spp. in 1:NOS) {
                     kay.init[,spp.] = getMaxMin(k.grid,
@@ -3207,7 +3232,7 @@ negbinomial = function(lmu = "loge", lk = "loge",
         }
     }), list( .lmu=lmu, .lk=lk, .k.init=ik, .zero=zero,
               .emu=emu, .ek=ek,
-              .sinit=shrinkage.init,
+              .sinit=shrinkage.init, .nsimEIM=nsimEIM,
               .method.init=method.init ))),
     inverse=eval(substitute(function(eta, extra=NULL) {
         NOS = ncol(eta) / 2
@@ -3234,8 +3259,10 @@ negbinomial = function(lmu = "loge", lk = "loge",
         }
         misc$cutoff = .cutoff 
         misc$method.init = .method.init 
+        misc$nsimEIM = .nsimEIM
+        misc$expected = TRUE
     }), list( .lmu=lmu, .lk=lk, .cutoff=cutoff,
-              .emu=emu, .ek=ek,
+              .emu=emu, .ek=ek, .nsimEIM=nsimEIM,
               .method.init=method.init ))),
     link=eval(substitute(function(mu, extra=NULL) {
         temp = theta2eta(mu, .lmu, earg= .emu)
@@ -3252,11 +3279,9 @@ negbinomial = function(lmu = "loge", lk = "loge",
             temp300 = ifelse(temp300 < -bigval, -bigval, temp300)
         }
         kmat = eta2theta(temp300, .lk, earg= .ek)
-        ans = 
-        sum(w * (y * log(mu/(mu+kmat)) + kmat*log(kmat/(mu+kmat)) +
-                 lgamma(y+kmat) - lgamma(kmat) - lgamma(y+1 )))
+
         if(residuals) stop("loglikelihood residuals not implemented yet") else
-        ans
+            sum(w * dnbinom(x=y, mu=mu, size=kmat, log=TRUE))
     }, list( .lk=lk, .emu=emu, .ek=ek ))),
     vfamily=c("negbinomial"),
     deriv=eval(substitute(expression({
@@ -3272,26 +3297,44 @@ negbinomial = function(lmu = "loge", lk = "loge",
                 log(kmat/(kmat+mu))
         dmu.deta = dtheta.deta(mu, .lmu, earg= .emu)
         dk.deta = dtheta.deta(kmat, .lk, earg= .ek)
-        myderiv = w * cbind(dl.dmu * dmu.deta, dl.dk * dk.deta)
+        dthetas.detas = cbind(dmu.deta, dk.deta)
+        myderiv = w * cbind(dl.dmu, dl.dk) * dthetas.detas
         myderiv[,interleave.VGAM(M, M=2)]
     }), list( .lmu=lmu, .lk=lk, .emu=emu, .ek=ek ))),
     weight=eval(substitute(expression({
         wz = matrix(as.numeric(NA), n, M)  # wz is 'diagonal' 
+        if(is.null( .nsimEIM)) {
+            fred2 = dotFortran(name="enbin9", ans=double(n*NOS),
+                        as.double(kmat), as.double(mu), as.double( .cutoff ),
+                        as.integer(n), ok=as.integer(1), as.integer(NOS),
+                        sumpdf=double(1), as.double(.Machine$double.eps),
+                        as.integer( .Maxiter ))
+            if(fred2$ok != 1)
+                stop("error in Fortran subroutine exnbin9")
+            dim(fred2$ans) = c(n, NOS)
+            ed2l.dk2 = -fred2$ans - 1/kmat + 1/(kmat+mu)
+            wz[,2*(1:NOS)] = dk.deta^2 * ed2l.dk2
+        } else {
+            run.varcov = matrix(0, n, NOS)
+            ind1 = iam(NA, NA, M=M, both=TRUE, diag=TRUE)
+            for(ii in 1:( .nsimEIM )) {
+                ysim = rnbinom(n=n*NOS, mu=c(mu), size=c(kmat))
+                if(NOS > 1) dim(ysim) = c(n, NOS)
+                dl.dk = digamma(ysim+kmat) - digamma(kmat) -
+                        (ysim+kmat)/(mu+kmat) + 1 + log(kmat/(kmat+mu))
+                run.varcov = run.varcov + dl.dk^2
+            }
+            run.varcov = cbind(run.varcov / .nsimEIM)
+            wz[,2*(1:NOS)] = if(intercept.only)
+                matrix(apply(run.varcov, 2, mean),
+                       n, ncol(run.varcov), byrow=TRUE) else run.varcov
+
+            wz[,2*(1:NOS)] = wz[,2*(1:NOS)] * dk.deta^2
+        }
         ed2l.dmu2 = 1/mu - 1/(mu+kmat)
-        fred2 = dotFortran(name="enbin9",
-                      ans=double(n*NOS), as.double(kmat),
-                      as.double(mu), as.double( .cutoff ),
-                      as.integer(n), ok=as.integer(1), as.integer(NOS),
-                      sumpdf=double(1), macheps=as.double(.Machine$double.eps),
-                      as.integer( .Maxiter ))
-        if(fred2$ok != 1)
-            stop("error in Fortran subroutine exnbin9")
-        dim(fred2$ans) = c(n, NOS)
-        ed2l.dk2 = -fred2$ans - 1/kmat + 1/(kmat+mu)
         wz[,2*(1:NOS)-1] = dmu.deta^2 * ed2l.dmu2
-        wz[,2*(1:NOS)] = dk.deta^2 * ed2l.dk2
         w * wz
-    }), list( .cutoff=cutoff, .Maxiter=Maxiter ))))
+    }), list( .cutoff=cutoff, .Maxiter=Maxiter, .nsimEIM=nsimEIM ))))
 
     if(deviance.arg) ans at deviance=eval(substitute(
         function(mu,y,w,residuals= FALSE,eta,extra=NULL) {
@@ -3923,8 +3966,8 @@ simplex = function(lmu="logit", lsigma="loge",
 
         if(intercept.only) {
             sumw = sum(w)
-            for(i in 1:ncol(wz))
-                wz[,i] = sum(wz[,i]) / sumw
+            for(ii in 1:ncol(wz))
+                wz[,ii] = sum(wz[,ii]) / sumw
             pooled.weight = TRUE
             wz = w * wz   # Put back the weights
         } else
@@ -4034,8 +4077,8 @@ rig = function(lmu="identity", llambda="loge",
 
         if(intercept.only) {
             sumw = sum(w)
-            for(i in 1:ncol(wz))
-                wz[,i] = sum(wz[,i]) / sumw
+            for(ii in 1:ncol(wz))
+                wz[,ii] = sum(wz[,ii]) / sumw
             pooled.weight = TRUE
             wz = w * wz   # Put back the weights
         } else
@@ -4285,8 +4328,8 @@ leipnik = function(lmu="logit", llambda="loge",
 
         if(intercept.only) {
             sumw = sum(w)
-            for(i in 1:ncol(wz))
-                wz[,i] = sum(wz[,i]) / sumw
+            for(ii in 1:ncol(wz))
+                wz[,ii] = sum(wz[,ii]) / sumw
             pooled.weight = TRUE
             wz = w * wz   # Put back the weights
         } else
@@ -4540,8 +4583,8 @@ genpoisson = function(llambda="elogit", ltheta="loge",
 
             if(intercept.only) {
                 sumw = sum(w)
-                for(i in 1:ncol(wz))
-                    wz[,i] = sum(wz[,i]) / sumw
+                for(ii in 1:ncol(wz))
+                    wz[,ii] = sum(wz[,ii]) / sumw
                 pooled.weight = TRUE
                 wz = w * wz   # Put back the weights
             } else
@@ -5016,22 +5059,76 @@ ggamma = function(lscale="loge", ld="loge", lk="loge",
 }
 
 
-dlog = function(x, prob) {
-    if(!is.Numeric(x)) stop("bad input for argument \"x\"")
+dlog = function(x, prob, log=FALSE) {
+    if(!is.logical(log) || length(log) != 1)
+        stop("bad input for argument 'log'")
+    log.arg = log; rm(log)
+
     if(!is.Numeric(prob, posit=TRUE) || max(prob) >= 1)
         stop("bad input for argument \"prob\"")
     N = max(length(x), length(prob))
     x = rep(x, len=N); prob = rep(prob, len=N); 
     ox = !is.finite(x)
-    zero = round(x) != x | x < 1
+    zero = ox | round(x) != x | x < 1
     ans = rep(0.0, len=length(x))
-    if(any(!zero))
-        ans[!zero] = -(prob[!zero]^(x[!zero])) / (x[!zero] * log1p(-prob[!zero]))
+        if(log.arg) {
+            ans[ zero] = log(0.0)
+            ans[!zero] = x[!zero] * log(prob[!zero]) - log(x[!zero]) -
+                         log(-log1p(-prob[!zero]))
+        } else {
+            ans[!zero] = -(prob[!zero]^(x[!zero])) / (x[!zero] *
+                         log1p(-prob[!zero]))
+        }
     if(any(ox))
         ans[ox] = NA
     ans
 }
 
+
+
+plog  = function(q, prob, log.p=FALSE) {
+    if(!is.Numeric(q)) stop("bad input for argument \"q\"")
+    if(!is.Numeric(prob, posit=TRUE) || max(prob) >= 1)
+        stop("bad input for argument \"prob\"")
+    N = max(length(q), length(prob))
+    q = rep(q, len=N); prob = rep(prob, len=N);
+
+    bigno = 10
+    owen1965 = (q * (1 - prob) > bigno)
+    if(specialCase <- any(owen1965)) {
+        qqq = q[owen1965]
+        ppp = prob[owen1965]
+        pqp = qqq * (1 - ppp)
+        bigans = (ppp^(1+qqq) / (1-ppp)) * (1/qqq -
+                 1 / (            pqp * (qqq-1)) +
+                 2 / ((1-ppp)   * pqp * (qqq-1) * (qqq-2)) -
+                 6 / ((1-ppp)^2 * pqp * (qqq-1) * (qqq-2) * (qqq-3)) +
+                24 / ((1-ppp)^3 * pqp * (qqq-1) * (qqq-2) * (qqq-3) * (qqq-4)))
+        bigans = 1 + bigans / log1p(-ppp)
+    }
+
+    floorq = pmax(1, floor(q)) # Ensures at least one element per q value
+    floorq[owen1965] = 1
+    seqq = sequence(floorq)
+    seqp = rep(prob, floorq)
+    onevector = (seqp^seqq / seqq) / (-log1p(-seqp))
+    rlist =  dotFortran(name="cum8sum",
+                        x=as.double(onevector), answer=double(N),
+                        as.integer(N), as.double(seqq),
+                        as.integer(length(onevector)), notok=integer(1))
+    if(rlist$notok != 0) stop("error in 'cum8sum'")
+    ans = if(log.p) log(rlist$answer) else rlist$answer
+    if(specialCase)
+        ans[owen1965] = if(log.p) log(bigans) else bigans
+    ans[q < 1] = if(log.p) log(0.0) else 0.0
+    ans
+}
+
+
+
+
+
+if(FALSE)
 plog = function(q, prob, log.p=FALSE) {
     if(!is.Numeric(q)) stop("bad input for argument \"q\"")
     if(!is.Numeric(prob, posit=TRUE) || max(prob) >= 1)
@@ -5044,18 +5141,24 @@ plog = function(q, prob, log.p=FALSE) {
         temp = if(max(qstar) >= 1) dlog(x=1:max(qstar), 
                prob=prob[1]) else 0*qstar
         unq = unique(qstar)
-        for(i in unq) {
-            index = qstar == i
-            ans[index] = if(i >= 1) sum(temp[1:i]) else 0
+        for(ii in unq) {
+            index = qstar == ii
+            ans[index] = if(ii >= 1) sum(temp[1:ii]) else 0
         }
     } else
-    for(i in 1:N) {
-        qstar = floor(q[i])
-        ans[i] = if(qstar >= 1) sum(dlog(x=1:qstar, prob=prob[i])) else 0
+    for(ii in 1:N) {
+        qstar = floor(q[ii])
+        ans[ii] = if(qstar >= 1) sum(dlog(x=1:qstar, prob=prob[ii])) else 0
     }
     if(log.p) log(ans) else ans
 }
 
+
+
+
+
+
+
 rlog = function(n, prob, Smallno=1.0e-6) {
     if(!is.Numeric(n, posit=TRUE, integ=TRUE))
         stop("bad input for argument \"n\"")
@@ -5090,6 +5193,12 @@ rlog = function(n, prob, Smallno=1.0e-6) {
 }
 
 
+
+
+
+
+
+
 logff = function(link="logit", earg=list(), init.c=NULL)
 {
     if(length(init.c) &&
@@ -5152,6 +5261,9 @@ logff = function(link="logit", earg=list(), init.c=NULL)
 }
 
 
+
+
+
 levy = function(delta=NULL, link.gamma="loge",
                 earg=list(), idelta=NULL, igamma=NULL)
 {
@@ -7163,13 +7275,13 @@ qnaka = function(p, shape, scale=1, ...) {
     ans = rep(0.0, len=L)
     myfun = function(x, shape, scale=1, p)
         pnaka(q=x, shape=shape, scale=scale) - p
-    for(i in 1:L) {
-        EY = sqrt(scale[i]/shape[i]) * gamma(shape[i]+0.5) / gamma(shape[i])
+    for(ii in 1:L) {
+        EY = sqrt(scale[ii]/shape[ii]) * gamma(shape[ii]+0.5) / gamma(shape[ii])
         Upper = 5 * EY
-        while(pnaka(q=Upper, shape=shape[i], scale=scale[i]) < p[i])
-            Upper = Upper + scale[i]
-        ans[i] = uniroot(f=myfun, lower=0, upper=Upper,
-                         shape=shape[i], scale=scale[i], p=p[i], ...)$root
+        while(pnaka(q=Upper, shape=shape[ii], scale=scale[ii]) < p[ii])
+            Upper = Upper + scale[ii]
+        ans[ii] = uniroot(f=myfun, lower=0, upper=Upper,
+                         shape=shape[ii], scale=scale[ii], p=p[ii], ...)$root
     }
     ans
 }
@@ -8346,8 +8458,8 @@ expexp1 = function(lscale="loge",
 
         if(FALSE && intercept.only) {
             sumw = sum(w)
-            for(i in 1:ncol(wz))
-                wz[,i] = sum(wz[,i]) / sumw
+            for(ii in 1:ncol(wz))
+                wz[,ii] = sum(wz[,ii]) / sumw
             pooled.weight = TRUE
             wz = w * wz   # Put back the weights
         } else
@@ -8769,6 +8881,12 @@ alaplace2 = function(tau = NULL,
 
 
 
+
+alaplace1.control <- function(maxit=300, ...)
+{
+    list(maxit=maxit)
+}
+
 alaplace1 = function(tau = NULL,
                      llocation="identity",
                      elocation=list(),
diff --git a/R/family.vglm.q b/R/family.vglm.q
index 541e790..340ca92 100644
--- a/R/family.vglm.q
+++ b/R/family.vglm.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/family.zeroinf.q b/R/family.zeroinf.q
index a5cc327..8bc9e49 100644
--- a/R/family.zeroinf.q
+++ b/R/family.zeroinf.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -7,13 +7,183 @@
 
 
 
-dzipois = function(x, lambda, phi=0) {
+
+dzanegbin = function(x, p0, size, prob=NULL, munb=NULL, log=FALSE) {
+    if (length(munb)) {
+        if (length(prob))
+            stop("'prob' and 'munb' both specified")
+        prob <- size/(size + munb)
+    }
+    if(!is.logical(log.arg <- log)) stop("bad input for 'log'")
+    rm(log)
+
+    L = max(length(x), length(p0), length(prob), length(size))
+    x = rep(x, len=L); p0 = rep(p0, len=L);
+    prob = rep(prob, len=L); size = rep(size, len=L);
+    ans = rep(0.0, len=L)
+    if(!is.Numeric(p0) || any(p0 < 0) || any(p0 > 1))
+        stop("'p0' must be in [0,1]")
+    if(!is.Numeric(prob, posit=TRUE))
+        stop("'prob' must be in [0,Inf)")
+    if(!is.Numeric(size, posit=TRUE))
+        stop("'size' must be in [0,Inf)")
+    index0 = x==0
+
+    if(log.arg) {
+        ans[ index0] = log(p0[index0])
+        ans[!index0] = log1p(-p0[!index0]) +
+                       dposnegbin(x[!index0], prob=prob[!index0],
+                                  size=size[!index0], log=TRUE)
+    } else {
+        ans[ index0] = p0[index0]
+        ans[!index0] = (1-p0[!index0]) * dposnegbin(x[!index0],
+                         prob=prob[!index0], size=size[!index0])
+    }
+    ans
+}
+
+
+
+pzanegbin = function(q, p0, size, prob=NULL, munb=NULL) {
+    if (length(munb)) {
+        if (length(prob))
+            stop("'prob' and 'munb' both specified")
+        prob <- size/(size + munb)
+    }
+    L = max(length(q), length(p0), length(prob), length(size))
+    q = rep(q, len=L); p0 = rep(p0, len=L);
+    prob = rep(prob, len=L); size = rep(size, len=L);
+    ans = rep(0.0, len=L)
+
+    if(!is.Numeric(p0) || any(p0 < 0) || any(p0 > 1))
+        stop("'p0' must be in [0,1]")
+    ans[q >  0] = p0[q > 0] + (1-p0[q > 0]) *
+                  pposnegbin(q[q > 0], size=size[q > 0], prob=prob[q > 0])
+    ans[q <  0] = 0
+    ans[q == 0] = p0[q == 0]
+    ans
+}
+
+qzanegbin = function(p, p0, size, prob=NULL, munb=NULL) {
+    if (length(munb)) {
+        if (length(prob))
+            stop("'prob' and 'munb' both specified")
+        prob <- size/(size + munb)
+    }
+    L = max(length(p), length(p0), length(prob), length(size))
+    p = rep(p, len=L); p0 = rep(p0, len=L);
+    prob = rep(prob, len=L); size = rep(size, len=L);
+    ans = rep(0.0, len=L)
+
+    if(!is.Numeric(p0) || any(p0 < 0) || any(p0 > 1))
+        stop("'p0' must be between 0 and 1 inclusive")
+    ans = p
+    ans[p <= p0] = 0
+    ans[p > p0] = qposnegbin((p[p>p0]-p0[p>p0])/(1-p0[p>p0]), prob=prob[p>p0],
+                             size=size[p>p0])
+    ans
+}
+
+rzanegbin = function(n, p0, size, prob=NULL, munb=NULL) {
+    if (length(munb)) {
+        if (length(prob))
+            stop("'prob' and 'munb' both specified")
+        prob <- size/(size + munb)
+    }
+    ans = rposnegbin(n, prob=prob, size=size)
+    p0 = rep(p0, len=length(ans))
+    if(!is.Numeric(p0) || any(p0 < 0) || any(p0 > 1))
+        stop("'p0' must be between 0 and 1 inclusive")
+    ifelse(runif(n) < p0, 0, ans)
+}
+
+
+
+
+
+dzapois = function(x, lambda, p0=0, log=FALSE) {
+    if(!is.logical(log.arg <- log)) stop("bad input for 'log'")
+    rm(log)
+
+    L = max(length(x), length(lambda), length(p0))
+    x = rep(x, len=L); lambda = rep(lambda, len=L); p0 = rep(p0, len=L);
+    ans = rep(0.0, len=L)
+    if(!is.Numeric(p0) || any(p0 < 0) || any(p0 > 1))
+        stop("'p0' must be in [0,1]")
+    index0 = x==0
+
+    if(log.arg) {
+        ans[ index0] = log(p0[index0])
+        ans[!index0] = log1p(-p0[!index0]) +
+                       dpospois(x[!index0], lambda[!index0], log=TRUE)
+    } else {
+        ans[ index0] = p0[index0]
+        ans[!index0] = (1-p0[!index0]) * dpospois(x[!index0], lambda[!index0])
+    }
+    ans
+}
+
+
+
+pzapois = function(q, lambda, p0=0) {
+    L = max(length(q), length(lambda), length(p0))
+    q = rep(q, len=L); lambda = rep(lambda, len=L); p0 = rep(p0, len=L);
+    ans = rep(0.0, len=L)
+
+    if(!is.Numeric(p0) || any(p0 < 0) || any(p0 > 1))
+        stop("'p0' must be in [0,1]")
+    ans[q >  0] = p0[q > 0] + (1-p0[q > 0]) * ppospois(q[q > 0], lambda[q > 0])
+    ans[q <  0] = 0
+    ans[q == 0] = p0[q == 0]
+    ans
+}
+
+
+qzapois = function(p, lambda, p0=0) {
+    nn = max(length(p), length(lambda), length(p0))
+    p = rep(p, len=nn); lambda = rep(lambda, len=nn); p0 = rep(p0, len=nn)
+    if(!is.Numeric(p0) || any(p0 < 0) || any(p0 > 1))
+        stop("'p0' must be between 0 and 1 inclusive")
+    ans = p
+    ans[p<=p0] = 0
+    ans[p>p0] = qpospois((p[p>p0]-p0[p>p0])/(1-p0[p>p0]), lam=lambda[p>p0])
+    ans
+}
+
+rzapois = function(n, lambda, p0=0) {
+    ans = rpospois(n, lambda)
+    p0 = rep(p0, len=length(ans))
+    if(!is.Numeric(p0) || any(p0 < 0) || any(p0 > 1))
+        stop("p0 must be between 0 and 1 inclusive")
+    ifelse(runif(n) < p0, 0, ans)
+}
+
+
+
+
+
+dzipois = function(x, lambda, phi=0, log=FALSE) {
+    if(!is.logical(log.arg <- log)) stop("bad input for 'log'")
+    rm(log)
+
     L = max(length(x), length(lambda), length(phi))
     x = rep(x, len=L); lambda = rep(lambda, len=L); phi = rep(phi, len=L);
-    ans = dpois(x, lambda)
+    ans = rep(0.0, len=L)
     if(!is.Numeric(phi) || any(phi < 0) || any(phi > 1))
         stop("'phi' must be between 0 and 1 inclusive")
-    ifelse(x==0, phi + (1-phi) * ans, (1-phi) * ans)
+
+    index0 = x==0
+    if(log.arg) {
+        ans[ index0] = log(phi[index0] + (1-phi[index0]) *
+                           dpois(x[index0], lambda[index0]))
+        ans[!index0] = log1p(-phi[!index0]) +
+                       dpois(x[!index0], lambda[!index0], log=TRUE)
+    } else {
+        ans[ index0] = phi[index0] + (1-phi[index0]) *
+                       dpois(x[index0], lambda[index0])
+        ans[!index0] = (1-phi[!index0]) * dpois(x[!index0], lambda[!index0])
+    }
+    ans
 }
 
 pzipois = function(q, lambda, phi=0) {
@@ -21,7 +191,7 @@ pzipois = function(q, lambda, phi=0) {
     phi = rep(phi, length=length(ans))
     if(!is.Numeric(phi) || any(phi < 0) || any(phi > 1))
         stop("'phi' must be between 0 and 1 inclusive")
-    phi + (1-phi) * ans
+    ifelse(x<0, 0, phi + (1-phi) * ans)
 }
 
 qzipois = function(p, lambda, phi=0) {
@@ -97,7 +267,7 @@ yip88 = function(link.lambda="loge", n.arg=NULL)
         lambda = eta2theta(eta, .link.lambda)
         temp5 = exp(-lambda)
         phi = (1 - temp5 - extra$sumw/extra$narg) / (1 - temp5)
-        if(any(phi) <= 0)
+        if(any(phi <= 0))
             stop("non-positive value(s) of phi")
         (1-phi) * lambda
     }, list( .link.lambda=link.lambda ))),
@@ -135,9 +305,9 @@ yip88 = function(link.lambda="loge", n.arg=NULL)
 
 
 
-zapoisson = function(lp0="logit", llambda="loge",
-                     ep0=list(), elambda=list(),
-                     zero=NULL)
+ zapoisson = function(lp0="logit", llambda="loge",
+                      ep0=list(), elambda=list(),
+                      zero=NULL)
 {
     if(mode(lp0) != "character" && mode(lp0) != "name")
         lp0 = as.character(substitute(lp0))
@@ -161,8 +331,12 @@ zapoisson = function(lp0="logit", llambda="loge",
     }), list( .zero=zero ))),
     initialize=eval(substitute(expression({
         y = as.matrix(y)
+        if(any(y != round(y )))
+            stop("the response must be integer-valued")
+        if(any(y < 0))
+            stop("the response must not have negative values")
+
         extra$y0 = y0 = ifelse(y==0, 1, 0)
-        extra$ymat = ymat = cbind(y0=y0, y=y)
         extra$NOS = NOS = ncoly = ncol(y)  # Number of species
         extra$skip.these = skip.these = matrix(as.logical(y0), n, NOS)
 
@@ -201,17 +375,8 @@ zapoisson = function(lp0="logit", llambda="loge",
         function(mu,y,w,residuals=FALSE, eta,extra=NULL) {
         NOS = extra$NOS
         p0 = cbind(eta2theta(eta[,1:NOS], .lp0, earg= .ep0))
-        skip = extra$skip.these
         lambda = cbind(eta2theta(eta[,NOS+(1:NOS)], .llambda, earg= .elambda ))
-        ans = 0
-        for(spp. in 1:NOS) {
-            ans = ans + sum(w[skip[,spp.]] * log(p0[skip[,spp.],spp.])) +
-                  sum(w[!skip[,spp.]] * (log1p(-p0[!skip[,spp.],spp.]) -
-                      log1p(-exp(-lambda[!skip[,spp.],spp.])) -
-                      lambda[!skip[,spp.],spp.] +
-                      y[!skip[,spp.],spp.]*log(lambda[!skip[,spp.],spp.])))
-        }
-        ans
+        sum(w * dzapois(x=y, p0=p0, lambda=lambda, log=TRUE))
     }, list( .lp0=lp0, .llambda=llambda, .ep0= ep0, .elambda= elambda ))),
     vfamily=c("zapoisson"),
     deriv=eval(substitute(expression({
@@ -233,7 +398,7 @@ zapoisson = function(lp0="logit", llambda="loge",
         ans
     }), list( .lp0=lp0, .llambda=llambda, .ep0= ep0, .elambda= elambda ))),
     weight=eval(substitute(expression({
-        wz = matrix( .Machine$double.eps^0.8, n, 2*NOS)
+        wz = matrix( 10 * .Machine$double.eps^(3/4), n, 2*NOS)
         for(spp. in 1:NOS) {
             temp4 = exp(lambda[!skip[,spp.], spp.])
             ed2l.dlambda2 = -temp4 * (1/lambda[!skip[,spp.],spp.] -
@@ -244,7 +409,7 @@ zapoisson = function(lp0="logit", llambda="loge",
         }
 
         tmp100 = mup0*(1-mup0)
-        tmp200 = if(.lp0 == "logit") {
+        tmp200 = if( .lp0 == "logit") {
             cbind(w * tmp100)
         } else {
             cbind(w * dtheta.deta(mup0, link= .lp0, earg= .ep0)^2 / tmp100)
@@ -252,7 +417,7 @@ zapoisson = function(lp0="logit", llambda="loge",
         for(ii in 1:NOS) {
             index200 = abs(tmp200[,ii]) < .Machine$double.eps
             if(any(index200)) {
-                tmp200[index200,ii] = .Machine$double.eps # Diagonal 0's are bad 
+                tmp200[index200,ii] = 10.0 * .Machine$double.eps^(3/4)
             }
         }
         wz[,1:NOS] =  tmp200
@@ -262,17 +427,26 @@ zapoisson = function(lp0="logit", llambda="loge",
 
 
 
-zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
-                         ep0=list(), emunb =list(), ek = list(),
-                         ik = 1, zero = -3, cutoff = 0.995, method.init=3)
+ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
+                          ep0=list(), emunb =list(), ek = list(),
+                          ipnb0 = NULL, ik = NULL, zero = -3,
+                          cutoff = 0.995, method.init=1,
+                          shrinkage.init=0.95)
 {
 
+
+
     if(!is.Numeric(cutoff, positiv=TRUE, allow=1) || cutoff<0.8 || cutoff>=1)
         stop("range error in the argument cutoff")
-    if(!is.Numeric(ik, positiv=TRUE))
-        stop("ik must contain positive values only")
+    if(length(ipnb0) && (!is.Numeric(ipnb0, positiv=TRUE) ||
+       max(ipnb0) >= 1))
+        stop("If given, ipnb0 must contain values in (0,1) only")
+    if(length(ik) && !is.Numeric(ik, positiv=TRUE))
+        stop("If given, ik must contain positive values only")
     if(!is.Numeric(method.init, allow=1, integ=TRUE, posit=TRUE) ||
-       method.init > 3) stop("argument \"method.init\" must be 1, 2 or 3")
+       method.init > 2) stop("argument \"method.init\" must be 1 or 2")
+    if(!is.Numeric(shrinkage.init, allow=1) || shrinkage.init < 0 ||
+       shrinkage.init > 1) stop("bad input for argument \"shrinkage.init\"")
 
     if(mode(lmunb) != "character" && mode(lmunb) != "name")
         lmunb = as.character(substitute(lmunb))
@@ -302,6 +476,10 @@ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
         y = as.matrix(y)
         extra$NOS = NOS = ncoly = ncol(y)  # Number of species
         M = 3 * ncoly # 
+        if(any(y != round(y)))
+            stop("the response must be integer-valued")
+        if(any(y < 0))
+            stop("the response must not have negative values")
 
         mynames1 = if(NOS==1) "p0" else paste("p0", 1:NOS, sep="")
         mynames2 = if(NOS==1) "munb" else paste("munb", 1:NOS, sep="")
@@ -312,29 +490,65 @@ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
               namesof(mynames3, .lk, earg= .ek, tag= FALSE))
         predictors.names = predictors.names[interleave.VGAM(3*NOS, M=3)]
         extra$y0 = y0 = ifelse(y==0, 1, 0)
-        extra$ymat = ymat = cbind(y0=y0, y=y)
         extra$skip.these = skip.these = matrix(as.logical(y0), n, NOS)
 
         if(!length(etastart)) {
-            if( .method.init == 3) {
-                mu.init = y + 1/16
+            mu.init = y
+            for(iii in 1:ncol(y)) {
+                index.posy = (y[,iii] > 0)
+                use.this = if( .method.init == 2) {
+                    weighted.mean(y[index.posy,iii], w[index.posy])
+                } else {
+                    median(rep(y[index.posy,iii], w[index.posy])) + 1/2
+                }
+                mu.init[ index.posy,iii] = (1- .sinit) * y[index.posy,iii] +
+                                           .sinit * use.this
+                mu.init[!index.posy,iii] = use.this
+                max.use.this =  7 * use.this + 10
+                vecTF = (mu.init[,iii] > max.use.this)
+                if(any(vecTF))
+                    mu.init[vecTF,iii] = max.use.this
+            }
+
+
+            pnb0 = matrix(if(length( .ipnb0)) .ipnb0 else -1,
+                          nr=n, nc=NOS, byrow=TRUE)
+            for(spp. in 1:NOS) {
+                if(any(pnb0[,spp.] < 0)) {
+                    index.y0 = y[,spp.] < 0.5
+                    pnb0[,spp.] = max(min(sum(index.y0)/n, 0.97), 0.03)
+                }
+            }
+
+
+            if( is.Numeric( .ik )) {
+                kmat0 = matrix( .ik, nr=n, nc=ncoly, byrow=TRUE)
             } else {
-                mu.init = y
-                for(iii in 1:ncol(y))
-                    mu.init[,iii] = if( .method.init == 2)
-                        weighted.mean(y[,iii], w=w) else
-                        median(rep(y[,iii], w)) + 1/8
+                posnegbinomial.Loglikfun = function(kmat, y, x, w, extraargs) {
+                     munb = extraargs
+                     sum(w * dposnegbin(x=y, munb=munb, size=kmat, log=TRUE))
+                }
+                k.grid = 2^((-6):6)
+                kmat0 = matrix(0, nr=n, nc=NOS) 
+                for(spp. in 1:NOS) {
+                    index.posy = y[,spp.] > 0
+                    posy = y[index.posy, spp.]
+                    kmat0[,spp.] = getMaxMin(k.grid,
+                                      objfun=posnegbinomial.Loglikfun,
+                                      y=posy, x=x[index.posy,], w=w[index.posy],
+                                      extraargs= mu.init[index.posy, spp.])
+                }
             }
-            kmat0 = matrix( .ik, nrow(y), ncoly, byrow=TRUE) # Initial kmat
-            pnb0 = (kmat0 / (kmat0 + mu.init))^kmat0
-            etastart = cbind(theta2eta((0.5 + w * y0) / (1 + w), .lp0, earg= .ep0 ),
-                             theta2eta(mu.init*(1-pnb0), .lmunb, earg= .emunb ),
-                             theta2eta(kmat0, .lk, earg= .ek ))
+
+            etastart = cbind(theta2eta(pnb0,    .lp0,   earg= .ep0 ),
+                             theta2eta(mu.init, .lmunb, earg= .emunb),
+                             theta2eta(kmat0,   .lk,    earg= .ek ))
             etastart = etastart[,interleave.VGAM(ncol(etastart),M=3)]
         }
-    }), list( .lp0=lp0, .lmunb=lmunb, .lk=lk, .ik=ik,
+    }), list( .lp0=lp0, .lmunb=lmunb, .lk=lk,
+              .ipnb0=ipnb0, .ik=ik,
               .ep0=ep0, .emunb=emunb, .ek=ek,
-              .method.init=method.init ))), 
+              .method.init=method.init, .sinit=shrinkage.init ))), 
     inverse=eval(substitute(function(eta, extra=NULL) {
         NOS = extra$NOS
         p0 = eta2theta(eta[,3*(1:NOS)-2], .lp0, earg= .ep0 )
@@ -345,7 +559,8 @@ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
     }, list( .lp0=lp0, .lk=lk, .lmunb=lmunb,
              .ep0=ep0, .emunb=emunb, .ek=ek ))),
     last=eval(substitute(expression({
-        misc$link = c(rep( .lp0, length=NOS), rep( .lmunb, length=NOS),
+        misc$link = c(rep( .lp0, length=NOS),
+                      rep( .lmunb, length=NOS),
                       rep( .lk, length=NOS))
         temp.names = c(mynames1, mynames2, mynames3)
         temp.names = temp.names[interleave.VGAM(3*NOS, M=3)]
@@ -368,22 +583,7 @@ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
         p0 = eta2theta(eta[,3*(1:NOS)-2,drop=FALSE], .lp0, earg= .ep0 )
         munb = eta2theta(eta[,3*(1:NOS)-1,drop=FALSE], .lmunb, earg= .emunb )
         kmat = eta2theta(eta[,3*(1:NOS),drop=FALSE], .lk, earg= .ek )
-        skip = extra$skip.these
-        pnb0 = (kmat / (kmat + munb))^kmat
-        ans = 0.0
-        for(spp. in 1:NOS) {
-            i8 = skip[,spp.]
-            ans = ans + sum(w[i8] * log(p0[i8,spp.])) +
-            sum(w[!i8] * (log1p(-p0[!i8,spp.]) + y[!i8,spp.] * 
-                log(munb[!i8,spp.]/(munb[!i8,spp.]+
-                kmat[!i8,spp.])) + kmat[!i8,spp.]*log(kmat[!i8,spp.] /
-                (munb[!i8,spp.]+kmat[!i8,spp.])) +
-                lgamma(y[!i8,spp.]+kmat[!i8,spp.]) - 
-                lgamma(kmat[!i8,spp.]) - lgamma(y[!i8,spp.]+1) -
-                (if(is.R())
-                log1p(-pnb0[!i8,spp.]) else log1p( - pnb0[!i8,spp.]))))
-        }
-        ans
+        sum(w * dzanegbin(x=y, p0=p0, munb=munb, size=kmat, log=TRUE))
     }, list( .lp0=lp0, .lmunb=lmunb, .lk=lk,
              .ep0=ep0, .emunb=emunb, .ek=ek ))),
     vfamily=c("zanegbinomial"),
@@ -420,10 +620,11 @@ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
         myderiv = w * cbind(dl.dmunb * dmunb.deta, dl.dk * dk.deta)
 
         mup0 = p0
-        temp3 = if(.lp0 == "logit") {
+        temp3 = if( .lp0 == "logit") {
             w * (y0 - mup0)
         } else
-            w * dtheta.deta(mup0, link=.lp0, earg= .ep0 ) * (y0/mup0 - 1) / (1-mup0)
+            w * dtheta.deta(mup0, link= .lp0, earg= .ep0 ) *
+                (y0/mup0 - 1) / (1-mup0)
 
         ans = cbind(temp3, myderiv)
         ans = ans[,interleave.VGAM(ncol(ans), M=3)]
@@ -433,8 +634,13 @@ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
     weight=eval(substitute(expression({
         wz = matrix(0, n, 6*NOS-1)  # wz is not 'diagonal' 
         pnb0 = (kmat / (kmat + munb))^kmat
-        ed2l.dmunb2 = (1/munb - (munb + kmat*(1-pnb0))/(munb+kmat)^2) /
-                      (1-pnb0) - d2l0.dthetas2[,,1]
+        ed2l.dmunb2 = (1/munb - (munb + kmat*(1-pnb0))/(munb +
+                       kmat)^2) / (1-pnb0) - d2l0.dthetas2[,,1]
+        wz[,3*(1:NOS)-1] = w * dmunb.deta^2 * ed2l.dmunb2
+        wz[,3*NOS+3*(1:NOS)-1] = -w * d2l0.dthetas2[,,3] * dmunb.deta * dk.deta
+
+
+
         fred = dotFortran(name="enbin8",
                       ans=double(n*NOS), as.double(kmat),
                       as.double(kmat/(munb+kmat)), as.double(.cutoff),
@@ -445,10 +651,10 @@ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
         dim(fred$ans) = c(n, NOS)
         ed2l.dk2 = -fred$ans/(1-pnb0) - 1/kmat + 1/(kmat+munb) -
                    munb * pnb0 / ((1-pnb0)*(munb+kmat)^2) - d2l0.dthetas2[,,2]
-        wz[,3*(1:NOS)-1] = w * dmunb.deta^2 * ed2l.dmunb2
         wz[,3*(1:NOS)] = w * dk.deta^2 * ed2l.dk2
 
-        wz[,3*NOS+3*(1:NOS)-1] = -w * d2l0.dthetas2[,,3] * dmunb.deta * dk.deta
+
+
 
         tmp100 = mup0*(1-mup0)
         tmp200 = if(.lp0 == "logit") {
@@ -466,14 +672,18 @@ zanegbinomial = function(lp0="logit", lmunb = "loge", lk = "loge",
 
         for(spp. in 1:NOS) {
             wz[skip[,spp.],3*spp. - 1] = 
-            wz[skip[,spp.],3*spp.] = .Machine$double.eps^0.5
+            wz[skip[,spp.],3*spp.] = sqrt(.Machine$double.eps)
             wz[skip[,spp.],3*NOS+3*(spp.)-1] = 0
         }
+
         wz
     }), list( .lp0=lp0, .ep0=ep0, .cutoff=cutoff ))))
 }
 
 
+
+
+if(FALSE)
 rposnegbin = function(n, munb, k) {
     if(!is.Numeric(k, posit=TRUE))
         stop("argument \"k\" must be positive")
@@ -491,14 +701,29 @@ rposnegbin = function(n, munb, k) {
         index = ans == 0
     }
     ans
-} 
+}
 
 
 
-zipoisson = function(lphi="logit", llambda="loge",
-                     ephi=list(), elambda =list(),
-                     iphi=NULL, method.init=1,
-                     shrinkage.init=0.8, zero=NULL)
+if(FALSE)
+dposnegbin = function(x, munb, k, log=FALSE) {
+    if(!is.Numeric(k, posit=TRUE))
+        stop("argument \"k\" must be positive")
+    if(!is.Numeric(munb, posit=TRUE))
+        stop("argument \"munb\" must be positive")
+    ans = dnbinom(x=x, mu=munb, size=k, log=log)
+    ans0 = dnbinom(x=0, mu=munb, size=k, log=FALSE)
+    ans = if(log) ans - log1p(-ans0) else ans/(1-ans0)
+    ans[x == 0] = if(log) -Inf else 0
+    ans
+}
+
+
+
+ zipoisson = function(lphi="logit", llambda="loge",
+                      ephi=list(), elambda =list(),
+                      iphi=NULL, method.init=1,
+                      shrinkage.init=0.8, zero=NULL)
 {
     if(mode(lphi) != "character" && mode(lphi) != "name")
         lphi = as.character(substitute(lphi))
@@ -524,6 +749,8 @@ zipoisson = function(lphi="logit", llambda="loge",
     }), list( .zero=zero ))),
     initialize=eval(substitute(expression({
         if(ncol(as.matrix(y)) != 1) stop("multivariate responses not allowed")
+        if(any(round(y) != y))
+          stop("integer-valued responses only allowed for the zipoisson family")
         predictors.names = c(
             namesof("phi", .lphi, earg= .ephi, tag=FALSE),
             namesof("lambda", .llambda, earg= .ephi, tag=FALSE))
@@ -537,8 +764,8 @@ zipoisson = function(lphi="logit", llambda="loge",
                 mymean = weighted.mean(y[y>0], w[y>0]) + 1/16
                 lambda.init = (1- .sinit) * (y+1/8) + .sinit * mymean
             } else {
-                mymedian = median(y[y>0]) + 1/16
-                lambda.init = (1- .sinit) * (y+1/8) + .sinit * mymedian
+                use.this = median(y[y>0]) + 1/16
+                lambda.init = (1- .sinit) * (y+1/8) + .sinit * use.this
             }
             etastart = cbind(theta2eta(rep(phi.init, len=n), .lphi, earg= .ephi ),
                              theta2eta(lambda.init, .llambda, earg= .ephi ))
@@ -571,12 +798,7 @@ zipoisson = function(lphi="logit", llambda="loge",
         phi = pmax(phi, smallno)
         phi = pmin(phi, 1.0-smallno)
         lambda = eta2theta(eta[,2], .llambda, earg= .elambda )
-        index = (y==0)
-        tmp8 = phi + (1.0-phi)*exp(-lambda)
-        ell0 = log(tmp8[index])
-        ell1 = log1p(-phi[!index]) +
-               dpois(y[!index], lambda= lambda[!index], log=TRUE)
-        sum(w[index] * ell0) + sum(w[!index] * ell1)
+        sum(w * dzipois(x=y, phi=phi, lambda=lambda, log=TRUE))
     }, list( .lphi=lphi, .llambda=llambda,
              .ephi=ephi, .elambda=elambda ))),
     vfamily=c("zipoisson"),
@@ -587,16 +809,16 @@ zipoisson = function(lphi="logit", llambda="loge",
         phi = pmin(phi, 1.0-smallno)
         lambda = eta2theta(eta[,2], .llambda, earg= .elambda )
         tmp8 = phi + (1-phi)*exp(-lambda)
-        index = (y==0)
+        index0 = (y==0)
         dl.dphi = (1-exp(-lambda)) / tmp8
-        dl.dphi[!index] = -1 / (1-phi[!index])
+        dl.dphi[!index0] = -1 / (1-phi[!index0])
         dl.dlambda = -(1-phi) * exp(-lambda) / tmp8
-        dl.dlambda[!index] = (y[!index] - lambda[!index]) / lambda[!index] 
+        dl.dlambda[!index0] = (y[!index0] - lambda[!index0]) / lambda[!index0]
         dphi.deta = dtheta.deta(phi, .lphi, earg= .ephi)
         dlambda.deta = dtheta.deta(lambda, .llambda, earg= .elambda )
         ans = w * cbind(dl.dphi * dphi.deta, dl.dlambda * dlambda.deta)
-        if(.llambda == "loge" && (any(lambda[!index] < .Machine$double.eps))) {
-            ans[!index,2] = w[!index] * (y[!index] - lambda[!index])
+        if(.llambda == "loge" && (any(lambda[!index0] < .Machine$double.eps))) {
+            ans[!index0,2] = w[!index0] * (y[!index0] - lambda[!index0])
         }
         ans
     }), list( .lphi=lphi, .llambda=llambda,
@@ -609,8 +831,8 @@ zipoisson = function(lphi="logit", llambda="loge",
         wz[,iam(1,1,M)] = d2l.dphi2 * dphi.deta^2
         wz[,iam(2,2,M)] = d2l.dlambda2 * dlambda.deta^2
         wz[,iam(1,2,M)] = d2l.dphilambda * dphi.deta * dlambda.deta
-        if(.llambda == "loge" && (any(lambda[!index] < .Machine$double.eps))) {
-            ind5 = !index & (lambda < .Machine$double.eps)
+        if(.llambda == "loge" && (any(lambda[!index0] < .Machine$double.eps))) {
+            ind5 = !index0 & (lambda < .Machine$double.eps)
             if(any(ind5))
                 wz[ind5,iam(2,2,M)] = (1-phi[ind5]) * .Machine$double.eps
         }
@@ -621,9 +843,9 @@ zipoisson = function(lphi="logit", llambda="loge",
 
 
 
-zibinomial = function(lphi="logit", link.mu="logit",
-                      ephi=list(), emu=list(),
-                      iphi=NULL, zero=1, mv=FALSE)
+ zibinomial = function(lphi="logit", link.mu="logit",
+                       ephi=list(), emu=list(),
+                       iphi=NULL, zero=1, mv=FALSE)
 {
     if(as.logical(mv)) stop("argument \"mv\" must be FALSE")
     if(mode(lphi) != "character" && mode(lphi) != "name")
@@ -807,7 +1029,7 @@ rzibinom = function(n, size, prob, phi=0) {
 
 
 
-dzinb = function(x, phi, size, prob=NULL, munb=NULL, log=FALSE) {
+dzinegbin = function(x, phi, size, prob=NULL, munb=NULL, log=FALSE) {
     if (length(munb)) {
         if (length(prob))
             stop("'prob' and 'munb' both specified")
@@ -825,7 +1047,7 @@ dzinb = function(x, phi, size, prob=NULL, munb=NULL, log=FALSE) {
                 ifelse(x==0, phi + (1-phi) * ans, (1-phi) * ans)
 }
 
-pzinb = function(q, phi, size, prob=NULL, munb=NULL) {
+pzinegbin = function(q, phi, size, prob=NULL, munb=NULL) {
     if (length(munb)) {
         if (length(prob))
             stop("'prob' and 'munb' both specified")
@@ -837,7 +1059,7 @@ pzinb = function(q, phi, size, prob=NULL, munb=NULL) {
     phi + (1-phi) * ans
 }
 
-qzinb = function(p, phi, size, prob=NULL, munb=NULL) {
+qzinegbin = function(p, phi, size, prob=NULL, munb=NULL) {
     if (length(munb)) {
         if (length(prob))
             stop("'prob' and 'munb' both specified")
@@ -857,7 +1079,7 @@ qzinb = function(p, phi, size, prob=NULL, munb=NULL) {
     ans
 }
 
-rzinb = function(n, phi, size, prob=NULL, munb=NULL) {
+rzinegbin = function(n, phi, size, prob=NULL, munb=NULL) {
     if (length(munb)) {
         if (length(prob))
             stop("'prob' and 'munb' both specified")
@@ -882,20 +1104,24 @@ zinegbinomial.control <- function(save.weight=TRUE, ...)
 
 
 
-zinegbinomial = function(lphi="logit", lmunb = "loge", lk = "loge",
-                         ephi=list(), emunb =list(), ek = list(),
-                         iphi = NULL, ik = NULL, zero = -3, method.init=1,
-                         shrinkage.init=0.95,
-                         nsimEIM=200)
+ zinegbinomial = function(lphi="logit", lmunb = "loge", lk = "loge",
+                          ephi=list(), emunb =list(), ek = list(),
+                          iphi = NULL, ik = NULL, zero = -3, method.init=1,
+                          shrinkage.init=0.95,
+                          nsimEIM=200)
 {
+
+
     if(length(iphi) && (!is.Numeric(iphi, positiv=TRUE) || any(iphi >= 1)))
         stop("'iphi' must contain values in (0,1)")
     if(length(ik) && !is.Numeric(ik, positiv=TRUE))
         stop("'ik' must contain positive values only")
     if(!is.Numeric(method.init, allow=1, integ=TRUE, posit=TRUE) ||
        method.init > 3) stop("argument \"method.init\" must be 1, 2 or 3")
-    if(!is.Numeric(nsimEIM, allow=1, integ=TRUE) || nsimEIM <= 50)
-        stop("'nsimEIM' should be an integer greater than 50")
+    if(!is.Numeric(nsimEIM, allow=1, integ=TRUE))
+        stop("'nsimEIM' must be a positive integer")
+    if(nsimEIM <= 10)
+        warning("'nsimEIM' should be greater than 10, say")
     if(!is.Numeric(shrinkage.init, allow=1) || shrinkage.init < 0 ||
        shrinkage.init > 1) stop("bad input for argument \"shrinkage.init\"")
 
@@ -964,7 +1190,7 @@ zinegbinomial = function(lphi="logit", lmunb = "loge", lk = "loge",
             if( is.Numeric( .ik )) {
                 matrix( .ik, nr=n, nc=ncoly, byrow=TRUE)
             } else {
-                zinb.Loglikfun = function(kval, y, x, w, extraargs) {
+                zinegbin.Loglikfun = function(kval, y, x, w, extraargs) {
                     index = (y == 0)
                     phivec = extraargs$phi
                     muvec = extraargs$mu
@@ -975,11 +1201,11 @@ zinegbinomial = function(lphi="logit", lmunb = "loge", lk = "loge",
                                 mu= muvec[!index], size=kval, log=TRUE)
                     sum(w[index] * ell0) + sum(w[!index] * ell1)
                 }
-                k.grid = 2^((-3):6)
+                k.grid = 2^((-6):6)
                 kay.init = matrix(0, nr=n, nc=NOS)
                 for(spp. in 1:NOS) {
                     kay.init[,spp.] = getMaxMin(k.grid,
-                                      objfun=zinb.Loglikfun,
+                                      objfun=zinegbin.Loglikfun,
                                       y=y[,spp.], x=x, w=w,
                                       extraargs= list(phi=phi.init[,spp.],
                                                       mu=mu.init[,spp.]))
@@ -1037,23 +1263,7 @@ zinegbinomial = function(lphi="logit", lmunb = "loge", lk = "loge",
         phi  = eta2theta(eta[,3*(1:NOS)-2,drop=FALSE], .lphi,  earg= .ephi )
         munb = eta2theta(eta[,3*(1:NOS)-1,drop=FALSE], .lmunb, earg= .emunb )
         kmat = eta2theta(eta[,3*(1:NOS),  drop=FALSE], .lk,    earg= .ek )
-
-
-        ans = 0.0
-        for(spp. in 1:NOS) {
-            ytemp = y[,spp.]
-            phitemp = phi[,spp.]
-            ktemp = kmat[,spp.]
-            mutemp = munb[,spp.]
-            index = (ytemp == 0)
-            tmp8 = phitemp[index] + (1.0-phitemp[index]) *
-                   dnbinom(ytemp[index], mu= mutemp[index], size=ktemp[index])
-            ell0 = log(tmp8)
-            ell1 = log1p(-phitemp[!index]) + dnbinom(ytemp[!index],
-                        mu= mutemp[!index], size=ktemp[!index], log=TRUE)
-            ans = ans + sum(w[index] * ell0) + sum(w[!index] * ell1)
-        }
-        ans
+        sum(w*dzinegbin(x=y, phi=phi, munb=munb, size=kmat, log=TRUE))
     }, list( .lphi=lphi, .lmunb=lmunb, .lk=lk,
              .ephi=ephi, .emunb=emunb, .ek=ek ))),
     vfamily=c("zinegbinomial"),
@@ -1107,7 +1317,8 @@ zinegbinomial = function(lphi="logit", lmunb = "loge", lk = "loge",
             run.varcov = 0
             sdl.dthetas =  matrix(0, n, 3)
             for(ii in 1:( .nsimEIM )) {
-                ysim = rzinb(n=n,phi=phi[,spp.],size=kmat[,spp.],mu=munb[,spp.])
+                ysim = rzinegbin(n=n, phi=phi[,spp.],
+                                 size=kmat[,spp.], mu=munb[,spp.])
                 index = (ysim == 0)
 
                 yvec. = ysim[index]
@@ -1127,7 +1338,6 @@ zinegbinomial = function(lphi="logit", lmunb = "loge", lk = "loge",
                         (yvec. +kmat.)/(munb.+kmat.) + 1 +
                         log(kmat./(kmat.+munb.))
                 sdl.dthetas[!index,] = cbind(dl.dphi, dl.dmunb, dl.dk)
-                rm(ysim)
                 temp3 = sdl.dthetas
                 run.varcov = ((ii-1) * run.varcov +
                            temp3[,ind1$row.index]*temp3[,ind1$col.index]) / ii
diff --git a/R/fitted.vlm.q b/R/fitted.vlm.q
index e52aa55..e6b7289 100644
--- a/R/fitted.vlm.q
+++ b/R/fitted.vlm.q
@@ -1,13 +1,13 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
-fitted.vlm <- function(object, matrix=TRUE, ...)
+fitted.vlm <- function(object, matrix.arg=TRUE, ...)
 {
 
     answer = 
-    if(matrix)
+    if(matrix.arg)
         object at fitted.values else
     {
         if(!is.matrix(object at fitted.values) || !length(object at fitted.values))
diff --git a/R/generic.q b/R/generic.q
index 9150006..884c489 100644
--- a/R/generic.q
+++ b/R/generic.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 add1.vgam <- function(...)
diff --git a/R/links.q b/R/links.q
index ad545bf..692d1c1 100644
--- a/R/links.q
+++ b/R/links.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/logLik.vlm.q b/R/logLik.vlm.q
index 238260b..0e682fe 100644
--- a/R/logLik.vlm.q
+++ b/R/logLik.vlm.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -12,6 +12,11 @@ if(!isGeneric("logLik"))
 setMethod("logLik",  "vlm", function(object, ...)
     logLik.vlm(object, ...))
 
+setMethod("logLik",  "vglm", function(object, ...)
+    logLik.vlm(object, ...))
+
+setMethod("logLik",  "vgam", function(object, ...)
+    logLik.vlm(object, ...))
 
 
 
diff --git a/R/model.matrix.vglm.q b/R/model.matrix.vglm.q
index d9a35c0..a17be0a 100644
--- a/R/model.matrix.vglm.q
+++ b/R/model.matrix.vglm.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -191,13 +191,16 @@ lm2vlm.model.matrix <- function(x, Blist=NULL, assign.attributes=TRUE,
 }
 
 
-model.matrixvlm = function(object, type=c("vlm","lm"), ...) {
+model.matrixvlm = function(object, type=c("vlm","lm","lm2"), ...) {
+
 
     if(mode(type) != "character" && mode(type) != "name")
     type <- as.character(substitute(type))
-    type <- match.arg(type, c("vlm","lm"))[1]
+    type <- match.arg(type, c("vlm","lm","lm2"))[1]
 
     x <- slot(object, "x")
+    Xm2 <- slot(object, "Xm2")
+
     if(!length(x)) {
         data = model.frame(object, xlev=object at xlevels, ...) 
 
@@ -207,29 +210,63 @@ model.matrixvlm = function(object, type=c("vlm","lm"), ...) {
                                    contrasts.arg = kill.con)
         if(is.R()) {
 
-if(TRUE) {
-    attrassigndefault <- function(mmat, tt) {
-      if (!inherits(tt, "terms"))
-        stop("need terms object")
-      aa <- attr(mmat, "assign")
-      if (is.null(aa))
-        stop("argument is not really a model matrix")
-      ll <- attr(tt, "term.labels")
-      if (attr(tt, "intercept") > 0)
-        ll <- c("(Intercept)", ll)
-      aaa <- factor(aa, labels = ll)
-      split(order(aa), aaa)
-    }
-}
+            if(TRUE) {
+                attrassigndefault <- function(mmat, tt) {
+                  if (!inherits(tt, "terms"))
+                    stop("need terms object")
+                  aa <- attr(mmat, "assign")
+                  if (is.null(aa))
+                    stop("argument is not really a model matrix")
+                  ll <- attr(tt, "term.labels")
+                  if (attr(tt, "intercept") > 0)
+                    ll <- c("(Intercept)", ll)
+                  aaa <- factor(aa, labels = ll)
+                  split(order(aa), aaa)
+                }
+            }
             tt = terms(object)
             attr(x, "assign") <- attrassigndefault(x, tt)
         }
     }
 
+    if(type == "lm2" && !length(Xm2)) {
+        object.copy2 = object
+        object.copy2 at call = object.copy2 at callXm2
+        data = model.frame(object.copy2, xlev=object.copy2 at xlevels, ...) 
+
+        kill.con = if(length(object.copy2 at contrasts))
+                   object.copy2 at contrasts else NULL
+
+        Xm2 <- vmodel.matrix.default(object.copy2, data=data,
+                                   contrasts.arg = kill.con)
+        if(is.R()) {
+
+            if(TRUE) {
+                attrassigndefault <- function(mmat, tt) {
+                  if (!inherits(tt, "terms"))
+                    stop("need terms object")
+                  aa <- attr(mmat, "assign")
+                  if (is.null(aa))
+                    stop("argument is not really a model matrix")
+                  ll <- attr(tt, "term.labels")
+                  if (attr(tt, "intercept") > 0)
+                    ll <- c("(Intercept)", ll)
+                  aaa <- factor(aa, labels = ll)
+                  split(order(aa), aaa)
+                }
+            }
+            ttXm2 = terms(object.copy2 at misc$form2)
+            attr(Xm2, "assign") <- attrassigndefault(Xm2, ttXm2)
+        }
+    }
+
 
 
     if(type == "lm") {
         return(x)
+    } else
+    if(type == "lm2") {
+        return(Xm2)
     } else {
         M <- object at misc$M  
         Blist <- object at constraints # Is NULL if there were no constraints?
diff --git a/R/mux.q b/R/mux.q
index 3bb2fdc..2361901 100644
--- a/R/mux.q
+++ b/R/mux.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -360,7 +360,8 @@ vchol.greenstadt <- function(cc, M, silent=FALSE)
 
         temp3 <- mux55(temp$vectors, temp$values, M=M)  # , matrix.arg=TRUE)
         ans <- vchol(t(temp3), M=M, n=n, silent=silent) # , matrix.arg=TRUE)
-    ans
+
+    if(nrow(ans) == MM) ans else ans[1:MM,,drop=FALSE]
 }
 
 
diff --git a/R/plot.vglm.q b/R/plot.vglm.q
index bd83a9b..0561677 100644
--- a/R/plot.vglm.q
+++ b/R/plot.vglm.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -478,6 +478,7 @@ plotvgam.control = function(
                           add.arg= FALSE,
                           one.at.a.time= FALSE, 
                           .include.dots= TRUE,
+                          noxmean= FALSE,
                           ...) {
 
 
@@ -489,6 +490,7 @@ plotvgam.control = function(
          pcol=pcol, lcol=lcol, rcol=rcol, scol=scol,
          llwd=llwd, slwd=slwd,
          add.arg=add.arg,
+         noxmean=noxmean,
          one.at.a.time=one.at.a.time)
 
     if(.include.dots) {
@@ -538,6 +540,7 @@ vplot.numeric <- function(x, y, se.y=NULL, xlab, ylab,
                           slwd=par()$lwd,
                           add.arg= FALSE,
                           one.at.a.time= FALSE, 
+                          noxmean = FALSE, 
                           separator = ":",
 
                           ...)
@@ -573,8 +576,8 @@ vplot.numeric <- function(x, y, se.y=NULL, xlab, ylab,
     ylab <- add.hookey(ylab, deriv.arg)
 
 
-    if(xmeanAdded <- (se && !is.null(se.y) &&
-       all(substring(ylab, 1:nchar(ylab), 1:nchar(ylab)) != "("))) {
+    if(xmeanAdded <- (se && !is.null(se.y) && !noxmean &&
+                  all(substring(ylab, 1:nchar(ylab), 1:nchar(ylab)) != "("))) {
             x = c(x, mean(x))
             y = rbind(y, 0 * y[1,])
             se.y = rbind(se.y, 0 * se.y[1,])
@@ -594,9 +597,9 @@ vplot.numeric <- function(x, y, se.y=NULL, xlab, ylab,
     }
 
     if(se && !is.null(se.y)) {
-        se.upper <- uy[,which.cf] + 2 * se.y[o,which.cf,drop= FALSE]
-        se.lower <- uy[,which.cf] - 2 * se.y[o,which.cf,drop= FALSE]
-        ylim <- range(c(ylim, se.upper, se.lower))
+        se.upper <- uy + 2 * se.y[o,,drop= FALSE]
+        se.lower <- uy - 2 * se.y[o,,drop= FALSE]
+        ylim <- range(c(ylim, se.upper[,which.cf], se.lower[,which.cf]))
     }
 
     if(!is.null(residuals)) {
@@ -660,46 +663,51 @@ vplot.numeric <- function(x, y, se.y=NULL, xlab, ylab,
         scol = rep(scol, len=ncol(uy))
         slwd = rep(slwd, len=ncol(uy))
 
-        for(i in 1:ncol(uy))
-        if(!length(which.cf) ||
-           (length(which.cf) && any(which.cf==i))) {
+        for(ii in 1:ncol(uy)) {
+            if(!length(which.cf) ||
+               (length(which.cf) && any(which.cf == ii))) {
 
-            if(is.Numeric(ylim0, allow=2)) {
-                ylim = ylim0
-            } else {
-                ylim <- range(ylim0, uy[,i], na.rm= TRUE)
-                if(se && !is.null(se.y))
-                    ylim <- range(ylim0, se.lower[,i], se.upper[,i], na.rm= TRUE)
-                if(!is.null(residuals))
-                    ylim <- range(c(ylim, residuals[,i]), na.rm= TRUE)
-                ylim <- ylim.scale(ylim, scale)
-            }
-            if(ncol(uy)>1 && length(separator))
-                YLAB <- paste(ylab, separator, i, sep="")  
-            if(!add.arg) {
-                if(one.at.a.time) {
-                    readline("Hit return for the next plot ")
-                }
-                if(is.R()) {
-                    plot(ux, uy[,i], type="n", 
-                         xlim=xlim, ylim=ylim, 
-                         xlab=xlab, ylab=YLAB, ...)
+                if(is.Numeric(ylim0, allow=2)) {
+                    ylim = ylim0
                 } else {
-                    plot(ux, uy[,i], type="n", 
-                         xlim=xlim, ylim=ylim, 
-                         xlab=xlab, ylab=YLAB, ...)
+                    ylim <- range(ylim0, uy[,ii], na.rm= TRUE)
+                    if(se && !is.null(se.y))
+                        ylim <- range(ylim0, se.lower[,ii], se.upper[,ii],
+                                      na.rm=TRUE)
+                    if(!is.null(residuals))
+                        ylim <- range(c(ylim, residuals[,ii]), na.rm= TRUE)
+                    ylim <- ylim.scale(ylim, scale)
+                }
+                if(ncol(uy)>1 && length(separator))
+                    YLAB <- paste(ylab, separator, ii, sep="")  
+                if(!add.arg) {
+                    if(one.at.a.time) {
+                        readline("Hit return for the next plot ")
+                    }
+                    if(is.R()) {
+                        plot(ux, uy[,ii], type="n", 
+                             xlim=xlim, ylim=ylim, 
+                             xlab=xlab, ylab=YLAB, ...)
+                    } else {
+                        plot(ux, uy[,ii], type="n", 
+                             xlim=xlim, ylim=ylim, 
+                             xlab=xlab, ylab=YLAB, ...)
+                    }
+                }
+                lines(ux, uy[,ii], 
+                     lwd=llwd[ii], col=lcol[ii], lty=llty[ii])
+                if(!is.null(residuals))
+                    points(x, residuals[,ii], pch=pch[ii],
+                           col=pcol[ii], cex=pcex[ii]) 
+                if(rugplot)
+                    if(is.R()) rug(jx, col=rcol[ii]) else rug(jx)
+    
+                if(se && !is.null(se.y)) {
+                    lines(ux, se.upper[,ii], lty=slty[ii], lwd=slwd[ii],
+                          col=scol[ii])
+                    lines(ux, se.lower[,ii], lty=slty[ii], lwd=slwd[ii],
+                          col=scol[ii])
                 }
-            }
-            lines(ux, uy[,i], 
-                 lwd=llwd[i], col=lcol[i], lty=llty[i])
-            if(!is.null(residuals))
-                points(x, residuals[,i], pch=pch[i], col=pcol[i], cex=pcex[i]) 
-            if(rugplot)
-                if(is.R()) rug(jx, col=rcol[i]) else rug(jx)
-
-            if(se && !is.null(se.y)) {
-                lines(ux, se.upper[,i], lty=slty[i], lwd=slwd[i], col=scol[i])
-                lines(ux, se.lower[,i], lty=slty[i], lwd=slwd[i], col=scol[i])
             }
         }
     }
diff --git a/R/predict.vgam.q b/R/predict.vgam.q
index 3471d60..517d0a0 100644
--- a/R/predict.vgam.q
+++ b/R/predict.vgam.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -255,7 +255,7 @@ predict.vgam <- function(object, newdata=NULL,
             v = attr(if(se.fit) predictor$fitted.values else 
                 predictor, "vterm.assign")
             is.lin <- is.linear.term(names(v))
-            coefmat <- coef(object, matrix=TRUE)
+            coefmat <- coefvlm(object, matrix=TRUE)
             ord <- 0
             for(i in names(v)) {
                 ord <- ord + 1
diff --git a/R/predict.vglm.q b/R/predict.vglm.q
index 7c444cb..1acfa3d 100644
--- a/R/predict.vglm.q
+++ b/R/predict.vglm.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -55,6 +55,15 @@ predict.vglm <- function(object,
                    "se.fit=FALSE, deriv=0"))
 
 
+
+
+
+    if(length(object at misc$form2)) {
+        Xm2 = predict.vlm(object, newdata=newdata, type="lm2", ...)
+        object at extra$Xm2 = Xm2
+    }
+
+
     pred = 
     if(se.fit)
         switch(type,
diff --git a/R/predict.vlm.q b/R/predict.vlm.q
index 5658343..34f2763 100644
--- a/R/predict.vlm.q
+++ b/R/predict.vlm.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -9,59 +9,10 @@ if(!exists("is.R")) is.R <- function()
     exists("version") && !is.null(version$language) && version$language=="R"
 
 
-if(FALSE) vmodel.matrix.lm <- function(object, ...) {
-    x <- slot(object, "x")
-    if(!length(x)) {
-        data <- model.framevlm(object, xlev = object at xlevels, ...)
 
-
-        x <- if(is.R()) {
-                 kill.con <- if(length(object at contrasts)) object at contrasts else
-                             NULL 
-                 vmodel.matrix.default(object, data = data,
-                                      contrasts = kill.con)
-             } else 
-             model.matrix.default(terms(object), data = data, 
-                                   contrasts = object at contrasts)
-    } 
-    x
-}
-
-
-if(!is.R()) {
-if(FALSE)    vmodel.frame.lm <- function(formula, data = NULL, 
-                                na.action = NULL, ...) {
-        m <- formula at model
-        if(!is.null(m))
-            return(m)
-        oc <- formula at call
-        oc$method <- "model.frame"
-        oc[[1.]] <- as.name("lm")
-        if(length(data)) {
-            oc$data <- substitute(data)
-            eval(oc, sys.parent())
-        }
-        else eval(oc, list())
-    }
-}
-
-
-if(is.R()) {
-if(FALSE) vmodel.frame.lm = function (formula, data, na.action, ...) {
-        if (is.null(formula at model)) {
-            fcall <- formula at call
-            fcall$method <- "model.frame"
-            fcall[[1]] <- as.name("lm")
-            env <- environment(fcall$formula)
-            if (is.null(env))
-                env <- parent.frame()
-            eval(fcall, env)
-        } else formula at model
-    }
-}
-
-
-predict.vlm <- function(object, newdata=NULL, type=c("response","terms"),
+predict.vlm <- function(object,
+                        newdata=NULL,
+                        type=c("response","terms","lm2"),
                         se.fit = FALSE, scale = NULL,
                         terms.arg=NULL,
                         raw=FALSE,
@@ -70,7 +21,7 @@ predict.vlm <- function(object, newdata=NULL, type=c("response","terms"),
 
     if(mode(type) != "character" && mode(type) != "name")
         type <- as.character(substitute(type))
-    type <- match.arg(type, c("response","terms"))[1]
+    type <- match.arg(type, c("response","terms","lm2"))[1]
 
     na.act = object at na.action
     object at na.action = list()
@@ -90,37 +41,14 @@ predict.vlm <- function(object, newdata=NULL, type=c("response","terms"),
 
 
     tt <- terms(object)  # 11/8/03; object at terms$terms
+    if(type == "lm2")
+        ttXm2 = terms(object at misc$form2)
+
     if(!length(newdata)) {
         offset <- object at offset
-
-        if(FALSE) {
-
-            X <- model.matrixvlm(object, type="lm")
-
-
-
-            if(is.R() && !length(object at x)) {
-                attrassigndefault <- function(mmat, tt) {
-                  if (!inherits(tt, "terms"))
-                    stop("need terms object")
-                  aa <- attr(mmat, "assign")
-                  if (is.null(aa))
-                    stop("argument is not really a model matrix")
-                  ll <- attr(tt, "term.labels")
-                  if (attr(tt, "intercept") > 0)
-                    ll <- c("(Intercept)", ll)
-                  aaa <- factor(aa, labels = ll)
-                  split(order(aa), aaa)
-                }
-                attrassignlm <- function(object, ...) 
-                    attrassigndefault(model.matrix(object, type="lm"),
-                                      terms(object))
-
-                attr(X, "assign") <- attrassignlm(X, tt)
-            }
-        } else {
-            X <- model.matrix(object, type="lm")
-        }
+        X   <- model.matrix(object, type="lm")
+        if(type == "lm2")
+            Xm2 <- model.matrix(object, type="lm2")
     } else {
 
         if(is.smart(object) && length(object at smart.prediction)) {
@@ -133,6 +61,11 @@ predict.vlm <- function(object, newdata=NULL, type=c("response","terms"),
         X = model.matrix(delete.response(tt), newdata,
             contrasts=if(length(object at contrasts)) object at contrasts else NULL,
             xlev = object at xlevels)
+        if(type == "lm2")
+            Xm2 = model.matrix(delete.response(ttXm2), newdata,
+                  contrasts=if(length(object at contrasts)) object at contrasts else
+                            NULL,
+                  xlev = object at xlevels)
 
 
         if(is.R() && object at misc$intercept.only && nrow(X)!=nrow(newdata)) {
@@ -151,11 +84,16 @@ predict.vlm <- function(object, newdata=NULL, type=c("response","terms"),
             wrapup.smart() 
         }
 
-        if(is.R())
+        if(is.R()) {
             attr(X, "assign") <- attrassigndefault(X, tt)
+            if(type == "lm2" && length(Xm2))
+                attr(Xm2, "assign") <- attrassigndefault(Xm2, ttXm2)
+        }
 
     }
 
+    if(type == "lm2")
+        return(Xm2)
 
     hasintercept <- attr(tt, "intercept")
 
@@ -196,7 +134,7 @@ predict.vlm <- function(object, newdata=NULL, type=c("response","terms"),
     X <- lm2vlm.model.matrix(X, Blist=Blist, M=M, xij=object at control$xij)
     attr(X, "constant") <- xbar 
 
-    coefs <- coef(object)
+    coefs <- coefvlm(object)
     vasgn <- attr(X, "vassign")
 
  
@@ -235,14 +173,14 @@ predict.vlm <- function(object, newdata=NULL, type=c("response","terms"),
                                 vasgn,
                                 collapse=type!="terms", M=M,
                                 dimname=list(dx1, dname2),
-                                coefmat=coef(object, matrix=TRUE))
+                                coefmat=coefvlm(object, matrix=TRUE))
         pred$df <- object at df.residual
         pred$sigma <- sigma
     } else
         pred <- Build.terms.vlm(X, coefs, cov=NULL, assign = vasgn,
                                 collapse=type!="terms", M=M,
                                 dimname=list(dx1, dname2),
-                                coefmat=coef(object, matrix=TRUE))
+                                coefmat=coefvlm(object, matrix=TRUE))
         constant <- attr(pred, "constant")
 
 
@@ -394,17 +332,9 @@ canonical.Blist <- function(Blist) {
 
 
 
-
-    setMethod("predict", "vlm", 
-              function(object, ...)
-              predict.vlm(object, ...))
-
-
-
-
-
-
-
+setMethod("predict", "vlm", 
+          function(object, ...)
+          predict.vlm(object, ...))
 
 
 
diff --git a/R/print.summary.others.q b/R/print.summary.others.q
index 36b4ab7..c511146 100644
--- a/R/print.summary.others.q
+++ b/R/print.summary.others.q
@@ -1,12 +1,11 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
 
 if(FALSE)
-printsummary.lms <- function(x, digits = NULL, quote = TRUE, prefix = "")
-{
+printsummary.lms <- function(x, digits = NULL, quote = TRUE, prefix = "") {
 
     printsummary.vglm(x, digits = NULL, quote = TRUE, prefix = "")
 
@@ -17,8 +16,8 @@ printsummary.lms <- function(x, digits = NULL, quote = TRUE, prefix = "")
 
 
 
-printsummary.rc.exponential <- function(x, digits = NULL, quote = TRUE, prefix = "")
-{
+printsummary.rc.exponential <- function(x, digits = NULL, quote = TRUE,
+        prefix = "") {
 
     printsummary.vglm(x, digits = NULL, quote = TRUE, prefix = "")
 
diff --git a/R/print.vglm.q b/R/print.vglm.q
index bad11f4..ec1f5c1 100644
--- a/R/print.vglm.q
+++ b/R/print.vglm.q
@@ -1,9 +1,8 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
-print.vglm <- function(x, ...)
-{
+print.vglm <- function(x, ...) {
     if(!is.null(cl <- x at call)) {
         cat("Call:\n")
         dput(cl)
@@ -30,7 +29,8 @@ print.vglm <- function(x, ...)
 
     if(length(deviance(x)))
         cat("Residual Deviance:", format(deviance(x)), "\n")
-    llx = logLik(x)
+    llx = logLik.vlm(object = x)
+
     if(length(llx))
         cat("Log-likelihood:", format(llx), "\n")
 
@@ -45,8 +45,7 @@ print.vglm <- function(x, ...)
 }
 
 
-print.vgam <- function(x, digits=2, ...)
-{
+print.vgam <- function(x, digits=2, ...) {
 
     if(!is.null(cl <- x at call)) {
         cat("Call:\n")
@@ -68,14 +67,15 @@ print.vgam <- function(x, digits=2, ...)
 
     if(length(deviance(x)))
         cat("Residual Deviance:", format(deviance(x)), "\n")
-    llx = logLik(x)
+
+    llx = logLik.vlm(object = x)
+
     if(length(llx))
         cat("Log-likelihood:", format(llx), "\n")
 
     criterion <- attr(terms(x), "criterion")  # 11/8/03; x at terms$terms,
     if(!is.null(criterion) && criterion!="coefficients")
-        cat(paste(criterion, ":", sep=""), format(x[[criterion]]),
-        "\n")
+        cat(paste(criterion, ":", sep=""), format(x[[criterion]]), "\n")
 
     invisible(x)
 }
diff --git a/R/print.vlm.q b/R/print.vlm.q
index f236d51..2d0ffe1 100644
--- a/R/print.vlm.q
+++ b/R/print.vlm.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -13,8 +13,7 @@ setMethod("print", "vlm",
     function(x, ...)
     print.vlm(x, ...))
 
-print.vlm <- function(x, ...)
-{
+print.vlm <- function(x, ...) {
     if(!is.null(cl <- x at call)) {
         cat("Call:\n")
         dput(cl)
diff --git a/R/qrrvglm.control.q b/R/qrrvglm.control.q
index 027dd10..94bbb15 100644
--- a/R/qrrvglm.control.q
+++ b/R/qrrvglm.control.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 qrrvglm.control = function(Rank=1,
diff --git a/R/qtplot.q b/R/qtplot.q
index 157d0bf..d3944ed 100644
--- a/R/qtplot.q
+++ b/R/qtplot.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -729,7 +729,7 @@ rlplot.gev <-
             zpp[,ii] = object at family@inverse(eta=peta, extra=extra2)[1,]
             zpp[,ii] = (zpp[,ii] - zp) / epsilon  # On the transformed scale
         }
-        VCOV = vcov(object, untransform=TRUE)
+        VCOV = vcovvlm(object, untransform=TRUE)
         v = numeric(nrow(zpp))
         for(ii in 1:nrow(zpp))
             v[ii] = t(as.matrix(zpp[ii,])) %*% VCOV %*% as.matrix(zpp[ii,])
diff --git a/R/residuals.vlm.q b/R/residuals.vlm.q
index 84336c3..4ce28b8 100644
--- a/R/residuals.vlm.q
+++ b/R/residuals.vlm.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/rrvglm.R b/R/rrvglm.R
index d56da97..37c05de 100644
--- a/R/rrvglm.R
+++ b/R/rrvglm.R
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/rrvglm.control.q b/R/rrvglm.control.q
index 09a75b9..a5c6b69 100644
--- a/R/rrvglm.control.q
+++ b/R/rrvglm.control.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/rrvglm.fit.q b/R/rrvglm.fit.q
index f064fb2..85acaca 100644
--- a/R/rrvglm.fit.q
+++ b/R/rrvglm.fit.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -80,6 +80,8 @@ rrvglm.fit <- function(x, y, w=rep(1, length(x[, 1])),
                               (criterion!="coefficients" &&
                              (if(minimize.criterion) new.crit > old.crit else
                              new.crit < old.crit)))
+                if(!is.logical(take.half.step))
+                    take.half.step = TRUE
                 if(take.half.step) {
                     stepsize <- 2 * min(orig.stepsize, 2*stepsize)
                     new.coeffs.save <- new.coeffs
diff --git a/R/s.q b/R/s.q
index 89e424b..6f903bc 100644
--- a/R/s.q
+++ b/R/s.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/s.vam.q b/R/s.vam.q
index 5a7649f..168ba16 100644
--- a/R/s.vam.q
+++ b/R/s.vam.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/smart.R b/R/smart.R
index d7f9f40..bffee5e 100644
--- a/R/smart.R
+++ b/R/smart.R
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/step.vglm.q b/R/step.vglm.q
index 6285f0e..484c2da 100644
--- a/R/step.vglm.q
+++ b/R/step.vglm.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 step.vglm <- function(fit, ...) 
diff --git a/R/summary.others.q b/R/summary.others.q
index 2c16b1c..336f7ae 100644
--- a/R/summary.others.q
+++ b/R/summary.others.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/summary.vgam.q b/R/summary.vgam.q
index 3d9cce9..163c8fa 100644
--- a/R/summary.vgam.q
+++ b/R/summary.vgam.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -154,8 +154,9 @@ printsummary.vgam <- function(x, quote=TRUE, prefix="", digits=options()$digits-
     if(length(deviance(x)))
         cat("\nResidual Deviance: ", format(round(deviance(x), digits)),
             "on", format(round(rdf, 3)), "degrees of freedom\n")
-    if(length(logLik(x)))
-        cat("\nLog-likelihood:", format(round(logLik(x), digits)),
+
+    if(length(logLik.vlm(x)))
+        cat("\nLog-likelihood:", format(round(logLik.vlm(x), digits)),
             "on", format(round(rdf, 3)), "degrees of freedom\n")
 
     if(length(x at criterion)) {
diff --git a/R/summary.vglm.q b/R/summary.vglm.q
index d2798ac..44344db 100644
--- a/R/summary.vglm.q
+++ b/R/summary.vglm.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -129,8 +129,8 @@ printsummary.vglm <- function(x, digits = NULL, quote = TRUE, prefix = "",
             cat(" on", round(rdf, digits), "degrees of freedom\n") else
             cat("\n")
     }
-    if(length(logLik(x))) {
-        cat("\nLog-likelihood:", yformat(logLik(x), digits))
+    if(length(vll <- logLik.vlm(x))) {
+        cat("\nLog-likelihood:", yformat(vll, digits))
         if(is.finite(rdf))
             cat(" on", round(rdf, digits), "degrees of freedom\n") else
             cat("\n")
diff --git a/R/summary.vlm.q b/R/summary.vlm.q
index 8489da5..033491c 100644
--- a/R/summary.vlm.q
+++ b/R/summary.vlm.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/uqo.R b/R/uqo.R
index bff1eeb..7b2f0e7 100644
--- a/R/uqo.R
+++ b/R/uqo.R
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/vgam.R b/R/vgam.R
index 434efe8..faf9a5e 100644
--- a/R/vgam.R
+++ b/R/vgam.R
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/vgam.control.q b/R/vgam.control.q
index a0bb5c8..6212769 100644
--- a/R/vgam.control.q
+++ b/R/vgam.control.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/vgam.fit.q b/R/vgam.fit.q
index 562dbbe..32a5550 100644
--- a/R/vgam.fit.q
+++ b/R/vgam.fit.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/vgam.match.q b/R/vgam.match.q
index 4af48c8..b8bbae4 100644
--- a/R/vgam.match.q
+++ b/R/vgam.match.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/vglm.R b/R/vglm.R
index b0040fb..0ccba55 100644
--- a/R/vglm.R
+++ b/R/vglm.R
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -15,6 +15,7 @@ vglm <- function(formula,
                  contrasts=NULL, 
                  constraints=NULL,
                  extra=list(), 
+                 form2=NULL, 
                  qr.arg=FALSE, smart=TRUE, ...)
 {
     dataname <- as.character(substitute(data))  # "list" if no data=
@@ -46,6 +47,41 @@ vglm <- function(formula,
          matrix(, NROW(Y), 0)
     attr(x, "assign") <- attrassigndefault(x, mt) # So as to make it like Splus
 
+
+
+
+
+
+if(!is.null(form2)) {
+    if(!is.null(subset))
+        stop("argument 'subset' cannot be used when argument 'form2' is used")
+    retlist = shadowvglm(formula=
+                 form2,
+                 family=family, data=data,
+                 na.action=na.action,
+                 control=vglm.control(...), 
+                 method=method,
+                 model=model, x.arg=x.arg, y.arg=y.arg,
+                 contrasts=contrasts, 
+                 constraints=constraints,
+                 extra=extra, 
+                 qr.arg=qr.arg)
+    Ym2 <- retlist$Ym2
+    Xm2 <- retlist$Xm2
+
+    if(length(Ym2)) {
+        if(nrow(as.matrix(Ym2)) != nrow(as.matrix(y)))
+            stop("number of rows of y and Ym2 are unequal")
+    }
+    if(length(Xm2)) {
+        if(nrow(as.matrix(Xm2)) != nrow(as.matrix(x)))
+            stop("number of rows of y and Ym2 are unequal")
+    }
+} else {
+    Xm2 = Ym2 = NULL
+}
+
+
     offset <- model.offset(mf)
     if(is.null(offset)) 
         offset <- 0 # yyy ???
@@ -72,6 +108,7 @@ vglm <- function(formula,
     vglm.fitter <- get(method)
 
     fit <- vglm.fitter(x=x, y=y, w=w, offset=offset, 
+                       Xm2=Xm2, Ym2=Ym2,
                        etastart=etastart, mustart=mustart, coefstart=coefstart,
                        family=family, 
                        control=control,
@@ -128,7 +165,15 @@ vglm <- function(formula,
         slot(answer, "weights") = as.matrix(fit$weights)
 
     if(x.arg)
-        slot(answer, "x") = fit$x # The 'small' design matrix
+        slot(answer, "x") = fit$x # The 'small' (lm) design matrix
+    if(x.arg && length(Xm2))
+        slot(answer, "Xm2") = Xm2 # The second (lm) design matrix
+    if(y.arg && length(Ym2))
+        slot(answer, "Ym2") = as.matrix(Ym2) # The second response
+    if(!is.null(form2))
+        slot(answer, "callXm2") = retlist$call
+    answer at misc$formula = formula
+    answer at misc$form2 = form2
 
     if(length(xlev))
         slot(answer, "xlevels") = xlev
@@ -159,3 +204,61 @@ attr(vglm, "smart") <- TRUE
 
 
 
+
+
+
+shadowvglm <-
+        function(formula,
+                 family, data=list(), 
+                 weights=NULL, subset=NULL, na.action=na.fail,
+                 etastart=NULL, mustart=NULL, coefstart=NULL,
+                 control=vglm.control(...), 
+                 offset=NULL, 
+                 method="vglm.fit",
+                 model=FALSE, x.arg=TRUE, y.arg=TRUE,
+                 contrasts=NULL, 
+                 constraints=NULL,
+                 extra=list(), 
+                 qr.arg=FALSE, ...)
+{
+    dataname <- as.character(substitute(data))  # "list" if no data=
+    function.name <- "shadowvglm"
+
+    ocall <- match.call()
+
+    if(missing(data)) 
+        data <- environment(formula)
+
+    mf <- match.call(expand.dots = FALSE)
+    m <- match(c("formula", "data", "subset", "weights", "na.action",
+        "etastart", "mustart", "offset"), names(mf), 0)
+    mf <- mf[c(1, m)]
+    mf$drop.unused.levels <- TRUE
+    mf[[1]] <- as.name("model.frame")
+    mf <- eval(mf, parent.frame())
+    switch(method, model.frame = return(mf), vglm.fit = 1,
+           stop("invalid 'method': ", method))
+    mt <- attr(mf, "terms")
+
+    x <- y <- NULL 
+
+    xlev = .getXlevels(mt, mf)
+    y <- model.response(mf, "any") # model.extract(mf, "response")
+    x <- if (!is.empty.model(mt)) model.matrix(mt, mf, contrasts) else
+         matrix(, NROW(Y), 0)
+    attr(x, "assign") <- attrassigndefault(x, mt) # So as to make it like Splus
+
+    list(Xm2=x, Ym2=y, call=ocall)
+}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/R/vglm.control.q b/R/vglm.control.q
index b7ed382..5d0f100 100644
--- a/R/vglm.control.q
+++ b/R/vglm.control.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/vglm.fit.q b/R/vglm.fit.q
index daaf923..666992c 100644
--- a/R/vglm.fit.q
+++ b/R/vglm.fit.q
@@ -1,10 +1,11 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
 
 vglm.fit <- function(x, y, w=rep(1, length(x[, 1])),
+    Xm2=NULL, Ym2=NULL,
     etastart=NULL, mustart=NULL, coefstart=NULL,
     offset=0, family,
     control=vglm.control(),
@@ -75,6 +76,8 @@ vglm.fit <- function(x, y, w=rep(1, length(x[, 1])),
                               (criterion!="coefficients" &&
                              (if(minimize.criterion) new.crit > old.crit else
                              new.crit < old.crit)))
+                if(!is.logical(take.half.step))
+                    take.half.step = TRUE
                 if(take.half.step) {
                     stepsize <- 2 * min(orig.stepsize, 2*stepsize)
                     new.coeffs.save <- new.coeffs
diff --git a/R/vlm.R b/R/vlm.R
index 6bd5e02..27e5361 100644
--- a/R/vlm.R
+++ b/R/vlm.R
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/R/vlm.wfit.q b/R/vlm.wfit.q
index beb2726..5c38a32 100644
--- a/R/vlm.wfit.q
+++ b/R/vlm.wfit.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -114,7 +114,7 @@ vlm.wfit <- function(x, z, Blist, wz=NULL, U=NULL,
         cm <- Blist[[i]]
         B[,i] <- cm %*% ans$coef[index]
     }
-    ans$mat.coefficients <- t(B)       # 20/9/99; not $coefficients
+    ans$mat.coefficients <- t(B)
     ans
 }
 
diff --git a/R/vsmooth.spline.q b/R/vsmooth.spline.q
index a93c442..c66da8d 100644
--- a/R/vsmooth.spline.q
+++ b/R/vsmooth.spline.q
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
@@ -82,8 +82,7 @@ vsmooth.spline <- function(x, y, w, df=rep(5,M), spar=NULL, # rep(0,M),
                       constraints=list("(Intercepts)"=diag(M), x=diag(M)),
                       tol.nl=0.01, var.arg=FALSE,
                       scale.w=TRUE,
-                      nk=NULL)
-{
+                      nk=NULL) {
 
 
     if(var.arg) {
@@ -280,8 +279,8 @@ vsmooth.spline <- function(x, y, w, df=rep(5,M), spar=NULL, # rep(0,M),
     spar.nl <- spar[nonlin]
     df.nl <- df[nonlin]
 
-    edimu <- if(trivc) dimw else max(ncb*(ncb+1)/2, dimw) # for wbar's size
-    dimu <- if(trivc) dimw else ncb*(ncb+1)/2
+    edimu <- if(trivc != 0) dimw else max(ncb*(ncb+1)/2, dimw) # for wbar's size
+    dimu <- if(trivc != 0) dimw else ncb*(ncb+1)/2
     o <- 1:nef   # Already sorted
 
     collaps <- dotFortran(name="vsuff9",
@@ -308,7 +307,7 @@ vsmooth.spline <- function(x, y, w, df=rep(5,M), spar=NULL, # rep(0,M),
     varmat <- if(var.arg) {if(ncb > 1) matrix(0, nef, ncb) else
                            rep(0, nef)} else double(1)
     index <- iam(NA, NA, ncb, both=TRUE, diagonal=TRUE)
-    dimwbar <- if(trivc) dimw else ncb*(ncb+1)/2
+    dimwbar <- if(trivc != 0) dimw else ncb*(ncb+1)/2
 
     vsplin <- dotFortran(name="vsplin",
                      xs=as.double(xbar),  wz=as.double(collaps$wz), 
@@ -386,8 +385,7 @@ vsmooth.spline <- function(x, y, w, df=rep(5,M), spar=NULL, # rep(0,M),
 }
 
 
-printvsmooth.spline <- function(x, ...)
-{
+printvsmooth.spline <- function(x, ...) {
     if(!is.null(cl <- x at call)) {
         cat("Call:\n")
         dput(cl)
@@ -402,7 +400,7 @@ printvsmooth.spline <- function(x, ...)
         if(length(ncb) && ncb==1) format(x at df) else
             paste(format(x at df), collapse=", "), "\n")
 
-    if(!all(trivial.constraints(x at constraints))) {
+    if(!all(trivial.constraints(x at constraints) == 1)) {
         cat("\nConstraint matrices:\n")
         print(x at constraints)
     }
@@ -411,13 +409,15 @@ printvsmooth.spline <- function(x, ...)
 }
 
 
-coefvsmooth.spline = function(object, matrix=FALSE, ...) {
-        list(lfit=coef(object at lfit, matrix=matrix), nlfit=coef(object at nlfit))
+coefvsmooth.spline.fit = function(object, ...) {
+    object at Bcoefficients 
 }
 
 
-coefvsmooth.spline.fit = function(object, ...) {
-    object at Bcoefficients 
+coefvsmooth.spline = function(object, matrix=FALSE, ...) {
+
+        list(lfit=coefvlm(object at lfit, matrix=matrix),
+             nlfit=coefvsmooth.spline.fit(object at nlfit))
 }
 
 
@@ -435,8 +435,7 @@ plotvsmooth.spline <- function(x, xlab="x", ylab="", points=TRUE,
                                 pcol=par()$col, pcex=par()$cex,
                                 pch=par()$pch,
                                 lcol=par()$col, lwd=par()$lwd, lty=par()$lty, 
-                                add=FALSE, ...)
-{
+                                add=FALSE, ...) {
     M = ncol(x at y)
     pcol = rep(pcol, length=M)
     pcex = rep(pcex, length=M)
@@ -456,8 +455,7 @@ plotvsmooth.spline <- function(x, xlab="x", ylab="", points=TRUE,
 
 
 
-predictvsmooth.spline <- function(object, x, deriv=0, se.fit=FALSE)
-{
+predictvsmooth.spline <- function(object, x, deriv=0, se.fit=FALSE) {
     if(se.fit)
         warning("se.fit=TRUE is not currently implemented. Using se.fit=FALSE")
 
@@ -474,7 +472,7 @@ predictvsmooth.spline <- function(object, x, deriv=0, se.fit=FALSE)
 
     }
 
-    mat.coef = coef(lfit, matrix=TRUE)
+    mat.coef = coefvlm(lfit, matrix=TRUE)
     coeflfit <- t(mat.coef)   # M x p now
     M <- nrow(coeflfit) # if(is.matrix(object at y)) ncol(object at y) else 1 
 
@@ -494,8 +492,7 @@ predictvsmooth.spline <- function(object, x, deriv=0, se.fit=FALSE)
 }
 
 
-predictvsmooth.spline.fit <- function(object, x, deriv=0)
-{
+predictvsmooth.spline.fit <- function(object, x, deriv=0) {
     nk = nrow(object at Bcoefficients)
     drangex <- object at xmax - object at xmin
     if(missing(x))
diff --git a/R/zzz.R b/R/zzz.R
index 3e38373..22a118a 100644
--- a/R/zzz.R
+++ b/R/zzz.R
@@ -1,5 +1,5 @@
 # These functions are
-# Copyright (C) 1998-2008 T.W. Yee, University of Auckland. All rights reserved.
+# Copyright (C) 1998-2009 T.W. Yee, University of Auckland. All rights reserved.
 
 
 
diff --git a/data/ruge.R b/data/ruge.R
index 560691f..363021d 100644
--- a/data/ruge.R
+++ b/data/ruge.R
@@ -1,5 +1,5 @@
 "ruge" <-
 structure(list(counts = c(57,203,383,525,532,408,273,139,45,27,10,4,0,1,1),
-number = c(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14), .Names = c("counts", 
-"number"), class = "data.frame", row.names = c("1",
-"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14")))
+number = c(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14)), .Names = c("counts",
+"number"), row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9",
+"10", "11", "12", "13", "14", "15"), class = "data.frame")
diff --git a/data/wffc.R b/data/wffc.R
new file mode 100644
index 0000000..36d92c2
--- /dev/null
+++ b/data/wffc.R
@@ -0,0 +1,2924 @@
+"wffc" <-
+structure(list(length = c(180, 182, 185, 189, 193, 195, 195, 
+197, 198, 209, 210, 215, 215, 218, 218, 219, 228, 228, 241, 303, 
+182, 182, 195, 206, 212, 214, 217, 224, 224, 229, 231, 234, 252, 
+255, 292, 294, 294, 335, 355, 393, 200, 205, 210, 238, 182, 182, 
+186, 201, 205, 208, 209, 216, 218, 221, 222, 223, 224, 225, 226, 
+228, 228, 229, 230, 233, 257, 260, 271, 274, 274, 316, 316, 320, 
+324, 325, 337, 350, 181, 188, 190, 194, 198, 200, 212, 212, 229, 
+231, 238, 240, 252, 180, 203, 205, 240, 260, 180, 180, 181, 181, 
+182, 190, 191, 191, 192, 194, 195, 196, 197, 200, 203, 212, 213, 
+215, 225, 248, 250, 251, 305, 181, 183, 183, 185, 193, 195, 195, 
+205, 206, 210, 210, 221, 226, 231, 248, 251, 251, 257, 267, 277, 
+280, 283, 285, 300, 320, 333, 340, 376, 223, 225, 230, 237, 249, 
+253, 264, 275, 310, 181, 181, 182, 184, 184, 185, 185, 186, 186, 
+188, 195, 195, 212, 214, 215, 235, 281, 312, 190, 201, 204, 210, 
+210, 222, 245, 251, 283, 180, 180, 180, 180, 180, 185, 190, 195, 
+195, 195, 200, 205, 210, 210, 215, 215, 220, 220, 220, 230, 230, 
+255, 280, 280, 180, 180, 181, 182, 183, 185, 189, 195, 199, 203, 
+205, 210, 211, 214, 215, 215, 220, 221, 223, 226, 229, 238, 220, 
+306, 309, 348, 180, 180, 210, 210, 220, 304, 353, 180, 183, 183, 
+185, 185, 187, 187, 201, 202, 230, 296, 194, 208, 213, 213, 219, 
+221, 222, 225, 228, 230, 232, 258, 273, 292, 305, 306, 180, 185, 
+187, 187, 189, 191, 192, 201, 203, 206, 219, 232, 252, 258, 271, 
+316, 180, 188, 190, 192, 195, 210, 223, 226, 226, 231, 247, 284, 
+319, 194, 197, 215, 217, 223, 264, 275, 333, 334, 182, 186, 197, 
+205, 207, 207, 210, 261, 271, 180, 183, 192, 194, 205, 206, 215, 
+218, 225, 225, 230, 247, 338, 180, 180, 180, 180, 185, 190, 190, 
+190, 195, 205, 210, 215, 215, 220, 220, 220, 220, 220, 225, 254, 
+260, 280, 290, 295, 295, 300, 300, 330, 187, 190, 192, 194, 218, 
+225, 269, 270, 271, 314, 183, 183, 185, 190, 190, 195, 204, 205, 
+205, 205, 205, 213, 215, 215, 220, 235, 237, 301, 325, 185, 204, 
+207, 212, 221, 181, 190, 191, 192, 192, 204, 215, 220, 227, 240, 
+240, 245, 246, 285, 302, 302, 310, 330, 390, 190, 268, 181, 181, 
+182, 183, 185, 201, 219, 221, 222, 236, 244, 295, 315, 329, 420, 
+180, 181, 182, 185, 200, 200, 210, 215, 217, 220, 220, 225, 235, 
+245, 260, 270, 375, 375, 380, 445, 180, 181, 185, 190, 195, 201, 
+208, 208, 212, 215, 215, 220, 229, 231, 255, 300, 325, 189, 191, 
+211, 222, 226, 313, 322, 181, 182, 183, 185, 185, 185, 190, 193, 
+196, 198, 200, 200, 200, 205, 205, 210, 210, 211, 215, 220, 229, 
+182, 182, 190, 190, 190, 192, 217, 218, 220, 224, 242, 264, 270, 
+290, 440, 181, 185, 196, 214, 210, 222, 240, 255, 300, 310, 415, 
+180, 184, 194, 195, 204, 215, 231, 263, 378, 185, 190, 205, 213, 
+215, 248, 255, 195, 195, 226, 250, 183, 188, 190, 196, 214, 280, 
+340, 352, 180, 183, 190, 194, 202, 205, 212, 213, 218, 220, 197, 
+198, 180, 180, 180, 190, 200, 210, 210, 250, 260, 182, 182, 186, 
+186, 186, 190, 192, 195, 196, 202, 205, 207, 211, 214, 215, 218, 
+220, 223, 234, 235, 235, 235, 236, 237, 241, 241, 243, 246, 247, 
+248, 251, 252, 253, 262, 277, 180, 185, 185, 185, 190, 190, 200, 
+205, 214, 215, 215, 235, 240, 260, 264, 266, 270, 287, 186, 186, 
+186, 186, 188, 188, 189, 189, 192, 193, 193, 194, 198, 200, 200, 
+207, 210, 213, 222, 224, 241, 246, 256, 260, 265, 266, 272, 276, 
+382, 195, 222, 252, 280, 181, 182, 183, 185, 185, 188, 190, 193, 
+194, 201, 204, 210, 229, 232, 234, 238, 254, 299, 301, 181, 191, 
+194, 196, 212, 229, 242, 245, 250, 255, 261, 261, 266, 293, 297, 
+303, 180, 181, 181, 182, 184, 185, 191, 191, 193, 201, 205, 207, 
+210, 213, 215, 221, 221, 225, 236, 261, 276, 290, 356, 180, 182, 
+190, 191, 192, 203, 207, 213, 214, 215, 220, 223, 233, 240, 241, 
+247, 255, 260, 263, 264, 265, 285, 333, 181, 181, 208, 221, 238, 
+264, 268, 275, 275, 301, 353, 180, 185, 185, 195, 195, 195, 195, 
+199, 200, 200, 200, 201, 205, 210, 210, 223, 223, 235, 240, 252, 
+262, 265, 285, 290, 295, 330, 410, 181, 181, 183, 184, 185, 185, 
+185, 207, 221, 223, 231, 234, 234, 266, 273, 277, 282, 392, 180, 
+187, 190, 195, 195, 195, 197, 200, 213, 215, 220, 222, 249, 257, 
+258, 268, 270, 282, 310, 181, 181, 182, 184, 185, 193, 194, 195, 
+198, 200, 204, 206, 208, 211, 219, 231, 234, 239, 239, 240, 246, 
+257, 258, 260, 265, 270, 280, 302, 327, 345, 455, 195, 239, 251, 
+262, 298, 307, 181, 192, 198, 198, 200, 201, 201, 203, 205, 207, 
+222, 225, 228, 228, 239, 242, 254, 255, 256, 256, 282, 283, 290, 
+185, 195, 202, 202, 245, 255, 265, 290, 295, 335, 393, 182, 200, 
+220, 227, 245, 250, 295, 185, 195, 200, 201, 201, 210, 229, 259, 
+267, 270, 273, 275, 283, 180, 180, 202, 217, 225, 251, 277, 201, 
+217, 257, 258, 276, 279, 321, 324, 329, 352, 180, 181, 183, 196, 
+198, 212, 228, 235, 235, 186, 190, 252, 180, 180, 181, 186, 188, 
+188, 188, 190, 190, 192, 195, 196, 200, 205, 207, 216, 218, 218, 
+225, 227, 230, 244, 246, 251, 255, 262, 291, 315, 180, 185, 185, 
+190, 195, 195, 195, 195, 195, 200, 200, 220, 231, 240, 244, 247, 
+257, 264, 337, 181, 181, 183, 184, 190, 194, 195, 195, 207, 212, 
+215, 231, 233, 237, 238, 245, 251, 251, 252, 262, 272, 280, 285, 
+292, 294, 295, 191, 201, 221, 233, 235, 242, 246, 248, 282, 284, 
+424, 494, 185, 195, 227, 235, 248, 257, 320, 185, 200, 203, 215, 
+235, 248, 250, 180, 180, 185, 185, 192, 194, 201, 210, 213, 221, 
+292, 180, 180, 182, 189, 180, 182, 186, 194, 195, 195, 198, 200, 
+201, 205, 217, 225, 181, 191, 206, 210, 249, 324, 190, 192, 348, 
+180, 180, 182, 192, 195, 195, 195, 202, 212, 220, 240, 246, 247, 
+250, 265, 265, 265, 270, 270, 272, 273, 313, 180, 189, 191, 192, 
+196, 208, 211, 227, 228, 229, 230, 230, 233, 241, 245, 252, 254, 
+256, 258, 262, 267, 276, 295, 362, 229, 246, 196, 212, 225, 228, 
+230, 235, 251, 260, 261, 270, 289, 310, 345, 180, 184, 185, 188, 
+195, 200, 210, 211, 235, 242, 245, 245, 246, 250, 264, 268, 180, 
+182, 183, 202, 215, 190, 200, 210, 330, 325, 356, 185, 245, 256, 
+262, 291, 342, 181, 182, 188, 191, 191, 193, 235, 248, 250, 251, 
+265, 275, 328, 180, 187, 187, 195, 195, 200, 205, 235, 250, 275, 
+286, 379, 192, 185, 188, 195, 221, 226, 236, 181, 183, 186, 187, 
+192, 194, 197, 203, 204, 205, 207, 209, 210, 257, 274, 300, 181, 
+182, 185, 202, 211, 195, 180, 180, 184, 187, 187, 189, 192, 193, 
+194, 196, 196, 197, 197, 198, 200, 204, 205, 207, 207, 208, 213, 
+220, 223, 225, 228, 230, 233, 234, 236, 237, 238, 242, 258, 265, 
+291, 292, 293, 180, 200, 205, 205, 210, 210, 210, 214, 220, 220, 
+225, 250, 270, 290, 300, 180, 181, 181, 185, 189, 190, 191, 192, 
+201, 210, 212, 218, 224, 226, 231, 262, 185, 185, 190, 196, 200, 
+205, 205, 210, 218, 226, 226, 230, 230, 230, 230, 240, 240, 240, 
+243, 245, 248, 250, 250, 250, 250, 255, 255, 260, 265, 270, 300, 
+300, 320, 320, 180, 180, 183, 185, 196, 198, 198, 201, 201, 203, 
+205, 206, 208, 208, 210, 214, 215, 215, 216, 221, 222, 234, 238, 
+238, 253, 253, 259, 261, 276, 180, 180, 180, 180, 181, 185, 185, 
+190, 198, 200, 210, 210, 212, 215, 218, 220, 220, 222, 228, 230, 
+230, 232, 239, 239, 240, 290, 290, 295, 185, 190, 195, 195, 212, 
+216, 218, 218, 222, 233, 235, 240, 242, 245, 246, 250, 251, 255, 
+255, 257, 280, 295, 328, 359, 180, 195, 210, 220, 220, 223, 230, 
+230, 240, 242, 249, 258, 263, 267, 287, 337, 181, 190, 195, 195, 
+198, 210, 212, 214, 220, 222, 223, 224, 244, 250, 275, 283, 284, 
+319, 438, 180, 180, 182, 185, 189, 192, 192, 194, 198, 202, 208, 
+210, 215, 215, 225, 228, 232, 238, 243, 256, 262, 273, 180, 180, 
+180, 180, 180, 185, 185, 185, 186, 190, 190, 192, 193, 194, 195, 
+198, 201, 208, 210, 210, 215, 216, 216, 235, 235, 240, 245, 245, 
+290, 180, 181, 182, 183, 196, 200, 208, 210, 210, 237, 243, 264, 
+180, 180, 187, 188, 202, 207, 210, 222, 225, 244, 185, 192, 193, 
+201, 205, 225, 245, 255, 255, 258, 180, 180, 180, 180, 180, 182, 
+183, 183, 186, 189, 197, 200, 200, 205, 210, 216, 219, 220, 222, 
+225, 226, 226, 236, 257, 258, 258, 280, 290, 190, 246, 185, 197, 
+198, 208, 228, 243, 243, 297, 298, 300, 315, 340, 345, 345, 183, 
+189, 305, 396, 180, 180, 182, 182, 185, 186, 188, 188, 192, 192, 
+193, 197, 201, 213, 221, 222, 224, 224, 225, 226, 231, 232, 237, 
+247, 262, 265, 315, 180, 180, 180, 180, 180, 181, 190, 190, 192, 
+192, 195, 200, 200, 210, 210, 210, 210, 212, 215, 220, 220, 230, 
+230, 231, 240, 320, 180, 183, 183, 188, 193, 200, 200, 204, 204, 
+206, 208, 209, 211, 213, 215, 218, 223, 224, 225, 227, 260, 180, 
+180, 180, 182, 187, 190, 192, 195, 197, 200, 205, 206, 209, 211, 
+211, 214, 225, 230, 230, 232, 233, 233, 233, 237, 247, 247, 252, 
+290, 180, 196, 211, 221, 222, 226, 365, 190, 192, 195, 200, 200, 
+204, 210, 212, 219, 220, 222, 225, 227, 227, 227, 228, 229, 232, 
+235, 239, 240, 244, 245, 252, 254, 257, 258, 270, 281, 281, 290, 
+190, 212, 240, 243, 252, 282, 358, 185, 194, 200, 210, 221, 223, 
+228, 230, 232, 250, 255, 257, 258, 262, 299, 314, 180, 193, 198, 
+198, 199, 205, 208, 224, 232, 232, 234, 237, 241, 245, 282, 292, 
+295, 356, 370, 180, 186, 191, 196, 196, 213, 216, 225, 240, 183, 
+188, 192, 213, 223, 252, 185, 190, 195, 198, 200, 203, 205, 212, 
+225, 264, 182, 183, 189, 192, 195, 197, 219, 224, 226, 242, 244, 
+244, 249, 270, 272, 274, 285, 308, 208, 222, 235, 281, 180, 180, 
+180, 180, 181, 183, 202, 210, 220, 224, 229, 229, 239, 248, 265, 
+286, 292, 245, 265, 180, 180, 193, 204, 207, 230, 260, 262, 274, 
+401, 180, 190, 201, 210, 218, 220, 221, 225, 225, 233, 243, 244, 
+253, 254, 345, 194, 195, 196, 214, 215, 226, 241, 248, 256, 304, 
+218, 195, 180, 180, 180, 183, 184, 185, 185, 188, 193, 199, 218, 
+221, 246, 260, 262, 290, 290, 305, 331, 332, 345, 180, 185, 191, 
+196, 200, 222, 224, 242, 242, 261, 515, 180, 181, 232, 232, 251, 
+252, 265, 185, 194, 202, 210, 235, 241, 243, 244, 250, 283, 285, 
+287, 395, 191, 213, 214, 214, 214, 258, 262, 287, 301, 425, 214, 
+218, 190, 195, 198, 210, 214, 216, 223, 224, 230, 236, 240, 284, 
+298, 300, 180, 188, 192, 195, 198, 202, 204, 218, 218, 227, 230, 
+235, 245, 254, 256, 263, 266, 275, 285, 301, 302, 392, 180, 180, 
+180, 190, 199, 204, 205, 210, 212, 214, 214, 217, 218, 220, 224, 
+225, 230, 230, 230, 239, 240, 241, 248, 250, 252, 265, 275, 279, 
+290, 293, 310, 315, 180, 208, 210, 245, 180, 195, 199, 210, 210, 
+215, 217, 220, 250, 265, 275, 275, 180, 185, 210, 215, 261, 207, 
+210, 226, 227, 236, 237, 245, 246, 263, 269, 294, 308, 329, 182, 
+184, 189, 190, 192, 194, 195, 215, 216, 220, 220, 225, 231, 232, 
+238, 246, 248, 259, 277, 279, 307, 323, 180, 183, 191, 196, 197, 
+198, 202, 202, 204, 206, 211, 226, 243, 256, 258, 260, 265, 265, 
+281, 282, 294, 295, 180, 270, 274, 280, 330, 330, 350, 180, 180, 
+180, 180, 181, 190, 190, 195, 200, 202, 203, 203, 206, 207, 208, 
+216, 218, 219, 220, 220, 230, 234, 235, 236, 258, 262, 263, 272, 
+274, 280, 280, 281, 294, 308, 323, 329, 333, 180, 182, 184, 190, 
+215, 215, 215, 227, 231, 235, 240, 242, 250, 260, 280, 288, 345, 
+180, 180, 182, 184, 195, 195, 198, 207, 212, 220, 220, 230, 246, 
+247, 248, 248, 250, 255, 255, 262, 273, 281, 284, 290, 290, 300, 
+327, 345, 181, 205, 206, 210, 219, 230, 260, 265, 290, 300, 300, 
+180, 205, 207, 227, 227, 240, 250, 279, 310, 180, 197, 198, 235, 
+240, 260, 285, 182, 182, 187, 192, 195, 200, 215, 216, 220, 228, 
+248, 254, 263, 270, 300, 301, 303, 303, 320, 394, 181, 182, 190, 
+194, 195, 220, 238, 240, 265, 280, 332, 180, 185, 185, 190, 194, 
+201, 215, 218, 231, 286, 180, 185, 190, 190, 195, 200, 220, 230, 
+240, 265, 280, 300, 302, 340, 181, 181, 187, 188, 197, 197, 198, 
+203, 205, 212, 222, 222, 230, 236, 237, 238, 263, 266, 183, 249, 
+252, 264, 302, 180, 180, 181, 182, 183, 192, 192, 199, 201, 202, 
+202, 203, 211, 212, 213, 214, 215, 221, 222, 224, 227, 230, 234, 
+259, 264, 277, 280, 281, 294, 315, 195, 230, 230, 240, 255, 265, 
+298, 180, 180, 187, 189, 189, 206, 228, 242, 245, 255, 281, 282, 
+285, 297, 304, 180, 180, 185, 190, 200, 240, 320, 186, 200, 210, 
+260, 302, 180, 195, 247, 251, 254, 263, 278, 296, 310, 318, 426, 
+180, 180, 182, 193, 201, 204, 247, 301, 317, 182, 270, 273, 285, 
+182, 200, 208, 212, 213, 216, 229, 231, 243, 260, 345, 183, 207, 
+215, 337, 180, 212, 180, 220, 265, 290, 199, 185, 263, 180, 180, 
+182, 183, 185, 185, 190, 190, 211, 214, 232, 232, 234, 247, 249, 
+251, 263, 309, 186, 196, 201, 241, 256, 290, 294, 331, 185, 180, 
+182, 203, 203, 208, 211, 223, 223, 226, 233, 234, 244, 254, 190, 
+190, 210, 210, 226, 232, 430, 182, 185, 274, 180, 180, 195, 220, 
+230, 250, 265, 300, 300, 320, 325, 350, 245, 254, 300, 303, 342, 
+560, 182, 185, 192, 195, 199, 205, 217, 223, 224, 227, 230, 240, 
+245, 246, 258, 265, 273, 285, 295, 305, 312, 330, 336, 343, 193, 
+198, 200, 225, 228, 238, 244, 284, 290, 297, 302, 182, 186, 189, 
+194, 233, 250, 251, 294, 307, 335, 180, 182, 202, 217, 470, 180, 
+187, 198, 239, 240, 274, 331, 335, 340, 359, 360, 365, 365, 367, 
+182, 216, 332, 215, 268, 365, 435, 181, 189, 208, 212, 334, 191, 
+201, 209, 211, 250, 394, 425, 457, 488, 498, 188, 189, 190, 200, 
+215, 220, 228, 314, 325, 335, 355, 378, 420, 488, 185, 185, 195, 
+204, 208, 210, 220, 220, 225, 225, 230, 245, 342, 355, 390, 432, 
+478, 481, 510, 181, 184, 195, 225, 225, 226, 235, 242, 244, 338, 
+342, 388, 540, 193, 206, 214, 215, 296, 310, 460, 181, 216, 331, 
+333, 445, 500, 580, 185, 186, 212, 222, 232, 246, 272, 340, 343, 
+348, 372, 385, 395, 402, 435, 445, 477, 518, 181, 182, 185, 185, 
+192, 195, 196, 198, 202, 213, 220, 225, 227, 230, 232, 232, 291, 
+294, 314, 325, 330, 338, 340, 360, 490, 181, 181, 181, 182, 184, 
+194, 197, 207, 215, 220, 226, 230, 230, 309, 314, 338, 395, 477, 
+180, 182, 182, 182, 185, 185, 190, 193, 196, 197, 198, 199, 206, 
+207, 221, 222, 222, 223, 225, 225, 226, 232, 246, 252, 312, 181, 
+181, 185, 185, 187, 201, 205, 210, 215, 216, 225, 181, 182, 182, 
+193, 193, 198, 201, 201, 205, 206, 208, 212, 218, 230, 275, 325, 
+335, 336, 339, 368, 432, 436, 503, 535, 195, 196, 198, 208, 210, 
+210, 212, 217, 365, 364, 376, 463, 586, 600, 613, 195, 225, 460, 
+460, 480, 555, 560, 180, 181, 184, 191, 195, 196, 197, 208, 447, 
+451, 489, 181, 181, 181, 182, 182, 193, 194, 202, 202, 203, 205, 
+210, 220, 228, 228, 243, 245, 248, 450, 181, 181, 186, 186, 188, 
+196, 196, 197, 198, 200, 202, 205, 211, 211, 212, 215, 221, 225, 
+226, 227, 230, 235, 243, 281, 336, 498, 195, 200, 214, 203, 207, 
+218, 223, 236, 190, 198, 200, 200, 205, 208, 210, 210, 215, 216, 
+225, 225, 227, 230, 237, 240, 248, 310, 315, 315, 370, 370, 390, 
+405, 420, 420, 478, 499, 212, 254, 222, 300, 522, 185, 192, 193, 
+215, 230, 332, 393, 560, 582, 582, 181, 181, 182, 189, 193, 195, 
+196, 214, 215, 362, 181, 187, 201, 210, 211, 230, 231, 239, 240, 
+246, 258, 339, 370, 388, 419, 471, 556, 570, 183, 190, 190, 190, 
+196, 210, 210, 210, 211, 268, 328, 331, 495, 181, 181, 185, 198, 
+198, 205, 210, 215, 215, 225, 227, 228, 230, 230, 235, 245, 310, 
+513, 186, 193, 194, 196, 196, 203, 205, 210, 210, 212, 214, 215, 
+221, 224, 227, 228, 248, 254, 310, 335, 347, 380, 396, 520, 202, 
+210, 212, 217, 228, 240, 247, 259, 285, 293, 312, 315, 325, 352, 
+363, 371, 382, 427, 453, 510, 192, 217, 219, 243, 369, 374, 360, 
+382, 202, 250, 335, 360, 370, 401, 402, 450, 580, 180, 180, 181, 
+182, 182, 182, 182, 183, 184, 184, 187, 188, 188, 190, 192, 196, 
+196, 198, 200, 200, 202, 203, 205, 210, 215, 220, 220, 230, 245, 
+360, 480, 185, 195, 240, 240, 245, 335, 423, 432, 443, 482, 494, 
+506, 510, 190, 198, 200, 215, 228, 230, 232, 390, 181, 182, 185, 
+185, 186, 187, 188, 190, 190, 190, 191, 192, 195, 196, 205, 217, 
+218, 222, 222, 225, 227, 228, 229, 235, 239, 250, 395, 409, 410, 
+190, 193, 217, 225, 378, 410, 181, 185, 185, 189, 192, 194, 195, 
+201, 210, 210, 212, 219, 220, 222, 230, 340, 180, 186, 193, 199, 
+225, 260, 181, 182, 183, 183, 186, 188, 189, 196, 197, 198, 207, 
+214, 216, 260, 350, 370, 370, 404, 437, 503, 195, 195, 195, 195, 
+200, 200, 210, 210, 215, 230, 230, 235, 245, 323, 325, 330, 335, 
+345, 395, 495, 500, 560, 182, 200, 220, 223, 186, 187, 193, 193, 
+203, 206, 208, 210, 214, 216, 226, 255, 195, 181, 185, 186, 186, 
+188, 192, 193, 193, 194, 197, 202, 212, 214, 214, 216, 218, 219, 
+220, 222, 223, 225, 227, 229, 309, 313, 334, 343, 419, 181, 181, 
+193, 194, 198, 190, 200, 200, 220, 240, 250, 320, 330, 380, 470, 
+500, 181, 189, 190, 199, 200, 202, 215, 216, 219, 239, 325, 332, 
+333, 356, 369, 376, 379, 440, 452, 525, 200, 202, 204, 204, 205, 
+219, 220, 304, 316, 320, 324, 333, 340, 340, 342, 342, 344, 365, 
+453, 466, 506, 181, 182, 185, 196, 197, 198, 199, 212, 242, 327, 
+335, 342, 402, 403, 431, 185, 195, 195, 195, 195, 200, 200, 205, 
+215, 220, 225, 225, 235, 290, 308, 330, 355, 400, 420, 430, 450, 
+180, 182, 191, 191, 193, 194, 195, 195, 195, 210, 212, 213, 225, 
+227, 230, 298, 311, 314, 332, 335, 350, 375, 396, 413, 417, 460, 
+475, 510, 180, 185, 186, 186, 190, 195, 203, 207, 210, 210, 218, 
+219, 225, 226, 326, 344, 345, 410, 420, 465, 190, 210, 220, 272, 
+272, 272, 272, 272, 350, 430, 435, 465, 486, 195, 345, 402, 414, 
+445, 182, 208, 213, 214, 221, 226, 415, 180, 182, 182, 183, 185, 
+190, 195, 205, 215, 220, 225, 225, 235, 250, 290, 310, 331, 335, 
+375, 485, 189, 200, 210, 216, 222, 226, 321, 490, 180, 183, 186, 
+200, 202, 206, 214, 222, 255, 316, 385, 474, 181, 181, 183, 183, 
+184, 185, 186, 187, 188, 189, 191, 192, 195, 199, 209, 210, 210, 
+210, 213, 215, 419, 185, 185, 190, 195, 198, 200, 204, 205, 205, 
+208, 208, 215, 222, 314, 445, 180, 181, 185, 185, 186, 186, 190, 
+194, 194, 196, 201, 207, 218, 220, 222, 233, 235, 305, 325, 325, 
+360, 390, 180, 187, 191, 208, 214, 218, 223, 227, 243, 268, 302, 
+337, 365, 377, 380, 386, 415, 420, 420, 422, 475, 480, 518, 540, 
+185, 190, 200, 207, 208, 212, 215, 222, 225, 230, 235, 344, 360, 
+370, 380, 390, 392, 485, 188, 189, 195, 196, 215, 217, 223, 227, 
+352, 424, 180, 181, 182, 185, 186, 186, 191, 192, 193, 194, 195, 
+200, 200, 200, 208, 210, 210, 218, 220, 222, 233, 245, 181, 202, 
+325, 380, 181, 181, 186, 189, 189, 189, 191, 194, 195, 195, 197, 
+197, 199, 204, 206, 206, 208, 209, 209, 210, 210, 214, 215, 216, 
+235, 347, 389, 420, 437, 491, 181, 182, 183, 184, 185, 186, 186, 
+191, 192, 193, 194, 198, 200, 202, 203, 205, 208, 212, 228, 235, 
+294, 180, 215, 293, 190, 214, 245, 305, 309, 343, 358, 363, 433, 
+437, 181, 181, 183, 185, 185, 190, 195, 197, 202, 203, 215, 215, 
+232, 315, 185, 465, 475, 190, 190, 190, 195, 205, 210, 210, 210, 
+215, 225, 245, 245, 250, 350, 390, 501, 182, 183, 188, 188, 189, 
+192, 193, 195, 200, 202, 202, 205, 207, 207, 217, 217, 221, 222, 
+223, 235, 318, 332, 335, 340, 370, 413, 446, 450, 475, 515, 185, 
+192, 193, 195, 195, 195, 195, 205, 205, 210, 210, 210, 210, 212, 
+213, 214, 218, 218, 228, 259, 458, 180, 195, 205, 205, 230, 305, 
+320, 325, 330, 390, 425, 490, 186, 189, 194, 202, 205, 224, 228, 
+180, 181, 181, 182, 185, 185, 195, 197, 203, 221, 223, 305, 181, 
+181, 185, 186, 188, 192, 192, 193, 195, 202, 205, 208, 212, 223, 
+244, 324, 335, 335, 356, 375, 381, 388, 413, 424, 180, 181, 184, 
+188, 190, 210, 215, 226, 323, 180, 183, 200, 204, 209, 215, 311, 
+326, 391, 428, 180, 180, 180, 183, 185, 185, 189, 192, 193, 195, 
+197, 200, 201, 202, 202, 203, 205, 208, 210, 214, 218, 220, 221, 
+225, 229, 251, 350, 440, 198, 215, 227, 246, 307, 334, 427, 430, 
+432, 445, 465, 492, 181, 181, 182, 184, 185, 186, 190, 190, 192, 
+193, 198, 199, 200, 201, 209, 218, 221, 224, 224, 227, 232, 236, 
+321, 338, 339, 345, 351, 353, 430, 180, 181, 184, 185, 190, 194, 
+195, 211, 213, 222, 230, 230, 372, 460, 475, 180, 181, 185, 200, 
+205, 215, 370, 234, 532, 624, 528, 312, 202, 195, 253, 615, 235, 
+210, 572, 215, 194, 203, 203, 200, 198, 495, 520, 205, 220, 220, 
+486, 190, 225, 219, 391, 376, 425, 220, 580, 510, 225, 210, 193, 
+395, 580, 420, 560, 425, 440, 284, 429, 530, 688, 197, 224, 225, 
+510, 487, 379, 568, 462, 572, 206, 186, 216, 208, 200, 396, 194, 
+503, 237, 231, 201, 183, 388, 438, 417, 413, 450, 592, 185, 228, 
+478, 205, 205, 437, 480, 184, 225, 203, 485, 574, 496, 424, 544, 
+335, 405, 514, 207, 408, 230, 186, 216, 202, 467, 193, 187, 435, 
+508, 187, 590, 198, 222, 571, 285, 568, 228, 285, 435, 499, 399, 
+508, 390, 209, 225, 450, 541, 362, 415, 238, 610, 214, 500, 388, 
+215, 356, 432, 518, 412, 689, 212, 205, 202, 485, 610, 195, 220, 
+627, 549, 525, 273, 190, 197, 242, 193, 215, 484, 436, 442, 431, 
+211, 267, 365, 250, 186, 211, 430, 365, 186, 208, 189, 208, 389, 
+211, 241, 196, 504, 421, 242, 320, 402, 501, 211, 195, 652, 550, 
+198, 202, 215, 198, 568, 210, 585, 225, 570, 230, 575, 200, 191, 
+615, 223, 418, 210, 521, 380, 560, 224, 620, 232, 236, 180, 230, 
+220, 238, 194, 183, 222, 181, 182, 552, 191, 208, 430, 225, 226, 
+206, 212, 197, 212, 205, 195, 400, 375, 235, 186, 535, 391, 385, 
+375, 213, 212, 410, 211, 404, 227, 213, 194, 221, 400, 575, 180, 
+200, 205, 585, 391, 486, 250, 222, 213, 365, 206, 221, 206, 207, 
+180, 458, 216, 457, 211, 226, 211, 197, 443, 188, 215, 211, 185, 
+203, 590, 229, 439, 423, 291, 565, 470, 312, 455, 441, 441, 254, 
+406, 340, 498, 498, 475, 574, 435, 205, 425, 425, 486, 443, 482, 
+505, 495, 470, 545, 385, 444, 477, 265, 391, 457, 429, 430, 450, 
+480, 450, 441, 270, 545, 505, 450, 481, 524, 480, 293, 439, 252, 
+471, 467, 476, 511, 473, 535, 462, 604, 426, 443, 421, 470, 515, 
+501, 476, 487, 493, 580, 490, 410, 383, 510, 470, 510, 455, 234, 
+492, 490, 572, 400, 490, 435, 490, 466, 195, 184, 431, 235, 415, 
+444, 405, 430, 500, 465, 548, 461, 475, 427, 400, 510, 328, 231, 
+461, 430, 505, 263, 411, 450, 490, 455, 242, 395, 530, 444, 550, 
+440, 565, 490, 565, 490, 525, 475, 517, 510, 480, 470, 510, 470, 
+474, 399, 292, 533, 406, 455, 512, 287, 530, 411, 450, 395, 477, 
+493, 396, 414, 518, 520, 590, 594, 439, 407, 417, 361, 528, 498, 
+390, 470, 432, 505, 475, 445, 510, 410, 375, 435, 190, 480, 475, 
+204, 414, 442, 441, 276, 347, 450, 340, 260, 431, 467, 457, 414, 
+412, 535, 563, 454, 393, 447, 189, 461, 428, 425, 439, 314, 420, 
+290, 455, 400, 405, 372, 430, 538, 530, 274), water = structure(c(1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5), .Label = c("Waihou", "Waimakariri", "Whanganui", "Otamangakau", 
+"Rotoaira"), class = "factor"), session = c(1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6), sector = c(4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3), beatboat = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 
+7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 
+8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
+8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 
+7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 
+9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 
+9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 2, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
+8, 8, 8, 8, 8, 9, 9, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 
+6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 
+9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 
+10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 
+11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
+12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 
+16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
+16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 
+17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 
+18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 
+19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 10, 
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 
+10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 
+11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
+12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 
+16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 
+18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 
+10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 12, 
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
+12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 
+14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 
+15, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 
+18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 10, 10, 
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 
+12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 
+13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 
+14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
+17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 
+18, 18, 18, 18, 18, 19, 19, 19, 19, 10, 10, 11, 11, 11, 11, 11, 
+11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 16, 16, 16, 16, 16, 
+16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 
+17, 18, 18, 18, 18, 18, 19, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 
+9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 
+9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 
+5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 
+7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 
+9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 8, 8, 
+8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 
+9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 10, 10, 10, 10, 
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 
+11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
+13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 
+15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
+16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 
+17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 
+18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 
+19, 19, 19, 19, 19, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 
+11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
+12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 
+13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 
+15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
+16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 
+17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 
+19, 19, 19, 19, 19, 19, 19, 19, 19, 10, 10, 10, 10, 10, 10, 10, 
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 
+13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 
+14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 
+17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 
+18, 18, 18, 18, 19, 19, 19, 19, 10, 10, 10, 10, 10, 10, 10, 10, 
+10, 10, 10, 11, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 15, 15, 
+16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
+16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 10, 10, 10, 10, 10, 
+10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 12, 
+12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 
+14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 
+16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 
+17, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 1, 1, 1, 
+1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 
+7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 
+8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 1, 2, 2, 2, 2, 
+2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 
+8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 
+9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8, 9, 
+9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 
+9, 9, 9, 9, 9, 9, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 
+7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 
+8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 
+9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 
+1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 
+5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 
+7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
+8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 
+11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
+12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 
+14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 17, 
+17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 
+17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 
+19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 10, 10, 10, 10, 10, 
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 
+11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 
+11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
+12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 
+13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 
+14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 
+15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 
+16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 
+18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 
+19, 19, 19, 19, 19, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 
+11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 
+14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 
+16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 
+17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 
+18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 
+19, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 
+11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 
+11, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 
+13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 
+15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
+16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 
+17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 
+18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 
+18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 
+19, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 
+11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 
+13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 
+16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 
+17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 
+17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 
+18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 1, 1, 3, 3, 5, 5, 6, 
+6, 7, 8, 8, 8, 8, 9, 10, 11, 11, 12, 12, 12, 12, 12, 13, 13, 
+13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 
+17, 17, 19, 19, 19, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 7, 7, 9, 9, 10, 
+10, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 15, 15, 
+15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 1, 
+2, 3, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8, 9, 9, 
+9, 9, 11, 11, 11, 11, 11, 12, 13, 13, 15, 15, 16, 16, 16, 16, 
+16, 17, 18, 18, 18, 18, 18, 18, 1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 
+4, 4, 4, 4, 5, 5, 5, 5, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 11, 
+11, 11, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 17, 
+17, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 7, 7, 7, 7, 7, 7, 8, 9, 10, 10, 
+11, 11, 11, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 
+14, 15, 15, 15, 16, 16, 17, 17, 17, 17, 18, 19, 19, 19, 19, 1, 
+1, 2, 3, 3, 5, 5, 8, 8, 8, 9, 10, 11, 11, 12, 12, 12, 13, 13, 
+14, 14, 14, 15, 15, 15, 15, 15, 16, 17, 17, 1, 1, 1, 2, 3, 3, 
+4, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 9, 10, 10, 
+10, 11, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 15, 15, 17, 17, 
+17, 17, 17, 17, 18, 18, 19, 19, 19, 19, 1, 2, 2, 2, 3, 3, 3, 
+3, 4, 4, 5, 5, 5, 8, 8, 9, 9, 9, 10, 11, 11, 11, 12, 12, 13, 
+13, 14, 14, 15, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 
+17, 18, 18, 18, 19, 19, 1, 1, 1, 3, 3, 3, 4, 4, 5, 6, 7, 7, 9, 
+9, 9, 9, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 17, 17, 
+17, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 2, 2, 4, 5, 5, 7, 
+7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 13, 14, 14, 14, 14, 15, 15, 15, 
+15, 17, 18, 18, 19, 19, 19), comid = c(42, 42, 42, 42, 42, 42, 
+42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 26, 26, 
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+26, 26, 74, 74, 74, 74, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 79, 
+79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 90, 90, 90, 90, 
+90, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 
+24, 24, 24, 24, 24, 24, 24, 24, 55, 55, 55, 55, 55, 55, 55, 55, 
+55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 
+55, 55, 55, 55, 88, 88, 88, 88, 88, 88, 88, 88, 88, 61, 61, 61, 
+61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 30, 
+30, 30, 30, 30, 30, 30, 30, 30, 29, 29, 29, 29, 29, 29, 29, 29, 
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 
+35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 
+35, 35, 35, 35, 35, 35, 92, 92, 92, 92, 73, 73, 73, 73, 73, 73, 
+73, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 31, 31, 31, 31, 
+31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 50, 50, 50, 50, 
+50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 69, 69, 69, 69, 
+69, 69, 69, 69, 69, 69, 69, 69, 69, 54, 54, 54, 54, 54, 54, 54, 
+54, 54, 51, 51, 51, 51, 51, 51, 51, 51, 51, 82, 82, 82, 82, 82, 
+82, 82, 82, 82, 82, 82, 82, 82, 10, 10, 10, 10, 10, 10, 10, 10, 
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 
+10, 10, 10, 10, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 40, 40, 
+40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 
+40, 89, 89, 89, 89, 89, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 95, 94, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 
+33, 33, 33, 33, 33, 33, 33, 20, 20, 20, 20, 20, 20, 20, 20, 20, 
+20, 20, 20, 20, 20, 20, 20, 20, 65, 65, 65, 65, 65, 65, 65, 56, 
+56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 
+56, 56, 56, 56, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+52, 52, 52, 77, 77, 91, 91, 17, 17, 17, 17, 17, 17, 17, 28, 28, 
+28, 28, 28, 28, 28, 28, 28, 4, 4, 4, 4, 4, 4, 4, 85, 85, 85, 
+85, 8, 8, 8, 8, 8, 8, 8, 8, 22, 22, 22, 22, 22, 22, 22, 22, 22, 
+22, 62, 62, 39, 39, 39, 39, 39, 39, 39, 39, 39, 19, 19, 19, 19, 
+19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 
+19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 63, 
+63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 
+63, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 98, 98, 
+98, 98, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 
+53, 53, 53, 53, 53, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 
+13, 13, 13, 13, 13, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 
+27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 46, 46, 46, 46, 
+46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 
+46, 46, 46, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 45, 45, 
+45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 
+45, 45, 45, 45, 45, 45, 45, 45, 45, 47, 47, 47, 47, 47, 47, 47, 
+47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 38, 38, 38, 38, 38, 
+38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 9, 9, 
+9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 
+9, 9, 9, 9, 9, 9, 9, 9, 81, 81, 81, 81, 81, 81, 32, 32, 32, 32, 
+32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 
+32, 32, 32, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 68, 68, 
+68, 68, 68, 68, 68, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 
+58, 58, 60, 60, 60, 60, 60, 60, 60, 21, 21, 21, 21, 21, 21, 21, 
+21, 21, 21, 64, 64, 64, 64, 64, 64, 64, 64, 64, 96, 96, 96, 7, 
+7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+7, 7, 7, 7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 
+36, 36, 36, 36, 36, 36, 36, 36, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 18, 18, 18, 18, 
+18, 18, 18, 18, 18, 18, 18, 18, 59, 59, 59, 59, 59, 59, 59, 84, 
+84, 84, 84, 84, 84, 84, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 
+11, 67, 67, 67, 67, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
+16, 66, 66, 66, 66, 66, 66, 78, 78, 78, 14, 14, 14, 14, 14, 14, 
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 43, 43, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 
+15, 15, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 
+44, 44, 48, 48, 48, 48, 48, 86, 86, 86, 86, 76, 76, 83, 83, 83, 
+83, 83, 83, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
+34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 97, 71, 71, 71, 
+71, 71, 71, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 
+37, 37, 37, 87, 87, 87, 87, 87, 49, 50, 50, 50, 50, 50, 50, 50, 
+50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 
+50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 92, 92, 
+92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 68, 68, 68, 
+68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 21, 21, 21, 
+21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 
+21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 31, 
+31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 
+31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 29, 29, 29, 29, 
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 
+29, 29, 29, 29, 29, 29, 29, 29, 23, 23, 23, 23, 23, 23, 23, 23, 
+23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 
+30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 
+58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 
+58, 58, 58, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 
+53, 53, 53, 53, 53, 53, 53, 53, 53, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 90, 
+90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 42, 42, 42, 42, 42, 
+42, 42, 42, 42, 42, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 63, 
+63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 
+63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 98, 98, 70, 70, 70, 
+70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 74, 74, 74, 74, 51, 
+51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 
+51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 18, 18, 18, 18, 18, 18, 
+18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 
+18, 18, 18, 18, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 
+59, 59, 59, 59, 59, 59, 59, 59, 59, 10, 10, 10, 10, 10, 10, 10, 
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 
+10, 10, 10, 10, 10, 89, 89, 89, 89, 89, 89, 89, 11, 11, 11, 11, 
+11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 
+11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 69, 69, 69, 69, 69, 
+69, 69, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 
+84, 84, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 
+54, 54, 54, 54, 54, 71, 71, 71, 71, 71, 71, 71, 71, 71, 17, 17, 
+17, 17, 17, 17, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 22, 22, 
+22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 
+91, 91, 91, 91, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
+12, 12, 12, 12, 12, 75, 75, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 39, 
+39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 56, 56, 
+56, 56, 56, 56, 56, 56, 56, 56, 99, 65, 14, 14, 14, 14, 14, 14, 
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 52, 
+52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 95, 95, 95, 95, 95, 95, 
+95, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 15, 15, 
+15, 15, 15, 15, 15, 15, 15, 15, 77, 77, 60, 60, 60, 60, 60, 60, 
+60, 60, 60, 60, 60, 60, 60, 60, 32, 32, 32, 32, 32, 32, 32, 32, 
+32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 38, 38, 
+38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 
+38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 35, 35, 
+35, 35, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 73, 73, 
+73, 73, 73, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 
+41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 
+41, 41, 41, 41, 41, 41, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 
+9, 9, 9, 9, 9, 9, 9, 9, 9, 47, 47, 47, 47, 47, 47, 47, 45, 45, 
+45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 
+45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 
+45, 45, 45, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 
+27, 27, 27, 27, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 
+88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 55, 55, 55, 55, 55, 
+55, 55, 55, 55, 46, 46, 46, 46, 46, 46, 46, 13, 13, 13, 13, 13, 
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 26, 
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 24, 24, 24, 24, 24, 24, 
+24, 24, 24, 24, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 
+19, 19, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+96, 96, 96, 96, 96, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 67, 67, 67, 67, 
+67, 67, 67, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 64, 
+64, 64, 64, 64, 64, 64, 82, 82, 82, 82, 82, 36, 36, 36, 36, 36, 
+36, 36, 36, 36, 36, 36, 40, 40, 40, 40, 40, 40, 40, 40, 40, 57, 
+57, 57, 57, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 85, 85, 
+85, 85, 76, 76, 37, 37, 37, 37, 62, 97, 97, 28, 28, 28, 28, 28, 
+28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 8, 8, 8, 
+8, 8, 8, 8, 8, 49, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
+16, 16, 94, 94, 94, 94, 94, 94, 94, 66, 66, 66, 33, 33, 33, 33, 
+33, 33, 33, 33, 33, 33, 33, 33, 86, 86, 86, 86, 86, 86, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 
+43, 43, 43, 48, 48, 48, 48, 48, 44, 44, 44, 44, 44, 44, 44, 75, 
+75, 75, 75, 75, 75, 75, 97, 97, 97, 85, 85, 85, 85, 83, 83, 83, 
+83, 83, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 8, 8, 8, 8, 8, 
+8, 8, 8, 8, 8, 8, 8, 8, 8, 22, 22, 22, 22, 22, 22, 22, 22, 22, 
+22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 39, 39, 39, 39, 39, 39, 
+39, 39, 39, 39, 39, 39, 39, 76, 76, 76, 76, 76, 76, 76, 96, 59, 
+59, 59, 59, 59, 59, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 
+11, 11, 11, 11, 11, 11, 11, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 
+10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 67, 67, 67, 
+67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 
+67, 67, 67, 67, 67, 67, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 
+82, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 64, 64, 64, 64, 64, 64, 64, 64, 64, 33, 33, 33, 
+33, 33, 33, 20, 20, 20, 20, 20, 20, 20, 52, 52, 52, 52, 52, 52, 
+52, 52, 52, 52, 52, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 
+65, 65, 65, 65, 65, 65, 65, 65, 15, 15, 15, 15, 15, 15, 15, 15, 
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 
+15, 15, 66, 66, 66, 77, 77, 77, 77, 77, 44, 44, 44, 44, 44, 44, 
+44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 
+44, 44, 44, 44, 44, 44, 79, 79, 63, 63, 63, 19, 19, 19, 19, 19, 
+19, 19, 19, 19, 19, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 55, 
+55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 
+55, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 53, 53, 
+53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+26, 26, 26, 26, 26, 26, 26, 26, 42, 42, 42, 42, 42, 42, 42, 42, 
+42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 61, 61, 61, 61, 
+61, 61, 81, 81, 29, 29, 29, 29, 29, 29, 29, 29, 29, 38, 38, 38, 
+38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 
+38, 38, 38, 38, 38, 38, 41, 41, 41, 41, 41, 41, 23, 23, 23, 23, 
+23, 23, 23, 23, 23, 23, 23, 23, 23, 30, 30, 30, 30, 30, 30, 30, 
+30, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 
+35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 92, 92, 
+92, 92, 92, 92, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 
+71, 71, 71, 71, 62, 62, 62, 62, 62, 62, 17, 17, 17, 17, 17, 17, 
+17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 12, 12, 
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
+12, 12, 12, 12, 91, 91, 91, 91, 49, 49, 49, 49, 49, 49, 49, 49, 
+49, 49, 49, 49, 87, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 34, 34, 34, 34, 34, 
+28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 18, 18, 18, 18, 18, 
+18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 40, 
+40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 
+40, 40, 40, 40, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 
+54, 54, 54, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 
+51, 51, 51, 51, 51, 51, 51, 51, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 57, 57, 
+57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 
+57, 57, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 89, 
+89, 89, 89, 89, 69, 69, 69, 69, 69, 69, 69, 36, 36, 36, 36, 36, 
+36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 94, 
+94, 94, 94, 94, 94, 94, 94, 14, 14, 14, 14, 14, 14, 14, 14, 14, 
+14, 14, 14, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 
+56, 56, 56, 56, 56, 56, 56, 56, 43, 43, 43, 43, 43, 43, 43, 43, 
+43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 48, 48, 48, 48, 48, 
+48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 86, 86, 86, 
+86, 86, 86, 86, 86, 86, 86, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
+16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 95, 95, 95, 
+95, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 
+24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 27, 
+27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 
+27, 27, 27, 27, 98, 98, 98, 70, 70, 70, 70, 70, 70, 70, 70, 70, 
+70, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 74, 
+74, 74, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 
+45, 45, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 13, 13, 13, 13, 13, 13, 13, 
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 25, 25, 
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 73, 73, 73, 73, 73, 73, 
+73, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 9, 9, 9, 
+9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 
+58, 58, 58, 58, 58, 58, 58, 58, 58, 50, 50, 50, 50, 50, 50, 50, 
+50, 50, 50, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 
+31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 60, 
+60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 21, 21, 21, 21, 21, 
+21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 
+21, 21, 21, 21, 21, 21, 21, 21, 32, 32, 32, 32, 32, 32, 32, 32, 
+32, 32, 32, 32, 32, 32, 32, 68, 68, 68, 68, 68, 68, 68, 66, 66, 
+16, 16, 78, 78, 77, 77, 33, 48, 48, 48, 48, 56, 65, 86, 86, 20, 
+20, 20, 20, 20, 1, 1, 1, 1, 1, 15, 15, 15, 15, 5, 5, 5, 5, 5, 
+5, 14, 14, 14, 52, 52, 43, 43, 43, 58, 58, 58, 58, 30, 30, 30, 
+30, 30, 30, 35, 35, 35, 35, 35, 35, 35, 35, 35, 31, 31, 31, 60, 
+60, 60, 60, 60, 38, 38, 81, 81, 32, 32, 68, 68, 21, 21, 29, 29, 
+47, 47, 47, 47, 61, 61, 61, 9, 9, 9, 9, 9, 9, 9, 9, 41, 41, 41, 
+41, 41, 73, 73, 73, 73, 23, 23, 75, 22, 62, 62, 62, 62, 62, 62, 
+39, 39, 8, 8, 8, 8, 8, 8, 93, 76, 87, 87, 4, 4, 4, 4, 80, 80, 
+80, 80, 80, 85, 17, 17, 12, 12, 37, 37, 37, 37, 37, 34, 49, 49, 
+49, 49, 49, 49, 3, 3, 3, 26, 26, 74, 74, 74, 74, 74, 42, 42, 
+42, 42, 13, 13, 13, 13, 88, 25, 25, 25, 25, 63, 63, 63, 63, 79, 
+79, 19, 19, 19, 27, 24, 24, 24, 24, 46, 46, 46, 72, 72, 72, 70, 
+70, 55, 55, 54, 84, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 10, 10, 10, 6, 6, 6, 6, 
+6, 6, 82, 69, 57, 57, 59, 59, 59, 96, 2, 2, 2, 2, 2, 2, 2, 18, 
+18, 18, 18, 18, 18, 67, 67, 67, 64, 64, 11, 11, 11, 11, 51, 89, 
+89, 89, 89, 43, 43, 48, 5, 5, 20, 20, 66, 66, 66, 1, 14, 15, 
+15, 78, 78, 78, 44, 44, 77, 77, 77, 16, 16, 16, 16, 16, 33, 65, 
+65, 34, 34, 34, 39, 12, 12, 85, 93, 93, 80, 80, 80, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 91, 37, 49, 49, 49, 62, 62, 76, 76, 22, 
+17, 17, 17, 17, 17, 17, 87, 87, 28, 28, 28, 28, 28, 28, 75, 75, 
+8, 8, 8, 8, 50, 61, 61, 61, 30, 30, 30, 30, 32, 32, 81, 81, 81, 
+9, 9, 73, 73, 73, 60, 68, 68, 68, 47, 47, 29, 29, 92, 92, 35, 
+21, 21, 21, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 41, 41, 41, 
+31, 31, 10, 10, 10, 40, 40, 40, 57, 57, 6, 96, 69, 69, 64, 64, 
+64, 64, 64, 64, 36, 51, 7, 7, 67, 59, 18, 18, 82, 11, 11, 11, 
+11, 11, 11, 11, 54, 54, 54, 2, 2, 2, 2, 24, 24, 53, 46, 46, 19, 
+19, 13, 13, 13, 13, 27, 27, 27, 27, 90, 79, 3, 3, 3, 3, 26, 26, 
+26, 26, 42, 74, 74, 72, 72, 72), iname = c("BorisDzurek", "BorisDzurek", 
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", 
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", 
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", 
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "JohnNishi", "JohnNishi", 
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", 
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", 
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", 
+"JohnNishi", "JohnNishi", "JohnNishi", "MichaelHeckler", "MichaelHeckler", 
+"MichaelHeckler", "MichaelHeckler", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"BoskoBarisic", "BoskoBarisic", "BoskoBarisic", "BoskoBarisic", 
+"BoskoBarisic", "BoskoBarisic", "BoskoBarisic", "BoskoBarisic", 
+"BoskoBarisic", "BoskoBarisic", "BoskoBarisic", "BoskoBarisic", 
+"BoskoBarisic", "AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp", 
+"AndreSteenkamp", "AndreSteenkamp", "LanceEgan", "LanceEgan", 
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", 
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", 
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", 
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", 
+"LanceEgan", "CraigColtman", "CraigColtman", "CraigColtman", 
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman", 
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman", 
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman", 
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman", 
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman", 
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman", 
+"CraigColtman", "HansBock", "HansBock", "HansBock", "HansBock", 
+"HansBock", "HansBock", "HansBock", "HansBock", "HansBock", "ArturTrzaskos", 
+"ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", 
+"ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", 
+"ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", 
+"ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", 
+"ArturTrzaskos", "VernBarby", "VernBarby", "VernBarby", "VernBarby", 
+"VernBarby", "VernBarby", "VernBarby", "VernBarby", "VernBarby", 
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", 
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", 
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", 
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", 
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", 
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", 
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", 
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", 
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", 
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", 
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", 
+"WilliamKavenagh", "WilliamKavenagh", "StefanFlorea", "StefanFlorea", 
+"StefanFlorea", "StefanFlorea", "JamieHarries", "JamieHarries", 
+"JamieHarries", "JamieHarries", "JamieHarries", "JamieHarries", 
+"JamieHarries", "JoseDias", "JoseDias", "JoseDias", "JoseDias", 
+"JoseDias", "JoseDias", "JoseDias", "JoseDias", "JoseDias", "JoseDias", 
+"JoseDias", "TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", 
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", 
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", 
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "TimRolston", "TimRolston", 
+"TimRolston", "TimRolston", "TimRolston", "TimRolston", "TimRolston", 
+"TimRolston", "TimRolston", "TimRolston", "TimRolston", "TimRolston", 
+"TimRolston", "NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", 
+"NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", 
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop", 
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "SimonGrootemaat", 
+"SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", 
+"SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", 
+"SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", 
+"AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", 
+"AlessandroSgrani", "AlessandroSgrani", "PeterBienek", "PeterBienek", 
+"PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", 
+"PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", 
+"PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", 
+"PeterBienek", "PeterBienek", "KimTribe", "KimTribe", "KimTribe", 
+"KimTribe", "KimTribe", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "SabahudinPehadzicBIHI", 
+"MarinkoPuskaric", "LucjanBurda", "LucjanBurda", "LucjanBurda", 
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", 
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", 
+"LucjanBurda", "LucjanBurda", "MichalBenatinsky", "MichalBenatinsky", 
+"MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", 
+"MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", 
+"MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", 
+"MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", 
+"MichalBenatinsky", "MichalBenatinsky", "JoshStephens", "JoshStephens", 
+"JoshStephens", "JoshStephens", "JoshStephens", "JoshStephens", 
+"JoshStephens", "JoshStephens", "JoshStephens", "JoshStephens", 
+"JoshStephens", "JoshStephens", "JoshStephens", "JoshStephens", 
+"JoshStephens", "JoshStephens", "JoshStephens", "JohnTrench", 
+"JohnTrench", "JohnTrench", "JohnTrench", "JohnTrench", "JohnTrench", 
+"JohnTrench", "PeterElberse", "PeterElberse", "PeterElberse", 
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse", 
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse", 
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse", 
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse", 
+"PeterElberse", "PeterElberse", "JarkkoSuominen", "JarkkoSuominen", 
+"JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", 
+"JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", 
+"JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", 
+"JarkkoSuominen", "RobertVanRensburg", "RobertVanRensburg", "MisakoIshimura", 
+"MisakoIshimura", "JohnBell", "JohnBell", "JohnBell", "JohnBell", 
+"JohnBell", "JohnBell", "JohnBell", "BertrandJacquemin", "BertrandJacquemin", 
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin", 
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin", 
+"BertrandJacquemin", "JohnHorsey", "JohnHorsey", "JohnHorsey", 
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "AntonioRodrigues", 
+"AntonioRodrigues", "AntonioRodrigues", "AntonioRodrigues", "JannePirkkalainen", 
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen", 
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen", 
+"JannePirkkalainen", "PavelMachan", "PavelMachan", "PavelMachan", 
+"PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", 
+"PavelMachan", "PavelMachan", "TorbjornEriksson", "TorbjornEriksson", 
+"StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", 
+"StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", 
+"StanislawGuzdek", "LloydStruther", "LloydStruther", "LloydStruther", 
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther", 
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther", 
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther", 
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther", 
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther", 
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther", 
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther", 
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther", 
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", 
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", 
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", 
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "OlliToivonen", 
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen", 
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen", 
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen", 
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen", 
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen", 
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen", 
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen", 
+"YoshikoIzumiya", "YoshikoIzumiya", "YoshikoIzumiya", "YoshikoIzumiya", 
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", 
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", 
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", 
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "SandroSoldarini", 
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini", 
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini", 
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini", 
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "MarekWalczyk", 
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk", 
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk", 
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk", 
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk", 
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk", 
+"MarekWalczyk", "MarekWalczyk", "AndrewDixon", "AndrewDixon", 
+"AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", 
+"AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", 
+"AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", 
+"AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", 
+"AndrewDixon", "StanislawMankou", "StanislawMankou", "StanislawMankou", 
+"StanislawMankou", "StanislawMankou", "StanislawMankou", "StanislawMankou", 
+"StanislawMankou", "StanislawMankou", "StanislawMankou", "StanislawMankou", 
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", 
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", 
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", 
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", 
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", 
+"YannCaleri", "YannCaleri", "MikeTinnion", "MikeTinnion", "MikeTinnion", 
+"MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", 
+"MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", 
+"MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "TomasAdam", 
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", 
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", 
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", 
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", 
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", 
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", 
+"MarkYelland", "MarkYelland", "MarkYelland", "MarkYelland", "MarkYelland", 
+"MarkYelland", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal", 
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal", 
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal", 
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal", 
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal", 
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal", 
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre", 
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre", 
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ReneKoops", 
+"ReneKoops", "ReneKoops", "ReneKoops", "ReneKoops", "ReneKoops", 
+"ReneKoops", "VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola", 
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola", 
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola", 
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola", 
+"VilleAnttiJaakkola", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa", 
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa", 
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "CraigFarrar", "CraigFarrar", 
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", 
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "JouniNeste", "JouniNeste", 
+"JouniNeste", "JouniNeste", "JouniNeste", "JouniNeste", "JouniNeste", 
+"JouniNeste", "JouniNeste", "StephenVarga", "StephenVarga", "StephenVarga", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", 
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", 
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", 
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", 
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", 
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", 
+"KiyoshiNakagawa", "ScottTucker", "ScottTucker", "ScottTucker", 
+"ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker", "MiroslavKaticic", 
+"MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", 
+"MiroslavKaticic", "MiroslavKaticic", "AntoninPesek", "AntoninPesek", 
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek", 
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek", 
+"AntoninPesek", "ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", 
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", 
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", 
+"DonaldThom", "DonaldThom", "TakashiKawahara", "TakashiKawahara", 
+"TakashiKawahara", "TakashiKawahara", "TakashiKawahara", "TakashiKawahara", 
+"DavidEricDavies", "DavidEricDavies", "DavidEricDavies", "LucaPapandrea", 
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea", 
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea", 
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea", 
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea", 
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea", 
+"LucaPapandrea", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", 
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", 
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", 
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", 
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", 
+"HowardCroston", "HowardCroston", "AaronWest", "AaronWest", "AaronWest", 
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "AaronWest", 
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "AaronWest", 
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier", 
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier", 
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier", 
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier", 
+"JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "HelderRodrigues", 
+"HelderRodrigues", "HelderRodrigues", "HelderRodrigues", "RickyLehman", 
+"RickyLehman", "PeterDindic", "PeterDindic", "PeterDindic", "PeterDindic", 
+"PeterDindic", "PeterDindic", "JanBartko", "JanBartko", "JanBartko", 
+"JanBartko", "JanBartko", "JanBartko", "JanBartko", "JanBartko", 
+"JanBartko", "JanBartko", "JanBartko", "JanBartko", "JanBartko", 
+"AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", 
+"AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", 
+"AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", 
+"JohnBeaven", "JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton", 
+"JohnFoxton", "JohnFoxton", "ValerioSantiAmantini", "ValerioSantiAmantini", 
+"ValerioSantiAmantini", "ValerioSantiAmantini", "ValerioSantiAmantini", 
+"ValerioSantiAmantini", "ValerioSantiAmantini", "ValerioSantiAmantini", 
+"ValerioSantiAmantini", "ValerioSantiAmantini", "ValerioSantiAmantini", 
+"ValerioSantiAmantini", "ValerioSantiAmantini", "ValerioSantiAmantini", 
+"ValerioSantiAmantini", "ValerioSantiAmantini", "JanKwisthout", 
+"JanKwisthout", "JanKwisthout", "JanKwisthout", "JanKwisthout", 
+"GaryGlenYoung", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", 
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", 
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", 
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", 
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", 
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", 
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", 
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "StefanFlorea", 
+"StefanFlorea", "StefanFlorea", "StefanFlorea", "StefanFlorea", 
+"StefanFlorea", "StefanFlorea", "StefanFlorea", "StefanFlorea", 
+"StefanFlorea", "StefanFlorea", "StefanFlorea", "StefanFlorea", 
+"StefanFlorea", "StefanFlorea", "ReneKoops", "ReneKoops", "ReneKoops", 
+"ReneKoops", "ReneKoops", "ReneKoops", "ReneKoops", "ReneKoops", 
+"ReneKoops", "ReneKoops", "ReneKoops", "ReneKoops", "ReneKoops", 
+"ReneKoops", "ReneKoops", "ReneKoops", "CraigFarrar", "CraigFarrar", 
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", 
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", 
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", 
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", 
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", 
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", 
+"CraigFarrar", "CraigFarrar", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", 
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", 
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", 
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", 
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", 
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", 
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", 
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre", 
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre", 
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre", 
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre", 
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre", 
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre", 
+"VernBarby", "VernBarby", "VernBarby", "VernBarby", "VernBarby", 
+"VernBarby", "VernBarby", "VernBarby", "VernBarby", "VernBarby", 
+"VernBarby", "VernBarby", "VernBarby", "VernBarby", "VernBarby", 
+"VernBarby", "VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola", 
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola", 
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola", 
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola", 
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola", 
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola", 
+"VilleAnttiJaakkola", "PauloMorais", "PauloMorais", "PauloMorais", 
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", 
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", 
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", 
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp", 
+"AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp", 
+"AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp", 
+"AndreSteenkamp", "BorisDzurek", "BorisDzurek", "BorisDzurek", 
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", 
+"BorisDzurek", "BorisDzurek", "BoskoBarisic", "BoskoBarisic", 
+"BoskoBarisic", "BoskoBarisic", "BoskoBarisic", "BoskoBarisic", 
+"BoskoBarisic", "BoskoBarisic", "BoskoBarisic", "BoskoBarisic", 
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", 
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", 
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", 
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", 
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", 
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "YoshikoIzumiya", 
+"YoshikoIzumiya", "StanislawMankou", "StanislawMankou", "StanislawMankou", 
+"StanislawMankou", "StanislawMankou", "StanislawMankou", "StanislawMankou", 
+"StanislawMankou", "StanislawMankou", "StanislawMankou", "StanislawMankou", 
+"StanislawMankou", "StanislawMankou", "StanislawMankou", "MichaelHeckler", 
+"MichaelHeckler", "MichaelHeckler", "MichaelHeckler", "BretBishop", 
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop", 
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop", 
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop", 
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop", 
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop", 
+"BretBishop", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", 
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", 
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", 
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", 
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", 
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", 
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "ScottTucker", 
+"ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker", 
+"ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker", 
+"ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker", 
+"ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"KimTribe", "KimTribe", "KimTribe", "KimTribe", "KimTribe", "KimTribe", 
+"KimTribe", "AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek", 
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek", 
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek", 
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek", 
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek", 
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek", 
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek", 
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "TimRolston", 
+"TimRolston", "TimRolston", "TimRolston", "TimRolston", "TimRolston", 
+"TimRolston", "MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", 
+"MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", 
+"MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", 
+"MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", 
+"MiroslavKaticic", "NunoDuarte", "NunoDuarte", "NunoDuarte", 
+"NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", 
+"NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", 
+"NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", 
+"NunoDuarte", "JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton", 
+"JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton", 
+"JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell", 
+"PeterDindic", "PeterDindic", "PeterDindic", "PeterDindic", "PeterDindic", 
+"PeterDindic", "PeterDindic", "PeterDindic", "PeterDindic", "PeterDindic", 
+"PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", 
+"PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", 
+"PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", 
+"PavelMachan", "PavelMachan", "PavelMachan", "MisakoIshimura", 
+"MisakoIshimura", "MisakoIshimura", "MisakoIshimura", "JanBartko", 
+"JanBartko", "JanBartko", "JanBartko", "JanBartko", "JanBartko", 
+"JanBartko", "JanBartko", "JanBartko", "JanBartko", "JanBartko", 
+"JanBartko", "JanBartko", "JanBartko", "JanBartko", "JanBartko", 
+"JanBartko", "BrianJeremiah", "BrianJeremiah", "JohnHorsey", 
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", 
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "StanislawGuzdek", 
+"StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", 
+"StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", 
+"StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", 
+"StanislawGuzdek", "StanislawGuzdek", "PeterElberse", "PeterElberse", 
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse", 
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse", 
+"DionDavies", "JohnTrench", "LucaPapandrea", "LucaPapandrea", 
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea", 
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea", 
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea", 
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea", 
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "JarkkoSuominen", 
+"JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", 
+"JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", 
+"JarkkoSuominen", "JarkkoSuominen", "SabahudinPehadzicBIHI", 
+"SabahudinPehadzicBIHI", "SabahudinPehadzicBIHI", "SabahudinPehadzicBIHI", 
+"SabahudinPehadzicBIHI", "SabahudinPehadzicBIHI", "SabahudinPehadzicBIHI", 
+"JoshStephens", "JoshStephens", "JoshStephens", "JoshStephens", 
+"JoshStephens", "JoshStephens", "JoshStephens", "JoshStephens", 
+"JoshStephens", "JoshStephens", "JoshStephens", "JoshStephens", 
+"JoshStephens", "AaronWest", "AaronWest", "AaronWest", "AaronWest", 
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "AaronWest", 
+"AaronWest", "RobertVanRensburg", "RobertVanRensburg", "SeiichiKomatsuzawa", 
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa", 
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa", 
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa", 
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa", 
+"SeiichiKomatsuzawa", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal", 
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal", 
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal", 
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal", 
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal", 
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "GeorgeDaniel", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "WilliamKavenagh", 
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "ArturTrzaskos", 
+"ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", 
+"ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", 
+"ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", "JamieHarries", 
+"JamieHarries", "JamieHarries", "JamieHarries", "JamieHarries", 
+"MarkYelland", "MarkYelland", "MarkYelland", "MarkYelland", "MarkYelland", 
+"MarkYelland", "MarkYelland", "MarkYelland", "MarkYelland", "MarkYelland", 
+"MarkYelland", "MarkYelland", "MarkYelland", "JoseDias", "JoseDias", 
+"JoseDias", "JoseDias", "JoseDias", "JoseDias", "JoseDias", "JoseDias", 
+"JoseDias", "JoseDias", "JoseDias", "JoseDias", "JoseDias", "JoseDias", 
+"JoseDias", "JoseDias", "JoseDias", "JoseDias", "JoseDias", "JoseDias", 
+"JoseDias", "JoseDias", "TomasAdam", "TomasAdam", "TomasAdam", 
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", 
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", 
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", 
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "MikeTinnion", 
+"MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", 
+"MikeTinnion", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", 
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", 
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", 
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", 
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", 
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", 
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", 
+"YannCaleri", "YannCaleri", "YannCaleri", "MarekWalczyk", "MarekWalczyk", 
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk", 
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk", 
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk", 
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "OlliToivonen", 
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen", 
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen", 
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen", 
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen", 
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen", 
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen", 
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "HansBock", "HansBock", 
+"HansBock", "HansBock", "HansBock", "HansBock", "HansBock", "HansBock", 
+"HansBock", "HansBock", "HansBock", "CraigColtman", "CraigColtman", 
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman", 
+"CraigColtman", "CraigColtman", "CraigColtman", "AndrewDixon", 
+"AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", 
+"AndrewDixon", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini", 
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini", 
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini", 
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini", 
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini", 
+"SandroSoldarini", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", 
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", 
+"JohnNishi", "JohnNishi", "LanceEgan", "LanceEgan", "LanceEgan", 
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", 
+"LanceEgan", "LanceEgan", "LloydStruther", "LloydStruther", "LloydStruther", 
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther", 
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther", 
+"LloydStruther", "LloydStruther", "LloydStruther", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "StephenVarga", "StephenVarga", "StephenVarga", 
+"StephenVarga", "StephenVarga", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", 
+"ToddOishi", "ToddOishi", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JouniNeste", "JouniNeste", "JouniNeste", 
+"JouniNeste", "JouniNeste", "JouniNeste", "JouniNeste", "SimonGrootemaat", 
+"SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", 
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", 
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", 
+"DamienWalsh", "PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", 
+"PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", 
+"AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", 
+"AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", 
+"AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", 
+"AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", "AntonioRodrigues", 
+"AntonioRodrigues", "AntonioRodrigues", "AntonioRodrigues", "RickyLehman", 
+"RickyLehman", "ValerioSantiAmantini", "ValerioSantiAmantini", 
+"ValerioSantiAmantini", "ValerioSantiAmantini", "TorbjornEriksson", 
+"JohnBeaven", "JohnBeaven", "BertrandJacquemin", "BertrandJacquemin", 
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin", 
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin", 
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin", 
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin", 
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin", 
+"BertrandJacquemin", "JannePirkkalainen", "JannePirkkalainen", 
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen", 
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen", 
+"GaryGlenYoung", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", 
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", 
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "MarinkoPuskaric", 
+"MarinkoPuskaric", "MarinkoPuskaric", "MarinkoPuskaric", "MarinkoPuskaric", 
+"MarinkoPuskaric", "MarinkoPuskaric", "TakashiKawahara", "TakashiKawahara", 
+"TakashiKawahara", "MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", 
+"MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", 
+"MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", 
+"MichalBenatinsky", "HelderRodrigues", "HelderRodrigues", "HelderRodrigues", 
+"HelderRodrigues", "HelderRodrigues", "HelderRodrigues", "MartinDroz", 
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", 
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", 
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", 
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", 
+"MartinDroz", "MartinDroz", "MartinDroz", "LucjanBurda", "LucjanBurda", 
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", 
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "HowardCroston", 
+"HowardCroston", "HowardCroston", "HowardCroston", "HowardCroston", 
+"HowardCroston", "HowardCroston", "HowardCroston", "HowardCroston", 
+"HowardCroston", "JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", 
+"JoeRiley", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier", 
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier", 
+"BrianJeremiah", "BrianJeremiah", "BrianJeremiah", "BrianJeremiah", 
+"BrianJeremiah", "BrianJeremiah", "BrianJeremiah", "JohnBeaven", 
+"JohnBeaven", "JohnBeaven", "AntonioRodrigues", "AntonioRodrigues", 
+"AntonioRodrigues", "AntonioRodrigues", "PeterDindic", "PeterDindic", 
+"PeterDindic", "PeterDindic", "PeterDindic", "ValerioSantiAmantini", 
+"ValerioSantiAmantini", "ValerioSantiAmantini", "ValerioSantiAmantini", 
+"ValerioSantiAmantini", "ValerioSantiAmantini", "ValerioSantiAmantini", 
+"ValerioSantiAmantini", "ValerioSantiAmantini", "ValerioSantiAmantini", 
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen", 
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen", 
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen", 
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen", 
+"JannePirkkalainen", "JannePirkkalainen", "PavelMachan", "PavelMachan", 
+"PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", 
+"PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", 
+"PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", "PavelMachan", 
+"PavelMachan", "PavelMachan", "StanislawGuzdek", "StanislawGuzdek", 
+"StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", 
+"StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", 
+"StanislawGuzdek", "StanislawGuzdek", "StanislawGuzdek", "RickyLehman", 
+"RickyLehman", "RickyLehman", "RickyLehman", "RickyLehman", "RickyLehman", 
+"RickyLehman", "StephenVarga", "ScottTucker", "ScottTucker", 
+"ScottTucker", "ScottTucker", "ScottTucker", "ScottTucker", "AntoninPesek", 
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek", 
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek", 
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek", 
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek", 
+"AntoninPesek", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "PiotrKonieczny", "PiotrKonieczny", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", 
+"ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", 
+"ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", 
+"ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", 
+"ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", 
+"ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", "ToddOishi", 
+"SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", 
+"SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", 
+"SimonGrootemaat", "SimonGrootemaat", "SimonGrootemaat", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "JouniNeste", 
+"JouniNeste", "JouniNeste", "JouniNeste", "JouniNeste", "JouniNeste", 
+"JouniNeste", "JouniNeste", "JouniNeste", "MichalBenatinsky", 
+"MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", "MichalBenatinsky", 
+"MichalBenatinsky", "JoshStephens", "JoshStephens", "JoshStephens", 
+"JoshStephens", "JoshStephens", "JoshStephens", "JoshStephens", 
+"JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", 
+"JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", 
+"JarkkoSuominen", "JarkkoSuominen", "JarkkoSuominen", "JohnTrench", 
+"JohnTrench", "JohnTrench", "JohnTrench", "JohnTrench", "JohnTrench", 
+"JohnTrench", "JohnTrench", "JohnTrench", "JohnTrench", "JohnTrench", 
+"JohnTrench", "JohnTrench", "JohnTrench", "JohnTrench", "JohnTrench", 
+"JohnTrench", "JohnTrench", "JohnTrench", "AaronWest", "AaronWest", 
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "AaronWest", 
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "AaronWest", 
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "AaronWest", 
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "AaronWest", 
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "TakashiKawahara", 
+"TakashiKawahara", "TakashiKawahara", "RobertVanRensburg", "RobertVanRensburg", 
+"RobertVanRensburg", "RobertVanRensburg", "RobertVanRensburg", 
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier", 
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier", 
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier", 
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier", 
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier", 
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier", 
+"EricLelouvrier", "EricLelouvrier", "EricLelouvrier", "EricLelouvrier", 
+"BoskoBarisic", "BoskoBarisic", "JohnBuckley", "JohnBuckley", 
+"JohnBuckley", "LloydStruther", "LloydStruther", "LloydStruther", 
+"LloydStruther", "LloydStruther", "LloydStruther", "LloydStruther", 
+"LloydStruther", "LloydStruther", "LloydStruther", "AndreSteenkamp", 
+"AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp", 
+"AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp", "AndreSteenkamp", 
+"AndreSteenkamp", "CraigColtman", "CraigColtman", "CraigColtman", 
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman", 
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman", 
+"CraigColtman", "CraigColtman", "CraigColtman", "CraigColtman", 
+"CraigColtman", "CraigColtman", "CraigColtman", "AndrewDixon", 
+"AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", 
+"AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", "AndrewDixon", 
+"AndrewDixon", "AndrewDixon", "PauloMorais", "PauloMorais", "PauloMorais", 
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", 
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", 
+"PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", "PauloMorais", 
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", 
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", 
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", 
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", 
+"JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", "BorisDzurek", 
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", 
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", 
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", 
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "ArturTrzaskos", 
+"ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", 
+"ArturTrzaskos", "MarkYelland", "MarkYelland", "GianlucaMazzocco", 
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", 
+"GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", "GianlucaMazzocco", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", 
+"GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", "GeorgeDaniel", 
+"GeorgeDaniel", "JoseDias", "JoseDias", "JoseDias", "JoseDias", 
+"JoseDias", "JoseDias", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre", 
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre", 
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre", 
+"ChristopheIdre", "ChristopheIdre", "VernBarby", "VernBarby", 
+"VernBarby", "VernBarby", "VernBarby", "VernBarby", "VernBarby", 
+"VernBarby", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", 
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", 
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", 
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", 
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", 
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", 
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", 
+"WilliamKavenagh", "WilliamKavenagh", "StefanFlorea", "StefanFlorea", 
+"StefanFlorea", "StefanFlorea", "StefanFlorea", "StefanFlorea", 
+"JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton", 
+"JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton", 
+"JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton", "JohnFoxton", 
+"JohnFoxton", "TorbjornEriksson", "TorbjornEriksson", "TorbjornEriksson", 
+"TorbjornEriksson", "TorbjornEriksson", "TorbjornEriksson", "JohnBell", 
+"JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell", 
+"JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell", 
+"JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell", 
+"JohnBell", "JanBartko", "JanBartko", "JanBartko", "JanBartko", 
+"JanBartko", "JanBartko", "JanBartko", "JanBartko", "JanBartko", 
+"JanBartko", "JanBartko", "JanBartko", "JanBartko", "JanBartko", 
+"JanBartko", "JanBartko", "JanBartko", "JanBartko", "JanBartko", 
+"JanBartko", "JanBartko", "JanBartko", "MisakoIshimura", "MisakoIshimura", 
+"MisakoIshimura", "MisakoIshimura", "GaryGlenYoung", "GaryGlenYoung", 
+"GaryGlenYoung", "GaryGlenYoung", "GaryGlenYoung", "GaryGlenYoung", 
+"GaryGlenYoung", "GaryGlenYoung", "GaryGlenYoung", "GaryGlenYoung", 
+"GaryGlenYoung", "GaryGlenYoung", "JanKwisthout", "JohnHorsey", 
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", 
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", 
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", 
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", 
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", 
+"JohnHorsey", "JohnHorsey", "AnthonyNaranja", "AnthonyNaranja", 
+"AnthonyNaranja", "AnthonyNaranja", "AnthonyNaranja", "BertrandJacquemin", 
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin", 
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin", 
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin", 
+"BertrandJacquemin", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", 
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", 
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", 
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", 
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", 
+"KiyoshiNakagawa", "PeterBienek", "PeterBienek", "PeterBienek", 
+"PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", 
+"PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", 
+"PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", "PeterBienek", 
+"PeterBienek", "PeterBienek", "PeterBienek", "NunoDuarte", "NunoDuarte", 
+"NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", 
+"NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", "NunoDuarte", 
+"NunoDuarte", "NunoDuarte", "NunoDuarte", "BretBishop", "BretBishop", 
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop", 
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop", 
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "BretBishop", 
+"BretBishop", "BretBishop", "BretBishop", "BretBishop", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", 
+"AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", 
+"AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", 
+"AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", 
+"AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", "AlessandroSgrani", 
+"MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", 
+"MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", 
+"MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", "MiroslavKaticic", 
+"MiroslavKaticic", "KimTribe", "KimTribe", "KimTribe", "KimTribe", 
+"KimTribe", "TimRolston", "TimRolston", "TimRolston", "TimRolston", 
+"TimRolston", "TimRolston", "TimRolston", "DamienWalsh", "DamienWalsh", 
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", 
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", 
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", 
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "MarinkoPuskaric", 
+"MarinkoPuskaric", "MarinkoPuskaric", "MarinkoPuskaric", "MarinkoPuskaric", 
+"MarinkoPuskaric", "MarinkoPuskaric", "MarinkoPuskaric", "LucaPapandrea", 
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea", 
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "LucaPapandrea", 
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "PeterElberse", 
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse", 
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse", 
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse", 
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse", 
+"PeterElberse", "PeterElberse", "PeterElberse", "PeterElberse", 
+"HowardCroston", "HowardCroston", "HowardCroston", "HowardCroston", 
+"HowardCroston", "HowardCroston", "HowardCroston", "HowardCroston", 
+"HowardCroston", "HowardCroston", "HowardCroston", "HowardCroston", 
+"HowardCroston", "HowardCroston", "HowardCroston", "LucjanBurda", 
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", 
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", 
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", 
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", 
+"LucjanBurda", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", 
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", 
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", 
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", 
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", 
+"JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", 
+"JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", 
+"JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", 
+"HelderRodrigues", "HelderRodrigues", "HelderRodrigues", "HelderRodrigues", 
+"HelderRodrigues", "HelderRodrigues", "HelderRodrigues", "HelderRodrigues", 
+"HelderRodrigues", "HelderRodrigues", "DonaldThom", "DonaldThom", 
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", 
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", 
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", 
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", 
+"SabahudinPehadzicBIHI", "SabahudinPehadzicBIHI", "SabahudinPehadzicBIHI", 
+"SabahudinPehadzicBIHI", "LanceEgan", "LanceEgan", "LanceEgan", 
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", 
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", 
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", 
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", 
+"LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", 
+"LanceEgan", "LanceEgan", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk", 
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk", 
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk", 
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk", 
+"MarekWalczyk", "MarekWalczyk", "MarekWalczyk", "MarekWalczyk", 
+"MarekWalczyk", "MarekWalczyk", "YoshikoIzumiya", "YoshikoIzumiya", 
+"YoshikoIzumiya", "StanislawMankou", "StanislawMankou", "StanislawMankou", 
+"StanislawMankou", "StanislawMankou", "StanislawMankou", "StanislawMankou", 
+"StanislawMankou", "StanislawMankou", "StanislawMankou", "HansBock", 
+"HansBock", "HansBock", "HansBock", "HansBock", "HansBock", "HansBock", 
+"HansBock", "HansBock", "HansBock", "HansBock", "HansBock", "HansBock", 
+"HansBock", "MichaelHeckler", "MichaelHeckler", "MichaelHeckler", 
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", 
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", 
+"YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", "YannCaleri", 
+"YannCaleri", "TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini", 
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini", 
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini", 
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini", 
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "SandroSoldarini", 
+"SandroSoldarini", "OlliToivonen", "OlliToivonen", "OlliToivonen", 
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen", 
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen", 
+"OlliToivonen", "JamieHarries", "JamieHarries", "JamieHarries", 
+"JamieHarries", "JamieHarries", "JamieHarries", "JamieHarries", 
+"MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", 
+"MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", "MikeTinnion", 
+"MikeTinnion", "MikeTinnion", "TomasAdam", "TomasAdam", "TomasAdam", 
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", 
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", 
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", 
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", 
+"TomasAdam", "VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola", 
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola", 
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola", 
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", 
+"IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", "IvicaMagdic", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "TerenceCourtoreille", 
+"TerenceCourtoreille", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa", 
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa", 
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa", 
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa", 
+"SeiichiKomatsuzawa", "CraigFarrar", "CraigFarrar", "CraigFarrar", 
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", 
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", 
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", 
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", 
+"CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", "CraigFarrar", 
+"CraigFarrar", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal", 
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal", 
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal", 
+"MiroslavAntal", "MiroslavAntal", "MiroslavAntal", "MiroslavAntal", 
+"ReneKoops", "ReneKoops", "ReneKoops", "ReneKoops", "ReneKoops", 
+"ReneKoops", "ReneKoops", "TakashiKawahara", "TakashiKawahara", 
+"DonaldThom", "DonaldThom", "DavidEricDavies", "DavidEricDavies", 
+"RobertVanRensburg", "RobertVanRensburg", "MichalBenatinsky", 
+"JoeRiley", "JoeRiley", "JoeRiley", "JoeRiley", "PeterElberse", 
+"JohnTrench", "HelderRodrigues", "HelderRodrigues", "JoshStephens", 
+"JoshStephens", "JoshStephens", "JoshStephens", "JoshStephens", 
+"MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", "MartinDroz", 
+"AaronWest", "AaronWest", "AaronWest", "AaronWest", "LucjanBurda", 
+"LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", "LucjanBurda", 
+"LucaPapandrea", "LucaPapandrea", "LucaPapandrea", "JarkkoSuominen", 
+"JarkkoSuominen", "HowardCroston", "HowardCroston", "HowardCroston", 
+"VilleAnttiJaakkola", "VilleAnttiJaakkola", "VilleAnttiJaakkola", 
+"VilleAnttiJaakkola", "VernBarby", "VernBarby", "VernBarby", 
+"VernBarby", "VernBarby", "VernBarby", "WilliamKavenagh", "WilliamKavenagh", 
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", 
+"WilliamKavenagh", "WilliamKavenagh", "WilliamKavenagh", "TerenceCourtoreille", 
+"TerenceCourtoreille", "TerenceCourtoreille", "SeiichiKomatsuzawa", 
+"SeiichiKomatsuzawa", "SeiichiKomatsuzawa", "SeiichiKomatsuzawa", 
+"SeiichiKomatsuzawa", "GeorgeDaniel", "GeorgeDaniel", "MarkYelland", 
+"MarkYelland", "MiroslavAntal", "MiroslavAntal", "ReneKoops", 
+"ReneKoops", "CraigFarrar", "CraigFarrar", "GianlucaMazzocco", 
+"GianlucaMazzocco", "MikeTinnion", "MikeTinnion", "MikeTinnion", 
+"MikeTinnion", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", 
+"TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", "TomasAdam", 
+"TomasAdam", "TomasAdam", "TomasAdam", "JoseDias", "JoseDias", 
+"JoseDias", "JoseDias", "JoseDias", "JamieHarries", "JamieHarries", 
+"JamieHarries", "JamieHarries", "ChristopheIdre", "ChristopheIdre", 
+"BrianJeremiah", "PavelMachan", "TorbjornEriksson", "TorbjornEriksson", 
+"TorbjornEriksson", "TorbjornEriksson", "TorbjornEriksson", "TorbjornEriksson", 
+"StanislawGuzdek", "StanislawGuzdek", "JannePirkkalainen", "JannePirkkalainen", 
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen", 
+"JannePirkkalainen", "AidenHodgins", "RickyLehman", "JanKwisthout", 
+"JanKwisthout", "JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", 
+"RandyTaylor", "RandyTaylor", "RandyTaylor", "RandyTaylor", "RandyTaylor", 
+"AntonioRodrigues", "JohnBell", "JohnBell", "JanBartko", "JanBartko", 
+"ValerioSantiAmantini", "ValerioSantiAmantini", "ValerioSantiAmantini", 
+"ValerioSantiAmantini", "ValerioSantiAmantini", "AnthonyNaranja", 
+"GaryGlenYoung", "GaryGlenYoung", "GaryGlenYoung", "GaryGlenYoung", 
+"GaryGlenYoung", "GaryGlenYoung", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "JohnNishi", "JohnNishi", "MichaelHeckler", 
+"MichaelHeckler", "MichaelHeckler", "MichaelHeckler", "MichaelHeckler", 
+"BorisDzurek", "BorisDzurek", "BorisDzurek", "BorisDzurek", "SandroSoldarini", 
+"SandroSoldarini", "SandroSoldarini", "SandroSoldarini", "HansBock", 
+"OlliToivonen", "OlliToivonen", "OlliToivonen", "OlliToivonen", 
+"JohnBuckley", "JohnBuckley", "JohnBuckley", "JohnBuckley", "BoskoBarisic", 
+"BoskoBarisic", "LloydStruther", "LloydStruther", "LloydStruther", 
+"MarekWalczyk", "LanceEgan", "LanceEgan", "LanceEgan", "LanceEgan", 
+"AndrewDixon", "AndrewDixon", "AndrewDixon", "ThibaultGuilpain", 
+"ThibaultGuilpain", "ThibaultGuilpain", "StanislawMankou", "StanislawMankou", 
+"CraigColtman", "CraigColtman", "NunoDuarte", "MiroslavKaticic", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "SimonRobinson", "SimonRobinson", "SimonRobinson", 
+"SimonRobinson", "DamienWalsh", "DamienWalsh", "DamienWalsh", 
+"DamienWalsh", "DamienWalsh", "DamienWalsh", "DamienWalsh", "PiotrKonieczny", 
+"PiotrKonieczny", "PiotrKonieczny", "DesArmstrong", "DesArmstrong", 
+"DesArmstrong", "DesArmstrong", "DesArmstrong", "DesArmstrong", 
+"SimonGrootemaat", "TimRolston", "AlessandroSgrani", "AlessandroSgrani", 
+"ScottTucker", "ScottTucker", "ScottTucker", "StephenVarga", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"JulienDaguillanes", "KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", 
+"KiyoshiNakagawa", "KiyoshiNakagawa", "KiyoshiNakagawa", "ToddOishi", 
+"ToddOishi", "ToddOishi", "JouniNeste", "JouniNeste", "AntoninPesek", 
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "BretBishop", 
+"KimTribe", "KimTribe", "KimTribe", "KimTribe", "HowardCroston", 
+"HowardCroston", "JoeRiley", "LucjanBurda", "LucjanBurda", "JoshStephens", 
+"JoshStephens", "TakashiKawahara", "TakashiKawahara", "TakashiKawahara", 
+"MartinDroz", "LucaPapandrea", "AaronWest", "AaronWest", "DavidEricDavies", 
+"DavidEricDavies", "DavidEricDavies", "EricLelouvrier", "EricLelouvrier", 
+"RobertVanRensburg", "RobertVanRensburg", "RobertVanRensburg", 
+"DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", "DonaldThom", 
+"MichalBenatinsky", "JohnTrench", "JohnTrench", "AnthonyNaranja", 
+"AnthonyNaranja", "AnthonyNaranja", "StanislawGuzdek", "JanBartko", 
+"JanBartko", "AntonioRodrigues", "AidenHodgins", "AidenHodgins", 
+"RandyTaylor", "RandyTaylor", "RandyTaylor", "JohnHorsey", "JohnHorsey", 
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", "JohnHorsey", 
+"JohnHorsey", "JohnHorsey", "JohnHorsey", "MisakoIshimura", "ValerioSantiAmantini", 
+"GaryGlenYoung", "GaryGlenYoung", "GaryGlenYoung", "TorbjornEriksson", 
+"TorbjornEriksson", "RickyLehman", "RickyLehman", "PavelMachan", 
+"JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell", "JohnBell", 
+"JanKwisthout", "JanKwisthout", "BertrandJacquemin", "BertrandJacquemin", 
+"BertrandJacquemin", "BertrandJacquemin", "BertrandJacquemin", 
+"BertrandJacquemin", "BrianJeremiah", "BrianJeremiah", "JannePirkkalainen", 
+"JannePirkkalainen", "JannePirkkalainen", "JannePirkkalainen", 
+"IvicaMagdic", "ArturTrzaskos", "ArturTrzaskos", "ArturTrzaskos", 
+"VernBarby", "VernBarby", "VernBarby", "VernBarby", "MiroslavAntal", 
+"MiroslavAntal", "MarkYelland", "MarkYelland", "MarkYelland", 
+"TomasAdam", "TomasAdam", "JamieHarries", "JamieHarries", "JamieHarries", 
+"SeiichiKomatsuzawa", "ReneKoops", "ReneKoops", "ReneKoops", 
+"MikeTinnion", "MikeTinnion", "GianlucaMazzocco", "GianlucaMazzocco", 
+"StefanFlorea", "StefanFlorea", "WilliamKavenagh", "CraigFarrar", 
+"CraigFarrar", "CraigFarrar", "ChristopheIdre", "ChristopheIdre", 
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre", 
+"ChristopheIdre", "ChristopheIdre", "ChristopheIdre", "ChristopheIdre", 
+"JoseDias", "JoseDias", "JoseDias", "TerenceCourtoreille", "TerenceCourtoreille", 
+"PiotrKonieczny", "PiotrKonieczny", "PiotrKonieczny", "PeterBienek", 
+"PeterBienek", "PeterBienek", "AlessandroSgrani", "AlessandroSgrani", 
+"DesArmstrong", "StephenVarga", "TimRolston", "TimRolston", "JouniNeste", 
+"JouniNeste", "JouniNeste", "JouniNeste", "JouniNeste", "JouniNeste", 
+"DamienWalsh", "BretBishop", "SimonRobinson", "SimonRobinson", 
+"ToddOishi", "ScottTucker", "KiyoshiNakagawa", "KiyoshiNakagawa", 
+"SimonGrootemaat", "AntoninPesek", "AntoninPesek", "AntoninPesek", 
+"AntoninPesek", "AntoninPesek", "AntoninPesek", "AntoninPesek", 
+"NunoDuarte", "NunoDuarte", "NunoDuarte", "JulienDaguillanes", 
+"JulienDaguillanes", "JulienDaguillanes", "JulienDaguillanes", 
+"LanceEgan", "LanceEgan", "PauloMorais", "AndrewDixon", "AndrewDixon", 
+"LloydStruther", "LloydStruther", "SandroSoldarini", "SandroSoldarini", 
+"SandroSoldarini", "SandroSoldarini", "MarekWalczyk", "MarekWalczyk", 
+"MarekWalczyk", "MarekWalczyk", "AndreSteenkamp", "BoskoBarisic", 
+"TomasStarychfojtu", "TomasStarychfojtu", "TomasStarychfojtu", 
+"TomasStarychfojtu", "JohnNishi", "JohnNishi", "JohnNishi", "JohnNishi", 
+"BorisDzurek", "MichaelHeckler", "MichaelHeckler", "ThibaultGuilpain", 
+"ThibaultGuilpain", "ThibaultGuilpain"), country = c("SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "WAL", "WAL", "WAL", "WAL", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", 
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "RSA", "RSA", "RSA", 
+"RSA", "RSA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "AUS", "AUS", 
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "NED", 
+"NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "AUS", 
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"ROM", "ROM", "ROM", "ROM", "WAL", "WAL", "WAL", "WAL", "WAL", 
+"WAL", "WAL", "POR", "POR", "POR", "POR", "POR", "POR", "POR", 
+"POR", "POR", "POR", "POR", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", 
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", 
+"RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", 
+"RSA", "RSA", "RSA", "RSA", "POR", "POR", "POR", "POR", "POR", 
+"POR", "POR", "POR", "POR", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "NED", "NED", "NED", "NED", "NED", 
+"NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "WAL", "WAL", "WAL", "WAL", "WAL", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "NDI", 
+"CRO", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "NED", "NED", "NED", 
+"NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", 
+"NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", 
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", 
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "RSA", "RSA", "JPN", 
+"JPN", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "POR", "POR", "POR", 
+"POR", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "SWE", "SWE", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", 
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", 
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", 
+"FIN", "FIN", "FIN", "FIN", "JPN", "JPN", "JPN", "JPN", "POR", 
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", 
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "BUL", 
+"BUL", "BUL", "BUL", "BUL", "BUL", "BUL", "BUL", "BUL", "BUL", 
+"BUL", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "RSA", "RSA", "RSA", 
+"RSA", "RSA", "RSA", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "FIN", 
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", 
+"FIN", "FIN", "FIN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", 
+"JPN", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", 
+"FIN", "FIN", "MAL", "MAL", "MAL", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "JPN", "JPN", "JPN", 
+"JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", 
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "CRO", "CRO", 
+"CRO", "CRO", "CRO", "CRO", "CRO", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CAN", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "JPN", "JPN", "JPN", "JPN", 
+"JPN", "JPN", "WAL", "WAL", "WAL", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "ENG", "ENG", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "AUS", "AUS", "AUS", "AUS", "AUS", "POR", "POR", "POR", 
+"POR", "AUS", "AUS", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "CAN", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "NED", "NED", "NED", "NED", "NED", "RSA", 
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", 
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", 
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", 
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", 
+"CRO", "ROM", "ROM", "ROM", "ROM", "ROM", "ROM", "ROM", "ROM", 
+"ROM", "ROM", "ROM", "ROM", "ROM", "ROM", "ROM", "NED", "NED", 
+"NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", 
+"NED", "NED", "NED", "NED", "NED", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
+"AUS", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", 
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", 
+"FIN", "FIN", "POR", "POR", "POR", "POR", "POR", "POR", "POR", 
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", 
+"POR", "POR", "POR", "POR", "POR", "POR", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "RSA", 
+"RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", 
+"RSA", "RSA", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", 
+"CRO", "CRO", "CRO", "CRO", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "JPN", "JPN", "BUL", "BUL", 
+"BUL", "BUL", "BUL", "BUL", "BUL", "BUL", "BUL", "BUL", "BUL", 
+"BUL", "BUL", "BUL", "WAL", "WAL", "WAL", "WAL", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "JPN", "JPN", 
+"JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", 
+"JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", 
+"JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "AUS", "AUS", "AUS", 
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "WAL", "WAL", "WAL", "WAL", "WAL", "WAL", "WAL", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", 
+"RSA", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", 
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "POR", 
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", 
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "CRO", "CRO", "CRO", 
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "JPN", "JPN", 
+"JPN", "JPN", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "WAL", "WAL", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "POL", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", 
+"NED", "NED", "WAL", "IRE", "ITA", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "FIN", "FIN", 
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", 
+"NDI", "NDI", "NDI", "NDI", "NDI", "NDI", "NDI", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "RSA", "RSA", "JPN", "JPN", "JPN", "JPN", 
+"JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", 
+"JPN", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "IRE", "IRE", "IRE", "IRE", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "WAL", 
+"WAL", "WAL", "WAL", "WAL", "RSA", "RSA", "RSA", "RSA", "RSA", 
+"RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "POR", 
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", 
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", 
+"POR", "POR", "POR", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "POL", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "FIN", "FIN", "FIN", "FIN", 
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", 
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", 
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "NED", "NED", "NED", 
+"NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "AUS", 
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "MAL", "MAL", 
+"MAL", "MAL", "MAL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "NED", 
+"NED", "NED", "NED", "NED", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "ITA", "ITA", "ITA", 
+"ITA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "POR", "POR", "POR", "POR", "AUS", "AUS", 
+"ITA", "ITA", "ITA", "ITA", "SWE", "CAN", "CAN", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FIN", "FIN", 
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "RSA", "CAN", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", 
+"JPN", "JPN", "JPN", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "POR", "POR", "POR", 
+"POR", "POR", "POR", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "POL", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "AUS", "AUS", "AUS", "AUS", "AUS", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "WAL", "WAL", "WAL", 
+"WAL", "WAL", "WAL", "WAL", "CAN", "CAN", "CAN", "POR", "POR", 
+"POR", "POR", "CRO", "CRO", "CRO", "CRO", "CRO", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "FIN", 
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", 
+"FIN", "FIN", "FIN", "FIN", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "MAL", "AUS", 
+"AUS", "AUS", "AUS", "AUS", "AUS", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", 
+"NED", "NED", "NED", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "FIN", "FIN", "FIN", "FIN", "FIN", 
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "JPN", "JPN", "JPN", 
+"RSA", "RSA", "RSA", "RSA", "RSA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "CRO", "CRO", "IRE", 
+"IRE", "IRE", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", 
+"RSA", "RSA", "RSA", "RSA", "AUS", "AUS", "AUS", "AUS", "AUS", 
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
+"AUS", "AUS", "AUS", "AUS", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "POR", 
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", 
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "POL", "POL", 
+"POL", "POL", "POL", "POL", "RSA", "RSA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "POR", "POR", "POR", "POR", "POR", 
+"POR", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "AUS", "AUS", "AUS", "AUS", 
+"AUS", "AUS", "AUS", "AUS", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "ROM", "ROM", "ROM", 
+"ROM", "ROM", "ROM", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "SWE", "SWE", "SWE", "SWE", "SWE", "SWE", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "JPN", "JPN", "JPN", "JPN", "RSA", 
+"RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", 
+"RSA", "RSA", "NED", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "USA", "USA", "USA", "USA", "USA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", 
+"JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", 
+"JPN", "JPN", "JPN", "JPN", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "POR", "POR", 
+"POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", "POR", 
+"POR", "POR", "POR", "POR", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", 
+"CRO", "CRO", "CRO", "CRO", "CRO", "WAL", "WAL", "WAL", "WAL", 
+"WAL", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "RSA", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "NED", "NED", "NED", "NED", "NED", "NED", 
+"NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", 
+"NED", "NED", "NED", "NED", "NED", "NED", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "AUS", "AUS", "AUS", "AUS", "AUS", 
+"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
+"AUS", "AUS", "AUS", "AUS", "POR", "POR", "POR", "POR", "POR", 
+"POR", "POR", "POR", "POR", "POR", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"NDI", "NDI", "NDI", "NDI", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", 
+"USA", "USA", "USA", "USA", "USA", "USA", "USA", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", "POL", 
+"POL", "JPN", "JPN", "JPN", "BUL", "BUL", "BUL", "BUL", "BUL", 
+"BUL", "BUL", "BUL", "BUL", "BUL", "NED", "NED", "NED", "NED", 
+"NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", "NED", 
+"NED", "WAL", "WAL", "WAL", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", 
+"ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "ITA", "FIN", 
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", 
+"FIN", "FIN", "WAL", "WAL", "WAL", "WAL", "WAL", "WAL", "WAL", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", 
+"CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", "CRO", 
+"CRO", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", "CAN", 
+"CAN", "CAN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", 
+"JPN", "JPN", "JPN", "JPN", "JPN", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", "SVK", 
+"SVK", "SVK", "SVK", "SVK", "NED", "NED", "NED", "NED", "NED", 
+"NED", "NED", "JPN", "JPN", "CAN", "CAN", "WAL", "WAL", "RSA", 
+"RSA", "SVK", "AUS", "AUS", "AUS", "AUS", "NED", "IRE", "POR", 
+"POR", "USA", "USA", "USA", "USA", "USA", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "NZL", "NZL", "NZL", "NZL", "POL", "POL", "POL", 
+"POL", "POL", "POL", "ITA", "ITA", "ITA", "FIN", "FIN", "ENG", 
+"ENG", "ENG", "FIN", "FIN", "FIN", "FIN", "AUS", "AUS", "AUS", 
+"AUS", "AUS", "AUS", "IRE", "IRE", "IRE", "IRE", "IRE", "IRE", 
+"IRE", "IRE", "IRE", "CAN", "CAN", "CAN", "JPN", "JPN", "JPN", 
+"JPN", "JPN", "USA", "USA", "RSA", "RSA", "SVK", "SVK", "NED", 
+"NED", "NZL", "NZL", "ITA", "ITA", "ENG", "ENG", "ENG", "ENG", 
+"POL", "POL", "POL", "CZE", "CZE", "CZE", "CZE", "CZE", "CZE", 
+"CZE", "CZE", "POR", "POR", "POR", "POR", "POR", "WAL", "WAL", 
+"WAL", "WAL", "FRA", "FRA", "WAL", "CZE", "SWE", "SWE", "SWE", 
+"SWE", "SWE", "SWE", "POL", "POL", "FIN", "FIN", "FIN", "FIN", 
+"FIN", "FIN", "IRE", "AUS", "NED", "NED", "ENG", "ENG", "ENG", 
+"ENG", "CAN", "CAN", "CAN", "CAN", "CAN", "POR", "NZL", "NZL", 
+"SVK", "SVK", "ITA", "ITA", "ITA", "ITA", "ITA", "USA", "RSA", 
+"RSA", "RSA", "RSA", "RSA", "RSA", "CZE", "CZE", "CZE", "CAN", 
+"CAN", "WAL", "WAL", "WAL", "WAL", "WAL", "SVK", "SVK", "SVK", 
+"SVK", "ITA", "ITA", "ITA", "ITA", "NED", "FIN", "FIN", "FIN", 
+"FIN", "IRE", "IRE", "IRE", "IRE", "CRO", "CRO", "NZL", "NZL", 
+"NZL", "POL", "USA", "USA", "USA", "USA", "ENG", "ENG", "ENG", 
+"FRA", "FRA", "FRA", "BUL", "BUL", "AUS", "AUS", "POR", "CRO", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "IRE", 
+"IRE", "IRE", "IRE", "IRE", "IRE", "IRE", "POL", "POL", "POL", 
+"NZL", "NZL", "NZL", "NZL", "NZL", "NZL", "NED", "RSA", "ITA", 
+"ITA", "AUS", "AUS", "AUS", "MAL", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "JPN", "JPN", "JPN", "JPN", "JPN", "JPN", 
+"CAN", "CAN", "CAN", "FIN", "FIN", "CZE", "CZE", "CZE", "CZE", 
+"USA", "WAL", "WAL", "WAL", "WAL", "ENG", "ENG", "AUS", "POL", 
+"POL", "USA", "USA", "JPN", "JPN", "JPN", "CZE", "ITA", "NZL", 
+"NZL", "WAL", "WAL", "WAL", "FRA", "FRA", "RSA", "RSA", "RSA", 
+"CAN", "CAN", "CAN", "CAN", "CAN", "SVK", "IRE", "IRE", "USA", 
+"USA", "USA", "POL", "SVK", "SVK", "POR", "IRE", "IRE", "CAN", 
+"CAN", "CAN", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", "ENG", 
+"ENG", "ENG", "ENG", "JPN", "ITA", "RSA", "RSA", "RSA", "SWE", 
+"SWE", "AUS", "AUS", "CZE", "NZL", "NZL", "NZL", "NZL", "NZL", 
+"NZL", "NED", "NED", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"WAL", "WAL", "FIN", "FIN", "FIN", "FIN", "CRO", "POL", "POL", 
+"POL", "AUS", "AUS", "AUS", "AUS", "SVK", "SVK", "RSA", "RSA", 
+"RSA", "CZE", "CZE", "WAL", "WAL", "WAL", "JPN", "NED", "NED", 
+"NED", "ENG", "ENG", "ITA", "ITA", "ROM", "ROM", "IRE", "NZL", 
+"NZL", "NZL", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", "FRA", 
+"FRA", "FRA", "FRA", "POR", "POR", "POR", "CAN", "CAN", "POL", 
+"POL", "POL", "SVK", "SVK", "SVK", "ITA", "ITA", "NZL", "MAL", 
+"RSA", "RSA", "FIN", "FIN", "FIN", "FIN", "FIN", "FIN", "IRE", 
+"USA", "ENG", "ENG", "CAN", "AUS", "JPN", "JPN", "NED", "CZE", 
+"CZE", "CZE", "CZE", "CZE", "CZE", "CZE", "POR", "POR", "POR", 
+"FRA", "FRA", "FRA", "FRA", "USA", "USA", "POR", "ENG", "ENG", 
+"NZL", "NZL", "ITA", "ITA", "ITA", "ITA", "POL", "POL", "POL", 
+"POL", "RSA", "CRO", "CZE", "CZE", "CZE", "CZE", "CAN", "CAN", 
+"CAN", "CAN", "SVK", "WAL", "WAL", "FRA", "FRA", "FRA")), .Names = c("length", 
+"water", "session", "sector", "beatboat", "comid", "iname", "country"
+), row.names = c(NA, 4267), class = "data.frame")
diff --git a/data/wffc.indiv.R b/data/wffc.indiv.R
new file mode 100644
index 0000000..840345b
--- /dev/null
+++ b/data/wffc.indiv.R
@@ -0,0 +1,94 @@
+"wffc.indiv" <-
+structure(list(totalPlacings = c(20, 20, 22, 22, 22, 24, 24, 
+24, 25, 27, 27, 27, 30, 30, 30, 30, 30, 31, 32, 32, 34, 34, 35, 
+35, 36, 38, 38, 38, 39, 41, 42, 42, 42, 42, 43, 43, 43, 44, 44, 
+45, 47, 49, 49, 50, 53, 53, 53, 53, 53, 54, 54, 54, 55, 55, 56, 
+56, 57, 58, 58, 59, 59, 59, 60, 60, 60, 60, 61, 62, 63, 65, 65, 
+65, 66, 66, 66, 66, 66, 67, 68, 68, 69, 69, 69, 70, 70, 72, 73, 
+74, 74, 75, 76, 79, 79, 83, 88, 88, 88, 93, 94), points = c(51360, 
+48540, 58980, 39480, 35240, 52800, 52140, 28540, 53180, 47180, 
+47060, 35500, 40460, 36380, 34400, 32460, 29660, 41000, 40660, 
+29440, 48020, 30720, 45020, 39840, 44680, 38680, 37900, 28560, 
+39040, 29040, 43840, 38260, 28500, 19200, 36320, 35720, 22260, 
+43040, 24900, 33520, 29800, 34020, 20220, 33200, 46480, 28300, 
+27340, 21140, 15800, 36240, 34440, 24140, 33460, 29620, 36200, 
+27700, 24180, 26580, 23880, 26880, 24780, 11660, 29240, 21160, 
+17680, 10920, 22640, 21280, 18340, 25680, 16320, 6240, 16080, 
+11980, 9980, 9660, 8920, 6340, 16440, 6900, 18340, 17080, 11880, 
+23440, 9080, 13880, 6600, 20420, 13640, 14800, 6600, 16620, 2880, 
+9740, 7080, 6540, 3420, 5120, 540), noofcaptures = c(78, 73, 98, 
+59, 56, 87, 90, 40, 87, 80, 71, 56, 65, 59, 55, 54, 41, 66, 64, 
+44, 78, 49, 60, 69, 73, 61, 66, 44, 65, 43, 78, 64, 40, 32, 65, 
+58, 36, 78, 40, 52, 47, 55, 32, 53, 80, 48, 43, 33, 23, 64, 59, 
+39, 60, 47, 57, 53, 38, 45, 38, 39, 42, 17, 53, 33, 30, 17, 40, 
+35, 30, 38, 31, 6, 26, 18, 12, 14, 14, 8, 28, 8, 26, 31, 21, 
+37, 14, 22, 10, 35, 21, 28, 11, 27, 3, 16, 12, 11, 6, 9, 1), 
+    longest = c(540, 585, 515, 689, 580, 535, 552, 610, 475, 
+    533, 518, 560, 535, 580, 498, 624, 627, 525, 585, 560, 550, 
+    515, 568, 615, 652, 520, 563, 510, 580, 572, 474, 500, 615, 
+    484, 503, 535, 498, 592, 541, 512, 590, 510, 530, 499, 501, 
+    495, 574, 572, 604, 466, 450, 515, 513, 480, 570, 419, 530, 
+    688, 580, 492, 514, 508, 522, 594, 477, 532, 528, 505, 493, 
+    620, 340, 560, 571, 475, 572, 470, 486, 574, 568, 610, 548, 
+    432, 342, 486, 480, 560, 432, 501, 590, 362, 511, 455, 450, 
+    490, 380, 395, 332, 293, 218), individual = c(0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0), 
+    country = c("CZE", "FRA", "CZE", "ENG", "POL", "NZL", "ENG", 
+    "FIN", "CZE", "POL", "CZE", "SVK", "ITA", "ITA", "NZL", "CAN", 
+    "NZL", "JPN", "NZL", "USA", "NZL", "CZE", "FRA", "USA", "FIN", 
+    "CAN", "POL", "FRA", "ITA", "AUS", "CAN", "SVK", "SVK", "USA", 
+    "IRE", "IRE", "ITA", "USA", "POL", "SVK", "POR", "SVK", "ENG", 
+    "FRA", "FRA", "ENG", "ENG", "AUS", "RSA", "CRO", "USA", "FIN", 
+    "POR", "POR", "AUS", "NED", "ITA", "FIN", "AUS", "JPN", "POL", 
+    "SWE", "IRE", "FIN", "IRE", "JPN", "CAN", "NED", "RSA", "BUL", 
+    "IRE", "FRA", "WAL", "WAL", "WAL", "AUS", "RSA", "WAL", "CRO", 
+    "CAN", "RSA", "NED", "CRO", "CRO", "POR", "POR", "NED", "NED", 
+    "WAL", "RSA", "JPN", "ROM", "IRE", "CRO", "NDI", "MAL", "CAN", 
+    "JPN", "WAL"), iname = c("MartinDroz", "JulienDaguillanes", 
+    "TomasStarychfojtu", "JohnHorsey", "LucjanBurda", "DesArmstrong", 
+    "SimonRobinson", "JannePirkkalainen", "TomasAdam", "PiotrKonieczny", 
+    "AntoninPesek", "JanBartko", "SandroSoldarini", "LucaPapandrea", 
+    "AaronWest", "DonaldThom", "JohnBell", "KiyoshiNakagawa", 
+    "LloydStruther", "JoshStephens", "CraigFarrar", "PavelMachan", 
+    "ChristopheIdre", "LanceEgan", "OlliToivonen", "JohnNishi", 
+    "MarekWalczyk", "BertrandJacquemin", "GianlucaMazzocco", 
+    "VernBarby", "TerenceCourtoreille", "MiroslavAntal", "MichalBenatinsky", 
+    "AnthonyNaranja", "WilliamKavenagh", "DamienWalsh", "ValerioSantiAmantini", 
+    "GeorgeDaniel", "StanislawGuzdek", "PeterBienek", "JoseDias", 
+    "BorisDzurek", "HowardCroston", "EricLelouvrier", "YannCaleri", 
+    "AndrewDixon", "MikeTinnion", "JoeRiley", "GaryGlenYoung", 
+    "IvicaMagdic", "BretBishop", "JarkkoSuominen", "PauloMorais", 
+    "NunoDuarte", "CraigColtman", "PeterElberse", "AlessandroSgrani", 
+    "VilleAnttiJaakkola", "ScottTucker", "SeiichiKomatsuzawa", 
+    "ArturTrzaskos", "TorbjornEriksson", "JohnBuckley", "JouniNeste", 
+    "JohnTrench", "TakashiKawahara", "ToddOishi", "ReneKoops", 
+    "TimRolston", "StanislawMankou", "JohnFoxton", "ThibaultGuilpain", 
+    "JamieHarries", "MichaelHeckler", "BrianJeremiah", "RickyLehman", 
+    "RobertVanRensburg", "DavidEricDavies", "BoskoBarisic", "RandyTaylor", 
+    "MarkYelland", "SimonGrootemaat", "PeterDindic", "MiroslavKaticic", 
+    "AntonioRodrigues", "HelderRodrigues", "JanKwisthout", "HansBock", 
+    "KimTribe", "AndreSteenkamp", "MisakoIshimura", "StefanFlorea", 
+    "AidenHodgins", "MarinkoPuskaric", "SabahudinPehadzicBIHI", 
+    "StephenVarga", "JohnBeaven", "YoshikoIzumiya", "DionDavies"
+    ), comid = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 
+    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 
+    30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 
+    45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 
+    60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 
+    75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 
+    90, 91, 92, 93, 94, 95, 96, 97, 98, 99)), .Names = c("totalPlacings", 
+"points", "noofcaptures", "longest", "individual", "country", "iname", 
+"comid"), row.names = c("1", "2", "3", "4", "5", "6", "7", "8", 
+"9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", 
+"20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", 
+"31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", 
+"42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", 
+"53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", 
+"64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", 
+"75", "76", "77", "78", "79", "80", "81", "82", "83", "84", "85", 
+"86", "87", "88", "89", "90", "91", "92", "93", "94", "95", "96", 
+"97", "98", "99"), class = "data.frame")
diff --git a/data/wffc.nc.R b/data/wffc.nc.R
new file mode 100644
index 0000000..881df11
--- /dev/null
+++ b/data/wffc.nc.R
@@ -0,0 +1,351 @@
+"wffc.nc" <-
+structure(list(sector = c(4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3), session = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 
+1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
+2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
+6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6), beatboat = c(1, 
+2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
+1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 
+19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 
+18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
+17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 
+16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 
+15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
+14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
+13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
+12, 13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
+11, 12, 13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
+10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 
+8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 
+6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 
+4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1, 
+2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
+1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 
+19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 
+18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
+17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 
+16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 
+15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
+14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
+13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
+12, 13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
+11, 12, 13, 14, 15, 16, 17, 18, 19, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
+10, 11, 12, 13, 14, 15, 16, 17, 18, 19), numbers = c(20, 20, 
+4, 32, 13, 5, 23, 28, 9, 35, 18, 29, 4, 19, 16, 23, 23, 11, 27, 
+18, 9, 24, 22, 4, 7, 11, 16, 16, 18, 19, 31, 6, 23, 11, 7, 13, 
+7, 10, 13, 9, 9, 13, 28, 10, 19, 5, 19, 9, 3, 28, 19, 26, 12, 
+7, 7, 11, 4, 1, 1, 15, 20, 17, 7, 21, 15, 2, 12, 6, 3, 22, 24, 
+2, 13, 16, 5, 4, 2, 7, 9, 7, 4, 8, 10, 2, 9, 2, 6, 13, 12, 0, 
+1, 6, 16, 5, 1, 37, 15, 16, 34, 29, 28, 24, 16, 19, 14, 22, 32, 
+4, 12, 5, 13, 22, 22, 7, 22, 29, 12, 10, 10, 28, 2, 14, 4, 37, 
+17, 28, 11, 9, 7, 20, 11, 10, 14, 27, 26, 21, 28, 7, 31, 7, 16, 
+19, 18, 5, 30, 7, 15, 7, 5, 11, 9, 4, 9, 6, 10, 18, 4, 17, 2, 
+10, 15, 11, 4, 2, 4, 1, 2, 18, 8, 1, 0, 10, 1, 1, 21, 11, 7, 
+13, 10, 2, 13, 7, 3, 12, 6, 24, 11, 10, 5, 7, 7, 3, 4, 5, 10, 
+14, 19, 13, 7, 16, 6, 20, 22, 4, 12, 1, 28, 5, 11, 1, 6, 18, 
+25, 18, 25, 11, 24, 9, 20, 21, 15, 21, 28, 20, 13, 5, 7, 20, 
+6, 7, 0, 11, 19, 26, 3, 5, 28, 8, 12, 21, 15, 22, 24, 18, 10, 
+22, 4, 2, 3, 10, 10, 18, 13, 18, 24, 20, 30, 21, 3, 10, 14, 3, 
+16, 30, 21, 12, 6, 2, 9, 25, 6, 13, 8, 29, 6, 7, 12, 24, 9, 10, 
+28, 12, 29, 15, 7, 2, 0, 2, 0, 2, 2, 1, 4, 1, 1, 2, 5, 5, 4, 
+6, 3, 2, 0, 3, 4, 6, 9, 3, 5, 2, 2, 0, 2, 2, 2, 2, 4, 3, 8, 5, 
+4, 2, 0, 1, 1, 6, 2, 6, 1, 1, 2, 4, 0, 5, 1, 2, 0, 2, 5, 1, 6, 
+0, 3, 2, 5, 4, 4, 0, 1, 4, 4, 2, 3, 1, 4, 3, 3, 2, 2, 0, 0, 1, 
+1, 17, 7, 3, 0, 6, 1, 1, 2, 3, 1, 7, 6, 3, 2, 4, 1, 4, 2, 1, 
+2, 0, 2, 0, 0, 3, 1, 1, 2, 3, 2, 3, 5, 1, 2, 0, 0, 3, 1, 2, 1, 
+2, 3, 10, 1, 1, 3, 2, 2, 1, 6, 2, 0, 6, 2, 4, 1, 3, 4, 2, 3, 
+0, 0, 2, 3, 1, 3, 2, 2, 2, 1, 3, 10, 3, 2, 3, 0, 3, 2, 1, 1, 
+2, 0, 6, 1, 1, 2, 1, 1, 2, 1, 7, 3, 4, 0, 2, 0, 1, 2, 0, 2, 4, 
+4, 1, 0, 0, 1, 4, 4, 0, 1, 2, 3), comid = c(42, 26, 74, 3, 79, 
+90, 24, 55, 88, 19, 63, 25, 98, 53, 13, 27, 46, 70, 45, 61, 30, 
+29, 35, 92, 73, 41, 31, 50, 47, 38, 9, 81, 32, 23, 68, 58, 60, 
+21, 69, 54, 51, 82, 10, 57, 40, 89, 2, 64, 96, 7, 36, 6, 18, 
+59, 84, 11, 67, 95, 94, 5, 33, 20, 65, 56, 52, 77, 16, 66, 78, 
+14, 1, 43, 15, 44, 48, 86, 91, 17, 28, 4, 85, 8, 22, 62, 39, 
+76, 83, 12, 34, 75, 97, 71, 37, 87, 49, 50, 92, 68, 21, 31, 29, 
+23, 30, 58, 60, 32, 38, 35, 61, 73, 81, 41, 9, 47, 53, 3, 90, 
+42, 79, 63, 98, 70, 74, 45, 27, 25, 88, 55, 46, 13, 26, 24, 19, 
+51, 18, 59, 10, 89, 11, 69, 84, 54, 7, 96, 6, 67, 2, 64, 82, 
+36, 40, 57, 71, 17, 83, 22, 91, 12, 75, 4, 39, 34, 85, 76, 37, 
+62, 97, 28, 8, 49, 87, 56, 99, 65, 14, 52, 95, 20, 15, 77, 16, 
+94, 66, 33, 86, 1, 5, 43, 48, 44, 75, 97, 85, 83, 37, 8, 22, 
+39, 76, 71, 62, 17, 12, 91, 49, 87, 4, 34, 28, 96, 59, 11, 7, 
+10, 67, 82, 6, 64, 18, 40, 54, 51, 2, 57, 84, 89, 69, 36, 33, 
+20, 78, 52, 65, 15, 66, 77, 44, 94, 14, 56, 43, 5, 1, 48, 86, 
+16, 95, 79, 63, 19, 90, 55, 46, 53, 26, 42, 24, 27, 98, 70, 88, 
+74, 45, 3, 13, 25, 61, 81, 29, 38, 41, 23, 30, 35, 92, 73, 47, 
+9, 58, 50, 31, 60, 21, 32, 68, 66, 94, 16, 95, 78, 77, 33, 48, 
+56, 65, 86, 20, 1, 15, 5, 14, 52, 44, 43, 58, 30, 35, 31, 60, 
+38, 81, 92, 32, 68, 21, 29, 47, 61, 9, 41, 73, 23, 50, 75, 22, 
+62, 39, 8, 93, 76, 87, 4, 91, 80, 85, 17, 28, 12, 37, 34, 49, 
+83, 3, 26, 74, 42, 13, 98, 88, 25, 63, 79, 19, 27, 24, 46, 72, 
+70, 55, 90, 53, 54, 84, 7, 36, 10, 40, 6, 82, 69, 57, 59, 96, 
+2, 18, 67, 64, 11, 51, 89, 43, 48, 5, 86, 20, 52, 94, 66, 1, 
+14, 15, 78, 44, 77, 16, 33, 65, 95, 56, 34, 39, 12, 85, 93, 80, 
+4, 91, 37, 49, 62, 76, 22, 17, 87, 83, 28, 75, 8, 50, 61, 30, 
+32, 81, 38, 58, 9, 73, 60, 68, 47, 29, 92, 35, 21, 23, 41, 31, 
+10, 89, 40, 57, 6, 96, 69, 84, 64, 36, 51, 7, 67, 59, 18, 82, 
+11, 54, 2, 63, 24, 70, 53, 46, 25, 19, 13, 27, 90, 98, 55, 79, 
+3, 26, 88, 42, 74, 72), iname = c("BorisDzurek", "JohnNishi", 
+"MichaelHeckler", "TomasStarychfojtu", "BoskoBarisic", "AndreSteenkamp", 
+"LanceEgan", "CraigColtman", "HansBock", "LloydStruther", "JohnBuckley", 
+"OlliToivonen", "YoshikoIzumiya", "PauloMorais", "SandroSoldarini", 
+"MarekWalczyk", "AndrewDixon", "StanislawMankou", "YannCaleri", 
+"ArturTrzaskos", "VernBarby", "GianlucaMazzocco", "WilliamKavenagh", 
+"StefanFlorea", "JamieHarries", "JoseDias", "TerenceCourtoreille", 
+"IvicaMagdic", "MikeTinnion", "GeorgeDaniel", "TomasAdam", "MarkYelland", 
+"MiroslavAntal", "ChristopheIdre", "ReneKoops", "VilleAnttiJaakkola", 
+"SeiichiKomatsuzawa", "CraigFarrar", "TimRolston", "NunoDuarte", 
+"BretBishop", "SimonGrootemaat", "PiotrKonieczny", "AlessandroSgrani", 
+"PeterBienek", "KimTribe", "JulienDaguillanes", "JouniNeste", 
+"StephenVarga", "SimonRobinson", "DamienWalsh", "DesArmstrong", 
+"KiyoshiNakagawa", "ScottTucker", "MiroslavKaticic", "AntoninPesek", 
+"ToddOishi", "SabahudinPehadzicBIHI", "MarinkoPuskaric", "LucjanBurda", 
+"MichalBenatinsky", "JoshStephens", "JohnTrench", "PeterElberse", 
+"JarkkoSuominen", "RobertVanRensburg", "DonaldThom", "TakashiKawahara", 
+"DavidEricDavies", "LucaPapandrea", "MartinDroz", "HowardCroston", 
+"AaronWest", "EricLelouvrier", "JoeRiley", "HelderRodrigues", 
+"MisakoIshimura", "JohnBell", "BertrandJacquemin", "JohnHorsey", 
+"AntonioRodrigues", "JannePirkkalainen", "PavelMachan", "TorbjornEriksson", 
+"StanislawGuzdek", "RickyLehman", "PeterDindic", "JanBartko", 
+"AnthonyNaranja", "BrianJeremiah", "JohnBeaven", "JohnFoxton", 
+"ValerioSantiAmantini", "JanKwisthout", "GaryGlenYoung", "IvicaMagdic", 
+"StefanFlorea", "ReneKoops", "CraigFarrar", "TerenceCourtoreille", 
+"GianlucaMazzocco", "ChristopheIdre", "VernBarby", "VilleAnttiJaakkola", 
+"SeiichiKomatsuzawa", "MiroslavAntal", "GeorgeDaniel", "WilliamKavenagh", 
+"ArturTrzaskos", "JamieHarries", "MarkYelland", "JoseDias", "TomasAdam", 
+"MikeTinnion", "PauloMorais", "TomasStarychfojtu", "AndreSteenkamp", 
+"BorisDzurek", "BoskoBarisic", "JohnBuckley", "YoshikoIzumiya", 
+"StanislawMankou", "MichaelHeckler", "YannCaleri", "MarekWalczyk", 
+"OlliToivonen", "HansBock", "CraigColtman", "AndrewDixon", "SandroSoldarini", 
+"JohnNishi", "LanceEgan", "LloydStruther", "BretBishop", "KiyoshiNakagawa", 
+"ScottTucker", "PiotrKonieczny", "KimTribe", "AntoninPesek", 
+"TimRolston", "MiroslavKaticic", "NunoDuarte", "SimonRobinson", 
+"StephenVarga", "DesArmstrong", "ToddOishi", "JulienDaguillanes", 
+"JouniNeste", "SimonGrootemaat", "DamienWalsh", "PeterBienek", 
+"AlessandroSgrani", "JohnFoxton", "JohnBell", "PeterDindic", 
+"PavelMachan", "MisakoIshimura", "JanBartko", "BrianJeremiah", 
+"JohnHorsey", "StanislawGuzdek", "AnthonyNaranja", "AntonioRodrigues", 
+"RickyLehman", "ValerioSantiAmantini", "TorbjornEriksson", "JohnBeaven", 
+"BertrandJacquemin", "JannePirkkalainen", "GaryGlenYoung", "JanKwisthout", 
+"PeterElberse", "DionDavies", "JohnTrench", "LucaPapandrea", 
+"JarkkoSuominen", "SabahudinPehadzicBIHI", "JoshStephens", "AaronWest", 
+"RobertVanRensburg", "DonaldThom", "MarinkoPuskaric", "TakashiKawahara", 
+"MichalBenatinsky", "HelderRodrigues", "MartinDroz", "LucjanBurda", 
+"HowardCroston", "JoeRiley", "EricLelouvrier", "BrianJeremiah", 
+"JohnBeaven", "AntonioRodrigues", "PeterDindic", "ValerioSantiAmantini", 
+"JannePirkkalainen", "PavelMachan", "StanislawGuzdek", "RickyLehman", 
+"JohnFoxton", "TorbjornEriksson", "JohnBell", "JanBartko", "MisakoIshimura", 
+"GaryGlenYoung", "JanKwisthout", "JohnHorsey", "AnthonyNaranja", 
+"BertrandJacquemin", "StephenVarga", "ScottTucker", "AntoninPesek", 
+"SimonRobinson", "PiotrKonieczny", "ToddOishi", "SimonGrootemaat", 
+"DesArmstrong", "JouniNeste", "KiyoshiNakagawa", "PeterBienek", 
+"NunoDuarte", "BretBishop", "JulienDaguillanes", "AlessandroSgrani", 
+"MiroslavKaticic", "KimTribe", "TimRolston", "DamienWalsh", "MichalBenatinsky", 
+"JoshStephens", "DavidEricDavies", "JarkkoSuominen", "JohnTrench", 
+"AaronWest", "TakashiKawahara", "RobertVanRensburg", "EricLelouvrier", 
+"MarinkoPuskaric", "LucaPapandrea", "PeterElberse", "HowardCroston", 
+"LucjanBurda", "MartinDroz", "JoeRiley", "HelderRodrigues", "DonaldThom", 
+"SabahudinPehadzicBIHI", "BoskoBarisic", "JohnBuckley", "LloydStruther", 
+"AndreSteenkamp", "CraigColtman", "AndrewDixon", "PauloMorais", 
+"JohnNishi", "BorisDzurek", "LanceEgan", "MarekWalczyk", "YoshikoIzumiya", 
+"StanislawMankou", "HansBock", "MichaelHeckler", "YannCaleri", 
+"TomasStarychfojtu", "SandroSoldarini", "OlliToivonen", "ArturTrzaskos", 
+"MarkYelland", "GianlucaMazzocco", "GeorgeDaniel", "JoseDias", 
+"ChristopheIdre", "VernBarby", "WilliamKavenagh", "StefanFlorea", 
+"JamieHarries", "MikeTinnion", "TomasAdam", "VilleAnttiJaakkola", 
+"IvicaMagdic", "TerenceCourtoreille", "SeiichiKomatsuzawa", "CraigFarrar", 
+"MiroslavAntal", "ReneKoops", "TakashiKawahara", "MarinkoPuskaric", 
+"DonaldThom", "SabahudinPehadzicBIHI", "DavidEricDavies", "RobertVanRensburg", 
+"MichalBenatinsky", "JoeRiley", "PeterElberse", "JohnTrench", 
+"HelderRodrigues", "JoshStephens", "MartinDroz", "AaronWest", 
+"LucjanBurda", "LucaPapandrea", "JarkkoSuominen", "EricLelouvrier", 
+"HowardCroston", "VilleAnttiJaakkola", "VernBarby", "WilliamKavenagh", 
+"TerenceCourtoreille", "SeiichiKomatsuzawa", "GeorgeDaniel", 
+"MarkYelland", "StefanFlorea", "MiroslavAntal", "ReneKoops", 
+"CraigFarrar", "GianlucaMazzocco", "MikeTinnion", "ArturTrzaskos", 
+"TomasAdam", "JoseDias", "JamieHarries", "ChristopheIdre", "IvicaMagdic", 
+"BrianJeremiah", "PavelMachan", "TorbjornEriksson", "StanislawGuzdek", 
+"JannePirkkalainen", "AidenHodgins", "RickyLehman", "JanKwisthout", 
+"JohnHorsey", "MisakoIshimura", "RandyTaylor", "AntonioRodrigues", 
+"JohnBell", "BertrandJacquemin", "JanBartko", "ValerioSantiAmantini", 
+"AnthonyNaranja", "GaryGlenYoung", "PeterDindic", "TomasStarychfojtu", 
+"JohnNishi", "MichaelHeckler", "BorisDzurek", "SandroSoldarini", 
+"YoshikoIzumiya", "HansBock", "OlliToivonen", "JohnBuckley", 
+"BoskoBarisic", "LloydStruther", "MarekWalczyk", "LanceEgan", 
+"AndrewDixon", "ThibaultGuilpain", "StanislawMankou", "CraigColtman", 
+"AndreSteenkamp", "PauloMorais", "NunoDuarte", "MiroslavKaticic", 
+"SimonRobinson", "DamienWalsh", "PiotrKonieczny", "PeterBienek", 
+"DesArmstrong", "SimonGrootemaat", "TimRolston", "AlessandroSgrani", 
+"ScottTucker", "StephenVarga", "JulienDaguillanes", "KiyoshiNakagawa", 
+"ToddOishi", "JouniNeste", "AntoninPesek", "BretBishop", "KimTribe", 
+"HowardCroston", "JoeRiley", "LucjanBurda", "HelderRodrigues", 
+"JoshStephens", "JarkkoSuominen", "MarinkoPuskaric", "TakashiKawahara", 
+"MartinDroz", "LucaPapandrea", "AaronWest", "DavidEricDavies", 
+"EricLelouvrier", "RobertVanRensburg", "DonaldThom", "MichalBenatinsky", 
+"JohnTrench", "SabahudinPehadzicBIHI", "PeterElberse", "AnthonyNaranja", 
+"StanislawGuzdek", "JanBartko", "AntonioRodrigues", "AidenHodgins", 
+"RandyTaylor", "JohnHorsey", "MisakoIshimura", "ValerioSantiAmantini", 
+"GaryGlenYoung", "TorbjornEriksson", "RickyLehman", "PavelMachan", 
+"JohnBell", "JanKwisthout", "PeterDindic", "BertrandJacquemin", 
+"BrianJeremiah", "JannePirkkalainen", "IvicaMagdic", "ArturTrzaskos", 
+"VernBarby", "MiroslavAntal", "MarkYelland", "GeorgeDaniel", 
+"VilleAnttiJaakkola", "TomasAdam", "JamieHarries", "SeiichiKomatsuzawa", 
+"ReneKoops", "MikeTinnion", "GianlucaMazzocco", "StefanFlorea", 
+"WilliamKavenagh", "CraigFarrar", "ChristopheIdre", "JoseDias", 
+"TerenceCourtoreille", "PiotrKonieczny", "KimTribe", "PeterBienek", 
+"AlessandroSgrani", "DesArmstrong", "StephenVarga", "TimRolston", 
+"MiroslavKaticic", "JouniNeste", "DamienWalsh", "BretBishop", 
+"SimonRobinson", "ToddOishi", "ScottTucker", "KiyoshiNakagawa", 
+"SimonGrootemaat", "AntoninPesek", "NunoDuarte", "JulienDaguillanes", 
+"JohnBuckley", "LanceEgan", "StanislawMankou", "PauloMorais", 
+"AndrewDixon", "OlliToivonen", "LloydStruther", "SandroSoldarini", 
+"MarekWalczyk", "AndreSteenkamp", "YoshikoIzumiya", "CraigColtman", 
+"BoskoBarisic", "TomasStarychfojtu", "JohnNishi", "HansBock", 
+"BorisDzurek", "MichaelHeckler", "ThibaultGuilpain"), country = c("SVK", 
+"CAN", "WAL", "CZE", "CRO", "RSA", "USA", "AUS", "NED", "NZL", 
+"IRE", "FIN", "JPN", "POR", "ITA", "POL", "ENG", "BUL", "FRA", 
+"POL", "AUS", "ITA", "IRE", "ROM", "WAL", "POR", "CAN", "CRO", 
+"ENG", "USA", "CZE", "RSA", "SVK", "FRA", "NED", "FIN", "JPN", 
+"NZL", "RSA", "POR", "USA", "NED", "POL", "ITA", "SVK", "WAL", 
+"FRA", "FIN", "MAL", "ENG", "IRE", "NZL", "JPN", "AUS", "CRO", 
+"CZE", "CAN", "NDI", "CRO", "POL", "SVK", "USA", "IRE", "NED", 
+"FIN", "RSA", "CAN", "JPN", "WAL", "ITA", "CZE", "ENG", "NZL", 
+"FRA", "AUS", "POR", "JPN", "NZL", "FRA", "ENG", "POR", "FIN", 
+"CZE", "SWE", "POL", "AUS", "CRO", "SVK", "USA", "WAL", "CAN", 
+"IRE", "ITA", "NED", "RSA", "CRO", "ROM", "NED", "NZL", "CAN", 
+"ITA", "FRA", "AUS", "FIN", "JPN", "SVK", "USA", "IRE", "POL", 
+"WAL", "RSA", "POR", "CZE", "ENG", "POR", "CZE", "RSA", "SVK", 
+"CRO", "IRE", "JPN", "BUL", "WAL", "FRA", "POL", "FIN", "NED", 
+"AUS", "ENG", "ITA", "CAN", "USA", "NZL", "USA", "JPN", "AUS", 
+"POL", "WAL", "CZE", "RSA", "CRO", "POR", "ENG", "MAL", "NZL", 
+"CAN", "FRA", "FIN", "NED", "IRE", "SVK", "ITA", "IRE", "NZL", 
+"CRO", "CZE", "JPN", "SVK", "WAL", "ENG", "POL", "USA", "POR", 
+"AUS", "ITA", "SWE", "CAN", "FRA", "FIN", "RSA", "NED", "NED", 
+"WAL", "IRE", "ITA", "FIN", "NDI", "USA", "NZL", "RSA", "CAN", 
+"CRO", "JPN", "SVK", "POR", "CZE", "POL", "ENG", "AUS", "FRA", 
+"WAL", "CAN", "POR", "CRO", "ITA", "FIN", "CZE", "POL", "AUS", 
+"IRE", "SWE", "NZL", "SVK", "JPN", "RSA", "NED", "ENG", "USA", 
+"FRA", "MAL", "AUS", "CZE", "ENG", "POL", "CAN", "NED", "NZL", 
+"FIN", "JPN", "SVK", "POR", "USA", "FRA", "ITA", "CRO", "WAL", 
+"RSA", "IRE", "SVK", "USA", "WAL", "FIN", "IRE", "NZL", "JPN", 
+"RSA", "FRA", "CRO", "ITA", "NED", "ENG", "POL", "CZE", "AUS", 
+"POR", "CAN", "NDI", "CRO", "IRE", "NZL", "RSA", "AUS", "ENG", 
+"POR", "CAN", "SVK", "USA", "POL", "JPN", "BUL", "NED", "WAL", 
+"FRA", "CZE", "ITA", "FIN", "POL", "RSA", "ITA", "USA", "POR", 
+"FRA", "AUS", "IRE", "ROM", "WAL", "ENG", "CZE", "FIN", "CRO", 
+"CAN", "JPN", "NZL", "SVK", "NED", "JPN", "CRO", "CAN", "NDI", 
+"WAL", "RSA", "SVK", "AUS", "NED", "IRE", "POR", "USA", "CZE", 
+"NZL", "POL", "ITA", "FIN", "FRA", "ENG", "FIN", "AUS", "IRE", 
+"CAN", "JPN", "USA", "RSA", "ROM", "SVK", "NED", "NZL", "ITA", 
+"ENG", "POL", "CZE", "POR", "WAL", "FRA", "CRO", "WAL", "CZE", 
+"SWE", "POL", "FIN", "IRE", "AUS", "NED", "ENG", "JPN", "CAN", 
+"POR", "NZL", "FRA", "SVK", "ITA", "USA", "RSA", "CRO", "CZE", 
+"CAN", "WAL", "SVK", "ITA", "JPN", "NED", "FIN", "IRE", "CRO", 
+"NZL", "POL", "USA", "ENG", "FRA", "BUL", "AUS", "RSA", "POR", 
+"POR", "CRO", "ENG", "IRE", "POL", "SVK", "NZL", "NED", "RSA", 
+"ITA", "AUS", "MAL", "FRA", "JPN", "CAN", "FIN", "CZE", "USA", 
+"WAL", "ENG", "AUS", "POL", "POR", "USA", "FIN", "CRO", "JPN", 
+"CZE", "ITA", "NZL", "WAL", "FRA", "RSA", "CAN", "SVK", "IRE", 
+"NDI", "NED", "USA", "POL", "SVK", "POR", "IRE", "CAN", "ENG", 
+"JPN", "ITA", "RSA", "SWE", "AUS", "CZE", "NZL", "NED", "CRO", 
+"FRA", "WAL", "FIN", "CRO", "POL", "AUS", "SVK", "RSA", "USA", 
+"FIN", "CZE", "WAL", "JPN", "NED", "ENG", "ITA", "ROM", "IRE", 
+"NZL", "FRA", "POR", "CAN", "POL", "WAL", "SVK", "ITA", "NZL", 
+"MAL", "RSA", "CRO", "FIN", "IRE", "USA", "ENG", "CAN", "AUS", 
+"JPN", "NED", "CZE", "POR", "FRA", "IRE", "USA", "BUL", "POR", 
+"ENG", "FIN", "NZL", "ITA", "POL", "RSA", "JPN", "AUS", "CRO", 
+"CZE", "CAN", "NED", "SVK", "WAL", "FRA")), .Names = c("sector", 
+"session", "beatboat", "numbers", "comid", "iname", "country"), row.names = c("1", 
+"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
+"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", 
+"25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", 
+"36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", 
+"47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", 
+"58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", 
+"69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", 
+"80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", 
+"91", "92", "93", "94", "95", "96", "97", "98", "99", "100", 
+"101", "102", "103", "104", "105", "106", "107", "108", "109", 
+"110", "111", "112", "113", "114", "115", "116", "117", "118", 
+"119", "120", "121", "122", "123", "124", "125", "126", "127", 
+"128", "129", "130", "131", "132", "133", "134", "135", "136", 
+"137", "138", "139", "140", "141", "142", "143", "144", "145", 
+"146", "147", "148", "149", "150", "151", "152", "153", "154", 
+"155", "156", "157", "158", "159", "160", "161", "162", "163", 
+"164", "165", "166", "167", "168", "169", "170", "171", "172", 
+"173", "174", "175", "176", "177", "178", "179", "180", "181", 
+"182", "183", "184", "185", "186", "187", "188", "189", "190", 
+"191", "192", "193", "194", "195", "196", "197", "198", "199", 
+"200", "201", "202", "203", "204", "205", "206", "207", "208", 
+"209", "210", "211", "212", "213", "214", "215", "216", "217", 
+"218", "219", "220", "221", "222", "223", "224", "225", "226", 
+"227", "228", "229", "230", "231", "232", "233", "234", "235", 
+"236", "237", "238", "239", "240", "241", "242", "243", "244", 
+"245", "246", "247", "248", "249", "250", "251", "252", "253", 
+"254", "255", "256", "257", "258", "259", "260", "261", "262", 
+"263", "264", "265", "266", "267", "268", "269", "270", "271", 
+"272", "273", "274", "275", "276", "277", "278", "279", "280", 
+"281", "282", "283", "284", "285", "286", "287", "288", "289", 
+"290", "291", "292", "293", "294", "295", "296", "297", "298", 
+"299", "300", "301", "302", "303", "304", "305", "306", "307", 
+"308", "309", "310", "311", "312", "313", "314", "315", "316", 
+"317", "318", "319", "320", "321", "322", "323", "324", "325", 
+"326", "327", "328", "329", "330", "331", "332", "333", "334", 
+"335", "336", "337", "338", "339", "340", "341", "342", "343", 
+"344", "345", "346", "347", "348", "349", "350", "351", "352", 
+"353", "354", "355", "356", "357", "358", "359", "360", "361", 
+"362", "363", "364", "365", "366", "367", "368", "369", "370", 
+"371", "372", "373", "374", "375", "376", "377", "378", "379", 
+"380", "381", "382", "383", "384", "385", "386", "387", "388", 
+"389", "390", "391", "392", "393", "394", "395", "396", "397", 
+"398", "399", "400", "401", "402", "403", "404", "405", "406", 
+"407", "408", "409", "410", "411", "412", "413", "414", "415", 
+"416", "417", "418", "419", "420", "421", "422", "423", "424", 
+"425", "426", "427", "428", "429", "430", "431", "432", "433", 
+"434", "435", "436", "437", "438", "439", "440", "441", "442", 
+"443", "444", "445", "446", "447", "448", "449", "450", "451", 
+"452", "453", "454", "455", "456", "457", "458", "459", "460", 
+"461", "462", "463", "464", "465", "466", "467", "468", "469", 
+"470", "471", "472", "473", "474", "475"), class = "data.frame")
diff --git a/data/wffc.teams.R b/data/wffc.teams.R
new file mode 100644
index 0000000..3aa4aa7
--- /dev/null
+++ b/data/wffc.teams.R
@@ -0,0 +1,14 @@
+"wffc.teams" <-
+structure(list(country = c("CZE", "NZL", "FRA", "POL", "ITA", 
+"ENG", "SVK", "USA", "CAN", "FIN", "IRE", "AUS", "POR", "JPN", 
+"RSA", "NED", "WAL", "CRO"), totalPlacings = c(125, 148, 164, 
+186, 196, 197, 202, 203, 227, 229, 249, 269, 293, 307, 315, 321, 
+328, 333), points = c(241300, 205540, 208040, 170000, 162320, 
+167480, 169800, 165960, 147940, 145100, 138160, 119920, 115380, 
+90520, 76200, 93080, 58560, 97740), noofcaptures = c(383, 325, 316, 
+284, 263, 272, 267, 282, 247, 230, 240, 185, 189, 142, 121, 164, 
+86, 166), longestfish = c(540, 627, 585, 580, 580, 689, 615, 
+615, 624, 688, 535, 580, 590, 532, 604, 505, 590, 568)), .Names = c("country", 
+"totalPlacings", "points", "noofcaptures", "longestfish"), row.names = c("1", 
+"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
+"14", "15", "16", "17", "18"), class = "data.frame")
diff --git a/man/AICvlm.Rd b/man/AICvlm.Rd
new file mode 100644
index 0000000..f2bf1fd
--- /dev/null
+++ b/man/AICvlm.Rd
@@ -0,0 +1,100 @@
+\name{AICvlm}
+\alias{AICvlm}
+%\alias{AICvglm}
+\alias{AICvgam}
+\alias{AICrrvglm}
+%\alias{AICqrrvglm}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{ Akaike's An Information Criterion }
+\description{
+  Calculates the Akaike information criterion for a fitted model object
+  for which a log-likelihood value has been obtained.
+
+}
+\usage{
+AICvlm(object, \dots, k = 2)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+  \item{object}{
+  Some \pkg{VGAM} object, for example, having
+  class \code{\link{vglmff-class}}.
+  }
+  \item{\dots}{
+  Other possible arguments fed into
+  \code{logLik} in order to compute the log-likelihood.
+  }
+  \item{k}{
+  Numeric, the penalty per parameter to be used;
+  the default is the classical AIC.
+  }
+}
+\details{
+  The following formula is used for VGLMs:
+  \eqn{-2 \mbox{log-likelihood} + k n_{par}}{-2*log-likelihood
+  + k*npar}, where \eqn{n_{par}}{npar} represents the number of parameters
+  in the fitted model, and \eqn{k = 2} for the usual AIC.
+  One can assign \eqn{k = \log(n)} (\eqn{n} the number of observations)
+  for the so-called BIC or SBC (Schwarz's Bayesian criterion).
+
+  This code relies on the log-likelihood being defined, and computed,
+  for the object.
+  When comparing fitted objects, the smaller the AIC, the better the fit.
+  The log-likelihood and hence the AIC is only defined up to an additive
+  constant.
+
+  Any estimated scale parameter (in GLM parlance) is used as one
+  parameter.
+
+  For VGAMs the nonlinear effective degrees of freedom for each
+  smoothed component is used. This is heuristic.
+
+}
+\value{
+  Returns a numeric value with the corresponding AIC (or BIC, or \dots,
+  depending on \code{k}).
+
+}
+\author{T. W. Yee }
+\note{
+  AIC has not been defined for QRR-VGLMs yet.
+
+}
+
+%\references{
+%  Sakamoto, Y., Ishiguro, M., and Kitagawa G. (1986).
+%  \emph{Akaike Information Criterion Statistics}.
+%  D. Reidel Publishing Company.
+%}
+
+\section{Warning }{
+  This code has not been double-checked.
+  The general applicability of \code{AIC} for the VGLM/VGAM classes
+  has not been developed fully. 
+  In particular, \code{AIC} should not be run on some \pkg{VGAM} family
+  functions because of violation of certain regularity conditions, etc.
+
+}
+
+\seealso{
+  VGLMs are described in \code{\link{vglm-class}};
+  RR-VGLMs are described in \code{\link{rrvglm-class}};
+  \code{\link[stats]{AIC}}.
+
+}
+\examples{
+# Fit a proportional odds model
+data(pneumo)
+pneumo = transform(pneumo, let=log(exposure.time))
+(fit1 = vglm(cbind(normal, mild, severe) ~ let,
+           cumulative(parallel=TRUE, reverse=TRUE), pneumo))
+coef(fit1, matrix=TRUE)
+AIC(fit1)
+(fit2 = vglm(cbind(normal, mild, severe) ~ let,
+           cumulative(parallel=FALSE, reverse=TRUE), pneumo))
+coef(fit2, matrix=TRUE)
+AIC(fit2)
+}
+\keyword{models}
+\keyword{regression}
+
diff --git a/man/DeLury.Rd b/man/DeLury.Rd
new file mode 100644
index 0000000..3715c35
--- /dev/null
+++ b/man/DeLury.Rd
@@ -0,0 +1,176 @@
+\name{DeLury}
+\alias{DeLury}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{ DeLury's Method for Population Size Estimation }
+\description{
+  Computes DeLury's method or Leslie's method for estimating a
+  biological population size.
+
+}
+\usage{
+DeLury(catch, effort, type=c("DeLury","Leslie"), ricker=FALSE)
+       
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+  \item{catch, effort}{
+  Catch and effort. These should be numeric vectors of equal length.
+
+  }
+  \item{type}{
+  Character specifying which of the DeLury or Leslie models is to be fitted.
+  The default is the first value.
+
+  }
+  \item{ricker}{
+  Logical. If \code{TRUE} then the Ricker (1975) modification is computed.
+
+  }
+}
+\details{
+  This simple function implements the methods of DeLury (1947).
+  These are called the DeLury and Leslie models.
+  Note that there are many assumptions.
+  These include: (i) Catch and effort records are available for a series
+  of consecutive time intervals. The catch for a given time
+  interval, specified by \eqn{t}, is \eqn{c(t)}, and the
+  corresponding effort by \eqn{e(t)}.
+  The \emph{catch per unit effort} (CPUE) for the time interval \eqn{t} is
+  \eqn{C(t) = c(t)/e(t)}.
+  Let \eqn{d(t)} represent the proportion of the population
+  captured during the time interval \eqn{t}.
+  Then \eqn{d(t) = k(t) e(t)} so that \eqn{k(t)} is the 
+  proportion of the population captured during interval \eqn{t} by one unit
+  of effort. Then \eqn{k(t)} is called the \emph{catchability},
+  and the \emph{intensity} of effort is \eqn{e(t)}.
+  Let \eqn{E(t)} and \eqn{K(t)} be the total effort and total catch
+  up to interval \eqn{t}, and \eqn{N(t)} be the number of individuals
+  in the population at time \eqn{t}.
+  It is good idea to plot
+  \eqn{\log(C(t))} against \eqn{E(t)} for \code{type="DeLury"} and
+  \eqn{C(t)} versus \eqn{K(t)} for \code{type="Leslie"}.
+
+The other assumptions are as follows.
+%
+   (ii) The population is closed---the population must be closed to sources
+   of animals such as recruitment and immigration and losses of animals
+   due to natural mortality and emigration.
+%
+   (iii) Catchability is constant over the period of removals.
+%
+   (iv) The units of effort are independent, i.e., the individual units
+   of the method of capture (i.e., nets, traps, etc) do not compete with
+   each other.
+%
+   (v) All fish are equally vulnerable to the method of capture---source
+   of error may include gear saturation and trap-happy or trap-shy
+   individuals.
+%
+   (vi) Enough fish must be removed to substantially reduce the CPUE.
+%
+   (vii) The catches may remove less than 2\% of the population.
+%
+   Also, the usual assumptions of simple regression such as
+%
+   (viii) random sampling,
+%
+   (ix) the independent variable(s) are measured without error---both
+   catches and effort should be known, not estimated,
+%
+   (x) a line describes the data,
+%
+  (xi) the errors are independent and normally distributed.
+
+
+
+}
+\value{
+  A list with the following components.
+
+  \item{catch, effort }{
+  Catch and effort. Same as the original vectors.
+  These correspond to \eqn{c(t)} and \eqn{e(t)} respectively.
+
+  }
+  \item{type, ricker}{Same as input.
+
+  }
+  \item{N0}{an estimate of the population size at time 0.
+  Only valid if the assumptions are satisfied.
+
+  }
+  \item{CPUE}{Catch Per Unit Effort \eqn{=C(t)}. }
+  \item{K, E}{\eqn{K(t)}, \eqn{E(t)}. Only one is computed
+  depending on \code{type}. }
+  \item{lmfit}{
+  the \code{\link[stats:lm]{lm}} object from the
+  fit of \code{log(CPUE)} on \code{K} (when \code{type="Leslie"}).
+  Note that the \code{x} component of the object is the model matrix.
+
+  }
+
+}
+\references{
+
+DeLury, D. B. (1947)
+On the estimation of biological populations.
+\emph{Biometrics},
+\bold{3}, 145--167.
+
+Ricker, W. E. (1975)
+Computation and interpretation of biological
+statistics of fish populations.
+\emph{Bull. Fish. Res. Bd. Can.},
+\bold{191}, 382--
+
+}
+\author{ T. W. Yee. }
+\note{
+The data in the example below comes from DeLury (1947), and
+some plots of his are reproduced.
+Note that he used log to base 10 whereas natural logs are used here.
+His plots had some observations obscured by the y-axis!
+
+}
+\seealso{ \code{\link{wffc.nc}}. }
+\examples{
+pounds = c(  147, 2796, 6888, 7723, 5330, 8839, 6324, 3569, 8120, 8084,
+            8252, 8411, 6757, 1152, 1500, 11945, 6995, 5851, 3221, 6345,
+            3035, 6271, 5567, 3017, 4559, 4721, 3613,  473,  928, 2784,
+            2375, 2640, 3569)
+traps  = c(  200, 3780, 7174, 8850, 5793, 9504, 6655, 3685, 8202, 8585,
+            9105, 9069, 7920, 1215, 1471, 11597, 8470, 7770, 3430, 7970,
+            4740, 8144, 7965, 5198, 7115, 8585, 6935, 1060, 2070, 5725,
+            5235, 5480, 8300)
+table1 = DeLury(pounds/1000, traps/1000)
+
+\dontrun{
+with(table1, plot(1+log(CPUE) ~ E, las=1, pch=19, main="DeLury method",
+     xlab="E(t)", ylab="1 + log(C(t))", col="blue"))
+}
+omitIndices = -(1:16)
+table1b = DeLury(pounds[omitIndices]/1000, traps[omitIndices]/1000)
+\dontrun{
+with(table1b, plot(1+log(CPUE) ~ E, las=1, pch=19, main="DeLury method",
+     xlab="E(t)", ylab="1 + log(C(t))", col="blue"))
+mylmfit = with(table1b, lmfit)
+lines(mylmfit$x[,2], 1 + predict.lm(mylmfit), col="red", lty="dashed")
+}
+
+
+
+omitIndices = -(1:16)
+table2 = DeLury(pounds[omitIndices]/1000, traps[omitIndices]/1000, type="L")
+\dontrun{
+with(table2, plot(CPUE ~ K, las=1, pch=19,
+     main="Leslie method; Fig. III",
+     xlab="K(t)", ylab="C(t)", col="blue"))
+mylmfit = with(table2, lmfit)
+abline(a=coef(mylmfit)[1], b=coef(mylmfit)[2], col="red", lty="dashed")
+}
+}
+% Add one or more standard keywords, see file 'KEYWORDS' in the
+% R documentation directory.
+\keyword{ models }
+
+
diff --git a/man/VGAM-package.Rd b/man/VGAM-package.Rd
index 5ad2669..0441dca 100644
--- a/man/VGAM-package.Rd
+++ b/man/VGAM-package.Rd
@@ -95,6 +95,10 @@ Yee, T. W. (2006)
 Constrained additive ordination.
 \emph{Ecology}, \bold{87}, 203--213.
 
+Yee, T. W. (2008)
+The \code{VGAM} Package.
+\emph{R News}, \bold{8}, 28--39.
+
 Documentation accompanying the \pkg{VGAM} package at
 \url{http://www.stat.auckland.ac.nz/~yee/VGAM}
 contains further information and examples.
@@ -143,20 +147,19 @@ fit2 = vgam(cbind(agaaus, kniexc) ~ s(altitude, df=c(2,3)),
 coef(fit2, mat=TRUE)   # Not really interpretable
 \dontrun{
 plot(fit2, se=TRUE, overlay=TRUE, lcol=1:2, scol=1:2)
-attach(hunua)
-o = order(altitude)
-matplot(altitude[o], fitted(fit2)[o,], type="l", lwd=2, las=1,
-    xlab="Altitude (m)", ylab="Probability of presence",
-    main="Two plant species' response curves", ylim=c(0,.8))
-rug(altitude)
-detach(hunua)
+
+o = with(hunua, order(altitude))
+with(hunua,  matplot(altitude[o], fitted(fit2)[o,], type="l", lwd=2,
+     xlab="Altitude (m)", ylab="Probability of presence", las=1,
+     main="Two plant species' response curves", ylim=c(0,.8)))
+with(hunua, rug(altitude))
 }
 
 
 # Example 4
 # LMS quantile regression
 data(bminz)
-fit = vgam(BMI ~ s(age, df=c(4,2)), fam=lms.bcn(zero=1), data=bminz, tr=TRUE)
+fit = vgam(BMI ~ s(age, df=c(4,2)), lms.bcn(zero=1), dat=bminz, tr=TRUE)
 predict(fit)[1:3,]
 fitted(fit)[1:3,]
 bminz[1:3,]
diff --git a/man/alaplace3.Rd b/man/alaplace3.Rd
index 2ae0157..ed51205 100644
--- a/man/alaplace3.Rd
+++ b/man/alaplace3.Rd
@@ -299,7 +299,7 @@ with(alldat, matlines(x, fitted(fitp3), col="black", lty="solid", lwd=mylwd))
 # successive solutions which are added to previous solutions; use a log
 # link to ensure an increasing quantiles at any value of x.
 
-mytau = seq(0.1, 0.9, by=0.1)
+mytau = seq(0.2, 0.9, by=0.1)
 answer = matrix(0, nrow(alldat), length(mytau)) # Stores the quantiles
 alldat = transform(alldat, offsety=y*0)
 usetau = mytau
@@ -308,7 +308,7 @@ for(ii in 1:length(mytau)) {
     alldat = transform(alldat, usey=y-offsety)
     iloc = ifelse(ii==1, with(alldat, median(y)), 1.0) # Well-chosen!
     mydf = ifelse(ii==1, 5, 3)  # Maybe less smoothing will help
-    lloc = ifelse(ii==1, "loge", "loge")  # 2nd value must be "loge"
+    lloc = ifelse(ii==1, "identity", "loge")  # 2nd value must be "loge"
     fit3 = vglm(usey ~ ns(x, df=mydf), data=alldat, trace=TRUE,
                 fam=alaplace1(tau=usetau[ii], lloc=lloc, iloc=iloc))
     answer[,ii] = (if(ii==1) 0 else answer[,ii-1]) + fitted(fit3)
diff --git a/man/benfUC.Rd b/man/benfUC.Rd
new file mode 100644
index 0000000..cecfea3
--- /dev/null
+++ b/man/benfUC.Rd
@@ -0,0 +1,130 @@
+\name{Benford}
+\alias{Benford}
+\alias{dbenf}
+\alias{pbenf}
+\alias{qbenf}
+\alias{rbenf}
+\title{ Benford's Distribution }
+\description{
+  Density, distribution function,
+  quantile function,
+  and random generation
+  for Benford's distribution.
+
+}
+\usage{
+dbenf(x, ndigits=1, log=FALSE)
+pbenf(q, ndigits=1, log.p=FALSE)
+qbenf(p, ndigits=1)
+rbenf(n, ndigits=1)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+  \item{x, q}{
+   Vector of quantiles.
+   See \code{ndigits}.
+
+  }
+  \item{p}{vector of probabilities.}
+  \item{n}{number of observations. A single positive integer.
+  Else if \code{length(n) > 1} then the length is
+          taken to be the number required.
+  }
+  \item{ndigits}{
+  Number of leading digits, either 1 or 2.
+  If 1 then the support of the distribution is \{1,\ldots,9\}, else
+  \{10,\ldots,99\}.
+
+  }
+  \item{log, log.p}{
+  Logical.
+  If \code{log.p=TRUE} then all probabilities \code{p} are
+  given as \code{log(p)}.
+
+  }
+
+}
+\details{
+
+Benford's Law (aka \emph{the significant-digit law}) is the
+empirical observation that in many naturally occuring tables of
+numerical data, the leading significant (nonzero) digit
+is not uniformly distributed in \eqn{\{1,2,\ldots,9\}}{1:9}.
+Instead, the leading significant digit (\eqn{=D}, say)
+obeys the law
+  \deqn{P(D=d) = \log_{10} \left( 1 + \frac1d \right)}{%
+        P(D=d) =  log10(1 + 1/d)}
+for \eqn{d=1,\ldots,9}.
+This means
+the probability the first\ significant\ digit is 1 is
+approximately \eqn{0.301}, etc.
+
+Benford's Law was apparently first discovered in 1881
+by astronomer/mathematician
+S. Newcombe. It started by the observation
+that the pages of a book of logarithms were dirtiest at the
+beginning and progressively cleaner throughout.
+In 1938, a General Electric physicist called F. Benford
+rediscovered the law on this same observation. Over
+several years he collected data from different sources
+as different as atomic weights, baseball statistics,
+numerical data from \emph{Reader's Digest},
+and drainage areas of rivers.
+
+Applications of Benford's Law has been as diverse as
+to the area of
+fraud detection in accounting  and the design computers.
+
+}
+\value{
+  \code{dbenf} gives the density,
+  \code{pbenf} gives the distribution function, and
+  \code{qbenf} gives the quantile function, and
+  \code{rbenf} generates random deviates.
+
+}
+\references{ 
+
+Benford, F. (1938)
+The Law of Anomalous Numbers.
+\emph{Proceedings of the American Philosophical Society},
+\bold{78}, 551--572.
+
+Newcomb, S. (1881)
+Note on the Frequency of Use of the Different Digits in Natural Numbers.
+\emph{American Journal of Mathematics},
+\bold{4}, 39--40.
+
+}
+\author{ T. W. Yee }
+%\note{ 
+%  Currently only the leading digit is handled.
+%  The first two leading digits would be the next simple extension.
+%
+%}
+
+%\seealso{
+%    \code{\link{logff}}.
+%}
+\examples{
+x = c(0:10, NA, NaN, -Inf, Inf)
+dbenf(x)
+pbenf(x)
+
+\dontrun{
+x = 1:9; # par(mfrow=c(2,1))
+barplot(dbenf(x), col = "lightblue", las=1, xlab="Leading digit",
+        ylab = "Probability",
+        main=paste("Benford's distribution",  sep=""),
+        names.arg = as.character(x))
+
+hist(rbenf(n=1000), border = "blue", prob=TRUE,
+     main="Random variates from Benford's distribution",
+     xlab="Leading digit",
+     sub="Red is the true probability",
+     breaks=0:9+0.5, ylim=c(0, 0.35), xlim=c(0, 10.0))
+lines(1:9, dbenf(1:9), col="red", type="h")
+points(1:9, dbenf(1:9), col="red")
+}
+}
+\keyword{distribution}
diff --git a/man/betabin.ab.Rd b/man/betabin.ab.Rd
index f0941cd..1df56b1 100644
--- a/man/betabin.ab.Rd
+++ b/man/betabin.ab.Rd
@@ -173,8 +173,7 @@ cbind(fit at y, weights(fit, type="prior"))[1:5,]
 
 # Example 2
 data(lirat)
-fit = vglm(cbind(R,N-R) ~ 1, betabin.ab, data=lirat,
-           trace=TRUE, subset=N>1)
+fit = vglm(cbind(R,N-R) ~ 1, betabin.ab, data=lirat, tra=TRUE, subset=N>1)
 coef(fit, matrix=TRUE)
 Coef(fit)
 fit at misc$rho      # The correlation parameter
@@ -196,24 +195,21 @@ coef(fit2, matrix=TRUE)
 Coef(fit2)
 coef(fit2, matrix=TRUE)[,1] - coef(fit2, matrix=TRUE)[,2] # logit(p)
 \dontrun{
-plot(lirat$hb[lirat$N>1], fit2 at misc$rho,
-     xlab="Hemoglobin", ylab="Estimated rho",
-     pch=as.character(lirat$grp[lirat$N>1]),
-     col=lirat$grp[lirat$N>1])
+with(lirat, plot(hb[N>1], fit2 at misc$rho,
+                 xlab="Hemoglobin", ylab="Estimated rho",
+                 pch=as.character(grp[N>1]), col=grp[N>1]))
 }
 \dontrun{
 data(lirat)
-attach(lirat)
 # cf. Figure 3 of Moore and Tsiatis (1991)
-plot(hb, R/N, pch=as.character(grp), col=grp, las=1,
-     xlab="Hemoglobin level", ylab="Proportion Dead",
-     main="Fitted values (lines)")
-detach(lirat)
+with(lirat, plot(hb, R/N, pch=as.character(grp), col=grp, las=1,
+            xlab="Hemoglobin level", ylab="Proportion Dead",
+            main="Fitted values (lines)"))
 
-smalldf = lirat[lirat$N>1,]
+smalldf = with(lirat, lirat[N>1,])
 for(gp in 1:4) {
-    xx = smalldf$hb[smalldf$grp==gp]
-    yy = fitted(fit2)[smalldf$grp==gp]
+    xx = with(smalldf, hb[grp==gp])
+    yy = with(smalldf, fitted(fit2)[grp==gp])
     o = order(xx)
     lines(xx[o], yy[o], col=gp)
 }
diff --git a/man/betabinUC.Rd b/man/betabinUC.Rd
index 438cd58..3640be6 100644
--- a/man/betabinUC.Rd
+++ b/man/betabinUC.Rd
@@ -92,19 +92,25 @@ rbetabin.ab(n, size, shape1, shape2)
 \dontrun{
 N = 9; x = 0:N; s1=2; s2=3
 dy = dbetabin.ab(x, size=N, shape1=s1, shape2=s2)
-plot(x, dy, type="h", col="red", ylim=c(0,0.25), ylab="Probability",
-     main=paste("Beta-binomial (size=",N,", shape1=",s1,
-                ", shape2=",s2,")", sep=""))
-lines(x+0.1, dbinom(x, size=N, prob=s1/(s1+s2)), type="h", col="blue")
+barplot(rbind(dy, dbinom(x, size=N, prob=s1/(s1+s2))),
+        beside = TRUE, col = c("blue","green"),
+        main=paste("Beta-binomial (size=",N,", shape1=",s1,
+                   ", shape2=",s2,") (blue) vs\n",
+        " Binomial(size=", N, ", prob=", s1/(s1+s2), ") (green)", sep=""),
+        names.arg = as.character(x))
 sum(dy*x) # Check expected values are equal
 sum(dbinom(x, size=N, prob=s1/(s1+s2))*x)
 cumsum(dy) -  pbetabin.ab(x, N, shape1=s1, shape2=s2)
 
 y = rbetabin.ab(n=10000, size=N, shape1=s1, shape2=s2)
 ty = table(y)
-lines(as.numeric(names(ty))+0.2, ty/sum(ty), type="h", col="green")
-legend(5, 0.25, leg=c("beta-binomial","binomial", "random generated"),
-       col=c("red","blue","green"), lty=1)
+barplot(rbind(dy, ty/sum(ty)),
+        beside = TRUE, col = c("blue","red"),
+        main=paste("Beta-binomial (size=",N,", shape1=",s1,
+                   ", shape2=",s2,") (blue) vs\n",
+        " Random generated beta-binomial(size=", N, ", prob=", s1/(s1+s2),
+        ") (red)", sep=""),
+        names.arg = as.character(x))
 }
 }
 \keyword{distribution}
diff --git a/man/betabinomial.Rd b/man/betabinomial.Rd
index b06fd92..29cb0c8 100644
--- a/man/betabinomial.Rd
+++ b/man/betabinomial.Rd
@@ -186,24 +186,20 @@ fit2 = vglm(cbind(R,N-R) ~ fgrp + hb, betabinomial(zero=2),
            data=lirat, trace=TRUE, subset=N>1)
 coef(fit2, matrix=TRUE)
 \dontrun{
-plot(lirat$hb[lirat$N>1], fit2 at misc$rho,
-     xlab="Hemoglobin", ylab="Estimated rho",
-     pch=as.character(lirat$grp[lirat$N>1]),
-     col=lirat$grp[lirat$N>1])
+with(lirat, plot(hb[N>1], fit2 at misc$rho,
+                 xlab="Hemoglobin", ylab="Estimated rho",
+                 pch=as.character(grp[N>1]), col=grp[N>1]))
 }
 \dontrun{
 data(lirat)
-attach(lirat)
 # cf. Figure 3 of Moore and Tsiatis (1991)
-plot(hb, R/N, pch=as.character(grp), col=grp, las=1,
-     xlab="Hemoglobin level", ylab="Proportion Dead",
-     main="Fitted values (lines)")
-detach(lirat)
-
-smalldf = lirat[lirat$N>1,]
+with(lirat, plot(hb, R/N, pch=as.character(grp), col=grp, las=1,
+                 xlab="Hemoglobin level", ylab="Proportion Dead",
+                 main="Fitted values (lines)"))
+smalldf = with(lirat, lirat[N>1,])
 for(gp in 1:4) {
-    xx = smalldf$hb[smalldf$grp==gp]
-    yy = fitted(fit2)[smalldf$grp==gp]
+    xx = with(smalldf, hb[grp==gp])
+    yy = with(smalldf, fitted(fit2)[grp==gp])
     o = order(xx)
     lines(xx[o], yy[o], col=gp)
 }
diff --git a/man/binom2.or.Rd b/man/binom2.or.Rd
index 8f6bb69..435105c 100644
--- a/man/binom2.or.Rd
+++ b/man/binom2.or.Rd
@@ -13,7 +13,7 @@
 binom2.or(lmu = "logit", lmu1 = lmu, lmu2 = lmu, loratio = "loge",
           emu=list(), emu1=emu, emu2=emu, eoratio=list(),
           imu1=NULL, imu2=NULL, ioratio = NULL,
-          zero = 3, exchangeable = FALSE, tol = 0.001)
+          zero = 3, exchangeable = FALSE, tol = 0.001, morerobust=FALSE)
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
@@ -60,6 +60,13 @@ binom2.or(lmu = "logit", lmu1 = lmu, lmu2 = lmu, loratio = "loge",
   small positive numerical value.
 
   }
+  \item{morerobust}{
+  Logical. If \code{TRUE} then some measures are taken to compute the
+  derivatives and working weights more robustly, i.e., in an attempt
+  to avoid numerical problems. Currently this feature is not debugged
+  if set \code{TRUE}.
+
+  }
 }
 \details{
   Known also as the \emph{Palmgren model}, the bivariate logistic model is
@@ -172,6 +179,9 @@ fit = vglm(cbind(nBnW,nBW,BnW,BW) ~ Age, binom2.or(zero=NULL), coalminers)
 fitted(fit)
 summary(fit)
 coef(fit, matrix=TRUE)
+
+c(weights(fit, type="prior")) * fitted(fit)  # Table 6.8
+
 \dontrun{
 with(coalminers, matplot(Age, fitted(fit), type="l", las=1,
                          xlab="(age - 42) / 5", lwd=2))
diff --git a/man/binom2.rho.Rd b/man/binom2.rho.Rd
index 87232fc..c6fbae7 100644
--- a/man/binom2.rho.Rd
+++ b/man/binom2.rho.Rd
@@ -1,13 +1,16 @@
 \name{binom2.rho}
 \alias{binom2.rho}
 %- Also NEED an '\alias' for EACH other topic documented here.
-\title{ Bivariate Probit Model }
+\title{ Bivariate Probit Model (Family Function) }
 \description{
   Fits a bivariate probit model to two binary responses.
+  The correlation parameter rho is the measure of dependency.
+
 }
 \usage{
 binom2.rho(lrho = "rhobit", erho=list(),
-           init.rho = 0.4, zero = 3, exchangeable = FALSE)
+           imu1 = NULL, imu2 = NULL, init.rho = NULL,
+           zero = 3, exchangeable = FALSE, nsimEIM=NULL)
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
@@ -22,13 +25,21 @@ binom2.rho(lrho = "rhobit", erho=list(),
 
   }
   \item{init.rho}{
-  Initial value for \eqn{\rho}{rho}.
-  This should lie between \eqn{-1} and \eqn{1}.
+  Optional initial value for \eqn{\rho}{rho}.
+  If given, this should lie between \eqn{-1} and \eqn{1}.
+  See below for more comments.
+
+  }
+  \item{imu1, imu2}{
+  Optional initial values for the two marginal probabilities.
+  May be a vector.
 
   }
   \item{zero}{
-  Which linear/additive predictor is modelled as an
-  intercept only? A \code{NULL} means none.
+  Which linear/additive predictor is modelled as an intercept only?
+  A \code{NULL} means none.
+  Numerically, the \eqn{\rho}{rho} parameter is easiest modelled as
+  an intercept only, hence the default.
 
   }
   \item{exchangeable}{
@@ -37,6 +48,13 @@ binom2.rho(lrho = "rhobit", erho=list(),
   be equal.
 
   }
+  \item{nsimEIM}{
+  See \code{\link{CommonVGAMffArguments}} for more information.
+  A value of at least 100 is recommended;
+  the larger the value the better.
+
+  }
+
 }
 \details{
   The \emph{bivariate probit model} was one of the earliest regression
@@ -47,11 +65,12 @@ binom2.rho(lrho = "rhobit", erho=list(),
   unit variances). One can think of the joint probabilities being
   \eqn{\Phi(\eta_1,\eta_2;\rho)}{Phi(eta1,eta2;rho)} where \eqn{\Phi}{Phi}
   is the cumulative distribution function of a standard bivariate normal
-  distribution with correlation parameter \eqn{\rho}{rho}.
+  distribution (i.e., \code{\link[stats:Normal]{pnorm}})
+  with correlation parameter \eqn{\rho}{rho}.
 
   The bivariate probit model should not be confused with a \emph{bivariate
   logit model} with a probit link (see \code{\link{binom2.or}}).
-  The latter uses the odds ratio to quantify the association.  Actually,
+  The latter uses the odds ratio to quantify the association. Actually,
   the bivariate logit model is recommended over the bivariate probit
   model because the odds ratio is a more natural way of measuring the
   association between two binary responses.
@@ -91,21 +110,30 @@ contains further information and examples.
   \eqn{\rho}{rho} lies in the interval \eqn{(-1,1)}{(-1,1)}, therefore
   a \code{\link{rhobit}} link is default.
 
-  If converge problems occur, try setting \code{init.rho} to some
-  value, e.g., a negative number such as \eqn{-0.5}{-0.5}.
+  Converge problems can occur.
+  If so, assign \code{init.rho} a range of
+  values and monitor convergence (e.g., set \code{trace=TRUE}).
+  Practical experience shows that local solutions can occur,
+  and that \code{init.rho} needs to be quite close to the (global)
+  solution.
+  Also, \code{imu1} and \code{imu2} may be used.
+
 }
 \seealso{
+  \code{\link{rbinom2.rho}},
   \code{\link{binom2.or}},
   \code{\link{loglinb2}},
   \code{\link{coalminers}},
   \code{\link{binomialff}},
   \code{\link{rhobit}},
   \code{\link{fisherz}}.
+
 }
 \examples{
 data(coalminers)
 coalminers = transform(coalminers, Age = (age - 42) / 5)
-fit = vglm(cbind(nBnW,nBW,BnW,BW) ~ Age, binom2.rho, coalminers)
+fit = vglm(cbind(nBnW,nBW,BnW,BW) ~ Age, binom2.rho,
+           data=coalminers, trace=TRUE)
 summary(fit)
 coef(fit, matrix=TRUE)
 }
diff --git a/man/binom2.rhoUC.Rd b/man/binom2.rhoUC.Rd
new file mode 100644
index 0000000..be441fb
--- /dev/null
+++ b/man/binom2.rhoUC.Rd
@@ -0,0 +1,120 @@
+\name{Binom2.rho}
+\alias{Binom2.rho}
+\alias{dbinom2.rho}
+\alias{rbinom2.rho}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{ Bivariate Probit Model }
+\description{
+  Density and random generation for a bivariate probit model.
+  The correlation parameter rho is the measure of dependency.
+
+}
+\usage{
+rbinom2.rho(n, mu1,
+           mu2=if(exchangeable) mu1 else stop("'mu2' not specified"),
+           rho=0, exchangeable=FALSE, twoCols=TRUE,
+           colnames=if(twoCols) c("y1","y2") else c("00", "01", "10", "11"),
+           ErrorCheck=TRUE)
+dbinom2.rho(mu1,
+           mu2=if(exchangeable) mu1 else stop("'mu2' not specified"),
+           rho=0, exchangeable=FALSE,
+           colnames=c("00", "01", "10", "11"), ErrorCheck=TRUE)
+
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+  \item{n}{
+    number of observations. Must be a single positive integer.
+    The arguments \code{mu1}, \code{mu2}, \code{rho} are recycled to
+    length \code{n}.
+
+  }
+  \item{mu1, mu2}{
+    The marginal probabilities.
+    Only \code{mu1} is needed if \code{exchangeable=TRUE}.
+    Values should be between 0 and 1.
+
+  }
+  \item{rho}{
+    The correlation parameter.
+    Must be numeric and lie between \eqn{-1} and \eqn{1}.
+    The default value of zero means the responses are uncorrelated.
+    
+  }
+  \item{exchangeable}{
+   Logical. If \code{TRUE}, the two marginal probabilities are constrained
+   to be equal.
+    
+  }
+  \item{twoCols}{
+   Logical.
+   If \code{TRUE}, then a \eqn{n} \eqn{\times}{*} \eqn{2} matrix of 1s
+   and 0s is returned.
+   If \code{FALSE}, then a \eqn{n} \eqn{\times}{*} \eqn{4} matrix of 1s
+   and 0s is returned.
+
+  }
+  \item{colnames}{
+  The \code{dimnames} argument of
+  \code{\link[base]{matrix}} is assigned \code{list(NULL, colnames)}.
+
+  }
+  \item{ErrorCheck}{
+  Logical. Do some error checking of the input parameters?
+
+  }
+
+}
+\details{
+  The function \code{rbinom2.rho} generates data coming from a bivariate
+  probit model.
+  The data might be fitted with the \pkg{VGAM} family function
+  \code{\link{binom2.rho}}.
+
+  The function \code{dbinom2.rho} does not really compute the density
+  (because that does not make sense here) but rather returns the
+  four joint probabilities.
+
+}
+\value{
+  The function \code{rbinom2.rho} returns
+  either a 2 or 4 column matrix of 1s and 0s, depending on the argument
+  \code{twoCols}.
+
+  The function \code{dbinom2.rho} returns
+  a 4 column matrix of joint probabilities; each row adds up to unity.
+
+}
+\author{ T. W. Yee }
+\seealso{
+  \code{\link{binom2.rho}}.
+
+}
+\examples{
+# Example 1
+nn = 2000
+(myrho <- rhobit(2, inverse=TRUE))
+ymat = rbinom2.rho(n=nn, mu1=0.8, rho=myrho, exch=TRUE)
+(mytab <- table(ymat[,1], ymat[,2]))
+fit = vglm(ymat ~ 1, binom2.rho(exch=TRUE))
+coef(fit, matrix=TRUE)
+
+# Example 2
+x = sort(runif(nn))
+mu1 = probit(-2+4*x, inverse=TRUE)
+mu2 = probit(-1+3*x, inverse=TRUE)
+dmat = dbinom2.rho(mu1=mu1, mu2=mu2, rho=myrho)
+ymat = rbinom2.rho(n=nn, mu1=mu1, mu2=mu2, rho=myrho)
+fit2 = vglm(ymat ~ x, binom2.rho)
+coef(fit2, matrix=TRUE)
+\dontrun{
+matplot(x, dmat, lty=1:4, col=1:4, type="l", main="Joint probabilities",
+        ylim=0:1, lwd=2, ylab="Probability")
+legend(x=0.25, y=0.9, lty=1:4, col=1:4, lwd=2,
+       legend=c("1 = (y1=0, y2=0)", "2 = (y1=0, y2=1)",
+                "3 = (y1=1, y2=0)", "4 = (y1=1, y2=1)"))
+}
+}
+\keyword{distribution}
+
+
diff --git a/man/binomialff.Rd b/man/binomialff.Rd
index 3fa4ab1..fc27285 100644
--- a/man/binomialff.Rd
+++ b/man/binomialff.Rd
@@ -156,12 +156,10 @@ quasibinomialff(link="probit")
 data(hunua)
 fit = vgam(agaaus ~ poly(altitude, 2), binomialff(link=cloglog), hunua)
 \dontrun{
-attach(hunua)
-plot(altitude, agaaus, col="blue", ylab="P(agaaus=1)",
-     main="Presence/absence of Agathis australis", las=1)
-o = order(altitude)
-lines(altitude[o], fitted(fit)[o], col="red", lwd=2)
-detach(hunua)
+with(hunua, plot(altitude, agaaus, col="blue", ylab="P(agaaus=1)",
+                 main="Presence/absence of Agathis australis", las=1))
+o = with(hunua, order(altitude))
+with(hunua, lines(altitude[o], fitted(fit)[o], col="red", lwd=2))
 }
 }
 \keyword{models}
diff --git a/man/bisa.Rd b/man/bisa.Rd
index 264db75..f8ea790 100644
--- a/man/bisa.Rd
+++ b/man/bisa.Rd
@@ -54,7 +54,7 @@ bisa(lshape = "loge", lscale = "loge",
         F(y;a,k) = pnorm[xi(y/b)/a] }
   where \eqn{\Phi(\cdot)}{pnorm()} is the 
   cumulative distribution function of a standard normal
-  (see \code{\link[stats]{pnorm}}),
+  (see \code{\link[stats:Normal]{pnorm}}),
   \eqn{\xi(t) = \sqrt{t} - 1 / \sqrt{t}}{xi(t) = t^(0.5) - t^(-0.5)},
   \eqn{y > 0},
   \eqn{a>0} is the shape parameter,
diff --git a/man/bminz.Rd b/man/bminz.Rd
index b7b5d77..6eb1a3c 100644
--- a/man/bminz.Rd
+++ b/man/bminz.Rd
@@ -39,9 +39,8 @@ Health Study: design and baseline findings.
 \examples{
 \dontrun{
 data(bminz)
-attach(bminz); plot(age, BMI, col="blue"); detach(bminz)
-
-fit = vgam(BMI ~ s(age, df=c(2,4,2)), fam=lms.yjn, data=bminz, tr=TRUE)
+with(bminz, plot(age, BMI, col="blue"))
+fit = vgam(BMI ~ s(age, df=c(2,4,2)), fam=lms.yjn, bminz, tr=TRUE)
 qtplot(fit, pcol="blue", tcol="brown", lcol="brown")
 }
 }
diff --git a/man/brat.Rd b/man/brat.Rd
index 5df3a16..bcf5588 100644
--- a/man/brat.Rd
+++ b/man/brat.Rd
@@ -63,7 +63,7 @@ Citation patterns in the journals of statistics and probability.
 \emph{Statistical Science},
 \bold{9}, 94--108.
 
-The \code{BradleyTerry} package has more comprehensive capabilities
+The \pkg{BradleyTerry} package has more comprehensive capabilities
 than this function.
 }
 \author{ T. W. Yee }
diff --git a/man/calibrate.Rd b/man/calibrate.Rd
index 895bbeb..1294758 100644
--- a/man/calibrate.Rd
+++ b/man/calibrate.Rd
@@ -55,6 +55,7 @@ calibrate(object, ...)
 }
 
 \examples{
+\dontrun{
 data(hspider)
 hspider[,1:6] = scale(hspider[,1:6]) # Standardized environmental vars
 set.seed(123)
@@ -68,7 +69,6 @@ p1 = cao(cbind(Pardlugu, Pardmont, Pardnigr, Pardpull, Zoraspin) ~
 siteNos = 1:2  # Calibrate these sites
 cp1 = calibrate(p1, new=data.frame(p1 at y[siteNos,]), trace=TRUE)
 
-\dontrun{
 # Graphically compare the actual site scores with their calibrated values
 persp(p1, main="Solid=actual, dashed=calibrated site scores",
       label=TRUE, col="blue", las=1)
diff --git a/man/cao.Rd b/man/cao.Rd
index a8b409b..cf20149 100644
--- a/man/cao.Rd
+++ b/man/cao.Rd
@@ -246,14 +246,18 @@ Constrained additive ordination.
 
 }
 \section{Warning }{
+  CAO is very costly to compute. With version 0.7-8 it took 28 minutes on 
+  a fast machine. I hope to look at ways of speeding things up in the
+  future.
+
   CAO models present a difficult optimization problem, partly because the
-  log-likelihood function contains many local solutions.  To obtain the
+  log-likelihood function contains many local solutions. To obtain the
   (global) solution the user is advised to try many initial values. This
   can be done by setting \code{Bestof} some appropriate value (see
   \code{\link{cao.control}}). Trying many initial values becomes
   progressively more important as the nonlinear degrees of freedom of
   the smooths increase. Use \code{\link[base:Random]{set.seed}} to make your
-  results reproducible.  
+  results reproducible.
 
 % The code is a little fragile at this stage, so the function might
 % hang/lock up in the microsoft Windows version.
@@ -283,6 +287,7 @@ Constrained additive ordination.
 } 
 
 \examples{
+\dontrun{
 data(hspider)
 hspider[,1:6] = scale(hspider[,1:6]) # Standardized environmental vars
 set.seed(149)
@@ -297,7 +302,6 @@ sort(ap1 at misc$deviance.Bestof) # A history of all the iterations
 Coef(ap1)
 ccoef(ap1)
 
-\dontrun{
 par(mfrow=c(2,2))
 plot(ap1)   # All the curves are unimodal; some quite symmetric
 
diff --git a/man/chest.Rd b/man/chest.Rd
index bb79118..552ad11 100644
--- a/man/chest.Rd
+++ b/man/chest.Rd
@@ -41,3 +41,5 @@ plot(fit, which.cf=2, se=TRUE)
 }
 }
 \keyword{datasets}
+
+
diff --git a/man/cqo.Rd b/man/cqo.Rd
index 50d1bca..2b7d240 100644
--- a/man/cqo.Rd
+++ b/man/cqo.Rd
@@ -420,7 +420,7 @@ if(deviance(p1) > 1177) stop("suboptimal fit obtained")
 S = ncol(p1 at y) # Number of species
 clr = (1:(S+1))[-7] # omits yellow
 lvplot(p1, y=TRUE, lcol=clr, pch=1:S, pcol=clr, las=1) # ordination diagram
-legend("topright", leg=dimnames(p1 at y)[[2]], col=clr,
+legend("topright", leg=colnames(p1 at y), col=clr,
        pch=1:S, merge=TRUE, bty="n", lty=1:S, lwd=2)
 }
 (cp = Coef(p1))
@@ -482,5 +482,5 @@ cbind(truth=attr(mydata, "ccoefficients"), fitted=ccoef(b1))
 \keyword{models}
 \keyword{regression}
 
-%legend("topright", x=1, y=135, leg=dimnames(p1 at y)[[2]], col=clr,
+%legend("topright", x=1, y=135, leg=colnames(p1 at y), col=clr,
 %       pch=1:S, merge=TRUE, bty="n", lty=1:S, lwd=2)
diff --git a/man/cumulative.Rd b/man/cumulative.Rd
index ad6cb4e..e531423 100644
--- a/man/cumulative.Rd
+++ b/man/cumulative.Rd
@@ -5,7 +5,7 @@
 \title{ Ordinal Regression with Cumulative Probabilities }
 \description{
   Fits a cumulative logit/probit/cloglog/cauchit/...
-  regression model to an ordered (preferably) factor response. 
+  regression model to a (preferably ordered) factor response. 
 
 }
 \usage{
@@ -43,6 +43,7 @@ scumulative(link="logit", earg = list(),
   \item{parallel}{
   A logical or formula specifying which terms have
   equal/unequal coefficients.
+  See below for more information about the parallelism assumption.
 
   }
   \item{sparallel}{
@@ -107,8 +108,8 @@ scumulative(link="logit", earg = list(),
 
   In almost all the literature, the constraint matrices associated
   with this family of models are known. For example, setting
-  \code{parallel=TRUE} will make all constraint matrices (except for
-  the intercept) equal to a vector of \eqn{M} 1's.
+  \code{parallel=TRUE} will make all constraint matrices
+  (except for the intercept) equal to a vector of \eqn{M} 1's.
   If the constraint matrices are equal, unknown and to be estimated, then
   this can be achieved by fitting the model as a
   reduced-rank vector generalized
@@ -162,6 +163,11 @@ contains further information and examples.
   are all positive), or a factor. In both cases, the \code{y} slot
   returned by \code{vglm}/\code{vgam}/\code{rrvglm} is the matrix
   of counts.
+  The formula must contain an intercept term.
+  Other \pkg{VGAM} family functions for an ordinal response include
+  \code{\link{acat}},
+  \code{\link{cratio}},
+  \code{\link{sratio}}.
 
   For a nominal (unordered) factor response, the multinomial
   logit model (\code{\link{multinomial}}) is more appropriate.
@@ -185,9 +191,18 @@ contains further information and examples.
   the regression coefficients for \code{x1} and \code{x2} to be
   equal; those of the intercepts and \code{x3} would be different.
 
-  In the future, this family function may be renamed to
-  ``\code{cups}'' (for \bold{cu}mulative \bold{p}robabilitie\bold{s})
-  or ``\code{cute}'' (for \bold{cu}mulative probabili\bold{t}i\bold{e}s).
+  If the data is inputted in \emph{long} format
+  (not \emph{wide} format, as in \code{\link{pneumo}} below)
+  then good initial values are needed; use
+  \code{mustart},
+  \code{coefstart} and/or 
+  \code{etatstart}.
+  See the example below.
+
+
+% In the future, this family function may be renamed to
+% ``\code{cups}'' (for \bold{cu}mulative \bold{p}robabilitie\bold{s})
+% or ``\code{cute}'' (for \bold{cu}mulative probabili\bold{t}i\bold{e}s).
 
 % Please let me know if you strongly agree or disagree about this.
 
@@ -204,6 +219,7 @@ contains further information and examples.
   \code{\link{sratio}},
   \code{\link{multinomial}},
   \code{\link{pneumo}},
+  \code{\link{Links}},
   \code{\link{logit}},
   \code{\link{probit}},
   \code{\link{cloglog}},
@@ -239,7 +255,7 @@ plot(fit2, se=TRUE, overlay=TRUE, lcol=1:2, scol=1:2)
 
 # A factor() version of fit ----------------------------------
 nobs = round(fit at y * c(weights(fit, type="prior")))
-sumnobs = apply(nobs, 2, sum)
+sumnobs = colSums(nobs) # apply(nobs, 2, sum)
 mydat = data.frame(
     response = ordered(c(rep("normal", times=sumnobs["normal"]),
                          rep("mild", times=sumnobs["mild"]),
@@ -250,6 +266,21 @@ mydat = data.frame(
             with(pneumo, rep(let, times=nobs[,"severe"]))))
 (fit4 = vglm(response ~ LET, data=mydat,
              cumulative(parallel=TRUE, reverse=TRUE), trace=TRUE))
+
+
+# Long format (cf. wide format above) ----------------------------------
+longdata = data.frame(symptoms=ordered(rep(rep(colnames(nobs), nrow(nobs)),
+                                           times=c(t(nobs))),
+                                       levels = colnames(nobs)),
+                      let = rep(rep(with(pneumo, let), each=ncol(nobs)),
+                                times=c(t(nobs))))
+with(longdata, table(let, symptoms)) # check it; should be same as pneumo
+mymustart = matrix(sumnobs / sum(sumnobs),
+                   nrow(longdata), ncol(nobs), byrow=TRUE)
+fit.long = vglm(symptoms ~ let,
+                fam = cumulative(parallel=TRUE, reverse=TRUE),
+                mustart=mymustart, data = longdata, trace=TRUE)
+coef(fit.long, matrix=TRUE) # Should be same as coef(fit, matrix=TRUE)
 }
 \keyword{models}
 \keyword{regression}
diff --git a/man/enzyme.Rd b/man/enzyme.Rd
index d4bb099..99ad822 100644
--- a/man/enzyme.Rd
+++ b/man/enzyme.Rd
@@ -32,14 +32,8 @@ Watts, D. G. (1981)
 }
 \examples{
 data(enzyme)
-fit = vglm(velocity ~ 1, micmen, enzyme, trace = TRUE, crit = "c",
-           regressor = enzyme$conc)
-\dontrun{attach(enzyme)
-plot(conc, velocity, xlab="concentration", las=1, main="enzyme data")
-lines(conc, fitted(fit), col="blue")
-detach(enzyme)
-}
-
+fit = vglm(velocity ~ 1, micmen, data=enzyme, trace = TRUE,
+           form2 = ~ conc - 1, crit = "crit")
 summary(fit)
 }
 \keyword{datasets}
diff --git a/man/erf.Rd b/man/erf.Rd
index 05a959b..e0d3c82 100644
--- a/man/erf.Rd
+++ b/man/erf.Rd
@@ -16,7 +16,7 @@ erf(x)
   \eqn{Erf(x)} is defined as
   \deqn{Erf(x) = \frac{2}{\sqrt{\pi}} \int_0^x \exp(-t^2) dt}{%
     Erf(x) = (2/sqrt(pi)) int_0^x exp(-t^2) dt}
-  so that it is closely related to \code{\link[stats]{pnorm}}.
+  so that it is closely related to \code{\link[stats:Normal]{pnorm}}.
 }
 \value{
   Returns the value of the function evaluated at \code{x}.
@@ -38,7 +38,10 @@ New York: Dover Publications Inc.
   as \eqn{1-erf(x)}, and is implemented by \code{erfc}.
 }
 
-\seealso{ \code{\link[stats]{pnorm}}. }
+\seealso{
+  \code{\link[stats:Normal]{pnorm}}.
+}
+
 \examples{
 \dontrun{
 x = seq(-3, 3, len=200)
diff --git a/man/fitted.vlm.Rd b/man/fitted.vlm.Rd
index d2eba00..0f134ba 100644
--- a/man/fitted.vlm.Rd
+++ b/man/fitted.vlm.Rd
@@ -10,13 +10,13 @@
 
 }
 \usage{
-fitted.vlm(object, matrix = TRUE, ...)
+fitted.vlm(object, matrix.arg = TRUE, ...)
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
   \item{object}{ a model object that inherits from a VLM.
     }
-  \item{matrix}{ Logical. Return the answer as a matrix?
+  \item{matrix.arg}{ Logical. Return the answer as a matrix?
   If \code{FALSE} then it will be a vector. }
   \item{\dots}{ Currently unused. }
 }
diff --git a/man/fnormUC.Rd b/man/fnormUC.Rd
index 6d1d13c..e24e6dc 100644
--- a/man/fnormUC.Rd
+++ b/man/fnormUC.Rd
@@ -21,7 +21,7 @@ rfnorm(n, mean=0, sd=1, a1=1, a2=1)
   \item{p}{vector of probabilities.}
   \item{n}{number of observations.
     Must be a positive integer of length 1.}
-  \item{mean, sd}{ see \code{\link[stats]{rnorm}}. }
+  \item{mean, sd}{ see \code{\link[stats:Normal]{rnorm}}. }
   \item{a1, a2}{ see \code{\link{fnormal1}}. }
   \item{\ldots}{
   Arguments that can be passed into \code{\link[stats]{uniroot}}.
diff --git a/man/fnormal1.Rd b/man/fnormal1.Rd
index 0a492c0..fdf86ae 100644
--- a/man/fnormal1.Rd
+++ b/man/fnormal1.Rd
@@ -73,7 +73,7 @@ fnormal1(lmean="identity", lsd="loge", emean=list(), esd=list(),
                mu*[1-2*Phi(-mu/sigma)] }
   and these are returned as the fitted values.
   Here, \eqn{\Phi()}{Phi} is the cumulative distribution function of a
-  standard normal (\code{\link[stats]{pnorm}}).
+  standard normal (\code{\link[stats:Normal]{pnorm}}).
 
 }
 \value{
@@ -108,7 +108,7 @@ fnormal1(lmean="identity", lsd="loge", emean=list(), esd=list(),
 \seealso{ 
     \code{\link{rfnorm}},
     \code{\link{normal1}},
-    \code{\link[stats]{dnorm}},
+    \code{\link[stats:Normal]{dnorm}},
     \code{\link{skewnormal1}}.
 }
 
diff --git a/man/gev.Rd b/man/gev.Rd
index cca2060..11e5467 100644
--- a/man/gev.Rd
+++ b/man/gev.Rd
@@ -255,11 +255,9 @@ fitted(fit1)[1:4,]
 par(mfrow=c(1,2), las=1)
 plot(fit1, se=TRUE, lcol="blue", scol="forestgreen",
      main="Fitted mu(year) function (centered)")
-attach(venice)
-matplot(year, y[,1:2], ylab="Sea level (cm)", col=1:2,
-        main="Highest 2 annual sealevels and fitted 95 percentile")
-lines(year, fitted(fit1)[,1], lty="dashed", col="blue")
-detach(venice)
+with(venice, matplot(year, y[,1:2], ylab="Sea level (cm)", col=1:2,
+     main="Highest 2 annual sealevels + fitted 95 percentile"))
+with(venice, lines(year, fitted(fit1)[,1], lty="dashed", col="blue"))
 }
 
 
diff --git a/man/grc.Rd b/man/grc.Rd
index 42b8faf..13a81f4 100644
--- a/man/grc.Rd
+++ b/man/grc.Rd
@@ -18,8 +18,8 @@ grc(y, Rank = 1, Index.corner = 2:(1 + Rank),
   Note that \code{y} must be at least 3 by 3. 
   }
   \item{Rank}{
-  An integer in the range 
-  {1,\ldots,\code{min(nrow(y), ncol(y))}}. 
+  An integer from the set
+  \{1,\ldots,\code{min(nrow(y), ncol(y))}\}.
   This is the dimension of the fit.
 
   }
@@ -31,7 +31,7 @@ grc(y, Rank = 1, Index.corner = 2:(1 + Rank),
 
   }
   \item{Structural.zero}{ 
-  An integer in the range {1,\ldots,\code{min(nrow(y), ncol(y))}},
+  An integer from the set \{1,\ldots,\code{min(nrow(y), ncol(y))}\},
   specifying the row that is used as the structural zero.
   }
   \item{summary.arg}{
diff --git a/man/lirat.Rd b/man/lirat.Rd
index 1f5c95e..c84925e 100644
--- a/man/lirat.Rd
+++ b/man/lirat.Rd
@@ -57,11 +57,9 @@ are accounted for.
 \examples{
 \dontrun{
 data(lirat)
-attach(lirat)
 # cf. Figure 3 of Moore and Tsiatis (1991)
-plot(hb, R/N, pch=as.character(grp), col=grp, las=1,
-     xlab="Hemoglobin level", ylab="Proportion Dead")
-detach(lirat)
+with(lirat, plot(hb, R/N, pch=as.character(grp), col=grp, las=1,
+                 xlab="Hemoglobin level", ylab="Proportion Dead"))
 }
 }
 \keyword{datasets}
diff --git a/man/lms.bcg.Rd b/man/lms.bcg.Rd
index 08ca629..ebd1491 100644
--- a/man/lms.bcg.Rd
+++ b/man/lms.bcg.Rd
@@ -7,11 +7,11 @@
   to the gamma distribution.
 }
 \usage{
-lms.bcg(percentiles = c(25, 50, 75), zero = NULL, 
-        link.mu="identity", link.sigma = "loge",
-        emu=list(), esigma=list(),
+lms.bcg(percentiles = c(25, 50, 75), zero = c(1,3), 
+        llambda="identity", lmu="identity", lsigma = "loge",
+        elambda=list(), emu=list(), esigma=list(),
         dfmu.init=4, dfsigma.init=2,
-        init.lambda = 1, init.sigma = NULL)
+        ilambda = 1, isigma = NULL)
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
@@ -30,7 +30,11 @@ lms.bcg(percentiles = c(25, 50, 75), zero = NULL,
   functions of the covariates.
 
   }
-  \item{link.mu}{
+  \item{llambda}{
+  Parameter link function applied to the first linear/additive predictor.
+
+  }
+  \item{lmu}{
   Parameter link function applied to the second linear/additive predictor.
 
 % The natural log is offered because mu
@@ -39,14 +43,14 @@ lms.bcg(percentiles = c(25, 50, 75), zero = NULL,
 % (it is something similar to the running median).
 
   }
-  \item{link.sigma}{
+  \item{lsigma}{
   Parameter link function applied to the third linear/additive predictor.
   See \code{\link{Links}} for more choices.
 
 % It is the natural log by default because sigma is positive.
 
   }
-  \item{emu, esigma}{
+  \item{elambda, emu, esigma}{
   List. Extra argument for each of the links.
   See \code{earg} in \code{\link{Links}} for general information.
 
@@ -65,12 +69,12 @@ lms.bcg(percentiles = c(25, 50, 75), zero = NULL,
   using some other algorithm.
 
   }
-  \item{init.lambda}{
+  \item{ilambda}{
   Initial value for lambda.
   If necessary, it is recycled to be a vector of length \eqn{n}. 
 
   }
-  \item{init.sigma}{
+  \item{isigma}{
   Optional initial value for sigma.
   If necessary, it is recycled to be a vector of length \eqn{n}.
   The default value, \code{NULL}, means an initial value is computed 
@@ -114,8 +118,8 @@ The  LMS-Yeo-Johnson-normal method can handle
 both positive and negative values.
 
 In general, the lambda and sigma functions should be more smoother
-than the mean function. Often setting \code{zero=1} or
-\code{zero=3} or \code{zero=c(1,3)} is a good idea.
+than the mean function.
+Having \code{zero=1}, \code{zero=3} or \code{zero=c(1,3)} is often a good idea.
 See the example below.
 
 While it is usual to regress the response against a single
@@ -164,7 +168,7 @@ plotvgam(fit, se=TRUE) # Plot mu function (only)
 # Difficult to get a model that converges
 # Here, we prematurely stop iterations because it fails near the solution
 fit = vgam(BMI ~ s(age, df=c(4,2)), maxit=4,
-           fam=lms.bcg(zero=1, init.lam=3), data=bminz, tr=TRUE)
+           fam=lms.bcg(zero=1, ilam=3), data=bminz, tr=TRUE)
 summary(fit)
 predict(fit)[1:3,]
 fitted(fit)[1:3,]
diff --git a/man/lms.bcn.Rd b/man/lms.bcn.Rd
index e5972b4..b5c48cc 100644
--- a/man/lms.bcn.Rd
+++ b/man/lms.bcn.Rd
@@ -7,11 +7,11 @@
   to normality.
 }
 \usage{
-lms.bcn(percentiles = c(25, 50, 75), zero = NULL, 
-        link.mu="identity", link.sigma = "loge",
-        emu=list(), esigma=list(),
+lms.bcn(percentiles = c(25, 50, 75), zero = c(1,3), 
+        llambda="identity", lmu="identity", lsigma = "loge",
+        elambda=list(), emu=list(), esigma=list(),
         dfmu.init=4, dfsigma.init=2,
-        init.lambda = 1, init.sigma = NULL)
+        ilambda = 1, isigma = NULL)
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
@@ -30,7 +30,12 @@ lms.bcn(percentiles = c(25, 50, 75), zero = NULL,
   functions of the covariates.
 
   }
-  \item{link.mu}{
+  \item{llambda}{
+  Parameter link function applied to the first linear/additive predictor.
+  See \code{\link{Links}} for more choices.
+
+  }
+  \item{lmu}{
   Parameter link function applied to the second linear/additive predictor.
   See \code{\link{Links}} for more choices.
 
@@ -39,14 +44,14 @@ lms.bcn(percentiles = c(25, 50, 75), zero = NULL,
 % (it is something similar to the running median).
 
   }
-  \item{link.sigma}{
+  \item{lsigma}{
   Parameter link function applied to the third linear/additive predictor.
   See \code{\link{Links}} for more choices.
 
 % It is the natural log by default because sigma is positive.
 
   }
-  \item{emu, esigma}{
+  \item{elambda, emu, esigma}{
   List. Extra argument for each of the links.
   See \code{earg} in \code{\link{Links}} for general information.
 
@@ -65,12 +70,12 @@ lms.bcn(percentiles = c(25, 50, 75), zero = NULL,
   using some other algorithm.
 
   }
-  \item{init.lambda}{
+  \item{ilambda}{
   Initial value for lambda.
   If necessary, it is recycled to be a vector of length \eqn{n}.
 
   }
-  \item{init.sigma}{
+  \item{isigma}{
   Optional initial value for sigma.
   If necessary, it is recycled to be a vector of length \eqn{n}.
   The default value, \code{NULL}, means an initial value is computed
@@ -115,8 +120,8 @@ The  LMS-Yeo-Johnson-normal method can handle
 both positive and negative values.
 
 In general, the lambda and sigma functions should be more smoother
-than the mean function. Often setting \code{zero=1} or
-\code{zero=3} or \code{zero=c(1,3)} is a good idea.
+than the mean function.
+Having \code{zero=1}, \code{zero=3} or \code{zero=c(1,3)} is often a good idea.
 See the example below.
 
 While it is usual to regress the response against a single
diff --git a/man/lms.yjn.Rd b/man/lms.yjn.Rd
index 256e96c..ed63731 100644
--- a/man/lms.yjn.Rd
+++ b/man/lms.yjn.Rd
@@ -8,15 +8,15 @@
   to normality.
 }
 \usage{
-lms.yjn(percentiles = c(25, 50, 75), zero = NULL,
-        link.lambda = "identity", link.sigma = "loge", elambda=list(),
-        esigma=list(), dfmu.init=4, dfsigma.init=2, init.lambda = 1,
-        init.sigma = NULL, rule = c(10, 5), yoffset = NULL, diagW=FALSE,
+lms.yjn(percentiles = c(25, 50, 75), zero = c(1,3),
+        llambda = "identity", lsigma = "loge", elambda=list(),
+        esigma=list(), dfmu.init=4, dfsigma.init=2, ilambda = 1,
+        isigma = NULL, rule = c(10, 5), yoffset = NULL, diagW=FALSE,
         iters.diagW=6)
-lms.yjn2(percentiles=c(25,50,75), zero=NULL,
-         link.lambda="identity", link.mu = "identity", link.sigma="loge",
+lms.yjn2(percentiles=c(25,50,75), zero=c(1,3),
+         llambda="identity", lmu = "identity", lsigma="loge",
          elambda=list(), emu = list(), esigma=list(), dfmu.init=4,
-         dfsigma.init=2, init.lambda=1.0, init.sigma=NULL, yoffset=NULL,
+         dfsigma.init=2, ilambda=1.0, isigma=NULL, yoffset=NULL,
          nsimEIM=250)
 }
 %- maybe also 'usage' for other objects documented here.
@@ -36,9 +36,9 @@ lms.yjn2(percentiles=c(25,50,75), zero=NULL,
   functions of the covariates.
 
   } 
-  \item{link.lambda, link.mu, link.sigma}{
+  \item{llambda, lmu, lsigma}{
   Parameter link function applied to the first, second and third
-  linear/additive predictor.
+  linear/additive predictors.
   See \code{\link{Links}} for more choices.
 
   }
@@ -60,12 +60,12 @@ lms.yjn2(percentiles=c(25,50,75), zero=NULL,
   using some other algorithm.
 
   }
-  \item{init.lambda}{
+  \item{ilambda}{
   Initial value for lambda.
   If necessary, it is recycled to be a vector of length \eqn{n}.
 
   }
-  \item{init.sigma}{
+  \item{isigma}{
   Optional initial value for sigma.
   If necessary, it is recycled to be a vector of length \eqn{n}.
   The default value, \code{NULL}, means an initial value is computed
@@ -158,8 +158,8 @@ methods only handle a positive response because the
 Box-Cox transformation cannot handle negative values.
 
 In general, the lambda and sigma functions should be more smoother
-than the mean function. Often setting \code{zero=1} or
-\code{zero=3} or \code{zero=c(1,3)} is a good idea.
+than the mean function.
+Having \code{zero=1}, \code{zero=3} or \code{zero=c(1,3)} is often a good idea.
 See the example below.
 
 While it is usual to regress the response against a single
@@ -213,10 +213,9 @@ a = deplot(fit, x0=20, y=ygrid, xlab="BMI", col="black",
 a
 a = deplot(fit, x0=42, y=ygrid, add=TRUE, llty=2, col="red")
 a = deplot(fit, x0=55, y=ygrid, add=TRUE, llty=4, col="blue", Attach=TRUE)
-a at post$deplot  # Contains density function values
+with(a at post, deplot) # Contains density function values; == a at post$deplot
 }
 }
 \keyword{models}
 \keyword{regression}
 
-%fit = vgam(BMI ~ s(age, df=c(2,4,2)), fam=lms.yjn, data=bminz, tr=TRUE)
diff --git a/man/logUC.Rd b/man/logUC.Rd
index 69ba67b..d439962 100644
--- a/man/logUC.Rd
+++ b/man/logUC.Rd
@@ -2,7 +2,7 @@
 \alias{Log}
 \alias{dlog}
 \alias{plog}
-\alias{qlog}
+% \alias{qlog}
 \alias{rlog}
 \title{ Logarithmic Distribution }
 \description{
@@ -13,7 +13,7 @@
 
 }
 \usage{
-dlog(x, prob)
+dlog(x, prob, log=FALSE)
 plog(q, prob, log.p=FALSE)
 % qlog(p, prob)
 rlog(n, prob, Smallno=1.0e-6)
@@ -33,9 +33,10 @@ rlog(n, prob, Smallno=1.0e-6)
    For \code{rlog()} this parameter must be of length 1.
 
   }
-  \item{log.p}{
+  \item{log, log.p}{
   Logical.
-  If \code{TRUE} then all probabilities \code{p} are given as \code{log(p)}.
+  If \code{log.p=TRUE} then all probabilities \code{p} are
+  given as \code{log(p)}.
 
   }
   \item{Smallno}{
@@ -67,6 +68,12 @@ New York: Wiley-Interscience, Third edition.
 \note{ 
    Given some response data, the \pkg{VGAM} family function
    \code{\link{logff}} estimates the parameter \code{prob}.
+  For \code{plog()}, if argument \code{q} contains large values
+  and/or \code{q} is long in length
+  then the memory requirements may be very high.
+  Very large values in \code{q} are handled by an approximation by
+  Owen (1965).
+
 }
 
 \seealso{
diff --git a/man/logff.Rd b/man/logff.Rd
index 2ed98a3..79d74f7 100644
--- a/man/logff.Rd
+++ b/man/logff.Rd
@@ -3,7 +3,7 @@
 %- Also NEED an '\alias' for EACH other topic documented here.
 \title{ Logarithmic Distribution  }
 \description{
- Estimating the parameter of the logarithmic distribution.
+ Estimating the (single) parameter of the logarithmic distribution.
 }
 \usage{
 logff(link = "logit", earg=list(), init.c = NULL)
@@ -68,6 +68,10 @@ contains further information and examples.
   In the \pkg{VGAM} library, a link function with option
   \code{\link{loge}} corresponds to this.
 
+  The logarithmic distribution is sometimes confused with the log-series
+  distribution. The latter was used by Fisher et al. for species abundance
+  data, and has two parameters.
+
 }
 
 \seealso{ 
diff --git a/man/loglinb2.Rd b/man/loglinb2.Rd
index 7eaadfd..28cc52d 100644
--- a/man/loglinb2.Rd
+++ b/man/loglinb2.Rd
@@ -84,15 +84,16 @@ temp = vglm(cbind(nBnW,nBW,BnW,BW) ~ age, binom2.or, coalminers)
 counts = round(c(weights(temp, type="prior")) * temp at y)
 
 # Create a n x 2 matrix response for loglinb2()
-fred = matrix(c(0,0, 0,1, 1,0, 1,1), 4, 2, byrow=TRUE)
-yy = kronecker(matrix(1, nrow(counts), 1), fred)
-wt = c(t(counts))
-age = rep(coalminers$age, rep(4, length(coalminers$age)))
-yy = yy[wt>0,]
-age = age[wt>0]
-wt = wt[wt>0]
+# bwmat = matrix(c(0,0, 0,1, 1,0, 1,1), 4, 2, byrow=TRUE)
+bwmat = cbind(bln=c(0,0,1,1), wheeze=c(0,1,0,1))
+matof1 = matrix(1, nrow(counts), 1)
+newminers = data.frame(bln = kronecker(matof1, bwmat[,1]),
+                       wheeze = kronecker(matof1, bwmat[,2]),
+                       wt = c(t(counts)),
+                       age = with(coalminers, rep(age, rep(4, length(age)))))
+newminers = newminers[with(newminers, wt) > 0,]
 
-fit = vglm(yy ~ age, loglinb2, trace=TRUE, wei=wt)
+fit = vglm(cbind(bln,wheeze) ~ age, loglinb2, wei=wt, data=newminers)
 coef(fit, mat=TRUE)    # Same! (at least for the log odds-ratio) 
 summary(fit)
 
@@ -102,5 +103,3 @@ summary(fit)
 \keyword{models}
 \keyword{regression}
 
-%coalminers$age = (coalminers$age - 42) / 5
-%counts = round(temp at prior.weights * temp at y)
diff --git a/man/lqnorm.Rd b/man/lqnorm.Rd
index 407aa5f..90c3613 100644
--- a/man/lqnorm.Rd
+++ b/man/lqnorm.Rd
@@ -105,11 +105,11 @@ lqnorm(qpower=2, link="identity", earg=list(),
 
 \examples{
 set.seed(123)
-d = data.frame(x = sort(runif(n <- 100)))
+d = data.frame(x = sort(runif(n <- 10 )))
 realfun = function(x) 4 + 5*x
 d = transform(d, y = realfun(x) + rnorm(n, sd=exp(1)))
-d$y[1] = 4 * d$y[1]  # Outlier
-d$x[1] = -1 # Outlier
+# Make the first observation an outlier
+d = transform(d, y = c(4*y[1], y[-1]), x=c(-1, x[-1]))
 fit = vglm(y ~ x, fam = lqnorm(qpower=1.2), data=d)
 coef(fit, matrix=TRUE)
 fitted(fit)[1:4,]
diff --git a/man/lvplot.rrvglm.Rd b/man/lvplot.rrvglm.Rd
index 7407647..f48fad7 100644
--- a/man/lvplot.rrvglm.Rd
+++ b/man/lvplot.rrvglm.Rd
@@ -20,13 +20,13 @@ lvplot.rrvglm(object,
               object at misc$predictors.names else paste("LP", 1:M, sep = ""), 
               Aadj = par()$adj, Acex = par()$cex, Acol = par()$col, 
               Apch = NULL, 
-              Clabels = dimnames(Cmat)[[1]], Cadj = par()$adj, 
+              Clabels = rownames(Cmat), Cadj = par()$adj, 
               Ccex = par()$cex, Ccol = par()$col, Clty = par()$lty, 
               Clwd = par()$lwd, 
               chull.arg = FALSE, ccex = par()$cex, ccol = par()$col, 
               clty = par()$lty, clwd = par()$lwd, 
               spch = NULL, scex = par()$cex, scol = par()$col,
-              slabels = dimnames(x2mat)[[1]], ...)
+              slabels = rownames(x2mat), ...)
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
diff --git a/man/micmen.Rd b/man/micmen.Rd
index 7db602a..1a7aebe 100644
--- a/man/micmen.Rd
+++ b/man/micmen.Rd
@@ -54,8 +54,8 @@ micmen(rpar = 0.001, divisor = 10, init1 = NULL, init2 = NULL,
 }
 \details{
   The Michaelis-Menten Model is given by
-  \deqn{E(Y_i) = (\theta_1 x_i) / (\theta_2 + x_i)}{%
-      E(Y_i) = theta1 * x_i / (theta2 + x_i)}
+  \deqn{E(Y_i) = (\theta_1 u_i) / (\theta_2 + u_i)}{%
+      E(Y_i) = theta1 * u_i / (theta2 + u_i)}
   where \eqn{\theta_1}{theta1} and \eqn{\theta_2}{theta2}
   are the two parameters.
 
@@ -92,11 +92,15 @@ micmen(rpar = 0.001, divisor = 10, init1 = NULL, init2 = NULL,
 }
 \author{ T. W. Yee }
 \note{
-  The regressor values \eqn{x_i}{x_i} are inputted as a vector in the
-  \code{regressor} argument.
-  To predict the response at new values of \eqn{x_i}{x_i} one must assign
-  the \code{@extra$uvec} slot in the fitted object these values, e.g.,
-  see the example below.
+  The regressor values \eqn{u_i}{u_i} are inputted as the RHS of
+  the \code{form2} argument.
+  It should just be a simple term; no smart prediction is used.
+  It should just a single vector so omit the intercept term.
+  The LHS is ignored.
+
+% To predict the response at new values of \eqn{u_i}{u_i} one must assign
+% the \code{@extra$uvec} slot in the fitted object these values, e.g.,
+% see the example below.
 
   Numerical problems may occur. If so, try setting some initial values
   for the parameters. In the future, several self-starting initial values
@@ -111,17 +115,17 @@ micmen(rpar = 0.001, divisor = 10, init1 = NULL, init2 = NULL,
 \examples{
 data(enzyme)
 fit = vglm(velocity ~ 1, micmen, enzyme, trace=TRUE, crit="c",
-           regressor=enzyme$conc)
+           form2 = ~ conc - 1)
 \dontrun{
-attach(enzyme)
-plot(conc, velocity, xlab="concentration", las=1, main="Enzyme data")
-lines(conc, fitted(fit), col="blue") # Join up the fitted values
-detach(enzyme)
-
-# Predict the response at other concentrations and add it to the plot
-newdata = new=data.frame(concentration=seq(0, 2, len=200))
-fit at extra$uvec = newdata$concentration
-lines(newdata$conc, predict(fit, new=newdata, type="res"), col="red")
+with(enzyme, plot(conc, velocity, xlab="concentration", las=1,
+                  main="Enzyme data", ylim=c(0,max(velocity)),
+                  xlim=c(0,max(conc))))
+with(enzyme, points(conc, fitted(fit), col="blue", pch="+"))
+
+# This predicts the response at a finer grid:
+newenzyme = data.frame(conc = with(enzyme, seq(0, max(conc),len=200)))
+with(newenzyme, lines(conc, predict(fit, newenzyme, type="response"),
+                      col="red"))
 }
 summary(fit)
 }
diff --git a/man/mix2exp.Rd b/man/mix2exp.Rd
index 626c9aa..67431de 100644
--- a/man/mix2exp.Rd
+++ b/man/mix2exp.Rd
@@ -135,7 +135,7 @@ round(rbind('Estimated'=Coef(fit),
             'Truth'=c(phi, lambda1, lambda2)), dig=2)
 
 \dontrun{# Plot the results
-hist(y, prob=TRUE, main="red=estimate, blue=truth")
+hist(y, prob=TRUE, main="Red=estimate, blue=truth")
 abline(v=1/Coef(fit)[c(2,3)], lty=2, col="red", lwd=2)
 abline(v=1/c(lambda1, lambda2), lty=2, col="blue", lwd=2)
 }
diff --git a/man/mix2normal1.Rd b/man/mix2normal1.Rd
index c1be543..10cd139 100644
--- a/man/mix2normal1.Rd
+++ b/man/mix2normal1.Rd
@@ -11,7 +11,7 @@
 mix2normal1(lphi="logit", lmu="identity", lsd="loge",
             ephi=list(), emu1=list(), emu2=list(), esd1=list(), esd2=list(),
             iphi=0.5, imu1=NULL, imu2=NULL, isd1=NULL, isd2=NULL,
-            qmu=c(0.2, 0.8), ESD=TRUE, nsimEIM=100, zero=1)
+            qmu=c(0.2, 0.8), equalsd=TRUE, nsimEIM=100, zero=1)
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
@@ -33,7 +33,7 @@ mix2normal1(lphi="logit", lmu="identity", lsd="loge",
   \item{ephi, emu1, emu2, esd1, esd2}{
   List. Extra argument for each of the links.
   See \code{earg} in \code{\link{Links}} for general information.
-  If \code{ESD=TRUE} then \code{esd1} must equal \code{esd2}.
+  If \code{equalsd=TRUE} then \code{esd1} must equal \code{esd2}.
 
   }
   \item{iphi}{
@@ -63,7 +63,7 @@ mix2normal1(lphi="logit", lmu="identity", lsd="loge",
     \code{\link[stats]{quantile}}.
 
   }
-  \item{ESD}{
+  \item{equalsd}{
     Logical indicating whether the two standard deviations should be 
     constrained to be equal. If \code{TRUE} then the appropriate
     constraint matrices will be used.
@@ -86,7 +86,7 @@ mix2normal1(lphi="logit", lmu="identity", lsd="loge",
 }
 }
 \details{
-  The probability function can be loosely written as 
+  The probability density function can be loosely written as 
   \deqn{f(y) = \phi \, N(\mu_1,\sigma_1) + (1-\phi) \, N(\mu_2, \sigma_2)}{%
         f(y) = phi * N(mu1, sd1) + (1-phi) * N(mu2, sd2)}
   where \eqn{\phi}{phi} is the probability an observation belongs
@@ -100,7 +100,7 @@ mix2normal1(lphi="logit", lmu="identity", lsd="loge",
   By default, the five linear/additive predictors are
   \eqn{(logit(\phi), \mu_1, \log(\sigma_1), \mu_2, \log(\sigma_2))^T}{(logit(phi),
   mu1, log(sd1), mu2, log(sd2))^T}.
-  If \code{ESD=TRUE} then \eqn{\sigma_1 = \sigma_2}{sd1=sd2} is enforced.
+  If \code{equalsd=TRUE} then \eqn{\sigma_1 = \sigma_2}{sd1=sd2} is enforced.
 
 }
 \value{
@@ -156,7 +156,7 @@ London: Chapman & Hall.
   distributions are not well separated.
   The default control argument \code{trace=TRUE} is to encourage
   monitoring convergence.
-  Having \code{ESD=TRUE} often makes the overall optimization problem
+  Having \code{equalsd=TRUE} often makes the overall optimization problem
   easier.
 
 }
@@ -176,7 +176,7 @@ sd1 = sd2 = exp(3)
 (phi = logit(-1, inverse=TRUE))
 y = ifelse(runif(n) < phi, rnorm(n, mu1, sd1), rnorm(n, mu2, sd2))
 
-fit = vglm(y ~ 1, mix2normal1(ESD=TRUE))
+fit = vglm(y ~ 1, mix2normal1(equalsd=TRUE))
 
 # Compare the results
 cf = coef(fit)
@@ -186,7 +186,7 @@ round(rbind('Estimated'=c(logit(cf[1], inv=TRUE),
 \dontrun{# Plot the results
 xx = seq(min(y), max(y), len=200)
 plot(xx, (1-phi)*dnorm(xx, mu2, sd2), type="l", xlab="y",
-     main="Red=estimate, blue=truth", col="blue")
+     main="Red=estimate, blue=truth", col="blue", ylab="Density")
 phi.est = logit(coef(fit)[1], inverse=TRUE)
 sd.est = exp(coef(fit)[3])
 lines(xx, phi*dnorm(xx, mu1, sd1), col="blue")
diff --git a/man/mix2poisson.Rd b/man/mix2poisson.Rd
index 473f2f3..7c4d95c 100644
--- a/man/mix2poisson.Rd
+++ b/man/mix2poisson.Rd
@@ -139,7 +139,8 @@ round(rbind('Estimated'=Coef(fit), 'Truth'=c(phi, mu1, mu2)), dig=2)
 
 \dontrun{# Plot the results
 ty = table(y)
-plot(names(ty), ty, type="h", main="Red=estimate, blue=truth")
+plot(names(ty), ty, type="h", main="Red=estimate, blue=truth",
+     ylab="Frequency", xlab="y")
 abline(v=Coef(fit)[-1], lty=2, col="red", lwd=2)
 abline(v=c(mu1, mu2), lty=2, col="blue", lwd=2)
 }
diff --git a/man/model.matrixvlm.Rd b/man/model.matrixvlm.Rd
index ed4c748..8e5703c 100644
--- a/man/model.matrixvlm.Rd
+++ b/man/model.matrixvlm.Rd
@@ -2,13 +2,19 @@
 \alias{model.matrixvlm}
 \title{Construct the Design Matrix of a VLM Object}
 \usage{
-model.matrixvlm(object, type=c("vlm","lm"), \dots)
+model.matrixvlm(object, type=c("vlm","lm","lm2"), \dots)
 }
 \arguments{
   \item{object}{an object of a class that inherits from the
     \emph{vector linear model} (VLM).
   }
   \item{type}{Type of design matrix returned. The first is the default. 
+  The value \code{"vlm"} is the VLM model matrix corresponding
+  to the \code{formula} argument.
+  The value \code{"lm"} is the LM model matrix corresponding
+  to the \code{formula} argument.
+  The value \code{"lm2"} is the second (LM) model matrix corresponding
+  to the \code{form2} argument.
   }
   \item{\dots}{further arguments passed to or from other methods.
     These include \code{data} (which
diff --git a/man/multinomial.Rd b/man/multinomial.Rd
index 0bfaa07..a14b703 100644
--- a/man/multinomial.Rd
+++ b/man/multinomial.Rd
@@ -6,7 +6,8 @@
   Fits a multinomial logit model to an unordered factor response.
 }
 \usage{
-multinomial(zero = NULL, parallel = FALSE, nointercept = NULL)
+multinomial(zero = NULL, parallel = FALSE, nointercept = NULL,
+            refLevel = "last")
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
@@ -32,9 +33,22 @@ multinomial(zero = NULL, parallel = FALSE, nointercept = NULL)
   The values must be from the set \{1,2,\ldots,\eqn{M}\}.
 
   }
+  \item{refLevel}{
+  Either a single positive integer or a value of a factor.
+  If an integer then it specifies which
+  column of the response matrix is the reference or baseline level.
+  The default is the last one (the \eqn{(M+1)}th one).
+  If used, this argument will be often assigned the value \code{1}.
+  If inputted as a value of a factor then beware of missing values
+  of certain levels of the factor
+  (\code{drop.unused.levels=TRUE} or
+   \code{drop.unused.levels=FALSE}).
+  See the example below.
+
+  }
 }
 \details{
-  The model can be written
+  The default model can be written
   \deqn{\eta_j = \log(P[Y=j]/ P[Y=M+1])}{%
          eta_j =  log(P[Y=j]/ P[Y=M+1])}
   where \eqn{\eta_j}{eta_j} is the \eqn{j}th linear/additive predictor.
@@ -42,6 +56,8 @@ multinomial(zero = NULL, parallel = FALSE, nointercept = NULL)
   definition.  That is, the last level of the factor, or last column of
   the response matrix, is taken as the reference level or baseline---this
   is for identifiability of the parameters.
+  The reference or baseline level can be chosen by using the
+  \code{refLevel} argument.
 
   In almost all the literature, the constraint matrices associated
   with this family of models are known. For example, setting
@@ -59,6 +75,7 @@ multinomial(zero = NULL, parallel = FALSE, nointercept = NULL)
   The object is used by modelling functions such as \code{\link{vglm}},
   \code{\link{rrvglm}}
   and \code{\link{vgam}}.
+
 }
 \references{
 Yee, T. W. and Hastie, T. J. (2003)
@@ -156,6 +173,7 @@ contains further information and examples.
     \code{\link{rrvglm}},
     \code{\link[stats:Multinom]{Multinomial}},
     \code{\link[base]{iris}}.
+
 }
 %   \code{\link[base:Multinom]{rmultinom}}
 
@@ -177,7 +195,12 @@ weights(fit, type="prior", matrix=FALSE) # The better method
 fit at y   # Sample proportions
 constraints(fit)   # Constraint matrices
 
-# Example 2b: Different input to Example 2a but same result
+# Example 2b: Different reference level used as the baseline 
+fit2 = vglm(y ~ 1, multinomial(refLevel=2))
+coef(fit2, matrix=TRUE)
+coef(fit , matrix=TRUE) # Easy to reconcile this output with fit2
+
+# Example 2c: Different input to Example 2a but same result
 w = apply(y, 1, sum) # Prior weights
 yprop = y / w    # Sample proportions
 fitprop = vglm(yprop ~ 1, multinomial, weights=w)
@@ -186,19 +209,29 @@ weights(fitprop, type="prior", matrix=FALSE)
 fitprop at y # Same as the input
 
 
-# Example 3: Fit a rank-1 stereotype model 
+# Example 3: The response is a factor.
+nn = 10
+yfactor = gl(3, nn, labels = c("Control", "Treatment1", "Treatment2"))
+x = runif(3 * nn)
+fit3a = vglm(yfactor ~ x, multinomial(refLevel=yfactor[12]))
+fit3b = vglm(yfactor ~ x, multinomial(refLevel=2))
+coef(fit3a, matrix=TRUE)  # "Treatment1" is the reference level
+coef(fit3b, matrix=TRUE)  # "Treatment1" is the reference level
+
+
+# Example 4: Fit a rank-1 stereotype model 
 data(car.all)
-fit = rrvglm(Country ~ Width + Height + HP, multinomial, car.all, Rank=1)
-coef(fit)   # Contains the C matrix
-constraints(fit)$HP     # The A matrix 
-coef(fit, matrix=TRUE)  # The B matrix
-Coef(fit)@C             # The C matrix 
-ccoef(fit)              # Better to get the C matrix this way
-Coef(fit)@A             # The A matrix 
-svd(coef(fit, matrix=TRUE)[-1,])$d    # This has rank 1; = C %*% t(A) 
+fit4 = rrvglm(Country ~ Width + Height + HP, multinomial, car.all, Rank=1)
+coef(fit4)   # Contains the C matrix
+constraints(fit4)$HP     # The A matrix 
+coef(fit4, matrix=TRUE)  # The B matrix
+Coef(fit4)@C             # The C matrix 
+ccoef(fit4)              # Better to get the C matrix this way
+Coef(fit4)@A             # The A matrix 
+svd(coef(fit4, matrix=TRUE)[-1,])$d    # This has rank 1; = C %*% t(A) 
 
 
-# Example 4: The use of the xij argument (conditional logit model)
+# Example 5: The use of the xij argument (conditional logit model)
 set.seed(111)
 n = 100  # Number of people who travel to work
 M = 3  # There are M+1 models of transport
diff --git a/man/negbinomial.Rd b/man/negbinomial.Rd
index 7f9764b..8a44eba 100644
--- a/man/negbinomial.Rd
+++ b/man/negbinomial.Rd
@@ -9,7 +9,8 @@
 \usage{
 negbinomial(lmu = "loge", lk = "loge",
             emu =list(), ek=list(),
-            ik = NULL, cutoff = 0.995, Maxiter=5000, 
+            ik = NULL, nsimEIM=100,
+            cutoff = 0.995, Maxiter=5000, 
             deviance.arg = FALSE, method.init=1,
             shrinkage.init=0.95, zero = -2)
 }
@@ -36,11 +37,20 @@ negbinomial(lmu = "loge", lk = "loge",
   the \code{iKvector} argument of \code{\link{qrrvglm.control}} instead.
 
   }
+  \item{nsimEIM}{
+  This argument is used
+  for computing the diagonal element of the
+  \emph{expected information matrix} (EIM) corresponding to \eqn{k}.
+  See \code{\link{CommonVGAMffArguments}} for more information
+  and the note below.
+
+  }
   \item{cutoff}{
+  Used in the finite series approximation.
   A numeric which is close to 1 but never exactly 1.
   Used to specify how many terms of the infinite series
-  for computing the second diagonal element of the expected information
-  matrix are actually used.
+  for computing the second diagonal element of the
+  EIM are actually used.
   The sum of the probabilites are added until they reach this value or more
   (but no more than \code{Maxiter} terms allowed).
   It is like specifying \code{p} in an imaginary function
@@ -48,8 +58,9 @@ negbinomial(lmu = "loge", lk = "loge",
 
   }
   \item{Maxiter}{
+  Used in the finite series approximation.
   Integer. The maximum number of terms allowed when computing
-  the second diagonal element of the expected information matrix.
+  the second diagonal element of the EIM.
   In theory, the value involves an infinite series.
   If this argument is too small then the value may be inaccurate.
 
@@ -78,6 +89,7 @@ negbinomial(lmu = "loge", lk = "loge",
   a value of 0 means the individual response values are used,
   and a value of 1 means the median or mean is used.
   This argument is used in conjunction with \code{method.init}.
+  If convergence failure occurs try setting this argument to 1.
 
   }
   \item{zero}{
@@ -91,6 +103,7 @@ negbinomial(lmu = "loge", lk = "loge",
   are intercept-only.
 
   }
+
 }
 \details{
   The negative binomial distribution can be motivated in several ways,
@@ -122,12 +135,13 @@ negbinomial(lmu = "loge", lk = "loge",
   MASS library). This \pkg{VGAM} family function \code{negbinomial} treats
   both parameters on the same footing, and estimates them both by full
   maximum likelihood estimation.
+  Simulated Fisher scoring is employed as the default
+  (see the \code{nsimEIM} argument).
 
-  The parameters \eqn{\mu}{mu} and \eqn{k} are independent (diagonal
-  expected information matrix), and the
-  confidence region for \eqn{k} is extremely skewed so that its standard
-  error is often of no practical use. The parameter \eqn{1/k} has been
-  used as a measure of aggregation.
+  The parameters \eqn{\mu}{mu} and \eqn{k} are independent (diagonal EIM),
+  and the confidence region for \eqn{k} is extremely skewed so that its
+  standard error is often of no practical use. The parameter \eqn{1/k}
+  has been used as a measure of aggregation.
 
   This \pkg{VGAM} function handles \emph{multivariate} responses, so
   that a matrix can be used as the response. The number of columns is the
@@ -163,6 +177,10 @@ Negative binomial and mixed Poisson regression.
 \emph{The Canadian Journal of Statistics}
 \bold{15}, 209--225.
 
+Hilbe, J. M. (2007)
+\emph{Negative Binomial Regression}.
+Cambridge: Cambridge University Press.
+
 Bliss, C. and Fisher, R. A. (1953)
 Fitting the negative binomial distribution to biological data.
 \emph{Biometrics}
@@ -175,6 +193,32 @@ Fitting the negative binomial distribution to biological data.
 % negative binomial distribution. Currently, none of these others work
 % very well.
 
+  Suppose the response is called \code{ymat}.
+  The diagonal element of the \emph{expected information matrix}
+  (EIM) for parameter \eqn{k}
+  involves an infinite series; consequently simulated Fisher scoring
+  (see \code{nsimEIM}) is the default. This algorithm should definitely be
+  used if \code{max(ymat)} is large, e.g., \code{max(ymat) > 300} or there
+  are any outliers in \code{ymat}.
+  A second algorithm involving a finite series approximation can be
+  invoked by setting \code{nsimEIM = NULL}.
+  Then the arguments
+  \code{Maxiter} and
+  \code{cutoff} are pertinent.
+
+  Regardless of the algorithm used,
+  convergence problems may occur, especially when the response has large
+  outliers or is large in magnitude.
+  If convergence failure occurs, try using arguments
+  (in recommended decreasing order)
+  \code{nsimEIM},
+  \code{shrinkage.init},
+  \code{method.init},
+  \code{Maxiter}, 
+  \code{cutoff},
+  \code{ik},
+  \code{zero}.
+
   This function can be used by the fast algorithm in
   \code{\link{cqo}}, however, setting \code{EqualTolerances=TRUE} and
   \code{ITolerances=FALSE} is recommended.
@@ -208,20 +252,27 @@ Fitting the negative binomial distribution to biological data.
   \code{\link{nbolf}}.
 }
 \examples{
-y = 0:7  # Example 1: apple tree data
+# Example 1: apple tree data
+y = 0:7
 w = c(70, 38, 17, 10, 9, 3, 2, 1)
 fit = vglm(y ~ 1, negbinomial, weights=w)
 summary(fit)
 coef(fit, matrix=TRUE)
 Coef(fit)
 
-\dontrun{
-x = runif(n <- 500) # Example 2: simulated data with multivariate response
+# Example 2: simulated data with multivariate response
+x = runif(n <- 500)
 y1 = rnbinom(n, mu=exp(3+x), size=exp(1)) # k is size
 y2 = rnbinom(n, mu=exp(2-x), size=exp(0))
 fit = vglm(cbind(y1,y2) ~ x, negbinomial, trace=TRUE)
 coef(fit, matrix=TRUE)
-}
+
+# Example 3: large counts so definitely use the nsimEIM argument
+x = runif(n <- 500)
+y = rnbinom(n, mu=exp(12+x), size=exp(1)) # k is size
+range(y)  # Large counts
+fit = vglm(y ~ x, negbinomial(nsimEIM=100), trace=TRUE)
+coef(fit, matrix=TRUE)
 }
 \keyword{models}
 \keyword{regression}
diff --git a/man/normal1.Rd b/man/normal1.Rd
index af7ac28..196e16b 100644
--- a/man/normal1.Rd
+++ b/man/normal1.Rd
@@ -73,7 +73,7 @@ New York: Wiley-Interscience, Third edition.
     \code{\link{skewnormal1}},
     \code{\link{dcnormal1}},
     \code{\link{studentt}},
-    \code{\link[stats]{dnorm}}.
+    \code{\link[stats:Normal]{dnorm}}.
 
 }
 \examples{
diff --git a/man/notdocumentedyet.Rd b/man/notdocumentedyet.Rd
index fc90ea7..af8e6e9 100644
--- a/man/notdocumentedyet.Rd
+++ b/man/notdocumentedyet.Rd
@@ -2,9 +2,11 @@
 \alias{notdocumentedyet}
 \alias{A1A2A3}
 \alias{AAaa.nohw}
-%\alias{AIC.qrrgvlm}
+%\alias{AIC}
+%\alias{AIC.qrrvglm}
 %\alias{AIC.rrvglm}
 %\alias{AIC.vgam}
+%\alias{AIC.vglm}
 %\alias{AIC.vlm}
 % \alias{Build.terms}
 % \alias{Build.terms.vlm}
@@ -31,6 +33,7 @@
 \alias{add1.vgam}
 \alias{add1.vglm}
 % \alias{adjust.Dmat.expression}
+\alias{alaplace1.control}
 % \alias{alias.vgam}
 % \alias{alias.vglm}
 \alias{anova.vgam}
diff --git a/man/nzc.Rd b/man/nzc.Rd
index a062155..a1165f5 100644
--- a/man/nzc.Rd
+++ b/man/nzc.Rd
@@ -30,18 +30,15 @@
 \examples{
 \dontrun{
 data(nzc)
-attach(nzc)
-plot(year, female/(male+female), type="b", ylab="Proportion",
-     main="Proportion of Chinese that are female",
-     col="blue", las=1)
+with(nzc, plot(year, female/(male+female), type="b", ylab="Proportion",
+               main="Proportion of NZ Chinese that are female",
+               col="blue", las=1))
 abline(h=0.5, lty="dashed")
 
-plot(year, 100*(male+female)/nz, type="b", ylab="Percent",
-     ylim=c(0, max(100*(male+female)/nz)), col="blue",
-     main="Percent of New Zealanders that are Chinese", las=1)
+with(nzc, plot(year, 100*(male+female)/nz, type="b", ylab="Percent",
+               ylim=c(0, max(100*(male+female)/nz)), col="blue", las=1,
+               main="Percent of NZers that are Chinese"))
 abline(h=0, lty="dashed")
-
-detach(nzc)
 }
 }
 \keyword{datasets}
diff --git a/man/persp.qrrvglm.Rd b/man/persp.qrrvglm.Rd
index 166dae5..7c6f30d 100644
--- a/man/persp.qrrvglm.Rd
+++ b/man/persp.qrrvglm.Rd
@@ -16,7 +16,9 @@ persp.qrrvglm(x, varlvI = FALSE, reference = NULL, plot.it = TRUE,
               ylab = if(Rank==1) "Expected Value" else "Latent Variable 2",
               zlab = "Expected value", labelSpecies = FALSE,
               stretch = 1.05, main="", ticktype = "detailed",
-              col = if(Rank==1) par()$col else "white", add1 = FALSE, ...)
+              col = if(Rank==1) par()$col else "white",
+              llty=par()$lty, llwd=par()$lwd,
+              add1 = FALSE, ...)
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
@@ -97,6 +99,14 @@ persp.qrrvglm(x, varlvI = FALSE, reference = NULL, plot.it = TRUE,
   See \code{\link[graphics]{persp}} for more information. 
 
   }
+  \item{llty}{ Line type.
+  Rank-1 models only.
+  See the \code{lty} argument of \code{\link[graphics]{par}}.
+  }
+  \item{llwd}{ Line width.
+  Rank-1 models only.
+  See the \code{lwd} argument of \code{\link[graphics]{par}}.
+  }
   \item{add1}{ Logical. Add to an existing plot?
   Used only for rank-1 models.
 
diff --git a/man/plotvgam.control.Rd b/man/plotvgam.control.Rd
index ffbb1d7..42999cf 100644
--- a/man/plotvgam.control.Rd
+++ b/man/plotvgam.control.Rd
@@ -14,7 +14,7 @@ plotvgam.control(which.cf = NULL,
                   lcol = par()$col, rcol = par()$col,
                   scol = par()$col, llwd = par()$lwd, slwd = par()$lwd,
                   add.arg = FALSE, one.at.a.time = FALSE,
-                  .include.dots = TRUE, ...)
+                  .include.dots = TRUE, noxmean= FALSE, ...)
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
@@ -44,12 +44,21 @@ plotvgam.control(which.cf = NULL,
     Fed into \code{par(lwd)}. }
   \item{slwd}{ Line width of the standard error bands.
     Fed into \code{par(lwd)}. }
-  \item{add.arg}{ Logical. If \code{TRUE}, the plot will be added
+  \item{add.arg}{ Logical. If \code{TRUE} then the plot will be added
     to an existing plot, otherwise a new plot will be made. }
-  \item{one.at.a.time}{ Logical. If \code{TRUE}, the plots are done
+  \item{one.at.a.time}{ Logical. If \code{TRUE} then the plots are done
     one at a time, with the user having to hit the return key
     between the plots. }
   \item{.include.dots}{ Not to be used by the user. }
+  \item{noxmean}{
+  Logical. If \code{TRUE} then the point at the mean of \eqn{x},
+  which is added when
+  standard errors are specified and
+  it thinks the function is linear,
+  is not added.
+  One might use this argument if \code{ylab} is specified.
+
+  }
   \item{\dots}{ Other arguments that may be fed into \code{par()}. }
   In the above, \eqn{M} is the number of linear/additive predictors.
 }
diff --git a/man/poissonff.Rd b/man/poissonff.Rd
index 9208ccc..89f24c3 100644
--- a/man/poissonff.Rd
+++ b/man/poissonff.Rd
@@ -10,8 +10,8 @@
 
 }
 \usage{
-poissonff(link = "loge", earg=list(), dispersion = 1,
-          onedpar = FALSE, parallel = FALSE, zero = NULL)
+poissonff(link = "loge", earg=list(), dispersion = 1, onedpar = FALSE,
+          imu=NULL, method.init=1, parallel = FALSE, zero = NULL)
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
@@ -46,6 +46,10 @@ poissonff(link = "loge", earg=list(), dispersion = 1,
   A logical or formula. Used only if the response is a matrix.
 
   }
+  \item{imu, method.init}{
+  See \code{\link{CommonVGAMffArguments}} for more information.
+
+  }
   \item{zero}{
   An integer-valued vector specifying which linear/additive predictors
   are modelled as intercepts only.  The values must be from the set
@@ -135,8 +139,13 @@ poissonff(link = "loge", earg=list(), dispersion = 1,
 \examples{
 poissonff()
 
-n = 100
-x2 = rnorm(n)
+x = rnorm(n <- 100)
+y = rpois(n, exp(1+x))
+(fit = vglm(y ~ x, family=poissonff))
+coef(fit, matrix=TRUE)
+
+
+x2 = rnorm(n <- 100)
 x3 = rnorm(n)
 x4 = rnorm(n)
 lv1 = 0 + x3 - 2*x4
diff --git a/man/posbinomUC.Rd b/man/posbinomUC.Rd
index e6a0846..6af3e1f 100644
--- a/man/posbinomUC.Rd
+++ b/man/posbinomUC.Rd
@@ -54,9 +54,12 @@ rposbinom(n, size, prob)
 
 \author{ T. W. Yee }
 \note{
-  For \code{rposbinom}, the arguments of the function are fed into
+  For \code{dposbinom()}, if arguments \code{size} or \code{prob}
+  equal 0 then a \code{NaN} is returned.
+
+  For \code{rposbinom()}, the arguments of the function are fed into
   \code{\link[stats:Binomial]{rbinom}} until \eqn{n} positive values
-  are obtained.  This may take a long time if \code{prob} has values
+  are obtained. This may take a long time if \code{prob} has values
   close to 0.
 
   The family function \code{\link{posbinomial}} estimates the parameters
diff --git a/man/posnegbinUC.Rd b/man/posnegbinUC.Rd
new file mode 100644
index 0000000..1179d33
--- /dev/null
+++ b/man/posnegbinUC.Rd
@@ -0,0 +1,118 @@
+\name{Posnegbin}
+\alias{Posnegbin}
+\alias{dposnegbin}
+\alias{pposnegbin}
+\alias{qposnegbin}
+\alias{rposnegbin}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{ Positive-Negative Binomial Distribution }
+\description{
+  Density, distribution function, quantile function and random generation
+  for the positive-negative binomial distribution.
+
+}
+\usage{
+dposnegbin(x, size, prob=NULL, munb=NULL, log=FALSE)
+pposnegbin(q, size, prob=NULL, munb=NULL)
+qposnegbin(p, size, prob=NULL, munb=NULL)
+rposnegbin(n, size, prob=NULL, munb=NULL)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+  \item{x, q}{vector of quantiles.}
+  \item{p}{vector of probabilities.}
+  \item{n}{
+  number of random values to return.
+
+  }
+  \item{size, prob, munb, log}{
+  Same arguments as that of an ordinary negative binomial distribution
+  (see \code{\link[stats:NegBinomial]{dnbinom}}).
+  Some arguments have been renamed slightly.
+
+% This is called \eqn{\theta}{theta} in the \code{\link[MASS]{rnegbin}}
+% function in the \code{MASS} library.
+
+  Short vectors are recycled.
+  The  parameter \code{1/size} is known as a dispersion parameter;
+  as \code{size} approaches infinity, the negative binomial distribution
+  approaches a Poisson distribution.
+
+  }
+}
+\details{
+  The positive-negative binomial distribution is a negative binomial
+  distribution but with the probability of a zero being zero.
+  The other probabilities are scaled to add to unity.
+  The mean therefore is
+  \deqn{\mu / (1-p(0))}{%
+    munb / (1-p(0))}
+  where \eqn{\mu}{munb} the mean of an ordinary negative binomial distribution.
+  The arguments of
+  \code{rposnegbin()}
+  are fed into
+  \code{\link[stats:NegBinomial]{rnbinom}} until \eqn{n} positive values
+  are obtained.
+
+}
+\value{
+  \code{dposnegbin} gives the density,
+  \code{pposnegbin} gives the distribution function,
+  \code{qposnegbin} gives the quantile function, and
+  \code{rposnegbin} generates \eqn{n} random deviates.
+
+}
+\references{ 
+Welsh, A. H., Cunningham, R. B., Donnelly, C. F. and Lindenmayer,
+D. B. (1996)
+Modelling the abundances of rare species: statistical models
+for counts with extra zeros.
+\emph{Ecological Modelling},
+\bold{88},
+297--308.
+
+}
+\author{ T. W. Yee }
+\note{
+  The running time
+  of \code{rposnegbin()}
+  is slow when \code{munb} is very close to zero.
+
+}
+
+\seealso{ 
+  \code{\link{posnegbinomial}},
+  \code{\link[stats:NegBinomial]{rnbinom}},
+  \code{\link{zanegbinomial}}.
+
+% \code{\link[MASS]{rnegbin}},
+
+}
+\examples{
+munb = 5; size = 4; n = 1000
+table(y <- rposnegbin(n, munb=munb, size=size))
+mean(y)    # sample mean
+munb / (1 - (size/(size+munb))^size) # population mean
+munb / pnbinom(0, mu=munb, size=size, lower.tail=FALSE) # same as before
+
+x <- (-1):17
+(ii = dposnegbin(x, munb=munb, size=size))
+max(abs(cumsum(ii) - pposnegbin(x, munb=munb, size=size)))  # Should be 0
+
+\dontrun{
+x = 0:10
+barplot(rbind(dposnegbin(x, munb=munb, size=size), dnbinom(x, mu=munb, size=size)),
+        beside = TRUE, col = c("blue","green"),
+        main=paste("dposnegbin(munb=", munb, ", size=", size, ") (blue) vs",
+                        " dnbinom(mu=", munb, ", size=", size, ") (green)", sep=""),
+        names.arg = as.character(x))
+}
+
+# Another test for pposnegbin()
+nn = 5000
+mytab = cumsum(table(rposnegbin(nn, munb=munb, size=size))) / nn
+myans = pposnegbin(sort(as.numeric(names(mytab))), munb=munb, size=size)
+max(abs(mytab - myans))  # Should be 0
+}
+\keyword{distribution}
+
diff --git a/man/posnegbinomial.Rd b/man/posnegbinomial.Rd
index c185169..221f1df 100644
--- a/man/posnegbinomial.Rd
+++ b/man/posnegbinomial.Rd
@@ -9,8 +9,8 @@
 }
 \usage{
 posnegbinomial(lmunb = "loge", lk = "loge", 
-               emunb =list(), ek = list(), ik = NULL,
-               zero = -2, cutoff = 0.995, method.init=1)
+               emunb =list(), ek = list(), ik = NULL, zero = -2,
+               cutoff = 0.995, shrinkage.init=0.95, method.init=1)
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
@@ -61,7 +61,7 @@ posnegbinomial(lmunb = "loge", lk = "loge",
   \code{qnegbin(p)}.
 
   }
-  \item{method.init}{
+  \item{shrinkage.init, method.init}{
   See \code{\link{negbinomial}}.
 
   }
@@ -128,35 +128,26 @@ Generalized additive modelling and zero inflated count data.
 }
 
 \examples{
-\dontrun{
 x = runif(nn <- 2000)
-y1 = rnbinom(nn, mu=exp(0+2*x), size=exp(1)) # k is size in rnbinom()
-y2 = rnbinom(nn, mu=exp(1+2*x), size=exp(3))
-fit = vglm(cbind(y1,y2) ~ 1, posnegbinomial, subset=(y1>0)&(y2>1),
-           trace=TRUE)
+y1 = rposnegbin(nn, munb=exp(0+2*x), size=exp(1))
+y2 = rposnegbin(nn, munb=exp(1+2*x), size=exp(3))
+fit = vglm(cbind(y1,y2) ~ x, posnegbinomial, trace=TRUE)
 coef(fit, matrix=TRUE)
 dim(fit at y)
-fitted(fit)[1:5,]
-predict(fit)[1:5,]
 
 
 # Another artificial data example
-munb = exp(2); k = exp(3); n = 1000
-y = rposnegbin(n, munb=munb, k=k)
+munb = exp(2); size = k = exp(3); nn = 1000
+y = rposnegbin(nn, munb=munb, size=size)
 table(y)
 fit = vglm(y ~ 1, posnegbinomial, trace=TRUE)
 coef(fit, matrix=TRUE)
 mean(y)    # Sample mean
-munb / (1 - (k/(k+munb))^k) # Population mean
-fitted(fit)[1:5,]
-predict(fit)[1:5,]
-}
+munb / (1 - (size/(size+munb))^size) # Population mean
+fitted(fit)[1:3,]
+predict(fit)[1:3,]
 }
 \keyword{models}
 \keyword{regression}
 
 
-%library(MASS)
-%detach() # detach MASS
-%y1 = rnegbin(nn, mu=exp(0+2*x), theta=exp(1)) # k is theta in rnegbin()
-%y2 = rnegbin(nn, mu=exp(1+2*x), theta=exp(3))
diff --git a/man/posnormUC.Rd b/man/posnormUC.Rd
index ca5f1a3..fea7122 100644
--- a/man/posnormUC.Rd
+++ b/man/posnormUC.Rd
@@ -11,7 +11,7 @@
 
 }
 \usage{
-dposnorm(x, mean=0, sd=1)
+dposnorm(x, mean=0, sd=1, log=FALSE)
 pposnorm(q, mean=0, sd=1)
 qposnorm(p, mean=0, sd=1)
 rposnorm(n, mean=0, sd=1)
@@ -21,7 +21,7 @@ rposnorm(n, mean=0, sd=1)
   \item{p}{vector of probabilities.}
   \item{n}{number of observations.
     Must be a positive integer of length 1.}
-  \item{mean, sd}{ see \code{\link[stats]{rnorm}}. }
+  \item{mean, sd, log}{ see \code{\link[stats:Normal]{rnorm}}. }
 }
 \value{
   \code{dposnorm} gives the density,
@@ -34,12 +34,14 @@ rposnorm(n, mean=0, sd=1)
   See \code{\link{posnormal1}}, the \pkg{VGAM} family function
   for estimating the parameters, 
   for the formula of the probability density function and other details.
+
 }
-\note{
-  \code{rposnorm()} may run very slowly if the mean is very negative.
-}
+%\note{
+
+%}
 \seealso{
   \code{\link{posnormal1}}.
+
 }
 \examples{
 \dontrun{
@@ -56,7 +58,7 @@ Q = qposnorm(probs, m=m)
 lines(Q, dposnorm(Q, m=m), col="purple", lty=3, type="h")
 lines(Q, pposnorm(Q, m=m), col="purple", lty=3, type="h")
 abline(h=probs, col="purple", lty=3)
-pposnorm(Q, m=m) - probs # Should be all 0
+max(abs(pposnorm(Q, m=m) - probs)) # Should be 0
 }
 }
 \keyword{distribution}
diff --git a/man/posnormal1.Rd b/man/posnormal1.Rd
index 23d364d..9879c63 100644
--- a/man/posnormal1.Rd
+++ b/man/posnormal1.Rd
@@ -8,7 +8,7 @@
 \usage{
 posnormal1(lmean="identity", lsd="loge",
            emean=list(), esd=list(),
-           imean=NULL, isd=NULL, zero=NULL)
+           imean=NULL, isd=NULL, nsimEIM = 100, zero=NULL)
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
@@ -29,6 +29,10 @@ posnormal1(lmean="identity", lsd="loge",
   A \code{NULL} means a value is computed internally.
 
   }
+  \item{nsimEIM}{
+  See \code{\link{CommonVGAMffArguments}} for more information.
+
+  }
   \item{zero}{
   An integer-valued vector specifying which
   linear/additive predictors are modelled as intercepts only.
@@ -51,13 +55,13 @@ posnormal1(lmean="identity", lsd="loge",
         f(y) = (1/(sqrt(2*pi)*sigma)) * exp( -0.5 * (y-mu)^2/  sigma^2) /
                [1-Phi(-mu/ sigma)] }
   where \eqn{\Phi()}{Phi} is the cumulative distribution function of a
-  standard normal (\code{\link[stats]{pnorm}}).
+  standard normal (\code{\link[stats:Normal]{pnorm}}).
   Equivalently, this is
   \deqn{f(y) = \frac{1}{\sigma} \frac{\phi((y-\mu) / \sigma)}{
                1-\Phi(-\mu/ \sigma)}.}{%
         f(y) = (1/sigma) * dnorm((y-mu)/sigma) / [1-pnorm(-mu/ sigma)].}
   where \eqn{\phi()}{dnorm()} is the probability density function of a 
-  standard normal distribution (\code{\link[stats]{dnorm}}).
+  standard normal distribution (\code{\link[stats:Normal]{dnorm}}).
 
   The mean of \eqn{Y} is
   \deqn{E(Y) = \mu + \sigma \frac{\phi(-\mu/ \sigma)}{
diff --git a/man/pospoisUC.Rd b/man/pospoisUC.Rd
index 804f864..62f3c7d 100644
--- a/man/pospoisUC.Rd
+++ b/man/pospoisUC.Rd
@@ -12,7 +12,7 @@
 
 }
 \usage{
-dpospois(x, lambda)
+dpospois(x, lambda, log=FALSE)
 ppospois(q, lambda)
 qpospois(p, lambda)
 rpospois(n, lambda)
@@ -24,6 +24,8 @@ rpospois(n, lambda)
   \item{n}{number of observations. Must be a single positive integer. }
   \item{lambda}{ vector of positive means (of an ordinary Poisson distribution). 
   Short vectors are recycled. }
+  \item{log}{ logical.
+  }
 }
 \details{
   The positive-Poisson distribution is a Poisson distribution but with
diff --git a/man/pospoisson.Rd b/man/pospoisson.Rd
index daae29d..fb3aa47 100644
--- a/man/pospoisson.Rd
+++ b/man/pospoisson.Rd
@@ -33,7 +33,7 @@ pospoisson(link = "loge", earg=list(),
 
   }
   \item{method.init}{
-  An integer with value \code{1} or \code{2} which
+  An integer with value \code{1} or \code{2} or \code{3} which 
   specifies the initialization method for \eqn{\lambda}{lambda}.
   If failure to converge occurs try another value
   and/or else specify a value for \code{ilambda}.
diff --git a/man/riceUC.Rd b/man/riceUC.Rd
index 3993c48..c702a2e 100644
--- a/man/riceUC.Rd
+++ b/man/riceUC.Rd
@@ -9,7 +9,7 @@
   Density
 % distribution function, quantile function
   and random generation for the
-  Rice distribution.
+  Rician distribution.
 
 }
 \usage{
diff --git a/man/riceff.Rd b/man/riceff.Rd
index 177a823..b861b26 100644
--- a/man/riceff.Rd
+++ b/man/riceff.Rd
@@ -38,7 +38,7 @@ riceff(lvee="loge", lsigma="loge",
   }
 }
 \details{
-  The Rice distribution has density function
+  The Rician distribution has density function
   \deqn{f(y;v,\sigma) =
   \frac{ y }{\sigma^2} \, \exp(-(y^2+v^2) / (2\sigma^2)) \, I_0(y v / \sigma^2)
   }{%
@@ -82,7 +82,7 @@ Mathematical Analysis of Random Noise.
 \seealso{ 
   \code{\link{drice}},
   \code{\link{rayleigh}},
-  \code{\link[base]{besselI}}.
+  \code{\link[base:Bessel]{besselI}}.
 
 }
 \examples{
diff --git a/man/rposnegbin.Rd b/man/rposnegbin.Rd
deleted file mode 100644
index 3ff2fa8..0000000
--- a/man/rposnegbin.Rd
+++ /dev/null
@@ -1,85 +0,0 @@
-\name{rposnegbin}
-\alias{rposnegbin}
-%- Also NEED an '\alias' for EACH other topic documented here.
-\title{ Positive-negative binomial distribution random variates }
-\description{
-  Generate random variates from a positive-negative binomial distribution.
-}
-\usage{
-rposnegbin(n, munb, k)
-}
-%- maybe also 'usage' for other objects documented here.
-\arguments{
-  \item{n}{
-  number of random values to return.
-
-  }
-  \item{munb}{
-  vector of positive means (of an ordinary negative binomial distribution).
-
-  }
-  \item{k}{
-  vector of positive index parameters (of an ordinary negative binomial distribution).
-  This is called the \code{size} argument in
-  \code{\link[stats:NegBinomial]{rnbinom}}.
-
-% This is called \eqn{\theta}{theta} in the \code{\link[MASS]{rnegbin}}
-% function in the \code{MASS} library.
-
-  Short vectors are recycled.
-  The  parameter \code{1/k} is known as a dispersion parameter;
-  as \code{k} approaches infinity, the negative binomial distribution
-  approaches a Poisson distribution.
-
-  }
-}
-\details{
-  The positive-negative binomial distribution is a negative binomial
-  distribution but with
-  the probability of a zero being zero. The other probabilities are scaled
-  to add to unity.
-  The mean therefore is
-  \deqn{\mu / (1-p(0))}{%
-    munb / (1-p(0))}
-  where \eqn{\mu}{munb} the mean of an ordinary negative binomial distribution.
-  The arguments of the function are fed into
-  \code{\link[stats:NegBinomial]{rnbinom}} until \eqn{n} positive values
-  are obtained.
-
-}
-\value{
-  \eqn{n} random deviates are returned.
-
-}
-\references{ 
-Welsh, A. H., Cunningham, R. B., Donnelly, C. F. and Lindenmayer,
-D. B. (1996)
-Modelling the abundances of rare species: statistical models
-for counts with extra zeros.
-\emph{Ecological Modelling},
-\bold{88},
-297--308.
-
-}
-\author{ T. W. Yee }
-\note{
-The running time is slow when \code{munb} is very close to zero.
-
-}
-
-\seealso{ 
-% \code{\link[MASS]{rnegbin}},
-  \code{\link[stats:NegBinomial]{rnbinom}},
-  \code{\link{posnegbinomial}},
-  \code{\link{zanegbinomial}}.
-
-}
-\examples{
-munb = 2; k = 4; n = 1000
-y = rposnegbin(n, munb=munb, k=k)
-table(y)
-mean(y)    # sample mean
-munb / (1 - (k/(k+munb))^k) # population mean
-}
-\keyword{distribution}
-
diff --git a/man/rrvglm-class.Rd b/man/rrvglm-class.Rd
index b1deb1c..3fbfea0 100644
--- a/man/rrvglm-class.Rd
+++ b/man/rrvglm-class.Rd
@@ -185,6 +185,18 @@ Objects can be created by calls to \code{\link{rrvglm}}.
   from class \code{ "vlm"}.
   The response, in matrix form.
   }
+    \item{\code{Xm2}:}{Object of class \code{"matrix"},
+ from class \code{ "vlm"}.
+ See \code{\link{vglm-class}}).
+ }
+    \item{\code{Ym2}:}{Object of class \code{"matrix"},
+ from class \code{ "vlm"}.
+ See \code{\link{vglm-class}}).
+ }
+  \item{\code{callXm2}:}{
+  Object of class \code{"call"}, from class \code{ "vlm"}.
+  The matched call for argument \code{form2}.
+  }
   }
 }
 
diff --git a/man/rrvglm.Rd b/man/rrvglm.Rd
index 6efe39e..d6cf0b3 100644
--- a/man/rrvglm.Rd
+++ b/man/rrvglm.Rd
@@ -267,10 +267,8 @@ Regression and ordered categorical variables.
 
 \examples{
 data(car.all)
-attach(car.all)
-index = Country == "Germany" | Country == "USA" |
-        Country == "Japan" | Country == "Korea"
-detach(car.all)
+index = with(car.all, Country == "Germany" | Country == "USA" |
+                      Country == "Japan" | Country == "Korea")
 scar = car.all[index, ]  # standardized car data
 fcols = c(13,14,18:20,22:26,29:31,33,34,36)  # These are factors
 scar[,-fcols] = scale(scar[,-fcols]) # Standardize all numerical vars
diff --git a/man/rrvglm.control.Rd b/man/rrvglm.control.Rd
index 5b4f10e..dcd2564 100644
--- a/man/rrvglm.control.Rd
+++ b/man/rrvglm.control.Rd
@@ -19,33 +19,39 @@ rrvglm.control(Rank = 1, Algorithm = c("alternating", "derivative"),
 }
 %- maybe also `usage' for other objects documented here.
 \arguments{
-  \item{Rank}{ The numerical rank \eqn{R} of the model.
+  \item{Rank}{
+    The numerical rank \eqn{R} of the model.
     Must be an element from the set \{1,2,\ldots,min(\eqn{M},\emph{p2})\}. 
     Here, the vector of explanatory variables \bold{x} is partitioned into
     (\bold{x1},\bold{x2}), which is of dimension \emph{p1}+\emph{p2}.
     The variables making up \bold{x1} are given by the terms in
     \code{Norrr} argument, and the rest of the terms comprise \bold{x2}.
-    }
-  \item{Algorithm}{ Character string indicating what algorithm is
+
+  }
+  \item{Algorithm}{
+    Character string indicating what algorithm is
     to be used. The default is the first one.
 
   }
-  \item{Corner}{ Logical indicating whether corner constraints are
+  \item{Corner}{
+    Logical indicating whether corner constraints are
     to be used. This is one method for ensuring a unique solution.
     If \code{TRUE}, \code{Index.corner} specifies the \eqn{R} rows
     of the constraint matrices that are use as the corner constraints,
     i.e., they hold an order-\eqn{R} identity matrix.
 
   }
-\item{Uncor}{ Logical indicating whether uncorrelated 
-  latent variables are to be used.  This is another normalization that
-  forces the variance-covariance matrix of the latent variables to be
-  \code{diag(Rank)}, i.e., unit variance and uncorrelated. This constraint
-  does not lead to a unique solution because it can be rotated.
+\item{Uncor}{
+  Logical indicating whether uncorrelated latent variables are to be used.
+  This is normalization forces the variance-covariance
+  matrix of the latent variables to be \code{diag(Rank)}, i.e., unit
+  variance and uncorrelated. This constraint does not lead to a unique
+  solution because it can be rotated.
 
 }
   \item{Wmat}{ Yet to be done. }
-  \item{Svd.arg}{ Logical indicating whether a singular value decomposition
+  \item{Svd.arg}{
+    Logical indicating whether a singular value decomposition
     of the outer product is to computed.  This is another normalization
     which ensures uniqueness.  See the argument \code{Alpha} below.
 
@@ -66,17 +72,21 @@ rrvglm.control(Rank = 1, Algorithm = c("alternating", "derivative"),
     \eqn{D^{1-\alpha}  V^T}{D^(1-Alpha) \%*\% t(V)} respectively.
     A value of 0.5 is `symmetrical'. 
     This argument is used only when \code{Svd.arg=TRUE}.
+
   }
-  \item{Bestof}{ Integer. The best of \code{Bestof} models fitted is
+  \item{Bestof}{
+    Integer. The best of \code{Bestof} models fitted is
     returned. This argument helps guard against local solutions by
     (hopefully) finding the global solution from many fits. The
     argument works only when the function generates its own initial value
     for \bold{C},
     i.e., when \bold{C} is \emph{not} passed in as initial values.
+
   }
   \item{Cinit}{
     Initial \bold{C} matrix which may speed up convergence.
     It must be of the correct dimension.
+
   }
   \item{Etamat.colmax}{
     Positive integer, no smaller than \code{Rank}.  Controls the amount
@@ -96,7 +106,8 @@ rrvglm.control(Rank = 1, Algorithm = c("alternating", "derivative"),
       Integer vector specifying which rows
       of the constraint matrices are to be all zeros.
   }
-  \item{SD.Cinit}{ Standard deviation of the initial values for the elements
+  \item{SD.Cinit}{
+      Standard deviation of the initial values for the elements
       of \bold{C}.
       These are normally distributed with mean zero.  
       This argument is used only if \code{Use.Init.Poisson.QO = FALSE}.
@@ -110,7 +121,8 @@ rrvglm.control(Rank = 1, Algorithm = c("alternating", "derivative"),
     \eqn{\bold{B}_2}{\bold{B}2} matrix.
 
   }
-  \item{trace}{ Logical indicating if output should be produced for
+  \item{trace}{
+    Logical indicating if output should be produced for
     each iteration.
 
 %   Useful when \code{Quadratic=TRUE} because QRR-VGLMs are
@@ -126,7 +138,8 @@ rrvglm.control(Rank = 1, Algorithm = c("alternating", "derivative"),
     realistic for RR-VGLMs compared to QRR-VGLMs.
 
   }
-  \item{checkwz}{ logical indicating whether the diagonal elements of
+  \item{checkwz}{
+    logical indicating whether the diagonal elements of
     the working weight matrices should be checked whether they are
     sufficiently positive, i.e., greater than \code{wzepsilon}. If not,
     any values less than \code{wzepsilon} are replaced with this value.
@@ -137,7 +150,8 @@ rrvglm.control(Rank = 1, Algorithm = c("alternating", "derivative"),
   weight matrices are sufficiently positive.
 
   }
-  \item{\dots}{ Variables in \dots are passed into
+  \item{\dots}{
+    Variables in \dots are passed into
     \code{\link{vglm.control}}. If the derivative algorithm is used, then
     \dots are also passed into \code{\link{rrvglm.optim.control}}.
   }
diff --git a/man/ruge.Rd b/man/ruge.Rd
index 7df9d2e..3b224ee 100644
--- a/man/ruge.Rd
+++ b/man/ruge.Rd
@@ -33,10 +33,9 @@
 %}
 \examples{
 data(ruge)
-attach(ruge)
-lambdahat = weighted.mean(number, w=counts)
-(N = sum(counts))
-cbind(number, counts, fitted=round(N * dpois(number, lam=lambdahat)))
-detach(ruge)
+lambdahat = with(ruge, weighted.mean(number, w=counts))
+(N = with(ruge, sum(counts)))
+with(ruge, cbind(number, counts,
+                 fitted=round(N * dpois(number, lam=lambdahat))))
 }
 \keyword{datasets}
diff --git a/man/s.Rd b/man/s.Rd
index a930beb..9c92911 100644
--- a/man/s.Rd
+++ b/man/s.Rd
@@ -20,6 +20,10 @@ s(x, df = 4, spar = 0, ...)
 
   \item{x}{
   covariate (abscissae) to be smoothed.
+  Note that \code{x} must be a single variable
+  and not a function of a variable.
+  For example, \code{s(x)} is fine but \code{s(log(x))} will fail. 
+  In this case, let \code{logx <- log(x)}, say, and use \code{s(logx)}.
 
   }
   \item{df}{
@@ -65,11 +69,6 @@ Vector generalized additive models.
 }
 \author{ Thomas W. Yee }
 \note{
-  The \code{x} argument of \code{s()} must be a single variable
-  and not a function of a variable.
-  For example, \code{s(x)} is fine but \code{s(log(x))} will fail. 
-  In this case, let \code{logx <- log(x)}, say, and use
-  \code{s(logx)}.
 
   The vector cubic smoothing spline which \code{s()} represents is
   computationally demanding for large \eqn{M}. The cost is approximately
diff --git a/man/skellam.Rd b/man/skellam.Rd
index 72c191c..ae16fbf 100644
--- a/man/skellam.Rd
+++ b/man/skellam.Rd
@@ -8,10 +8,8 @@
 
 }
 \usage{
-skellam(lmu1="loge", lmu2="loge",
-        emu1=list(), emu2=list(),
-        imu1=NULL, imu2=NULL,
-        nsimEIM=100, parallel=FALSE, zero=NULL)
+skellam(lmu1="loge", lmu2="loge", emu1=list(), emu2=list(),
+        imu1=NULL, imu2=NULL, nsimEIM=100, parallel=FALSE, zero=NULL)
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
@@ -68,6 +66,13 @@ f(y;mu1,mu2) =
   and \code{\link{vgam}}.
 
 }
+\section{Warning }{
+  This \pkg{VGAM} family function seems fragile and very sensitive to
+  the initial values.
+  Use very cautiously!!
+
+}
+
 \references{
 Skellam, J. G. (1946)
 The frequency distribution of the difference between 
@@ -85,6 +90,7 @@ two Poisson variates belonging to different populations.
 
 \seealso{ 
   \code{\link{dskellam}},
+  \code{\link[stats:Poisson]{dpois}},
   \code{\link{poissonff}}.
 
 }
diff --git a/man/skellamUC.Rd b/man/skellamUC.Rd
index 4220b2c..fc3770d 100644
--- a/man/skellamUC.Rd
+++ b/man/skellamUC.Rd
@@ -47,7 +47,8 @@ rskellam(n, mu1, mu2)
 
 }
 \seealso{
-  \code{\link{skellam}}.
+  \code{\link{skellam}},
+  \code{\link[stats:Poisson]{dpois}}.
 
 }
 \examples{
diff --git a/man/tikuv.Rd b/man/tikuv.Rd
index 937371e..cd7ce18 100644
--- a/man/tikuv.Rd
+++ b/man/tikuv.Rd
@@ -91,7 +91,8 @@ tikuv(d, lmean="identity", lsigma="loge",
   A normal distribution arises as the limit as \eqn{d} approaches
   \eqn{-\infty}{-Inf}, i.e., as \eqn{h} approaches \eqn{\infty}{Inf}.
   Fisher scoring is implemented.
-  After fitting the value of \code{d} is stored as \code{@misc\$d}.
+  After fitting the value of \code{d} is stored in \code{@misc} with
+  component name \code{d}.
 
 }
 
diff --git a/man/trplot.qrrvglm.Rd b/man/trplot.qrrvglm.Rd
index 4f0f553..9e9db45 100644
--- a/man/trplot.qrrvglm.Rd
+++ b/man/trplot.qrrvglm.Rd
@@ -13,7 +13,7 @@ It is only applicable for rank-1 models with argument
 trplot.qrrvglm(object, whichSpecies = NULL,
                add=FALSE, plot.it=TRUE,
                label.sites = FALSE, 
-               sitenames = dimnames(object at y)[[1]], 
+               sitenames = rownames(object at y), 
                axes.equal = TRUE, cex = par()$cex, 
                col = 1:(nos * (nos - 1)/2), log = "", 
                lty = rep(par()$lty, len = nos * (nos - 1)/2), 
@@ -157,8 +157,8 @@ p1 = cqo(cbind(Alopacce, Alopcune, Alopfabr, Arctlute, Arctperi, Auloalbi,
 trplot(p1, whichSpecies=1:3, log="xy", type="b", lty=1,
        main="Trajectory plot of three hunting spiders species",
        col=c("blue","red","green"), lwd=2, label=TRUE) -> ii
-legend(0.00005, 0.3, paste(ii$species[,1], ii$species[,2], sep=" and "),
-       lwd=2, lty=1, col=c("blue","red","green"))
+legend(0.00005, 0.3, lwd=2, lty=1, col=c("blue","red","green"),
+       with(ii, paste(species.names[,1], species.names[,2], sep=" and ")))
 abline(a=0, b=1, lty="dashed")  # Useful reference line
 }
 }
diff --git a/man/undocumented-methods.Rd b/man/undocumented-methods.Rd
index 6138e4b..71ca6f3 100644
--- a/man/undocumented-methods.Rd
+++ b/man/undocumented-methods.Rd
@@ -5,6 +5,11 @@
 %
 %
 %
+\alias{AIC,vlm-method}
+\alias{AIC,vglm-method}
+\alias{AIC,vgam-method}
+\alias{AIC,rrvglm-method}
+\alias{AIC,qrrvglm-method}
 \alias{attrassign,lm-method}
 \alias{calibrate,qrrvglm-method}
 \alias{calibrate,cao-method}
@@ -70,6 +75,8 @@
 \alias{is.bell,Coef.qrrvglm-method}
 \alias{logLik,vlm-method}
 \alias{logLik,summary.vglm-method}
+\alias{logLik,vglm-method}
+\alias{logLik,vgam-method}
 \alias{lvplot,cao-method}
 \alias{lvplot,qrrvglm-method}
 \alias{lvplot,rrvglm-method}
diff --git a/man/uqo.Rd b/man/uqo.Rd
index 4dcc811..82f4d7c 100644
--- a/man/uqo.Rd
+++ b/man/uqo.Rd
@@ -243,7 +243,7 @@ nos = ncol(up1 at y) # Number of species
 clr = (1:(nos+1))[-7]  # to omit yellow
 lvplot(up1, las=1, y=TRUE, pch=1:nos, scol=clr, lcol=clr, 
        pcol=clr, llty=1:nos, llwd=2)
-legend(x=2, y=135, dimnames(up1 at y)[[2]], col=clr, lty=1:nos,
+legend(x=2, y=135, colnames(up1 at y), col=clr, lty=1:nos,
        lwd=2, merge=FALSE, ncol=1, x.inter=4.0, bty="l", cex=0.9)
 
 # Compare the site scores between the two models
diff --git a/man/vgam-class.Rd b/man/vgam-class.Rd
index 86be796..784edc1 100644
--- a/man/vgam-class.Rd
+++ b/man/vgam-class.Rd
@@ -163,13 +163,24 @@ The levels of the factors, if any, used in fitting.
  from class \code{ "vlm"}.
 The response, in matrix form.
  }
-  }
+    \item{\code{Xm2}:}{Object of class \code{"matrix"},
+ from class \code{ "vlm"}.
+ See \code{\link{vglm-class}}).
+ }
+    \item{\code{Ym2}:}{Object of class \code{"matrix"},
+ from class \code{ "vlm"}.
+ See \code{\link{vglm-class}}).
+ }
+  \item{\code{callXm2}:}{
+  Object of class \code{"call"}, from class \code{ "vlm"}.
+  The matched call for argument \code{form2}.
+ }
+ }
 }
 
-
 \section{Extends}{
 Class \code{"vglm"}, directly.
-Class \code{"vlm"}, by class "vglm".
+Class \code{"vlm"}, by class \code{"vglm"}.
 }
 \section{Methods}{
   \describe{
@@ -179,7 +190,6 @@ Useful for quantile regression and extreme value data models.}
     \item{deplot}{\code{signature(object = "vglm")}:
       density plot.
       Useful for quantile regression models.}
- }
     \item{deviance}{\code{signature(object = "vglm")}:
 deviance of the model (where applicable). }
     \item{plot}{\code{signature(x = "vglm")}:
@@ -200,6 +210,7 @@ Useful for extreme value data models.}
     \item{summary}{\code{signature(object = "vglm")}:
 a more detailed summary of the object. }
   }
+}
 
 \references{
 Yee, T. W. and Wild, C. J. (1996)
@@ -214,6 +225,7 @@ Vector generalized additive models.
   VGAMs have all the slots that \code{\link{vglm}} objects
   have (\code{\link{vglm-class}}), plus the first few slots
   described in the section above. 
+
 }
 
 %~Make other sections like WARNING with \section{WARNING }{....} ~
@@ -224,6 +236,7 @@ Vector generalized additive models.
 \code{\link[VGAM]{s}},
 \code{\link{vglm-class}},
 \code{\link{vglmff-class}}.
+
 }
 
 \examples{
diff --git a/man/vgam.Rd b/man/vgam.Rd
index 41ea376..7013e1d 100644
--- a/man/vgam.Rd
+++ b/man/vgam.Rd
@@ -210,6 +210,10 @@ Vector generalized additive models.
 \emph{Journal of the Royal Statistical Society, Series B, Methodological},
 \bold{58}, 481--493.
 
+Yee, T. W. (2008)
+The \code{VGAM} Package.
+\emph{R News}, \bold{8}, 28--39.
+
   Documentation accompanying the \pkg{VGAM} package at
   \url{http://www.stat.auckland.ac.nz/~yee}
   contains further information and examples.
@@ -280,13 +284,12 @@ fit2 = vgam(cbind(agaaus, kniexc) ~ s(altitude, df=c(2,3)),
 coef(fit2, mat=TRUE)   # Not really interpretable 
 \dontrun{
 plot(fit2, se=TRUE, overlay=TRUE, lcol=1:2, scol=1:2)
-attach(hunua)
-o = order(altitude)
-matplot(altitude[o], fitted(fit2)[o,], type="l", lwd=2, las=1,
-    xlab="Altitude (m)", ylab="Probability of presence",
-    main="Two plant species' response curves", ylim=c(0,.8))
-rug(altitude)
-detach(hunua)
+
+o = with(hunua, order(altitude))
+with(hunua, matplot(altitude[o], fitted(fit2)[o,], type="l", lwd=2,
+     xlab="Altitude (m)", ylab="Probability of presence", las=1,
+     main="Two plant species' response curves", ylim=c(0,.8)))
+with(hunua, rug(altitude))
 }
 }
 \keyword{models}
diff --git a/man/vglm-class.Rd b/man/vglm-class.Rd
index 3d13f37..7e54b39 100644
--- a/man/vglm-class.Rd
+++ b/man/vglm-class.Rd
@@ -151,6 +151,18 @@ The levels of the factors, if any, used in fitting.
  from class \code{ "vlm"}.
 The response, in matrix form.
  }
+    \item{\code{Xm2}:}{Object of class \code{"matrix"},
+ from class \code{ "vlm"}.
+ See \code{\link{vglm-class}}).
+ }
+    \item{\code{Ym2}:}{Object of class \code{"matrix"},
+ from class \code{ "vlm"}.
+ See \code{\link{vglm-class}}).
+ }
+  \item{\code{callXm2}:}{
+  Object of class \code{"call"}, from class \code{ "vlm"}.
+  The matched call for argument \code{form2}.
+  }
   }
 }
 \section{Extends}{
diff --git a/man/vglm.Rd b/man/vglm.Rd
index ae8333b..39a8de1 100644
--- a/man/vglm.Rd
+++ b/man/vglm.Rd
@@ -14,7 +14,7 @@ vglm(formula, family, data = list(), weights = NULL, subset = NULL,
      coefstart = NULL, control = vglm.control(...), offset = NULL, 
      method = "vglm.fit", model = FALSE, x.arg = TRUE, y.arg = TRUE, 
      contrasts = NULL, constraints = NULL, extra = list(), 
-     qr.arg = FALSE, smart = TRUE, ...)
+     form2 = NULL, qr.arg = FALSE, smart = TRUE, ...)
 }
 %- maybe also `usage' for other objects documented here.
 \arguments{
@@ -136,6 +136,14 @@ vglm(formula, family, data = list(), weights = NULL, subset = NULL,
   the \pkg{VGAM} family function.
 
   }
+  \item{form2}{
+  The second (optional) formula.
+  Some \pkg{VGAM} family functions such as \code{\link{micmen}})
+  use this argument to onput the regressor variable.
+  If given, the slots \code{@Xm2} and \code{@Ym2} may be assigned.
+  Warning: smart prediction is not used for this argument.
+
+  }
   \item{qr.arg}{
   logical value indicating whether
   the slot \code{qr}, which returns the QR decomposition of the
@@ -246,6 +254,10 @@ Vector generalized additive models.
 \emph{Journal of the Royal Statistical Society, Series B, Methodological},
 \bold{58}, 481--493.
 
+Yee, T. W. (2008)
+The \code{VGAM} Package.
+\emph{R News}, \bold{8}, 28--39.
+
   Documentation accompanying the \pkg{VGAM} package at
   \url{http://www.stat.auckland.ac.nz/~yee}
   contains further information and examples.
@@ -306,6 +318,7 @@ Vector generalized additive models.
   \code{coef.vlm},
   \code{\link{predict.vglm}},
   \code{summary.vglm},
+  \code{AIC.vglm},
   etc.
 }
 
diff --git a/man/vonmises.Rd b/man/vonmises.Rd
index 305545e..c7060cc 100644
--- a/man/vonmises.Rd
+++ b/man/vonmises.Rd
@@ -8,10 +8,9 @@
 }
 \usage{
 vonmises(llocation="elogit", lscale="loge",
-      elocation=if(llocation=="elogit") list(min=0, max=2*pi) else list(),
-      escale=list(),
-      ilocation=NULL, iscale=NULL,
-      method.init=1, zero=NULL)
+         elocation=if(llocation=="elogit") list(min=0, max=2*pi)
+         else list(), escale=list(), ilocation=NULL,
+         iscale=NULL, method.init=1, zero=NULL)
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
@@ -64,8 +63,9 @@ vonmises(llocation="elogit", lscale="loge",
 
 }
 \details{
-  The (two-parameter) von Mises distribution 
-  has a density that can be written as
+  The (two-parameter) von Mises
+  is the most commonly used distribution in practice for circular data.
+  It has a density that can be written as
   \deqn{f(y;a,k) = \frac{\exp[k\cos(y-a)]}{
       2\pi I_0(k)}}{%
         f(y;a,k) = exp[k*cos(y-a)] / (2*pi*I0(k))}
diff --git a/man/vsmooth.spline.Rd b/man/vsmooth.spline.Rd
index 86b10b5..500a428 100644
--- a/man/vsmooth.spline.Rd
+++ b/man/vsmooth.spline.Rd
@@ -170,14 +170,14 @@ plot(fit2, lcol=mycols, pcol=mycols, las=1)
 }
 
 p = predict(fit, x=fit at x, deriv=0)
-max(abs(fit at y - p$y))  # Should be zero
+max(abs(fit at y - with(p, y))) # Should be zero
 
 par(mfrow=c(3,1))
 ux = seq(1, 8, len=100)
 for(d in 1:3) {
     p = predict(fit, x=ux, deriv=d)
 \dontrun{
-    matplot(p$x, p$y, type="l", main=paste("deriv =", d), lwd=2)
+    with(p, matplot(x, y, type="l", main=paste("deriv =", d), lwd=2))
 }
 }
 }
diff --git a/man/wffc.P2star.Rd b/man/wffc.P2star.Rd
new file mode 100644
index 0000000..767d69b
--- /dev/null
+++ b/man/wffc.P2star.Rd
@@ -0,0 +1,71 @@
+\name{wffc.points}
+\alias{wffc.P1}
+\alias{wffc.P1star}
+\alias{wffc.P2}
+\alias{wffc.P2star}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{ Point System for the 2008 World Fly Fishing Championships }
+\description{
+  Point system for the 2008 World Fly Fishing Championships:
+  current and proposed.
+
+}
+\usage{
+wffc.P1(length, min.eligible = 0.18)
+wffc.P1star(length, min.eligible = 0.18)
+wffc.P2(length, min.eligible = 0.18)
+wffc.P2star(length, min.eligible = 0.18)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+  \item{length}{ Length of the fish, in metres. Numeric vector. }
+  \item{min.eligible}{ Currently the regulations stipulate that the
+  smallest eligible fish is 180 mm. }
+}
+\details{
+  The official website contains a document with the official rules and
+  regulations of the competition.
+  The function \code{wffc.P1()} implements the current WFFC point system.
+  \code{wffc.P1star()} is a `continuous' version of it.
+
+  The function \code{wffc.P2()} is a new proposal which rewards catching bigger
+  fish.
+  \code{wffc.P2star()} is a `continuous' version of it.
+}
+\value{
+  A vector with the number of points.
+
+}
+
+\references{
+  \url{http://www.2008worldflyfishingchamps.com}
+  is the official website.
+
+  Yee, T. W. (2008)
+  Vector generalized linear and additive models, with
+  applications to the 2008 World Fly Fishing Championships.
+  In preparation.
+
+}
+
+\author{ T. W. Yee. }
+\note{
+  \code{wffc.P2} and \code{wffc.P2star} may change in the future.
+
+}
+\seealso{ \code{\link{wffc}}. }
+\examples{
+\dontrun{
+fishlength = seq(0.0, 0.72, by=0.001)
+plot(fishlength, wffc.P2star(fishlength), type="l", col="blue",
+     las=1, lty="dashed", lwd=2, las=1,
+     xlab="Fish length (m)", ylab="Competition points",
+     main="Current (red) and proposed (blue) WFFC point system")
+lines(fishlength, wffc.P1star(fishlength), type="l", col="red", lwd=2)
+abline(v=(1:4)*0.18, lty="dotted")
+abline(h=(1:9)*wffc.P1star(0.18), lty="dotted")
+}
+}
+% Add one or more standard keywords, see file 'KEYWORDS' in the
+% R documentation directory.
+\keyword{ models }
diff --git a/man/wffc.Rd b/man/wffc.Rd
new file mode 100644
index 0000000..7b98271
--- /dev/null
+++ b/man/wffc.Rd
@@ -0,0 +1,184 @@
+\name{wffc}
+\alias{wffc}
+\docType{data}
+\title{ 2008 World Fly Fishing Championships }
+\description{
+  Capture records of the 2008 FIPS-MOUCHE
+  World Fly Fishing Championships held in Rotorua, New Zealand during
+  22--30 March 2008.
+
+}
+\usage{data(wffc)}
+\format{
+  A data frame with 4267 observations on the following 8 variables.
+  Each row is a recorded capture.
+  \describe{
+    \item{\code{length}}{a numeric vector; length of fish in mm.}
+    \item{\code{water}}{a factor with levels \code{Waihou},
+    \code{Waimakariri}, \code{Whanganui}, \code{Otamangakau}, \code{Rotoaira}.
+    These are known as Sectors IV, V, I, II, III respectively, and
+    are also represented by the variable \code{sector}.
+    }
+    \item{\code{session}}{a numeric vector; a value from the set 1,2,\ldots,6.
+    These are time ordered, and there were two sessions per competition day.}
+    \item{\code{sector}}{a numeric vector; a value from the set 1,2,\ldots,5.}
+    \item{\code{beatboat}}{a numeric vector; beat or boat number,
+    a value from the set 1,2,\ldots,19.}
+    \item{\code{comid}}{a numeric vector; the competitor's ID number. Uniquely
+    identifies each competitor.
+    These ID numbers actually correspond to their rankings
+    in the individual level. }
+    \item{\code{iname}}{a character vector; the individual competitor's name. }
+    \item{\code{country}}{a character vector;
+    what country the competitors represented.
+The countries represented were
+Australia (AUS),
+Canada (CAN),
+Croatia (CRO),
+Czech Republic (CZE),
+England (ENG),
+Finland (FIN),
+France (FRA),
+Holland (NED),
+Ireland (IRE),
+Italy (ITA),
+Japan (JPN),
+Malta (MAL),
+New Zealand (NZL),
+Poland (POL),
+Portugal (POR),
+South Africa (RSA),
+Slovakia (SVK),
+USA (USA),
+Wales (WAL).
+  }
+  }
+}
+\details{
+  Details may be obtained at the official website and Yee (2008).
+  Here is a brief summary.
+  The three competition days were 28--30 March.
+  Each session was fixed at 9.00am--12.00pm and 2.30--5.30pm daily.
+  One of the sessions was a rest session.
+  Each of 19 teams had 5 members, called A, B, C, D and E
+  (there was a composite team, actually).
+  The scoring system allocated 100 points to each eligible fish
+  (minimum length was 18 cm)
+  and 20 points for each cm of its length
+  (rounded up to the nearest centimeter).
+  Thus a 181mm or 190mm fish was worth 480 points.
+  Each river was divided into 19 contiguous downstream beats labelled
+  1,2,\ldots,19.
+  Each lake was fished by 9 boats, each with two competitors
+  except for one boat which only had one.
+  Each competitor was randomly assigned to a beat/boat.
+
+Competitors were ranked according to their placings at each sector-session
+combination, and then these placings were summed. Those with the minimum
+total placings were the winners, thus it was not necessarily those who had
+the maximum points who won. For example, in Session 1 at the Waihou River,
+each of the 19 competitors was ranked 1 (best) to 19 (worst) according
+to the point system. This is the ``placing'' for that session. These
+placings were added up over the 5 sessions to give the ``total placings''.
+
+All sectors have naturally wild Rainbow trout (\emph{Oncorhynchus mykiss})
+while Lake Otamangakau and the Whanganui River also holds Brown trout
+(\emph{Salmo trutta}). Only these two species were targetted.
+The species was not recorded electronically, however a post-analysis
+of the paper score sheets from the two lakes showed that, approximately,
+less than 5 percent were Brown trout.
+It may be safely assumed that all the Waihou and Waimakariri
+fish were Rainbow trout.
+The gender of the fish were also not recorded electronically, and
+anyway, distinguishing between male and female was very difficult
+for small fish.
+
+Although species and gender data were supposed to have been
+collected at the time of capture the quality of these variables 
+is rather poor and furthermore they were not recorded electronically.
+
+% 11 out of (11 + 210) were brown trout, in Otamangakau.
+%  52 were NAs.
+%
+%  3 out of ( 3 + 179) were brown trout, in Rotoaira.
+%  19 were NAs.
+
+  Note that some fish may have been caught more than once, hence
+  these data do not represent individual fish but rather recorded captures.
+
+}
+
+\seealso{
+  \code{\link{wffc.indiv}},
+  \code{\link{wffc.teams}},
+  \code{\link{wffc.nc}},
+  \code{\link{wffc.P1}}.
+
+}
+\source{
+  This data frame was adapted from the WFFC's spreadsheet.
+  Special thanks goes to 
+  Paul Dewar,
+  Jill Mandeno,
+  Ilkka Pirinen,
+  and the other members of the Organising Committee of the 28th FIPS-Mouche
+  World Fly Fishing Championships for access to the data.
+  The assistance and feedback of Colin Shepherd is gratefully
+  acknowledged.
+
+}
+\references{
+  \url{http://www.2008worldflyfishingchamps.com}
+  is the official website.
+
+  Yee, T. W. (2008)
+  Vector generalized linear and additive models, with
+  applications to the 2008 World Fly Fishing Championships.
+  In preparation.
+
+}
+\examples{
+data(wffc)
+summary(wffc)
+with(wffc, table(water,session))
+
+# Obtain some simple plots
+waihou = with(wffc, wffc[water=="Waihou",])
+waimak = with(wffc, wffc[water=="Waimakariri",])
+whang = with(wffc, wffc[water=="Whanganui",])
+otam = with(wffc, wffc[water=="Otamangakau",])
+roto = with(wffc, wffc[water=="Rotoaira",])
+minlength = min(wffc[,"length"])
+maxlength = max(wffc[,"length"])
+nwater = c("Waihou"=nrow(waihou), "Waimakariri"=nrow(waimak),
+           "Whanganui"=nrow(whang), "Otamangakau"=nrow(otam),
+           "Rotoaira"=nrow(roto))
+\dontrun{
+par(mfrow=c(2,3), las=1)
+# Overall distribution of length
+with(wffc, boxplot(length/10 ~ water, ylim=c(minlength, maxlength)/10,
+                   border="blue", main="Length (cm)"))
+
+# Overall distribution of LOG length
+with(wffc, boxplot(length/10 ~ water, ylim=c(minlength, maxlength)/10,
+                   border="blue", log="y",
+                   main="Length (cm) on a log scale"))
+
+# Overall distribution of number of captures
+pie(nwater, border="blue", main="Proportion of captures",
+    labels=names(nwater), density=10, col=1:length(nwater),
+    angle=85+30* 1:length(nwater))
+
+# Overall distribution of number of captures
+with(wffc, barplot(nwater, main="Number of captures", cex.names=0.5))
+
+# Overall distribution of proportion of number of captures
+with(wffc, barplot(nwater / sum(nwater), cex.names=0.5,
+                   main="Proportion of captures"))
+# An interesting lake
+with(roto, hist(length/10, xlab="Fish lengths (cm)", breaks=seq(18, 70, by=3),
+                prob=TRUE, ylim=c(0, 0.08), border="blue", ylab="",
+                main="Lake Rotoaira", lwd=2))
+}
+}
+\keyword{datasets}
diff --git a/man/wffc.indiv.Rd b/man/wffc.indiv.Rd
new file mode 100644
index 0000000..d33cee8
--- /dev/null
+++ b/man/wffc.indiv.Rd
@@ -0,0 +1,49 @@
+\name{wffc.indiv}
+\alias{wffc.indiv}
+\docType{data}
+\title{ 2008 World Fly Fishing Championships (Individual results) }
+\description{
+  Individual competitors' results of the 2008 FIPS-MOUCHE
+  World Fly Fishing Championships held in Rotorua, New Zealand during
+  22--30 March 2008.
+
+}
+\usage{data(wffc.indiv)}
+\format{
+  A data frame with 99 observations on the following 8 variables.
+  Some of these variable are described in \code{\link{wffc}}.
+  \describe{
+    \item{\code{totalPlacings}}{a numeric vector; these are the summed
+    placings over the 5 sessions.}
+    \item{\code{points}}{a numeric vector.}
+    \item{\code{noofcaptures}}{a numeric vector.}
+    \item{\code{longest}}{a numeric vector.}
+    \item{\code{individual}}{a numeric vector; did the competitor
+    fish in a team or as an individual?
+   (one team was made of composite countries due to low numbers).}
+    \item{\code{country}}{a character vector.}
+    \item{\code{iname}}{a character vector.}
+    \item{\code{comid}}{a numeric vector.}
+  }
+}
+\details{
+  This data frame gives the individual results of the competition.
+  See also \code{\link{wffc}} and \code{\link{wffc.teams}} for more
+  details and links.
+
+}
+\source{
+  \url{http://www.2008worldflyfishingchamps.com/}.
+}
+\references{
+  Yee, T. W. (2008)
+  Vector generalized linear and additive models, with
+  applications to the 2008 World Fly Fishing Championships.
+  In preparation.
+
+}
+\examples{
+data(wffc.indiv)
+summary(wffc.indiv)
+}
+\keyword{datasets}
diff --git a/man/wffc.nc.Rd b/man/wffc.nc.Rd
new file mode 100644
index 0000000..a4619aa
--- /dev/null
+++ b/man/wffc.nc.Rd
@@ -0,0 +1,52 @@
+\name{wffc.nc}
+\alias{wffc.nc}
+\docType{data}
+\title{ 2008 World Fly Fishing Championships (Number of captures) }
+\description{
+  Number of captures in the 2008 FIPS-MOUCHE
+  World Fly Fishing Championships held in Rotorua, New Zealand during
+  22--30 March 2008.
+
+}
+\usage{data(wffc.nc)}
+\format{
+  A data frame with 475 observations on the following 7 variables.
+  Most of these variable are described in \code{\link{wffc}}.
+  Each row is sorted by sector, session and beat.
+  \describe{
+    \item{\code{sector}}{a numeric vector.}
+    \item{\code{session}}{a numeric vector.}
+    \item{\code{beatboat}}{a numeric vector.}
+    \item{\code{numbers}}{a numeric vector.}
+    \item{\code{comid}}{a numeric vector.}
+    \item{\code{iname}}{a character vector.}
+    \item{\code{country}}{a character vector.}
+  }
+}
+\details{
+  This data frame was obtained by processing \code{\link{wffc}}.
+  The key variable is \code{numbers}, which is
+  sector-session-beat specific.
+
+  Note that some fish may have been caught more than once, hence
+  these data do not represent individual fish.
+
+}
+\source{
+  \url{http://www.2008worldflyfishingchamps.com/}.
+}
+\references{
+  Yee, T. W. (2008)
+  Vector generalized linear and additive models, with
+  applications to the 2008 World Fly Fishing Championships.
+  In preparation.
+
+}
+
+\seealso{ \code{\link{DeLury}}. }
+
+\examples{
+data(wffc.nc)
+with(wffc.nc, table(sector, session))
+}
+\keyword{datasets}
diff --git a/man/wffc.teams.Rd b/man/wffc.teams.Rd
new file mode 100644
index 0000000..5c40f8e
--- /dev/null
+++ b/man/wffc.teams.Rd
@@ -0,0 +1,44 @@
+\name{wffc.teams}
+\alias{wffc.teams}
+\docType{data}
+\title{ 2008 World Fly Fishing Championships (Team results) }
+\description{
+  Team results of the 2008 FIPS-MOUCHE
+  World Fly Fishing Championships held in Rotorua, New Zealand during
+  22--30 March 2008.
+
+}
+\usage{data(wffc.teams)}
+\format{
+  A data frame with 18 observations on the following 5 variables.
+  Some of these variable are described in \code{\link{wffc}}.
+  \describe{
+    \item{\code{country}}{a character vector.}
+    \item{\code{totalPlacings}}{a numeric vector; these are the summed
+    placings over the 5 sessions and 5 team members. }
+    \item{\code{points}}{a numeric vector; see \code{\link{wffc}}.}
+    \item{\code{noofcaptures}}{a numeric vector.}
+    \item{\code{longestfish}}{a numeric vector.}
+  }
+}
+\details{
+  This data frame gives the team results of the competition.
+  See also \code{\link{wffc}} and \code{\link{wffc.indiv}} for more
+  details and links.
+
+}
+\source{
+  \url{http://www.2008worldflyfishingchamps.com/}.
+}
+\references{
+  Yee, T. W. (2008)
+  Vector generalized linear and additive models, with
+  applications to the 2008 World Fly Fishing Championships.
+  In preparation.
+
+}
+\examples{
+data(wffc.teams)
+wffc.teams
+}
+\keyword{datasets}
diff --git a/man/zanegbinUC.Rd b/man/zanegbinUC.Rd
new file mode 100644
index 0000000..cdd6baa
--- /dev/null
+++ b/man/zanegbinUC.Rd
@@ -0,0 +1,79 @@
+\name{Zanegbin}
+\alias{Zanegbin}
+\alias{dzanegbin}
+\alias{pzanegbin}
+\alias{qzanegbin}
+\alias{rzanegbin}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{ Zero-Altered Negative Binomial Distribution }
+\description{
+  Density, distribution function, quantile function and random generation
+  for the zero-altered negative binomial distribution with parameter \code{p0}.
+
+}
+\usage{
+dzanegbin(x, p0, size, prob=NULL, munb=NULL, log = FALSE)
+pzanegbin(q, p0, size, prob=NULL, munb=NULL)
+qzanegbin(p, p0, size, prob=NULL, munb=NULL)
+rzanegbin(n, p0, size, prob=NULL, munb=NULL)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+  \item{x, q}{vector of quantiles.}
+  \item{p}{vector of probabilities.}
+  \item{n}{number of observations. Must be a single positive integer. }
+  \item{size, prob, munb, log}{
+  Parameters from the ordinary negative binomial distribution
+  (see \code{\link[stats:NegBinomial]{dnbinom}}).
+  Some arguments have been renamed slightly.
+
+  }
+  \item{p0}{
+  Probability of zero, called \eqn{p0}.
+  The default value of \code{p0=0} corresponds
+  to the response having a positive negative binomial distribution.
+
+  }
+}
+\details{
+  The probability function of \eqn{Y} is 0 with probability \code{p0},
+  else a positive \eqn{negative binomial(\mu_{nb}, size)}{negative binomial(munb, size)}
+  distribution.
+
+}
+\value{
+  \code{dzanegbin} gives the density and
+  \code{rzanegbin} generates random deviates.
+}
+%\references{ }
+\author{ Thomas W. Yee }
+\note{ 
+    The argument \code{p0} is recycled to the required length, and
+    must have values which lie in the interval [0,1].
+
+}
+
+\seealso{ 
+    \code{\link{zanegbinomial}},
+    \code{\link{rposnegbin}}.
+
+}
+\examples{
+munb = 3
+size = 4
+p0 = 0.3
+x = (-1):7
+(i = dzanegbin(x, p0=p0, munb=munb, size=size))
+table(rzanegbin(100, p0=p0, munb=munb, size=size))
+
+\dontrun{
+x = 0:10
+barplot(rbind(dzanegbin(x, p0=p0, munb=munb, size=size),
+              dnbinom(x, mu=munb, size=size)),
+        beside = TRUE, col = c("blue","green"),
+        main=paste("ZANB(p0=", p0, ", munb=", munb, ", size=", size, ") (blue) vs",
+                        " NB(mu=", munb, ", size=", size, ") (green)", sep=""),
+        names.arg = as.character(x))
+}
+}
+\keyword{distribution}
diff --git a/man/zanegbinomial.Rd b/man/zanegbinomial.Rd
index ca154b7..9053ebe 100644
--- a/man/zanegbinomial.Rd
+++ b/man/zanegbinomial.Rd
@@ -10,8 +10,9 @@
 }
 \usage{
 zanegbinomial(lp0="logit", lmunb = "loge", lk = "loge",
-              ep0=list(), emunb =list(), ek = list(),
-              ik = 1, zero = -3, cutoff = 0.995, method.init=3)
+              ep0=list(), emunb =list(), ek = list(), ipnb0 = NULL,
+              ik = NULL, zero = -3, cutoff = 0.995, method.init=1,
+              shrinkage.init=0.95)
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
@@ -38,8 +39,15 @@ zanegbinomial(lp0="logit", lmunb = "loge", lk = "loge",
   See \code{earg} in \code{\link{Links}} for general information.
 
   }
+  \item{ipnb0}{ 
+    Optional initial values for the probability \eqn{p_0}{p0}.
+    If given, they must be in \eqn{(0,1)},
+    and it is ok to give one value each for each response/species.
+
+  }
   \item{ik}{ 
-    Initial values for \code{k}. They must be positive, and one value
+    Optional initial values for \code{k}.
+    If given, they must be positive, and give one value
     for each response/species.
 
   }
@@ -62,7 +70,7 @@ zanegbinomial(lp0="logit", lmunb = "loge", lk = "loge",
     \code{qnegbin(p)}.
 
   }
-  \item{method.init}{
+  \item{method.init, shrinkage.init}{
   See \code{\link{negbinomial}}.
 
   }
@@ -77,7 +85,7 @@ zanegbinomial(lp0="logit", lmunb = "loge", lk = "loge",
   binomial distribution in that the former has zeros coming from one
   source, whereas the latter has zeros coming from the negative binomial
   distribution too.  The zero-inflated negative binomial distribution
-  is currently not implemented in the \pkg{VGAM} package.  Some people
+  is implemented in the \pkg{VGAM} package.  Some people
   call the zero-altered negative binomial a \emph{hurdle} model.
 
   For one response/species, by default, the three linear/additive
@@ -134,20 +142,21 @@ for counts with extra zeros.
 }
 
 \seealso{
+  \code{\link{dzanegbin}},
   \code{\link{posnegbinomial}},
   \code{\link{negbinomial}},
   \code{\link{binomialff}},
   \code{\link{rposnegbin}},
   \code{\link{zinegbinomial}},
-  \code{\link{zipoisson}}.
+  \code{\link{zipoisson}},
+  \code{\link[stats:NegBinomial]{dnbinom}}.
 }
 
 \examples{
-\dontrun{
 x = runif(n <- 2000)
 p0 = logit(-1 + 2*x, inverse=TRUE)
-y1 = rposnegbin(n, munb=exp(0+2*x), k=exp(1))   # With covariates
-y2 = rposnegbin(n, munb=exp(1+2*x), k=exp(1))   # With covariates
+y1 = rposnegbin(n, munb=exp(0+2*x), size=exp(1))   # With covariates
+y2 = rposnegbin(n, munb=exp(1+2*x), size=exp(1))   # With covariates
 y1 = ifelse(runif(n) < p0, 0, y1)
 y2 = ifelse(runif(n) < p0, 0, y2)
 table(y1)
@@ -155,9 +164,8 @@ table(y2)
 
 fit = vglm(cbind(y1,y2) ~ x, zanegbinomial, trace=TRUE)
 coef(fit, matrix=TRUE)
-fitted(fit)[1:9,]
-predict(fit)[1:9,]
-}
+fitted(fit)[1:3,]
+predict(fit)[1:3,]
 }
 \keyword{models}
 \keyword{regression}
diff --git a/man/zapoisUC.Rd b/man/zapoisUC.Rd
new file mode 100644
index 0000000..0d197cb
--- /dev/null
+++ b/man/zapoisUC.Rd
@@ -0,0 +1,77 @@
+\name{Zapois}
+\alias{Zapois}
+\alias{dzapois}
+\alias{pzapois}
+\alias{qzapois}
+\alias{rzapois}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{ Zero-Altered Poisson Distribution }
+\description{
+  Density, distribution function, quantile function and random generation
+  for the zero-altered Poisson distribution with parameter \code{p0}.
+
+}
+\usage{
+dzapois(x, lambda, p0 = 0, log = FALSE)
+pzapois(q, lambda, p0 = 0)
+qzapois(p, lambda, p0 = 0)
+rzapois(n, lambda, p0 = 0)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+  \item{x, q}{vector of quantiles.}
+  \item{p}{vector of probabilities.}
+  \item{n}{number of observations. Must be a single positive integer. }
+  \item{lambda}{ Vector of positive means. }
+  \item{p0}{
+  Probability of zero, called \eqn{p0}.
+  The default value of \code{p0=0} corresponds
+  to the response having a positive Poisson distribution.
+
+  }
+  \item{log}{ Logical. Return the logarithm of the answer? }
+}
+\details{
+  The probability function of \eqn{Y} is 0 with probability
+  \code{p0}, else a positive \eqn{Poisson(\lambda)}{Poisson(lambda)}.
+
+}
+\value{
+  \code{dzapois} gives the density,
+  \code{pzapois} gives the distribution function,
+  \code{qzapois} gives the quantile function, and
+  \code{rzapois} generates random deviates.
+}
+%\references{ }
+\author{ Thomas W. Yee }
+\note{ 
+    The argument \code{p0} is recycled to the required length, and
+    must have values which lie in the interval [0,1].
+
+}
+
+\seealso{ 
+    \code{\link{zapoisson}}.
+
+}
+\examples{
+lambda = 3
+p0 = 0.2
+x = (-1):7
+(i = dzapois(x, lambda, p0))
+max(abs(cumsum(i) - pzapois(x, lambda, p0)))  # Should be 0
+table(rzapois(100, lambda, p0))
+
+table(qzapois(runif(100), lambda, p0))
+round(dzapois(0:10, lambda, p0) * 100) # Should be similar
+
+\dontrun{
+x = 0:10
+barplot(rbind(dzapois(x, lambda, p0), dpois(x, lambda)),
+        beside = TRUE, col = c("blue","green"),
+        main=paste("ZAP(", lambda, ", p0=", p0, ") (blue) vs",
+                        " Poisson(", lambda, ") (green)", sep=""),
+        names.arg = as.character(x))
+}
+}
+\keyword{distribution}
diff --git a/man/zapoisson.Rd b/man/zapoisson.Rd
index decdb4c..f9f210f 100644
--- a/man/zapoisson.Rd
+++ b/man/zapoisson.Rd
@@ -9,9 +9,8 @@
 
 }
 \usage{
-zapoisson(lp0 = "logit", llambda = "loge",
-          ep0=list(), elambda=list(),
-          zero=NULL)
+zapoisson(lp0 = "logit", llambda = "loge", ep0=list(),
+          elambda=list(), zero=NULL)
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
@@ -40,8 +39,8 @@ zapoisson(lp0 = "logit", llambda = "loge",
   (after \code{lp0} is applied) is modelled as a single unknown
   number that is estimated. It is modelled as a function of the
   explanatory variables by \code{zero=NULL}. A negative value
-  means that the value is recycled, so setting \eqn{-1} means all \eqn{p_0}{p0}
-  are intercept-only (for multivariate responses).
+  means that the value is recycled, so setting \eqn{-1} means
+  all \eqn{p_0}{p0} are intercept-only (for multivariate responses).
 
   }
 }
@@ -52,7 +51,7 @@ zapoisson(lp0 = "logit", llambda = "loge",
   which is modelled as a function of the covariates.  The zero-altered
   Poisson distribution differs from the zero-inflated Poisson distribution
   in that the former has zeros coming from one source, whereas the latter
-  has zeros coming from the Poisson distribution too.  Some people call
+  has zeros coming from the Poisson distribution too. Some people call
   the zero-altered Poisson a \emph{hurdle} model.
 
   For one response/species, by default, the two linear/additive predictors
@@ -122,12 +121,13 @@ that these are reasonable.
 }
 
 \seealso{
+  \code{\link{rzapois}},
   \code{\link{zipoisson}},
-  \code{\link{yip88}},
   \code{\link{pospoisson}},
   \code{\link{posnegbinomial}},
   \code{\link{binomialff}},
   \code{\link{rpospois}}.
+
 }
 
 \examples{
diff --git a/man/zibinomUC.Rd b/man/zibinomUC.Rd
index ad78365..07d5cb7 100644
--- a/man/zibinomUC.Rd
+++ b/man/zibinomUC.Rd
@@ -63,7 +63,7 @@ rzibinom(n, size, prob, phi = 0)
 \examples{
 prob = 0.2; size = 10; phi = 0.5
 (i = dzibinom(0:size, size, prob, phi=phi))
-cumsum(i) - pzibinom(0:size, size, prob, phi=phi)  # Should be 0s
+max(abs(cumsum(i) - pzibinom(0:size, size, prob, phi=phi)))  # Should be 0
 table(rzibinom(100, size, prob, phi=phi))
 
 table(qzibinom(runif(100), size, prob, phi=phi))
diff --git a/man/zinbUC.Rd b/man/zinegbinUC.Rd
similarity index 69%
rename from man/zinbUC.Rd
rename to man/zinegbinUC.Rd
index b2a0c45..8bd8465 100644
--- a/man/zinbUC.Rd
+++ b/man/zinegbinUC.Rd
@@ -1,9 +1,9 @@
-\name{Zinb}
-\alias{Zinb}
-\alias{dzinb}
-\alias{pzinb}
-\alias{qzinb}
-\alias{rzinb}
+\name{Zinegbin}
+\alias{Zinegbin}
+\alias{dzinegbin}
+\alias{pzinegbin}
+\alias{qzinegbin}
+\alias{rzinegbin}
 %- Also NEED an '\alias' for EACH other topic documented here.
 \title{ Zero-Inflated Negative Binomial Distribution }
 \description{
@@ -12,10 +12,10 @@
 
 }
 \usage{
-dzinb(x, phi, size, prob=NULL, munb=NULL, log=FALSE)
-pzinb(q, phi, size, prob=NULL, munb=NULL)
-qzinb(p, phi, size, prob=NULL, munb=NULL)
-rzinb(n, phi, size, prob=NULL, munb=NULL)
+dzinegbin(x, phi, size, prob=NULL, munb=NULL, log=FALSE)
+pzinegbin(q, phi, size, prob=NULL, munb=NULL)
+qzinegbin(p, phi, size, prob=NULL, munb=NULL)
+rzinegbin(n, phi, size, prob=NULL, munb=NULL)
 }
 %- maybe also 'usage' for other objects documented here.
 \arguments{
@@ -50,10 +50,10 @@ rzinb(n, phi, size, prob=NULL, munb=NULL)
 
 }
 \value{
-  \code{dzinb} gives the density,
-  \code{pzinb} gives the distribution function,
-  \code{qzinb} gives the quantile function, and
-  \code{rzinb} generates random deviates.
+  \code{dzinegbin} gives the density,
+  \code{pzinegbin} gives the distribution function,
+  \code{qzinegbin} gives the quantile function, and
+  \code{rzinegbin} generates random deviates.
 }
 %\references{ }
 \author{ Thomas W. Yee }
@@ -70,22 +70,22 @@ rzinb(n, phi, size, prob=NULL, munb=NULL)
 
 }
 \examples{
-munb = 3; phi = 0.2; k = 10
+munb = 3; phi = 0.2; size = k = 10
 x = 0:10
-(i = dzinb(x, phi=phi, mu=munb, size=k))
-cumsum(i) - pzinb(x, phi=phi, mu=munb, size=k)  # Should be 0s
-table(rzinb(100, phi=phi, mu=munb, size=k))
+(i = dzinegbin(x, phi=phi, mu=munb, size=k))
+max(abs(cumsum(i) - pzinegbin(x, phi=phi, mu=munb, size=k))) # Should be 0
+table(rzinegbin(100, phi=phi, mu=munb, size=k))
 
-table(qzinb(runif(1000), phi=phi, mu=munb, size=k))
-round(dzinb(x, phi=phi, mu=munb, size=k) * 1000) # Should be similar
+table(qzinegbin(runif(1000), phi=phi, mu=munb, size=k))
+round(dzinegbin(x, phi=phi, mu=munb, size=k) * 1000) # Should be similar
 
 \dontrun{
-barplot(rbind(dzinb(x, phi=phi, mu=munb, size=k),
+barplot(rbind(dzinegbin(x, phi=phi, mu=munb, size=k),
               dnbinom(x, mu=munb, size=k)),
         beside = TRUE, col = c("blue","green"),
         main=paste("ZINB(mu=", munb, ", k=", k, ", phi=", phi,
                    ") (blue) vs negative binomial(mu=", munb,
-                   ", k=", k, ") (green)", sep=""),
+                   ", size=", k, ") (green)", sep=""),
         names.arg = as.character(x))
 }
 }
diff --git a/man/zinegbinomial.Rd b/man/zinegbinomial.Rd
index 6383889..f268741 100644
--- a/man/zinegbinomial.Rd
+++ b/man/zinegbinomial.Rd
@@ -109,7 +109,9 @@ zinegbinomial(lphi="logit", lmunb = "loge", lk = "loge",
 }
 
 \section{Warning }{
-  Numerical problems can occur.
+  Numerical problems can occur, e.g., when the probability of
+  zero is actually less than, not more than, the nominal
+  probability of zero.
   Half-stepping is not uncommon.
   If failure to converge occurs, try using combinations of
   \code{method.init},
@@ -121,7 +123,7 @@ zinegbinomial(lphi="logit", lmunb = "loge", lk = "loge",
 } 
 
 \seealso{
-  \code{\link{Zinb}},
+  \code{\link{Zinegbin}},
   \code{\link{negbinomial}},
   \code{\link[stats:negative binomial]{rpois}}.
 
@@ -131,8 +133,8 @@ x = runif(n <- 1000)
 phi = logit(-0.5+1*x, inverse=TRUE)
 munb = exp(3+x)
 k = exp(0+2*x)
-y1 = rzinb(n, phi, mu=munb, size=k)
-y2 = rzinb(n, phi, mu=munb, size=k)
+y1 = rzinegbin(n, phi, mu=munb, size=k)
+y2 = rzinegbin(n, phi, mu=munb, size=k)
 table(y1)["0"] / sum(table(y1))
 table(y2)["0"] / sum(table(y2))
 fit = vglm(cbind(y1,y2) ~ x, zinegbinomial(zero=NULL), trace=TRUE)
diff --git a/man/zipebcom.Rd b/man/zipebcom.Rd
index 0dca0fb..e61d684 100644
--- a/man/zipebcom.Rd
+++ b/man/zipebcom.Rd
@@ -118,7 +118,7 @@ zipebcom(lmu12="cloglog", lphi12="logit", loratio="loge",
 
   If \eqn{\phi=0}{phi=0} then \code{zipebcom()} should be equivalent to
   \code{binom2.or("cloglog", exch=TRUE)}.
-  Full details are given in Yee and Dirnbock (2008).
+  Full details are given in Yee and Dirnbock (2009).
 
   The leading \eqn{2 \times 2}{2 x 2} submatrix of the expected
   information matrix (EIM) is of rank-1, not 2! This is due to the
@@ -149,10 +149,9 @@ zipebcom(lmu12="cloglog", lphi12="logit", loratio="loge",
 } 
 \references{
 
-  Yee, T. W. and Dirnbock, T. (2008)
-  A model for species presence/absence data at two time
-  points based on an odds ratio and zero-inflated Poisson
-  distribution.
+  Yee, T. W. and Dirnbock, T. (2009)
+  Models for species' presence/absence data at two time
+  points based on constrained ordination and odds ratio.
   In preparation.
 
 }
diff --git a/man/zipfUC.Rd b/man/zipfUC.Rd
index 6344d03..adf3a77 100644
--- a/man/zipfUC.Rd
+++ b/man/zipfUC.Rd
@@ -52,7 +52,7 @@ proby = dzipf(y, N=N, s=s)
 plot(y, proby, type="h", col="blue", ylab="P[Y=y]", ylim=c(0,0.2),
      main=paste("Zipf(N=",N,", s=",s,")", sep=""))
 sum(proby)  # Should be 1
-max(abs(cumsum(proby) - pzipf(y, N=N, s=s)))  # Should be 0
+max(abs(cumsum(proby) - pzipf(y, N=N, s=s))) # Should be 0
 }
 }
 \keyword{distribution}
diff --git a/man/zipoisUC.Rd b/man/zipoisUC.Rd
index d05ef3b..a77a677 100644
--- a/man/zipoisUC.Rd
+++ b/man/zipoisUC.Rd
@@ -12,7 +12,7 @@
 
 }
 \usage{
-dzipois(x, lambda, phi = 0)
+dzipois(x, lambda, phi = 0, log = FALSE)
 pzipois(q, lambda, phi = 0)
 qzipois(p, lambda, phi = 0)
 rzipois(n, lambda, phi = 0)
@@ -29,6 +29,7 @@ rzipois(n, lambda, phi = 0)
   to the response having an ordinary Poisson distribution.
 
   }
+  \item{log}{ Logical. Return the logarithm of the answer? }
 }
 \details{
   The probability function of \eqn{Y} is 0 with probability
@@ -55,14 +56,15 @@ rzipois(n, lambda, phi = 0)
 \seealso{ 
     \code{\link[stats:Poisson]{dpois}},
     \code{\link{zipoisson}},
-    \code{\link{rzinb}}.
+    \code{\link{rzinegbin}}.
 
 }
 \examples{
 lambda = 3
 phi = 0.2
-(i = dzipois(0:7, lambda, phi))
-cumsum(i) - pzipois(0:7, lambda, phi)  # Should be 0s
+x <- (-1):7
+(i = dzipois(x, lambda, phi))
+max(abs(cumsum(i) - pzipois(x, lambda, phi))) # Should be 0
 table(rzipois(100, lambda, phi))
 
 table(qzipois(runif(100), lambda, phi))
diff --git a/man/zipoisson.Rd b/man/zipoisson.Rd
index e1f29ca..043f214 100644
--- a/man/zipoisson.Rd
+++ b/man/zipoisson.Rd
@@ -116,7 +116,11 @@ zipoisson(lphi="logit", llambda = "loge",
 }
 
 \section{Warning }{
-  Numerical problems can occur.
+  Numerical problems can occur, e.g., when the probability of
+  zero is actually less than, not more than, the nominal
+  probability of zero.
+  For example, in the Angers and Biswas (2003) data below,
+  replacing 182 by 1 results in nonconvergence.
   Half-stepping is not uncommon.
   If failure to converge occurs, try using combinations of
   \code{method.init},
@@ -158,6 +162,10 @@ y = 0:7
 w = c(182, 41, 12, 2, 2, 0, 0, 1)
 y = y[w>0]
 w = w[w>0]
+\dontrun{
+# The zero is deflated, not inflated, giving convergence problems
+w[1] = 1
+}
 fit = vglm(y ~ 1, zipoisson(lphi=probit, iphi=0.3), wei=w, tra=TRUE)
 fit at misc$prob0  # Estimate of P(Y=0)
 coef(fit, matrix=TRUE)
diff --git a/src/fgam.f b/src/fgam.f
index 5ab50a7..333aadb 100644
--- a/src/fgam.f
+++ b/src/fgam.f
@@ -46,8 +46,8 @@ c  preceding one of lower order, and combined with the values of b-
 c  splines of corresponding order in  dbiatx  to produce the desired
 c  values.
 c
-      integer k,left,nderiv,   i,ideriv,il,j,jlow,jp1mid,kp1,kp1mm
-     *      ,ldummy,m,mhigh
+      integer k,left,nderiv,   i,ideriv,il,j,jlow,jp1mid,kp1,kp1mm,
+     *        ldummy,m,mhigh
       double precision a(k,k),dbiatx(k,nderiv),t(1),x
       double precision factor,fkp1mm,sum
       mhigh = max0(min0(nderiv,k),1)
@@ -210,8 +210,12 @@ c
    99                                   return
       end
 
-      double precision function bvalue ( t, bcoef, n, k, x, jderiv )
+
+
+c 20090105; converted bvalue into a subroutine.
+      subroutine wbvalue ( t, bcoef, n, k, x, jderiv, bvalue)
       implicit double precision(a-h,o-z) 
+      double precision bvalue
 calls  vinterv
 c
 calculates value at  x  of  jderiv-th derivative of spline from b-repr.
@@ -274,7 +278,7 @@ c     dimension t(n+k)
 current fortran standard makes it impossible to specify the length of
 c  t  precisely without the introduction of otherwise superfluous
 c  additional arguments.
-      bvalue = 0.
+      bvalue = 0.0d0
       if (jderiv .ge. k)                go to 99
 c
 c  *** find  i  s.t.  1 .le. i .lt. n+k  and  t(i) .lt. t(i+1) and
diff --git a/src/lerchphi.c b/src/lerchphi.c
index 6aabbb2..e99dc90 100644
--- a/src/lerchphi.c
+++ b/src/lerchphi.c
@@ -117,12 +117,15 @@ static int aj1234(double *z, double *s, double *v, int j, double *acc, double *r
 int lerchphi(double *z, double *s, double *v, double *acc, 
              double *result, int *iter)
     {
-  
+
 	const unsigned short int beta = 1, n = 0, imax = 100;
 	unsigned short int j, m; 
 	int i, sign, flag;
 	double v1, sn, eps0, eps, skn, skn0, omega, *num, *den, *StoreAj,
 	    factor, factor1, x, est, iom, sum1, cacc;
+
+/* Added 20090205 by T.Yee to suppress 4 warnings */
+sum1 = est = 0.0; StoreAj = &v1; m = 0;
 	
 	/* Local copy of v. */
 
diff --git a/src/lms.f b/src/lms.f
index e2e600b..183f90f 100644
--- a/src/lms.f
+++ b/src/lms.f
@@ -2,11 +2,11 @@
       implicit logical (a-z)
       integer g8jieq
       double precision psi, dwgkz6, sfnva0, fpqrt7, ghry8z(3)
-      integer one, zl9udh
+      integer uxzze7, oht3ga
       double precision aa, bb, ig5cma, fiumb4
       logical cc, pos
-      one = 1
-      zl9udh = 0
+      uxzze7 = 1
+      oht3ga = 0
       fiumb4 = 1.0d-04
       cc = (psi .ge. 0.0d0)
       if(.not.(cc))goto 23000
@@ -51,11 +51,11 @@
       implicit logical (a-z)
       integer ws5jcg
       double precision hr83e, dwgkz6, sfnva0, fpqrt7, uvf4mp(4), ghry8z
-      integer one, two, ynmzp6
+      integer uxzze7, itwo2, ynmzp6
       double precision psi, hc0tub, xkwp2m(3), dq3rxy
       ynmzp6 = 3
-      two = 2
-      one = 1
+      itwo2 = 2
+      uxzze7 = 1
       dq3rxy = 1.41421356237309515d0
       if(.not.(ws5jcg .gt. 0))goto 23014
       ghry8z = uvf4mp(4) * (uvf4mp(2)**2 + dq3rxy * fpqrt7 * hr83e * 
@@ -64,7 +64,7 @@
 23014 continue
       hc0tub = 0.564189583547756279d0
       psi = sfnva0 + dq3rxy * fpqrt7 * hr83e
-      call dpdlyjn(psi, dwgkz6, sfnva0, fpqrt7, two, xkwp2m)
+      call dpdlyjn(psi, dwgkz6, sfnva0, fpqrt7, itwo2, xkwp2m)
       ghry8z = (dexp(-hr83e*hr83e) * hc0tub) * (xkwp2m(2)**2 + (psi - 
      &sfnva0) * xkwp2m(3)) / fpqrt7**2
 23015 continue
@@ -75,10 +75,10 @@
       implicit logical (a-z)
       integer ws5jcg
       double precision hr83e, dwgkz6, sfnva0, fpqrt7, uvf4mp(4), ghry8z
-      integer one, two
+      integer uxzze7, itwo2
       double precision psi, hc0tub, mw6reg(2), dq3rxy
-      two = 2
-      one = 1
+      itwo2 = 2
+      uxzze7 = 1
       if(.not.(ws5jcg .gt. 0))goto 23016
       ghry8z = uvf4mp(4) * (-uvf4mp(2))
       goto 23017
@@ -86,7 +86,7 @@
       hc0tub = 0.564189583547756279d0
       dq3rxy = 1.41421356237309515d0
       psi = sfnva0 + dq3rxy * fpqrt7 * hr83e
-      call dpdlyjn(psi, dwgkz6, sfnva0, fpqrt7, one, mw6reg)
+      call dpdlyjn(psi, dwgkz6, sfnva0, fpqrt7, uxzze7, mw6reg)
       ghry8z = (dexp(-hr83e*hr83e) * hc0tub) * (-mw6reg(2)) / fpqrt7**2
 23017 continue
       return
@@ -96,10 +96,10 @@
       implicit logical (a-z)
       integer ws5jcg
       double precision hr83e, dwgkz6, sfnva0, fpqrt7, uvf4mp(4), ghry8z
-      integer one, two
+      integer uxzze7, itwo2
       double precision psi, oaqng6, mw6reg(2), dq3rxy
-      two = 2
-      one = 1
+      itwo2 = 2
+      uxzze7 = 1
       if(.not.(ws5jcg .gt. 0))goto 23018
       ghry8z = uvf4mp(4) * (-uvf4mp(2)) * dsqrt(8.0d0) * hr83e
       goto 23019
@@ -107,7 +107,7 @@
       oaqng6 = -1.12837916709551256d0
       dq3rxy = 1.41421356237309515d0
       psi = sfnva0 + dq3rxy * fpqrt7 * hr83e
-      call dpdlyjn(psi, dwgkz6, sfnva0, fpqrt7, one, mw6reg)
+      call dpdlyjn(psi, dwgkz6, sfnva0, fpqrt7, uxzze7, mw6reg)
       ghry8z = dexp(-hr83e*hr83e) * oaqng6 * mw6reg(2) * (psi - sfnva0) 
      &/ fpqrt7**3
 23019 continue
@@ -161,10 +161,10 @@
      &oqie8v(kk), dwgkz6(nfiumb4), sfnva0(nfiumb4), fpqrt7(nfiumb4), 
      &ghry8z(3,nfiumb4), kqoy6w
       integer w3gohz, p1rifj, nd6mep, o2yadh, btip7u, epx9jf, nepms8, 
-     &one, two
+     &uxzze7, itwo2
       double precision mu4ygk, azgts7, xmr7cj
-      one = 1
-      two = 2
+      uxzze7 = 1
+      itwo2 = 2
       o2yadh = 12
       do 23032 w3gohz = 1,nfiumb4 
       do 23034 nepms8=1,3 
diff --git a/src/rgam.f b/src/rgam.f
index 31d3153..1b538db 100644
--- a/src/rgam.f
+++ b/src/rgam.f
@@ -68,7 +68,7 @@
       ax = lspar 
       bx = uspar
       c = 0.381966011250105097d0
-      kqoy6w = 2.0d-7
+      kqoy6w = 2.0d-5
       vucgi1r = 0
       a = ax
       b = bx
@@ -193,13 +193,15 @@
       integer nb
       double precision vf1jtn(nb),eh6nly(nb),mvx9at(nb),vbxpg4(nb),tb(
      &nb+4)
-      integer m5xudf,ilo,i6ndbu, ynmzp6, def4wn
+      integer m5xudf,ilo,i6ndbu, ynmzp6, def4wn, nbp1
       integer w3gohz,p1rifj,d9rjek
+      integer tlpr2hal
       double precision uq9jtc(4,3),bgu6fw(16),avoe4y(4),yw2(4), wpt
       double precision uoqx2m
       uoqx2m = 1.0d0 / 3.0d0
       ynmzp6 = 3
       def4wn = 4
+      nbp1 = nb + 1
       do 23045 w3gohz = 1,nb 
       vf1jtn(w3gohz) = 0.0d0
       eh6nly(w3gohz) = 0.0d0
@@ -208,7 +210,7 @@
 23045 continue
       ilo = 1
       do 23047 w3gohz = 1,nb 
-      call vinterv(tb(1),(nb+1),tb(w3gohz),m5xudf,i6ndbu)
+      call vinterv(tb(1), nbp1 ,tb(w3gohz),m5xudf,i6ndbu)
       call vbsplvd(tb,def4wn,tb(w3gohz),m5xudf,bgu6fw,uq9jtc,ynmzp6)
       do 23049 p1rifj = 1,4 
       avoe4y(p1rifj) = uq9jtc(p1rifj,3) 
@@ -221,26 +223,27 @@
       if(.not.(m5xudf .ge. 4))goto 23053
       do 23055 p1rifj = 1,4 
       d9rjek = p1rifj
-      vf1jtn(m5xudf-4+p1rifj) = vf1jtn(m5xudf-4+p1rifj) + wpt * (avoe4y(
-     &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
-     &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+      tlpr2hal = m5xudf-4+p1rifj
+      vf1jtn(tlpr2hal) = vf1jtn(tlpr2hal) + wpt * (avoe4y(p1rifj)*
+     &avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(
+     &p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
       d9rjek = p1rifj+1
       if(.not.(d9rjek .le. 4))goto 23057
-      eh6nly(m5xudf+p1rifj-4) = eh6nly(m5xudf+p1rifj-4) + wpt* (avoe4y(
-     &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
-     &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+      eh6nly(tlpr2hal) = eh6nly(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+     &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+     &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
 23057 continue
       d9rjek = p1rifj+2
       if(.not.(d9rjek .le. 4))goto 23059
-      mvx9at(m5xudf+p1rifj-4) = mvx9at(m5xudf+p1rifj-4) + wpt* (avoe4y(
-     &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
-     &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+      mvx9at(tlpr2hal) = mvx9at(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+     &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+     &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
 23059 continue
       d9rjek = p1rifj+3
       if(.not.(d9rjek .le. 4))goto 23061
-      vbxpg4(m5xudf+p1rifj-4) = vbxpg4(m5xudf+p1rifj-4) + wpt* (avoe4y(
-     &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
-     &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+      vbxpg4(tlpr2hal) = vbxpg4(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+     &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+     &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
 23061 continue
 23055 continue
       goto 23054
@@ -248,20 +251,21 @@
       if(.not.(m5xudf .eq. 3))goto 23063
       do 23065 p1rifj = 1,3 
       d9rjek = p1rifj
-      vf1jtn(m5xudf-3+p1rifj) = vf1jtn(m5xudf-3+p1rifj) + wpt* (avoe4y(
-     &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
-     &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+      tlpr2hal = m5xudf-3+p1rifj
+      vf1jtn(tlpr2hal) = vf1jtn(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+     &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+     &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
       d9rjek = p1rifj+1
       if(.not.(d9rjek .le. 3))goto 23067
-      eh6nly(m5xudf+p1rifj-3) = eh6nly(m5xudf+p1rifj-3) + wpt* (avoe4y(
-     &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
-     &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+      eh6nly(tlpr2hal) = eh6nly(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+     &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+     &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
 23067 continue
       d9rjek = p1rifj+2
       if(.not.(d9rjek .le. 3))goto 23069
-      mvx9at(m5xudf+p1rifj-3) = mvx9at(m5xudf+p1rifj-3) + wpt* (avoe4y(
-     &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
-     &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+      mvx9at(tlpr2hal) = mvx9at(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+     &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+     &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
 23069 continue
 23065 continue
       goto 23064
@@ -269,14 +273,15 @@
       if(.not.(m5xudf .eq. 2))goto 23071
       do 23073 p1rifj = 1,2 
       d9rjek = p1rifj
-      vf1jtn(m5xudf-2+p1rifj) = vf1jtn(m5xudf-2+p1rifj) + wpt* (avoe4y(
-     &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
-     &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+      tlpr2hal = m5xudf-2+p1rifj
+      vf1jtn(tlpr2hal) = vf1jtn(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+     &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+     &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
       d9rjek = p1rifj+1
       if(.not.(d9rjek .le. 2))goto 23075
-      eh6nly(m5xudf+p1rifj-2) = eh6nly(m5xudf+p1rifj-2) + wpt* (avoe4y(
-     &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
-     &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+      eh6nly(tlpr2hal) = eh6nly(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+     &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+     &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
 23075 continue
 23073 continue
       goto 23072
@@ -284,9 +289,10 @@
       if(.not.(m5xudf .eq. 1))goto 23077
       do 23079 p1rifj = 1,1 
       d9rjek = p1rifj
-      vf1jtn(m5xudf-1+p1rifj) = vf1jtn(m5xudf-1+p1rifj) + wpt* (avoe4y(
-     &p1rifj)*avoe4y(d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)
-     &*avoe4y(p1rifj))*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
+      tlpr2hal = m5xudf-1+p1rifj
+      vf1jtn(tlpr2hal) = vf1jtn(tlpr2hal) + wpt* (avoe4y(p1rifj)*avoe4y(
+     &d9rjek) + (yw2(p1rifj)*avoe4y(d9rjek) + yw2(d9rjek)*avoe4y(p1rifj)
+     &)*0.50 + yw2(p1rifj)*yw2(d9rjek)*uoqx2m)
 23079 continue
 23077 continue
 23072 continue
@@ -295,38 +301,40 @@
 23047 continue
       return
       end
-      subroutine gayot2(rlep7v,lunah2,p2ip, mk2vyr,nk,thfyl1,sbkvx6)
+      subroutine gayot2(rlep7v,lunah2,p2ip, mk2vyr,nk,thfyl1,isbkvx6)
       implicit logical (a-z)
-      integer mk2vyr,nk,thfyl1,sbkvx6
+      integer mk2vyr,nk,thfyl1,isbkvx6
       double precision rlep7v(mk2vyr,nk), lunah2(mk2vyr,nk), p2ip(
      &thfyl1,nk)
       integer w3gohz, d9rjek, nd6mep
       double precision yrbij3(3),vef2gk(2),cfko0l(1),c0,c1,c2,c3
+      double precision wxj6p6, k6nvd6, s6w6ny, ijk1l1, ya6c6v, vj6e6b, 
+     &rm44is, pe0ko0, by99io
       c1 = 0.0d0
       c2 = 0.0d0
       c3 = 0.0d0
       yrbij3(1) = 0.0d0
       yrbij3(2) = 0.0d0
-      yrbij3(1) = 0.0d0
+      yrbij3(3) = 0.0d0
       vef2gk(1) = 0.0d0
       vef2gk(2) = 0.0d0
       cfko0l(1) = 0.0d0
       do 23081 w3gohz = 1,nk 
       d9rjek = nk-w3gohz+1
       c0 = 1.0d0 / rlep7v(4,d9rjek)
-      if(.not.(d9rjek .le. nk-3))goto 23083
+      if(.not.(d9rjek .le. (nk-3)))goto 23083
       c1 = rlep7v(1,d9rjek+3)*c0
       c2 = rlep7v(2,d9rjek+2)*c0
       c3 = rlep7v(3,d9rjek+1)*c0
       goto 23084
 23083 continue
-      if(.not.(d9rjek .eq. nk-2))goto 23085
+      if(.not.(d9rjek .eq. (nk-2)))goto 23085
       c1 = 0.0d0
       c2 = rlep7v(2,d9rjek+2)*c0
       c3 = rlep7v(3,d9rjek+1)*c0
       goto 23086
 23085 continue
-      if(.not.(d9rjek .eq. nk-1))goto 23087
+      if(.not.(d9rjek .eq. (nk-1)))goto 23087
       c1 = 0.0d0
       c2 = 0.0d0
       c3 = rlep7v(3,d9rjek+1)*c0
@@ -340,15 +348,20 @@
 23088 continue
 23086 continue
 23084 continue
-      lunah2(1,d9rjek) = 0.0d0 - (c1*yrbij3(1)+c2*yrbij3(2)+c3*yrbij3(3)
-     &)
-      lunah2(2,d9rjek) = 0.0d0 - (c1*yrbij3(2)+c2*vef2gk(1)+c3*vef2gk(2)
-     &)
-      lunah2(3,d9rjek) = 0.0d0 - (c1*yrbij3(3)+c2*vef2gk(2)+c3*cfko0l(1)
-     &)
-      lunah2(4,d9rjek) = c0**2 + c1**2 * yrbij3(1) + 2.0d0*c1*c2*yrbij3(
-     &2)+2.0d0*c1*c3*yrbij3(3) + c2**2 * vef2gk(1) + 2.0d0*c2*c3*vef2gk(
-     &2) + c3**2 * cfko0l(1)
+      wxj6p6 = c1*yrbij3(1)
+      k6nvd6 = c2*yrbij3(2)
+      s6w6ny = c3*yrbij3(3)
+      ijk1l1 = c1*yrbij3(2)
+      ya6c6v = c2*vef2gk(1)
+      vj6e6b = c3*vef2gk(2)
+      rm44is = c1*yrbij3(3)
+      pe0ko0 = c2*vef2gk(2)
+      by99io = c3*cfko0l(1)
+      lunah2(1,d9rjek) = 0.0d0 - (wxj6p6+k6nvd6+s6w6ny)
+      lunah2(2,d9rjek) = 0.0d0 - (ijk1l1+ya6c6v+vj6e6b)
+      lunah2(3,d9rjek) = 0.0d0 - (rm44is+pe0ko0+by99io)
+      lunah2(4,d9rjek) = c0**2 + c1*(wxj6p6 + 2.0d0*(k6nvd6 + s6w6ny)) +
+     & c2*(ya6c6v + 2.0d0* vj6e6b) + c3*by99io
       yrbij3(1) = vef2gk(1)
       yrbij3(2) = vef2gk(2)
       yrbij3(3) = lunah2(2,d9rjek)
@@ -356,7 +369,7 @@
       vef2gk(2) = lunah2(3,d9rjek)
       cfko0l(1) = lunah2(4,d9rjek)
 23081 continue
-      if(.not.(sbkvx6 .eq. 0))goto 23091
+      if(.not.(isbkvx6 .eq. 0))goto 23091
       return
 23091 continue
       do 23093 w3gohz = 1,nk 
@@ -391,21 +404,25 @@
      &thfyl1,fjg0qv)
       implicit logical (a-z)
       integer nfiumb4,nk,rlhz2a, mk2vyr,thfyl1,fjg0qv
-      double precision egoxa3,atqh0o,x(nfiumb4),y(nfiumb4),w(nfiumb4), 
-     &knot(nk+4), coef(nk),sz(nfiumb4),rjcq9o(nfiumb4), n9peut, dwgkz6, 
-     &mheq6i(nk), n7cuql(nk),dvpc8x(nk),hdv8br(nk),cbg5ys(nk), vf1jtn(
-     &nk),eh6nly(nk),mvx9at(nk),vbxpg4(nk), rlep7v(mk2vyr,nk),lunah2(
-     &mk2vyr,nk),p2ip(thfyl1,nk)
+      double precision egoxa3,atqh0o,x(nfiumb4),y(nfiumb4),w(nfiumb4)
+      double precision knot(nk+4), coef(nk),sz(nfiumb4),rjcq9o(nfiumb4),
+     & n9peut, dwgkz6, mheq6i(nk)
+      double precision n7cuql(nk),dvpc8x(nk),hdv8br(nk),cbg5ys(nk)
+      double precision vf1jtn(nk),eh6nly(nk),mvx9at(nk),vbxpg4(nk), 
+     &rlep7v(mk2vyr,nk),lunah2(mk2vyr,nk),p2ip(thfyl1,nk)
       double precision das4bx, bgu6fw(16), b0,b1,b2,b3,kqoy6w, uq9jtc(4,
-     &1), xv,bvalue,df
+     &1), xv,eqdf
+      double precision zh0bs0
       double precision risyv0
-      integer oht3ga, ynmzp6, ilo, i6ndbu, d9rjek, w3gohz, px1yhr, 
-     &m5xudf, def4wn
+      integer oht3ga, ynmzp6, ilo, i6ndbu, d9rjek, w3gohz
+      integer px1yhr, m5xudf, def4wn, uxzze7, nkp1
       ilo = 1
       kqoy6w = 0.1d-10
       oht3ga = 0
       ynmzp6 = 3
       def4wn = 4
+      uxzze7 = 1
+      nkp1 = nk + 1
       do 23103 w3gohz = 1,nk 
       coef(w3gohz) = mheq6i(w3gohz) 
 23103 continue
@@ -429,7 +446,7 @@
       px1yhr = 1
       do 23115 w3gohz = 1,nfiumb4 
       xv = x(w3gohz)
-      sz(w3gohz) = bvalue(knot,coef, nk,def4wn,xv,oht3ga)
+      call wbvalue(knot,coef, nk,def4wn,xv,oht3ga, sz(w3gohz))
 23115 continue
       if(.not.(rlhz2a .eq. 0))goto 23117
       return
@@ -437,7 +454,7 @@
       call gayot2(rlep7v,lunah2,p2ip, mk2vyr,nk,thfyl1,oht3ga)
       do 23119 w3gohz = 1,nfiumb4 
       xv = x(w3gohz)
-      call vinterv(knot(1),(nk+1),xv,m5xudf,i6ndbu)
+      call vinterv(knot(1), nkp1 ,xv,m5xudf,i6ndbu)
       if(.not.(i6ndbu .eq. -1))goto 23121
       m5xudf = 4 
       xv = knot(4) + kqoy6w 
@@ -447,28 +464,28 @@
       xv = knot(nk+1) - kqoy6w 
 23123 continue
       d9rjek = m5xudf-3
-      call vbsplvd(knot,4,xv,m5xudf,bgu6fw,uq9jtc,1)
+      call vbsplvd(knot,def4wn,xv,m5xudf,bgu6fw,uq9jtc,uxzze7)
       b0 = uq9jtc(1,1)
       b1 = uq9jtc(2,1)
       b2 = uq9jtc(3,1)
       b3 = uq9jtc(4,1)
-      rjcq9o(w3gohz) = (lunah2(4,d9rjek)*b0**2 + 2.0d0*lunah2(3,d9rjek)*
-     &b0*b1 + 2.0d0*lunah2(2,d9rjek)*b0*b2 + 2.0d0*lunah2(1,d9rjek)*b0*
-     &b3 + lunah2(4,d9rjek+1)*b1**2 + 2.0d0*lunah2(3,d9rjek+1)*b1*b2 + 
-     &2.0d0*lunah2(2,d9rjek+1)*b1*b3 + lunah2(4,d9rjek+2)*b2**2 + 2.0d0*
-     &lunah2(3,d9rjek+2)*b2*b3 + lunah2(4,d9rjek+3)*b3**2 ) * w(w3gohz)*
-     &*2
+      zh0bs0 = (b0 *(lunah2(4,d9rjek)*b0 + 2.0d0*(lunah2(3,d9rjek)*b1 + 
+     &lunah2(2,d9rjek)*b2 + lunah2(1,d9rjek)*b3)) + b1 *(lunah2(4,
+     &d9rjek+1)*b1 + 2.0d0*(lunah2(3,d9rjek+1)*b2 + lunah2(2,d9rjek+1)*
+     &b3)) + b2 *(lunah2(4,d9rjek+2)*b2 + 2.0d0* lunah2(3,d9rjek+2)*b3 )
+     &+ b3**2* lunah2(4,d9rjek+3)) * w(w3gohz)**2
+      rjcq9o(w3gohz) = zh0bs0
 23119 continue
       if(.not.(rlhz2a .eq. 1))goto 23125
       das4bx = 0.0d0 
-      df = 0.0d0 
+      eqdf = 0.0d0 
       risyv0 = 0.0d0
       do 23127 w3gohz = 1,nfiumb4 
       das4bx = das4bx + ((y(w3gohz)-sz(w3gohz))*w(w3gohz))**2
-      df = df + rjcq9o(w3gohz)
+      eqdf = eqdf + rjcq9o(w3gohz)
       risyv0 = risyv0 + w(w3gohz)*w(w3gohz)
 23127 continue
-      n9peut = (das4bx/risyv0)/((1.0d0-(atqh0o+egoxa3*df)/risyv0)**2)
+      n9peut = (das4bx/risyv0)/((1.0d0-(atqh0o+egoxa3*eqdf)/risyv0)**2)
       goto 23126
 23125 continue
       if(.not.(rlhz2a .eq. 2))goto 23129
@@ -500,7 +517,12 @@
      &nfiumb4+4), wevr5o(nfiumb4), n7cuql(nfiumb4),dvpc8x(nfiumb4),
      &hdv8br(nfiumb4),cbg5ys(nfiumb4)
       double precision kqoy6w,uq9jtc(4,1),bgu6fw(16)
-      integer d9rjek,w3gohz,ilo,m5xudf,i6ndbu
+      double precision gyn0o0, sce5d5
+      integer d9rjek,w3gohz,ilo,m5xudf,i6ndbu, nhwi2tb1
+      integer def4wn, uxzze7
+      uxzze7 = 1
+      def4wn = 4
+      nhwi2tb1 = nfiumb4 + 1
       do 23135 w3gohz = 1,nfiumb4 
       wevr5o(w3gohz) = 0.0d0 
       n7cuql(w3gohz) = 0.0d0 
@@ -511,7 +533,7 @@
       ilo = 1
       kqoy6w = 0.1d-9
       do 23137 w3gohz = 1,xl6qgm 
-      call vinterv(onyz6j(1),(nfiumb4+1),p3vlea(w3gohz),m5xudf,i6ndbu)
+      call vinterv(onyz6j(1), nhwi2tb1 ,p3vlea(w3gohz),m5xudf,i6ndbu)
       if(.not.(i6ndbu .eq. 1))goto 23139
       if(.not.(p3vlea(w3gohz) .le. (onyz6j(m5xudf)+kqoy6w)))goto 23141
       m5xudf = m5xudf-1
@@ -520,35 +542,31 @@
       return
 23142 continue
 23139 continue
-      call vbsplvd(onyz6j,4,p3vlea(w3gohz),m5xudf,bgu6fw,uq9jtc,1)
+      call vbsplvd(onyz6j,def4wn,p3vlea(w3gohz),m5xudf,bgu6fw,uq9jtc,
+     &uxzze7)
       d9rjek = m5xudf-4+1
-      wevr5o(d9rjek) = wevr5o(d9rjek)+w(w3gohz)**2*hr83e(w3gohz)*uq9jtc(
-     &1,1)
-      n7cuql(d9rjek) = n7cuql(d9rjek)+w(w3gohz)**2*uq9jtc(1,1)**2
-      dvpc8x(d9rjek) = dvpc8x(d9rjek)+w(w3gohz)**2*uq9jtc(1,1)*uq9jtc(2,
-     &1)
-      hdv8br(d9rjek) = hdv8br(d9rjek)+w(w3gohz)**2*uq9jtc(1,1)*uq9jtc(3,
-     &1)
-      cbg5ys(d9rjek) = cbg5ys(d9rjek)+w(w3gohz)**2*uq9jtc(1,1)*uq9jtc(4,
-     &1)
+      gyn0o0 = w(w3gohz)**2
+      sce5d5 = gyn0o0 * uq9jtc(1,1)
+      wevr5o(d9rjek) = wevr5o(d9rjek) + sce5d5*hr83e(w3gohz)
+      n7cuql(d9rjek) = n7cuql(d9rjek) + sce5d5*uq9jtc(1,1)
+      dvpc8x(d9rjek) = dvpc8x(d9rjek) + sce5d5*uq9jtc(2,1)
+      hdv8br(d9rjek) = hdv8br(d9rjek) + sce5d5*uq9jtc(3,1)
+      cbg5ys(d9rjek) = cbg5ys(d9rjek) + sce5d5*uq9jtc(4,1)
       d9rjek = m5xudf-4+2
-      wevr5o(d9rjek) = wevr5o(d9rjek)+w(w3gohz)**2*hr83e(w3gohz)*uq9jtc(
-     &2,1)
-      n7cuql(d9rjek) = n7cuql(d9rjek)+w(w3gohz)**2*uq9jtc(2,1)**2
-      dvpc8x(d9rjek) = dvpc8x(d9rjek)+w(w3gohz)**2*uq9jtc(2,1)*uq9jtc(3,
-     &1)
-      hdv8br(d9rjek) = hdv8br(d9rjek)+w(w3gohz)**2*uq9jtc(2,1)*uq9jtc(4,
-     &1)
+      sce5d5 = gyn0o0 * uq9jtc(2,1)
+      wevr5o(d9rjek) = wevr5o(d9rjek) + sce5d5*hr83e(w3gohz)
+      n7cuql(d9rjek) = n7cuql(d9rjek) + sce5d5*uq9jtc(2,1)
+      dvpc8x(d9rjek) = dvpc8x(d9rjek) + sce5d5*uq9jtc(3,1)
+      hdv8br(d9rjek) = hdv8br(d9rjek) + sce5d5*uq9jtc(4,1)
       d9rjek = m5xudf-4+3
-      wevr5o(d9rjek) = wevr5o(d9rjek)+w(w3gohz)**2*hr83e(w3gohz)*uq9jtc(
-     &3,1)
-      n7cuql(d9rjek) = n7cuql(d9rjek)+w(w3gohz)**2*uq9jtc(3,1)**2
-      dvpc8x(d9rjek) = dvpc8x(d9rjek)+w(w3gohz)**2*uq9jtc(3,1)*uq9jtc(4,
-     &1)
-      d9rjek = m5xudf-4+4
-      wevr5o(d9rjek) = wevr5o(d9rjek)+w(w3gohz)**2*hr83e(w3gohz)*uq9jtc(
-     &4,1)
-      n7cuql(d9rjek) = n7cuql(d9rjek)+w(w3gohz)**2*uq9jtc(4,1)**2
+      sce5d5 = gyn0o0 * uq9jtc(3,1)
+      wevr5o(d9rjek) = wevr5o(d9rjek) + sce5d5*hr83e(w3gohz)
+      n7cuql(d9rjek) = n7cuql(d9rjek) + sce5d5*uq9jtc(3,1)
+      dvpc8x(d9rjek) = dvpc8x(d9rjek) + sce5d5*uq9jtc(4,1)
+      d9rjek = m5xudf
+      sce5d5 = gyn0o0 * uq9jtc(4,1)
+      wevr5o(d9rjek) = wevr5o(d9rjek) + sce5d5*hr83e(w3gohz)
+      n7cuql(d9rjek) = n7cuql(d9rjek) + sce5d5*uq9jtc(4,1)
 23137 continue
       return
       end
diff --git a/src/testf90.f90 b/src/testf90.f90
index 9af38f5..f85a83d 100644
--- a/src/testf90.f90
+++ b/src/testf90.f90
@@ -74,3 +74,23 @@ end subroutine vgamf90mux34
 
 
 
+
+
+subroutine vgamf90memalloc(m, n)
+implicit none
+
+integer :: m, n
+real(kind(0.0d0)), allocatable :: A(:,:)
+integer :: errno
+
+allocate(A(m,n), stat=errno)
+if(errno /= 0) then ! allocation failed
+    call INTPR("in vgamf90memalloc; errno: ",-1, errno, 1)
+    stop
+end if
+
+return
+end subroutine vgamf90memalloc
+
+
+
diff --git a/src/tyeepolygamma.f b/src/tyeepolygamma.f
index 4ec7432..5fd2ef4 100644
--- a/src/tyeepolygamma.f
+++ b/src/tyeepolygamma.f
@@ -128,3 +128,28 @@
 23020 continue
       return
       end
+      subroutine cum8sum(bz4gufr, ghry8z, nghry8z, valong, ntot, 
+     &notc4uxow)
+      implicit logical (a-z)
+      integer nghry8z, ntot, notc4uxow
+      double precision bz4gufr(ntot), ghry8z(nghry8z), valong(ntot)
+      integer w3gohz, p1rifj
+      p1rifj = 1
+      ghry8z(p1rifj) = bz4gufr(p1rifj)
+      do 23024 w3gohz=2,ntot 
+      if(.not.(valong(w3gohz) .gt. valong(w3gohz-1)))goto 23026
+      ghry8z(p1rifj) = ghry8z(p1rifj) + bz4gufr(w3gohz)
+      goto 23027
+23026 continue
+      p1rifj = p1rifj + 1
+      ghry8z(p1rifj) = bz4gufr(w3gohz)
+23027 continue
+23024 continue
+      if(.not.(p1rifj .eq. nghry8z))goto 23028
+      notc4uxow = 0
+      goto 23029
+23028 continue
+      notc4uxow = 1
+23029 continue
+      return
+      end
diff --git a/src/vgam.f b/src/vgam.f
index 58ef965..424ea3a 100644
--- a/src/vgam.f
+++ b/src/vgam.f
@@ -3,14 +3,14 @@
       integer nfiumb4, nk, ikscn4, lku8xq
       double precision knot(nk+4), j1l0o1(nk,lku8xq), p3vlea(nfiumb4), 
      &ocaxi1(nfiumb4,lku8xq)
-      double precision xvalue, bvalue
+      double precision xvalue
       integer w3gohz, d9rjek, def4wn
       def4wn = 4
       do 23000 d9rjek=1,lku8xq 
       do 23002 w3gohz=1,nfiumb4 
       xvalue = p3vlea(w3gohz)
-      ocaxi1(w3gohz,d9rjek) = bvalue(knot, j1l0o1(1,d9rjek), nk, def4wn,
-     & xvalue, ikscn4)
+      call wbvalue(knot, j1l0o1(1,d9rjek), nk, def4wn, xvalue, ikscn4, 
+     &ocaxi1(w3gohz,d9rjek))
 23002 continue
 23000 continue
       return
@@ -97,7 +97,7 @@
       integer d9rjek, w3gohz, m5xudf, i6ndbu, xi1mqb, rlhz2a
       integer yc1ezl, mk2vyr, thfyl1, hts1gp(3), ispar, opf6cv
       double precision kqoy6w, uq9jtc(4,1), z2djpt(16), egoxa3, n9peut, 
-     &bt9lgm, v2isnf, fjo2dy, fpcb2n(3)
+     &bt9lgm, v2isnf, fjo2dydf, fpcb2n(3)
       do 23024 d9rjek=1,lku8xq 
       if(.not.(l6xrjt(d9rjek) .eq. 0.0d0))goto 23026
       ispar=0
@@ -111,87 +111,103 @@
      &0)))goto 23028
       mk2vyr = 4
       bt9lgm = 1.50d0
-      v2isnf = -0.25d0
+      v2isnf = 0.00d0
       thfyl1 = 1
-      fjo2dy=0.001d0
+      fjo2dydf=0.001d0
+      if(.not.(lku8xq.eq.1))goto 23030
+      fjo2dydf=0.005d0
+      goto 23031
+23030 continue
+      if(.not.(lku8xq.eq.2))goto 23032
+      fjo2dydf=0.015d0
+      goto 23033
+23032 continue
+      if(.not.(lku8xq.eq.3))goto 23034
+      fjo2dydf=0.025d0
+      goto 23035
+23034 continue
+      fjo2dydf=0.045d0
+23035 continue
+23033 continue
+23031 continue
       hts1gp(1) = rlhz2a
       hts1gp(2) = ispar
       hts1gp(3) = 300
       fpcb2n(1) = v2isnf
       fpcb2n(2) = bt9lgm
-      fpcb2n(3) = fjo2dy
+      fpcb2n(3) = fjo2dydf
       yc1ezl=0
-      if(.not.((lku8xq .eq. 1) .or. (xhe4cg.eq.lku8xq)))goto 23030
-      do 23032 w3gohz=1,nfiumb4 
+      if(.not.((lku8xq .eq. 1) .or. (xhe4cg.eq.lku8xq)))goto 23036
+      do 23038 w3gohz=1,nfiumb4 
       lj4dph(w3gohz,d9rjek) = lj4dph(w3gohz,d9rjek) / w8xfic(w3gohz,
      &d9rjek)
-23032 continue
+23038 continue
       call nvhb7f(egoxa3, dof(d9rjek), p3vlea, lj4dph(1,d9rjek), w8xfic(
      &1,d9rjek), nfiumb4,nk, onyz6j,j1l0o1(1,d9rjek), w5poyv(1,d9rjek), 
      &rjcq9o(1,d9rjek), n9peut,l6xrjt(d9rjek),fpcb2n, sz6ohy, yc1ezl,
      &hts1gp, mk2vyr,thfyl1,la5dcf)
-      if(.not.(la5dcf .ne. 0))goto 23034
+      if(.not.(la5dcf .ne. 0))goto 23040
       return
-23034 continue
-      do 23036 w3gohz=1,nfiumb4 
+23040 continue
+      do 23042 w3gohz=1,nfiumb4 
       w8xfic(w3gohz,d9rjek) = w8xfic(w3gohz,d9rjek) * w8xfic(w3gohz,
      &d9rjek)
-23036 continue
-      if(.not.(y6jcvk .ne. 0))goto 23038
-      do 23040 w3gohz=1,nfiumb4 
+23042 continue
+      if(.not.(y6jcvk .ne. 0))goto 23044
+      do 23046 w3gohz=1,nfiumb4 
       l8dgox(w3gohz,d9rjek) = rjcq9o(w3gohz,d9rjek) / w8xfic(w3gohz,
      &d9rjek)
-23040 continue
-23038 continue
-      goto 23031
-23030 continue
+23046 continue
+23044 continue
+      goto 23037
+23036 continue
       call nvhb7f(egoxa3, dof(d9rjek), p3vlea, cy3dhl(1,d9rjek), w8xfic(
      &1,d9rjek), nfiumb4,nk, onyz6j,j1l0o1(1,d9rjek),w5poyv(1,d9rjek), 
      &rjcq9o(1,d9rjek), n9peut,l6xrjt(d9rjek),fpcb2n, sz6ohy, yc1ezl,
      &hts1gp, mk2vyr,thfyl1,la5dcf)
-      if(.not.(la5dcf .ne. 0))goto 23042
+      if(.not.(la5dcf .ne. 0))goto 23048
       return
-23042 continue
-      do 23044 w3gohz=1,nfiumb4 
+23048 continue
+      do 23050 w3gohz=1,nfiumb4 
       w8xfic(w3gohz,d9rjek) = w8xfic(w3gohz,d9rjek) * w8xfic(w3gohz,
      &d9rjek)
-23044 continue
-23031 continue
-      if(.not.(la5dcf .ne. 0))goto 23046
+23050 continue
+23037 continue
+      if(.not.(la5dcf .ne. 0))goto 23052
       return
-23046 continue
+23052 continue
 23028 continue
 23024 continue
-      if(.not.((lku8xq .eq. 1) .or. (xhe4cg .eq. lku8xq)))goto 23048
+      if(.not.((lku8xq .eq. 1) .or. (xhe4cg .eq. lku8xq)))goto 23054
       return
-23048 continue
-      do 23050 w3gohz=1,nk 
-      do 23052 d9rjek=1,lku8xq 
+23054 continue
+      do 23056 w3gohz=1,nk 
+      do 23058 d9rjek=1,lku8xq 
       cy3dhl(d9rjek,w3gohz)=0.0d0
-23052 continue
-23050 continue
-      do 23054 w3gohz=1,(nk*lku8xq) 
-      do 23056 d9rjek=1,a51l0o 
-      nkzg2p(d9rjek,w3gohz) = 0.0d0
+23058 continue
 23056 continue
-23054 continue
+      do 23060 w3gohz=1,(nk*lku8xq) 
+      do 23062 d9rjek=1,a51l0o 
+      nkzg2p(d9rjek,w3gohz) = 0.0d0
+23062 continue
+23060 continue
       kqoy6w = 0.1d-9
-      do 23058 w3gohz=1,nfiumb4 
+      do 23064 w3gohz=1,nfiumb4 
       call vinterv(onyz6j(1),(nk+1),p3vlea(w3gohz),m5xudf,i6ndbu)
-      if(.not.(i6ndbu .eq. 1))goto 23060
-      if(.not.(p3vlea(w3gohz) .le. (onyz6j(m5xudf)+kqoy6w)))goto 23062
+      if(.not.(i6ndbu .eq. 1))goto 23066
+      if(.not.(p3vlea(w3gohz) .le. (onyz6j(m5xudf)+kqoy6w)))goto 23068
       m5xudf=m5xudf-1
-      goto 23063
-23062 continue
+      goto 23069
+23068 continue
       return
-23063 continue
-23060 continue
+23069 continue
+23066 continue
       call vbsplvd(onyz6j,4,p3vlea(w3gohz),m5xudf,z2djpt,uq9jtc,1)
       d9rjek= m5xudf-4+1
-      do 23064 xi1mqb=1,lku8xq 
+      do 23070 xi1mqb=1,lku8xq 
       cy3dhl(xi1mqb,d9rjek)=cy3dhl(xi1mqb,d9rjek) + lj4dph(w3gohz,
      &xi1mqb) * uq9jtc(1,1)
-23064 continue
+23070 continue
       call wgy5ta(w3gohz, d9rjek, 0, uq9jtc, nkzg2p, w8xfic, 1, 1, 
      &lku8xq, a51l0o, xhe4cg, nfiumb4, nk, zqve1l, vvl1li)
       call wgy5ta(w3gohz, d9rjek, 1, uq9jtc, nkzg2p, w8xfic, 1, 2, 
@@ -201,10 +217,10 @@
       call wgy5ta(w3gohz, d9rjek, 3, uq9jtc, nkzg2p, w8xfic, 1, 4, 
      &lku8xq, a51l0o, xhe4cg, nfiumb4, nk, zqve1l, vvl1li)
       d9rjek= m5xudf-4+2
-      do 23066 xi1mqb=1,lku8xq 
+      do 23072 xi1mqb=1,lku8xq 
       cy3dhl(xi1mqb,d9rjek)=cy3dhl(xi1mqb,d9rjek) + lj4dph(w3gohz,
      &xi1mqb) * uq9jtc(2,1)
-23066 continue
+23072 continue
       call wgy5ta(w3gohz, d9rjek, 0, uq9jtc, nkzg2p, w8xfic, 2, 2, 
      &lku8xq, a51l0o, xhe4cg, nfiumb4, nk, zqve1l, vvl1li)
       call wgy5ta(w3gohz, d9rjek, 1, uq9jtc, nkzg2p, w8xfic, 2, 3, 
@@ -212,37 +228,37 @@
       call wgy5ta(w3gohz, d9rjek, 2, uq9jtc, nkzg2p, w8xfic, 2, 4, 
      &lku8xq, a51l0o, xhe4cg, nfiumb4, nk, zqve1l, vvl1li)
       d9rjek= m5xudf-4+3
-      do 23068 xi1mqb=1,lku8xq 
+      do 23074 xi1mqb=1,lku8xq 
       cy3dhl(xi1mqb,d9rjek)=cy3dhl(xi1mqb,d9rjek) + lj4dph(w3gohz,
      &xi1mqb) * uq9jtc(3,1)
-23068 continue
+23074 continue
       call wgy5ta(w3gohz, d9rjek, 0, uq9jtc, nkzg2p, w8xfic, 3, 3, 
      &lku8xq, a51l0o, xhe4cg, nfiumb4, nk, zqve1l, vvl1li)
       call wgy5ta(w3gohz, d9rjek, 1, uq9jtc, nkzg2p, w8xfic, 3, 4, 
      &lku8xq, a51l0o, xhe4cg, nfiumb4, nk, zqve1l, vvl1li)
       d9rjek= m5xudf-4+4
-      do 23070 xi1mqb=1,lku8xq 
+      do 23076 xi1mqb=1,lku8xq 
       cy3dhl(xi1mqb,d9rjek)=cy3dhl(xi1mqb,d9rjek) + lj4dph(w3gohz,
      &xi1mqb) * uq9jtc(4,1)
-23070 continue
+23076 continue
       call wgy5ta(w3gohz, d9rjek, 0, uq9jtc, nkzg2p, w8xfic, 4, 4, 
      &lku8xq, a51l0o, xhe4cg, nfiumb4, nk, zqve1l, vvl1li)
-23058 continue
+23064 continue
       call poqy8c(vb81l0(1,1), vb81l0(1,2), vb81l0(1,3), vb81l0(1,4), 
      &onyz6j, nk)
       call j3navf(nkzg2p, nk, lku8xq, a51l0o, l6xrjt, vb81l0)
       call vdpbfa7(nkzg2p, a51l0o, nk*lku8xq, a51l0o-1, fjg0qv, vb81l0)
-      if(.not.(fjg0qv .ne. 0))goto 23072
+      if(.not.(fjg0qv .ne. 0))goto 23078
       return
-23072 continue
+23078 continue
       call vdpbsl7(nkzg2p, a51l0o, nk*lku8xq, a51l0o-1, cy3dhl, vb81l0)
       opf6cv = 0
-      do 23074 w3gohz=1,nk 
-      do 23076 d9rjek=1,lku8xq 
+      do 23080 w3gohz=1,nk 
+      do 23082 d9rjek=1,lku8xq 
       opf6cv = opf6cv + 1
       j1l0o1(w3gohz,d9rjek) = cy3dhl(d9rjek,w3gohz)
-23076 continue
-23074 continue
+23082 continue
+23080 continue
       call ye3zvn(onyz6j, p3vlea, j1l0o1, nfiumb4, nk, lku8xq, w5poyv)
       call gyzcj5(nkzg2p, nkzg2p, vb81l0, zxao0o, a51l0o-1, nk*lku8xq)
       call jiyw4z(nkzg2p, p3vlea, onyz6j, l8dgox, a51l0o, nfiumb4, nk, 
@@ -256,15 +272,17 @@
       integer nfiumb4, nk, lku8xq
       double precision knot(nk+4), p3vlea(nfiumb4), j1l0o1(nk,lku8xq), 
      &w5poyv(nfiumb4,lku8xq)
-      double precision xvalue, bvalue
-      integer w3gohz, d9rjek
-      do 23078 w3gohz=1,nfiumb4 
+      double precision xvalue
+      integer w3gohz, d9rjek, oht3ga, def4wn
+      oht3ga = 0
+      def4wn = 4
+      do 23084 w3gohz=1,nfiumb4 
       xvalue = p3vlea(w3gohz)
-      do 23080 d9rjek=1,lku8xq 
-      w5poyv(w3gohz,d9rjek) = bvalue(knot, j1l0o1(1,d9rjek), nk, 4, 
-     &xvalue, 0)
-23080 continue
-23078 continue
+      do 23086 d9rjek=1,lku8xq 
+      call wbvalue(knot, j1l0o1(1,d9rjek), nk, def4wn, xvalue, oht3ga, 
+     &w5poyv(w3gohz,d9rjek))
+23086 continue
+23084 continue
       return
       end
       subroutine vsuff9(nfiumb4,uxs1iq,ynk9ah, p3vlea,jmwo0z,w8xfic, 
@@ -279,138 +297,138 @@
      &uxs1iq,1), f0pzmy(zkjqhi,uxs1iq), lg3zhr(uxs1iq,lku8xq), bgu6fw(
      &lku8xq,lku8xq+1), ve2mqu(du8jbv,du8jbv+1), ifo4ew(lku8xq,du8jbv)
       integer w3gohz, d9rjek, nd6mep, xi1mqb, i1nkrb, j0qwtz
-      integer uxzze7
-      uxzze7 = 1
-      if(.not.(wj5shg .eq. 1))goto 23082
-      if(.not.((zkjqhi .ne. xhe4cg) .or. (du8jbv .ne. lku8xq)))goto 2308
-     &4
+      integer oneint
+      oneint = 1
+      if(.not.(wj5shg .eq. 1))goto 23088
+      if(.not.((zkjqhi .ne. xhe4cg) .or. (du8jbv .ne. lku8xq)))goto 2309
+     &0
       c4uxow = 0
       return
-23084 continue
-23082 continue
+23090 continue
+23088 continue
       j0qwtz = lku8xq * (lku8xq+1) / 2
-      if(.not.(xhe4cg .gt. j0qwtz))goto 23086
-23086 continue
+      if(.not.(xhe4cg .gt. j0qwtz))goto 23092
+23092 continue
       call qh4ulb(zqve1l, vvl1li, lku8xq)
-      do 23088 w3gohz=1,nfiumb4 
+      do 23094 w3gohz=1,nfiumb4 
       qxy6aj(ynk9ah(w3gohz))=p3vlea(w3gohz)
-23088 continue
-      do 23090 d9rjek=1,lku8xq 
-      do 23092 w3gohz=1,uxs1iq 
+23094 continue
+      do 23096 d9rjek=1,lku8xq 
+      do 23098 w3gohz=1,uxs1iq 
       lg3zhr(w3gohz,d9rjek) = 0.0d0
-23092 continue
-23090 continue
-      do 23094 d9rjek=1,xhe4cg 
-      do 23096 w3gohz=1,uxs1iq 
-      ax1cdp(w3gohz,d9rjek) = 0.0d0
+23098 continue
 23096 continue
-23094 continue
-      if(.not.(xhe4cg .ne. j0qwtz))goto 23098
-      do 23100 nd6mep=1,lku8xq 
-      do 23102 d9rjek=1,lku8xq 
-      bgu6fw(d9rjek,nd6mep) = 0.0d0
+      do 23100 d9rjek=1,xhe4cg 
+      do 23102 w3gohz=1,uxs1iq 
+      ax1cdp(w3gohz,d9rjek) = 0.0d0
 23102 continue
 23100 continue
-23098 continue
-      do 23104 w3gohz=1,nfiumb4 
-      do 23106 d9rjek=1,xhe4cg 
+      if(.not.(xhe4cg .ne. j0qwtz))goto 23104
+      do 23106 nd6mep=1,lku8xq 
+      do 23108 d9rjek=1,lku8xq 
+      bgu6fw(d9rjek,nd6mep) = 0.0d0
+23108 continue
+23106 continue
+23104 continue
+      do 23110 w3gohz=1,nfiumb4 
+      do 23112 d9rjek=1,xhe4cg 
       bgu6fw(zqve1l(d9rjek),vvl1li(d9rjek)) = w8xfic(w3gohz,d9rjek)
       bgu6fw(vvl1li(d9rjek),zqve1l(d9rjek)) = bgu6fw(zqve1l(d9rjek),
      &vvl1li(d9rjek))
-23106 continue
-      do 23108 d9rjek=1,lku8xq 
-      do 23110 nd6mep=1,lku8xq 
+23112 continue
+      do 23114 d9rjek=1,lku8xq 
+      do 23116 nd6mep=1,lku8xq 
       lg3zhr(ynk9ah(w3gohz),d9rjek) = lg3zhr(ynk9ah(w3gohz),d9rjek) + 
      &bgu6fw(d9rjek,nd6mep)*jmwo0z(w3gohz,nd6mep)
-23110 continue
-23108 continue
-      do 23112 d9rjek=1,xhe4cg 
+23116 continue
+23114 continue
+      do 23118 d9rjek=1,xhe4cg 
       ax1cdp(ynk9ah(w3gohz),d9rjek) = ax1cdp(ynk9ah(w3gohz),d9rjek) + 
      &w8xfic(w3gohz,d9rjek)
-23112 continue
-23104 continue
+23118 continue
+23110 continue
       c4uxow = 1
-      if(.not.(wj5shg .eq. 1))goto 23114
-      do 23116 w3gohz=1,uxs1iq 
-      do 23118 d9rjek=1,xhe4cg 
+      if(.not.(wj5shg .eq. 1))goto 23120
+      do 23122 w3gohz=1,uxs1iq 
+      do 23124 d9rjek=1,xhe4cg 
       bgu6fw(zqve1l(d9rjek),vvl1li(d9rjek)) = ax1cdp(w3gohz,d9rjek)
       bgu6fw(vvl1li(d9rjek),zqve1l(d9rjek)) = bgu6fw(zqve1l(d9rjek),
      &vvl1li(d9rjek))
-23118 continue
-      do 23120 d9rjek=1,lku8xq 
+23124 continue
+      do 23126 d9rjek=1,lku8xq 
       bgu6fw(d9rjek,lku8xq+1)=lg3zhr(w3gohz,d9rjek)
-23120 continue
-      call vcholf(bgu6fw, bgu6fw(1,lku8xq+1), lku8xq, c4uxow, uxzze7)
-      if(.not.(c4uxow .ne. 1))goto 23122
-      return
-23122 continue
-      if(.not.(x6rito .ne. 0))goto 23124
-      do 23126 d9rjek=1,xhe4cg 
-      f0pzmy(d9rjek,w3gohz) = bgu6fw(zqve1l(d9rjek),vvl1li(d9rjek))
 23126 continue
-23124 continue
-      do 23128 d9rjek=1,lku8xq 
-      bz3pyo(w3gohz,d9rjek)=bgu6fw(d9rjek,lku8xq+1)
+      call vcholf(bgu6fw, bgu6fw(1,lku8xq+1), lku8xq, c4uxow, oneint)
+      if(.not.(c4uxow .ne. 1))goto 23128
+      return
 23128 continue
-23116 continue
-      goto 23115
-23114 continue
-      if(.not.(xhe4cg .ne. j0qwtz))goto 23130
-      do 23132 d9rjek=1,lku8xq 
-      do 23134 nd6mep=1,lku8xq 
-      bgu6fw(d9rjek,nd6mep) = 0.0d0
-23134 continue
+      if(.not.(x6rito .ne. 0))goto 23130
+      do 23132 d9rjek=1,xhe4cg 
+      f0pzmy(d9rjek,w3gohz) = bgu6fw(zqve1l(d9rjek),vvl1li(d9rjek))
 23132 continue
 23130 continue
-      do 23136 w3gohz=1,uxs1iq 
+      do 23134 d9rjek=1,lku8xq 
+      bz3pyo(w3gohz,d9rjek)=bgu6fw(d9rjek,lku8xq+1)
+23134 continue
+23122 continue
+      goto 23121
+23120 continue
+      if(.not.(xhe4cg .ne. j0qwtz))goto 23136
+      do 23138 d9rjek=1,lku8xq 
+      do 23140 nd6mep=1,lku8xq 
+      bgu6fw(d9rjek,nd6mep) = 0.0d0
+23140 continue
+23138 continue
+23136 continue
+      do 23142 w3gohz=1,uxs1iq 
       call qh4ulb(zqve1l, vvl1li, lku8xq)
-      do 23138 d9rjek=1,xhe4cg 
+      do 23144 d9rjek=1,xhe4cg 
       bgu6fw(zqve1l(d9rjek),vvl1li(d9rjek)) = ax1cdp(w3gohz,d9rjek)
       bgu6fw(vvl1li(d9rjek),zqve1l(d9rjek)) = bgu6fw(zqve1l(d9rjek),
      &vvl1li(d9rjek))
-23138 continue
-      do 23140 d9rjek=1,lku8xq 
+23144 continue
+      do 23146 d9rjek=1,lku8xq 
       bgu6fw(d9rjek,lku8xq+1)=lg3zhr(w3gohz,d9rjek)
-23140 continue
-      do 23142 d9rjek=1,du8jbv 
-      do 23144 nd6mep=d9rjek,du8jbv 
+23146 continue
+      do 23148 d9rjek=1,du8jbv 
+      do 23150 nd6mep=d9rjek,du8jbv 
       ve2mqu(d9rjek,nd6mep) = 0.0d0
-      do 23146 xi1mqb=1,lku8xq 
-      do 23148 i1nkrb=1,lku8xq 
+      do 23152 xi1mqb=1,lku8xq 
+      do 23154 i1nkrb=1,lku8xq 
       ve2mqu(d9rjek,nd6mep) = ve2mqu(d9rjek,nd6mep) + ifo4ew(xi1mqb,
      &d9rjek) * bgu6fw(xi1mqb,i1nkrb) * ifo4ew(i1nkrb,nd6mep)
+23154 continue
+23152 continue
+23150 continue
 23148 continue
-23146 continue
-23144 continue
-23142 continue
       call qh4ulb(zqve1l, vvl1li, du8jbv)
-      do 23150 d9rjek=1,zkjqhi 
+      do 23156 d9rjek=1,zkjqhi 
       ax1cdp(w3gohz,d9rjek) = ve2mqu(zqve1l(d9rjek),vvl1li(d9rjek))
-23150 continue
-      do 23152 d9rjek=1,du8jbv 
+23156 continue
+      do 23158 d9rjek=1,du8jbv 
       ve2mqu(d9rjek,du8jbv+1) = 0.0d0
-      do 23154 xi1mqb=1,lku8xq 
+      do 23160 xi1mqb=1,lku8xq 
       ve2mqu(d9rjek,du8jbv+1) = ve2mqu(d9rjek,du8jbv+1) + ifo4ew(xi1mqb,
      &d9rjek) * bgu6fw(xi1mqb,lku8xq+1)
-23154 continue
-23152 continue
-      do 23156 d9rjek=1,du8jbv 
+23160 continue
+23158 continue
+      do 23162 d9rjek=1,du8jbv 
       lg3zhr(w3gohz,d9rjek) = ve2mqu(d9rjek,du8jbv+1)
-23156 continue
-      call vcholf(ve2mqu, ve2mqu(1,du8jbv+1), du8jbv, c4uxow, uxzze7)
-      if(.not.(c4uxow .ne. 1))goto 23158
+23162 continue
+      call vcholf(ve2mqu, ve2mqu(1,du8jbv+1), du8jbv, c4uxow, oneint)
+      if(.not.(c4uxow .ne. 1))goto 23164
       return
-23158 continue
-      if(.not.(x6rito .ne. 0))goto 23160
-      do 23162 d9rjek=1,zkjqhi 
+23164 continue
+      if(.not.(x6rito .ne. 0))goto 23166
+      do 23168 d9rjek=1,zkjqhi 
       f0pzmy(d9rjek,w3gohz) = ve2mqu(zqve1l(d9rjek),vvl1li(d9rjek))
-23162 continue
-23160 continue
-      do 23164 d9rjek=1,du8jbv 
+23168 continue
+23166 continue
+      do 23170 d9rjek=1,du8jbv 
       bz3pyo(w3gohz,d9rjek) = ve2mqu(d9rjek,du8jbv+1)
-23164 continue
-23136 continue
-23115 continue
+23170 continue
+23142 continue
+23121 continue
       return
       end
       subroutine jiyw4z(n5fkml, p3vlea, onyz6j, svpr1i, a51l0o, nfiumb4,
@@ -424,52 +442,52 @@
      &lku8xq,lku8xq), w8xfic(nfiumb4,xhe4cg), rjcq9o(nfiumb4,lku8xq)
       integer w3gohz, d9rjek, nd6mep, m5xudf, i6ndbu, xi1mqb, i1nkrb
       double precision kqoy6w, z2djpt(16), uq9jtc(4,1)
-      if(.not.(ifvar .ne. 0))goto 23166
-      do 23168 nd6mep=1,lku8xq 
-      do 23170 w3gohz=1,nfiumb4 
+      if(.not.(ifvar .ne. 0))goto 23172
+      do 23174 nd6mep=1,lku8xq 
+      do 23176 w3gohz=1,nfiumb4 
       svpr1i(w3gohz,nd6mep) = 0.0d0
-23170 continue
-23168 continue
-23166 continue
+23176 continue
+23174 continue
+23172 continue
       kqoy6w = 0.10d-9
       call qh4ulb(zqve1l, vvl1li, lku8xq)
-      do 23172 w3gohz=1,nfiumb4 
-      do 23174 d9rjek=1,lku8xq 
-      do 23176 nd6mep=1,lku8xq 
+      do 23178 w3gohz=1,nfiumb4 
+      do 23180 d9rjek=1,lku8xq 
+      do 23182 nd6mep=1,lku8xq 
       bmb(d9rjek,nd6mep)=0.0d0
-23176 continue
-23174 continue
+23182 continue
+23180 continue
       call vinterv(onyz6j(1), (nk+1), p3vlea(w3gohz), m5xudf, i6ndbu)
-      if(.not.(i6ndbu.eq. 1))goto 23178
-      if(.not.(p3vlea(w3gohz) .le. (onyz6j(m5xudf)+kqoy6w)))goto 23180
+      if(.not.(i6ndbu.eq. 1))goto 23184
+      if(.not.(p3vlea(w3gohz) .le. (onyz6j(m5xudf)+kqoy6w)))goto 23186
       m5xudf=m5xudf-1
-      goto 23181
-23180 continue
+      goto 23187
+23186 continue
       return
-23181 continue
-23178 continue
+23187 continue
+23184 continue
       call vbsplvd(onyz6j, 4, p3vlea(w3gohz), m5xudf, z2djpt, uq9jtc, 1)
       d9rjek= m5xudf-4+1
-      do 23182 xi1mqb=d9rjek,d9rjek+3 
+      do 23188 xi1mqb=d9rjek,d9rjek+3 
       call vsel(xi1mqb, xi1mqb, lku8xq, nk, a51l0o, n5fkml, bgu6fw)
       call bf7qci(lku8xq, uq9jtc(xi1mqb-d9rjek+1,1) * uq9jtc(xi1mqb-
      &d9rjek+1,1), bgu6fw, bmb)
-23182 continue
-      do 23184 xi1mqb=d9rjek,d9rjek+3 
-      do 23186 i1nkrb=xi1mqb+1,d9rjek+3 
+23188 continue
+      do 23190 xi1mqb=d9rjek,d9rjek+3 
+      do 23192 i1nkrb=xi1mqb+1,d9rjek+3 
       call vsel(xi1mqb, i1nkrb, lku8xq, nk, a51l0o, n5fkml, bgu6fw)
       call bf7qci(lku8xq, 2.0d0 * uq9jtc(xi1mqb-d9rjek+1,1) * uq9jtc(
      &i1nkrb-d9rjek+1,1), bgu6fw, bmb)
-23186 continue
-23184 continue
-      if(.not.(ifvar .ne. 0))goto 23188
-      do 23190 d9rjek=1,lku8xq 
-      svpr1i(w3gohz,d9rjek) = bmb(d9rjek,d9rjek)
+23192 continue
 23190 continue
-23188 continue
+      if(.not.(ifvar .ne. 0))goto 23194
+      do 23196 d9rjek=1,lku8xq 
+      svpr1i(w3gohz,d9rjek) = bmb(d9rjek,d9rjek)
+23196 continue
+23194 continue
       call dp2zwv(bmb, w8xfic, bgu6fw, rjcq9o, lku8xq, nfiumb4, xhe4cg, 
      &zqve1l, vvl1li, w3gohz)
-23172 continue
+23178 continue
       return
       end
       subroutine bf7qci(lku8xq, uq9jtc, bgu6fw, bmb)
@@ -477,16 +495,16 @@
       integer lku8xq
       double precision uq9jtc, bgu6fw(lku8xq,lku8xq), bmb(lku8xq,lku8xq)
       integer d9rjek, nd6mep
-      do 23192 d9rjek=1,lku8xq 
-      do 23194 nd6mep=1,lku8xq 
+      do 23198 d9rjek=1,lku8xq 
+      do 23200 nd6mep=1,lku8xq 
       bgu6fw(d9rjek,nd6mep) = bgu6fw(d9rjek,nd6mep) * uq9jtc
-23194 continue
-23192 continue
-      do 23196 d9rjek=1,lku8xq 
-      do 23198 nd6mep=1,lku8xq 
-      bmb(nd6mep,d9rjek) = bmb(nd6mep,d9rjek) + bgu6fw(nd6mep,d9rjek)
+23200 continue
 23198 continue
-23196 continue
+      do 23202 d9rjek=1,lku8xq 
+      do 23204 nd6mep=1,lku8xq 
+      bmb(nd6mep,d9rjek) = bmb(nd6mep,d9rjek) + bgu6fw(nd6mep,d9rjek)
+23204 continue
+23202 continue
       return
       end
       subroutine vsel(s, t, lku8xq, nk, a51l0o, minv, bgu6fw)
@@ -494,34 +512,34 @@
       integer s, t, lku8xq, nk, a51l0o
       double precision minv(a51l0o,nk*lku8xq), bgu6fw(lku8xq,lku8xq)
       integer w3gohz, d9rjek, y9eilo, pazyk8
-      do 23200 w3gohz=1,lku8xq 
-      do 23202 d9rjek=1,lku8xq 
-      bgu6fw(w3gohz,d9rjek) = 0.0d0
-23202 continue
-23200 continue
-      if(.not.(s .ne. t))goto 23204
       do 23206 w3gohz=1,lku8xq 
-      y9eilo = (s-1)*lku8xq + w3gohz
       do 23208 d9rjek=1,lku8xq 
-      pazyk8 = (t-1)*lku8xq + d9rjek
-      bgu6fw(w3gohz,d9rjek) = minv(a51l0o-(pazyk8-y9eilo), pazyk8)
+      bgu6fw(w3gohz,d9rjek) = 0.0d0
 23208 continue
 23206 continue
-      goto 23205
-23204 continue
-      do 23210 w3gohz=1,lku8xq 
+      if(.not.(s .ne. t))goto 23210
+      do 23212 w3gohz=1,lku8xq 
       y9eilo = (s-1)*lku8xq + w3gohz
-      do 23212 d9rjek=w3gohz,lku8xq 
+      do 23214 d9rjek=1,lku8xq 
       pazyk8 = (t-1)*lku8xq + d9rjek
       bgu6fw(w3gohz,d9rjek) = minv(a51l0o-(pazyk8-y9eilo), pazyk8)
+23214 continue
 23212 continue
+      goto 23211
 23210 continue
-      do 23214 w3gohz=1,lku8xq 
-      do 23216 d9rjek=w3gohz+1,lku8xq 
-      bgu6fw(d9rjek,w3gohz) = bgu6fw(w3gohz,d9rjek)
+      do 23216 w3gohz=1,lku8xq 
+      y9eilo = (s-1)*lku8xq + w3gohz
+      do 23218 d9rjek=w3gohz,lku8xq 
+      pazyk8 = (t-1)*lku8xq + d9rjek
+      bgu6fw(w3gohz,d9rjek) = minv(a51l0o-(pazyk8-y9eilo), pazyk8)
+23218 continue
 23216 continue
-23214 continue
-23205 continue
+      do 23220 w3gohz=1,lku8xq 
+      do 23222 d9rjek=w3gohz+1,lku8xq 
+      bgu6fw(d9rjek,w3gohz) = bgu6fw(w3gohz,d9rjek)
+23222 continue
+23220 continue
+23211 continue
       return
       end
       subroutine dp2zwv(bmb, w8xfic, bgu6fw, rjcq9o, lku8xq, nfiumb4, 
@@ -532,23 +550,23 @@
      &bgu6fw(lku8xq,lku8xq), rjcq9o(nfiumb4,lku8xq)
       double precision qnk4zf, temp
       integer d9rjek, nd6mep, xi1mqb, i1nkrb
-      do 23218 i1nkrb=1,lku8xq 
-      do 23220 d9rjek=1,lku8xq 
-      do 23222 nd6mep=1,lku8xq 
+      do 23224 i1nkrb=1,lku8xq 
+      do 23226 d9rjek=1,lku8xq 
+      do 23228 nd6mep=1,lku8xq 
       bgu6fw(nd6mep,d9rjek) = 0.0d0
-23222 continue
-23220 continue
-      do 23224 xi1mqb=1,xhe4cg 
+23228 continue
+23226 continue
+      do 23230 xi1mqb=1,xhe4cg 
       temp = w8xfic(p1rifj,xi1mqb)
       bgu6fw(zqve1l(xi1mqb),vvl1li(xi1mqb)) = temp
       bgu6fw(vvl1li(xi1mqb),zqve1l(xi1mqb)) = temp
-23224 continue
+23230 continue
       qnk4zf = 0.0d0
-      do 23226 d9rjek=1,lku8xq 
+      do 23232 d9rjek=1,lku8xq 
       qnk4zf = qnk4zf + bmb(i1nkrb,d9rjek) * bgu6fw(d9rjek,i1nkrb)
-23226 continue
+23232 continue
       rjcq9o(p1rifj,i1nkrb) = qnk4zf
-23218 continue
+23224 continue
       return
       end
       subroutine gyzcj5(n5fkml, jrxg6l, d, uu, lku8xq, nfiumb4)
@@ -560,77 +578,77 @@
       n5fkml(lku8xq+1,nfiumb4) = 1.0d0 / d(nfiumb4)
       j0izmn = lku8xq+1
       c3qxjo = nfiumb4+1 - j0izmn
-      do 23228 myx3od=c3qxjo,nfiumb4 
-      do 23230 w3gohz=1,j0izmn 
+      do 23234 myx3od=c3qxjo,nfiumb4 
+      do 23236 w3gohz=1,j0izmn 
       uu(w3gohz, myx3od-c3qxjo+1) = jrxg6l(w3gohz, myx3od)
-23230 continue
-23228 continue
+23236 continue
+23234 continue
       w3gohz = nfiumb4-1 
-23232 if(.not.(w3gohz.ge.1))goto 23234
-      if(.not.(lku8xq .lt. nfiumb4-w3gohz))goto 23235
+23238 if(.not.(w3gohz.ge.1))goto 23240
+      if(.not.(lku8xq .lt. nfiumb4-w3gohz))goto 23241
       p4gdax = lku8xq
-      goto 23236
-23235 continue
+      goto 23242
+23241 continue
       p4gdax = nfiumb4-w3gohz
-23236 continue
+23242 continue
       dibm1x=1
-23237 if(.not.(dibm1x.le.p4gdax))goto 23239
+23243 if(.not.(dibm1x.le.p4gdax))goto 23245
       n5fkml(-dibm1x+lku8xq+1,w3gohz+dibm1x) = 0.0d0
       nd6mep=1
-23240 if(.not.(nd6mep.le.dibm1x))goto 23242
+23246 if(.not.(nd6mep.le.dibm1x))goto 23248
       n5fkml(-dibm1x+lku8xq+1,w3gohz+dibm1x) = n5fkml(-dibm1x+lku8xq+1,
      &w3gohz+dibm1x) - uu(-nd6mep+lku8xq+1,w3gohz+nd6mep -c3qxjo+1) * 
      &n5fkml(nd6mep-dibm1x+lku8xq+1,w3gohz+dibm1x)
        nd6mep=nd6mep+1
-      goto 23240
-23242 continue
-23243 if(.not.(nd6mep.le.p4gdax))goto 23245
+      goto 23246
+23248 continue
+23249 if(.not.(nd6mep.le.p4gdax))goto 23251
       n5fkml(-dibm1x+lku8xq+1,w3gohz+dibm1x) = n5fkml(-dibm1x+lku8xq+1,
      &w3gohz+dibm1x) - uu(-nd6mep+lku8xq+1,w3gohz+nd6mep -c3qxjo+1) * 
      &n5fkml(dibm1x-nd6mep+lku8xq+1,w3gohz+nd6mep)
        nd6mep=nd6mep+1
+      goto 23249
+23251 continue
+       dibm1x=dibm1x+1
       goto 23243
 23245 continue
-       dibm1x=dibm1x+1
-      goto 23237
-23239 continue
       n5fkml(lku8xq+1,w3gohz) = 1.0d0 / d(w3gohz)
       dibm1x = 1
-23246 if(.not.(dibm1x.le.p4gdax))goto 23248
+23252 if(.not.(dibm1x.le.p4gdax))goto 23254
       n5fkml(lku8xq+1,w3gohz) = n5fkml(lku8xq+1,w3gohz) - uu(-dibm1x+
      &lku8xq+1,w3gohz+dibm1x -c3qxjo+1) * n5fkml(-dibm1x+lku8xq+1,
      &w3gohz+dibm1x)
        dibm1x=dibm1x+1
-      goto 23246
-23248 continue
-      if(.not.(w3gohz .eq. c3qxjo))goto 23249
+      goto 23252
+23254 continue
+      if(.not.(w3gohz .eq. c3qxjo))goto 23255
       c3qxjo = c3qxjo-1
-      if(.not.(c3qxjo .lt. 1))goto 23251
+      if(.not.(c3qxjo .lt. 1))goto 23257
       c3qxjo = 1
-      goto 23252
-23251 continue
+      goto 23258
+23257 continue
       myx3od=j0izmn-1
-23253 if(.not.(myx3od.ge.1))goto 23255
+23259 if(.not.(myx3od.ge.1))goto 23261
       nd6mep=1
-23256 if(.not.(nd6mep.le.j0izmn))goto 23258
+23262 if(.not.(nd6mep.le.j0izmn))goto 23264
       uu(nd6mep,myx3od+1) = uu(nd6mep,myx3od)
        nd6mep=nd6mep+1
-      goto 23256
-23258 continue
+      goto 23262
+23264 continue
        myx3od=myx3od-1
-      goto 23253
-23255 continue
+      goto 23259
+23261 continue
       nd6mep=1
-23259 if(.not.(nd6mep.le.j0izmn))goto 23261
+23265 if(.not.(nd6mep.le.j0izmn))goto 23267
       uu(nd6mep,1) = jrxg6l(nd6mep,c3qxjo)
        nd6mep=nd6mep+1
-      goto 23259
-23261 continue
-23252 continue
-23249 continue
+      goto 23265
+23267 continue
+23258 continue
+23255 continue
        w3gohz = w3gohz-1
-      goto 23232
-23234 continue
+      goto 23238
+23240 continue
       return
       end
       subroutine ntju9b(bz4guf,jmwo0z,w8xfic, nfiumb4,lku8xq,ynk9ah,
@@ -658,46 +676,46 @@
       integer ybfr6z
       integer w3gohz, d9rjek, nd6mep, c4bdmu, o9ljyn, tvyd2b, zx1610, 
      &c4uxow
-      integer uxzze7
+      integer oneint
       double precision kogeb2, tap0km, t7sbea
-      uxzze7 = 1
-      if(.not.(wj5shg .eq. 1))goto 23262
+      oneint = 1
+      if(.not.(wj5shg .eq. 1))goto 23268
       ybfr6z = xhe4cg
-      goto 23263
-23262 continue
+      goto 23269
+23268 continue
       ybfr6z = du8jbv*(du8jbv+1)/2
-23263 continue
+23269 continue
       call qh4ulb(zqve1l, vvl1li, lku8xq)
       call vsuff9(nfiumb4,uxs1iq,ynk9ah, bz4guf,jmwo0z,w8xfic, vy5hmo,
      &yin,win,dfsom3,lj4dph, lku8xq, xhe4cg, ybfr6z, zqve1l, vvl1li, 
-     &zxao0o, zxao0o(1,1,3), ifo4ew, du8jbv, wj5shg, uxzze7, c4uxow)
-      if(.not.(c4uxow .ne. 1))goto 23264
+     &zxao0o, zxao0o(1,1,3), ifo4ew, du8jbv, wj5shg, oneint, c4uxow)
+      if(.not.(c4uxow .ne. 1))goto 23270
       return
-23264 continue
+23270 continue
       kogeb2 = vy5hmo(1)
       tap0km = vy5hmo(uxs1iq)-vy5hmo(1)
-      do 23266 w3gohz=1,uxs1iq 
+      do 23272 w3gohz=1,uxs1iq 
       vy5hmo(w3gohz) = (vy5hmo(w3gohz)-kogeb2)/tap0km
-23266 continue
+23272 continue
       a51l0o = 4*du8jbv
       la5dcf = 0
-      do 23268 d9rjek=1,du8jbv 
-      if(.not.(l6xrjt(d9rjek) .eq. 0.0d0))goto 23270
+      do 23274 d9rjek=1,du8jbv 
+      if(.not.(l6xrjt(d9rjek) .eq. 0.0d0))goto 23276
       dof(d9rjek) = dof(d9rjek) + 1.0d0
-23270 continue
-23268 continue
+23276 continue
+23274 continue
       call qh4ulb(zqve1l, vvl1li, du8jbv)
       call vsplin(vy5hmo,lj4dph,win,uxs1iq,qc7zyb, jko0o1,a51l0o,du8jbv,
      &ybfr6z, zqve1l,vvl1li, zxao0o, l6xrjt, fjg0qv, jq8lra, j1l0o1, 
      &phqco4(1), phqco4(1+jko0o1*du8jbv*a51l0o), vb81l0, zo5jyl, y6jcvk,
      & bmb, rjcq9o, dof, ykdc2t, la5dcf, nfiumb4)
-      do 23272 d9rjek=1,du8jbv 
+      do 23278 d9rjek=1,du8jbv 
       dof(d9rjek) = -1.0d0
-      do 23274 w3gohz=1,uxs1iq 
+      do 23280 w3gohz=1,uxs1iq 
       dof(d9rjek)=dof(d9rjek)+rjcq9o(w3gohz,d9rjek)
-23274 continue
-23272 continue
-      if(.not.(du8jbv .ge. 1))goto 23276
+23280 continue
+23278 continue
+      if(.not.(du8jbv .ge. 1))goto 23282
       t7sbea = 1.0d-7
       c4bdmu = uxs1iq*du8jbv
       o9ljyn = 2*du8jbv
@@ -707,9 +725,9 @@
       call qh4ulb(zqve1l, vvl1li, du8jbv)
       call mux17f(dfsom3, phqco4, du8jbv, o9ljyn, uxs1iq, zxao0o(1,1,1),
      & zxao0o(1,1,2), zqve1l, vvl1li, ybfr6z, c4bdmu)
-      do 23278 nd6mep=1,o9ljyn 
+      do 23284 nd6mep=1,o9ljyn 
       i83h1(nd6mep) = nd6mep
-23278 continue
+23284 continue
       call dhkt9w(phqco4,c4bdmu,c4bdmu,o9ljyn,i0qvzl,i83h1,ykdc2t,
      &zx1610,t7sbea)
       call qh4ulb(zqve1l, vvl1li, du8jbv)
@@ -719,33 +737,33 @@
      &blq5vu,lq8reh, ykdc2t(1),vfd2pw,tvyd2b,fjg0qv)
       call vbksf(dfsom3,vfd2pw,du8jbv,uxs1iq,zxao0o,zqve1l,vvl1li,
      &ybfr6z)
-      if(.not.(y6jcvk .ne. 0))goto 23280
+      if(.not.(y6jcvk .ne. 0))goto 23286
       call vrinvf9(phqco4, c4bdmu, o9ljyn, c4uxow, s0(1,1,1), s0(1,1,2))
-      if(.not.(c4uxow .ne. 1))goto 23282
+      if(.not.(c4uxow .ne. 1))goto 23288
       return
-23282 continue
-      do 23284 d9rjek=1,du8jbv 
-      do 23286 w3gohz=1,uxs1iq 
+23288 continue
+      do 23290 d9rjek=1,du8jbv 
+      do 23292 w3gohz=1,uxs1iq 
       zo5jyl(w3gohz,d9rjek) = zo5jyl(w3gohz,d9rjek) - s0(d9rjek,d9rjek,
      &1) - vy5hmo(w3gohz) * (2.0d0 * s0(d9rjek,d9rjek+du8jbv,1) + 
      &vy5hmo(w3gohz) * s0(d9rjek+du8jbv,d9rjek+du8jbv,1))
+23292 continue
+23290 continue
 23286 continue
-23284 continue
-23280 continue
-      goto 23277
-23276 continue
+      goto 23283
+23282 continue
       call rpfnk6(uxs1iq, vy5hmo, win, jq8lra, vfd2pw, zo5jyl, y6jcvk)
-23277 continue
-      do 23288 w3gohz=1,uxs1iq 
-      do 23290 d9rjek=1,du8jbv 
+23283 continue
+      do 23294 w3gohz=1,uxs1iq 
+      do 23296 d9rjek=1,du8jbv 
       jq8lra(w3gohz,d9rjek) = jq8lra(w3gohz,d9rjek) - vfd2pw(d9rjek,
      &w3gohz)
-23290 continue
-23288 continue
-      do 23292 d9rjek=1,du8jbv 
+23296 continue
+23294 continue
+      do 23298 d9rjek=1,du8jbv 
       call uwye7d(nfiumb4, uxs1iq, ynk9ah, jq8lra(1,d9rjek), smo(1,
      &d9rjek))
-23292 continue
+23298 continue
       return
       end
       subroutine vbfa(d8gwha,n,lku8xq,gqai81, p3vlea,jmwo0z,w8xfic,
@@ -774,9 +792,9 @@
       p=gqai81(2)
       q=gqai81(3)
       y6jcvk= 0
-      if(.not.(gqai81(4) .eq. 1))goto 23294
+      if(.not.(gqai81(4) .eq. 1))goto 23300
       y6jcvk = 1
-23294 continue
+23300 continue
       no2fik=gqai81(6)
       zx1610=gqai81(7)
       c4bdmu=gqai81(9)
@@ -787,31 +805,31 @@
       la5dcf = 0
       a51l0o=gqai81(15)
       sehz7y = 1
-      if(.not.(tiav4e .gt. 0))goto 23296
-      do 23298 w3gohz=1,tiav4e 
+      if(.not.(tiav4e .gt. 0))goto 23302
+      do 23304 w3gohz=1,tiav4e 
       ykdc2t(w3gohz) = dof(w3gohz)
       ykdc2t(w3gohz+tiav4e) = l6xrjt(w3gohz)
       ykdc2t(w3gohz+2*tiav4e) = dof(w3gohz)
-23298 continue
-23296 continue
+23304 continue
+23302 continue
       ucgi1r = 0
-23300 if(.not.(sehz7y .ne. 0))goto 23301
+23306 if(.not.(sehz7y .ne. 0))goto 23307
       ucgi1r = ucgi1r+1
-      if(.not.(ucgi1r .gt. 1))goto 23302
-      if(.not.(tiav4e .gt. 0))goto 23304
-      do 23306 w3gohz=1,tiav4e 
+      if(.not.(ucgi1r .gt. 1))goto 23308
+      if(.not.(tiav4e .gt. 0))goto 23310
+      do 23312 w3gohz=1,tiav4e 
       if(.not.(ykdc2t(w3gohz+tiav4e).eq.0.0d0 .and.(dabs(ykdc2t(w3gohz+
-     &2*tiav4e)-dof(w3gohz))/dof(w3gohz).gt.0.05d0)))goto 23308
+     &2*tiav4e)-dof(w3gohz))/dof(w3gohz).gt.0.05d0)))goto 23314
       ykdc2t(w3gohz+2*tiav4e) = dof(w3gohz)
       dof(w3gohz)=ykdc2t(w3gohz)
       l6xrjt(w3gohz)=0.0d0
-      goto 23309
-23308 continue
+      goto 23315
+23314 continue
       ykdc2t(w3gohz+2*tiav4e) = dof(w3gohz)
-23309 continue
-23306 continue
-23304 continue
-23302 continue
+23315 continue
+23312 continue
+23310 continue
+23308 continue
       call xqasw0(d8gwha,n,lku8xq, p3vlea,jmwo0z,w8xfic,l6xrjt,dof, 
      &ynk9ah,uxs1iq,vliac4, vfd2pw,sazp9g,go0l1q,s0, lq8reh,zo5jyl,
      &h4fgoy, ioqzvb,i0qvzl, zx1610,i83h1, xbig, jrxg6l, ifo4ew, ozuw3p,
@@ -820,17 +838,17 @@
      &qc7zyb, das4bx, vlni8d, jko0o1, mnh3up, fg3pxq, p,q,y6jcvk,
      &nucgi1r,no2fik, wk2(1,1,1), wk2(1,1,2), wk2(1,1,3), c4bdmu, 
      &o9ljyn, tiav4e, xhe4cg, zkjqhi, la5dcf, a51l0o)
-      if(.not.(d8gwha .ne. 0))goto 23310
+      if(.not.(d8gwha .ne. 0))goto 23316
       call vcall2(sehz7y,w,y,go0l1q,lq8reh,jrxg6l)
-      goto 23311
-23310 continue
+      goto 23317
+23316 continue
       sehz7y = 0
-23311 continue
-      if(.not.(sehz7y .ne. 0))goto 23312
+23317 continue
+      if(.not.(sehz7y .ne. 0))goto 23318
       zx1610=0
-23312 continue
-      goto 23300
-23301 continue
+23318 continue
+      goto 23306
+23307 continue
       gqai81(7) = zx1610
       gqai81(5) = nucgi1r
       gqai81(14) = la5dcf
@@ -869,96 +887,96 @@
       t7sbea = 1.0d-7
       tvyd2b = 101
       fjg0qv = 1
-      if(.not.(q .eq. 0))goto 23314
+      if(.not.(q .eq. 0))goto 23320
       no2fik = 1
-23314 continue
-      if(.not.(d8gwha .ne. 0))goto 23316
-      do 23318 d9rjek=1,o9ljyn 
-      do 23320 w3gohz=1,c4bdmu 
-      ioqzvb(w3gohz,d9rjek)=xbig(w3gohz,d9rjek)
 23320 continue
-23318 continue
-23316 continue
-      if(.not.(zx1610.eq.0))goto 23322
+      if(.not.(d8gwha .ne. 0))goto 23322
+      do 23324 d9rjek=1,o9ljyn 
+      do 23326 w3gohz=1,c4bdmu 
+      ioqzvb(w3gohz,d9rjek)=xbig(w3gohz,d9rjek)
+23326 continue
+23324 continue
+23322 continue
+      if(.not.(zx1610.eq.0))goto 23328
       call qh4ulb(zqve1l,vvl1li,lku8xq)
       call mux17f(jrxg6l, ioqzvb, lku8xq, o9ljyn, nfiumb4, zxao0o(1,1,1)
      &, zxao0o(1,1,2), zqve1l, vvl1li, zkjqhi, c4bdmu)
-      do 23324 nd6mep=1,o9ljyn 
+      do 23330 nd6mep=1,o9ljyn 
       i83h1(nd6mep) = nd6mep
-23324 continue
+23330 continue
       call dhkt9w(ioqzvb,c4bdmu,c4bdmu,o9ljyn,i0qvzl,i83h1,t5vlzq,
      &zx1610,t7sbea)
-23322 continue
-      do 23326 d9rjek=1,lku8xq 
-      do 23328 w3gohz=1,nfiumb4 
-      go0l1q(d9rjek,w3gohz)=0.0d0
 23328 continue
-      if(.not.(q .gt. 0))goto 23330
-      do 23332 nd6mep=1,q 
-      if(.not.(wj5shg(nd6mep).eq.1))goto 23334
-      do 23336 w3gohz=1,nfiumb4 
+      do 23332 d9rjek=1,lku8xq 
+      do 23334 w3gohz=1,nfiumb4 
+      go0l1q(d9rjek,w3gohz)=0.0d0
+23334 continue
+      if(.not.(q .gt. 0))goto 23336
+      do 23338 nd6mep=1,q 
+      if(.not.(wj5shg(nd6mep).eq.1))goto 23340
+      do 23342 w3gohz=1,nfiumb4 
       go0l1q(d9rjek,w3gohz) = go0l1q(d9rjek,w3gohz) + sazp9g(w3gohz,
      &hwi2tb(nd6mep)+d9rjek-1)
-23336 continue
-      goto 23335
-23334 continue
-      do 23338 jbyv3q=1,ozuw3p(nd6mep) 
-      do 23340 w3gohz=1,nfiumb4 
+23342 continue
+      goto 23341
+23340 continue
+      do 23344 jbyv3q=1,ozuw3p(nd6mep) 
+      do 23346 w3gohz=1,nfiumb4 
       go0l1q(d9rjek,w3gohz) = go0l1q(d9rjek,w3gohz) + ifo4ew(d9rjek,
      &hwi2tb(nd6mep)+jbyv3q-1) * sazp9g(w3gohz,hwi2tb(nd6mep)+jbyv3q-1)
-23340 continue
+23346 continue
+23344 continue
+23341 continue
 23338 continue
-23335 continue
+23336 continue
 23332 continue
-23330 continue
-23326 continue
       nucgi1r = 0
       dyb3po = 1.0d0
-23342 if(.not.((dyb3po .gt. h4fgoy ) .and. (nucgi1r .lt. no2fik)))goto 2
-     &3343
+23348 if(.not.((dyb3po .gt. h4fgoy ) .and. (nucgi1r .lt. no2fik)))goto 2
+     &3349
       nucgi1r = nucgi1r + 1
       njdgw8 = 0.0d0
-      do 23344 d9rjek=1,lku8xq 
-      do 23346 w3gohz=1,nfiumb4 
+      do 23350 d9rjek=1,lku8xq 
+      do 23352 w3gohz=1,nfiumb4 
       hr83e(w3gohz,d9rjek)=jmwo0z(w3gohz,d9rjek)-go0l1q(d9rjek,w3gohz)
-23346 continue
-23344 continue
+23352 continue
+23350 continue
       call qh4ulb(zqve1l,vvl1li,lku8xq)
       call mux22f(jrxg6l,hr83e, t5vlzq, zkjqhi,zqve1l,vvl1li,nfiumb4,
      &lku8xq,zxao0o)
       call vdqrsl(ioqzvb,c4bdmu,c4bdmu,zx1610,i0qvzl, t5vlzq, wk2,wk2, 
      &lq8reh, wk2,vfd2pw,tvyd2b,fjg0qv)
       das4bx=0.0d0
-      do 23348 w3gohz=1,nfiumb4 
-      do 23350 d9rjek=1,lku8xq 
+      do 23354 w3gohz=1,nfiumb4 
+      do 23356 d9rjek=1,lku8xq 
       gwu72m = t5vlzq((w3gohz-1)*lku8xq+d9rjek) - vfd2pw(d9rjek,w3gohz)
       das4bx = das4bx + gwu72m * gwu72m
-23350 continue
-23348 continue
+23356 continue
+23354 continue
       call vbksf(jrxg6l,vfd2pw,lku8xq,nfiumb4,zxao0o,zqve1l,vvl1li,
      &zkjqhi)
-      if(.not.(q .gt. 0))goto 23352
-      do 23354 nd6mep=1,q 
-      do 23356 d9rjek=1,lku8xq 
-      if(.not.(wj5shg(nd6mep).eq.1))goto 23358
-      do 23360 w3gohz=1,nfiumb4 
+      if(.not.(q .gt. 0))goto 23358
+      do 23360 nd6mep=1,q 
+      do 23362 d9rjek=1,lku8xq 
+      if(.not.(wj5shg(nd6mep).eq.1))goto 23364
+      do 23366 w3gohz=1,nfiumb4 
       x7aort(w3gohz,d9rjek)=sazp9g(w3gohz,hwi2tb(nd6mep)+d9rjek-1)
       hr83e(w3gohz,d9rjek) = jmwo0z(w3gohz,d9rjek) - vfd2pw(d9rjek,
      &w3gohz) - go0l1q(d9rjek,w3gohz) + x7aort(w3gohz,d9rjek)
-23360 continue
-      goto 23359
-23358 continue
-      do 23362 w3gohz=1,nfiumb4 
+23366 continue
+      goto 23365
+23364 continue
+      do 23368 w3gohz=1,nfiumb4 
       x7aort(w3gohz,d9rjek)=0.0d0
-      do 23364 jbyv3q=1,ozuw3p(nd6mep) 
+      do 23370 jbyv3q=1,ozuw3p(nd6mep) 
       x7aort(w3gohz,d9rjek)=x7aort(w3gohz,d9rjek) + ifo4ew(d9rjek,
      &hwi2tb(nd6mep)+jbyv3q-1) * sazp9g(w3gohz,hwi2tb(nd6mep)+jbyv3q-1)
-23364 continue
+23370 continue
       hr83e(w3gohz,d9rjek) = jmwo0z(w3gohz,d9rjek) - vfd2pw(d9rjek,
      &w3gohz) - go0l1q(d9rjek,w3gohz) + x7aort(w3gohz,d9rjek)
+23368 continue
+23365 continue
 23362 continue
-23359 continue
-23356 continue
       rbwx6v = uxs1iq(nd6mep)
       call ntju9b(p3vlea(1,vliac4(nd6mep)),hr83e,w8xfic, nfiumb4,lku8xq,
      &ynk9ah(1,nd6mep),rbwx6v, l6xrjt(hwi2tb(nd6mep)), dof(hwi2tb(
@@ -972,48 +990,48 @@
      &4+rbwx6v)*ozuw3p(nd6mep)), t5vlzq(1+(4+2*rbwx6v)*ozuw3p(nd6mep)), 
      &t5vlzq(1+(4+3*rbwx6v)*ozuw3p(nd6mep)), t5vlzq(1+(4+4*rbwx6v)*
      &ozuw3p(nd6mep)))
-      do 23366 d9rjek=1,lku8xq 
-      if(.not.(wj5shg(nd6mep).eq.1))goto 23368
-      do 23370 w3gohz=1,nfiumb4 
+      do 23372 d9rjek=1,lku8xq 
+      if(.not.(wj5shg(nd6mep).eq.1))goto 23374
+      do 23376 w3gohz=1,nfiumb4 
       go0l1q(d9rjek,w3gohz) = go0l1q(d9rjek,w3gohz) + sazp9g(w3gohz,
      &hwi2tb(nd6mep)+d9rjek-1)
-23370 continue
-      goto 23369
-23368 continue
-      do 23372 jbyv3q=1,ozuw3p(nd6mep) 
-      do 23374 w3gohz=1,nfiumb4 
+23376 continue
+      goto 23375
+23374 continue
+      do 23378 jbyv3q=1,ozuw3p(nd6mep) 
+      do 23380 w3gohz=1,nfiumb4 
       go0l1q(d9rjek,w3gohz)=go0l1q(d9rjek,w3gohz) + ifo4ew(d9rjek,
      &hwi2tb(nd6mep)+jbyv3q-1) * sazp9g(w3gohz,hwi2tb(nd6mep)+jbyv3q-1)
-23374 continue
-23372 continue
-23369 continue
-      do 23376 w3gohz=1,nfiumb4 
+23380 continue
+23378 continue
+23375 continue
+      do 23382 w3gohz=1,nfiumb4 
       go0l1q(d9rjek,w3gohz) = go0l1q(d9rjek,w3gohz) - x7aort(w3gohz,
      &d9rjek)
-23376 continue
-23366 continue
-      do 23378 d9rjek=1,lku8xq 
-      if(.not.(wj5shg(nd6mep) .eq. 1))goto 23380
+23382 continue
+23372 continue
+      do 23384 d9rjek=1,lku8xq 
+      if(.not.(wj5shg(nd6mep) .eq. 1))goto 23386
       njdgw8 = njdgw8 + jcp1ti(nfiumb4,x7aort(1,d9rjek),sazp9g(1,hwi2tb(
      &nd6mep)+d9rjek-1), w8xfic(1,d9rjek))
-      goto 23381
-23380 continue
-      do 23382 w3gohz=1,nfiumb4 
+      goto 23387
+23386 continue
+      do 23388 w3gohz=1,nfiumb4 
       t5vlzq(w3gohz) = 0.0d0
-      do 23384 jbyv3q=1,ozuw3p(nd6mep) 
+      do 23390 jbyv3q=1,ozuw3p(nd6mep) 
       t5vlzq(w3gohz) = t5vlzq(w3gohz) + ifo4ew(d9rjek,hwi2tb(nd6mep)+
      &jbyv3q-1) * sazp9g(w3gohz,hwi2tb(nd6mep)+jbyv3q-1)
-23384 continue
-23382 continue
+23390 continue
+23388 continue
       njdgw8 = njdgw8 + jcp1ti(nfiumb4, x7aort(1,d9rjek), t5vlzq, 
      &w8xfic(1,d9rjek))
-23381 continue
-23378 continue
-      do 23386 d9rjek=1,lku8xq 
-      do 23388 w3gohz=1,nfiumb4 
+23387 continue
+23384 continue
+      do 23392 d9rjek=1,lku8xq 
+      do 23394 w3gohz=1,nfiumb4 
       hr83e(w3gohz,d9rjek)=jmwo0z(w3gohz,d9rjek)-go0l1q(d9rjek,w3gohz)
-23388 continue
-23386 continue
+23394 continue
+23392 continue
       call qh4ulb(zqve1l,vvl1li,lku8xq)
       call mux22f(jrxg6l,hr83e, t5vlzq, zkjqhi,zqve1l,vvl1li,nfiumb4,
      &lku8xq,zxao0o)
@@ -1021,51 +1039,51 @@
      &lq8reh, wk2,vfd2pw,tvyd2b,fjg0qv)
       call vbksf(jrxg6l,vfd2pw,lku8xq,nfiumb4,zxao0o,zqve1l,vvl1li,
      &zkjqhi)
-23354 continue
-23352 continue
-      if(.not.(q .gt. 0))goto 23390
+23360 continue
+23358 continue
+      if(.not.(q .gt. 0))goto 23396
       gcjn3k=0.0d0
-      do 23392 d9rjek=1,lku8xq 
-      do 23394 w3gohz=1,nfiumb4 
+      do 23398 d9rjek=1,lku8xq 
+      do 23400 w3gohz=1,nfiumb4 
       gcjn3k = gcjn3k + w8xfic(w3gohz,d9rjek) * go0l1q(d9rjek,w3gohz)**
      &2
-23394 continue
-23392 continue
-      if(.not.(gcjn3k .gt. 0.0d0))goto 23396
+23400 continue
+23398 continue
+      if(.not.(gcjn3k .gt. 0.0d0))goto 23402
       dyb3po = dsqrt(njdgw8/gcjn3k)
-      goto 23397
-23396 continue
+      goto 23403
+23402 continue
       dyb3po = 0.0d0
-23397 continue
-23390 continue
-      if(.not.(nucgi1r .eq. 1))goto 23398
+23403 continue
+23396 continue
+      if(.not.(nucgi1r .eq. 1))goto 23404
       dyb3po = 1.0d0
-23398 continue
-      goto 23342
-23343 continue
-      do 23400 d9rjek=1,o9ljyn 
+23404 continue
+      goto 23348
+23349 continue
+      do 23406 d9rjek=1,o9ljyn 
       t5vlzq(d9rjek)=lq8reh(d9rjek)
-23400 continue
-      do 23402 d9rjek=1,o9ljyn 
+23406 continue
+      do 23408 d9rjek=1,o9ljyn 
       lq8reh(i83h1(d9rjek))=t5vlzq(d9rjek)
-23402 continue
-      do 23404 w3gohz=1,nfiumb4 
-      do 23406 d9rjek=1,lku8xq 
+23408 continue
+      do 23410 w3gohz=1,nfiumb4 
+      do 23412 d9rjek=1,lku8xq 
       go0l1q(d9rjek,w3gohz) = go0l1q(d9rjek,w3gohz) + vfd2pw(d9rjek,
      &w3gohz)
-23406 continue
-23404 continue
-      if(.not.((y6jcvk .ne. 0) .and. (q .gt. 0)))goto 23408
-      do 23410 nd6mep=1,q 
-      do 23412 jbyv3q=1,ozuw3p(nd6mep) 
+23412 continue
+23410 continue
+      if(.not.((y6jcvk .ne. 0) .and. (q .gt. 0)))goto 23414
+      do 23416 nd6mep=1,q 
+      do 23418 jbyv3q=1,ozuw3p(nd6mep) 
       call uwye7d(nfiumb4,uxs1iq(nd6mep),ynk9ah(1,nd6mep), zo5jyl(1,
      &hwi2tb(nd6mep)+jbyv3q-1),x7aort)
-      do 23414 w3gohz=1,nfiumb4 
+      do 23420 w3gohz=1,nfiumb4 
       zo5jyl(w3gohz,hwi2tb(nd6mep)+jbyv3q-1) = x7aort(w3gohz,1)
+23420 continue
+23418 continue
+23416 continue
 23414 continue
-23412 continue
-23410 continue
-23408 continue
       return
       end
       subroutine kgevo5(p3vlea, xout, nfiumb4, lku8xq)
@@ -1074,32 +1092,32 @@
       double precision p3vlea(nfiumb4), xout(1)
       integer w3gohz, d9rjek, nd6mep, xtiel4
       xtiel4=1
-      do 23416 d9rjek=1,lku8xq 
-      do 23418 w3gohz=1,nfiumb4 
-      do 23420 nd6mep=1,lku8xq 
-      if(.not.(d9rjek .eq. nd6mep))goto 23422
+      do 23422 d9rjek=1,lku8xq 
+      do 23424 w3gohz=1,nfiumb4 
+      do 23426 nd6mep=1,lku8xq 
+      if(.not.(d9rjek .eq. nd6mep))goto 23428
       xout(xtiel4) = 1.0d0
-      goto 23423
-23422 continue
+      goto 23429
+23428 continue
       xout(xtiel4) = 0.0d0
-23423 continue
+23429 continue
       xtiel4=xtiel4+1
-23420 continue
-23418 continue
-23416 continue
-      do 23424 d9rjek=1,lku8xq 
-      do 23426 w3gohz=1,nfiumb4 
-      do 23428 nd6mep=1,lku8xq 
-      if(.not.(d9rjek .eq. nd6mep))goto 23430
+23426 continue
+23424 continue
+23422 continue
+      do 23430 d9rjek=1,lku8xq 
+      do 23432 w3gohz=1,nfiumb4 
+      do 23434 nd6mep=1,lku8xq 
+      if(.not.(d9rjek .eq. nd6mep))goto 23436
       xout(xtiel4) = p3vlea(w3gohz)
-      goto 23431
-23430 continue
+      goto 23437
+23436 continue
       xout(xtiel4) = 0.0d0
-23431 continue
+23437 continue
       xtiel4=xtiel4+1
-23428 continue
-23426 continue
-23424 continue
+23434 continue
+23432 continue
+23430 continue
       return
       end
       double precision function jcp1ti(nfiumb4, yvec, go0l1q, wvec)
@@ -1109,17 +1127,17 @@
       double precision wtot, risyv0, bgu6fw
       risyv0 = 0.0d0
       wtot = 0.0d0
-      do 23432 w3gohz=1,nfiumb4 
+      do 23438 w3gohz=1,nfiumb4 
       bgu6fw = yvec(w3gohz) - go0l1q(w3gohz)
       risyv0 = risyv0 + wvec(w3gohz)*bgu6fw*bgu6fw
       wtot = wtot + wvec(w3gohz)
-23432 continue
-      if(.not.(wtot .gt. 0.0d0))goto 23434
+23438 continue
+      if(.not.(wtot .gt. 0.0d0))goto 23440
       jcp1ti=risyv0/wtot
-      goto 23435
-23434 continue
+      goto 23441
+23440 continue
       jcp1ti=0.0d0
-23435 continue
+23441 continue
       return
       end
       subroutine usytl1(nfiumb4, yvec, wvec, ghry8z, wtot)
@@ -1130,16 +1148,16 @@
       integer w3gohz
       wtot = 0.0d0
       risyv0 = 0.0d0
-      do 23436 w3gohz=1,nfiumb4 
+      do 23442 w3gohz=1,nfiumb4 
       risyv0 = risyv0 + yvec(w3gohz) * wvec(w3gohz)
       wtot = wtot + wvec(w3gohz)
-23436 continue
-      if(.not.(wtot .gt. 0.0d0))goto 23438
+23442 continue
+      if(.not.(wtot .gt. 0.0d0))goto 23444
       ghry8z = risyv0 / wtot
-      goto 23439
-23438 continue
+      goto 23445
+23444 continue
       ghry8z = 0.0d0
-23439 continue
+23445 continue
       return
       end
       subroutine rpfnk6(nfiumb4, x, w, yvec, vfd2pw, zo5jyl, y6jcvk)
@@ -1156,30 +1174,30 @@
       call usytl1(nfiumb4,x,w,qxy6aj, wtot)
       vgh4cp = 0.0d0
       qnk4zf = 0.0d0
-      do 23440 w3gohz=1,nfiumb4 
+      do 23446 w3gohz=1,nfiumb4 
       j0izmn = x(w3gohz)-qxy6aj
       vgh4cp = vgh4cp + j0izmn * (yvec(w3gohz)-bz3pyo) * w(w3gohz)
       j0izmn = j0izmn * j0izmn
       qnk4zf = qnk4zf + j0izmn * w(w3gohz)
-23440 continue
+23446 continue
       u7hbqo = vgh4cp/qnk4zf
       agfy3b = bz3pyo - u7hbqo * qxy6aj
-      do 23442 w3gohz=1,nfiumb4 
+      do 23448 w3gohz=1,nfiumb4 
       vfd2pw(w3gohz) = agfy3b + u7hbqo * x(w3gohz)
-23442 continue
+23448 continue
       qe3jcd = agfy3b + u7hbqo * x(1)
-      if(.not.(y6jcvk .ne. 0))goto 23444
-      do 23446 w3gohz=1,nfiumb4 
+      if(.not.(y6jcvk .ne. 0))goto 23450
+      do 23452 w3gohz=1,nfiumb4 
       j0izmn = x(w3gohz)-qxy6aj
-      if(.not.(w(w3gohz) .gt. 0.0d0))goto 23448
+      if(.not.(w(w3gohz) .gt. 0.0d0))goto 23454
       zo5jyl(w3gohz,1) = zo5jyl(w3gohz,1) - 1.0d0/wtot - j0izmn * 
      &j0izmn / qnk4zf
-      goto 23449
-23448 continue
+      goto 23455
+23454 continue
       zo5jyl(w3gohz,1) = 0.0d0
-23449 continue
-23446 continue
-23444 continue
+23455 continue
+23452 continue
+23450 continue
       return
       end
       subroutine uwye7d(nfiumb4, p, ynk9ah, qxy6aj, x)
@@ -1187,9 +1205,9 @@
       integer nfiumb4, p, ynk9ah(nfiumb4)
       double precision qxy6aj(p), x(nfiumb4)
       integer w3gohz
-      do 23450 w3gohz=1,nfiumb4 
+      do 23456 w3gohz=1,nfiumb4 
       x(w3gohz) = qxy6aj(ynk9ah(w3gohz))
-23450 continue
+23456 continue
       return
       end
       subroutine vknotl2(x, nfiumb4, knot, xl6qgm, q9wyop)
@@ -1197,27 +1215,27 @@
       integer nfiumb4, xl6qgm, q9wyop
       double precision x(nfiumb4), knot(nfiumb4)
       integer ndk, d9rjek
-      if(.not.(q9wyop .eq. 0))goto 23452
-      if(.not.(nfiumb4 .le. 40))goto 23454
+      if(.not.(q9wyop .eq. 0))goto 23458
+      if(.not.(nfiumb4 .le. 40))goto 23460
       ndk = nfiumb4
-      goto 23455
-23454 continue
+      goto 23461
+23460 continue
       ndk = 40 + dexp(0.25d0 * dlog(nfiumb4-40.0d0))
-23455 continue
-      goto 23453
-23452 continue
+23461 continue
+      goto 23459
+23458 continue
       ndk = xl6qgm - 6
-23453 continue
+23459 continue
       xl6qgm = ndk + 6
-      do 23456 d9rjek = 1,3 
+      do 23462 d9rjek = 1,3 
       knot(d9rjek) = x(1) 
-23456 continue
-      do 23458 d9rjek = 1,ndk 
+23462 continue
+      do 23464 d9rjek = 1,ndk 
       knot(d9rjek+3) = x( 1 + (d9rjek-1)*(nfiumb4-1)/(ndk-1) ) 
-23458 continue
-      do 23460 d9rjek = 1,3 
+23464 continue
+      do 23466 d9rjek = 1,3 
       knot(ndk+3+d9rjek) = x(nfiumb4) 
-23460 continue
+23466 continue
       return
       end
       subroutine pknotl2(knot, nfiumb4, keep, fjo2dy)
@@ -1225,23 +1243,23 @@
       integer nfiumb4, keep(nfiumb4)
       double precision knot(nfiumb4), fjo2dy
       integer w3gohz, ilower
-      do 23462 w3gohz=1,4 
+      do 23468 w3gohz=1,4 
       keep(w3gohz) = 1
-23462 continue
+23468 continue
       ilower = 4
-      do 23464 w3gohz=5,(nfiumb4-4) 
+      do 23470 w3gohz=5,(nfiumb4-4) 
       if(.not.((knot(w3gohz) - knot(ilower) .ge. fjo2dy) .and.(knot(
-     &nfiumb4) - knot(w3gohz) .ge. fjo2dy)))goto 23466
+     &nfiumb4) - knot(w3gohz) .ge. fjo2dy)))goto 23472
       keep(w3gohz) = 1
       ilower = w3gohz
-      goto 23467
-23466 continue
+      goto 23473
+23472 continue
       keep(w3gohz) = 0
-23467 continue
-23464 continue
-      do 23468 w3gohz=(nfiumb4-3),nfiumb4 
+23473 continue
+23470 continue
+      do 23474 w3gohz=(nfiumb4-3),nfiumb4 
       keep(w3gohz) = 1
-23468 continue
+23474 continue
       return
       end
       subroutine vglmf(xbig,c4bdmu,o9ljyn,d8gwha,nfiumb4, jmwo0z,lq8reh,
@@ -1257,21 +1275,21 @@
       integer sehz7y
       call qh4ulb(zqve1l,vvl1li,lku8xq)
       sehz7y = 1
-23470 if(.not.(sehz7y .ne. 0))goto 23471
+23476 if(.not.(sehz7y .ne. 0))goto 23477
       call vfit(lku8xq,c4bdmu,o9ljyn,nfiumb4, xbig,jmwo0z,lq8reh,go0l1q,
      &blq5vu, jrxg6l,ioqzvb,i0qvzl,das4bx, zx1610,i83h1, bgu6fw,zxao0o, 
      &xhe4cg,zkjqhi,zqve1l,vvl1li)
-      if(.not.(d8gwha .ne. 0))goto 23472
+      if(.not.(d8gwha .ne. 0))goto 23478
       call vcall1(sehz7y,jmwo0z,go0l1q,lq8reh,jrxg6l,xbig,cpxbig)
-      goto 23473
-23472 continue
+      goto 23479
+23478 continue
       sehz7y= 0
-23473 continue
-      if(.not.(sehz7y .ne. 0))goto 23474
+23479 continue
+      if(.not.(sehz7y .ne. 0))goto 23480
       zx1610=0
-23474 continue
-      goto 23470
-23471 continue
+23480 continue
+      goto 23476
+23477 continue
       return
       end
       subroutine vfit(lku8xq,c4bdmu,o9ljyn,nfiumb4, xbig,jmwo0z,lq8reh,
@@ -1290,52 +1308,52 @@
       tvyd2b=101
       fjg0qv=1
       dyb3po=1.0d0
-      if(.not.(zx1610 .eq. 0))goto 23476
-      do 23478 d9rjek=1,o9ljyn 
-      do 23480 w3gohz=1,c4bdmu 
+      if(.not.(zx1610 .eq. 0))goto 23482
+      do 23484 d9rjek=1,o9ljyn 
+      do 23486 w3gohz=1,c4bdmu 
       ioqzvb(w3gohz,d9rjek) = xbig(w3gohz,d9rjek)
-23480 continue
-23478 continue
-      do 23482 nd6mep=1,o9ljyn 
+23486 continue
+23484 continue
+      do 23488 nd6mep=1,o9ljyn 
       i83h1(nd6mep) = nd6mep
-23482 continue
+23488 continue
       call mux17f(jrxg6l, ioqzvb, lku8xq, o9ljyn, nfiumb4, zxao0o(1,1,1)
      &, zxao0o(1,1,2), zqve1l, vvl1li, zkjqhi, c4bdmu)
       call dhkt9w(ioqzvb,c4bdmu,c4bdmu,o9ljyn,i0qvzl,i83h1,bgu6fw,
      &zx1610,t7sbea)
-23476 continue
+23482 continue
       call mux22f(jrxg6l,jmwo0z,bgu6fw,zkjqhi,zqve1l,vvl1li,nfiumb4,
      &lku8xq,zxao0o)
       nd6mep=1
-      do 23484 d9rjek=1,lku8xq 
-      do 23486 w3gohz=1,nfiumb4 
+      do 23490 d9rjek=1,lku8xq 
+      do 23492 w3gohz=1,nfiumb4 
       jmwo0z(w3gohz,d9rjek)=bgu6fw(nd6mep)
       nd6mep=nd6mep+1
-23486 continue
-23484 continue
+23492 continue
+23490 continue
       call vdqrsl(ioqzvb,c4bdmu,c4bdmu,zx1610,i0qvzl,jmwo0z,bgu6fw(1),
      &blq5vu,lq8reh, bgu6fw(1),go0l1q,tvyd2b,fjg0qv)
       das4bx=0.0d0
       xi1mqb=0
       hv3wja=1
-      do 23488 w3gohz=1,nfiumb4 
-      do 23490 d9rjek=1,lku8xq 
+      do 23494 w3gohz=1,nfiumb4 
+      do 23496 d9rjek=1,lku8xq 
       xi1mqb = xi1mqb + 1
-      if(.not.(xi1mqb .gt. nfiumb4))goto 23492
+      if(.not.(xi1mqb .gt. nfiumb4))goto 23498
       xi1mqb = 1
       hv3wja = hv3wja + 1
-23492 continue
+23498 continue
       gwu72m = jmwo0z(xi1mqb,hv3wja) - go0l1q(d9rjek,w3gohz)
       das4bx = das4bx + gwu72m * gwu72m
-23490 continue
-23488 continue
+23496 continue
+23494 continue
       call vbksf(jrxg6l,go0l1q,lku8xq,nfiumb4,zxao0o,zqve1l,vvl1li,
      &xhe4cg)
-      do 23494 d9rjek=1,o9ljyn 
+      do 23500 d9rjek=1,o9ljyn 
       bgu6fw(d9rjek) = lq8reh(d9rjek)
-23494 continue
-      do 23496 d9rjek=1,o9ljyn 
+23500 continue
+      do 23502 d9rjek=1,o9ljyn 
       lq8reh(i83h1(d9rjek)) = bgu6fw(d9rjek)
-23496 continue
+23502 continue
       return
       end

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/r-cran-vgam.git



More information about the debian-science-commits mailing list