{"version":3,"file":"mn-angular-lib-calendar-core.mjs","sources":["../../../projects/mn-angular-lib/calendar-core/src/mn-calendar/models/calendar-config.model.ts","../../../projects/mn-angular-lib/calendar-core/src/mn-calendar/services/calendar-date-formatter.ts","../../../projects/mn-angular-lib/calendar-core/src/mn-calendar/services/default-calendar-date-formatter.ts","../../../projects/mn-angular-lib/calendar-core/src/mn-calendar/services/calendar-event-layout.service.ts","../../../projects/mn-angular-lib/calendar-core/src/mn-calendar/utils/calendar-utils.ts","../../../projects/mn-angular-lib/calendar-core/mn-angular-lib-calendar-core.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\nimport {CalendarEvent} from './calendar-event.model';\nimport {provideMnComponentConfig} from 'mn-angular-lib/core';\n\n/**\n * Available calendar view modes.\n */\nexport enum CalendarView {\n  MONTH = 'MONTH',\n  WEEK = 'WEEK',\n  DAY = 'DAY'\n}\n\n/**\n * Configuration for the calendar component.\n * All properties are optional â€” sensible defaults are provided.\n * Can be supplied via the `CALENDAR_CONFIG` injection token or through\n * the `provideMnComponentConfig` helper using component name `'mn-calendar'`.\n */\nexport type CalendarConfig = {\n  /** First visible hour in week/day views (0â€“23). Default: `7`. */\n  startHour: number;\n  /** Last visible hour in week/day views (1â€“24, exclusive). Default: `22`. */\n  endHour: number;\n  /** BCP 47 locale tag used for date/time formatting (e.g. `'en-US'`, `'nl-NL'`). Default: `'en-US'`. */\n  locale: string;\n  /** Label for the \"Today\" navigation button. Default: `'Today'`. */\n  todayLabel: string;\n  /** Placeholder for the toolbar's date picker. Default: `'Pick a date'`. */\n  pickDateLabel: string;\n  /** Accessible name for the toolbar's back arrow. Default: `'Previous'`. */\n  previousLabel: string;\n  /** Accessible name for the toolbar's forward arrow. Default: `'Next'`. */\n  nextLabel: string;\n  /** Title shown above the upcoming-events sidebar. Default: `'Upcoming events'`. */\n  upcomingEventsTitle: string;\n  /** Message shown when there are no upcoming events. Default: `'No upcoming events'`. */\n  noUpcomingEvents: string;\n  /** Word after the \"+N\" overflow count in a month cell — \"+3 more\". Default: `'more'`. */\n  moreEventsLabel: string;\n  /** Display labels for each calendar view mode. */\n  viewLabels: Record<string, string>;\n  /** Abbreviated day names starting from Monday (length 7). Derived from `locale` when not set. */\n  shortDayNames: string[];\n  /** Full day names starting from Monday (length 7). Derived from `locale` when not set. */\n  longDayNames: string[];\n  /** Screen-width breakpoint (px) below which only day view is shown. Default: `768`. */\n  mobileBreakpoint: number;\n}\n\n/**\n * Builds locale-derived day name arrays from a BCP 47 locale string.\n * Uses January 1 2024 (a Monday) as the reference date.\n */\nfunction buildDayNames(locale: string): { short: string[]; long: string[] } {\n  const base = new Date(2024, 0, 1); // 2024-01-01 is a Monday\n  const short: string[] = [];\n  const long: string[] = [];\n  for (let i = 0; i < 7; i++) {\n    const d = new Date(base);\n    d.setDate(base.getDate() + i);\n    short.push(d.toLocaleDateString(locale, { weekday: 'short' }));\n    long.push(d.toLocaleDateString(locale, { weekday: 'long' }));\n  }\n  return { short, long };\n}\n\n/** Default calendar configuration values. */\nexport const DEFAULT_CALENDAR_CONFIG: CalendarConfig = (() => {\n  const locale = 'en-US';\n  const names = buildDayNames(locale);\n  return {\n    startHour: 7,\n    endHour: 22,\n    locale,\n    todayLabel: 'Today',\n    pickDateLabel: 'Pick a date',\n    previousLabel: 'Previous',\n    nextLabel: 'Next',\n    upcomingEventsTitle: 'Upcoming events',\n    noUpcomingEvents: 'No upcoming events',\n    moreEventsLabel: 'more',\n    viewLabels: { MONTH: 'Month', WEEK: 'Week', DAY: 'Day' },\n    shortDayNames: names.short,\n    longDayNames: names.long,\n    mobileBreakpoint: 768,\n  };\n})();\n\n/**\n * Injection token for the resolved calendar configuration.\n *\n * Prefer using {@link MN_CALENDAR_CONFIG} with `provideMnComponentConfig`\n * so that settings can be managed via `mn-config.json5`. This token is\n * kept for backward compatibility and manual `providers` usage.\n *\n * @example\n * ```ts\n * providers: [\n *   { provide: CALENDAR_CONFIG, useValue: { startHour: 8, endHour: 20, locale: 'nl-NL' } }\n * ]\n * ```\n */\nexport const CALENDAR_CONFIG = new InjectionToken<CalendarConfig>('CalendarConfig', {\n  providedIn: 'root',\n  factory: () => DEFAULT_CALENDAR_CONFIG\n});\n\n/**\n * Injection token resolved via `MnConfigService` (the `mn-config.json5` system).\n *\n * Use the helper {@link provideMnCalendarConfig} in the component's `providers`\n * array so that calendar settings are read from the config file and support\n * `$translate` markers, section scoping, and instance-id overrides.\n *\n * Component name in the config file: `'mn-calendar'`.\n *\n * @example\n * ```json5\n * // mn-config.json5\n * {\n *   defaults: {\n *     \"mn-calendar\": {\n *       startHour: 8,\n *       endHour: 20,\n *       locale: \"nl-NL\",\n *       todayLabel: { $translate: \"calendar.today\" }\n *     }\n *   }\n * }\n * ```\n */\nexport const MN_CALENDAR_CONFIG = new InjectionToken<CalendarConfig>('MN_CALENDAR_CONFIG');\n\n/** Component name used to look up calendar settings in `mn-config.json5`. */\nexport const MN_CALENDAR_COMPONENT_NAME = 'mn-calendar';\n\n/**\n * Provider helper that wires the calendar into the `mn-config` system.\n *\n * Add this to the `providers` array of the component (or module) that hosts\n * `<mn-calendar-view>`. It reads defaults and overrides from `mn-config.json5`\n * under the key `\"mn-calendar\"` and provides them via {@link MN_CALENDAR_CONFIG}.\n *\n * @param initial â€” optional partial defaults merged before config-file values.\n */\nexport function provideMnCalendarConfig(initial?: Partial<CalendarConfig>) {\n  return provideMnComponentConfig<CalendarConfig>(MN_CALENDAR_CONFIG, MN_CALENDAR_COMPONENT_NAME, initial);\n}\n\n/**\n * Merges a partial config with defaults, re-deriving day names from locale when needed.\n */\nexport function resolveCalendarConfig(partial?: Partial<CalendarConfig>): CalendarConfig {\n  if (!partial) return { ...DEFAULT_CALENDAR_CONFIG };\n  const locale = partial.locale ?? DEFAULT_CALENDAR_CONFIG.locale;\n  const names = buildDayNames(locale);\n  return {\n    ...DEFAULT_CALENDAR_CONFIG,\n    ...partial,\n    locale,\n    shortDayNames: partial.shortDayNames ?? names.short,\n    longDayNames: partial.longDayNames ?? names.long,\n  };\n}\n\n/**\n * Represents a half-hour row in the week/day time grid.\n */\nexport type HourRow = {\n  /** The hour value (e.g. 7, 8, â€¦). */\n  hour: number;\n  /** CSS grid row start (1-based). */\n  topRow: number;\n  /** CSS grid row end (1-based, exclusive). */\n  bottomRow: number;\n}\n\n/**\n * Represents a single day column in the week view header.\n */\nexport type ColumnDay = {\n  /** The date this column represents. */\n  date: Date;\n  /** Abbreviated day name (e.g. \"Mon\"). */\n  dayName: string;\n  /** Day-of-month number (1â€“31). */\n  dayNumber: number;\n  /** Whether this column is today. */\n  isToday: boolean;\n}\n\n/**\n * Represents a single cell in the month grid.\n */\nexport type MonthItem = {\n  /** The date this cell represents. */\n  date: Date;\n  /** Day-of-month number (1â€“31). */\n  dayNumber: number;\n  /** Whether this date belongs to the currently focused month. */\n  isCurrentMonth: boolean;\n  /** Whether this date is today. */\n  isToday: boolean;\n  /** Events occurring on this date. */\n  events: CalendarEvent[];\n}\n","import { InjectionToken } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n/**\n * Abstraction for date/time formatting used by calendar components.\n *\n * The library ships a default implementation ({@link DefaultCalendarDateFormatter})\n * that uses `Intl.DateTimeFormat`. Consumers can provide their own implementation\n * (e.g. wrapping `@ngx-translate`) via the {@link CALENDAR_DATE_FORMATTER} token.\n *\n * Locale-independent settings (day names, view labels, \"Today\" label) have been\n * moved to {@link CalendarConfig} so they can be configured declaratively.\n */\nexport type CalendarDateFormatter = {\n  /** Formats an hour + minute pair (e.g. `9, 0` → `\"09:00 AM\"`). */\n  formatTimeI(hour: number, minute: number): Promise<string>;\n  /** Formats the time portion of a Date. Returns `''` for `undefined`. */\n  formatTime(date: Date | undefined): Promise<string>;\n  /** Formats a full date-time string as an Observable. */\n  formatDateTime(date: Date): Observable<string>;\n  /** Formats a date-only string as an Observable. */\n  formatDate(date: Date): Observable<string>;\n  /** Formats a Date as `YYYY-MM-DD` for `<input type=\"date\">`. */\n  formatDateForFormControl(date: Date): string;\n  /** Returns `true` when both dates fall on the same calendar day. */\n  isSameDay(date1: Date, date2: Date): boolean;\n  /** Formats a Date as \"Month Year\" (e.g. \"January 2026\"). */\n  formatMonthName(date: Date): Promise<string>;\n}\n\n/**\n * Injection token for the calendar date formatter.\n *\n * @example\n * ```ts\n * providers: [\n *   { provide: CALENDAR_DATE_FORMATTER, useClass: MyCustomFormatter }\n * ]\n * ```\n */\nexport const CALENDAR_DATE_FORMATTER = new InjectionToken<CalendarDateFormatter>('CalendarDateFormatter');\n","import {Injectable, inject} from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { CalendarDateFormatter } from './calendar-date-formatter';\nimport { CALENDAR_CONFIG, CalendarConfig, DEFAULT_CALENDAR_CONFIG } from '../models/calendar-config.model';\n\n/**\n * Default implementation of {@link CalendarDateFormatter} that uses the\n * browser's `Intl.DateTimeFormat` API for locale-aware formatting.\n *\n * The locale is read from the injected {@link CALENDAR_CONFIG}. If no config\n * is provided, `'en-US'` is used as the fallback.\n *\n * This service has no dependency on `@ngx-translate` or any other i18n library,\n * so the calendar library works out of the box. Consumers can replace it with\n * their own implementation via the `CALENDAR_DATE_FORMATTER` injection token.\n */\n@Injectable()\nexport class DefaultCalendarDateFormatter implements CalendarDateFormatter {\n  private readonly locale: string;\n\n  constructor() {\n    const config = inject<CalendarConfig | null>(CALENDAR_CONFIG, {optional: true});\n\n    this.locale = config?.locale ?? DEFAULT_CALENDAR_CONFIG.locale;\n  }\n\n  /** Formats an hour and minute pair into a locale time string (e.g. \"09:00 AM\"). */\n  formatTimeI(hour: number, minute: number): Promise<string> {\n    const date = new Date();\n    date.setHours(hour, minute, 0, 0);\n    return Promise.resolve(\n      date.toLocaleTimeString(this.locale, { hour: '2-digit', minute: '2-digit' })\n    );\n  }\n\n  /** Formats the time portion of a Date (e.g. \"2:30 PM\"). Returns empty string for undefined. */\n  formatTime(date: Date | undefined): Promise<string> {\n    if (!date) return Promise.resolve('');\n    return Promise.resolve(\n      date.toLocaleTimeString(this.locale, { hour: '2-digit', minute: '2-digit' })\n    );\n  }\n\n  /** Formats a Date as a full date-time string (e.g. \"May 15, 2026, 02:30 PM\"). */\n  formatDateTime(date: Date): Observable<string> {\n    return of(\n      date.toLocaleString(this.locale, {\n        year: 'numeric', month: 'short', day: 'numeric',\n        hour: '2-digit', minute: '2-digit'\n      })\n    );\n  }\n\n  /** Formats a Date as a date-only string (e.g. \"May 15, 2026\"). */\n  formatDate(date: Date): Observable<string> {\n    return of(\n      date.toLocaleDateString(this.locale, {\n        year: 'numeric', month: 'short', day: 'numeric'\n      })\n    );\n  }\n\n  /** Formats a Date as `YYYY-MM-DD` for use in `<input type=\"date\">` controls. */\n  formatDateForFormControl(date: Date): string {\n    const y = date.getFullYear();\n    const m = String(date.getMonth() + 1).padStart(2, '0');\n    const d = String(date.getDate()).padStart(2, '0');\n    return `${y}-${m}-${d}`;\n  }\n\n  /** Returns `true` if both dates fall on the same calendar day. */\n  isSameDay(date1: Date, date2: Date): boolean {\n    return date1.getFullYear() === date2.getFullYear()\n      && date1.getMonth() === date2.getMonth()\n      && date1.getDate() === date2.getDate();\n  }\n\n  /** Formats a Date as \"Month Year\" (e.g. \"January 2026\"). */\n  formatMonthName(date: Date): Promise<string> {\n    return Promise.resolve(\n      date.toLocaleString(this.locale, { month: 'long', year: 'numeric' })\n    );\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { CalendarEvent } from '../models/calendar-event.model';\n\n/**\n * Service that computes the visual layout of calendar events within a\n * time-grid (week or day view).\n *\n * Responsibilities:\n * - Splitting multi-day events into per-day segments.\n * - Assigning non-overlapping column indices to concurrent events.\n * - Computing the width (column span) each event should occupy.\n *\n * This service is stateless — all state is passed via method parameters.\n * Provide it per-component (not root) so each view gets its own instance.\n */\n@Injectable()\nexport class CalendarEventLayoutService {\n\n  /**\n   * Returns `true` when two time ranges overlap (exclusive boundaries).\n   */\n  eventsOverlap(startA: Date, endA: Date, startB: Date, endB: Date): boolean {\n    return startA < endB && startB < endA;\n  }\n\n  /**\n   * Returns all events whose time range overlaps the given `[start, end)` window.\n   */\n  getAllEventsOnSpecificTime(events: CalendarEvent[], start: Date, end: Date): CalendarEvent[] {\n    return events.filter(e =>\n      this.eventsOverlap(e.startTime, e.endTime, start, end)\n    );\n  }\n\n  /**\n   * Splits multi-day events into per-day segments that fit within the\n   * visible hour range (`startHour`–`endHour`) and date range.\n   *\n   * Single-day events are shallow-copied as-is. Multi-day events produce\n   * one segment per day with `continued` / `continuedEnd` flags set.\n   */\n  calculateMultiDayEvents(\n    events: CalendarEvent[],\n    startHour: number,\n    endHour: number,\n    rangeStart: Date,\n    rangeEnd: Date\n  ): CalendarEvent[] {\n    const result: CalendarEvent[] = [];\n\n    for (const event of events) {\n      const eventStart = new Date(event.startTime);\n      const eventEnd = new Date(event.endTime);\n\n      if (eventStart.toDateString() === eventEnd.toDateString()) {\n        result.push({ ...event });\n        continue;\n      }\n\n      const current = new Date(eventStart);\n      let isFirst = true;\n\n      while (current < eventEnd && current < rangeEnd) {\n        if (current >= rangeStart) {\n          const dayStart = new Date(current);\n          const dayEnd = new Date(current);\n\n          if (isFirst) {\n            dayEnd.setHours(endHour, 0, 0, 0);\n          } else {\n            dayStart.setHours(startHour, 0, 0, 0);\n            if (current.toDateString() === eventEnd.toDateString()) {\n              dayEnd.setHours(eventEnd.getHours(), eventEnd.getMinutes(), 0, 0);\n            } else {\n              dayEnd.setHours(endHour, 0, 0, 0);\n            }\n          }\n\n          result.push({\n            ...event,\n            startTime: isFirst ? eventStart : dayStart,\n            endTime: current.toDateString() === eventEnd.toDateString() ? eventEnd : dayEnd,\n            continued: !isFirst,\n            continuedEnd: current.toDateString() !== eventEnd.toDateString()\n          });\n        }\n\n        isFirst = false;\n        current.setDate(current.getDate() + 1);\n        current.setHours(0, 0, 0, 0);\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Assigns a zero-based `column` index to each event so that overlapping\n   * events occupy different columns.\n   *\n   * Events are processed in start-time order (longest duration first for ties).\n   * Each event gets the earliest column not already occupied by an overlapping event.\n   */\n  assignColumnsToEvents(events: CalendarEvent[]): void {\n    const sorted = [...events].sort((a, b) => {\n      const diff = a.startTime.getTime() - b.startTime.getTime();\n      if (diff !== 0) return diff;\n      return (b.endTime.getTime() - b.startTime.getTime()) - (a.endTime.getTime() - a.startTime.getTime());\n    });\n\n    for (const event of sorted) {\n      event.column = this.findEarliestPossibleColumn(event, sorted);\n    }\n  }\n\n  /**\n   * Assigns a `width` (column span) to each event, expanding it to fill\n   * unused columns to its right within the overlapping group.\n   */\n  assignWidthsToEvents(events: CalendarEvent[], scanStart: Date, scanEnd: Date): void {\n    for (const event of events) {\n      const overlapping = this.getAllEventsOnSpecificTime(events, event.startTime, event.endTime);\n      const maxCol = Math.max(...overlapping.map(e => e.column ?? 0));\n      const biggestPossible = this.findBiggestPossibleWidth(event, events, scanStart, scanEnd);\n      event.width = Math.max(1, biggestPossible);\n\n      if ((event.column ?? 0) + event.width > maxCol + 1) {\n        event.width = maxCol + 1 - (event.column ?? 0);\n      }\n      if (event.width < 1) event.width = 1;\n    }\n  }\n\n  /** Finds the lowest column index not occupied by any overlapping event. */\n  private findEarliestPossibleColumn(event: CalendarEvent, allEvents: CalendarEvent[]): number {\n    const overlapping = allEvents.filter(e =>\n      e !== event\n      && e.column !== undefined\n      && this.eventsOverlap(e.startTime, e.endTime, event.startTime, event.endTime)\n    );\n\n    let column = 0;\n    while (overlapping.some(e => e.column === column)) {\n      column++;\n    }\n    return column;\n  }\n\n  /** Computes the maximum width an event can span without overlapping a neighbour to its right. */\n  private findBiggestPossibleWidth(\n    event: CalendarEvent,\n    allEvents: CalendarEvent[],\n    _scanStart: Date,\n    _scanEnd: Date\n  ): number {\n    const overlapping = this.getAllEventsOnSpecificTime(allEvents, event.startTime, event.endTime);\n    const maxCol = Math.max(...overlapping.map(e => e.column ?? 0));\n    const totalColumns = maxCol + 1;\n\n    const occupiedCols = overlapping\n      .filter(e => e !== event && (e.column ?? 0) > (event.column ?? 0))\n      .map(e => e.column ?? 0);\n\n    if (occupiedCols.length === 0) {\n      return totalColumns - (event.column ?? 0);\n    }\n\n    return Math.min(...occupiedCols) - (event.column ?? 0);\n  }\n}\n","/**\n * Static utility methods for calendar grid positioning.\n */\nexport class CalendarUtility {\n  /**\n   * Converts a weekday (from `Date.getDay()`) to a 1-based Monday-first column index.\n   * Monday = 1, Tuesday = 2, …, Sunday = 7.\n   */\n  static getCorrectColumn(date: Date): number {\n    const day = date.getDay();\n    return day === 0 ? 7 : day;\n  }\n\n  /**\n   * Converts an hour + minute pair to a 1-based CSS grid row index\n   * within a half-hour grid starting at `startHour`.\n   *\n   * Each hour occupies two rows (one per 30-minute slot).\n   * Formula: `(hour - startHour) * 2 + (minute >= 30 ? 1 : 0) + 1`\n   *\n   * @returns Grid row number (minimum 1).\n   */\n  static getCorrectRow(hour: number, minute: number, startHour: number): number {\n    const hourOffset = hour - startHour;\n    const row = hourOffset * 2 + (minute >= 30 ? 1 : 0) + 1;\n    return Math.max(1, row);\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;AAIA;;AAEG;IACS;AAAZ,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,YAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,YAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACb,CAAC,EAJW,YAAY,KAAZ,YAAY,GAAA,EAAA,CAAA,CAAA;AA2CxB;;;AAGG;AACH,SAAS,aAAa,CAAC,MAAc,EAAA;AACnC,IAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,MAAM,KAAK,GAAa,EAAE;IAC1B,MAAM,IAAI,GAAa,EAAE;AACzB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC1B,QAAA,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC;QACxB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC7B,QAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AAC9D,QAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D;AACA,IAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;AACxB;AAEA;AACO,MAAM,uBAAuB,GAAmB,CAAC,MAAK;IAC3D,MAAM,MAAM,GAAG,OAAO;AACtB,IAAA,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC;IACnC,OAAO;AACL,QAAA,SAAS,EAAE,CAAC;AACZ,QAAA,OAAO,EAAE,EAAE;QACX,MAAM;AACN,QAAA,UAAU,EAAE,OAAO;AACnB,QAAA,aAAa,EAAE,aAAa;AAC5B,QAAA,aAAa,EAAE,UAAU;AACzB,QAAA,SAAS,EAAE,MAAM;AACjB,QAAA,mBAAmB,EAAE,iBAAiB;AACtC,QAAA,gBAAgB,EAAE,oBAAoB;AACtC,QAAA,eAAe,EAAE,MAAM;AACvB,QAAA,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE;QACxD,aAAa,EAAE,KAAK,CAAC,KAAK;QAC1B,YAAY,EAAE,KAAK,CAAC,IAAI;AACxB,QAAA,gBAAgB,EAAE,GAAG;KACtB;AACH,CAAC;AAED;;;;;;;;;;;;;AAaG;MACU,eAAe,GAAG,IAAI,cAAc,CAAiB,gBAAgB,EAAE;AAClF,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,MAAM;AAChB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;AAuBG;MACU,kBAAkB,GAAG,IAAI,cAAc,CAAiB,oBAAoB;AAEzF;AACO,MAAM,0BAA0B,GAAG;AAE1C;;;;;;;;AAQG;AACG,SAAU,uBAAuB,CAAC,OAAiC,EAAA;IACvE,OAAO,wBAAwB,CAAiB,kBAAkB,EAAE,0BAA0B,EAAE,OAAO,CAAC;AAC1G;AAEA;;AAEG;AACG,SAAU,qBAAqB,CAAC,OAAiC,EAAA;AACrE,IAAA,IAAI,CAAC,OAAO;AAAE,QAAA,OAAO,EAAE,GAAG,uBAAuB,EAAE;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,uBAAuB,CAAC,MAAM;AAC/D,IAAA,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC;IACnC,OAAO;AACL,QAAA,GAAG,uBAAuB;AAC1B,QAAA,GAAG,OAAO;QACV,MAAM;AACN,QAAA,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK;AACnD,QAAA,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,KAAK,CAAC,IAAI;KACjD;AACH;;ACtIA;;;;;;;;;AASG;MACU,uBAAuB,GAAG,IAAI,cAAc,CAAwB,uBAAuB;;ACnCxG;;;;;;;;;;AAUG;MAEU,4BAA4B,CAAA;AACtB,IAAA,MAAM;AAEvB,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,MAAM,GAAG,MAAM,CAAwB,eAAe,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;QAE/E,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,uBAAuB,CAAC,MAAM;IAChE;;IAGA,WAAW,CAAC,IAAY,EAAE,MAAc,EAAA;AACtC,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE;QACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACjC,OAAO,OAAO,CAAC,OAAO,CACpB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAC7E;IACH;;AAGA,IAAA,UAAU,CAAC,IAAsB,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,OAAO,OAAO,CAAC,OAAO,CACpB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAC7E;IACH;;AAGA,IAAA,cAAc,CAAC,IAAU,EAAA;QACvB,OAAO,EAAE,CACP,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE;YAC/B,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS;AAC/C,YAAA,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE;AAC1B,SAAA,CAAC,CACH;IACH;;AAGA,IAAA,UAAU,CAAC,IAAU,EAAA;QACnB,OAAO,EAAE,CACP,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE;YACnC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE;AACvC,SAAA,CAAC,CACH;IACH;;AAGA,IAAA,wBAAwB,CAAC,IAAU,EAAA;AACjC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE;AAC5B,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACtD,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACjD,QAAA,OAAO,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,EAAE;IACzB;;IAGA,SAAS,CAAC,KAAW,EAAE,KAAW,EAAA;QAChC,OAAO,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW;AAC3C,eAAA,KAAK,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,QAAQ;eACnC,KAAK,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE;IAC1C;;AAGA,IAAA,eAAe,CAAC,IAAU,EAAA;QACxB,OAAO,OAAO,CAAC,OAAO,CACpB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CACrE;IACH;uGAjEW,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAA5B,4BAA4B,EAAA,CAAA;;2FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBADxC;;;ACbD;;;;;;;;;;;AAWG;MAEU,0BAA0B,CAAA;AAErC;;AAEG;AACH,IAAA,aAAa,CAAC,MAAY,EAAE,IAAU,EAAE,MAAY,EAAE,IAAU,EAAA;AAC9D,QAAA,OAAO,MAAM,GAAG,IAAI,IAAI,MAAM,GAAG,IAAI;IACvC;AAEA;;AAEG;AACH,IAAA,0BAA0B,CAAC,MAAuB,EAAE,KAAW,EAAE,GAAS,EAAA;QACxE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IACpB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CACvD;IACH;AAEA;;;;;;AAMG;IACH,uBAAuB,CACrB,MAAuB,EACvB,SAAiB,EACjB,OAAe,EACf,UAAgB,EAChB,QAAc,EAAA;QAEd,MAAM,MAAM,GAAoB,EAAE;AAElC,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;YAC5C,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAExC,IAAI,UAAU,CAAC,YAAY,EAAE,KAAK,QAAQ,CAAC,YAAY,EAAE,EAAE;gBACzD,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;gBACzB;YACF;AAEA,YAAA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC;YACpC,IAAI,OAAO,GAAG,IAAI;YAElB,OAAO,OAAO,GAAG,QAAQ,IAAI,OAAO,GAAG,QAAQ,EAAE;AAC/C,gBAAA,IAAI,OAAO,IAAI,UAAU,EAAE;AACzB,oBAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;AAClC,oBAAA,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;oBAEhC,IAAI,OAAO,EAAE;wBACX,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACnC;yBAAO;wBACL,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;wBACrC,IAAI,OAAO,CAAC,YAAY,EAAE,KAAK,QAAQ,CAAC,YAAY,EAAE,EAAE;AACtD,4BAAA,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;wBACnE;6BAAO;4BACL,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;wBACnC;oBACF;oBAEA,MAAM,CAAC,IAAI,CAAC;AACV,wBAAA,GAAG,KAAK;wBACR,SAAS,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ;AAC1C,wBAAA,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE,KAAK,QAAQ,CAAC,YAAY,EAAE,GAAG,QAAQ,GAAG,MAAM;wBAC/E,SAAS,EAAE,CAAC,OAAO;wBACnB,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,KAAK,QAAQ,CAAC,YAAY;AAC/D,qBAAA,CAAC;gBACJ;gBAEA,OAAO,GAAG,KAAK;gBACf,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACtC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9B;QACF;AAEA,QAAA,OAAO,MAAM;IACf;AAEA;;;;;;AAMG;AACH,IAAA,qBAAqB,CAAC,MAAuB,EAAA;AAC3C,QAAA,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACvC,YAAA,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;YAC1D,IAAI,IAAI,KAAK,CAAC;AAAE,gBAAA,OAAO,IAAI;AAC3B,YAAA,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;AACtG,QAAA,CAAC,CAAC;AAEF,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC;QAC/D;IACF;AAEA;;;AAGG;AACH,IAAA,oBAAoB,CAAC,MAAuB,EAAE,SAAe,EAAE,OAAa,EAAA;AAC1E,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;YAC3F,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AAC/D,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC;YACxF,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC;AAE1C,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE;AAClD,gBAAA,KAAK,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;YAChD;AACA,YAAA,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC;AAAE,gBAAA,KAAK,CAAC,KAAK,GAAG,CAAC;QACtC;IACF;;IAGQ,0BAA0B,CAAC,KAAoB,EAAE,SAA0B,EAAA;AACjF,QAAA,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IACpC,CAAC,KAAK;eACH,CAAC,CAAC,MAAM,KAAK;eACb,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAC9E;QAED,IAAI,MAAM,GAAG,CAAC;AACd,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE;AACjD,YAAA,MAAM,EAAE;QACV;AACA,QAAA,OAAO,MAAM;IACf;;AAGQ,IAAA,wBAAwB,CAC9B,KAAoB,EACpB,SAA0B,EAC1B,UAAgB,EAChB,QAAc,EAAA;AAEd,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;QAC9F,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AAC/D,QAAA,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC;QAE/B,MAAM,YAAY,GAAG;aAClB,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;aAChE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;AAE1B,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7B,OAAO,YAAY,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;QAC3C;AAEA,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IACxD;uGAxJW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAA1B,0BAA0B,EAAA,CAAA;;2FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBADtC;;;ACfD;;AAEG;MACU,eAAe,CAAA;AAC1B;;;AAGG;IACH,OAAO,gBAAgB,CAAC,IAAU,EAAA;AAChC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;QACzB,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG;IAC5B;AAEA;;;;;;;;AAQG;AACH,IAAA,OAAO,aAAa,CAAC,IAAY,EAAE,MAAc,EAAE,SAAiB,EAAA;AAClE,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,SAAS;QACnC,MAAM,GAAG,GAAG,UAAU,GAAG,CAAC,IAAI,MAAM,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;QACvD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;IACzB;AACD;;AC3BD;;AAEG;;"}