{"version":3,"file":"basic-month-table.vue2.mjs","sources":["../../../../../../packages/components/date-picker/src/date-picker-com/basic-month-table.vue"],"sourcesContent":["<template>\n  <table\n    role=\"grid\"\n    :class=\"ns.b()\"\n    @click=\"handleMonthTableClick\"\n    @mousemove=\"handleMouseMove\"\n  >\n    <tbody ref=\"tbodyRef\">\n      <tr v-for=\"(row, key) in rows\" :key=\"key\">\n        <td\n          v-for=\"(cell, key_) in row\"\n          :key=\"key_\"\n          :ref=\"(el) => isSelectedCell(cell) && (currentCellRef = el as HTMLElement)\"\n          :class=\"getCellStyle(cell)\"\n          :tabindex=\"isSelectedCell(cell) ? 0 : -1\"\n          @keydown.space.prevent.stop=\"handleMonthTableClick\"\n          @keydown.enter.prevent.stop=\"handleMonthTableClick\"\n        >\n          <div>\n            <span class=\"cell\">\n              {{ months[cell.text] }}\n            </span>\n          </div>\n        </td>\n      </tr>\n    </tbody>\n  </table>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, nextTick, ref, watch } from 'vue'\nimport dayjs from 'dayjs'\nimport { useNamespace } from '@element-ultra/hooks'\nimport { rangeArr } from '@element-ultra/components/time-picker'\nimport { castArray, hasClass } from '@element-ultra/utils'\nimport { basicMonthTableProps } from '../props/basic-month-table'\n\ntype MonthCell = {\n  column: number\n  row: number\n  disabled: boolean\n  start: boolean\n  end: boolean\n  text: number\n  type: 'normal' | 'today'\n  inRange: boolean\n}\n\nconst datesInMonth = (year: number, month: number, lang: string) => {\n  const firstDay = dayjs().locale(lang).startOf('month').month(month).year(year)\n  const numOfDays = firstDay.daysInMonth()\n  return rangeArr(numOfDays).map(n => firstDay.add(n, 'day').toDate())\n}\n\nconst props = defineProps(basicMonthTableProps)\nconst emit = defineEmits(['changerange', 'pick', 'select'])\n\nconst ns = useNamespace('month-table')\n\nconst tbodyRef = ref<HTMLElement>()\nconst currentCellRef = ref<HTMLElement>()\nconst months = [\n  '一月',\n  '二月',\n  '三月',\n  '四月',\n  '五月',\n  '六月',\n  '七月',\n  '八月',\n  '九月',\n  '十月',\n  '十一月',\n  '十二月'\n]\nconst tableRows = ref<MonthCell[][]>([\n  [] as MonthCell[],\n  [] as MonthCell[],\n  [] as MonthCell[]\n])\nconst lastRow = ref<number>()\nconst lastColumn = ref<number>()\nconst rows = computed<MonthCell[][]>(() => {\n  const rows = tableRows.value\n\n  const now = dayjs().locale('zh-cn').startOf('month')\n\n  for (let i = 0; i < 3; i++) {\n    const row = rows[i]\n    for (let j = 0; j < 4; j++) {\n      const cell = (row[j] ||= {\n        row: i,\n        column: j,\n        type: 'normal',\n        inRange: false,\n        start: false,\n        end: false,\n        text: -1,\n        disabled: false\n      })\n\n      cell.type = 'normal'\n\n      const index = i * 4 + j\n      const calTime = props.date!.startOf('year').month(index)\n\n      const calEndDate =\n        props.rangeState.endDate ||\n        props.maxDate ||\n        (props.rangeState.selecting && props.minDate) ||\n        null\n\n      cell.inRange =\n        !!(\n          props.minDate &&\n          calTime.isSameOrAfter(props.minDate, 'month') &&\n          calEndDate &&\n          calTime.isSameOrBefore(calEndDate, 'month')\n        ) ||\n        !!(\n          props.minDate &&\n          calTime.isSameOrBefore(props.minDate, 'month') &&\n          calEndDate &&\n          calTime.isSameOrAfter(calEndDate, 'month')\n        )\n\n      if (props.minDate?.isSameOrAfter(calEndDate)) {\n        cell.start = !!(calEndDate && calTime.isSame(calEndDate, 'month'))\n        cell.end = props.minDate && calTime.isSame(props.minDate, 'month')\n      } else {\n        cell.start = !!(props.minDate && calTime.isSame(props.minDate, 'month'))\n        cell.end = !!(calEndDate && calTime.isSame(calEndDate, 'month'))\n      }\n\n      const isToday = now.isSame(calTime)\n      if (isToday) {\n        cell.type = 'today'\n      }\n\n      cell.text = index\n      cell.disabled = props.disabledDate?.(calTime.toDate()) || false\n    }\n  }\n  return rows\n})\n\nconst focus = () => {\n  currentCellRef.value?.focus()\n}\n\nconst getCellStyle = (cell: MonthCell) => {\n  const style = {} as any\n  const year = props.date!.year()\n  const today = new Date()\n  const month = cell.text\n\n  style.disabled = props.disabledDate\n    ? datesInMonth(year, month, 'zh-cn').every(props.disabledDate)\n    : false\n  style.current =\n    castArray(props.parsedValue).findIndex(\n      date =>\n        dayjs.isDayjs(date) && date.year() === year && date.month() === month\n    ) >= 0\n  style.today = today.getFullYear() === year && today.getMonth() === month\n\n  if (cell.inRange) {\n    style['in-range'] = true\n\n    if (cell.start) {\n      style['start-date'] = true\n    }\n\n    if (cell.end) {\n      style['end-date'] = true\n    }\n  }\n  return style\n}\n\nconst isSelectedCell = (cell: MonthCell) => {\n  const year = props.date!.year()\n  const month = cell.text\n  return (\n    castArray(props.date).findIndex(\n      date => date.year() === year && date.month() === month\n    ) >= 0\n  )\n}\n\nconst handleMouseMove = (event: MouseEvent) => {\n  if (!props.rangeState.selecting) return\n\n  let target = event.target as HTMLElement\n  if (target.tagName === 'A') {\n    target = target.parentNode?.parentNode as HTMLElement\n  }\n  if (target.tagName === 'DIV') {\n    target = target.parentNode as HTMLElement\n  }\n  if (target.tagName !== 'TD') return\n\n  const row = (target.parentNode as HTMLTableRowElement).rowIndex\n  const column = (target as HTMLTableCellElement).cellIndex\n  // can not select disabled date\n  if (rows.value[row][column].disabled) return\n\n  // only update rangeState when mouse moves to a new cell\n  // this avoids frequent Date object creation and improves performance\n  if (row !== lastRow.value || column !== lastColumn.value) {\n    lastRow.value = row\n    lastColumn.value = column\n    emit('changerange', {\n      selecting: true,\n      endDate: props.date!.startOf('year').month(row * 4 + column)\n    })\n  }\n}\nconst handleMonthTableClick = (event: MouseEvent | KeyboardEvent) => {\n  const target = (event.target as HTMLElement)?.closest(\n    'td'\n  ) as HTMLTableCellElement\n  if (target?.tagName !== 'TD') return\n  if (hasClass(target, 'disabled')) return\n  const column = target.cellIndex\n  const row = (target.parentNode as HTMLTableRowElement).rowIndex\n  const month = row * 4 + column\n  const newDate = props.date!.startOf('year').month(month)\n  if (props.selectionMode === 'range') {\n    if (!props.rangeState.selecting) {\n      emit('pick', { minDate: newDate, maxDate: null })\n      emit('select', true)\n    } else {\n      if (props.minDate && newDate >= props.minDate) {\n        emit('pick', { minDate: props.minDate, maxDate: newDate })\n      } else {\n        emit('pick', { minDate: newDate, maxDate: props.minDate })\n      }\n      emit('select', false)\n    }\n  } else {\n    emit('pick', month)\n  }\n}\n\nwatch(\n  () => props.date,\n  async () => {\n    if (tbodyRef.value?.contains(document.activeElement)) {\n      await nextTick()\n      currentCellRef.value?.focus()\n    }\n  }\n)\n\ndefineExpose({\n  /**\n   * @description focus current cell\n   */\n  focus\n})\n</script>\n"],"names":["rows"],"mappings":";;;;;;;;;;;;;;;;;;;AAgDA,IAAA,MAAM,YAAe,GAAA,CAAC,IAAc,EAAA,KAAA,EAAe,IAAiB,KAAA;AAClE,MAAA,MAAM,QAAW,GAAA,KAAA,EAAQ,CAAA,MAAA,CAAO,IAAI,CAAA,CAAE,OAAQ,CAAA,OAAO,CAAE,CAAA,KAAA,CAAM,KAAK,CAAA,CAAE,KAAK,IAAI,CAAA,CAAA;AAC7E,MAAM,MAAA,SAAA,GAAY,SAAS,WAAY,EAAA,CAAA;AACvC,MAAO,OAAA,QAAA,CAAS,SAAS,CAAA,CAAE,GAAI,CAAA,CAAA,CAAA,KAAK,QAAS,CAAA,GAAA,CAAI,CAAG,EAAA,KAAK,CAAE,CAAA,MAAA,EAAQ,CAAA,CAAA;AAAA,KACrE,CAAA;AAKA,IAAM,MAAA,EAAA,GAAK,aAAa,aAAa,CAAA,CAAA;AAErC,IAAA,MAAM,WAAW,GAAiB,EAAA,CAAA;AAClC,IAAA,MAAM,iBAAiB,GAAiB,EAAA,CAAA;AACxC,IAAA,MAAM,MAAS,GAAA;AAAA,MACb,cAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,oBAAA;AAAA,MACA,oBAAA;AAAA,KACF,CAAA;AACA,IAAA,MAAM,YAAY,GAAmB,CAAA;AAAA,MACnC,EAAC;AAAA,MACD,EAAC;AAAA,MACD,EAAC;AAAA,KACF,CAAA,CAAA;AACD,IAAA,MAAM,UAAU,GAAY,EAAA,CAAA;AAC5B,IAAA,MAAM,aAAa,GAAY,EAAA,CAAA;AAC/B,IAAM,MAAA,IAAA,GAAO,SAAwB,MAAM;;AACzC,MAAA,MAAMA,QAAO,SAAU,CAAA,KAAA,CAAA;AAEvB,MAAA,MAAM,MAAM,KAAM,EAAA,CAAE,OAAO,OAAO,CAAA,CAAE,QAAQ,OAAO,CAAA,CAAA;AAEnD,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,CAAA,EAAG,CAAK,EAAA,EAAA;AAC1B,QAAM,MAAA,GAAA,GAAMA,MAAK,CAAC,CAAA,CAAA;AAClB,QAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,CAAA,EAAG,CAAK,EAAA,EAAA;AAC1B,UAAA,MAAM,OAAQ,GAAW,CAAA,CAAA,CAAA,KAAA,GAAA,CAAA,CAAA,CAAA,GAAA;AAAA,YACvB,GAAK,EAAA,CAAA;AAAA,YACL,MAAQ,EAAA,CAAA;AAAA,YACR,IAAM,EAAA,QAAA;AAAA,YACN,OAAS,EAAA,KAAA;AAAA,YACT,KAAO,EAAA,KAAA;AAAA,YACP,GAAK,EAAA,KAAA;AAAA,YACL,IAAM,EAAA,CAAA,CAAA;AAAA,YACN,QAAU,EAAA,KAAA;AAAA,WACZ,CAAA,CAAA;AAEA,UAAA,IAAA,CAAK,IAAO,GAAA,QAAA,CAAA;AAEZ,UAAM,MAAA,KAAA,GAAQ,IAAI,CAAI,GAAA,CAAA,CAAA;AACtB,UAAA,MAAM,UAAU,KAAM,CAAA,IAAA,CAAM,QAAQ,MAAM,CAAA,CAAE,MAAM,KAAK,CAAA,CAAA;AAEvD,UAAM,MAAA,UAAA,GACJ,KAAM,CAAA,UAAA,CAAW,OACjB,IAAA,KAAA,CAAM,WACL,KAAM,CAAA,UAAA,CAAW,SAAa,IAAA,KAAA,CAAM,OACrC,IAAA,IAAA,CAAA;AAEF,UAAA,IAAA,CAAK,OACH,GAAA,CAAC,EACC,KAAA,CAAM,OACN,IAAA,OAAA,CAAQ,aAAc,CAAA,KAAA,CAAM,OAAS,EAAA,OAAO,CAC5C,IAAA,UAAA,IACA,QAAQ,cAAe,CAAA,UAAA,EAAY,OAAO,CAAA,CAAA,IAE5C,CAAC,EACC,KAAM,CAAA,OAAA,IACN,QAAQ,cAAe,CAAA,KAAA,CAAM,OAAS,EAAA,OAAO,CAC7C,IAAA,UAAA,IACA,OAAQ,CAAA,aAAA,CAAc,YAAY,OAAO,CAAA,CAAA,CAAA;AAG7C,UAAA,IAAA,CAAI,EAAM,GAAA,KAAA,CAAA,OAAA,KAAN,IAAe,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,aAAA,CAAc,UAAa,CAAA,EAAA;AAC5C,YAAA,IAAA,CAAK,QAAQ,CAAC,EAAE,cAAc,OAAQ,CAAA,MAAA,CAAO,YAAY,OAAO,CAAA,CAAA,CAAA;AAChE,YAAA,IAAA,CAAK,MAAM,KAAM,CAAA,OAAA,IAAW,QAAQ,MAAO,CAAA,KAAA,CAAM,SAAS,OAAO,CAAA,CAAA;AAAA,WAC5D,MAAA;AACL,YAAK,IAAA,CAAA,KAAA,GAAQ,CAAC,EAAE,KAAA,CAAM,WAAW,OAAQ,CAAA,MAAA,CAAO,KAAM,CAAA,OAAA,EAAS,OAAO,CAAA,CAAA,CAAA;AACtE,YAAA,IAAA,CAAK,MAAM,CAAC,EAAE,cAAc,OAAQ,CAAA,MAAA,CAAO,YAAY,OAAO,CAAA,CAAA,CAAA;AAAA,WAChE;AAEA,UAAM,MAAA,OAAA,GAAU,GAAI,CAAA,MAAA,CAAO,OAAO,CAAA,CAAA;AAClC,UAAA,IAAI,OAAS,EAAA;AACX,YAAA,IAAA,CAAK,IAAO,GAAA,OAAA,CAAA;AAAA,WACd;AAEA,UAAA,IAAA,CAAK,IAAO,GAAA,KAAA,CAAA;AACZ,UAAA,IAAA,CAAK,aAAW,EAAM,GAAA,KAAA,CAAA,YAAA,KAAN,IAAqB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,KAAA,EAAA,OAAA,CAAQ,QAAa,CAAA,KAAA,KAAA,CAAA;AAAA,SAC5D;AAAA,OACF;AACA,MAAOA,OAAAA,KAAAA,CAAAA;AAAA,KACR,CAAA,CAAA;AAED,IAAA,MAAM,QAAQ,MAAM;;AAClB,MAAA,CAAA,EAAA,GAAA,cAAA,CAAe,UAAf,IAAsB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAA,EAAA,CAAA;AAAA,KACxB,CAAA;AAEA,IAAM,MAAA,YAAA,GAAe,CAAC,IAAoB,KAAA;AACxC,MAAA,MAAM,QAAQ,EAAC,CAAA;AACf,MAAM,MAAA,IAAA,GAAO,KAAM,CAAA,IAAA,CAAM,IAAK,EAAA,CAAA;AAC9B,MAAM,MAAA,KAAA,uBAAY,IAAK,EAAA,CAAA;AACvB,MAAA,MAAM,QAAQ,IAAK,CAAA,IAAA,CAAA;AAEnB,MAAM,KAAA,CAAA,QAAA,GAAW,KAAM,CAAA,YAAA,GACnB,YAAa,CAAA,IAAA,EAAM,KAAO,EAAA,OAAO,CAAE,CAAA,KAAA,CAAM,KAAM,CAAA,YAAY,CAC3D,GAAA,KAAA,CAAA;AACJ,MAAA,KAAA,CAAM,OACJ,GAAA,SAAA,CAAU,KAAM,CAAA,WAAW,CAAE,CAAA,SAAA;AAAA,QAC3B,CAAA,IAAA,KACE,KAAM,CAAA,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAK,CAAA,IAAA,EAAW,KAAA,IAAA,IAAQ,IAAK,CAAA,KAAA,EAAY,KAAA,KAAA;AAAA,OAC/D,IAAA,CAAA,CAAA;AACP,MAAA,KAAA,CAAM,QAAQ,KAAM,CAAA,WAAA,OAAkB,IAAQ,IAAA,KAAA,CAAM,UAAe,KAAA,KAAA,CAAA;AAEnE,MAAA,IAAI,KAAK,OAAS,EAAA;AAChB,QAAA,KAAA,CAAM,UAAU,CAAI,GAAA,IAAA,CAAA;AAEpB,QAAA,IAAI,KAAK,KAAO,EAAA;AACd,UAAA,KAAA,CAAM,YAAY,CAAI,GAAA,IAAA,CAAA;AAAA,SACxB;AAEA,QAAA,IAAI,KAAK,GAAK,EAAA;AACZ,UAAA,KAAA,CAAM,UAAU,CAAI,GAAA,IAAA,CAAA;AAAA,SACtB;AAAA,OACF;AACA,MAAO,OAAA,KAAA,CAAA;AAAA,KACT,CAAA;AAEA,IAAM,MAAA,cAAA,GAAiB,CAAC,IAAoB,KAAA;AAC1C,MAAM,MAAA,IAAA,GAAO,KAAM,CAAA,IAAA,CAAM,IAAK,EAAA,CAAA;AAC9B,MAAA,MAAM,QAAQ,IAAK,CAAA,IAAA,CAAA;AACnB,MACE,OAAA,SAAA,CAAU,KAAM,CAAA,IAAI,CAAE,CAAA,SAAA;AAAA,QACpB,UAAQ,IAAK,CAAA,IAAA,OAAW,IAAQ,IAAA,IAAA,CAAK,OAAY,KAAA,KAAA;AAAA,OAC9C,IAAA,CAAA,CAAA;AAAA,KAET,CAAA;AAEA,IAAM,MAAA,eAAA,GAAkB,CAAC,KAAsB,KAAA;;AAC7C,MAAI,IAAA,CAAC,MAAM,UAAW,CAAA,SAAA;AAAW,QAAA,OAAA;AAEjC,MAAA,IAAI,SAAS,KAAM,CAAA,MAAA,CAAA;AACnB,MAAI,IAAA,MAAA,CAAO,YAAY,GAAK,EAAA;AAC1B,QAAS,MAAA,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,eAAP,IAAmB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAA,CAAA;AAAA,OAC9B;AACA,MAAI,IAAA,MAAA,CAAO,YAAY,KAAO,EAAA;AAC5B,QAAA,MAAA,GAAS,MAAO,CAAA,UAAA,CAAA;AAAA,OAClB;AACA,MAAA,IAAI,OAAO,OAAY,KAAA,IAAA;AAAM,QAAA,OAAA;AAE7B,MAAM,MAAA,GAAA,GAAO,OAAO,UAAmC,CAAA,QAAA,CAAA;AACvD,MAAA,MAAM,SAAU,MAAgC,CAAA,SAAA,CAAA;AAEhD,MAAA,IAAI,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,MAAM,CAAE,CAAA,QAAA;AAAU,QAAA,OAAA;AAItC,MAAA,IAAI,GAAQ,KAAA,OAAA,CAAQ,KAAS,IAAA,MAAA,KAAW,WAAW,KAAO,EAAA;AACxD,QAAA,OAAA,CAAQ,KAAQ,GAAA,GAAA,CAAA;AAChB,QAAA,UAAA,CAAW,KAAQ,GAAA,MAAA,CAAA;AACnB,QAAA,IAAA,CAAK,aAAe,EAAA;AAAA,UAClB,SAAW,EAAA,IAAA;AAAA,UACX,OAAA,EAAS,MAAM,IAAM,CAAA,OAAA,CAAQ,MAAM,CAAE,CAAA,KAAA,CAAM,GAAM,GAAA,CAAA,GAAI,MAAM,CAAA;AAAA,SAC5D,CAAA,CAAA;AAAA,OACH;AAAA,KACF,CAAA;AACA,IAAM,MAAA,qBAAA,GAAwB,CAAC,KAAsC,KAAA;;AACnE,MAAM,MAAA,MAAA,GAAA,CAAU,EAAM,GAAA,KAAA,CAAA,MAAA,KAAN,IAA8B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAA;AAAA,QAC5C,IAAA;AAAA,OAAA,CAAA;AAEF,MAAA,IAAA,CAAI,iCAAQ,OAAY,MAAA,IAAA;AAAM,QAAA,OAAA;AAC9B,MAAI,IAAA,QAAA,CAAS,QAAQ,UAAU,CAAA;AAAG,QAAA,OAAA;AAClC,MAAA,MAAM,SAAS,MAAO,CAAA,SAAA,CAAA;AACtB,MAAM,MAAA,GAAA,GAAO,OAAO,UAAmC,CAAA,QAAA,CAAA;AACvD,MAAM,MAAA,KAAA,GAAQ,MAAM,CAAI,GAAA,MAAA,CAAA;AACxB,MAAA,MAAM,UAAU,KAAM,CAAA,IAAA,CAAM,QAAQ,MAAM,CAAA,CAAE,MAAM,KAAK,CAAA,CAAA;AACvD,MAAI,IAAA,KAAA,CAAM,kBAAkB,OAAS,EAAA;AACnC,QAAI,IAAA,CAAC,KAAM,CAAA,UAAA,CAAW,SAAW,EAAA;AAC/B,UAAA,IAAA,CAAK,QAAQ,EAAE,OAAA,EAAS,OAAS,EAAA,OAAA,EAAS,MAAM,CAAA,CAAA;AAChD,UAAA,IAAA,CAAK,UAAU,IAAI,CAAA,CAAA;AAAA,SACd,MAAA;AACL,UAAA,IAAI,KAAM,CAAA,OAAA,IAAW,OAAW,IAAA,KAAA,CAAM,OAAS,EAAA;AAC7C,YAAA,IAAA,CAAK,QAAQ,EAAE,OAAA,EAAS,MAAM,OAAS,EAAA,OAAA,EAAS,SAAS,CAAA,CAAA;AAAA,WACpD,MAAA;AACL,YAAA,IAAA,CAAK,QAAQ,EAAE,OAAA,EAAS,SAAS,OAAS,EAAA,KAAA,CAAM,SAAS,CAAA,CAAA;AAAA,WAC3D;AACA,UAAA,IAAA,CAAK,UAAU,KAAK,CAAA,CAAA;AAAA,SACtB;AAAA,OACK,MAAA;AACL,QAAA,IAAA,CAAK,QAAQ,KAAK,CAAA,CAAA;AAAA,OACpB;AAAA,KACF,CAAA;AAEA,IAAA,KAAA;AAAA,MACE,MAAM,KAAM,CAAA,IAAA;AAAA,MACZ,YAAY;;AACV,QAAA,IAAA,CAAI,EAAS,GAAA,QAAA,CAAA,KAAA,KAAT,IAAgB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,QAAA,CAAS,SAAS,aAAgB,CAAA,EAAA;AACpD,UAAA,MAAM,QAAS,EAAA,CAAA;AACf,UAAA,CAAA,EAAA,GAAA,cAAA,CAAe,UAAf,IAAsB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAA,EAAA,CAAA;AAAA,SACxB;AAAA,OACF;AAAA,KACF,CAAA;AAEA,IAAa,MAAA,CAAA;AAAA;AAAA;AAAA;AAAA,MAIX,KAAA;AAAA,KACD,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}