{"version":3,"file":"zone.cjs","sources":["../src/units.ts","../src/instant.ts","../src/time-zone.ts","../src/parse.ts","../src/plain-date-time.ts","../src/utilities.ts","../src/plain-time.ts","../src/zoned-date-time.ts","../src/calendar.ts","../src/plain-date.ts","../src/duration.ts","../src/now.ts"],"sourcesContent":["export const SECOND = 1000;\nexport const MINUTE = SECOND * 60;\nexport const HOUR = MINUTE * 60;\nexport const DAY = HOUR * 24;\n\nexport const PER_UNIT = {\n  day: DAY,\n  hour: HOUR,\n  minute: MINUTE,\n  second: SECOND,\n  millisecond: 1,\n};\n","import Duration, {DurationLike, toDuration} from './duration.js';\nimport {RoundingMode} from './types.js';\nimport {\n  balanceTimeDuration,\n  differenceInstantWithRounding,\n  maxTemporalUnit,\n  parseUnit,\n  roundToIncrement,\n} from './utilities.js';\nimport {ZonedDateTime} from './zoned-date-time.js';\nimport {DAY, PER_UNIT} from './units.js';\nimport type {TimeZone} from './time-zone.js';\n\ninterface InstantRoundParameters {\n  smallestUnit: 'hour' | 'minute' | 'second' | 'millisecond';\n  roundingIncrement?: number;\n  roundingMode?: RoundingMode;\n}\n\ninterface InstantDeltaParameters {\n  /// The largest unit of time to round to in the resulting duration, defaults to 'auto'.\n  largestUnit?: 'auto' | 'hour' | 'minute' | 'second' | 'millisecond';\n  /// The smallest unit of time to round to in the resulting duration, defaults to 'millisecond', which means no rounding.\n  smallestUnit?: 'hour' | 'minute' | 'second' | 'millisecond';\n  /// The granularity to round to, of the unit given by smallestUnit. Defaults to `1`.\n  roundingIncrement?: number;\n  /// Rounding method to use\n  roundingMode?: RoundingMode;\n}\n\nexport type InstantLike = string | Instant;\n\nexport class Instant {\n  private raw: number;\n\n  constructor(epochMilisecond: number) {\n    this.raw = epochMilisecond;\n  }\n\n  get epochMilliseconds() {\n    return this.raw;\n  }\n\n  add(durationLike: DurationLike) {\n    let duration = toDuration(durationLike);\n    if (duration.days || duration.months || duration.weeks || duration.years) {\n      throw new RangeError('Duration field days | months | weeks | years not supported by Instant');\n    }\n    return Instant.fromEpochMilliseconds(this.epochMilliseconds + duration.total('millisecond'));\n  }\n\n  subtract(durationLike: DurationLike) {\n    let duration = toDuration(durationLike).negated();\n    return this.add(duration);\n  }\n\n  until(other: InstantLike, options: InstantDeltaParameters = {}) {\n    let smallestUnit = parseUnit(options.smallestUnit, 'millisecond');\n    let largestUnit = parseUnit(options.largestUnit, 'second');\n    if (largestUnit === 'auto') {\n      largestUnit = maxTemporalUnit('hour', smallestUnit);\n    }\n\n    let record = differenceInstantWithRounding(\n      this,\n      toInstant(other),\n      smallestUnit,\n      options.roundingIncrement ?? 1,\n      options.roundingMode ?? 'trunc',\n    );\n\n    return Duration.from(balanceTimeDuration(record.timeDuration, largestUnit));\n  }\n\n  since(other: InstantLike, options?: InstantDeltaParameters) {\n    return this.until(other, options).negated();\n  }\n\n  toZonedDateTimeISO(timeZone: string | TimeZone) {\n    return new ZonedDateTime(this.epochMilliseconds, timeZone);\n  }\n\n  equals(other: InstantLike) {\n    return this.epochMilliseconds === toInstant(other).epochMilliseconds;\n  }\n\n  toJSON() {\n    return this.toString();\n  }\n\n  toString() {\n    return new Date(this.raw).toISOString();\n  }\n\n  toLocaleString() {\n    throw new Error('Missing implementation');\n  }\n\n  valueOf() {\n    throw new Error('Built-in arithmetic operators isn’t supported on Instant');\n  }\n\n  round(options: InstantRoundParameters['smallestUnit'] | InstantRoundParameters) {\n    if (typeof options === 'string') {\n      options = {\n        smallestUnit: options,\n      };\n    }\n\n    let smallestUnit = parseUnit(options.smallestUnit);\n    let roundingIncrement = options.roundingIncrement ?? 1;\n    let roundingMode = options.roundingMode ?? 'halfExpand';\n\n    let remainder = this.epochMilliseconds % DAY;\n    let wholeDays = this.epochMilliseconds - remainder;\n\n    let roundedRemainder = roundToIncrement(remainder, PER_UNIT[smallestUnit] * roundingIncrement, roundingMode);\n    return Instant.fromEpochMilliseconds(wholeDays + roundedRemainder);\n  }\n\n  static from(instantLike: InstantLike) {\n    if (instantLike instanceof Instant) {\n      return new Instant(instantLike.epochMilliseconds);\n    } else if (typeof instantLike === 'string') {\n      return new Instant(Date.parse(instantLike));\n    }\n    throw new RangeError('Invalid string');\n  }\n\n  static fromEpochMilliseconds(epochMilisecond: number) {\n    return new Instant(epochMilisecond);\n  }\n\n  static compare(one: InstantLike, two: InstantLike): number {\n    return Math.sign(toInstant(one).epochMilliseconds - toInstant(two).epochMilliseconds);\n  }\n}\n\nexport function toInstant(instantLike: InstantLike) {\n  return instantLike instanceof Instant ? instantLike : Instant.from(instantLike);\n}\n","import {HOUR, MINUTE} from './units.js';\n\nconst offset = /^(?:GMT|UTC)(?:(\\+|\\-)([0-9]{2}):([0-9]{2}))?$/;\n\nexport interface TimeZone {\n  id: string;\n  getOffsetMillisecondsFor(instant: number): number;\n}\n\nconst timeZones = new Map<string, TimeZone>();\n\nexport class DateTimeFormatTimeZone implements TimeZone {\n  dateFormat: Intl.DateTimeFormat;\n  constructor(public id: string) {\n    this.dateFormat = new Intl.DateTimeFormat('en-US', {\n      timeZoneName: 'longOffset',\n      minute: 'numeric',\n      timeZone: id,\n    });\n  }\n\n  getOffsetMillisecondsFor(milliseconds: number): number {\n    let timeZonePart = this.dateFormat.formatToParts(new Date(milliseconds)).find(part => part.type === 'timeZoneName');\n    if (timeZonePart) {\n      let result = timeZonePart.value.match(offset);\n      if (result) {\n        let sign = result[1];\n        let minute = result[2];\n        let second = result[3];\n        if (sign != null) {\n          let multiplier = sign === '-' ? -1 : 1;\n          return (parseInt(minute, 10) * HOUR + parseInt(second, 10) * MINUTE) * multiplier;\n        }\n        return 0;\n      }\n    }\n    throw new RangeError('Invalid offset for instant');\n  }\n\n  static from(name: string) {\n    let timeZone = timeZones.get(name);\n    if (!timeZone) {\n      timeZone = new DateTimeFormatTimeZone(name);\n      timeZones.set(name, timeZone);\n    }\n    return timeZone;\n  }\n}\n","import {HOUR, MINUTE} from './units.js';\nimport {TimeComponents, verifyTimeComponents} from './utilities.js';\n\nexport const date = /(?<year>\\d{4})(?<dateSeparator>(?:\\-)?)(?<month>\\d{2})\\k<dateSeparator>(?<day>\\d{2})/;\nexport const time =\n  /(?<hour>\\d{2})(?:(?<timeSeparator>:?)(?<minute>\\d{2})(?:\\k<timeSeparator>(?<second>\\d{2})(?:[.,](?<millisecond>\\d{1,9}))?)?)?/;\nexport const timeZone = /\\[(?<timeZoneName>[a-zA-Z\\.\\-\\,\\_\\/]+)\\]/;\nexport const timeZoneDesignators = /(?<timeZoneDesignator>Z)/;\nexport const offset = /(?<offsetSign>\\+|\\-)(?<offsetHour>[0-9]{2})(?:(?::)?(?<offsetMinute>[0-9]{2}))?/;\nexport const dateTime = new RegExp(\n  `^(?:${date.source})?(?:T${time.source}(?:${offset.source}|${timeZoneDesignators.source})?)?(?:${timeZone.source})?$`,\n);\n\nexport let Zulu = Symbol('Zulu');\n\ninterface DateTimeGroups {\n  year: string;\n  month: string;\n  day: string;\n\n  hour?: string;\n  minute?: string;\n  second?: string;\n  millisecond?: string;\n\n  // offset\n  offsetSign?: string;\n  offsetHour?: string;\n  offsetMinute?: string;\n\n  timeZoneDesignator?: 'Z';\n  timeZoneName?: string;\n}\n\nexport class ISO8601Result {\n  constructor(\n    public date?: {year: number; month: number; day: number},\n    public time?: TimeComponents,\n    public offset?: number | symbol,\n    public timeZone?: string,\n  ) {}\n\n  static parseOffsetGroups(sign: string, hour: string, minute?: string) {\n    let multiplier = sign === '-' ? -1 : 1;\n    let minuteValue = minute ? parseInt(minute, 10) * MINUTE : 0;\n    return (parseInt(hour, 10) * HOUR + minuteValue) * multiplier;\n  }\n\n  static parseTimeGroups(hour: string, minute?: string, second?: string, millisecond?: string) {\n    let hourValue = parseInt(hour, 10);\n    let minuteValue = minute ? parseInt(minute, 10) : 0;\n    let secondValue = second ? parseInt(second, 10) : 0;\n    if (secondValue === 60) {\n      secondValue = 59;\n    }\n\n    let millisecondValue = 0;\n\n    if (millisecond) {\n      millisecond = millisecond.slice(0, 3);\n      let times = Math.pow(10, 3 - millisecond.length);\n      millisecondValue = parseInt(millisecond, 10) * times;\n    }\n\n    return [hourValue, minuteValue, secondValue, millisecondValue];\n  }\n\n  static parseDateTime(dateString: string) {\n    let result = dateTime.exec(dateString);\n    if (result) {\n      let groups = result.groups as unknown as DateTimeGroups;\n\n      let date: {year: number; month: number; day: number} | undefined;\n      if (groups.year && groups.month && groups.day) {\n        date = {\n          year: parseInt(groups.year, 10),\n          month: parseInt(groups.month, 10),\n          day: parseInt(groups.day, 10),\n        };\n      }\n\n      let time: {hour: number; minute: number; second: number; millisecond: number} | undefined;\n      if (groups.hour) {\n        let [hourValue, minuteValue, secondValue, millisecondValue] = ISO8601Result.parseTimeGroups(\n          groups.hour,\n          groups.minute,\n          groups.second,\n          groups.millisecond,\n        );\n        time = verifyTimeComponents(hourValue, minuteValue, secondValue, millisecondValue, 'reject');\n      }\n\n      if (!time && !date) {\n        return null;\n      }\n\n      let offset: number | symbol | undefined;\n      if (groups.offsetSign && groups.offsetHour) {\n        offset = ISO8601Result.parseOffsetGroups(groups.offsetSign, groups.offsetHour, groups.offsetMinute);\n      } else if (groups.timeZoneDesignator) {\n        offset = Zulu;\n      }\n\n      return new ISO8601Result(date, time, offset, groups.timeZoneName);\n    }\n    return null;\n  }\n}\n","import Calendar from './calendar.js';\nimport Duration, {DurationLike, toDuration} from './duration.js';\nimport {ISO8601Result} from './parse.js';\nimport {PlainDate, PlainDateLike, toPlainDate} from './plain-date.js';\nimport {PlainTime, PlainTimeLike, toPlainTime} from './plain-time.js';\nimport {TimeZone} from './time-zone.js';\nimport type {RoundingMode} from './types.js';\nimport {PER_UNIT} from './units.js';\nimport {\n  balanceTime,\n  differencePlainDateTimeWithRounding,\n  isCalendarUnit,\n  parseUnit,\n  roundToIncrement,\n  toTimeDuration,\n  verifyDateComponents,\n  verifyTimeComponents,\n} from './utilities.js';\nimport {ZonedDateTime, type ZonedDateTimeComponents, type ZonedDateTimeFromOptions} from './zoned-date-time.js';\n\nexport type PlainDateTimeLike = ZonedDateTime | PlainDateTime | PlainDateTimeComponents | string;\n\nexport interface PlainDateTimeComponents {\n  year: number;\n  month: number;\n  day: number;\n  hour?: number;\n  minute?: number;\n  second?: number;\n  millisecond?: number;\n}\n\ninterface PlainDateTimeToStringParameters {\n  calendarName?: 'auto' | 'always' | 'never';\n  /// The smallest unit of time to round to in the resulting duration, defaults to 'millisecond', which means no rounding.\n  smallestUnit?: 'minute' | 'second' | 'millisecond';\n  /// Rounding method to use\n  roundingMode?: RoundingMode;\n  ///\n  fractionalSecondDigits?: 'auto' | 0 | 1 | 2 | 3;\n}\n\ninterface PlainDateTimeRoundParameters {\n  smallestUnit: 'day' | 'hour' | 'minute' | 'second' | 'millisecond';\n  roundingIncrement?: number;\n  roundingMode?: RoundingMode;\n}\n\ninterface PlainDateTimeDeltaParameters {\n  /// The largest unit of time to round to in the resulting duration, defaults to 'auto'.\n  largestUnit?: 'auto' | 'year' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond';\n  /// The smallest unit of time to round to in the resulting duration, defaults to 'millisecond', which means no rounding.\n  smallestUnit?: 'year' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond';\n  /// The granularity to round to, of the unit given by smallestUnit. Defaults to `1`.\n  roundingIncrement?: number;\n  /// Rounding method to use\n  roundingMode?: RoundingMode;\n}\n\nexport function toPlainDateTime(plainDateTimeLike: PlainDateTimeLike) {\n  return plainDateTimeLike instanceof PlainDateTime ? plainDateTimeLike : PlainDateTime.from(plainDateTimeLike);\n}\n\nexport class PlainDateTime {\n  private raw: Date;\n  private calendar: Calendar;\n\n  constructor(\n    isoYear: number,\n    isoMonth: number,\n    isoDay: number,\n    isoHour: number = 0,\n    isoMinute: number = 0,\n    isoSecond: number = 0,\n    isoMillisecond: number = 0,\n    calendar: string = 'iso8601',\n  ) {\n    verifyDateComponents(isoYear, isoMonth, isoDay, 'reject');\n    verifyTimeComponents(isoHour, isoMinute, isoSecond, isoMillisecond, 'reject');\n\n    this.raw = new Date(Date.UTC(isoYear, isoMonth - 1, isoDay, isoHour, isoMinute, isoSecond, isoMillisecond));\n    this.calendar = Calendar.from(calendar);\n  }\n\n  get hour() {\n    return this.raw.getUTCHours();\n  }\n\n  get minute() {\n    return this.raw.getUTCMinutes();\n  }\n\n  get second() {\n    return this.raw.getUTCSeconds();\n  }\n\n  get millisecond() {\n    return this.raw.getUTCMilliseconds();\n  }\n\n  get day() {\n    return this.raw.getUTCDate();\n  }\n\n  get month() {\n    return this.raw.getUTCMonth() + 1;\n  }\n\n  get year() {\n    return this.raw.getUTCFullYear();\n  }\n\n  getCalendar() {\n    return this.calendar;\n  }\n\n  get calendarId() {\n    return this.calendar.id;\n  }\n\n  get monthsInYear() {\n    return this.calendar.monthsInYear(this);\n  }\n\n  get inLeapYear() {\n    return this.calendar.inLeapYear(this);\n  }\n\n  get weekOfYear() {\n    return this.calendar.weekOfYear(this);\n  }\n\n  get yearOfWeek() {\n    return this.calendar.yearOfWeek(this);\n  }\n\n  get dayOfYear() {\n    return this.calendar.dayOfYear(this);\n  }\n\n  get daysInYear() {\n    return this.calendar.daysInYear(this);\n  }\n\n  get daysInMonth() {\n    return this.calendar.daysInMonth(this);\n  }\n\n  get daysInWeek() {\n    return this.calendar.daysInWeek(this);\n  }\n\n  get dayOfWeek(): number {\n    return this.calendar.dayOfWeek(this);\n  }\n\n  equals(other: PlainDateTimeLike) {\n    return this.raw.valueOf() === toPlainDateTime(other).raw.valueOf();\n  }\n\n  valueOf() {\n    throw new Error('Built-in arithmetic operators isn’t supported on ZonedDateTime');\n  }\n\n  round(options: PlainDateTimeRoundParameters['smallestUnit'] | PlainDateTimeRoundParameters) {\n    if (typeof options === 'string') {\n      options = {\n        smallestUnit: options,\n      };\n    }\n\n    let smallestUnit = parseUnit(options.smallestUnit);\n    let roundingIncrement = options.roundingIncrement ?? 1;\n    let roundingMode = options.roundingMode ?? 'halfExpand';\n\n    let epochMilliseconds = this.raw.valueOf();\n    let remainder = toTimeDuration(this);\n    let startOfDay = epochMilliseconds - remainder;\n\n    let roundedRemainder = roundToIncrement(remainder, PER_UNIT[smallestUnit] * roundingIncrement, roundingMode);\n    let date = new Date(startOfDay + roundedRemainder);\n\n    return new PlainDateTime(\n      date.getUTCFullYear(),\n      date.getUTCMonth() + 1,\n      date.getUTCDate(),\n      date.getUTCHours(),\n      date.getUTCMinutes(),\n      date.getUTCSeconds(),\n      date.getUTCMilliseconds(),\n    );\n  }\n\n  add(durationLike: DurationLike, options: {overflow?: 'reject' | 'constrain'} = {}): PlainDateTime {\n    let duration = toDuration(durationLike);\n    let timeDuration = toTimeDuration(this);\n\n    let balanced = balanceTime(\n      duration.hours,\n      duration.minutes,\n      duration.seconds,\n      duration.milliseconds + timeDuration,\n    );\n\n    let plainDate = this.toPlainDate();\n    let date = this.getCalendar().dateAdd(\n      plainDate,\n      new Duration(duration.years, duration.months, duration.weeks, duration.days + balanced.deltaDays),\n      options,\n    );\n\n    return date.toPlainDateTime(new PlainTime(balanced.hour, balanced.minute, balanced.second, balanced.millisecond));\n  }\n\n  subtract(durationLike: DurationLike, options?: {overflow?: 'reject' | 'constrain'}): PlainDateTime {\n    let duration = toDuration(durationLike);\n    return this.add(duration.negated(), options);\n  }\n\n  toPlainDate() {\n    return new PlainDate(this.year, this.month, this.day, this.calendarId);\n  }\n\n  toPlainTime() {\n    return new PlainTime(this.hour, this.minute, this.second, this.millisecond);\n  }\n\n  toZonedDateTime(timeZone: TimeZone | string, options: ZonedDateTimeFromOptions = {}) {\n    return ZonedDateTime.from(\n      {\n        year: this.year,\n        month: this.month,\n        day: this.day,\n        hour: this.hour,\n        minute: this.minute,\n        second: this.second,\n        millisecond: this.millisecond,\n        timeZone,\n      },\n      options,\n    );\n  }\n\n  toString(options: PlainDateTimeToStringParameters = {}) {\n    let calendarName = options.calendarName ?? 'auto';\n    let calendarId = this.calendarId;\n    let smallestUnit = parseUnit(options.smallestUnit);\n    let date =\n      smallestUnit || options.roundingMode\n        ? this.round({\n            smallestUnit: smallestUnit ?? 'second',\n            roundingMode: options.roundingMode ?? 'trunc',\n          })\n        : this;\n\n    let plainDate = date.toPlainDate().toString();\n    let time = date.toPlainTime().toString({\n      smallestUnit: options.smallestUnit,\n      fractionalSecondDigits: options.fractionalSecondDigits,\n    });\n    let calendar =\n      calendarName === 'always' || (calendarName === 'auto' && calendarId !== 'iso8601')\n        ? `[u-ca=${this.calendarId}]`\n        : '';\n\n    return `${plainDate}T${time}${calendar}`;\n  }\n\n  toJSON() {\n    return this.toString();\n  }\n\n  with(dateComponents: Partial<ZonedDateTimeComponents>, options?: {overflow?: 'reject' | 'constrain'}) {\n    let overflow = options?.overflow ?? 'constrain';\n    let {year, month, day} = verifyDateComponents(\n      dateComponents.year ?? this.year,\n      dateComponents.month ?? this.month,\n      dateComponents.day ?? this.day,\n      overflow,\n    );\n    let {hour, minute, second, millisecond} = verifyTimeComponents(\n      dateComponents.hour ?? this.hour,\n      dateComponents.minute ?? this.minute,\n      dateComponents.second ?? this.second,\n      dateComponents.millisecond ?? this.millisecond,\n      overflow,\n    );\n\n    return new PlainDateTime(year, month, day, hour, minute, second, millisecond);\n  }\n\n  withPlainTime(plainTimeLike: PlainTimeLike) {\n    let plainTime = toPlainTime(plainTimeLike);\n    return this.with({\n      hour: plainTime.hour,\n      minute: plainTime.minute,\n      second: plainTime.second,\n      millisecond: plainTime.millisecond,\n    });\n  }\n\n  withPlainDate(plainDateLike: PlainDateLike) {\n    let plainDate = toPlainDate(plainDateLike);\n    return this.with({\n      year: plainDate.year,\n      month: plainDate.month,\n      day: plainDate.day,\n    });\n  }\n\n  withCalendar(calendar: string) {\n    return new PlainDateTime(\n      this.year,\n      this.month,\n      this.day,\n      this.hour,\n      this.minute,\n      this.second,\n      this.millisecond,\n      calendar,\n    );\n  }\n\n  until(otherLike: PlainDateTimeLike, options: PlainDateTimeDeltaParameters) {\n    let other = toPlainDateTime(otherLike);\n    if (this.equals(other)) {\n      return new Duration();\n    }\n\n    let smallestUnit = parseUnit(options.smallestUnit, 'millisecond');\n    let largestUnit = parseUnit(options.largestUnit, 'auto');\n    let roundingIncrement = options.roundingIncrement ?? 1;\n    let roundingMode = options.roundingMode ?? 'trunc';\n\n    if (largestUnit === 'auto') {\n      largestUnit = isCalendarUnit(smallestUnit) ? smallestUnit : 'day';\n    }\n\n    let resultRecord = differencePlainDateTimeWithRounding(\n      this,\n      other,\n      smallestUnit,\n      largestUnit,\n      roundingIncrement,\n      roundingMode,\n    );\n\n    return resultRecord.duration;\n  }\n\n  since(other: PlainDateTimeLike, options: PlainDateTimeDeltaParameters) {\n    return toPlainDateTime(other).until(this, options);\n  }\n\n  static from(item: PlainDateTimeLike, options: {overflow?: 'reject' | 'constrain'} = {}) {\n    if (item instanceof PlainDateTime || item instanceof ZonedDateTime) {\n      return new PlainDateTime(item.year, item.month, item.day, item.hour, item.minute, item.second, item.millisecond);\n    } else if (item && typeof item === 'object' && !Array.isArray(item)) {\n      let {year, month, day} = verifyDateComponents(item.year, item.month, item.day, options.overflow ?? 'constrain');\n      let {hour, minute, second, millisecond} = verifyTimeComponents(\n        item.hour || 0,\n        item.minute || 0,\n        item.second || 0,\n        item.millisecond || 0,\n        options.overflow ?? 'constrain',\n      );\n      return new PlainDateTime(year, month, day, hour, minute, second, millisecond);\n    } else if (typeof item === 'string') {\n      let result = ISO8601Result.parseDateTime(item);\n      if (result && result.date) {\n        return new PlainDateTime(\n          result.date.year,\n          result.date.month,\n          result.date.day,\n          result.time?.hour,\n          result.time?.minute,\n          result.time?.second,\n          result.time?.millisecond,\n        );\n      }\n    }\n    throw new RangeError('Failed to parse PlainDateTime');\n  }\n\n  static compare(one: PlainDateTimeLike, two: PlainDateTimeLike): number {\n    return Math.sign(toPlainDateTime(one).raw.valueOf() - toPlainDateTime(two).raw.valueOf());\n  }\n}\n","import {CalendarUnit, DateTimeUnit, DateUnit, Plural, RoundingMode, TimeUnit, UnsignedRoundingMode} from './types.js';\nimport Duration from './duration.js';\nimport {ZonedDateTime, ZonedDateTimeLike, toZonedDateTime} from './zoned-date-time.js';\nimport Calendar, {daysInMonth, inLeapYear} from './calendar.js';\nimport {PlainDate, PlainDateLike} from './plain-date.js';\nimport {PlainTime} from './plain-time.js';\nimport {PlainDateTime} from './plain-date-time.js';\nimport {Instant} from './instant.js';\nimport {TimeZone} from './time-zone.js';\nimport {DAY, HOUR, MINUTE, PER_UNIT, SECOND} from './units.js';\n\nenum TemporalUnits {\n  year = 0,\n  month = 1,\n  week = 2,\n  day = 3,\n  hour = 4,\n  minute = 5,\n  second = 6,\n  millisecond = 7,\n}\n\ninterface NudgeRecord {\n  timeDuration: DurationRecord;\n  total: number;\n  nudgedEpoch: number;\n  didExpandDays: boolean;\n}\n\nexport interface DurationRecord {\n  years: number;\n  months: number;\n  weeks: number;\n  days: number;\n  timeDuration: number;\n}\n\nexport interface DurationDiff {\n  duration: Duration;\n  total: number;\n}\n\nexport interface TimeDuration {\n  days: number;\n  hours: number;\n  minutes: number;\n  seconds: number;\n  milliseconds: number;\n}\n\nexport interface TimeComponents {\n  hour: number;\n  minute: number;\n  second: number;\n  millisecond: number;\n}\n\nexport function maxTemporalUnit<A extends DateTimeUnit, B extends DateTimeUnit>(one: A, two: B): A | B {\n  let oneValue = TemporalUnits[one];\n  let twoValue = TemporalUnits[two];\n  if (oneValue > twoValue) {\n    return two;\n  }\n  return one;\n}\n\nexport function defaultLargestUnit(duration: Duration): DateTimeUnit {\n  if (duration.years) {\n    return 'year';\n  } else if (duration.months) {\n    return 'month';\n  } else if (duration.weeks) {\n    return 'week';\n  } else if (duration.days) {\n    return 'day';\n  } else if (duration.hours) {\n    return 'hour';\n  } else if (duration.minutes) {\n    return 'minute';\n  } else if (duration.seconds) {\n    return 'second';\n  }\n  return 'millisecond';\n}\n\nfunction mod(n: number, d: number) {\n  return ((n % d) + d) % d;\n}\n\nexport function balanceTime(hour: number, minute: number, second: number, millisecond: number) {\n  second = second + Math.floor(millisecond / 1000);\n  millisecond = mod(millisecond, 1000);\n  minute = minute + Math.floor(second / 60);\n  second = mod(second, 60);\n  hour = hour + Math.floor(minute / 60);\n  minute = mod(minute, 60);\n  let deltaDays = Math.floor(hour / 24);\n  hour = mod(hour, 24);\n\n  return {\n    hour,\n    minute,\n    second,\n    millisecond,\n    deltaDays,\n  };\n}\n\nexport function balanceTimeDuration(value: number, largestUnit?: DateTimeUnit): TimeDuration {\n  let sign = Math.sign(value);\n  value = Math.abs(value);\n\n  if (largestUnit === 'millisecond') {\n    return {\n      days: 0,\n      hours: 0,\n      minutes: 0,\n      seconds: 0,\n      milliseconds: value * sign,\n    };\n  }\n\n  let seconds = Math.floor(value / 1000);\n  let milliseconds = value % 1000;\n  let minutes = Math.floor(seconds / 60);\n\n  if (largestUnit === 'second') {\n    return {\n      days: 0,\n      hours: 0,\n      minutes: 0,\n      seconds: seconds * sign,\n      milliseconds: milliseconds * sign,\n    };\n  }\n\n  seconds = seconds % 60;\n  let hours = Math.floor(minutes / 60);\n\n  if (largestUnit === 'minute') {\n    return {\n      days: 0,\n      hours: 0,\n      minutes: minutes * sign,\n      seconds: seconds * sign,\n      milliseconds: milliseconds * sign,\n    };\n  }\n  minutes = minutes % 60;\n  let days = Math.floor(hours / 24);\n\n  if (largestUnit === 'hour') {\n    return {\n      days: 0,\n      hours: hours * sign,\n      minutes: minutes * sign,\n      seconds: seconds * sign,\n      milliseconds: milliseconds * sign,\n    };\n  }\n\n  hours = hours % 24;\n\n  return {\n    days: days * sign,\n    hours: hours * sign,\n    minutes: minutes * sign,\n    seconds: seconds * sign,\n    milliseconds: milliseconds * sign,\n  };\n}\n\nexport function deltaTimeComponents(\n  one: ZonedDateTime | PlainTime | PlainDateTime,\n  two: ZonedDateTime | PlainTime | PlainDateTime,\n) {\n  let hours = two.hour - one.hour;\n  let minutes = two.minute - one.minute;\n  let seconds = two.second - one.second;\n  let milliseconds = two.millisecond - one.millisecond;\n  return milliseconds + seconds * SECOND + minutes * MINUTE + hours * HOUR;\n}\n\nfunction zonedDateUntil(\n  one: ZonedDateTime,\n  two: ZonedDateTime,\n  largestUnit: DateUnit,\n  calendar: Calendar,\n): DurationRecord {\n  let sign = Math.sign(two.epochMilliseconds - one.epochMilliseconds);\n  if (sign === 0) {\n    return {years: 0, months: 0, weeks: 0, days: 0, timeDuration: 0};\n  }\n\n  let delta = two.epochMilliseconds - one.epochMilliseconds;\n  let offset = two.offsetMilliseconds - one.offsetMilliseconds;\n  if (Math.abs(delta + offset) < DAY) {\n    return {years: 0, months: 0, weeks: 0, days: 0, timeDuration: delta};\n  }\n\n  let onePlainDate = one.toPlainDate();\n  let twoPlainDate = two.toPlainDate();\n\n  let timeComponents = deltaTimeComponents(one, two);\n  let timeComponentsSign = Math.sign(timeComponents);\n  if (sign === -timeComponentsSign) {\n    onePlainDate = onePlainDate.add({days: -timeComponentsSign});\n    timeComponents = timeComponents - timeComponentsSign * 86400e3;\n  }\n\n  let dateDelta = calendar.dateUntil(onePlainDate, twoPlainDate, {largestUnit});\n  return {\n    years: dateDelta.years,\n    months: dateDelta.months,\n    weeks: dateDelta.weeks,\n    days: dateDelta.days,\n    timeDuration: timeComponents,\n  };\n}\n\nfunction applyUnsignedRoundingMode(value: number, r1: number, r2: number, unsignedRoundingMode: UnsignedRoundingMode) {\n  if (value === r1) {\n    return r1;\n  }\n  if (unsignedRoundingMode === 'zero') {\n    return r1;\n  } else if (unsignedRoundingMode === 'infinity') {\n    return r2;\n  }\n\n  let d1 = value - r1;\n  let d2 = r2 - value;\n  if (d1 < d2) {\n    return r1;\n  } else if (d2 < d1) {\n    return r2;\n  }\n\n  if (unsignedRoundingMode === 'half-zero') {\n    return r1;\n  } else if (unsignedRoundingMode === 'half-infinity') {\n    return r2;\n  }\n\n  let cardinality = r1 / (r2 - r1); // % 2;\n  cardinality = ((cardinality % 2) + 2) % 2;\n  return cardinality === 0 ? r1 : r2;\n}\n\nfunction getUnsignedRoundingMode(roundingMode: RoundingMode, isNegative: boolean): UnsignedRoundingMode {\n  switch (roundingMode) {\n    case 'ceil':\n      return isNegative ? 'zero' : 'infinity';\n    case 'floor':\n      return isNegative ? 'infinity' : 'zero';\n    case 'expand':\n      return isNegative ? 'infinity' : 'infinity';\n    case 'trunc':\n      return isNegative ? 'zero' : 'zero';\n    case 'halfCeil':\n      return isNegative ? 'half-zero' : 'half-infinity';\n    case 'halfFloor':\n      return isNegative ? 'half-infinity' : 'half-zero';\n    case 'halfExpand':\n      return isNegative ? 'half-infinity' : 'half-infinity';\n    case 'halfTrunc':\n      return isNegative ? 'half-zero' : 'half-zero';\n    case 'halfEven':\n      return isNegative ? 'half-even' : 'half-even';\n  }\n}\n\nexport function roundToIncrement(quantity: number, increment: number, mode: RoundingMode) {\n  let quotient = Math.abs(quantity / increment);\n  let sign = Math.sign(quantity);\n\n  let unsignedRoundingMode = getUnsignedRoundingMode(mode, sign === -1);\n  let r1 = Math.trunc(quotient);\n  let r2 = r1 + 1;\n  let rounded = applyUnsignedRoundingMode(quotient, r1, r2, unsignedRoundingMode);\n  return rounded * increment * sign;\n}\n\nconst wednesday = 3;\nconst friday = 5;\nconst saturday = 6;\n\nexport function toISOWeekOfYear(zonedDate: ZonedDateTime | PlainDate | PlainDateTime) {\n  let dayOfYear = zonedDate.dayOfYear;\n  let dayOfWeek = zonedDate.dayOfWeek;\n  let week = Math.floor((dayOfYear + 7 - dayOfWeek + wednesday) / 7);\n  if (week < 1) {\n    let date = new Date(Date.UTC(zonedDate.year, 0, 1));\n    let legacyDayOfWeek = date.getUTCDay();\n    let dayOfJan1st = legacyDayOfWeek === 0 ? 7 : legacyDayOfWeek;\n    if (dayOfJan1st === friday) {\n      return {week: 53, year: zonedDate.year - 1};\n    } else if (dayOfJan1st === saturday && inLeapYear(zonedDate.year - 1)) {\n      return {week: 53, year: zonedDate.year - 1};\n    }\n    return {week: 52, year: zonedDate.year - 1};\n  } else if (week === 53) {\n    let daysInYear = zonedDate.daysInYear;\n    let daysLaterInYear = daysInYear - dayOfYear;\n    let daysAfterThursday = 4 - dayOfWeek;\n    if (daysLaterInYear < daysAfterThursday) {\n      return {week: 53, year: zonedDate.year + 1};\n    }\n  }\n  return {week, year: zonedDate.year};\n}\n\nexport function balanceISOYearMonth(year: number, month: number) {\n  month -= 1;\n  year += Math.floor(month / 12);\n  month %= 12;\n  if (month < 0) {\n    month += 12;\n  }\n  month += 1;\n  return {year, month};\n}\n\nexport function normalizeDateAdd(\n  year: number,\n  month: number,\n  day: number,\n  duration: Duration,\n  overflow?: 'reject' | 'constrain',\n) {\n  overflow ??= 'constrain';\n\n  year += duration.years;\n  month += duration.months;\n\n  ({year, month} = balanceISOYearMonth(year, month));\n  return verifyDateComponents(year, month, day, overflow);\n}\n\nexport function verifyDateComponents(year: number, month: number, day: number, overflow: 'reject' | 'constrain') {\n  if (overflow === 'reject') {\n    if (outsideOfRange(1, 13, month) || outsideOfRange(1, daysInMonth(year, month) + 1, day)) {\n      throw new RangeError();\n    }\n  } else if (overflow === 'constrain') {\n    month = Math.min(Math.max(1, month), 12);\n    day = Math.min(Math.max(1, day), daysInMonth(year, month));\n  }\n  return {year, month, day};\n}\n\nfunction outsideOfRange(min: number, max: number, value: number) {\n  return value < min || value >= max;\n}\n\nexport function verifyTimeComponents(\n  hour: number,\n  minute: number,\n  second: number,\n  millisecond: number,\n  overflow: 'reject' | 'constrain',\n): TimeComponents {\n  if (\n    overflow === 'reject' &&\n    (outsideOfRange(0, 24, hour) ||\n      outsideOfRange(0, 60, minute) ||\n      outsideOfRange(0, 60, second) ||\n      outsideOfRange(0, 1000, millisecond))\n  ) {\n    throw new RangeError();\n  } else if (overflow === 'constrain') {\n    hour = Math.min(Math.max(0, hour), 23);\n    minute = Math.min(Math.max(0, minute), 59);\n    second = Math.min(Math.max(0, second), 59);\n    millisecond = Math.min(Math.max(0, millisecond), 999);\n  }\n  return {hour, minute, second, millisecond};\n}\n\nexport function differenceZonedDateTimeWithRounding(\n  from: ZonedDateTime,\n  to: ZonedDateTime,\n  largestUnit: DateTimeUnit,\n  smallestUnit: DateTimeUnit,\n  roundingIncrement?: number,\n  roundingMode?: RoundingMode,\n) {\n  if (!isDateUnit(largestUnit)) {\n    let differenceRecord = differenceInstantWithRounding(\n      from.toInstant(),\n      to.toInstant(),\n      smallestUnit as 'day' | TimeUnit,\n      roundingIncrement ?? 1,\n      roundingMode ?? 'trunc',\n    );\n    let timeDuration = balanceTimeDuration(differenceRecord.timeDuration, largestUnit);\n    return {\n      duration: Duration.from(timeDuration),\n      total: differenceRecord.total,\n    };\n  }\n\n  let difference = zonedDateUntil(from, to, largestUnit, from.getCalendar());\n  let roundingGranularityIsNoop = smallestUnit === 'millisecond' && roundingIncrement === 1;\n  if (roundingGranularityIsNoop) {\n    let timeRecord = balanceTimeDuration(difference.timeDuration, 'hour');\n    // Missing step 4.b, need to understand it..\n    return {\n      duration: new Duration(\n        difference.years,\n        difference.months,\n        difference.weeks,\n        difference.days,\n        timeRecord.hours,\n        timeRecord.minutes,\n        timeRecord.seconds,\n        timeRecord.milliseconds,\n      ),\n      total: difference.timeDuration,\n    };\n  }\n\n  return roundRelativeDuration(\n    difference,\n    to.epochMilliseconds,\n    from,\n    smallestUnit,\n    largestUnit,\n    roundingIncrement ?? 1,\n    roundingMode ?? 'trunc',\n  );\n}\n\n// DifferencePlainDateTimeWithRounding\nexport function differencePlainDateTimeWithRounding(\n  from: PlainDateTime,\n  to: PlainDateTime,\n  smallestUnit: DateTimeUnit,\n  largestUnit: DateTimeUnit,\n  roundingIncrement: number,\n  roundingMode: RoundingMode,\n) {\n  if (from.equals(to)) {\n    return {duration: new Duration(), total: 0};\n  }\n\n  let record = differenceDateTime(from, to, largestUnit);\n  let roundingGranularityIsNoop = smallestUnit === 'millisecond' && roundingIncrement === 1;\n\n  if (roundingGranularityIsNoop) {\n    let timeDurationWithDays = record.timeDuration + record.days * DAY;\n    let timeResult = balanceTimeDuration(timeDurationWithDays, largestUnit);\n    let duration = new Duration(\n      record.years,\n      record.months,\n      record.weeks,\n      timeResult.days,\n      timeResult.hours,\n      timeResult.minutes,\n      timeResult.seconds,\n      timeResult.milliseconds,\n    );\n    return {duration, total: timeDurationWithDays};\n  }\n\n  let destination = toUTC(to);\n  return roundRelativeDuration(record, destination, from, smallestUnit, largestUnit, roundingIncrement, roundingMode);\n}\n\nfunction nudgeToCalendarUnit(\n  sign: -1 | 1,\n  dateTime: PlainDateTime,\n  duration: DurationRecord,\n  destination: number,\n  unit: DateUnit,\n  timeZone: TimeZone | null,\n  roundingIncrement: number,\n  roundingMode: RoundingMode,\n): NudgeRecord {\n  let from: DurationRecord;\n  let to: DurationRecord;\n\n  let r1: number;\n  let r2: number;\n\n  switch (unit) {\n    case 'year':\n      let years = roundToIncrement(duration.years, roundingIncrement, 'trunc');\n      r1 = years;\n      r2 = years + roundingIncrement * sign;\n      from = {years: r1, months: 0, weeks: 0, days: 0, timeDuration: 0};\n      to = {years: r2, months: 0, weeks: 0, days: 0, timeDuration: 0};\n      break;\n    case 'month':\n      let months = roundToIncrement(duration.months, roundingIncrement, 'trunc');\n\n      r1 = months;\n      r2 = months + roundingIncrement * sign;\n\n      from = {years: duration.years, months: r1, weeks: 0, days: 0, timeDuration: 0};\n      to = {years: duration.years, months: r2, weeks: 0, days: 0, timeDuration: 0};\n      break;\n    case 'week':\n      let weeksStart = dateTime.toPlainDate();\n      let weeksEnd = weeksStart.add({days: duration.days});\n\n      let delta = weeksEnd.until(weeksStart, {largestUnit: 'week'});\n      let weeks = roundToIncrement(delta.weeks, roundingIncrement, 'trunc');\n\n      r1 = weeks;\n      r2 = weeks + roundingIncrement * sign;\n      from = {years: duration.years, months: duration.months, weeks: r1, days: 0, timeDuration: 0};\n      to = {years: duration.years, months: duration.months, weeks: r2, days: 0, timeDuration: 0};\n      break;\n    case 'day':\n      let days = roundToIncrement(duration.days, roundingIncrement, 'trunc');\n      r1 = days;\n      r2 = days + roundingIncrement * sign;\n\n      from = {years: duration.years, months: duration.months, weeks: duration.weeks, days: r1, timeDuration: 0};\n      to = {years: duration.years, months: duration.months, weeks: duration.weeks, days: r2, timeDuration: 0};\n      break;\n  }\n\n  let start = dateTime.add(from);\n  let end = dateTime.add(to);\n\n  let startEpoch: number;\n  let endEpoch: number;\n\n  if (timeZone) {\n    startEpoch = start.toZonedDateTime(timeZone).epochMilliseconds;\n    endEpoch = end.toZonedDateTime(timeZone).epochMilliseconds;\n  } else {\n    startEpoch = toUTC(start);\n    endEpoch = toUTC(end);\n  }\n\n  let unsignedRoundingMode = getUnsignedRoundingMode(roundingMode, sign < 0);\n  let progress = (destination - startEpoch) / (endEpoch - startEpoch);\n  let total = r1 + progress * roundingIncrement * sign;\n  let roundedUnit = applyUnsignedRoundingMode(total, r1, r2, unsignedRoundingMode);\n  let roundedSign = Math.sign(roundedUnit - total);\n  if (roundedSign === sign) {\n    return {\n      timeDuration: to,\n      total,\n      nudgedEpoch: endEpoch,\n      didExpandDays: true,\n    };\n  }\n  return {\n    timeDuration: from,\n    total,\n    nudgedEpoch: startEpoch,\n    didExpandDays: false,\n  };\n}\n\n// NudgeToDayOrTime\nfunction nudgeToDayOrTime(\n  timeDuration: DurationRecord,\n  destination: number,\n  smallestUnit: TimeUnit,\n  largestUnit: DateTimeUnit,\n  roundingIncrement: number,\n  roundingMode: RoundingMode,\n): NudgeRecord {\n  let time = timeDuration.days * DAY + timeDuration.timeDuration;\n  let roundedTimeDuration = internalRoundTimeDuration(0, time, roundingIncrement, roundingMode, smallestUnit);\n\n  let diff = roundedTimeDuration.timeDuration - time;\n  let wholeDays = Math.trunc(time / DAY);\n  let roundedFractionalDays = roundedTimeDuration.timeDuration / DAY;\n  let roundedWholeDays = Math.trunc(roundedFractionalDays);\n\n  let dayDelta = roundedWholeDays - wholeDays;\n  let dayDeltaSign = Math.sign(dayDelta);\n  let didExpandDays = dayDeltaSign === Math.sign(time);\n\n  let nudgedEpoch = destination + diff;\n\n  let days = 0;\n  let remainder = roundedTimeDuration.timeDuration;\n\n  if (maxTemporalUnit(largestUnit, 'day') === largestUnit) {\n    days = roundedWholeDays;\n    remainder = roundedTimeDuration.timeDuration % DAY;\n  }\n\n  let result: DurationRecord = {\n    years: timeDuration.years,\n    months: timeDuration.months,\n    weeks: timeDuration.weeks,\n    days,\n    timeDuration: remainder,\n  };\n\n  return {\n    timeDuration: result,\n    total: roundedTimeDuration.total,\n    nudgedEpoch,\n    didExpandDays,\n  };\n}\n\nfunction nudgeToZonedTime(\n  sign: 1 | -1,\n  dateTime: PlainDateTime,\n  timeZone: TimeZone,\n  timeDuration: DurationRecord,\n  unit: TimeUnit,\n  roundingIncrement: number,\n  roundingMode: RoundingMode,\n): NudgeRecord {\n  let start = dateTime\n    .add({\n      years: timeDuration.years,\n      months: timeDuration.months,\n      weeks: timeDuration.weeks,\n      days: timeDuration.days,\n    })\n    .toZonedDateTime(timeZone);\n\n  let end = new PlainDateTime(start.year, start.month, start.day).add({days: sign}).toZonedDateTime(timeZone);\n\n  let daySpan = end.epochMilliseconds - start.epochMilliseconds;\n  let unitLength = PER_UNIT[unit];\n\n  let roundedTime = roundToIncrement(timeDuration.timeDuration, roundingIncrement * unitLength, roundingMode);\n  let beyondDaySpan = roundedTime - daySpan;\n  // Step: 15\n  let didExpandDays: boolean;\n  let dayDelta: number;\n  let nudgedEpoch: number;\n\n  if (Math.sign(beyondDaySpan) !== -sign) {\n    didExpandDays = true;\n    dayDelta = sign;\n    roundedTime = roundToIncrement(beyondDaySpan, roundingIncrement * unitLength, roundingMode);\n    nudgedEpoch = roundedTime + end.epochMilliseconds;\n  } else {\n    didExpandDays = false;\n    dayDelta = 0;\n    nudgedEpoch = roundedTime + end.epochMilliseconds;\n  }\n\n  let resultDuration = {\n    years: timeDuration.years,\n    months: timeDuration.months,\n    weeks: timeDuration.weeks,\n    days: timeDuration.days + dayDelta,\n    timeDuration: roundedTime,\n  };\n\n  return {\n    didExpandDays,\n    nudgedEpoch,\n    total: 0,\n    timeDuration: resultDuration,\n  };\n}\n\nfunction roundRelativeDuration(\n  timeDuration: DurationRecord,\n  destination: number,\n  relativeTo: ZonedDateTime | PlainDateTime,\n  smallestUnit: DateTimeUnit,\n  largestUnit: DateTimeUnit,\n  roundingIncrement: number,\n  roundingMode: RoundingMode,\n): DurationDiff {\n  let irregularLengthUnit = isCalendarUnit(smallestUnit);\n  if (relativeTo instanceof PlainDateTime && smallestUnit === 'day') {\n    irregularLengthUnit = true;\n  }\n  let duration = new Duration(\n    timeDuration.years,\n    timeDuration.months,\n    timeDuration.weeks,\n    timeDuration.days,\n    0,\n    0,\n    0,\n    timeDuration.timeDuration,\n  );\n  let sign = duration.sign;\n  // assert sign is -1 or 1;\n\n  let nudge: NudgeRecord;\n  let dateTime = PlainDateTime.from(relativeTo);\n  if (irregularLengthUnit) {\n    let timeZone = relativeTo instanceof ZonedDateTime ? relativeTo.getTimeZone() : null;\n    nudge = nudgeToCalendarUnit(\n      sign as -1 | 1,\n      dateTime,\n      timeDuration,\n      destination,\n      smallestUnit as DateUnit,\n      timeZone,\n      roundingIncrement,\n      roundingMode,\n    );\n  } else if (relativeTo instanceof ZonedDateTime) {\n    nudge = nudgeToZonedTime(\n      sign as -1 | 1,\n      dateTime,\n      relativeTo.getTimeZone(),\n      timeDuration,\n      smallestUnit as TimeUnit,\n      roundingIncrement,\n      roundingMode,\n    );\n  } else if (isDateUnit(smallestUnit) === false) {\n    nudge = nudgeToDayOrTime(timeDuration, destination, smallestUnit, largestUnit, roundingIncrement, roundingMode);\n  } else {\n    throw new RangeError();\n  }\n\n  let durationRecord = nudge.timeDuration;\n\n  // Step: 9\n  if (nudge.didExpandDays) {\n    let timeZone = relativeTo instanceof ZonedDateTime ? relativeTo.getTimeZone() : null;\n    let startUnit = maxTemporalUnit(smallestUnit, 'day');\n    durationRecord = bubbleRelativeDuration(\n      sign as 1 | -1,\n      durationRecord,\n      nudge.nudgedEpoch,\n      dateTime,\n      timeZone,\n      largestUnit as DateUnit,\n      startUnit as DateUnit,\n    );\n  }\n\n  // Step: 10\n  if (isDateUnit(largestUnit)) {\n    largestUnit = 'hour';\n  }\n\n  let balanceResult = balanceTimeDuration(durationRecord.timeDuration, largestUnit);\n  return {\n    total: nudge.total,\n    duration: new Duration(\n      durationRecord.years,\n      durationRecord.months,\n      durationRecord.weeks,\n      durationRecord.days,\n      balanceResult.hours,\n      balanceResult.minutes,\n      balanceResult.seconds,\n      balanceResult.milliseconds,\n    ),\n  };\n}\n\nfunction bubbleRelativeDuration(\n  sign: -1 | 1,\n  duration: DurationRecord,\n  nudgedEpoch: number,\n  dateTime: PlainDateTime,\n  timeZone: TimeZone | null,\n  largestUnit: DateUnit,\n  smallestUnit: DateUnit,\n) {\n  if (smallestUnit === 'year') {\n    return duration;\n  }\n\n  let largestUnitIndex = TemporalUnits[largestUnit];\n  let smallestUnitIndex = TemporalUnits[largestUnit];\n\n  for (let unitIndex = smallestUnitIndex - 1; unitIndex >= largestUnitIndex; unitIndex--) {\n    let endDuration: DurationRecord;\n    if (unitIndex != TemporalUnits.week || largestUnitIndex === TemporalUnits.week) {\n      switch (unitIndex) {\n        case TemporalUnits.year:\n          endDuration = {years: duration.years + sign, months: 0, weeks: 0, days: 0, timeDuration: 0};\n          break;\n        case TemporalUnits.month:\n          endDuration = {years: duration.years, months: duration.months + sign, weeks: 0, days: 0, timeDuration: 0};\n          break;\n        case TemporalUnits.week:\n          endDuration = {\n            years: duration.years,\n            months: duration.months,\n            weeks: duration.weeks + sign,\n            days: 0,\n            timeDuration: 0,\n          };\n          break;\n        default:\n          endDuration = {\n            years: duration.years,\n            months: duration.months,\n            weeks: duration.weeks,\n            days: duration.days + sign,\n            timeDuration: 0,\n          };\n          break;\n      }\n\n      let end = dateTime.add({\n        years: endDuration.years,\n        months: endDuration.months,\n        weeks: endDuration.weeks,\n        days: endDuration.days,\n        milliseconds: endDuration.timeDuration,\n      });\n\n      let endEpoch: number;\n      if (timeZone) {\n        endEpoch = end.toZonedDateTime(timeZone).epochMilliseconds;\n      } else {\n        endEpoch = toUTC(end);\n      }\n\n      let beyondEnd = nudgedEpoch - endEpoch;\n      let beyondEndSign = Math.sign(beyondEnd);\n      if (beyondEndSign !== -sign) {\n        duration = endDuration;\n      } else {\n        break;\n      }\n    }\n  }\n  return duration;\n}\n\n// DifferenceInstant\nexport function differenceInstantWithRounding(\n  from: Instant,\n  to: Instant,\n  smallestUnit: 'day' | TimeUnit,\n  roundingIncrement: number,\n  roundingMode: RoundingMode,\n) {\n  let difference = to.epochMilliseconds - from.epochMilliseconds;\n  return internalRoundTimeDuration(0, difference, roundingIncrement, roundingMode, smallestUnit);\n}\n\n//  NormalizeTimeDuration\nexport function durationToTimeDuration(duration: Duration) {\n  return duration.hours * HOUR + duration.minutes * MINUTE + duration.seconds * SECOND + duration.milliseconds;\n}\n\nexport function toTimeDuration(timeComponents: TimeComponents) {\n  return (\n    timeComponents.hour * HOUR +\n    timeComponents.minute * MINUTE +\n    timeComponents.second * SECOND +\n    timeComponents.millisecond\n  );\n}\n\n// RoundTimeDuration\nexport function internalRoundTimeDuration(\n  days: number,\n  timeDuration: number,\n  increment: number,\n  roundingMode: RoundingMode,\n  unit: 'day' | 'hour' | 'minute' | 'second' | 'millisecond',\n) {\n  let incrementUnit = PER_UNIT[unit];\n  switch (unit) {\n    case 'day':\n      let fractionalDays = days + timeDuration / incrementUnit;\n      return {\n        days: roundToIncrement(fractionalDays, increment, roundingMode),\n        timeDuration: 0,\n        total: fractionalDays,\n      };\n    default:\n      return {\n        days,\n        timeDuration: roundToIncrement(timeDuration, increment * incrementUnit, roundingMode),\n        total: timeDuration / incrementUnit,\n      };\n  }\n}\n\nexport function isCalendarUnit(unit: DateTimeUnit): unit is CalendarUnit {\n  return unit === 'year' || unit === 'month' || unit === 'week';\n}\n\nexport function isDateUnit(unit: DateTimeUnit): unit is CalendarUnit | 'day' {\n  return unit === 'year' || unit === 'month' || unit === 'week' || unit === 'day';\n}\n\nfunction differenceDateTime(one: PlainDateTime, two: PlainDateTime, largestUnit: DateTimeUnit): DurationRecord {\n  let timeDuration = deltaTimeComponents(one, two);\n  let adjustedDate = one.toPlainDate();\n  let twoDate = two.toPlainDate();\n\n  let timeSign = Math.sign(timeDuration);\n  let dateSign = PlainDate.compare(twoDate, adjustedDate);\n\n  if (timeSign === -dateSign) {\n    timeDuration -= timeSign * DAY;\n    adjustedDate = adjustedDate.add({days: -timeSign});\n  }\n\n  let delta = one.getCalendar().dateUntil(adjustedDate, twoDate, {\n    largestUnit: maxTemporalUnit('day', largestUnit) as 'day',\n  });\n\n  return {\n    years: delta.years,\n    months: delta.months,\n    weeks: delta.weeks,\n    days: delta.days,\n    timeDuration,\n  };\n}\n\nfunction toUTC(dateTime: PlainDateTime) {\n  return Date.UTC(\n    dateTime.year,\n    dateTime.month - 1,\n    dateTime.day,\n    dateTime.hour,\n    dateTime.minute,\n    dateTime.second,\n    dateTime.millisecond,\n  );\n}\n\nexport type RelativeToLike = PlainDate | ZonedDateTime | ZonedDateTimeLike | PlainDateLike;\nexport type RelativeTo = PlainDate | ZonedDateTime;\nexport function parseRelativeTo(relativeTo: RelativeToLike): PlainDate | ZonedDateTime {\n  try {\n    return toZonedDateTime(relativeTo as any);\n  } catch (error) {\n    try {\n      return PlainDate.from(relativeTo as any);\n    } catch (error) {\n      throw new RangeError('Unsupported relativeTo, can’t convert to ZonedDateTime or PlainDate');\n    }\n  }\n}\n\nexport function parseUnit<T extends DateTimeUnit | 'auto'>(input: Plural<T> | undefined, defaultValue?: T): T;\nexport function parseUnit<T extends DateTimeUnit>(input: Plural<T> | undefined, defaultValue: T): T {\n  if (input) {\n    switch (input) {\n      case 'years':\n        return 'year' as T;\n      case 'months':\n        return 'month' as T;\n      case 'days':\n        return 'day' as T;\n      case 'hours':\n        return 'hour' as T;\n      case 'minutes':\n        return 'minute' as T;\n      case 'seconds':\n        return 'second' as T;\n      case 'milliseconds':\n        return 'millisecond' as T;\n      default:\n        return input as T;\n    }\n  }\n  return defaultValue;\n}\n\nexport function getPossibleMilliseconds(current: number, timeZone: TimeZone) {\n  let earlierOffset = timeZone.getOffsetMillisecondsFor(current - DAY);\n  let laterOffset = timeZone.getOffsetMillisecondsFor(current + DAY);\n  if (earlierOffset === laterOffset) {\n    return [current];\n  }\n\n  let currentOffset = timeZone.getOffsetMillisecondsFor(current);\n  let candiateOffset = currentOffset === earlierOffset ? laterOffset : earlierOffset;\n  let candiate = current + currentOffset - candiateOffset;\n  let candiateRealOffset = timeZone.getOffsetMillisecondsFor(candiate);\n\n  if (candiateRealOffset === candiateOffset) {\n    if (candiate > current) {\n      return [current, candiate];\n    }\n    return [candiate, current];\n  }\n  return [current];\n}\n","import Duration, {DurationLike, toDuration} from './duration.js';\nimport {ISO8601Result} from './parse.js';\nimport {PlainDateTime} from './plain-date-time.js';\nimport {RoundingMode} from './types.js';\nimport {\n  TimeComponents,\n  balanceTimeDuration,\n  deltaTimeComponents,\n  internalRoundTimeDuration,\n  durationToTimeDuration,\n  verifyTimeComponents,\n  toTimeDuration,\n  parseUnit,\n} from './utilities.js';\nimport {ZonedDateTime, pad} from './zoned-date-time.js';\n\nconst time = /(\\d{2})(?::(\\d{2})(?::(\\d{2})(?:[.,](\\d{1,9}))?))/;\n\nexport type PlainTimeLike = PlainTime | ZonedDateTime | Partial<TimeComponents> | string;\n\ninterface PlainTimeDeltaParameters {\n  /// The largest unit of time to round to in the resulting duration, defaults to 'auto'.\n  largestUnit?: 'auto' | 'hour' | 'minute' | 'second' | 'millisecond';\n  /// The smallest unit of time to round to in the resulting duration, defaults to 'millisecond', which means no rounding.\n  smallestUnit?: 'hour' | 'minute' | 'second' | 'millisecond';\n  /// The granularity to round to, of the unit given by smallestUnit. Defaults to `1`.\n  roundingIncrement?: number;\n  /// Rounding method to use\n  roundingMode?: RoundingMode;\n}\n\ninterface PlainTimeRoundParameters {\n  /// The smallest unit of time to round to in the resulting duration, defaults to 'millisecond', which means no rounding.\n  smallestUnit: 'hour' | 'minute' | 'second' | 'millisecond';\n  /// The granularity to round to, of the unit given by smallestUnit. Defaults to `1`.\n  roundingIncrement?: number;\n  /// Rounding method to use\n  roundingMode?: RoundingMode;\n}\n\ninterface PlainTimeToStringParameters {\n  /// The smallest unit of time to round to in the resulting duration, defaults to 'millisecond', which means no rounding.\n  smallestUnit?: 'hour' | 'minute' | 'second' | 'millisecond';\n  /// Rounding method to use\n  roundingMode?: RoundingMode;\n  ///\n  fractionalSecondDigits?: 'auto' | 0 | 1 | 2 | 3;\n}\n\nexport function toPlainTime(plainTimeLike: PlainTimeLike) {\n  return plainTimeLike instanceof PlainTime ? plainTimeLike : PlainTime.from(plainTimeLike);\n}\n\nexport class PlainTime {\n  readonly hour: number;\n  readonly minute: number;\n  readonly second: number;\n  readonly millisecond: number;\n\n  constructor(isoHour: number = 0, isoMinute: number = 0, isoSecond: number = 0, isoMillisecond: number = 0) {\n    verifyTimeComponents(isoHour, isoMinute, isoSecond, isoMillisecond, 'reject');\n    this.hour = isoHour;\n    this.minute = isoMinute;\n    this.second = isoSecond;\n    this.millisecond = isoMillisecond;\n  }\n\n  toLocaleString(locales?: string | string[], options: Intl.DateTimeFormatOptions = {}) {\n    let resolvedOptions: Intl.DateTimeFormatOptions =\n      'timeStyle' in options\n        ? {}\n        : {\n            hour: 'numeric',\n            minute: '2-digit',\n            second: '2-digit',\n          };\n\n    let formatter = new Intl.DateTimeFormat(locales, {\n      ...resolvedOptions,\n      ...options,\n      timeZone: 'UTC',\n    });\n    return formatter.format(Date.UTC(0, 0, 0, this.hour, this.minute, this.second, this.millisecond));\n  }\n\n  toString(options: PlainTimeToStringParameters = {}) {\n    let smallestUnit = parseUnit(options.smallestUnit);\n    let date = smallestUnit\n      ? this.round({\n          smallestUnit,\n          roundingMode: options.roundingMode ?? 'trunc',\n        })\n      : this;\n    let fractionalSecondDigits = options.fractionalSecondDigits ?? 'auto';\n\n    switch (smallestUnit) {\n      case 'minute':\n        return `${pad(date.hour)}:${pad(date.minute)}`;\n      case 'second':\n        return `${pad(date.hour)}:${pad(date.minute)}:${pad(date.second)}`;\n      default:\n        let time = `${pad(date.hour)}:${pad(date.minute)}:${pad(date.second)}`;\n        if (options.fractionalSecondDigits === 0 || (fractionalSecondDigits === 'auto' && date.millisecond === 0)) {\n          return time;\n        }\n        return `${time}.${pad(date.millisecond, 3)}`;\n    }\n  }\n\n  toJSON() {\n    return this.toString();\n  }\n\n  add(durationLike: DurationLike): PlainTime {\n    let duration = toDuration(durationLike);\n    let selfDuration = toTimeDuration(this);\n    let timeDuration = durationToTimeDuration(duration) + selfDuration;\n    let {hours, minutes, seconds, milliseconds} = balanceTimeDuration(timeDuration, 'hour');\n    return new PlainTime(hours % 24, minutes, seconds, milliseconds);\n  }\n\n  subtract(durationLike: DurationLike): PlainTime {\n    return this.add(toDuration(durationLike).negated());\n  }\n\n  with(timeComponents: Partial<TimeComponents>, options: {overflow?: 'reject' | 'constrain'} = {}) {\n    let components = verifyTimeComponents(\n      timeComponents.hour ?? this.hour,\n      timeComponents.minute ?? this.minute,\n      timeComponents.second ?? this.second,\n      timeComponents.millisecond ?? this.millisecond,\n      options.overflow ?? 'constrain',\n    );\n\n    return new PlainTime(components.hour, components.minute, components.second, components.millisecond);\n  }\n\n  until(other: PlainTimeLike, options: PlainTimeDeltaParameters = {}) {\n    let timeComponents = deltaTimeComponents(this, toPlainTime(other));\n    let smallestUnit = parseUnit(options.smallestUnit, 'millisecond');\n    let largestUnit = parseUnit(options.largestUnit, 'hour');\n    let roundingIncrement = options.roundingIncrement || 1;\n    let roundingMode = options.roundingMode ?? 'trunc';\n\n    if (largestUnit === 'auto') {\n      largestUnit = 'hour';\n    }\n\n    let duration = Duration.from(balanceTimeDuration(timeComponents, largestUnit));\n\n    if (smallestUnit !== 'millisecond' || roundingIncrement !== 1) {\n      return duration.round({\n        largestUnit,\n        smallestUnit,\n        roundingIncrement,\n        roundingMode,\n      });\n    }\n    return duration;\n  }\n\n  since(other: PlainTimeLike, options: PlainTimeDeltaParameters = {}) {\n    return toPlainTime(other).until(this, options);\n  }\n\n  round(options: PlainTimeRoundParameters | PlainTimeRoundParameters['smallestUnit']) {\n    let smallestUnit: PlainTimeRoundParameters['smallestUnit'];\n    let roundingIncrement: Required<PlainTimeRoundParameters['roundingIncrement']>;\n    let roundingMode: Required<PlainTimeRoundParameters['roundingMode']>;\n\n    if (typeof options === 'string') {\n      smallestUnit = parseUnit(options);\n      roundingIncrement = 1;\n      roundingMode = 'halfExpand';\n    } else {\n      smallestUnit = parseUnit(options.smallestUnit);\n      roundingIncrement = options.roundingIncrement ?? 1;\n      roundingMode = options.roundingMode ?? 'halfExpand';\n    }\n\n    let timeDuration = toTimeDuration(this);\n    ({timeDuration} = internalRoundTimeDuration(0, timeDuration, roundingIncrement, roundingMode, smallestUnit));\n    let {hours, minutes, seconds, milliseconds} = balanceTimeDuration(timeDuration, 'hour');\n    return new PlainTime(hours % 24, minutes, seconds, milliseconds);\n  }\n\n  equals(other: PlainTimeLike) {\n    let otherTime = toPlainTime(other);\n    return (\n      this.hour === otherTime.hour &&\n      this.minute === otherTime.minute &&\n      this.second === otherTime.second &&\n      this.millisecond === otherTime.millisecond\n    );\n  }\n\n  valueOf() {\n    throw new Error('Built-in arithmetic operators isn’t supported on PlainTime');\n  }\n\n  static from(item: PlainTimeLike, options: {overflow?: 'reject' | 'constrain'} = {}): PlainTime {\n    if (item instanceof PlainTime || item instanceof ZonedDateTime || item instanceof PlainDateTime) {\n      return new PlainTime(item.hour, item.minute, item.second, item.millisecond);\n    } else if (item && typeof item === 'object' && !Array.isArray(item)) {\n      let {hour, minute, second, millisecond} = verifyTimeComponents(\n        item.hour || 0,\n        item.minute || 0,\n        item.second || 0,\n        item.millisecond || 0,\n        options.overflow ?? 'constrain',\n      );\n      return new PlainTime(hour, minute, second, millisecond);\n    } else if (typeof item === 'string') {\n      let result = ISO8601Result.parseDateTime(item);\n      if (result && result.time) {\n        return new PlainTime(result.time.hour, result.time.minute, result.time.second, result.time.millisecond);\n      }\n\n      let match = item.match(time);\n      if (match) {\n        let [rawHour, rawMinute, rawSecond, rawMillisecond] = match.slice(1);\n        let [hour, minute, second, millisecond] = ISO8601Result.parseTimeGroups(\n          rawHour,\n          rawMinute,\n          rawSecond,\n          rawMillisecond,\n        );\n        return new PlainTime(hour, minute, second, millisecond);\n      }\n      throw new RangeError('Not currently supported');\n    }\n    throw new RangeError('Unknown type');\n  }\n\n  static compare(one: PlainTimeLike, two: PlainTimeLike) {\n    return Math.sign(toTimeDuration(toPlainTime(one)) - toTimeDuration(toPlainTime(two)));\n  }\n}\n","import Duration, {type DurationLike, toDuration} from './duration.js';\nimport Calendar from './calendar.js';\nimport {\n  balanceTimeDuration,\n  differenceInstantWithRounding,\n  differenceZonedDateTimeWithRounding,\n  durationToTimeDuration,\n  getPossibleMilliseconds,\n  isDateUnit,\n  maxTemporalUnit,\n  normalizeDateAdd,\n  parseUnit,\n  roundToIncrement,\n  toTimeDuration,\n} from './utilities.js';\nimport {Instant} from './instant.js';\nimport {RoundingMode, TimeUnit} from './types.js';\nimport {DateTimeFormatTimeZone, TimeZone} from './time-zone.js';\nimport {PlainDate} from './plain-date.js';\nimport {PlainTime} from './plain-time.js';\nimport {ISO8601Result, Zulu} from './parse.js';\nimport {DAY, HOUR, MINUTE, PER_UNIT, SECOND} from './units.js';\nimport {PlainDateTime} from './plain-date-time.js';\n\nexport interface ZonedDateTimeComponents {\n  year: number;\n  month: number;\n  week: number;\n  day: number;\n  hour: number;\n  minute: number;\n  second: number;\n  millisecond: number;\n}\n\nexport interface ZonedDateTimeFromOptions {\n  disambiguation?: 'compatible' | 'earlier' | 'later';\n}\n\nexport type ZonedDateTimeLike = ZonedDateTime | DateTimeLike | string;\n\nexport interface DateTimeLike {\n  year: number;\n  month: number;\n  day: number;\n  hour?: number;\n  minute?: number;\n  second?: number;\n  millisecond?: number;\n  timeZone: string | TimeZone;\n}\n\nexport function pad(number: number, minLength = 2) {\n  return number.toString().padStart(minLength, '0');\n}\n\nexport function padYear(year: number) {\n  if (year < 0 || year > 9999) {\n    let sign = year < 0 ? '-' : '+';\n    return `${sign}${pad(Math.abs(year), 6)}`;\n  } else {\n    return pad(year, 4);\n  }\n}\n\ninterface ZonedDateAddParameters {\n  overflow?: 'reject' | 'constrain';\n}\n\ninterface ZonedDateTimeRoundParameters {\n  smallestUnit: 'day' | 'hour' | 'minute' | 'second' | 'millisecond';\n  roundingIncrement?: number;\n  roundingMode?: RoundingMode;\n}\n\ninterface ZonedDateTimeDeltaParameters {\n  /// The largest unit of time to round to in the resulting duration, defaults to 'auto'.\n  largestUnit?: 'auto' | 'year' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond';\n  /// The smallest unit of time to round to in the resulting duration, defaults to 'millisecond', which means no rounding.\n  smallestUnit?: 'year' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond';\n  /// The granularity to round to, of the unit given by smallestUnit. Defaults to `1`.\n  roundingIncrement?: number;\n  /// Rounding method to use\n  roundingMode?: RoundingMode;\n}\n\ninterface ZonedDateTimeToStringParameters {\n  offset?: 'auto' | 'never';\n  timeZoneName?: 'auto' | 'never' | 'critical';\n  calendarName?: 'auto' | 'always' | 'never' | 'critical';\n  fractionalSecondDigits?: 'auto' | 1 | 2 | 3;\n  smallestUnit?: 'minute' | 'second' | 'millisecond';\n  roundingMode?: RoundingMode;\n}\n\nexport class ZonedDateTime {\n  private raw: Date;\n  private timeZone: TimeZone;\n  private calendar: Calendar;\n\n  constructor(epochMillisecond: number, timeZoneLike: string | TimeZone) {\n    this.raw = new Date(epochMillisecond);\n    this.calendar = Calendar.from('iso8601');\n    if (typeof timeZoneLike === 'string') {\n      this.timeZone = DateTimeFormatTimeZone.from(timeZoneLike);\n    } else {\n      this.timeZone = timeZoneLike;\n    }\n  }\n\n  get hour() {\n    let date = new Date(this.raw.getTime() + this.offsetMilliseconds);\n    return date.getUTCHours();\n  }\n\n  get minute() {\n    let date = new Date(this.raw.getTime() + this.offsetMilliseconds);\n    return date.getUTCMinutes();\n  }\n\n  get second() {\n    let date = new Date(this.raw.getTime() + this.offsetMilliseconds);\n    return date.getUTCSeconds();\n  }\n\n  get millisecond() {\n    let date = new Date(this.raw.getTime() + this.offsetMilliseconds);\n    return date.getUTCMilliseconds();\n  }\n\n  get day() {\n    let date = new Date(this.raw.getTime() + this.offsetMilliseconds);\n    return date.getUTCDate();\n  }\n\n  get month() {\n    let date = new Date(this.raw.getTime() + this.offsetMilliseconds);\n    return date.getUTCMonth() + 1;\n  }\n\n  get year() {\n    let date = new Date(this.raw.getTime() + this.offsetMilliseconds);\n    return date.getUTCFullYear();\n  }\n\n  get epochSeconds() {\n    return Math.floor(this.raw.valueOf() / SECOND);\n  }\n\n  get epochMilliseconds() {\n    return this.raw.valueOf();\n  }\n\n  get offsetMilliseconds() {\n    return this.timeZone.getOffsetMillisecondsFor(this.epochMilliseconds);\n  }\n\n  get offset() {\n    let offset = this.offsetMilliseconds;\n    let sign = offset >= 0 ? '+' : '-';\n    offset = Math.abs(offset);\n    let hour = Math.trunc(offset / (60 * MINUTE));\n    let minutes = Math.trunc(offset / (60 * SECOND)) % 60;\n    return `${sign}${pad(hour)}:${pad(minutes)}`;\n  }\n\n  get inLeapYear() {\n    return this.calendar.inLeapYear(this);\n  }\n\n  get timeZoneId(): string {\n    return this.timeZone.id;\n  }\n\n  getCalendar() {\n    return this.calendar;\n  }\n\n  get calendarId(): string {\n    return this.calendar.id;\n  }\n\n  get daysInWeek() {\n    return this.calendar.daysInWeek(this);\n  }\n\n  get daysInMonth() {\n    return this.calendar.daysInMonth(this);\n  }\n\n  get monthsInYear() {\n    return this.calendar.monthsInYear(this);\n  }\n\n  get daysInYear() {\n    return this.calendar.daysInYear(this);\n  }\n\n  get weekOfYear() {\n    return this.calendar.weekOfYear(this);\n  }\n\n  get yearOfWeek() {\n    return this.calendar.yearOfWeek(this);\n  }\n\n  get hoursInDay() {\n    let initial = this.startOfDay();\n    let tomorrow = initial.add({days: 1}).startOfDay();\n    let hours = tomorrow.epochMilliseconds - initial.epochMilliseconds;\n    return hours / HOUR;\n  }\n\n  /**\n   * The dayOfYear read-only property gives the ordinal day of the year that the\n   * date falls on. For the ISO 8601 calendar, this is a value between 1 and 365,\n   * or 366 in a leap year.\n   */\n  get dayOfYear() {\n    return this.calendar.dayOfYear(this);\n  }\n\n  /**\n   * The dayOfWeek read-only property gives the weekday number that the date falls\n   * on. For the ISO 8601 calendar, the weekday number is defined as in the ISO 8601\n   * standard: a value between 1 and 7, inclusive, with Monday being 1, and Sunday 7\n   */\n  get dayOfWeek(): number {\n    return this.calendar.dayOfWeek(this);\n  }\n\n  /**\n   * Returns the time zone object.\n   */\n  getTimeZone() {\n    return this.timeZone;\n  }\n\n  /**\n   * This method adds duration to zonedDateTime.\n   *\n   * Returns: a new ZonedDateTime object representing the sum of zonedDateTime plus duration.\n   */\n  add(durationLike: DurationLike, options?: ZonedDateAddParameters) {\n    let duration = toDuration(durationLike);\n\n    let copy: ZonedDateTime;\n    if (duration.years || duration.months) {\n      let {year, month, day} = normalizeDateAdd(this.year, this.month, this.day, duration, options?.overflow);\n      copy = this.with({year, month, day});\n    } else {\n      copy = new ZonedDateTime(this.epochMilliseconds, this.timeZone);\n    }\n\n    if (duration.days || duration.weeks) {\n      let days = duration.days + duration.weeks * 7;\n      let originalOffset = copy.offsetMilliseconds;\n      copy.raw.setUTCMilliseconds(copy.raw.getMilliseconds() + DAY * days);\n      copy.adjustOffset(originalOffset);\n    }\n\n    let timeDuration = durationToTimeDuration(duration);\n    copy.raw.setUTCMilliseconds(copy.raw.getMilliseconds() + timeDuration);\n\n    return copy;\n  }\n\n  subtract(duration: DurationLike, options?: ZonedDateAddParameters) {\n    let negated = toDuration(duration).negated();\n    return this.add(negated, options);\n  }\n\n  /**\n   * Returns: A new ZonedDateTime instance representing the earliest valid local\n   * clock time during the current calendar day and time zone of zonedDateTime.\n   */\n  startOfDay() {\n    return this.with({\n      hour: 0,\n      minute: 0,\n      second: 0,\n      millisecond: 0,\n    });\n  }\n\n  round(options: ZonedDateTimeRoundParameters['smallestUnit'] | ZonedDateTimeRoundParameters) {\n    if (typeof options === 'string') {\n      options = {\n        smallestUnit: options,\n      };\n    }\n\n    let smallestUnit = parseUnit(options.smallestUnit);\n    let roundingIncrement = options.roundingIncrement ?? 1;\n    let roundingMode = options.roundingMode ?? 'halfExpand';\n\n    let originalOffset = this.offsetMilliseconds;\n\n    let remainder = toTimeDuration(this);\n    let startOfDay = this.epochMilliseconds - remainder;\n\n    let roundedRemainder = roundToIncrement(remainder, PER_UNIT[smallestUnit] * roundingIncrement, roundingMode);\n    let copy = new ZonedDateTime(startOfDay + roundedRemainder, this.timeZone);\n    copy.adjustOffset(originalOffset);\n    return copy;\n  }\n\n  until(zonedDateTimeLike: ZonedDateTimeLike, options: ZonedDateTimeDeltaParameters = {}): Duration {\n    let other = toZonedDateTime(zonedDateTimeLike);\n\n    let smallestUnit = parseUnit(options.smallestUnit, 'millisecond');\n    let largestUnit = parseUnit(options.largestUnit, 'auto');\n\n    let roundingIncrement = options.roundingIncrement ?? 1;\n    let roundingMode = options.roundingMode ?? 'trunc';\n\n    if (largestUnit === 'auto') {\n      largestUnit = maxTemporalUnit('hour', smallestUnit);\n    }\n\n    if (!isDateUnit(largestUnit)) {\n      let diffResult = differenceInstantWithRounding(\n        this.toInstant(),\n        other.toInstant(),\n        smallestUnit as TimeUnit | 'day',\n        roundingIncrement,\n        roundingMode,\n      );\n\n      let duration = balanceTimeDuration(diffResult.timeDuration, largestUnit);\n      return Duration.from(duration);\n    }\n\n    if (this.equals(other)) {\n      return new Duration();\n    }\n\n    let resultRecord = differenceZonedDateTimeWithRounding(\n      this,\n      other,\n      largestUnit,\n      smallestUnit,\n      roundingIncrement,\n      roundingMode,\n    );\n    return resultRecord.duration;\n  }\n\n  since(other: ZonedDateTimeLike, options?: ZonedDateTimeDeltaParameters): Duration {\n    return this.until(other, options).negated();\n  }\n\n  equals(otherLike: ZonedDateTimeLike): boolean {\n    let other = toZonedDateTime(otherLike);\n    return this.epochMilliseconds === other.epochMilliseconds && this.timeZone.id === other.timeZone.id;\n  }\n\n  with(zonedDateTimeLike: Partial<ZonedDateTimeComponents>) {\n    let copy = new ZonedDateTime(this.epochMilliseconds, this.timeZone);\n    let raw = copy.raw;\n\n    let offset = copy.offsetMilliseconds;\n    raw.setUTCMilliseconds(raw.getUTCMilliseconds() + offset);\n\n    let year = zonedDateTimeLike.year != null ? zonedDateTimeLike.year : raw.getUTCFullYear();\n    let month = zonedDateTimeLike.month != null ? zonedDateTimeLike.month - 1 : raw.getUTCMonth();\n    let day = zonedDateTimeLike.day != null ? zonedDateTimeLike.day : raw.getUTCDate();\n    raw.setUTCFullYear(year, month, day);\n\n    let hour = zonedDateTimeLike.hour != null ? zonedDateTimeLike.hour : raw.getUTCHours();\n    let minute = zonedDateTimeLike.minute != null ? zonedDateTimeLike.minute : raw.getUTCMinutes();\n    let second = zonedDateTimeLike.second != null ? zonedDateTimeLike.second : raw.getUTCSeconds();\n    let millisecond = zonedDateTimeLike.millisecond != null ? zonedDateTimeLike.millisecond : raw.getUTCMilliseconds();\n    raw.setUTCHours(hour, minute, second, millisecond);\n\n    raw.setUTCMilliseconds(raw.getUTCMilliseconds() - offset);\n    copy.adjustOffset(offset);\n    return copy;\n  }\n\n  toJSON() {\n    return this.toString();\n  }\n\n  toString(options: ZonedDateTimeToStringParameters = {}) {\n    let date: ZonedDateTime = this;\n    let smallestUnit = parseUnit(options.smallestUnit);\n    if (smallestUnit) {\n      date = this.round({\n        smallestUnit,\n        roundingMode: options.roundingMode ?? 'trunc',\n      });\n    }\n\n    let timeZone = options.timeZoneName === 'never' ? '' : `[${date.timeZoneId}]`;\n    let offset = options.offset === 'never' ? '' : date.offset;\n\n    let dateString = `${padYear(date.year)}-${pad(date.month)}-${pad(date.day)}`;\n    let time = `${pad(date.hour)}:${pad(date.minute)}:${pad(date.second)}.${pad(date.millisecond, 3)}`;\n\n    return `${dateString}T${time}${offset}${timeZone}`;\n  }\n\n  toLocaleString(locales: string | string[], options: Intl.DateTimeFormatOptions = {}) {\n    let formatter = new Intl.DateTimeFormat(locales, {\n      ...options,\n      timeZone: this.timeZoneId,\n    });\n    return formatter.format(this.epochMilliseconds);\n  }\n\n  toInstant() {\n    return Instant.fromEpochMilliseconds(this.epochMilliseconds);\n  }\n\n  toPlainDate() {\n    return new PlainDate(this.year, this.month, this.day);\n  }\n\n  toPlainTime() {\n    return new PlainTime(this.hour, this.minute, this.second, this.millisecond);\n  }\n\n  toPlainDateTime() {\n    return new PlainDateTime(this.year, this.month, this.day, this.hour, this.minute, this.second, this.millisecond);\n  }\n\n  withTimeZone(timeZone: string | TimeZone) {\n    return new ZonedDateTime(this.epochMilliseconds, timeZone);\n  }\n\n  valueOf() {\n    throw new Error('Built-in arithmetic operators isn’t supported on ZonedDateTime');\n  }\n\n  private adjustOffset(originalOffsetMilliseconds: number) {\n    let shiftedOffset = this.timeZone.getOffsetMillisecondsFor(this.raw.valueOf());\n    let delta = originalOffsetMilliseconds - shiftedOffset;\n    if (delta) {\n      this.raw.setUTCMilliseconds(this.raw.getMilliseconds() + delta);\n\n      // If the adjustment resulted in the time going back, and the UTC offset ended up\n      // as the original offset, revert the adjustment.\n      let adjusted = delta < 0;\n      if (adjusted && this.timeZone.getOffsetMillisecondsFor(this.raw.valueOf()) === originalOffsetMilliseconds) {\n        this.raw.setUTCMilliseconds(this.raw.getUTCMilliseconds() - delta);\n      }\n    }\n  }\n\n  static from(dateComponents: ZonedDateTimeLike, options: ZonedDateTimeFromOptions = {}): ZonedDateTime {\n    if (dateComponents instanceof ZonedDateTime) {\n      return new ZonedDateTime(dateComponents.epochMilliseconds, dateComponents.timeZone);\n    } else if (dateComponents && typeof dateComponents === 'object' && !Array.isArray(dateComponents)) {\n      let dateTime = new ZonedDateTime(Date.now(), dateComponents.timeZone);\n      let offset = dateTime.offsetMilliseconds;\n      dateTime.raw.setUTCFullYear(dateComponents.year, dateComponents.month - 1, dateComponents.day);\n      dateTime.raw.setUTCHours(\n        dateComponents.hour ?? 0,\n        dateComponents.minute ?? 0,\n        dateComponents.second ?? 0,\n        dateComponents.millisecond ?? 0,\n      );\n      dateTime.raw.setUTCMilliseconds(dateTime.raw.getUTCMilliseconds() - offset);\n      dateTime.adjustOffset(offset);\n\n      let possibilities = getPossibleMilliseconds(dateTime.epochMilliseconds, dateTime.timeZone);\n      if (possibilities.length > 1) {\n        let disambiguation = options.disambiguation ?? 'compatible';\n        switch (disambiguation) {\n          case 'compatible':\n          case 'earlier':\n            return Instant.fromEpochMilliseconds(possibilities[0]).toZonedDateTimeISO(dateTime.timeZone);\n          case 'later':\n            return Instant.fromEpochMilliseconds(possibilities[possibilities.length - 1]).toZonedDateTimeISO(\n              dateTime.timeZone,\n            );\n        }\n      }\n\n      return dateTime;\n    } else if (typeof dateComponents === 'string') {\n      let result = ISO8601Result.parseDateTime(dateComponents);\n      if (result && result.date && result.timeZone) {\n        if (result.offset === Zulu) {\n          let epochMilliseconds = Date.UTC(\n            result.date.year,\n            result.date.month - 1,\n            result.date.day,\n            result.time?.hour,\n            result.time?.minute,\n            result.time?.second,\n            result.time?.millisecond,\n          );\n          return Instant.fromEpochMilliseconds(epochMilliseconds).toZonedDateTimeISO(result.timeZone);\n        }\n\n        let entry = ZonedDateTime.from({\n          year: result.date.year,\n          month: result.date.month,\n          day: result.date.day,\n          hour: result.time ? result.time.hour : 0,\n          minute: result.time ? result.time.minute : 0,\n          second: result.time ? result.time.second : 0,\n          millisecond: result.time ? result.time.millisecond : 0,\n          timeZone: result.timeZone,\n        });\n\n        if (result.offset != null && typeof result.offset === 'number' && entry.offsetMilliseconds !== result.offset) {\n          let delta = entry.offsetMilliseconds - result.offset;\n          entry = entry.add({milliseconds: delta});\n          if (entry.offsetMilliseconds !== result.offset) {\n            throw new RangeError('Offset doesn’t match');\n          }\n        }\n\n        return entry;\n      }\n    }\n    throw new RangeError('Unsupported string');\n  }\n\n  /**\n   * Compares two ZonedDateTime objects\n   *\n   * Returns an integer indicating whether one comes before or after or is equal to two\n   */\n  static compare(one: ZonedDateTimeLike, two: ZonedDateTimeLike): number {\n    return Math.sign(toZonedDateTime(one).epochMilliseconds - toZonedDateTime(two).epochMilliseconds);\n  }\n}\n\nexport function toZonedDateTime(entry: ZonedDateTimeLike): ZonedDateTime {\n  return entry instanceof ZonedDateTime ? entry : ZonedDateTime.from(entry);\n}\n","import {type ZonedDateTime} from './zoned-date-time.js';\nimport Duration, {toDuration} from './duration.js';\nimport {PlainDate} from './plain-date.js';\nimport {normalizeDateAdd, toISOWeekOfYear} from './utilities.js';\nimport {PlainDateTime} from './plain-date-time.js';\nimport {DAY} from './units.js';\n\nexport function inLeapYear(year: number): boolean {\n  return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\nexport function daysInMonth(year: number, month: number) {\n  switch (month) {\n    case 2:\n      return inLeapYear(year) ? 29 : 28;\n    case 4:\n    case 6:\n    case 9:\n    case 11:\n      return 30;\n    default:\n      return 31;\n  }\n}\n\n// Gregorian calendar\nexport default class Calendar {\n  get id() {\n    return 'iso8601';\n  }\n\n  toString() {\n    return this.id;\n  }\n\n  toJSON() {\n    return this.id;\n  }\n\n  monthsInYear(_date: ZonedDateTime | PlainDate | PlainDateTime) {\n    return 12;\n  }\n\n  daysInWeek(_date: ZonedDateTime | PlainDate | PlainDateTime) {\n    return 7;\n  }\n\n  weekOfYear(date: ZonedDateTime | PlainDate | PlainDateTime) {\n    return toISOWeekOfYear(date).week;\n  }\n\n  yearOfWeek(date: ZonedDateTime | PlainDate | PlainDateTime) {\n    return toISOWeekOfYear(date).year;\n  }\n\n  daysInMonth(date: ZonedDateTime | PlainDate | PlainDateTime): number {\n    return daysInMonth(date.year, date.month);\n  }\n\n  inLeapYear(date: ZonedDateTime | PlainDate | PlainDateTime): boolean {\n    return inLeapYear(date.year);\n  }\n\n  daysInYear(date: ZonedDateTime | PlainDate | PlainDateTime): number {\n    return this.inLeapYear(date) ? 366 : 365;\n  }\n\n  dayOfWeek(date: ZonedDateTime | PlainDate | PlainDateTime): number {\n    let utcDate = new Date(Date.UTC(date.year, date.month - 1, date.day));\n    let dayOfWeek = utcDate.getUTCDay();\n    return dayOfWeek === 0 ? 7 : dayOfWeek;\n  }\n  /**\n   * Returns the ordinal day of the year that the\n   * date falls on. For the ISO 8601 calendar, this is a value between 1 and 365,\n   * or 366 in a leap year.\n   */\n  dayOfYear(date: ZonedDateTime | PlainDate | PlainDateTime) {\n    return (Date.UTC(date.year, date.month - 1, date.day) - Date.UTC(date.year, 0, 0)) / DAY;\n  }\n\n  dateUntil(\n    one: PlainDate,\n    two: PlainDate,\n    options?: {largestUnit: 'auto' | 'year' | 'month' | 'week' | 'day'},\n  ): Duration {\n    let sign = PlainDate.compare(two, one);\n    if (sign === 0) {\n      return new Duration();\n    }\n\n    let largestUnit = options?.largestUnit || 'auto';\n    if (largestUnit === 'auto') {\n      largestUnit = 'day';\n    }\n\n    if (largestUnit === 'day') {\n      let a = Date.UTC(one.year, one.month - 1, one.day);\n      let b = Date.UTC(two.year, two.month - 1, two.day);\n      return Duration.from({\n        days: (b - a) / DAY,\n      });\n    }\n\n    let yearDelta = two.year - one.year;\n    let monthDelta = two.month - one.month;\n    let monthSign = Math.sign(monthDelta);\n\n    let durationDeltaYear = yearDelta;\n    let durationDeltaMonth = monthDelta;\n\n    if (monthSign !== 0 && monthSign !== sign) {\n      durationDeltaYear -= sign;\n      durationDeltaMonth += 12 * sign;\n    }\n\n    let twoDayOfYear = this.dayOfYear(two);\n    let oneExtended = one.add({years: yearDelta}).add({\n      months: monthDelta,\n    });\n\n    let oneExtendedDayOfYear = this.dayOfYear(oneExtended);\n    let daySign = Math.sign(twoDayOfYear - oneExtendedDayOfYear);\n\n    if (daySign !== 0 && daySign !== sign) {\n      oneExtended = one.add({years: yearDelta}).add({\n        months: monthDelta - sign,\n      });\n\n      durationDeltaMonth -= sign;\n      if (durationDeltaMonth === -sign) {\n        durationDeltaMonth = 11 * sign;\n        durationDeltaYear -= sign;\n      }\n    }\n\n    let a = Date.UTC(oneExtended.year, oneExtended.month - 1, oneExtended.day);\n    let b = Date.UTC(two.year, two.month - 1, two.day);\n    let days = (b - a) / DAY;\n\n    if (largestUnit === 'month') {\n      return Duration.from({\n        months: durationDeltaMonth + durationDeltaYear * 12,\n        days,\n      });\n    }\n\n    return Duration.from({\n      years: durationDeltaYear,\n      months: durationDeltaMonth,\n      days,\n    });\n  }\n\n  dateAdd(date: PlainDate, durationLike: Duration | string, options?: {overflow?: 'reject' | 'constrain'}) {\n    let duration = toDuration(durationLike);\n\n    let raw: Date;\n    if (duration.years || duration.months) {\n      let {year, month, day} = normalizeDateAdd(date.year, date.month, date.day, duration, options?.overflow);\n      raw = new Date(Date.UTC(year, month - 1, day));\n    } else {\n      raw = new Date(Date.UTC(date.year, date.month - 1, date.day));\n    }\n\n    if (duration.days || duration.weeks) {\n      let days = duration.days + duration.weeks * 7;\n      raw.setUTCMilliseconds(raw.getMilliseconds() + DAY * days);\n    }\n\n    return new PlainDate(raw.getUTCFullYear(), raw.getUTCMonth() + 1, raw.getUTCDate());\n  }\n\n  static from(type: string) {\n    switch (type) {\n      case 'iso8601':\n        return isoCalendar;\n      default:\n        throw new RangeError('Unsupported calendar');\n    }\n  }\n}\n\nconst isoCalendar = new Calendar();\n","import Calendar from './calendar.js';\nimport {DurationLike, toDuration} from './duration.js';\nimport {ISO8601Result} from './parse.js';\nimport {PlainDateTime} from './plain-date-time.js';\nimport {PlainTimeLike, toPlainTime} from './plain-time.js';\nimport {RoundingMode} from './types.js';\nimport {maxTemporalUnit, parseUnit, verifyDateComponents} from './utilities.js';\nimport {ZonedDateTime, pad, padYear} from './zoned-date-time.js';\n\nexport type PlainDateLike =\n  | PlainDate\n  | (PlainDateComponents & {calendar?: string})\n  | string\n  | ZonedDateTime\n  | PlainDateTime;\n\ninterface PlainDateComponents {\n  year: number;\n  month: number;\n  day: number;\n}\n\ninterface PlainDateDeltaParameters {\n  /// The largest unit of time to round to in the resulting duration, defaults to 'auto'.\n  largestUnit?: 'auto' | 'year' | 'month' | 'week' | 'day';\n  /// The smallest unit of time to round to in the resulting duration, defaults to 'millisecond', which means no rounding.\n  smallestUnit?: 'year' | 'month' | 'day';\n  /// The granularity to round to, of the unit given by smallestUnit. Defaults to `1`.\n  roundingIncrement?: number;\n  /// Rounding method to use\n  roundingMode?: RoundingMode;\n}\n\nexport function toPlainDate(plainDateLike: PlainDateLike) {\n  return plainDateLike instanceof PlainDate ? plainDateLike : PlainDate.from(plainDateLike);\n}\n\nexport class PlainDate {\n  private calendar: Calendar;\n  readonly year: number;\n  readonly month: number;\n  readonly day: number;\n\n  constructor(isoYear: number, isoMonth: number, isoDay: number, calendar: string = 'iso8601') {\n    this.calendar = Calendar.from(calendar);\n    let {year, month, day} = verifyDateComponents(isoYear, isoMonth, isoDay, 'reject');\n    this.year = year;\n    this.month = month;\n    this.day = day;\n  }\n\n  getCalendar() {\n    return this.calendar;\n  }\n\n  get calendarId() {\n    return this.calendar.id;\n  }\n\n  get monthsInYear() {\n    return this.calendar.monthsInYear(this);\n  }\n\n  get inLeapYear() {\n    return this.calendar.inLeapYear(this);\n  }\n\n  get weekOfYear() {\n    return this.calendar.weekOfYear(this);\n  }\n\n  get yearOfWeek() {\n    return this.calendar.yearOfWeek(this);\n  }\n\n  get dayOfYear() {\n    return this.calendar.dayOfYear(this);\n  }\n\n  get daysInYear() {\n    return this.calendar.daysInYear(this);\n  }\n\n  get daysInMonth() {\n    return this.calendar.daysInMonth(this);\n  }\n\n  get daysInWeek() {\n    return this.calendar.daysInWeek(this);\n  }\n\n  /**\n   * The dayOfWeek read-only property gives the weekday number that the date falls\n   * on. For the ISO 8601 calendar, the weekday number is defined as in the ISO 8601\n   * standard: a value between 1 and 7, inclusive, with Monday being 1, and Sunday 7\n   */\n  get dayOfWeek(): number {\n    return this.calendar.dayOfWeek(this);\n  }\n\n  with(dateLike: Partial<PlainDateComponents>, options?: {overflow: 'reject' | 'constrain'}) {\n    let {year, month, day} = verifyDateComponents(\n      dateLike.year ?? this.year,\n      dateLike.month ?? this.month,\n      dateLike.day ?? this.day,\n      options?.overflow ?? 'constrain',\n    );\n\n    return new PlainDate(year, month, day);\n  }\n\n  add(durationLike: DurationLike, options?: {overflow: 'reject' | 'constrain'}) {\n    return this.calendar.dateAdd(this, toDuration(durationLike), options);\n  }\n\n  subtract(durationLike: DurationLike, options?: {overflow: 'reject' | 'constrain'}) {\n    return this.calendar.dateAdd(this, toDuration(durationLike).negated(), options);\n  }\n\n  until(other: PlainDateLike, options: PlainDateDeltaParameters) {\n    let smallestUnit = parseUnit(options.smallestUnit, 'day');\n    let largestUnit = parseUnit(options.largestUnit, 'auto');\n    let roundingIncrement = options.roundingIncrement ?? 1;\n    let roundingMode = options.roundingMode ?? 'trunc';\n    if (largestUnit === 'auto') {\n      largestUnit = maxTemporalUnit('day', smallestUnit);\n    }\n\n    let duration = this.calendar.dateUntil(this, toPlainDate(other), {\n      largestUnit: 'year',\n    });\n\n    return duration.round({\n      largestUnit,\n      smallestUnit,\n      roundingIncrement,\n      roundingMode,\n      relativeTo: this,\n    });\n  }\n\n  since(other: PlainDateLike, options: PlainDateDeltaParameters) {\n    return this.until(other, options).negated();\n  }\n\n  equals(other: PlainDateLike) {\n    let otherDate = toPlainDate(other);\n    return this.year === otherDate.year && this.month === otherDate.month && this.day === otherDate.day;\n  }\n\n  toJSON() {\n    return this.toString();\n  }\n\n  toString(options: {calendarName?: 'auto' | 'always' | 'never'} = {}) {\n    let calendarName = options.calendarName ?? 'auto';\n    let calendar =\n      calendarName === 'always' || (calendarName === 'auto' && this.calendarId !== 'iso8601')\n        ? `[u-ca=${this.calendarId}]`\n        : '';\n\n    return `${padYear(this.year)}-${pad(this.month)}-${pad(this.day)}${calendar}`;\n  }\n\n  toLocaleString(locales: string | string[], options: Intl.DateTimeFormatOptions = {}) {\n    let formatter = new Intl.DateTimeFormat(locales, {\n      ...options,\n      timeZone: 'UTC',\n    });\n    return formatter.format(Date.UTC(this.year, this.month - 1, this.day));\n  }\n\n  toPlainDateTime(timeLike: PlainTimeLike) {\n    let time = toPlainTime(timeLike);\n    return new PlainDateTime(this.year, this.month, this.day, time.hour, time.minute, time.second, time.millisecond);\n  }\n\n  valueOf() {\n    throw new Error('Built-in arithmetic operators isn’t supported on PlainDate');\n  }\n\n  static from(item: PlainDateLike, options: {overflow?: 'reject' | 'constrain'} = {}) {\n    if (item instanceof PlainDate || item instanceof ZonedDateTime || item instanceof PlainDateTime) {\n      return new PlainDate(item.year, item.month, item.day, item.calendarId);\n    } else if (item && typeof item === 'object' && !Array.isArray(item)) {\n      let {year, month, day} = verifyDateComponents(item.year, item.month, item.day, options.overflow ?? 'constrain');\n      return new PlainDate(year, month, day, item.calendar);\n    } else if (typeof item === 'string') {\n      let result = ISO8601Result.parseDateTime(item);\n      if (result && result.date) {\n        return new PlainDate(result.date.year, result.date.month, result.date.day);\n      }\n    }\n\n    throw new RangeError('Unknown type');\n  }\n\n  static compare(one: PlainDateLike, two: PlainDateLike) {\n    let oneDate = toPlainDate(one);\n    let twoDate = toPlainDate(two);\n    return (\n      [\n        Math.sign(oneDate.year - twoDate.year),\n        Math.sign(oneDate.month - twoDate.month),\n        Math.sign(oneDate.day - twoDate.day),\n      ].find(value => value !== 0) ?? 0\n    );\n  }\n}\n","import {PlainDate} from './plain-date.js';\nimport {PlainTime} from './plain-time.js';\nimport {RoundingMode} from './types.js';\nimport {\n  balanceTimeDuration,\n  defaultLargestUnit,\n  maxTemporalUnit,\n  durationToTimeDuration,\n  isCalendarUnit,\n  differenceZonedDateTimeWithRounding,\n  internalRoundTimeDuration,\n  differencePlainDateTimeWithRounding,\n  isDateUnit,\n  RelativeToLike,\n  parseRelativeTo,\n  RelativeTo,\n  parseUnit,\n} from './utilities.js';\nimport {ZonedDateTime, pad} from './zoned-date-time.js';\nimport {DAY} from './units.js';\n\nconst numbers = '\\\\d+(?:[\\\\.,]\\\\d+)?';\nconst datePattern = `(${numbers}Y)?(${numbers}M)?(${numbers}W)?(${numbers}D)?`;\nconst timePattern = `T(${numbers}H)?(${numbers}M)?(${numbers}S)?`;\nconst duration = new RegExp(`^(\\-|\\\\+)?P(?:${datePattern}(?:${timePattern})?)$`);\n\ninterface DeltaRoundParameters {\n  /// The largest unit of time to round to in the resulting duration, defaults to 'auto'.\n  largestUnit?: 'auto' | 'year' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond';\n  /// The smallest unit of time to round to in the resulting duration, defaults to 'millisecond', which means no rounding.\n  smallestUnit?: 'year' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond';\n  /// The granularity to round to, of the unit given by smallestUnit. Defaults to `1`.\n  roundingIncrement?: number;\n  /// Rounding method to use\n  roundingMode?: RoundingMode;\n  /// Relative to date\n  relativeTo?: RelativeToLike;\n}\n\ninterface DurationToStringParameters {\n  fractionalSecondDigits?: 'auto' | 1 | 2 | 3;\n  smallestUnit?: 'minute' | 'second' | 'millisecond';\n  roundingMode?: RoundingMode;\n}\n\ninterface DurationTotalParameters {\n  unit: 'year' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond';\n  relativeTo?: RelativeToLike;\n}\n\ninterface DurationCompareParameters {\n  relativeTo?: RelativeToLike;\n}\n\nexport interface DateComponents {\n  years: number;\n  months: number;\n  weeks: number;\n  days: number;\n  hours: number;\n  minutes: number;\n  seconds: number;\n  milliseconds: number;\n}\n\nexport type DurationLike = Duration | string | Partial<DateComponents>;\n\nfunction parse(string: string): Duration {\n  let match = string.match(duration);\n  if (match) {\n    let [signSymbol, years, months, weeks, days, hours, minutes, seconds] = match.slice(1);\n    let sign = signSymbol === '-' ? -1 : 1;\n    let yearsValue = years ? parseFloat(years.slice(0, -1)) * sign : 0;\n    let monthsValue = months ? parseFloat(months.slice(0, -1)) * sign : 0;\n    let weeksValue = weeks ? parseFloat(weeks.slice(0, -1)) * sign : 0;\n    let daysValue = days ? parseFloat(days.slice(0, -1)) * sign : 0;\n    let hoursValue = hours ? parseFloat(hours.slice(0, -1)) * sign : 0;\n    let minutesValue = minutes ? parseFloat(minutes.slice(0, -1)) * sign : 0;\n    let secondsValue = seconds ? parseFloat(seconds.slice(0, -1)) * sign : 0;\n    let raw = secondsValue * 1000;\n    let s = Math.floor(raw / 1000) % 60;\n    let ms = Math.floor(raw) % 1000;\n    return new Duration(yearsValue, monthsValue, weeksValue, daysValue, hoursValue, minutesValue, s, ms);\n  }\n  throw new RangeError('Invalid ISO8601 string');\n}\n\nexport function toDuration(durationLike: DurationLike): Duration {\n  return durationLike instanceof Duration ? durationLike : Duration.from(durationLike);\n}\n\nexport default class Duration {\n  readonly years: number;\n  readonly months: number;\n  readonly weeks: number;\n  readonly days: number;\n  readonly hours: number;\n  readonly minutes: number;\n  readonly seconds: number;\n  readonly milliseconds: number;\n\n  constructor(\n    years?: number,\n    months?: number,\n    weeks?: number,\n    days?: number,\n    hours?: number,\n    minutes?: number,\n    seconds?: number,\n    milliseconds?: number,\n  ) {\n    this.years = years ?? 0;\n    this.months = months ?? 0;\n    this.weeks = weeks ?? 0;\n    this.days = days ?? 0;\n    this.hours = hours ?? 0;\n    this.minutes = minutes ?? 0;\n    this.seconds = seconds ?? 0;\n    this.milliseconds = milliseconds ?? 0;\n\n    let expectedSign = this.sign;\n    for (let field of [\n      this.years,\n      this.months,\n      this.weeks,\n      this.days,\n      this.hours,\n      this.minutes,\n      this.seconds,\n      this.milliseconds,\n    ]) {\n      if (!Number.isInteger(field)) {\n        throw new RangeError('Invalid input');\n      }\n      if (field !== 0) {\n        if (Math.sign(field) !== expectedSign) {\n          throw new RangeError('mixed-sign values not allowed as duration fields');\n        }\n      }\n    }\n  }\n\n  /// The read-only sign property has the value –1, 0, or 1, depending on whether the duration is negative, zero, or positive\n  get sign() {\n    for (let field of [\n      this.years,\n      this.months,\n      this.weeks,\n      this.days,\n      this.hours,\n      this.minutes,\n      this.seconds,\n      this.milliseconds,\n    ]) {\n      let sign = Math.sign(field);\n      if (sign !== 0) {\n        return sign;\n      }\n    }\n    return 0;\n  }\n\n  /// The read-only blank property is a convenience property that tells whether duration represents a zero length of time.\n  get blank() {\n    return this.sign === 0;\n  }\n\n  /// Returns a new duration with the opposite sign\n  negated() {\n    return new Duration(\n      this.years * -1,\n      this.months * -1,\n      this.weeks * -1,\n      this.days * -1,\n      this.hours * -1,\n      this.minutes * -1,\n      this.seconds * -1,\n      this.milliseconds * -1,\n    );\n  }\n\n  /// Returns a duration that is always positive\n  abs() {\n    return new Duration(\n      Math.abs(this.years),\n      Math.abs(this.months),\n      Math.abs(this.weeks),\n      Math.abs(this.days),\n      Math.abs(this.hours),\n      Math.abs(this.minutes),\n      Math.abs(this.seconds),\n      Math.abs(this.milliseconds),\n    );\n  }\n\n  add(durationLike: DurationLike) {\n    let other = toDuration(durationLike);\n    let thisDefaultLargestUnit = defaultLargestUnit(this);\n    let otherDefaultLargestUnit = defaultLargestUnit(other);\n    let largestUnit = maxTemporalUnit(thisDefaultLargestUnit, otherDefaultLargestUnit);\n    if (isCalendarUnit(largestUnit)) {\n      throw new RangeError('Largest unit can’t be a calendar unit');\n    }\n\n    let timeDuration = durationToTimeDuration(this) + durationToTimeDuration(other);\n    let total = timeDuration + (this.days + other.days) * DAY;\n    return Duration.from(balanceTimeDuration(total, largestUnit));\n  }\n\n  with(durationLike: Partial<DateComponents>) {\n    return new Duration(\n      durationLike.years ?? this.years,\n      durationLike.months ?? this.months,\n      durationLike.weeks ?? this.weeks,\n      durationLike.days ?? this.days,\n      durationLike.hours ?? this.hours,\n      durationLike.minutes ?? this.minutes,\n      durationLike.seconds ?? this.seconds,\n      durationLike.milliseconds ?? this.milliseconds,\n    );\n  }\n\n  round(roundTo: Exclude<DeltaRoundParameters['smallestUnit'], undefined> | DeltaRoundParameters) {\n    let smallestUnit: DeltaRoundParameters['smallestUnit'];\n    let largestUnit: DeltaRoundParameters['largestUnit'] = undefined;\n    let roundingMode: RoundingMode;\n    let increment: number = 1;\n    let relativeTo: RelativeTo | undefined = undefined;\n\n    if (typeof roundTo === 'string') {\n      smallestUnit = parseUnit(roundTo);\n      roundingMode = 'halfExpand';\n    } else {\n      smallestUnit = parseUnit(roundTo.smallestUnit, 'millisecond');\n      largestUnit = parseUnit(roundTo.largestUnit);\n      roundingMode = roundTo.roundingMode ?? 'halfExpand';\n      increment = roundTo.roundingIncrement ?? 1;\n      relativeTo = roundTo.relativeTo ? parseRelativeTo(roundTo.relativeTo) : undefined;\n    }\n\n    let existingLargestUnit = defaultLargestUnit(this);\n    let defaultLargest = maxTemporalUnit(existingLargestUnit, smallestUnit);\n\n    if (!largestUnit || largestUnit === 'auto') {\n      largestUnit = defaultLargest;\n    }\n\n    // Step: 26.\n\n    let hoursToDaysConversionMayOccur =\n      (this.days !== 0 && relativeTo instanceof ZonedDateTime) || Math.abs(this.hours) >= 24;\n    let roundingGranularityIsNoop = smallestUnit === 'millisecond' && increment === 1;\n    let calendarUnitsPresent = this.years !== 0 || this.months !== 0 || this.weeks !== 0;\n\n    if (\n      roundingGranularityIsNoop &&\n      largestUnit === existingLargestUnit &&\n      !calendarUnitsPresent &&\n      !hoursToDaysConversionMayOccur &&\n      Math.abs(this.minutes) < 60 &&\n      Math.abs(this.seconds) < 60 &&\n      Math.abs(this.milliseconds) < 1000\n    ) {\n      return this.with({});\n    }\n\n    let plainDateTimeOrRelativeToWillBeUsed =\n      !roundingGranularityIsNoop || calendarUnitsPresent || this.days !== 0 || isDateUnit(largestUnit);\n\n    if (relativeTo instanceof ZonedDateTime && plainDateTimeOrRelativeToWillBeUsed) {\n      relativeTo = relativeTo.toPlainDate();\n    }\n\n    // Step: 38\n    if (relativeTo instanceof ZonedDateTime) {\n      let end = relativeTo.add(this);\n      let record = differenceZonedDateTimeWithRounding(\n        relativeTo,\n        end,\n        largestUnit,\n        smallestUnit,\n        increment,\n        roundingMode,\n      );\n      return record.duration;\n    } else if (relativeTo instanceof PlainDate) {\n      let start = relativeTo.toPlainDateTime(new PlainTime());\n      let end = start.add(this);\n\n      let record = differencePlainDateTimeWithRounding(start, end, smallestUnit, largestUnit, increment, roundingMode);\n      return record.duration;\n    } else if (isCalendarUnit(smallestUnit) === false) {\n      let timeDuration = durationToTimeDuration(this);\n      let roundResult = internalRoundTimeDuration(this.days, timeDuration, increment, roundingMode, smallestUnit);\n      let normWithDays = roundResult.timeDuration + roundResult.days * DAY;\n      let balanceResult = balanceTimeDuration(normWithDays, largestUnit);\n      return Duration.from(balanceResult);\n    } else {\n      throw new RangeError('Invalid input data');\n    }\n  }\n\n  subtract(durationLike: DurationLike) {\n    return this.add(toDuration(durationLike).negated());\n  }\n\n  toString(options: DurationToStringParameters = {}) {\n    let instance: Duration = this;\n    let smallestUnit = parseUnit(options.smallestUnit);\n    if (smallestUnit) {\n      instance = this.round({\n        smallestUnit,\n        roundingMode: options.roundingMode ?? 'trunc',\n      });\n    }\n\n    let fractionalSecondDigits = options.fractionalSecondDigits === 'auto' ? 3 : options.fractionalSecondDigits ?? 3;\n    let values = ['P'];\n\n    if (this.sign === -1) {\n      values.unshift('-');\n      instance = this.abs();\n    } else if (this.sign === 0) {\n      return 'PT0S';\n    } else {\n      instance = this;\n    }\n\n    if (instance.years) {\n      values.push(`${instance.years}Y`);\n    }\n\n    if (instance.months) {\n      values.push(`${instance.months}M`);\n    }\n\n    if (instance.weeks) {\n      values.push(`${instance.weeks}W`);\n    }\n\n    if (instance.days) {\n      values.push(`${instance.days}D`);\n    }\n    if (instance.hours || instance.minutes || instance.seconds || instance.milliseconds) {\n      values.push('T');\n      if (instance.hours) {\n        values.push(`${instance.hours}H`);\n      }\n      if (instance.minutes) {\n        values.push(`${instance.minutes}M`);\n      }\n      if (instance.seconds || instance.milliseconds) {\n        if (instance.milliseconds) {\n          values.push(`${instance.seconds}.${pad(instance.milliseconds, fractionalSecondDigits)}S`);\n        } else {\n          values.push(`${instance.seconds}S`);\n        }\n      }\n    }\n    return values.join('');\n  }\n\n  toJSON() {\n    return this.toString();\n  }\n\n  total(totalOf: DurationTotalParameters['unit'] | DurationTotalParameters) {\n    let unit: DurationTotalParameters['unit'];\n    let relativeTo: ZonedDateTime | PlainDate | undefined;\n\n    if (typeof totalOf === 'string') {\n      unit = parseUnit(totalOf);\n    } else {\n      unit = parseUnit(totalOf.unit);\n      relativeTo = totalOf.relativeTo ? parseRelativeTo(totalOf.relativeTo) : undefined;\n    }\n\n    // Step: 13 & 14\n    if (relativeTo instanceof ZonedDateTime) {\n      if (isCalendarUnit(unit) || unit === 'day' || this.days || this.years || this.months || this.weeks) {\n        relativeTo = relativeTo.toPlainDate();\n      }\n    }\n\n    let timeDuration = durationToTimeDuration(this);\n\n    // Step 18\n    if (relativeTo instanceof ZonedDateTime) {\n      let target = relativeTo.add(this);\n      let result = differenceZonedDateTimeWithRounding(relativeTo, target, unit, unit, 1, 'trunc');\n      return result.total;\n    } else if (relativeTo instanceof PlainDate) {\n      let target = relativeTo.toPlainDateTime(new PlainTime()).add(this);\n      let roundRecord = differencePlainDateTimeWithRounding(\n        relativeTo.toPlainDateTime(new PlainTime()),\n        target,\n        unit,\n        unit,\n        1,\n        'trunc',\n      );\n      return roundRecord.total;\n    } else if (isCalendarUnit(unit) === false) {\n      let normWithDays = timeDuration + this.days * DAY;\n      let duration = internalRoundTimeDuration(0, normWithDays, 1, 'trunc', unit);\n      return duration.total;\n    } else {\n      throw new RangeError('RelativeTo required when using calendar units');\n    }\n  }\n\n  valueOf() {\n    throw new Error('Built-in arithmetic operators isn’t supported on Duration');\n  }\n\n  static compare(oneLike: DurationLike, twoLike: DurationLike, options?: DurationCompareParameters) {\n    let one = toDuration(oneLike);\n    let two = toDuration(twoLike);\n\n    let relativeTo = options?.relativeTo;\n    return Math.sign(one.total({relativeTo, unit: 'millisecond'}) - two.total({relativeTo, unit: 'millisecond'}));\n  }\n\n  static from(other: DurationLike) {\n    if (typeof other === 'string') {\n      return parse(other);\n    }\n\n    return new Duration(\n      other.years,\n      other.months,\n      other.weeks,\n      other.days,\n      other.hours,\n      other.minutes,\n      other.seconds,\n      other.milliseconds,\n    );\n  }\n}\n","import {Instant} from './instant.js';\nimport {PlainDateTime} from './plain-date-time.js';\nimport {PlainDate} from './plain-date.js';\nimport {PlainTime} from './plain-time.js';\nimport type {TimeZone} from './time-zone.js';\nimport {ZonedDateTime} from './zoned-date-time.js';\n\nlet timeZone: string | null;\n\nexport const Now = {\n  instant() {\n    return new Instant(Date.now());\n  },\n\n  timeZoneId() {\n    if (timeZone) {\n      return timeZone;\n    }\n    let dateTimeFormatter = new Intl.DateTimeFormat();\n    let {timeZone: timeZoneResolved} = dateTimeFormatter.resolvedOptions();\n    timeZone = timeZoneResolved;\n    return timeZoneResolved;\n  },\n\n  zonedDateTimeISO(timeZoneLike?: string | TimeZone) {\n    return new ZonedDateTime(Date.now(), timeZoneLike ?? Now.timeZoneId());\n  },\n\n  plainDateISO() {\n    let now = new Date();\n    return new PlainDate(now.getFullYear(), now.getMonth() + 1, now.getDate());\n  },\n\n  plainDateTimeISO() {\n    let now = new Date();\n    return new PlainDateTime(\n      now.getFullYear(),\n      now.getMonth() + 1,\n      now.getDate(),\n      now.getHours(),\n      now.getMinutes(),\n      now.getSeconds(),\n      now.getMilliseconds(),\n    );\n  },\n\n  plainTimeISO() {\n    let now = new Date();\n    return new PlainTime(now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());\n  },\n};\n\nObject.defineProperty(Now, Symbol.toStringTag, {\n  value: 'Temporal.Now',\n  writable: false,\n  enumerable: false,\n  configurable: true,\n});\n"],"names":["SECOND","MINUTE","HOUR","DAY","PER_UNIT","day","hour","minute","second","millisecond","Instant","constructor","epochMilisecond","__publicField","this","raw","epochMilliseconds","add","durationLike","duration","toDuration","days","months","weeks","years","RangeError","fromEpochMilliseconds","total","subtract","negated","until","other","options","smallestUnit","parseUnit","largestUnit","maxTemporalUnit","record","differenceInstantWithRounding","toInstant","roundingIncrement","roundingMode","Duration","from","balanceTimeDuration","timeDuration","since","toZonedDateTimeISO","timeZone","ZonedDateTime","equals","toJSON","toString","Date","toISOString","toLocaleString","Error","valueOf","round","remainder","wholeDays","roundedRemainder","roundToIncrement","instantLike","parse","compare","one","two","Math","sign","offset","timeZones","Map","DateTimeFormatTimeZone","id","dateFormat","Intl","DateTimeFormat","timeZoneName","getOffsetMillisecondsFor","milliseconds","timeZonePart","formatToParts","find","part","type","result","value","match","multiplier","parseInt","name","get","set","dateTime","RegExp","source","Zulu","Symbol","ISO8601Result","date","time","parseOffsetGroups","minuteValue","parseTimeGroups","hourValue","secondValue","millisecondValue","slice","times","pow","length","parseDateTime","dateString","exec","groups","year","month","verifyTimeComponents","offsetSign","offsetHour","offsetMinute","timeZoneDesignator","toPlainDateTime","plainDateTimeLike","PlainDateTime","isoYear","isoMonth","isoDay","isoHour","isoMinute","isoSecond","isoMillisecond","calendar","verifyDateComponents","UTC","Calendar","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","getUTCDate","getUTCMonth","getUTCFullYear","getCalendar","calendarId","monthsInYear","inLeapYear","weekOfYear","yearOfWeek","dayOfYear","daysInYear","daysInMonth","daysInWeek","dayOfWeek","toTimeDuration","startOfDay","balanced","floor","mod","deltaDays","balanceTime","hours","minutes","seconds","plainDate","toPlainDate","dateAdd","PlainTime","PlainDate","toPlainTime","toZonedDateTime","calendarName","fractionalSecondDigits","dateComponents","overflow","withPlainTime","plainTimeLike","plainTime","with","withPlainDate","plainDateLike","withCalendar","otherLike","isCalendarUnit","differencePlainDateTimeWithRounding","item","Array","isArray","locales","resolvedOptions","format","pad","selfDuration","durationToTimeDuration","timeComponents","components","deltaTimeComponents","internalRoundTimeDuration","otherTime","rawHour","rawMinute","rawSecond","rawMillisecond","number","minLength","padStart","padYear","abs","epochMillisecond","timeZoneLike","getTime","offsetMilliseconds","epochSeconds","trunc","timeZoneId","hoursInDay","initial","getTimeZone","copy","normalizeDateAdd","originalOffset","setUTCMilliseconds","getMilliseconds","adjustOffset","zonedDateTimeLike","isDateUnit","differenceZonedDateTimeWithRounding","setUTCFullYear","setUTCHours","withTimeZone","originalOffsetMilliseconds","delta","now","possibilities","current","earlierOffset","laterOffset","currentOffset","candiateOffset","candiate","candiateRealOffset","getPossibleMilliseconds","disambiguation","entry","TemporalUnits","defaultLargestUnit","n","d","applyUnsignedRoundingMode","r1","r2","unsignedRoundingMode","d1","d2","cardinality","getUnsignedRoundingMode","isNegative","quantity","increment","mode","quotient","toISOWeekOfYear","zonedDate","week","legacyDayOfWeek","getUTCDay","dayOfJan1st","balanceISOYearMonth","outsideOfRange","min","max","to","differenceRecord","difference","onePlainDate","twoPlainDate","timeComponentsSign","dateDelta","dateUntil","zonedDateUntil","timeRecord","roundRelativeDuration","adjustedDate","twoDate","timeSign","dateSign","differenceDateTime","timeDurationWithDays","timeResult","toUTC","destination","relativeTo","irregularLengthUnit","nudge","unit","weeksStart","startEpoch","endEpoch","start","end","roundedUnit","nudgedEpoch","didExpandDays","nudgeToCalendarUnit","dayDelta","daySpan","unitLength","roundedTime","beyondDaySpan","nudgeToZonedTime","roundedTimeDuration","diff","roundedFractionalDays","roundedWholeDays","nudgeToDayOrTime","durationRecord","startUnit","largestUnitIndex","unitIndex","endDuration","beyondEnd","bubbleRelativeDuration","balanceResult","incrementUnit","fractionalDays","parseRelativeTo","error","input","defaultValue","_date","a","b","yearDelta","monthDelta","monthSign","durationDeltaYear","durationDeltaMonth","twoDayOfYear","oneExtended","oneExtendedDayOfYear","daySign","isoCalendar","dateLike","otherDate","timeLike","oneDate","numbers","expectedSign","field","Number","isInteger","blank","roundTo","existingLargestUnit","defaultLargest","hoursToDaysConversionMayOccur","roundingGranularityIsNoop","calendarUnitsPresent","plainDateTimeOrRelativeToWillBeUsed","roundResult","instance","values","unshift","push","join","totalOf","target","oneLike","twoLike","string","signSymbol","yearsValue","parseFloat","monthsValue","weeksValue","daysValue","hoursValue","minutesValue","s","ms","Now","instant","dateTimeFormatter","timeZoneResolved","zonedDateTimeISO","plainDateISO","getFullYear","getMonth","getDate","plainDateTimeISO","getHours","getMinutes","getSeconds","plainTimeISO","Object","defineProperty","toStringTag","writable","enumerable","configurable"],"mappings":"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"}