```ts
/** How many days lie between two proleptic Gregorian calendar dates. */

const MONTH_LENGTHS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

function isLeap(year: number): boolean {
  return year % 4 === 0;
}

function monthLength(year: number, month: number): number {
  if (month === 2 && isLeap(year)) {
    return 29;
  }
  return MONTH_LENGTHS[month - 1];
}

function toOrdinal(date: number[]): number {
  const [year, month, day] = date;
  const prior = year - 1;
  let days = prior * 365;
  days += Math.floor(prior / 4);
  for (let m = 1; m < month; m += 1) {
    days += monthLength(year, m);
  }
  return days + day;
}

export function spanDays(start: number[], end: number[]): number {
  if (start.length !== 3 || end.length !== 3) {
    throw new Error('Dates must be arrays of three integers [year, month, day]');
  }
  if (start[0] < 1 || start[0] > 9999) {
    throw new Error('Year must be between 1 and 9999');
  }
  if (start[1] < 1 || start[1] > 12) {
    throw new Error('Month must be between 1 and 12');
  }
  if (start[2] < 1 || start[2] > 31) {
    throw new Error('Day must be at least 1');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 29) {
    throw new Error('February can have at most 29 days');
  }
  if (start[2] > 30) {
    throw new Error('Month cannot have more than 30 days');
  }
  if (start[2] > 31) {
    throw new Error('Day cannot exceed 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error('Day must be at most 31');
  }
  if (start[2] > 31) {
    throw new Error