code: function parse_SerAr(blob, biff) {
  	var val = [blob.read_shift(1)];
  	if(biff == 12) switch(val[0]) {
  		case 0x02: val[0] = 0x04; break; /* SerBool */
  		case 0x04: val[0] = 0x10; break; /* SerErr */
  		case 0x00: val[0] = 0x01; break; /* SerNum */
  		case 0x01: val[0] = 0x02; break; /* SerStr */
  	}
  	switch(val[0]) {
  		case 0x04: /* SerBool -- boolean */
  			val[1] = parsebool(blob, 1) ? 'TRUE' : 'FALSE';
  			if(biff != 12) blob.l += 7; break;
  		case 0x25: /* appears to be an alias */
  		case 0x10: /* SerErr -- error */
  			val[1] = BErr[blob[blob.l]];
  			blob.l += ((biff == 12) ? 4 : 8); break;
  		case 0x00: /* SerNil -- honestly, I'm not sure how to reproduce this */
  			blob.l += 8; break;
  		case 0x01: /* SerNum -- Xnum */
  			val[1] = parse_Xnum(blob, 8); break;
  		case 0x02: /* SerStr -- XLUnicodeString (<256 chars) */
  			val[1] = parse_XLUnicodeString2(blob, 0, {biff:biff > 0 && biff < 8 ? 2 : biff}); break;
  		default: throw new Error("Bad SerAr: " + val[0]); /* Unreachable */
  	}
  	return val;
  }
docs: /* [MS-XLS] 2.5.192.112 + 2.5.192.11{3,4,5,6,7} /* [MS-XLSB] 2.5.97.93 + 2.5.97.9{4,5,6,7}