text: function isval(x) { return x !== undefined && x !== null; }
  
  function keys(o) { return Object.keys(o); }
  
  function evert_key(obj, key) {
  	var o = [], K = keys(obj);
  	for(var i = 0; i !== K.length; ++i) o[obj[K[i]][key]] = K[i];
  	return o;
  }
  
  function evert(obj) {
  	var o = [], K = keys(obj);
  	for(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = K[i];
  	return o;
  }
  
  function evert_num(obj) {
  	var o = [], K = keys(obj);
  	for(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = parseInt(K[i],10);
  	return o;
  }
  
  function evert_arr(obj) {
  	var o = [], K = keys(obj);
  	for(var i = 0; i !== K.length; ++i) {
  		if(o[obj[K[i]]] == null) o[obj[K[i]]] = [];
  		o[obj[K[i]]].push(K[i]);
  	}
  	return o;
  }
  
  /* TODO: date1904 logic */
  function datenum(v, date1904) {
  	if(date1904) v+=1462;
  	var epoch = Date.parse(v);
  	return (epoch + 2209161600000) / (24 * 60 * 60 * 1000);
  }
  
  function cc2str(arr) {
  	var o = "";
  	for(var i = 0; i != arr.length; ++i) o += String.fromCharCode(arr[i]);
  	return o;
  }
  
  var has_buf = (typeof Buffer !== 'undefined');
  