{"version":3,"file":"english.cjs","sources":["../src/bitwise/number.ts","../src/core/utils.ts","../src/core/game.ts","../src/english/utils.ts","../src/english/mask.ts","../src/english/move-generation.ts","../src/english/engine.ts","../src/english/game.ts","../src/computer/computer.ts","../src/computer/alpha-beta.ts","../src/computer/random.ts","../src/english/computer.ts"],"sourcesContent":["import { IBitwiseOps } from './types';\n\nexport const BitwiseNumber: IBitwiseOps<number> = {\n  and(...args: number[]): number {\n    return args.reduce((a, b) => a & b, 0xffffffff) >>> 0;\n  },\n\n  or(...args: number[]): number {\n    return args.reduce((a, b) => a | b, 0) >>> 0;\n  },\n\n  xor(a: number, b: number): number {\n    return (a ^ b) >>> 0;\n  },\n\n  not(a: number): number {\n    return ~a >>> 0;\n  },\n\n  rotLeft(a: number, shift: number): number {\n    const rotation = shift & 31;\n    return ((a << rotation) | (a >>> (32 - rotation))) >>> 0;\n  },\n\n  rotRight(a: number, shift: number): number {\n    const rotation = shift & 31;\n    return ((a >>> rotation) | (a << (32 - rotation))) >>> 0;\n  },\n\n  cardinality(a: number): number {\n    let n = a;\n    n = n - ((n >>> 1) & 0x55555555);\n    n = (n & 0x33333333) + ((n >>> 2) & 0x33333333);\n    return (((n + (n >>> 4)) & 0x0f0f0f0f) * 0x01010101) >>> 24;\n  },\n\n  decompose(a: number): number[] {\n    const result: number[] = [];\n    let remaining = a;\n    for (let bit = 1; remaining; bit <<= 1) {\n      if (remaining & bit) {\n        result.push(bit >>> 0);\n        remaining ^= bit;\n      }\n    }\n    return result;\n  },\n} as IBitwiseOps<number>;\n","import { Bitboard } from '../bitwise/types';\nimport { DraughtsEngineMove, DraughtsPlayer } from './engine';\nimport { DraughtsBoard1D, DraughtsMove1D } from './game';\n\nexport function compareMove(\n  moveA: DraughtsEngineMove<Bitboard>,\n  moveB: DraughtsEngineMove<Bitboard>\n): boolean {\n  return (\n    moveA.origin === moveB.origin &&\n    moveA.destination === moveB.destination &&\n    moveA.captures === moveB.captures\n  );\n}\n\nexport function compareCaptures1D(\n  capturesA: number[],\n  capturesB: number[]\n): boolean {\n  if (capturesA.length !== capturesB.length) {\n    return false;\n  }\n  for (const [i, element] of capturesA.entries()) {\n    if (element !== capturesB[i]) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexport function comparePartialMove1D(\n  moveA: DraughtsMove1D,\n  moveB: Partial<DraughtsMove1D>\n): boolean {\n  if (moveB.origin && moveA.origin !== moveB.origin) {\n    return false;\n  }\n  if (moveB.destination && moveA.destination !== moveB.destination) {\n    return false;\n  }\n  if (moveB.captures && !compareCaptures1D(moveA.captures, moveB.captures)) {\n    return false;\n  }\n  return true;\n}\n\nexport function formatBoard(board: DraughtsBoard1D) {\n  const boardSize = Math.floor(Math.sqrt(board.length));\n  const div = '-'.repeat(1 + boardSize * 4);\n  let str = `${div}\\n`;\n\n  for (const [ref, square] of board.entries()) {\n    // is start of row\n    if (ref % boardSize === 0) {\n      str += `|`;\n    }\n\n    // output square\n    if (square.piece) {\n      let char = square.piece.player === DraughtsPlayer.LIGHT ? 'x' : 'o';\n      char = square.piece.king ? char.toUpperCase() : char;\n      str += ` ${char} |`;\n    } else {\n      str += '   |';\n    }\n\n    // is end of row\n    if (ref % boardSize === boardSize - 1) {\n      str += ` \\n${div}\\n`;\n    }\n  }\n\n  return str;\n}\n","import { Bitboard } from '../bitwise/types';\nimport { DraughtsPlayer } from './engine';\nimport type {\n  DraughtsEngine,\n  DraughtsEngineBoard,\n  DraughtsEngineMove,\n  DraughtsStatus,\n} from './engine';\nimport { formatBoard } from './utils';\n\nexport type DraughtsPiece1D = {\n  readonly king: boolean;\n  readonly player: DraughtsPlayer;\n};\n\nexport type DraughtsDarkSquare1D = {\n  readonly piece: DraughtsPiece1D | undefined;\n  readonly position: number;\n  readonly dark: true;\n};\n\nexport type DraughtsLightSquare1D = {\n  readonly piece: undefined;\n  readonly position: undefined;\n  readonly dark: false;\n};\n\nexport type DraughtsSquare1D = DraughtsLightSquare1D | DraughtsDarkSquare1D;\n\nexport type DraughtsBoard1D = DraughtsSquare1D[];\n\nexport type DraughtsMove1D = {\n  readonly origin: number;\n  readonly destination: number;\n  readonly captures: number[];\n};\n\nexport type DraughtsGameHistory1D = {\n  moves: DraughtsMove1D[];\n  boards: DraughtsBoard1D[];\n};\n\nexport type DraughtsAdapter1D<TBitboard extends Bitboard> = {\n  toMove1D: (engineMove: DraughtsEngineMove<TBitboard>) => DraughtsMove1D;\n  toEngineMove: (move1D: DraughtsMove1D) => DraughtsEngineMove<TBitboard>;\n  toBoard1D: (engineBoard: DraughtsEngineBoard<TBitboard>) => DraughtsBoard1D;\n};\n\nexport class DraughtsGame1D<TBitboard extends Bitboard> {\n  engine: DraughtsEngine<TBitboard>;\n  history: DraughtsGameHistory1D;\n\n  private _board: DraughtsBoard1D | undefined;\n  private _moves: DraughtsMove1D[] | undefined;\n\n  private readonly adapter: DraughtsAdapter1D<TBitboard>;\n\n  constructor(\n    engine: DraughtsEngine<TBitboard>,\n    history: DraughtsGameHistory1D,\n    adapter: DraughtsAdapter1D<TBitboard>\n  ) {\n    this.engine = engine;\n    this.history = history;\n    this.adapter = adapter;\n  }\n\n  /**\n   * Get the status of the game\n   */\n  get status(): DraughtsStatus {\n    return this.engine.status;\n  }\n\n  /**\n   * Get the current player to move\n   */\n  get player(): DraughtsPlayer {\n    return this.engine.data.player;\n  }\n\n  /**\n   * Get the 1D array representation of the current board\n   */\n  get board(): DraughtsBoard1D {\n    return (this._board ??= this.adapter.toBoard1D(this.engine.data.board));\n  }\n\n  /**\n   * Get the available moves in 1D representation\n   */\n  get moves(): DraughtsMove1D[] {\n    return (this._moves ??= this.engine.moves.map((engineMove) =>\n      this.adapter.toMove1D(engineMove)\n    ));\n  }\n\n  /**\n   * Check if a move is valid\n   * @param move The move to check in 1D representation\n   * @returns True if the move is valid, false otherwise.\n   */\n  isValidMove(move: DraughtsMove1D) {\n    const engineMove = this.adapter.toEngineMove(move);\n    return this.engine.isValidMove(engineMove);\n  }\n\n  /**\n   * Make a move using the 1D representation of a move\n   * @param move The move to make in 1D representation\n   */\n  move(move: DraughtsMove1D) {\n    if (!this.isValidMove(move)) {\n      throw new Error(`invalid move: ${JSON.stringify(move)}`);\n    }\n\n    this.history.boards.push(this.board);\n    this.history.moves.push(move);\n\n    const engineMove = this.adapter.toEngineMove(move);\n    this.engine.move(engineMove);\n\n    this._board = undefined;\n    this._moves = undefined;\n  }\n\n  asciiBoard() {\n    return formatBoard(this.board);\n  }\n}\n","const BITS = 32;\n\nconst EnglishDraughtsBitSquare: Record<number, number> = [];\nEnglishDraughtsBitSquare[0] = 1;\nfor (let index = 1; index < BITS; index++) {\n  EnglishDraughtsBitSquare[index] = EnglishDraughtsBitSquare[index - 1] * 2;\n}\nexport { EnglishDraughtsBitSquare };\n","import { EnglishDraughtsBitSquare as S } from './utils';\n\n/* We use the following bitboard layout for English Draughts\n *\n *   11  05  31  25\n * 10  04  30  24\n *   03  29  23  17\n * 02  28  22  16\n *   27  21  15  09\n * 26  20  14  08\n *   19  13  07  01\n * 18  12  06  00\n *\n * Access the uint32 value of a square with S[n]\n *\n * A move forward to the left is a rotate left 7 bits.\n * A move forward to the right is a rotate left 1 bit.\n */\n\nconst RANK_0 = S[18] | S[12] | S[6] | S[0];\nconst RANK_1 = S[19] | S[13] | S[7] | S[1];\nconst RANK_2 = S[26] | S[20] | S[14] | S[8];\nconst RANK_3 = S[27] | S[21] | S[15] | S[9];\nconst RANK_4 = S[2] | S[28] | S[22] | S[16];\nconst RANK_5 = S[3] | S[29] | S[23] | S[17];\nconst RANK_6 = S[10] | S[4] | S[30] | S[24];\nconst RANK_7 = S[11] | S[5] | S[31] | S[25];\n\nconst BOARD =\n  RANK_0 | RANK_1 | RANK_2 | RANK_3 | RANK_4 | RANK_5 | RANK_6 | RANK_7;\n\nconst FILE_0 = S[18] | S[26] | S[2] | S[10];\nconst FILE_7 = S[1] | S[9] | S[17] | S[25];\n\nconst FORWARD_LEFT = ~(RANK_7 | FILE_0);\nconst FORWARD_RIGHT = ~(RANK_7 | FILE_7);\nconst BACKWARD_LEFT = ~(RANK_0 | FILE_0);\nconst BACKWARD_RIGHT = ~(RANK_0 | FILE_7);\n\nconst LIGHT_START = RANK_0 | RANK_1 | RANK_2;\nconst DARK_START = RANK_5 | RANK_6 | RANK_7;\n\nconst MIDDLE_TWO_RANK_FOUR_FILE = S[21] | S[28] | S[22];\nconst MIDDLE_FOUR_RANK_TWO_FILE = S[29] | S[22] | S[21] | S[14];\n\nconst Mask = {\n  BOARD,\n  RANK_0,\n  RANK_7,\n  FORWARD_LEFT,\n  FORWARD_RIGHT,\n  BACKWARD_LEFT,\n  BACKWARD_RIGHT,\n  LIGHT_START,\n  DARK_START,\n  MIDDLE_FOUR_RANK_TWO_FILE,\n  MIDDLE_TWO_RANK_FOUR_FILE,\n};\n\nexport default Mask;\n","import { BitwiseNumber } from '../bitwise/number';\nimport { DraughtsEngineMove, DraughtsPlayer } from '../core/engine';\nimport { EnglishDraughtsEngine } from './engine';\nimport Mask from './mask';\n\nexport type EnglishDraughtsBoardIntermediates = {\n  forward: number;\n  backward: number;\n  opponent: number;\n  empty: number;\n};\n\nexport class EnglishDraughtsMoveGenerator {\n  private intermediates: EnglishDraughtsBoardIntermediates;\n\n  constructor(intermediates: EnglishDraughtsBoardIntermediates) {\n    this.intermediates = intermediates;\n  }\n\n  getJumpers(): number {\n    let capture = BitwiseNumber.and(\n      BitwiseNumber.rotRight(this.intermediates.empty, 7),\n      BitwiseNumber.and(this.intermediates.opponent, Mask.FORWARD_LEFT)\n    );\n    let jumpers = BitwiseNumber.and(\n      BitwiseNumber.rotRight(capture, 7),\n      BitwiseNumber.and(this.intermediates.forward, Mask.FORWARD_LEFT)\n    );\n\n    capture = BitwiseNumber.and(\n      BitwiseNumber.rotRight(this.intermediates.empty, 1),\n      BitwiseNumber.and(this.intermediates.opponent, Mask.FORWARD_RIGHT)\n    );\n    jumpers = BitwiseNumber.or(\n      jumpers,\n      BitwiseNumber.and(\n        BitwiseNumber.rotRight(capture, 1),\n        BitwiseNumber.and(this.intermediates.forward, Mask.FORWARD_RIGHT)\n      )\n    );\n\n    capture = BitwiseNumber.and(\n      BitwiseNumber.rotLeft(this.intermediates.empty, 1),\n      BitwiseNumber.and(this.intermediates.opponent, Mask.BACKWARD_LEFT)\n    );\n    jumpers = BitwiseNumber.or(\n      jumpers,\n      BitwiseNumber.and(\n        BitwiseNumber.rotLeft(capture, 1),\n        BitwiseNumber.and(this.intermediates.backward, Mask.BACKWARD_LEFT)\n      )\n    );\n\n    capture = BitwiseNumber.and(\n      BitwiseNumber.rotLeft(this.intermediates.empty, 7),\n      BitwiseNumber.and(this.intermediates.opponent, Mask.BACKWARD_RIGHT)\n    );\n    jumpers = BitwiseNumber.or(\n      jumpers,\n      BitwiseNumber.and(\n        BitwiseNumber.rotLeft(capture, 7),\n        BitwiseNumber.and(this.intermediates.backward, Mask.BACKWARD_RIGHT)\n      )\n    );\n\n    return jumpers;\n  }\n\n  getMovers(): number {\n    let movers = 0;\n\n    if (this.intermediates.forward) {\n      movers = BitwiseNumber.or(\n        movers,\n        BitwiseNumber.and(\n          BitwiseNumber.and(\n            BitwiseNumber.rotRight(this.intermediates.empty, 7),\n            this.intermediates.forward\n          ),\n          Mask.FORWARD_LEFT\n        )\n      );\n      movers = BitwiseNumber.or(\n        movers,\n        BitwiseNumber.and(\n          BitwiseNumber.and(\n            BitwiseNumber.rotRight(this.intermediates.empty, 1),\n            this.intermediates.forward\n          ),\n          Mask.FORWARD_RIGHT\n        )\n      );\n    }\n    if (this.intermediates.backward) {\n      movers = BitwiseNumber.or(\n        movers,\n        BitwiseNumber.and(\n          BitwiseNumber.and(\n            BitwiseNumber.rotLeft(this.intermediates.empty, 1),\n            this.intermediates.backward\n          ),\n          Mask.BACKWARD_LEFT\n        )\n      );\n      movers = BitwiseNumber.or(\n        movers,\n        BitwiseNumber.and(\n          BitwiseNumber.and(\n            BitwiseNumber.rotLeft(this.intermediates.empty, 7),\n            this.intermediates.backward\n          ),\n          Mask.BACKWARD_RIGHT\n        )\n      );\n    }\n\n    return movers;\n  }\n\n  getMovesFromOrigin(origin: number): DraughtsEngineMove<number>[] {\n    const moves: DraughtsEngineMove<number>[] = [];\n\n    if (BitwiseNumber.and(origin, this.intermediates.forward)) {\n      const d1 = BitwiseNumber.and(\n        BitwiseNumber.rotLeft(BitwiseNumber.and(origin, Mask.FORWARD_LEFT), 7),\n        this.intermediates.empty\n      );\n      if (d1) {\n        moves.push({ origin, destination: d1, captures: 0 });\n      }\n\n      const d2 = BitwiseNumber.and(\n        BitwiseNumber.rotLeft(BitwiseNumber.and(origin, Mask.FORWARD_RIGHT), 1),\n        this.intermediates.empty\n      );\n      if (d2) {\n        moves.push({ origin, destination: d2, captures: 0 });\n      }\n    }\n\n    if (BitwiseNumber.and(origin, this.intermediates.backward)) {\n      const d3 = BitwiseNumber.and(\n        BitwiseNumber.rotRight(\n          BitwiseNumber.and(origin, Mask.BACKWARD_LEFT),\n          1\n        ),\n        this.intermediates.empty\n      );\n      if (d3) {\n        moves.push({ origin, destination: d3, captures: 0 });\n      }\n\n      const d4 = BitwiseNumber.and(\n        BitwiseNumber.rotRight(\n          BitwiseNumber.and(origin, Mask.BACKWARD_RIGHT),\n          7\n        ),\n        this.intermediates.empty\n      );\n      if (d4) {\n        moves.push({ origin, destination: d4, captures: 0 });\n      }\n    }\n\n    return moves;\n  }\n\n  getJumpsFromOrigin(origin: number) {\n    const searchStack = this.getSingleJumpFromOrigin(origin);\n    const moves: DraughtsEngineMove<number>[] = [];\n\n    while (searchStack.length > 0) {\n      const searchJump = searchStack.pop();\n      if (searchJump === undefined) break;\n\n      const nextBoard = this.applyUnfinishedCapture({\n        ...searchJump,\n        origin,\n      });\n\n      const nextJumps = nextBoard.getSingleJumpFromOrigin(\n        searchJump.destination\n      );\n\n      for (const nextJump of nextJumps) {\n        searchStack.push({\n          origin,\n          destination: nextJump.destination,\n          captures: BitwiseNumber.or(searchJump.captures, nextJump.captures),\n        });\n      }\n\n      if (nextJumps.length === 0) moves.push(searchJump);\n    }\n\n    return moves;\n  }\n\n  getSingleJumpFromOrigin(origin: number): DraughtsEngineMove<number>[] {\n    const moves: DraughtsEngineMove<number>[] = [];\n\n    if (BitwiseNumber.and(origin, this.intermediates.forward)) {\n      const c1 = BitwiseNumber.and(\n        BitwiseNumber.rotLeft(BitwiseNumber.and(origin, Mask.FORWARD_LEFT), 7),\n        this.intermediates.opponent\n      );\n      const d1 = BitwiseNumber.and(\n        BitwiseNumber.rotLeft(BitwiseNumber.and(c1, Mask.FORWARD_LEFT), 7),\n        this.intermediates.empty\n      );\n      if (d1) {\n        moves.push({ origin, destination: d1, captures: c1 });\n      }\n\n      const c2 = BitwiseNumber.and(\n        BitwiseNumber.rotLeft(BitwiseNumber.and(origin, Mask.FORWARD_RIGHT), 1),\n        this.intermediates.opponent\n      );\n      const d2 = BitwiseNumber.and(\n        BitwiseNumber.rotLeft(BitwiseNumber.and(c2, Mask.FORWARD_RIGHT), 1),\n        this.intermediates.empty\n      );\n      if (d2) {\n        moves.push({ origin, destination: d2, captures: c2 });\n      }\n    }\n\n    if (BitwiseNumber.and(origin, this.intermediates.backward)) {\n      const c3 = BitwiseNumber.and(\n        BitwiseNumber.rotRight(\n          BitwiseNumber.and(origin, Mask.BACKWARD_LEFT),\n          1\n        ),\n        this.intermediates.opponent\n      );\n      const d3 = BitwiseNumber.and(\n        BitwiseNumber.rotRight(BitwiseNumber.and(c3, Mask.BACKWARD_LEFT), 1),\n        this.intermediates.empty\n      );\n      if (d3) {\n        moves.push({ origin, destination: d3, captures: c3 });\n      }\n\n      const c4 = BitwiseNumber.and(\n        BitwiseNumber.rotRight(\n          BitwiseNumber.and(origin, Mask.BACKWARD_RIGHT),\n          7\n        ),\n        this.intermediates.opponent\n      );\n      const d4 = BitwiseNumber.and(\n        BitwiseNumber.rotRight(BitwiseNumber.and(c4, Mask.BACKWARD_RIGHT), 7),\n        this.intermediates.empty\n      );\n      if (d4) {\n        moves.push({ origin, destination: d4, captures: c4 });\n      }\n    }\n\n    return moves;\n  }\n\n  private applyUnfinishedCapture(\n    move: DraughtsEngineMove<number>\n  ): EnglishDraughtsMoveGenerator {\n    return new EnglishDraughtsMoveGenerator({\n      forward: BitwiseNumber.and(this.intermediates.forward, move.origin)\n        ? BitwiseNumber.or(this.intermediates.forward, move.destination)\n        : this.intermediates.forward,\n      backward: BitwiseNumber.and(this.intermediates.backward, move.origin)\n        ? BitwiseNumber.or(this.intermediates.backward, move.destination)\n        : this.intermediates.backward,\n      opponent: BitwiseNumber.and(\n        this.intermediates.opponent,\n        BitwiseNumber.not(move.captures)\n      ),\n      empty: this.intermediates.empty,\n    });\n  }\n}\n\nexport const EnglishDraughtsMoveGeneratorFactory = {\n  fromEngine(engine: EnglishDraughtsEngine): EnglishDraughtsMoveGenerator {\n    const { player, board } = engine.data;\n    return new EnglishDraughtsMoveGenerator({\n      forward:\n        player === DraughtsPlayer.LIGHT\n          ? board.light\n          : BitwiseNumber.and(board.dark, board.king),\n      backward:\n        player === DraughtsPlayer.LIGHT\n          ? BitwiseNumber.and(board.light, board.king)\n          : board.dark,\n      opponent: player === DraughtsPlayer.LIGHT ? board.dark : board.light,\n      empty: BitwiseNumber.not(BitwiseNumber.or(board.light, board.dark)),\n    });\n  },\n};\n","import { BitwiseNumber } from '../bitwise/number';\nimport type {\n  DraughtsEngineData,\n  DraughtsEngineMove,\n  DraughtsEngineStrategy,\n} from '../core/engine';\nimport { DraughtsEngine, DraughtsStatus, DraughtsPlayer } from '../core/engine';\nimport { compareMove } from '../core/utils';\nimport Mask from './mask';\nimport { EnglishDraughtsMoveGeneratorFactory } from './move-generation';\n\nexport type EnglishDraughtsEngineData = DraughtsEngineData<number>;\n\nexport type EnglishDraughtsEngine = DraughtsEngine<number>;\n\nexport const EnglishDraughtsEngineDefaultData: EnglishDraughtsEngineData = {\n  player: DraughtsPlayer.DARK,\n  board: {\n    light: Mask.LIGHT_START,\n    dark: Mask.DARK_START,\n    king: 0,\n  },\n  stats: {\n    sinceCapture: 0,\n    sinceNonKingAdvance: 0,\n  },\n};\n\nexport const EnglishDraughtsEngineStrategy: DraughtsEngineStrategy<number> = {\n  status(engine: EnglishDraughtsEngine) {\n    if (engine.moves.length === 0) {\n      return engine.data.player === DraughtsPlayer.LIGHT\n        ? DraughtsStatus.DARK_WON\n        : DraughtsStatus.LIGHT_WON;\n    }\n    if (\n      engine.data.stats.sinceCapture >= 40 &&\n      engine.data.stats.sinceNonKingAdvance >= 40\n    ) {\n      return DraughtsStatus.DRAW;\n    }\n    return DraughtsStatus.PLAYING;\n  },\n\n  isValidMove(engine: EnglishDraughtsEngine, move: DraughtsEngineMove<number>) {\n    return engine.moves.some((validMove) => compareMove(move, validMove));\n  },\n\n  moves(engine: EnglishDraughtsEngine) {\n    const generator = EnglishDraughtsMoveGeneratorFactory.fromEngine(engine);\n    const moves: DraughtsEngineMove<number>[] = [];\n\n    const jumpers = generator.getJumpers();\n    if (jumpers) {\n      for (const jumper of BitwiseNumber.decompose(jumpers)) {\n        moves.push(...generator.getJumpsFromOrigin(jumper));\n      }\n      return moves;\n    }\n\n    const movers = generator.getMovers();\n    for (const mover of BitwiseNumber.decompose(movers)) {\n      moves.push(...generator.getMovesFromOrigin(mover));\n    }\n\n    return moves;\n  },\n\n  move(engine: EnglishDraughtsEngine, move: DraughtsEngineMove<number>) {\n    if (!engine.isValidMove(move)) {\n      throw new Error(`invalid move: ${JSON.stringify(move)}`);\n    }\n\n    const board = {\n      ...engine.data.board,\n    };\n\n    const stats = { ...engine.data.stats };\n\n    // Remove the origin and captures from the color boards\n    const isKing = BitwiseNumber.and(move.origin, engine.data.board.king);\n    const remaining = BitwiseNumber.not(\n      BitwiseNumber.or(move.origin, move.captures)\n    );\n\n    board.light = BitwiseNumber.and(board.light, remaining);\n    board.dark = BitwiseNumber.and(board.dark, remaining);\n    board.king = BitwiseNumber.and(board.king, remaining);\n\n    // Add the destination to the color board\n    if (BitwiseNumber.and(move.origin, engine.data.board.light)) {\n      board.light = BitwiseNumber.or(board.light, move.destination);\n    } else {\n      board.dark = BitwiseNumber.or(board.dark, move.destination);\n    }\n\n    if (isKing) {\n      board.king = BitwiseNumber.or(board.king, move.destination);\n    }\n\n    board.king = BitwiseNumber.or(\n      board.king,\n      BitwiseNumber.and(\n        move.destination,\n        BitwiseNumber.or(Mask.RANK_0, Mask.RANK_7)\n      )\n    );\n\n    // Add the destination to the king board\n    if (BitwiseNumber.and(move.destination, engine.data.board.king)) {\n      board.king = BitwiseNumber.or(board.king, move.destination);\n      stats.sinceNonKingAdvance = 0;\n    } else {\n      stats.sinceNonKingAdvance += 1;\n    }\n\n    if (move.captures) {\n      stats.sinceCapture = 0;\n    } else {\n      stats.sinceCapture += 1;\n    }\n\n    return {\n      player:\n        engine.data.player === DraughtsPlayer.LIGHT\n          ? DraughtsPlayer.DARK\n          : DraughtsPlayer.LIGHT,\n      board,\n      stats,\n    };\n  },\n};\n\nexport const EnglishDraughtsEngineFactory = {\n  /**\n   * Set up an English Draughts engine with optional data\n   * @param data Optional data for the engine\n   * @returns An English Draughts engine instance\n   */\n  setup(data?: Partial<EnglishDraughtsEngineData>): EnglishDraughtsEngine {\n    return new DraughtsEngine(\n      { ...EnglishDraughtsEngineDefaultData, ...data },\n      EnglishDraughtsEngineStrategy\n    );\n  },\n};\n","import { BitwiseNumber } from '../bitwise/number';\nimport {\n  DraughtsEngineBoard,\n  DraughtsEngineData,\n  DraughtsEngineMove,\n  DraughtsPlayer,\n} from '../core/engine';\nimport {\n  DraughtsBoard1D,\n  DraughtsAdapter1D,\n  DraughtsMove1D,\n  DraughtsGame1D,\n  DraughtsGameHistory1D,\n} from '../core/game';\nimport { EnglishDraughtsEngineFactory } from './engine';\n\nimport { EnglishDraughtsBitSquare as S } from './utils';\n\nconst ENGLISH_DRAUGHTS_LAYOUT = [\n  S[11],\n  S[5],\n  S[31],\n  S[25],\n  S[10],\n  S[4],\n  S[30],\n  S[24],\n  S[3],\n  S[29],\n  S[23],\n  S[17],\n  S[2],\n  S[28],\n  S[22],\n  S[16],\n  S[27],\n  S[21],\n  S[15],\n  S[9],\n  S[26],\n  S[20],\n  S[14],\n  S[8],\n  S[19],\n  S[13],\n  S[7],\n  S[1],\n  S[18],\n  S[12],\n  S[6],\n  S[0],\n];\n\nconst SQUARE_TO_REF: Map<number | undefined, number | undefined> = new Map(\n  ENGLISH_DRAUGHTS_LAYOUT.map((square, squareIndex) => [square, squareIndex])\n);\n\nexport const EnglishDraughtsAdapter1D: DraughtsAdapter1D<number> = {\n  toMove1D(engineMove: DraughtsEngineMove<number>): DraughtsMove1D {\n    const origin = SQUARE_TO_REF.get(engineMove.origin);\n    if (origin === undefined)\n      throw new Error(`invalid move origin: ${engineMove.origin}`);\n\n    const destination = SQUARE_TO_REF.get(engineMove.destination);\n    if (destination === undefined)\n      throw new Error(`invalid move destination: ${engineMove.destination}`);\n\n    const captures = [];\n    for (const capture of BitwiseNumber.decompose(engineMove.captures)) {\n      const captureRef = SQUARE_TO_REF.get(capture);\n      if (captureRef !== undefined) captures.push(captureRef);\n    }\n\n    return { origin, destination, captures };\n  },\n\n  toEngineMove(adapterMove: DraughtsMove1D): DraughtsEngineMove<number> {\n    const origin = ENGLISH_DRAUGHTS_LAYOUT[adapterMove.origin];\n    if (origin === undefined)\n      throw new Error(`invalid move origin: ${adapterMove.origin}`);\n\n    const destination = ENGLISH_DRAUGHTS_LAYOUT[adapterMove.destination];\n    if (destination === undefined)\n      throw new Error(`invalid move destination: ${adapterMove.destination}`);\n\n    let captures = 0;\n    for (const capture of adapterMove.captures) {\n      const square = ENGLISH_DRAUGHTS_LAYOUT[capture];\n      if (square === undefined)\n        throw new Error(`invalid move capture: ${capture}`);\n      captures |= square;\n    }\n    return { origin, destination, captures };\n  },\n\n  toBoard1D(engineBoard: DraughtsEngineBoard<number>): DraughtsBoard1D {\n    const board: DraughtsBoard1D = [];\n\n    for (const [position, bit] of ENGLISH_DRAUGHTS_LAYOUT.entries()) {\n      // light squares before\n      if (Math.floor(position / 4) % 2 === 0) {\n        board.push({ dark: false, piece: undefined, position: undefined });\n      }\n\n      const isLightPiece = !!(bit & engineBoard.light);\n      const isDarkPiece = !!(bit & engineBoard.dark);\n      const isKingPiece = !!(bit & engineBoard.king);\n\n      // populated dark square\n      board.push({\n        dark: true,\n        position,\n        piece:\n          isLightPiece || isDarkPiece\n            ? {\n                player: isLightPiece\n                  ? DraughtsPlayer.LIGHT\n                  : DraughtsPlayer.DARK,\n                king: isKingPiece,\n              }\n            : undefined,\n      });\n\n      // light squares after\n      if (Math.floor(position / 4) % 2 !== 0) {\n        board.push({ dark: false, piece: undefined, position: undefined });\n      }\n    }\n\n    return board;\n  },\n};\n\nexport const EnglishDraughtsDefaultHistory1D: DraughtsGameHistory1D = {\n  moves: [],\n  boards: [],\n};\n\nexport type EnglishDraughtsGame = DraughtsGame1D<number>;\n\nexport const EnglishDraughts = {\n  /**\n   * Sets up a new English Draughts game\n   * @param data Optional data to initialize the game engine\n   * @param history Optional history to initialize the game\n   * @returns The new English Draughts game\n   */\n  setup(\n    data?: Partial<DraughtsEngineData<number>>,\n    history?: Partial<DraughtsGameHistory1D>\n  ): EnglishDraughtsGame {\n    const engine = EnglishDraughtsEngineFactory.setup(data);\n    return new DraughtsGame1D(\n      engine,\n      { ...EnglishDraughtsDefaultHistory1D, ...history },\n      EnglishDraughtsAdapter1D\n    );\n  },\n};\n","import { Bitboard } from '../bitwise/types';\nimport { DraughtsEngine, DraughtsEngineMove } from '../core/engine';\nimport {\n  DraughtsAdapter1D,\n  DraughtsGame1D,\n  DraughtsMove1D,\n} from '../core/game';\n\nexport type SearchEvaluationFunction<TBitboard extends Bitboard> = (\n  engine: DraughtsEngine<TBitboard>\n) => number;\n\nexport type DraughtsComputerStrategyArgs<\n  TBitboard extends Bitboard,\n  TOptions,\n> = {\n  options: TOptions;\n  engine: DraughtsEngine<TBitboard>;\n};\n\nexport type DraughtsComputerStrategy<TBitboard extends Bitboard, TOptions> = (\n  args: DraughtsComputerStrategyArgs<TBitboard, TOptions>\n) => Promise<DraughtsEngineMove<TBitboard>>;\n\nexport type DraughtsComputer<TBitboard extends Bitboard> = (\n  game: DraughtsGame1D<TBitboard>\n) => Promise<DraughtsMove1D>;\n\nexport type DraughtsComputerArguments<TBitboard extends Bitboard, TOptions> = {\n  adapter: DraughtsAdapter1D<TBitboard>;\n  strategy: DraughtsComputerStrategy<TBitboard, TOptions>;\n  options: TOptions;\n};\n\nexport const DraughtsComputerFactory = {\n  setup<TBitboard extends Bitboard, TOptions>({\n    adapter,\n    strategy,\n    options,\n  }: DraughtsComputerArguments<\n    TBitboard,\n    TOptions\n  >): DraughtsComputer<TBitboard> {\n    return async (game) => {\n      const engineMove = await strategy({\n        options,\n        engine: game.engine,\n      });\n      return adapter.toMove1D(engineMove);\n    };\n  },\n};\n","import {\n  DraughtsComputerStrategyArgs,\n  SearchEvaluationFunction,\n} from './computer';\nimport { DraughtsEngine, DraughtsEngineMove } from '../core/engine';\nimport { Bitboard } from '../bitwise/types';\n\nexport type AlphaBetaOptions<TBitboard extends Bitboard> = {\n  maxDepth: number;\n  evaluationFunction: SearchEvaluationFunction<TBitboard>;\n  quiescence?: boolean;\n};\n\nexport async function alphaBeta<TBitboard extends Bitboard>({\n  options: { maxDepth, evaluationFunction, quiescence = true },\n  engine,\n}: DraughtsComputerStrategyArgs<\n  TBitboard,\n  AlphaBetaOptions<TBitboard>\n>): Promise<DraughtsEngineMove<TBitboard>> {\n  let recordEvaluation = Number.NEGATIVE_INFINITY;\n  let recordMove: DraughtsEngineMove<TBitboard> | undefined;\n\n  for (const move of engine.moves) {\n    const next = engine.clone();\n    next.move(move);\n\n    const evaluation = -(await alphaBetaSearch({\n      data: {\n        engine: next,\n        alpha: Number.NEGATIVE_INFINITY,\n        beta: Number.POSITIVE_INFINITY,\n        depth: maxDepth - 1,\n      },\n      options: { evaluationFunction, quiescence },\n    }));\n    if (evaluation >= recordEvaluation) {\n      recordEvaluation = evaluation;\n      recordMove = move;\n    }\n  }\n\n  if (recordMove === undefined) {\n    throw new Error('no available moves');\n  }\n\n  return recordMove;\n}\n\ntype AlphaBetaSearchArguments<TBitboard extends Bitboard> = {\n  data: {\n    engine: DraughtsEngine<TBitboard>;\n    alpha: number;\n    beta: number;\n    depth: number;\n  };\n  options: Omit<AlphaBetaOptions<TBitboard>, 'maxDepth'>;\n};\n\nasync function alphaBetaSearch<TBitboard extends Bitboard>({\n  data: { engine, alpha, beta, depth },\n  options: { evaluationFunction, quiescence },\n}: AlphaBetaSearchArguments<TBitboard>) {\n  if (depth === 0)\n    return quiescence\n      ? quiescenceSearch({\n          data: { engine, alpha, beta },\n          options: { evaluationFunction },\n        })\n      : evaluationFunction(engine);\n\n  for (const move of engine.moves) {\n    const next = engine.clone();\n    next.move(move);\n\n    const evaluation = -(await alphaBetaSearch({\n      data: {\n        engine: next,\n        alpha: -beta,\n        beta: -alpha,\n        depth: depth - 1,\n      },\n      options: { evaluationFunction, quiescence: quiescence },\n    }));\n    if (evaluation >= beta) return beta;\n    alpha = Math.max(evaluation, alpha);\n  }\n\n  return alpha;\n}\n\ninterface QuiescenceSearchArguments<TBitboard extends Bitboard> {\n  data: {\n    engine: DraughtsEngine<TBitboard>;\n    alpha: number;\n    beta: number;\n  };\n  options: {\n    evaluationFunction: SearchEvaluationFunction<TBitboard>;\n  };\n}\n\nasync function quiescenceSearch<TBitboard extends Bitboard>({\n  data: { engine, alpha, beta },\n  options: { evaluationFunction },\n}: QuiescenceSearchArguments<TBitboard>) {\n  const evaluation = evaluationFunction(engine);\n  if (evaluation >= beta) return beta;\n  alpha = Math.max(evaluation, alpha);\n\n  for (const move of engine.moves) {\n    if (!move.captures) continue;\n    const next = engine.clone();\n    next.move(move);\n\n    const nextEvaluation = -(await quiescenceSearch({\n      data: { engine: next, alpha: -beta, beta: -alpha },\n      options: { evaluationFunction },\n    }));\n\n    if (nextEvaluation >= beta) return beta;\n    alpha = Math.max(nextEvaluation, alpha);\n  }\n\n  return alpha;\n}\n","import { Bitboard } from '../bitwise/types';\nimport { DraughtsEngineMove } from '../core/engine';\nimport { DraughtsComputerStrategyArgs } from './computer';\n\nexport async function random<TBitboard extends Bitboard>({\n  engine,\n}: DraughtsComputerStrategyArgs<TBitboard, undefined>): Promise<\n  DraughtsEngineMove<TBitboard>\n> {\n  if (engine.moves.length === 0) throw new Error('no valid moves');\n\n  const randomIndex = Math.floor(Math.random() * engine.moves.length);\n  const randomEngineMove = engine.moves[randomIndex];\n\n  return randomEngineMove;\n}\n","import {\n  DraughtsComputerFactory,\n  DraughtsComputer,\n  SearchEvaluationFunction,\n} from '../computer/computer';\nimport { alphaBeta, AlphaBetaOptions } from '../computer/alpha-beta';\nimport { random } from '../computer/random';\nimport { DraughtsEngine, DraughtsPlayer, DraughtsStatus } from '../core/engine';\nimport { EnglishDraughtsAdapter1D } from './game';\nimport Mask from './mask';\nimport { BitwiseNumber } from '../bitwise/number';\n\nconst statusToPlayer = {\n  [DraughtsStatus.LIGHT_WON]: DraughtsPlayer.LIGHT,\n  [DraughtsStatus.DARK_WON]: DraughtsPlayer.DARK,\n};\n\n/**\n * Evaluation function for the English Draughts game\n *\n * @param {DraughtsEngine<number>} engine - The game engine\n * @returns {number} - Evaluation score for the given position\n */\nexport const evaluate: SearchEvaluationFunction<number> = (\n  engine: DraughtsEngine<number>\n) => {\n  const status = engine.status;\n  if (status !== DraughtsStatus.PLAYING) {\n    if (status === DraughtsStatus.DRAW) return Number.NEGATIVE_INFINITY;\n    return engine.data.player === statusToPlayer[status]\n      ? Number.POSITIVE_INFINITY\n      : Number.NEGATIVE_INFINITY;\n  }\n  return evaluateMiddlegame(engine);\n};\n\nconst PIECE_WEIGHT = 50;\nconst KING_WEIGHT = 77;\nconst BACK_ROW_WEIGHT = 40;\nconst MIDDLE_TWO_RANK_FOUR_FILE_WEIGHT = 25;\nconst MIDDLE_FOUR_RANK_TWO_FILE_WEIGHT = 5;\n\nfunction evaluateMiddlegame(engine: DraughtsEngine<number>): number {\n  const player =\n    engine.data.player === DraughtsPlayer.LIGHT\n      ? engine.data.board.light\n      : engine.data.board.dark;\n  const opponent =\n    engine.data.player === DraughtsPlayer.LIGHT\n      ? engine.data.board.dark\n      : engine.data.board.light;\n  const playerKings = player & engine.data.board.king;\n  const opponentKings = opponent & engine.data.board.king;\n\n  const back_row =\n    engine.data.player === DraughtsPlayer.LIGHT ? Mask.RANK_0 : Mask.RANK_7;\n  const opponent_back_row =\n    engine.data.player === DraughtsPlayer.LIGHT ? Mask.RANK_7 : Mask.RANK_0;\n\n  const playerPieces = BitwiseNumber.cardinality(player);\n  const opponentPieces = BitwiseNumber.cardinality(opponent);\n  const playerKingsCount = BitwiseNumber.cardinality(playerKings);\n  const opponentKingsCount = BitwiseNumber.cardinality(opponentKings);\n  const playerBackRowCount = BitwiseNumber.cardinality(player & back_row);\n  const opponentBackRowCount = BitwiseNumber.cardinality(\n    opponent & opponent_back_row\n  );\n  const playerMiddleTwoRankFourFileCount = BitwiseNumber.cardinality(\n    player & Mask.MIDDLE_TWO_RANK_FOUR_FILE\n  );\n  const opponentMiddleTwoRankFourFileCount = BitwiseNumber.cardinality(\n    opponent & Mask.MIDDLE_TWO_RANK_FOUR_FILE\n  );\n  const playerMiddleFourRankTwoFileCount = BitwiseNumber.cardinality(\n    player & Mask.MIDDLE_FOUR_RANK_TWO_FILE\n  );\n  const opponentMiddleFourRankTwoFileCount = BitwiseNumber.cardinality(\n    opponent & Mask.MIDDLE_FOUR_RANK_TWO_FILE\n  );\n\n  return (\n    (playerPieces - opponentPieces) * PIECE_WEIGHT +\n    (playerKingsCount - opponentKingsCount) * KING_WEIGHT +\n    (playerBackRowCount - opponentBackRowCount) * BACK_ROW_WEIGHT +\n    (playerMiddleTwoRankFourFileCount - opponentMiddleTwoRankFourFileCount) *\n      MIDDLE_TWO_RANK_FOUR_FILE_WEIGHT +\n    (playerMiddleFourRankTwoFileCount - opponentMiddleFourRankTwoFileCount) *\n      MIDDLE_FOUR_RANK_TWO_FILE_WEIGHT\n  );\n}\n\nexport type EnglishDraughtsComputer = DraughtsComputer<number>;\n\nexport const EnglishDraughtsComputerFactory = {\n  /**\n   * Creates a computer opponent with a random strategy\n   * @returns {EnglishDraughtsComputer} - A computer opponent with a random strategy\n   */\n  random(): EnglishDraughtsComputer {\n    return DraughtsComputerFactory.setup({\n      adapter: EnglishDraughtsAdapter1D,\n      strategy: random<number>,\n      options: undefined,\n    });\n  },\n  /**\n   * Creates a computer opponent with an alpha-beta pruning strategy\n   * @param {Partial<AlphaBetaOptions<number>>} options - Options for the alpha-beta pruning strategy\n   * @returns {EnglishDraughtsComputer} - A computer opponent with an alpha-beta pruning strategy\n   */\n  alphaBeta(\n    options: Partial<AlphaBetaOptions<number>>\n  ): EnglishDraughtsComputer {\n    const withDefaultOptions: AlphaBetaOptions<number> = {\n      maxDepth: options.maxDepth ?? 4,\n      quiescence: options.quiescence ?? true,\n      evaluationFunction: options.evaluationFunction ?? evaluate,\n    };\n\n    return DraughtsComputerFactory.setup({\n      adapter: EnglishDraughtsAdapter1D,\n      strategy: alphaBeta<number>,\n      options: withDefaultOptions,\n    });\n  },\n};\n"],"names":["BitwiseNumber","args","a","b","shift","rotation","n","result","remaining","bit","compareMove","moveA","moveB","formatBoard","board","boardSize","div","str","ref","square","char","DraughtsPlayer","DraughtsGame1D","engine","history","adapter","__publicField","engineMove","move","BITS","EnglishDraughtsBitSquare","index","RANK_0","S","RANK_1","RANK_2","RANK_3","RANK_4","RANK_5","RANK_6","RANK_7","BOARD","FILE_0","FILE_7","FORWARD_LEFT","FORWARD_RIGHT","BACKWARD_LEFT","BACKWARD_RIGHT","LIGHT_START","DARK_START","MIDDLE_TWO_RANK_FOUR_FILE","MIDDLE_FOUR_RANK_TWO_FILE","Mask","EnglishDraughtsMoveGenerator","intermediates","capture","jumpers","movers","origin","moves","d1","d2","d3","d4","searchStack","searchJump","nextJumps","nextJump","c1","c2","c3","c4","EnglishDraughtsMoveGeneratorFactory","player","EnglishDraughtsEngineDefaultData","EnglishDraughtsEngineStrategy","DraughtsStatus","validMove","generator","jumper","mover","stats","isKing","EnglishDraughtsEngineFactory","data","DraughtsEngine","ENGLISH_DRAUGHTS_LAYOUT","SQUARE_TO_REF","squareIndex","EnglishDraughtsAdapter1D","destination","captures","captureRef","adapterMove","engineBoard","position","isLightPiece","isDarkPiece","isKingPiece","EnglishDraughtsDefaultHistory1D","EnglishDraughts","DraughtsComputerFactory","strategy","options","game","alphaBeta","maxDepth","evaluationFunction","quiescence","recordEvaluation","recordMove","next","evaluation","alphaBetaSearch","alpha","beta","depth","quiescenceSearch","nextEvaluation","random","randomIndex","statusToPlayer","evaluate","status","evaluateMiddlegame","PIECE_WEIGHT","KING_WEIGHT","BACK_ROW_WEIGHT","MIDDLE_TWO_RANK_FOUR_FILE_WEIGHT","MIDDLE_FOUR_RANK_TWO_FILE_WEIGHT","opponent","playerKings","opponentKings","back_row","opponent_back_row","playerPieces","opponentPieces","playerKingsCount","opponentKingsCount","playerBackRowCount","opponentBackRowCount","playerMiddleTwoRankFourFileCount","opponentMiddleTwoRankFourFileCount","playerMiddleFourRankTwoFileCount","opponentMiddleFourRankTwoFileCount","EnglishDraughtsComputerFactory","withDefaultOptions"],"mappings":"4RAEaA,EAAqC,CAChD,OAAOC,EAAwB,CACtB,OAAAA,EAAK,OAAO,CAACC,EAAGC,IAAMD,EAAIC,EAAG,UAAU,IAAM,CACtD,EAEA,MAAMF,EAAwB,CACrB,OAAAA,EAAK,OAAO,CAACC,EAAGC,IAAMD,EAAIC,EAAG,CAAC,IAAM,CAC7C,EAEA,IAAID,EAAWC,EAAmB,CAChC,OAAQD,EAAIC,KAAO,CACrB,EAEA,IAAID,EAAmB,CACrB,MAAO,CAACA,IAAM,CAChB,EAEA,QAAQA,EAAWE,EAAuB,CACxC,MAAMC,EAAWD,EAAQ,GACzB,OAASF,GAAKG,EAAaH,IAAO,GAAKG,KAAgB,CACzD,EAEA,SAASH,EAAWE,EAAuB,CACzC,MAAMC,EAAWD,EAAQ,GACzB,OAASF,IAAMG,EAAaH,GAAM,GAAKG,KAAgB,CACzD,EAEA,YAAYH,EAAmB,CAC7B,IAAII,EAAIJ,EACJ,OAAAI,EAAAA,GAAMA,IAAM,EAAK,YAChBA,GAAAA,EAAI,YAAgBA,IAAM,EAAK,YAC1BA,GAAKA,IAAM,GAAM,WAAc,WAAgB,EAC3D,EAEA,UAAUJ,EAAqB,CAC7B,MAAMK,EAAmB,CAAC,EAC1B,IAAIC,EAAYN,EAChB,QAASO,EAAM,EAAGD,EAAWC,IAAQ,EAC/BD,EAAYC,IACPF,EAAA,KAAKE,IAAQ,CAAC,EACRD,GAAAC,GAGV,OAAAF,CAAA,CAEX,EC3CgB,SAAAG,EACdC,EACAC,EACS,CAEP,OAAAD,EAAM,SAAWC,EAAM,QACvBD,EAAM,cAAgBC,EAAM,aAC5BD,EAAM,WAAaC,EAAM,QAE7B,CAiCO,SAASC,EAAYC,EAAwB,CAClD,MAAMC,EAAY,KAAK,MAAM,KAAK,KAAKD,EAAM,MAAM,CAAC,EAC9CE,EAAM,IAAI,OAAO,EAAID,EAAY,CAAC,EACpC,IAAAE,EAAM,GAAGD,CAAG;AAAA,EAEhB,SAAW,CAACE,EAAKC,CAAM,IAAKL,EAAM,UAAW,CAO3C,GALII,EAAMH,IAAc,IACfE,GAAA,KAILE,EAAO,MAAO,CAChB,IAAIC,EAAOD,EAAO,MAAM,SAAWE,iBAAe,MAAQ,IAAM,IAChED,EAAOD,EAAO,MAAM,KAAOC,EAAK,cAAgBA,EAChDH,GAAO,IAAIG,CAAI,IAAA,MAERH,GAAA,OAILC,EAAMH,IAAcA,EAAY,IAC3BE,GAAA;AAAA,EAAMD,CAAG;AAAA,EAClB,CAGK,OAAAC,CACT,CCzBO,MAAMK,CAA2C,CAStD,YACEC,EACAC,EACAC,EACA,CAZFC,EAAA,eACAA,EAAA,gBAEQA,EAAA,eACAA,EAAA,eAESA,EAAA,gBAOf,KAAK,OAASH,EACd,KAAK,QAAUC,EACf,KAAK,QAAUC,CAAA,CAMjB,IAAI,QAAyB,CAC3B,OAAO,KAAK,OAAO,MAAA,CAMrB,IAAI,QAAyB,CACpB,OAAA,KAAK,OAAO,KAAK,MAAA,CAM1B,IAAI,OAAyB,CACnB,OAAA,KAAK,SAAL,KAAK,OAAW,KAAK,QAAQ,UAAU,KAAK,OAAO,KAAK,KAAK,EAAA,CAMvE,IAAI,OAA0B,CAC5B,OAAQ,KAAK,SAAL,KAAK,OAAW,KAAK,OAAO,MAAM,IAAKE,GAC7C,KAAK,QAAQ,SAASA,CAAU,CAClC,EAAA,CAQF,YAAYC,EAAsB,CAChC,MAAMD,EAAa,KAAK,QAAQ,aAAaC,CAAI,EAC1C,OAAA,KAAK,OAAO,YAAYD,CAAU,CAAA,CAO3C,KAAKC,EAAsB,CACzB,GAAI,CAAC,KAAK,YAAYA,CAAI,EACxB,MAAM,IAAI,MAAM,iBAAiB,KAAK,UAAUA,CAAI,CAAC,EAAE,EAGzD,KAAK,QAAQ,OAAO,KAAK,KAAK,KAAK,EAC9B,KAAA,QAAQ,MAAM,KAAKA,CAAI,EAE5B,MAAMD,EAAa,KAAK,QAAQ,aAAaC,CAAI,EAC5C,KAAA,OAAO,KAAKD,CAAU,EAE3B,KAAK,OAAS,OACd,KAAK,OAAS,MAAA,CAGhB,YAAa,CACJ,OAAAd,EAAY,KAAK,KAAK,CAAA,CAEjC,CCjIA,MAAMgB,EAAO,GAEPC,EAAmD,CAAA,EACzDA,EAAyB,CAAC,EAAI,EAC9B,QAASC,EAAQ,EAAGA,EAAQF,EAAME,IAChCD,EAAyBC,CAAK,EAAID,EAAyBC,EAAQ,CAAC,EAAI,ECc1E,MAAMC,EAASC,EAAE,EAAE,EAAIA,EAAE,EAAE,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EACnCC,EAASD,EAAE,EAAE,EAAIA,EAAE,EAAE,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EACnCE,EAASF,EAAE,EAAE,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EAAIA,EAAE,CAAC,EACpCG,EAASH,EAAE,EAAE,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EAAIA,EAAE,CAAC,EACpCI,EAASJ,EAAE,CAAC,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EACpCK,EAASL,EAAE,CAAC,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EACpCM,EAASN,EAAE,EAAE,EAAIA,EAAE,CAAC,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EACpCO,EAASP,EAAE,EAAE,EAAIA,EAAE,CAAC,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EAEpCQ,EACJT,EAASE,EAASC,EAASC,EAASC,EAASC,EAASC,EAASC,EAE3DE,EAAST,EAAE,EAAE,EAAIA,EAAE,EAAE,EAAIA,EAAE,CAAC,EAAIA,EAAE,EAAE,EACpCU,EAASV,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EAEnCW,EAAe,EAAEJ,EAASE,GAC1BG,EAAgB,EAAEL,EAASG,GAC3BG,EAAgB,EAAEd,EAASU,GAC3BK,EAAiB,EAAEf,EAASW,GAE5BK,EAAchB,EAASE,EAASC,EAChCc,EAAaX,EAASC,EAASC,EAE/BU,EAA4BjB,EAAE,EAAE,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EAChDkB,GAA4BlB,EAAE,EAAE,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EAExDmB,EAAO,CACX,MAAAX,EACA,OAAAT,EACA,OAAAQ,EACA,aAAAI,EACA,cAAAC,EACA,cAAAC,EACA,eAAAC,EACA,YAAAC,EACA,WAAAC,EACA,0BAAAE,GACA,0BAAAD,CACF,EC7CO,MAAMG,CAA6B,CAGxC,YAAYC,EAAkD,CAFtD5B,EAAA,sBAGN,KAAK,cAAgB4B,CAAA,CAGvB,YAAqB,CACnB,IAAIC,EAAUvD,EAAc,IAC1BA,EAAc,SAAS,KAAK,cAAc,MAAO,CAAC,EAClDA,EAAc,IAAI,KAAK,cAAc,SAAUoD,EAAK,YAAY,CAClE,EACII,EAAUxD,EAAc,IAC1BA,EAAc,SAASuD,EAAS,CAAC,EACjCvD,EAAc,IAAI,KAAK,cAAc,QAASoD,EAAK,YAAY,CACjE,EAEA,OAAAG,EAAUvD,EAAc,IACtBA,EAAc,SAAS,KAAK,cAAc,MAAO,CAAC,EAClDA,EAAc,IAAI,KAAK,cAAc,SAAUoD,EAAK,aAAa,CACnE,EACAI,EAAUxD,EAAc,GACtBwD,EACAxD,EAAc,IACZA,EAAc,SAASuD,EAAS,CAAC,EACjCvD,EAAc,IAAI,KAAK,cAAc,QAASoD,EAAK,aAAa,CAAA,CAEpE,EAEAG,EAAUvD,EAAc,IACtBA,EAAc,QAAQ,KAAK,cAAc,MAAO,CAAC,EACjDA,EAAc,IAAI,KAAK,cAAc,SAAUoD,EAAK,aAAa,CACnE,EACAI,EAAUxD,EAAc,GACtBwD,EACAxD,EAAc,IACZA,EAAc,QAAQuD,EAAS,CAAC,EAChCvD,EAAc,IAAI,KAAK,cAAc,SAAUoD,EAAK,aAAa,CAAA,CAErE,EAEAG,EAAUvD,EAAc,IACtBA,EAAc,QAAQ,KAAK,cAAc,MAAO,CAAC,EACjDA,EAAc,IAAI,KAAK,cAAc,SAAUoD,EAAK,cAAc,CACpE,EACAI,EAAUxD,EAAc,GACtBwD,EACAxD,EAAc,IACZA,EAAc,QAAQuD,EAAS,CAAC,EAChCvD,EAAc,IAAI,KAAK,cAAc,SAAUoD,EAAK,cAAc,CAAA,CAEtE,EAEOI,CAAA,CAGT,WAAoB,CAClB,IAAIC,EAAS,EAET,OAAA,KAAK,cAAc,UACrBA,EAASzD,EAAc,GACrByD,EACAzD,EAAc,IACZA,EAAc,IACZA,EAAc,SAAS,KAAK,cAAc,MAAO,CAAC,EAClD,KAAK,cAAc,OACrB,EACAoD,EAAK,YAAA,CAET,EACAK,EAASzD,EAAc,GACrByD,EACAzD,EAAc,IACZA,EAAc,IACZA,EAAc,SAAS,KAAK,cAAc,MAAO,CAAC,EAClD,KAAK,cAAc,OACrB,EACAoD,EAAK,aAAA,CAET,GAEE,KAAK,cAAc,WACrBK,EAASzD,EAAc,GACrByD,EACAzD,EAAc,IACZA,EAAc,IACZA,EAAc,QAAQ,KAAK,cAAc,MAAO,CAAC,EACjD,KAAK,cAAc,QACrB,EACAoD,EAAK,aAAA,CAET,EACAK,EAASzD,EAAc,GACrByD,EACAzD,EAAc,IACZA,EAAc,IACZA,EAAc,QAAQ,KAAK,cAAc,MAAO,CAAC,EACjD,KAAK,cAAc,QACrB,EACAoD,EAAK,cAAA,CAET,GAGKK,CAAA,CAGT,mBAAmBC,EAA8C,CAC/D,MAAMC,EAAsC,CAAC,EAE7C,GAAI3D,EAAc,IAAI0D,EAAQ,KAAK,cAAc,OAAO,EAAG,CACzD,MAAME,EAAK5D,EAAc,IACvBA,EAAc,QAAQA,EAAc,IAAI0D,EAAQN,EAAK,YAAY,EAAG,CAAC,EACrE,KAAK,cAAc,KACrB,EACIQ,GACFD,EAAM,KAAK,CAAE,OAAAD,EAAQ,YAAaE,EAAI,SAAU,EAAG,EAGrD,MAAMC,EAAK7D,EAAc,IACvBA,EAAc,QAAQA,EAAc,IAAI0D,EAAQN,EAAK,aAAa,EAAG,CAAC,EACtE,KAAK,cAAc,KACrB,EACIS,GACFF,EAAM,KAAK,CAAE,OAAAD,EAAQ,YAAaG,EAAI,SAAU,EAAG,CACrD,CAGF,GAAI7D,EAAc,IAAI0D,EAAQ,KAAK,cAAc,QAAQ,EAAG,CAC1D,MAAMI,EAAK9D,EAAc,IACvBA,EAAc,SACZA,EAAc,IAAI0D,EAAQN,EAAK,aAAa,EAC5C,CACF,EACA,KAAK,cAAc,KACrB,EACIU,GACFH,EAAM,KAAK,CAAE,OAAAD,EAAQ,YAAaI,EAAI,SAAU,EAAG,EAGrD,MAAMC,EAAK/D,EAAc,IACvBA,EAAc,SACZA,EAAc,IAAI0D,EAAQN,EAAK,cAAc,EAC7C,CACF,EACA,KAAK,cAAc,KACrB,EACIW,GACFJ,EAAM,KAAK,CAAE,OAAAD,EAAQ,YAAaK,EAAI,SAAU,EAAG,CACrD,CAGK,OAAAJ,CAAA,CAGT,mBAAmBD,EAAgB,CAC3B,MAAAM,EAAc,KAAK,wBAAwBN,CAAM,EACjDC,EAAsC,CAAC,EAEtC,KAAAK,EAAY,OAAS,GAAG,CACvB,MAAAC,EAAaD,EAAY,IAAI,EACnC,GAAIC,IAAe,OAAW,MAO9B,MAAMC,EALY,KAAK,uBAAuB,CAC5C,GAAGD,EACH,OAAAP,CAAA,CACD,EAE2B,wBAC1BO,EAAW,WACb,EAEA,UAAWE,KAAYD,EACrBF,EAAY,KAAK,CACf,OAAAN,EACA,YAAaS,EAAS,YACtB,SAAUnE,EAAc,GAAGiE,EAAW,SAAUE,EAAS,QAAQ,CAAA,CAClE,EAGCD,EAAU,SAAW,GAAGP,EAAM,KAAKM,CAAU,CAAA,CAG5C,OAAAN,CAAA,CAGT,wBAAwBD,EAA8C,CACpE,MAAMC,EAAsC,CAAC,EAE7C,GAAI3D,EAAc,IAAI0D,EAAQ,KAAK,cAAc,OAAO,EAAG,CACzD,MAAMU,EAAKpE,EAAc,IACvBA,EAAc,QAAQA,EAAc,IAAI0D,EAAQN,EAAK,YAAY,EAAG,CAAC,EACrE,KAAK,cAAc,QACrB,EACMQ,EAAK5D,EAAc,IACvBA,EAAc,QAAQA,EAAc,IAAIoE,EAAIhB,EAAK,YAAY,EAAG,CAAC,EACjE,KAAK,cAAc,KACrB,EACIQ,GACFD,EAAM,KAAK,CAAE,OAAAD,EAAQ,YAAaE,EAAI,SAAUQ,EAAI,EAGtD,MAAMC,EAAKrE,EAAc,IACvBA,EAAc,QAAQA,EAAc,IAAI0D,EAAQN,EAAK,aAAa,EAAG,CAAC,EACtE,KAAK,cAAc,QACrB,EACMS,EAAK7D,EAAc,IACvBA,EAAc,QAAQA,EAAc,IAAIqE,EAAIjB,EAAK,aAAa,EAAG,CAAC,EAClE,KAAK,cAAc,KACrB,EACIS,GACFF,EAAM,KAAK,CAAE,OAAAD,EAAQ,YAAaG,EAAI,SAAUQ,EAAI,CACtD,CAGF,GAAIrE,EAAc,IAAI0D,EAAQ,KAAK,cAAc,QAAQ,EAAG,CAC1D,MAAMY,EAAKtE,EAAc,IACvBA,EAAc,SACZA,EAAc,IAAI0D,EAAQN,EAAK,aAAa,EAC5C,CACF,EACA,KAAK,cAAc,QACrB,EACMU,EAAK9D,EAAc,IACvBA,EAAc,SAASA,EAAc,IAAIsE,EAAIlB,EAAK,aAAa,EAAG,CAAC,EACnE,KAAK,cAAc,KACrB,EACIU,GACFH,EAAM,KAAK,CAAE,OAAAD,EAAQ,YAAaI,EAAI,SAAUQ,EAAI,EAGtD,MAAMC,EAAKvE,EAAc,IACvBA,EAAc,SACZA,EAAc,IAAI0D,EAAQN,EAAK,cAAc,EAC7C,CACF,EACA,KAAK,cAAc,QACrB,EACMW,EAAK/D,EAAc,IACvBA,EAAc,SAASA,EAAc,IAAIuE,EAAInB,EAAK,cAAc,EAAG,CAAC,EACpE,KAAK,cAAc,KACrB,EACIW,GACFJ,EAAM,KAAK,CAAE,OAAAD,EAAQ,YAAaK,EAAI,SAAUQ,EAAI,CACtD,CAGK,OAAAZ,CAAA,CAGD,uBACN/B,EAC8B,CAC9B,OAAO,IAAIyB,EAA6B,CACtC,QAASrD,EAAc,IAAI,KAAK,cAAc,QAAS4B,EAAK,MAAM,EAC9D5B,EAAc,GAAG,KAAK,cAAc,QAAS4B,EAAK,WAAW,EAC7D,KAAK,cAAc,QACvB,SAAU5B,EAAc,IAAI,KAAK,cAAc,SAAU4B,EAAK,MAAM,EAChE5B,EAAc,GAAG,KAAK,cAAc,SAAU4B,EAAK,WAAW,EAC9D,KAAK,cAAc,SACvB,SAAU5B,EAAc,IACtB,KAAK,cAAc,SACnBA,EAAc,IAAI4B,EAAK,QAAQ,CACjC,EACA,MAAO,KAAK,cAAc,KAAA,CAC3B,CAAA,CAEL,CAEO,MAAM4C,GAAsC,CACjD,WAAWjD,EAA6D,CACtE,KAAM,CAAE,OAAAkD,EAAQ,MAAA3D,CAAM,EAAIS,EAAO,KACjC,OAAO,IAAI8B,EAA6B,CACtC,QACEoB,IAAWpD,iBAAe,MACtBP,EAAM,MACNd,EAAc,IAAIc,EAAM,KAAMA,EAAM,IAAI,EAC9C,SACE2D,IAAWpD,iBAAe,MACtBrB,EAAc,IAAIc,EAAM,MAAOA,EAAM,IAAI,EACzCA,EAAM,KACZ,SAAU2D,IAAWpD,iBAAe,MAAQP,EAAM,KAAOA,EAAM,MAC/D,MAAOd,EAAc,IAAIA,EAAc,GAAGc,EAAM,MAAOA,EAAM,IAAI,CAAC,CAAA,CACnE,CAAA,CAEL,EC1Ra4D,GAA8D,CACzE,OAAQrD,EAAe,eAAA,KACvB,MAAO,CACL,MAAO+B,EAAK,YACZ,KAAMA,EAAK,WACX,KAAM,CACR,EACA,MAAO,CACL,aAAc,EACd,oBAAqB,CAAA,CAEzB,EAEauB,GAAgE,CAC3E,OAAOpD,EAA+B,CAChC,OAAAA,EAAO,MAAM,SAAW,EACnBA,EAAO,KAAK,SAAWF,EAAAA,eAAe,MACzCuD,EAAA,eAAe,SACfA,EAAAA,eAAe,UAGnBrD,EAAO,KAAK,MAAM,cAAgB,IAClCA,EAAO,KAAK,MAAM,qBAAuB,GAElCqD,EAAe,eAAA,KAEjBA,EAAe,eAAA,OACxB,EAEA,YAAYrD,EAA+BK,EAAkC,CACpE,OAAAL,EAAO,MAAM,KAAMsD,GAAcnE,EAAYkB,EAAMiD,CAAS,CAAC,CACtE,EAEA,MAAMtD,EAA+B,CAC7B,MAAAuD,EAAYN,GAAoC,WAAWjD,CAAM,EACjEoC,EAAsC,CAAC,EAEvCH,EAAUsB,EAAU,WAAW,EACrC,GAAItB,EAAS,CACX,UAAWuB,KAAU/E,EAAc,UAAUwD,CAAO,EAClDG,EAAM,KAAK,GAAGmB,EAAU,mBAAmBC,CAAM,CAAC,EAE7C,OAAApB,CAAA,CAGH,MAAAF,EAASqB,EAAU,UAAU,EACnC,UAAWE,KAAShF,EAAc,UAAUyD,CAAM,EAChDE,EAAM,KAAK,GAAGmB,EAAU,mBAAmBE,CAAK,CAAC,EAG5C,OAAArB,CACT,EAEA,KAAKpC,EAA+BK,EAAkC,CACpE,GAAI,CAACL,EAAO,YAAYK,CAAI,EAC1B,MAAM,IAAI,MAAM,iBAAiB,KAAK,UAAUA,CAAI,CAAC,EAAE,EAGzD,MAAMd,EAAQ,CACZ,GAAGS,EAAO,KAAK,KACjB,EAEM0D,EAAQ,CAAE,GAAG1D,EAAO,KAAK,KAAM,EAG/B2D,EAASlF,EAAc,IAAI4B,EAAK,OAAQL,EAAO,KAAK,MAAM,IAAI,EAC9Df,EAAYR,EAAc,IAC9BA,EAAc,GAAG4B,EAAK,OAAQA,EAAK,QAAQ,CAC7C,EAEA,OAAAd,EAAM,MAAQd,EAAc,IAAIc,EAAM,MAAON,CAAS,EACtDM,EAAM,KAAOd,EAAc,IAAIc,EAAM,KAAMN,CAAS,EACpDM,EAAM,KAAOd,EAAc,IAAIc,EAAM,KAAMN,CAAS,EAGhDR,EAAc,IAAI4B,EAAK,OAAQL,EAAO,KAAK,MAAM,KAAK,EACxDT,EAAM,MAAQd,EAAc,GAAGc,EAAM,MAAOc,EAAK,WAAW,EAE5Dd,EAAM,KAAOd,EAAc,GAAGc,EAAM,KAAMc,EAAK,WAAW,EAGxDsD,IACFpE,EAAM,KAAOd,EAAc,GAAGc,EAAM,KAAMc,EAAK,WAAW,GAG5Dd,EAAM,KAAOd,EAAc,GACzBc,EAAM,KACNd,EAAc,IACZ4B,EAAK,YACL5B,EAAc,GAAGoD,EAAK,OAAQA,EAAK,MAAM,CAAA,CAE7C,EAGIpD,EAAc,IAAI4B,EAAK,YAAaL,EAAO,KAAK,MAAM,IAAI,GAC5DT,EAAM,KAAOd,EAAc,GAAGc,EAAM,KAAMc,EAAK,WAAW,EAC1DqD,EAAM,oBAAsB,GAE5BA,EAAM,qBAAuB,EAG3BrD,EAAK,SACPqD,EAAM,aAAe,EAErBA,EAAM,cAAgB,EAGjB,CACL,OACE1D,EAAO,KAAK,SAAWF,EAAAA,eAAe,MAClCA,EAAA,eAAe,KACfA,EAAAA,eAAe,MACrB,MAAAP,EACA,MAAAmE,CACF,CAAA,CAEJ,EAEaE,EAA+B,CAM1C,MAAMC,EAAkE,CACtE,OAAO,IAAIC,EAAA,eACT,CAAE,GAAGX,GAAkC,GAAGU,CAAK,EAC/CT,EACF,CAAA,CAEJ,EC/HMW,EAA0B,CAC9BrD,EAAE,EAAE,EACJA,EAAE,CAAC,EACHA,EAAE,EAAE,EACJA,EAAE,EAAE,EACJA,EAAE,EAAE,EACJA,EAAE,CAAC,EACHA,EAAE,EAAE,EACJA,EAAE,EAAE,EACJA,EAAE,CAAC,EACHA,EAAE,EAAE,EACJA,EAAE,EAAE,EACJA,EAAE,EAAE,EACJA,EAAE,CAAC,EACHA,EAAE,EAAE,EACJA,EAAE,EAAE,EACJA,EAAE,EAAE,EACJA,EAAE,EAAE,EACJA,EAAE,EAAE,EACJA,EAAE,EAAE,EACJA,EAAE,CAAC,EACHA,EAAE,EAAE,EACJA,EAAE,EAAE,EACJA,EAAE,EAAE,EACJA,EAAE,CAAC,EACHA,EAAE,EAAE,EACJA,EAAE,EAAE,EACJA,EAAE,CAAC,EACHA,EAAE,CAAC,EACHA,EAAE,EAAE,EACJA,EAAE,EAAE,EACJA,EAAE,CAAC,EACHA,EAAE,CAAC,CACL,EAEMsD,EAA6D,IAAI,IACrED,EAAwB,IAAI,CAACnE,EAAQqE,IAAgB,CAACrE,EAAQqE,CAAW,CAAC,CAC5E,EAEaC,EAAsD,CACjE,SAAS9D,EAAwD,CAC/D,MAAM+B,EAAS6B,EAAc,IAAI5D,EAAW,MAAM,EAClD,GAAI+B,IAAW,OACb,MAAM,IAAI,MAAM,wBAAwB/B,EAAW,MAAM,EAAE,EAE7D,MAAM+D,EAAcH,EAAc,IAAI5D,EAAW,WAAW,EAC5D,GAAI+D,IAAgB,OAClB,MAAM,IAAI,MAAM,6BAA6B/D,EAAW,WAAW,EAAE,EAEvE,MAAMgE,EAAW,CAAC,EAClB,UAAWpC,KAAWvD,EAAc,UAAU2B,EAAW,QAAQ,EAAG,CAC5D,MAAAiE,EAAaL,EAAc,IAAIhC,CAAO,EACxCqC,IAAe,QAAoBD,EAAA,KAAKC,CAAU,CAAA,CAGjD,MAAA,CAAE,OAAAlC,EAAQ,YAAAgC,EAAa,SAAAC,CAAS,CACzC,EAEA,aAAaE,EAAyD,CAC9D,MAAAnC,EAAS4B,EAAwBO,EAAY,MAAM,EACzD,GAAInC,IAAW,OACb,MAAM,IAAI,MAAM,wBAAwBmC,EAAY,MAAM,EAAE,EAExD,MAAAH,EAAcJ,EAAwBO,EAAY,WAAW,EACnE,GAAIH,IAAgB,OAClB,MAAM,IAAI,MAAM,6BAA6BG,EAAY,WAAW,EAAE,EAExE,IAAIF,EAAW,EACJ,UAAApC,KAAWsC,EAAY,SAAU,CACpC,MAAA1E,EAASmE,EAAwB/B,CAAO,EAC9C,GAAIpC,IAAW,OACb,MAAM,IAAI,MAAM,yBAAyBoC,CAAO,EAAE,EACxCoC,GAAAxE,CAAA,CAEP,MAAA,CAAE,OAAAuC,EAAQ,YAAAgC,EAAa,SAAAC,CAAS,CACzC,EAEA,UAAUG,EAA2D,CACnE,MAAMhF,EAAyB,CAAC,EAEhC,SAAW,CAACiF,EAAUtF,CAAG,IAAK6E,EAAwB,UAAW,CAE3D,KAAK,MAAMS,EAAW,CAAC,EAAI,IAAM,GAC7BjF,EAAA,KAAK,CAAE,KAAM,GAAO,MAAO,OAAW,SAAU,OAAW,EAGnE,MAAMkF,EAAe,CAAC,EAAEvF,EAAMqF,EAAY,OACpCG,EAAc,CAAC,EAAExF,EAAMqF,EAAY,MACnCI,EAAc,CAAC,EAAEzF,EAAMqF,EAAY,MAGzChF,EAAM,KAAK,CACT,KAAM,GACN,SAAAiF,EACA,MACEC,GAAgBC,EACZ,CACE,OAAQD,EACJ3E,EAAAA,eAAe,MACfA,EAAe,eAAA,KACnB,KAAM6E,CAAA,EAER,MAAA,CACP,EAGG,KAAK,MAAMH,EAAW,CAAC,EAAI,IAAM,GAC7BjF,EAAA,KAAK,CAAE,KAAM,GAAO,MAAO,OAAW,SAAU,OAAW,CACnE,CAGK,OAAAA,CAAA,CAEX,EAEaqF,GAAyD,CACpE,MAAO,CAAC,EACR,OAAQ,CAAA,CACV,EAIaC,GAAkB,CAO7B,MACEhB,EACA5D,EACqB,CACf,MAAAD,EAAS4D,EAA6B,MAAMC,CAAI,EACtD,OAAO,IAAI9D,EACTC,EACA,CAAE,GAAG4E,GAAiC,GAAG3E,CAAQ,EACjDiE,CACF,CAAA,CAEJ,EC5HaY,EAA0B,CACrC,MAA4C,CAC1C,QAAA5E,EACA,SAAA6E,EACA,QAAAC,CAAA,EAI8B,CAC9B,MAAO,OAAOC,GAAS,CACf,MAAA7E,EAAa,MAAM2E,EAAS,CAChC,QAAAC,EACA,OAAQC,EAAK,MAAA,CACd,EACM,OAAA/E,EAAQ,SAASE,CAAU,CACpC,CAAA,CAEJ,ECtCA,eAAsB8E,GAAsC,CAC1D,QAAS,CAAE,SAAAC,EAAU,mBAAAC,EAAoB,WAAAC,EAAa,EAAK,EAC3D,OAAArF,CACF,EAG2C,CACzC,IAAIsF,EAAmB,OAAO,kBAC1BC,EAEO,UAAAlF,KAAQL,EAAO,MAAO,CACzB,MAAAwF,EAAOxF,EAAO,MAAM,EAC1BwF,EAAK,KAAKnF,CAAI,EAER,MAAAoF,EAAa,CAAE,MAAMC,EAAgB,CACzC,KAAM,CACJ,OAAQF,EACR,MAAO,OAAO,kBACd,KAAM,OAAO,kBACb,MAAOL,EAAW,CACpB,EACA,QAAS,CAAE,mBAAAC,EAAoB,WAAAC,CAAW,CAAA,CAC3C,EACGI,GAAcH,IACGA,EAAAG,EACNF,EAAAlF,EACf,CAGF,GAAIkF,IAAe,OACX,MAAA,IAAI,MAAM,oBAAoB,EAG/B,OAAAA,CACT,CAYA,eAAeG,EAA4C,CACzD,KAAM,CAAE,OAAA1F,EAAQ,MAAA2F,EAAO,KAAAC,EAAM,MAAAC,CAAM,EACnC,QAAS,CAAE,mBAAAT,EAAoB,WAAAC,CAAW,CAC5C,EAAwC,CACtC,GAAIQ,IAAU,EACZ,OAAOR,EACHS,EAAiB,CACf,KAAM,CAAE,OAAA9F,EAAQ,MAAA2F,EAAO,KAAAC,CAAK,EAC5B,QAAS,CAAE,mBAAAR,CAAmB,CAAA,CAC/B,EACDA,EAAmBpF,CAAM,EAEpB,UAAAK,KAAQL,EAAO,MAAO,CACzB,MAAAwF,EAAOxF,EAAO,MAAM,EAC1BwF,EAAK,KAAKnF,CAAI,EAER,MAAAoF,EAAa,CAAE,MAAMC,EAAgB,CACzC,KAAM,CACJ,OAAQF,EACR,MAAO,CAACI,EACR,KAAM,CAACD,EACP,MAAOE,EAAQ,CACjB,EACA,QAAS,CAAE,mBAAAT,EAAoB,WAAAC,CAAuB,CAAA,CACvD,EACG,GAAAI,GAAcG,EAAa,OAAAA,EACvBD,EAAA,KAAK,IAAIF,EAAYE,CAAK,CAAA,CAG7B,OAAAA,CACT,CAaA,eAAeG,EAA6C,CAC1D,KAAM,CAAE,OAAA9F,EAAQ,MAAA2F,EAAO,KAAAC,CAAK,EAC5B,QAAS,CAAE,mBAAAR,CAAmB,CAChC,EAAyC,CACjC,MAAAK,EAAaL,EAAmBpF,CAAM,EACxC,GAAAyF,GAAcG,EAAa,OAAAA,EACvBD,EAAA,KAAK,IAAIF,EAAYE,CAAK,EAEvB,UAAAtF,KAAQL,EAAO,MAAO,CAC3B,GAAA,CAACK,EAAK,SAAU,SACd,MAAAmF,EAAOxF,EAAO,MAAM,EAC1BwF,EAAK,KAAKnF,CAAI,EAER,MAAA0F,EAAiB,CAAE,MAAMD,EAAiB,CAC9C,KAAM,CAAE,OAAQN,EAAM,MAAO,CAACI,EAAM,KAAM,CAACD,CAAM,EACjD,QAAS,CAAE,mBAAAP,CAAmB,CAAA,CAC/B,EAEG,GAAAW,GAAkBH,EAAa,OAAAA,EAC3BD,EAAA,KAAK,IAAII,EAAgBJ,CAAK,CAAA,CAGjC,OAAAA,CACT,CCzHA,eAAsBK,GAAmC,CACvD,OAAAhG,CACF,EAEE,CACA,GAAIA,EAAO,MAAM,SAAW,EAAS,MAAA,IAAI,MAAM,gBAAgB,EAEzD,MAAAiG,EAAc,KAAK,MAAM,KAAK,SAAWjG,EAAO,MAAM,MAAM,EAG3D,OAFkBA,EAAO,MAAMiG,CAAW,CAGnD,CCHA,MAAMC,GAAiB,CACrB,CAAC7C,EAAA,eAAe,SAAS,EAAGvD,EAAAA,eAAe,MAC3C,CAACuD,EAAA,eAAe,QAAQ,EAAGvD,iBAAe,IAC5C,EAQaqG,GACXnG,GACG,CACH,MAAMoG,EAASpG,EAAO,OAClB,OAAAoG,IAAW/C,iBAAe,QACxB+C,IAAW/C,EAAA,eAAe,KAAa,OAAO,kBAC3CrD,EAAO,KAAK,SAAWkG,GAAeE,CAAM,EAC/C,OAAO,kBACP,OAAO,kBAENC,GAAmBrG,CAAM,CAClC,EAEMsG,GAAe,GACfC,GAAc,GACdC,GAAkB,GAClBC,GAAmC,GACnCC,GAAmC,EAEzC,SAASL,GAAmBrG,EAAwC,CAClE,MAAMkD,EACJlD,EAAO,KAAK,SAAWF,EAAe,eAAA,MAClCE,EAAO,KAAK,MAAM,MAClBA,EAAO,KAAK,MAAM,KAClB2G,EACJ3G,EAAO,KAAK,SAAWF,EAAe,eAAA,MAClCE,EAAO,KAAK,MAAM,KAClBA,EAAO,KAAK,MAAM,MAClB4G,EAAc1D,EAASlD,EAAO,KAAK,MAAM,KACzC6G,EAAgBF,EAAW3G,EAAO,KAAK,MAAM,KAE7C8G,EACJ9G,EAAO,KAAK,SAAWF,iBAAe,MAAQ+B,EAAK,OAASA,EAAK,OAC7DkF,EACJ/G,EAAO,KAAK,SAAWF,iBAAe,MAAQ+B,EAAK,OAASA,EAAK,OAE7DmF,EAAevI,EAAc,YAAYyE,CAAM,EAC/C+D,EAAiBxI,EAAc,YAAYkI,CAAQ,EACnDO,EAAmBzI,EAAc,YAAYmI,CAAW,EACxDO,EAAqB1I,EAAc,YAAYoI,CAAa,EAC5DO,EAAqB3I,EAAc,YAAYyE,EAAS4D,CAAQ,EAChEO,EAAuB5I,EAAc,YACzCkI,EAAWI,CACb,EACMO,EAAmC7I,EAAc,YACrDyE,EAASrB,EAAK,yBAChB,EACM0F,EAAqC9I,EAAc,YACvDkI,EAAW9E,EAAK,yBAClB,EACM2F,EAAmC/I,EAAc,YACrDyE,EAASrB,EAAK,yBAChB,EACM4F,EAAqChJ,EAAc,YACvDkI,EAAW9E,EAAK,yBAClB,EAEA,OACGmF,EAAeC,GAAkBX,IACjCY,EAAmBC,GAAsBZ,IACzCa,EAAqBC,GAAwBb,IAC7Cc,EAAmCC,GAClCd,IACDe,EAAmCC,GAClCf,EAEN,CAIO,MAAMgB,GAAiC,CAK5C,QAAkC,CAChC,OAAO5C,EAAwB,MAAM,CACnC,QAASZ,EACT,SAAU8B,GACV,QAAS,MAAA,CACV,CACH,EAMA,UACEhB,EACyB,CACzB,MAAM2C,EAA+C,CACnD,SAAU3C,EAAQ,UAAY,EAC9B,WAAYA,EAAQ,YAAc,GAClC,mBAAoBA,EAAQ,oBAAsBmB,EACpD,EAEA,OAAOrB,EAAwB,MAAM,CACnC,QAASZ,EACT,SAAUgB,GACV,QAASyC,CAAA,CACV,CAAA,CAEL"}