function isInt(x){return (!isNaN(x) && isFinite(x) && x.toString().indexOf(".")==-1)    && x+1!=x};function ndps(x,n){var t=eval("10"+"000000000000000".slice(0,n));    return (Math.round(x*t)/t).toString()}; function nbofdps(n){if(typeof n!="string")n=n.toString();  if(n.indexOf(".")==-1)return 0;  n=n.toLowerCase();   return (n.indexOf("e")==-1?n.length:n.indexOf("e"))-n.indexOf(".")-1;};function randint(lo,hi){  if(lo>hi)alert("randint error: lo exceeds hi! "+lo+","+hi)  else {do{var r=Math.floor(Math.random()*(hi-lo+1)+lo)}        while(r>hi);  //random can return 1.00!!        //alert("randint("+lo+","+hi+")="+r);        return r}      }function etoint(n,nbdigs){  if(isNaN(n) || !isFinite(n))return n;  if(typeof n!="string")n=n.toString();  n=n.toLowerCase();if(n.indexOf("e")==-1)return n;  if(arguments.length==1)nbdigs=false;  var wh,fract,e=n.substring(n.indexOf("e")+1);  if(e.charAt(0)=="-")return n;  if(e.charAt(0)=="+")e=e.substring(1);  if(n.indexOf(".")==-1){wh=n.substring(0,n.indexOf("e"));fract=""}  else{ wh=n.substring(0,n.indexOf("."));        fract=n.substring(n.indexOf(".")+1,n.indexOf("e"))};  return wh+fract+"..."+(nbdigs?"("+(wh.length+eval(e)-fract.length)+" digs)":"");}function getInput(Fld,Fldnm,Cond){ 	  //Cond = string containing Z (proper ints only),+(+ve only),0(0 allowed), O=optional fld	var x; if(arguments.length<3)Cond="";	try{x=eval(Fld)}	catch(e){};	if(Cond.indexOf("O")>-1 && (!x || x=="") )return "";	if(Fld==""){alert("Please enter a value for "+Fldnm);ERROR()};	if(isNaN(x)||!isFinite(x))	  {alert("Please change your value for "+Fldnm+": it is not a number"+(x?" ("+x+")":""));ERROR()};	if(Cond.indexOf("Z")>=0 && !isInt(x))	  { if(Fld.indexOf(".")!=-1 || Fld.toLowerCase().indexOf("e")!=-1)	        {alert("Your value for "+Fldnm+" must be a whole number.");ERROR()}	   else{alert("Your value for "+Fldnm+" is too large - sorry.");ERROR()}};	//alert(x+" "+(x+1));	if( (Cond.indexOf("Z")>=0||Cond.indexOf("N")>=0)	   && (x==x+1))	  {alert("Your value for "+Fldnm+" is too large - sorry.");ERROR()};	if(Cond.indexOf("Z")>=0 && Fld.replace(/[0-9]/g,"")==""	    && Fld!=Math.round(Fld).toString())	  {alert(Fldnm+" is too large - sorry!");ERROR()};	if(Cond.indexOf("+")>=0 && x<0)	  {alert(Fldnm+" cannot be negative ("+x+")");ERROR()};	if(Cond.indexOf("0")>=0 && x==0){alert(Fldnm+" cannot be zero");ERROR()};	return x };function log10(x){return Math.log(x)*Math.LOG10E};var Phi=(Math.sqrt(5)+1)/2,phi=Phi-1;var fibmemo=new Array(0,1,1);var i=2,FibMAXINTi;while(fibmemo[i].toString().indexOf(".")==-1    &&(fibmemo[i-1]%10+fibmemo[i-2]%10)%10==fibmemo[i]%10)  {i++;fibmemo[i]=fibmemo[i-1]+fibmemo[i-2];   //parent.RESULTS.document.writeln(i,": ",fibmemo[i],"<br>")  };FibMAXINTi=i-1;//alert("fibMAXINTi="+FibMAXINTi+"["+fibmemo[FibMAXINTi]+"]");function fib(i){if(i<-FibMAXINTi&&i>FibMAXINTi)return Number.NaN;  if(i>=0)return fibmemo[i];  return (-i % 2==1?fibmemo[-i]:-fibmemo[-i])};function revzeck(n){var z="",i=2;  while(fibmemo[i]<=n)i++;  for(i--;i>1;i--){if(fibmemo[i]>n){z="0"+z}else{z="1"+z;n-=fibmemo[i]}};  return z};