{"version":3,"file":"triple-des.mjs","sources":["../src/block-offset.ts","../src/des.ts","../src/triple-des.ts"],"sourcesContent":["import type { BlockCipher } from '@jscrypto/core';\n\nexport function encryptWithBlockOffset(\n  cipher: BlockCipher,\n  input: Uint8Array,\n  inputOffset: number,\n  output: Uint8Array,\n  outputOffset: number,\n): void {\n  if (cipher.encryptBlock) {\n    cipher.encryptBlock(input, inputOffset, output, outputOffset);\n    return;\n  }\n\n  cipher.encrypt(\n    input.subarray(inputOffset, inputOffset + cipher.blockSize),\n    output.subarray(outputOffset, outputOffset + cipher.blockSize),\n  );\n}\n\nexport function decryptWithBlockOffset(\n  cipher: BlockCipher,\n  input: Uint8Array,\n  inputOffset: number,\n  output: Uint8Array,\n  outputOffset: number,\n): void {\n  if (cipher.decryptBlock) {\n    cipher.decryptBlock(input, inputOffset, output, outputOffset);\n    return;\n  }\n\n  cipher.decrypt(\n    input.subarray(inputOffset, inputOffset + cipher.blockSize),\n    output.subarray(outputOffset, outputOffset + cipher.blockSize),\n  );\n}\n","import type { BlockCipher, CipherComponent, PresetComponent } from '@jscrypto/core';\n\nexport const des: CipherComponent<'DES'> = {\n  kind: 'cipher',\n  name: 'DES',\n  type: 'block',\n  blockSize: 8,\n  keySizes: [8],\n  create(key) {\n    return createDesCipher(key);\n  },\n};\n\nexport const desPreset: PresetComponent<'des'> = {\n  kind: 'preset',\n  name: 'des',\n  components() {\n    return [des];\n  },\n};\n\nexport function createDesCipher(key: Uint8Array): BlockCipher {\n  if (key.length !== 8) {\n    throw new Error('DES key must be 64 bits.');\n  }\n\n  const subkeys = createSubkeys(key);\n  const tmp = [0, 0];\n\n  return {\n    blockSize: 8,\n\n    encryptBlock(input, inputOffset, output, outputOffset) {\n      processBlock(input, inputOffset, output, outputOffset, subkeys, tmp, true);\n    },\n\n    decryptBlock(input, inputOffset, output, outputOffset) {\n      processBlock(input, inputOffset, output, outputOffset, subkeys, tmp, false);\n    },\n\n    encrypt(input, output) {\n      return processBlocks(input, output, subkeys, true, 'DES');\n    },\n\n    decrypt(input, output) {\n      return processBlocks(input, output, subkeys, false, 'DES');\n    },\n  };\n}\n\nfunction processBlocks(\n  input: Uint8Array,\n  output: Uint8Array,\n  subkeys: readonly number[],\n  encrypting: boolean,\n  name: string,\n): Uint8Array {\n  assertBlocks(input, output, name);\n  const tmp = [0, 0];\n  for (let offset = 0; offset < input.length; offset += 8) {\n    processBlock(input, offset, output, offset, subkeys, tmp, encrypting);\n  }\n  return output;\n}\n\nfunction createSubkeys(key: Uint8Array): number[] {\n  const subkeys = new Array<number>(32);\n  let keyLeft = readUint32BE(key, 0);\n  let keyRight = readUint32BE(key, 4);\n  const tmp = [0, 0];\n\n  permutedChoice1(keyLeft, keyRight, tmp, 0);\n  keyLeft = tmp[0];\n  keyRight = tmp[1];\n\n  for (let index = 0; index < subkeys.length; index += 2) {\n    const shift = KEY_SHIFTS[index >>> 1];\n    keyLeft = rotateLeft28(keyLeft, shift);\n    keyRight = rotateLeft28(keyRight, shift);\n    permutedChoice2(keyLeft, keyRight, subkeys, index);\n  }\n\n  return subkeys;\n}\n\nfunction processBlock(\n  input: Uint8Array,\n  inputOffset: number,\n  output: Uint8Array,\n  outputOffset: number,\n  subkeys: readonly number[],\n  tmp: number[],\n  encrypting: boolean,\n): void {\n  let left = readUint32BE(input, inputOffset);\n  let right = readUint32BE(input, inputOffset + 4);\n\n  initialPermutation(left, right, tmp, 0);\n  left = tmp[0];\n  right = tmp[1];\n\n  if (encrypting) {\n    for (let index = 0; index < subkeys.length; index += 2) {\n      const nextLeft = right;\n      right = (left ^ feistel(right, subkeys[index], subkeys[index + 1], tmp)) >>> 0;\n      left = nextLeft;\n    }\n    reverseInitialPermutation(right, left, tmp, 0);\n  } else {\n    const originalLeft = left;\n    left = right;\n    right = originalLeft;\n    for (let index = subkeys.length - 2; index >= 0; index -= 2) {\n      const nextLeft = left;\n      left = (right ^ feistel(left, subkeys[index], subkeys[index + 1], tmp)) >>> 0;\n      right = nextLeft;\n    }\n    reverseInitialPermutation(left, right, tmp, 0);\n  }\n\n  writeUint32BE(output, tmp[0], outputOffset);\n  writeUint32BE(output, tmp[1], outputOffset + 4);\n}\n\nfunction feistel(right: number, keyLeft: number, keyRight: number, tmp: number[]): number {\n  expand(right, tmp, 0);\n  return permute(substitute((keyLeft ^ tmp[0]) >>> 0, (keyRight ^ tmp[1]) >>> 0));\n}\n\nfunction readUint32BE(bytes: Uint8Array, offset: number): number {\n  return (\n    (bytes[offset] << 24)\n    | (bytes[offset + 1] << 16)\n    | (bytes[offset + 2] << 8)\n    | bytes[offset + 3]\n  ) >>> 0;\n}\n\nfunction writeUint32BE(bytes: Uint8Array, value: number, offset: number): void {\n  bytes[offset] = value >>> 24;\n  bytes[offset + 1] = value >>> 16;\n  bytes[offset + 2] = value >>> 8;\n  bytes[offset + 3] = value;\n}\n\n// Word-based DES helpers adapted from des.js (MIT, Fedor Indutny).\nfunction initialPermutation(inputLeft: number, inputRight: number, output: number[], offset: number): void {\n  let outputLeft = 0;\n  let outputRight = 0;\n\n  for (let bit = 6; bit >= 0; bit -= 2) {\n    for (let shift = 0; shift <= 24; shift += 8) {\n      outputLeft = (outputLeft << 1) | ((inputRight >>> (shift + bit)) & 1);\n    }\n    for (let shift = 0; shift <= 24; shift += 8) {\n      outputLeft = (outputLeft << 1) | ((inputLeft >>> (shift + bit)) & 1);\n    }\n  }\n\n  for (let bit = 6; bit >= 0; bit -= 2) {\n    for (let shift = 1; shift <= 25; shift += 8) {\n      outputRight = (outputRight << 1) | ((inputRight >>> (shift + bit)) & 1);\n    }\n    for (let shift = 1; shift <= 25; shift += 8) {\n      outputRight = (outputRight << 1) | ((inputLeft >>> (shift + bit)) & 1);\n    }\n  }\n\n  output[offset] = outputLeft >>> 0;\n  output[offset + 1] = outputRight >>> 0;\n}\n\nfunction reverseInitialPermutation(inputLeft: number, inputRight: number, output: number[], offset: number): void {\n  let outputLeft = 0;\n  let outputRight = 0;\n\n  for (let bit = 0; bit < 4; bit++) {\n    for (let shift = 24; shift >= 0; shift -= 8) {\n      outputLeft = (outputLeft << 1) | ((inputRight >>> (shift + bit)) & 1);\n      outputLeft = (outputLeft << 1) | ((inputLeft >>> (shift + bit)) & 1);\n    }\n  }\n\n  for (let bit = 4; bit < 8; bit++) {\n    for (let shift = 24; shift >= 0; shift -= 8) {\n      outputRight = (outputRight << 1) | ((inputRight >>> (shift + bit)) & 1);\n      outputRight = (outputRight << 1) | ((inputLeft >>> (shift + bit)) & 1);\n    }\n  }\n\n  output[offset] = outputLeft >>> 0;\n  output[offset + 1] = outputRight >>> 0;\n}\n\nfunction permutedChoice1(inputLeft: number, inputRight: number, output: number[], offset: number): void {\n  let outputLeft = 0;\n  let outputRight = 0;\n  let bit = 0;\n\n  for (bit = 7; bit >= 5; bit--) {\n    for (let shift = 0; shift <= 24; shift += 8) {\n      outputLeft = (outputLeft << 1) | ((inputRight >> (shift + bit)) & 1);\n    }\n    for (let shift = 0; shift <= 24; shift += 8) {\n      outputLeft = (outputLeft << 1) | ((inputLeft >> (shift + bit)) & 1);\n    }\n  }\n  for (let shift = 0; shift <= 24; shift += 8) {\n    outputLeft = (outputLeft << 1) | ((inputRight >> (shift + bit)) & 1);\n  }\n\n  for (bit = 1; bit <= 3; bit++) {\n    for (let shift = 0; shift <= 24; shift += 8) {\n      outputRight = (outputRight << 1) | ((inputRight >> (shift + bit)) & 1);\n    }\n    for (let shift = 0; shift <= 24; shift += 8) {\n      outputRight = (outputRight << 1) | ((inputLeft >> (shift + bit)) & 1);\n    }\n  }\n  for (let shift = 0; shift <= 24; shift += 8) {\n    outputRight = (outputRight << 1) | ((inputLeft >> (shift + bit)) & 1);\n  }\n\n  output[offset] = outputLeft >>> 0;\n  output[offset + 1] = outputRight >>> 0;\n}\n\nfunction rotateLeft28(value: number, shift: number): number {\n  return ((value << shift) & 0xfffffff) | (value >>> (28 - shift));\n}\n\nconst PERMUTED_CHOICE2_TABLE = [\n  14, 11, 17, 4, 27, 23, 25, 0,\n  13, 22, 7, 18, 5, 9, 16, 24,\n  2, 20, 12, 21, 1, 8, 15, 26,\n  15, 4, 25, 19, 9, 1, 26, 16,\n  5, 11, 23, 8, 12, 7, 17, 0,\n  22, 3, 10, 14, 6, 20, 27, 24,\n];\n\nfunction permutedChoice2(inputLeft: number, inputRight: number, output: number[], offset: number): void {\n  let outputLeft = 0;\n  let outputRight = 0;\n  const halfLength = PERMUTED_CHOICE2_TABLE.length >>> 1;\n\n  for (let index = 0; index < halfLength; index++) {\n    outputLeft = (outputLeft << 1) | ((inputLeft >>> PERMUTED_CHOICE2_TABLE[index]) & 1);\n  }\n  for (let index = halfLength; index < PERMUTED_CHOICE2_TABLE.length; index++) {\n    outputRight = (outputRight << 1) | ((inputRight >>> PERMUTED_CHOICE2_TABLE[index]) & 1);\n  }\n\n  output[offset] = outputLeft >>> 0;\n  output[offset + 1] = outputRight >>> 0;\n}\n\nfunction expand(right: number, output: number[], offset: number): void {\n  let outputLeft = ((right & 1) << 5) | (right >>> 27);\n  let outputRight = 0;\n\n  for (let bit = 23; bit >= 15; bit -= 4) {\n    outputLeft = (outputLeft << 6) | ((right >>> bit) & 0x3f);\n  }\n  for (let bit = 11; bit >= 3; bit -= 4) {\n    outputRight |= (right >>> bit) & 0x3f;\n    outputRight <<= 6;\n  }\n  outputRight |= ((right & 0x1f) << 1) | (right >>> 31);\n\n  output[offset] = outputLeft >>> 0;\n  output[offset + 1] = outputRight >>> 0;\n}\n\nfunction substitute(inputLeft: number, inputRight: number): number {\n  let output = 0;\n  for (let index = 0; index < 4; index++) {\n    output = (output << 4) | S_TABLE[index * 0x40 + ((inputLeft >>> (18 - index * 6)) & 0x3f)];\n  }\n  for (let index = 0; index < 4; index++) {\n    output = (output << 4) | S_TABLE[4 * 0x40 + index * 0x40 + ((inputRight >>> (18 - index * 6)) & 0x3f)];\n  }\n  return output >>> 0;\n}\n\nconst PERMUTE_TABLE = [\n  16, 25, 12, 11, 3, 20, 4, 15, 31, 17, 9, 6, 27, 14, 1, 22,\n  30, 24, 8, 18, 0, 5, 29, 23, 13, 19, 2, 26, 10, 21, 28, 7,\n];\n\nfunction permute(value: number): number {\n  let output = 0;\n  for (const bit of PERMUTE_TABLE) {\n    output = (output << 1) | ((value >>> bit) & 1);\n  }\n  return output >>> 0;\n}\n\nconst KEY_SHIFTS = [\n  1, 1, 2, 2, 2, 2, 2, 2,\n  1, 2, 2, 2, 2, 2, 2, 1,\n];\n\nconst S_TABLE = [\n  14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1,\n  3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8,\n  4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7,\n  15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13,\n  15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14,\n  9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5,\n  0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2,\n  5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9,\n  10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10,\n  1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1,\n  13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7,\n  11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12,\n  7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3,\n  1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9,\n  10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8,\n  15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14,\n  2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1,\n  8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6,\n  4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13,\n  15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3,\n  12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5,\n  0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8,\n  9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10,\n  7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13,\n  4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10,\n  3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6,\n  1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7,\n  10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12,\n  13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4,\n  10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2,\n  7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13,\n  0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11,\n];\n\nfunction assertBlocks(input: Uint8Array, output: Uint8Array, name: string): void {\n  if (input.length % 8 !== 0) {\n    throw new Error(`${name} input length must be a multiple of 64 bits.`);\n  }\n  if (output.length !== input.length) {\n    throw new Error(`${name} output length must equal input length.`);\n  }\n}\n","import type { BlockCipher, CipherComponent, PresetComponent } from '@jscrypto/core';\nimport { decryptWithBlockOffset, encryptWithBlockOffset } from './block-offset.js';\nimport { createDesCipher } from './des.js';\n\nexport const tripleDes: CipherComponent<'TripleDES'> = {\n  kind: 'cipher',\n  name: 'TripleDES',\n  type: 'block',\n  blockSize: 8,\n  keySizes: [16, 24],\n  create(key) {\n    return createTripleDesCipher(key);\n  },\n};\n\nexport const tripleDesPreset: PresetComponent<'triple-des'> = {\n  kind: 'preset',\n  name: 'triple-des',\n  components() {\n    return [tripleDes];\n  },\n};\n\nexport function createTripleDesCipher(key: Uint8Array): BlockCipher {\n  if (key.length !== 16 && key.length !== 24) {\n    throw new Error('Triple DES key must be 128 or 192 bits.');\n  }\n\n  const first = createDesCipher(key.subarray(0, 8));\n  const second = createDesCipher(key.subarray(8, 16));\n  const third = createDesCipher(key.length === 24 ? key.subarray(16, 24) : key.subarray(0, 8));\n  const firstOutput = new Uint8Array(8);\n  const secondOutput = new Uint8Array(8);\n\n  return {\n    blockSize: 8,\n\n    encryptBlock(input, inputOffset, output, outputOffset) {\n      encryptTripleBlockAt(input, inputOffset, output, outputOffset, first, second, third, firstOutput, secondOutput);\n    },\n\n    decryptBlock(input, inputOffset, output, outputOffset) {\n      decryptTripleBlockAt(input, inputOffset, output, outputOffset, first, second, third, firstOutput, secondOutput);\n    },\n\n    encrypt(input, output) {\n      assertBlocks(input, output);\n      for (let offset = 0; offset < input.length; offset += 8) {\n        encryptTripleBlockAt(input, offset, output, offset, first, second, third, firstOutput, secondOutput);\n      }\n      return output;\n    },\n\n    decrypt(input, output) {\n      assertBlocks(input, output);\n      for (let offset = 0; offset < input.length; offset += 8) {\n        decryptTripleBlockAt(input, offset, output, offset, first, second, third, firstOutput, secondOutput);\n      }\n      return output;\n    },\n  };\n}\n\nfunction encryptTripleBlockAt(\n  input: Uint8Array,\n  inputOffset: number,\n  output: Uint8Array,\n  outputOffset: number,\n  first: BlockCipher,\n  second: BlockCipher,\n  third: BlockCipher,\n  firstOutput: Uint8Array,\n  secondOutput: Uint8Array,\n): void {\n  encryptWithBlockOffset(first, input, inputOffset, firstOutput, 0);\n  decryptWithBlockOffset(second, firstOutput, 0, secondOutput, 0);\n  encryptWithBlockOffset(third, secondOutput, 0, output, outputOffset);\n}\n\nfunction decryptTripleBlockAt(\n  input: Uint8Array,\n  inputOffset: number,\n  output: Uint8Array,\n  outputOffset: number,\n  first: BlockCipher,\n  second: BlockCipher,\n  third: BlockCipher,\n  thirdOutput: Uint8Array,\n  secondOutput: Uint8Array,\n): void {\n  decryptWithBlockOffset(third, input, inputOffset, thirdOutput, 0);\n  encryptWithBlockOffset(second, thirdOutput, 0, secondOutput, 0);\n  decryptWithBlockOffset(first, secondOutput, 0, output, outputOffset);\n}\n\nfunction assertBlocks(input: Uint8Array, output: Uint8Array): void {\n  if (input.length % 8 !== 0) {\n    throw new Error('Triple DES input length must be a multiple of 64 bits.');\n  }\n  if (output.length !== input.length) {\n    throw new Error('Triple DES output length must equal input length.');\n  }\n}\n"],"names":["assertBlocks"],"mappings":"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AC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;AACnD,IAAA,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;AACrD,IAAA,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;AACpD,IAAA,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACpD,IAAA,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACrD,IAAA,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACnD,IAAA,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;AACnD,IAAA,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACrD,IAAA,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAClD,IAAA,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;AACtD,IAAA,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;AACpD,IAAA,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACpD,IAAA,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACrD,IAAA,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;AACnD,IAAA,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACrD,IAAA,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACnD,IAAA,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;AACrD,IAAA,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;AACnD,IAAA,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACpD,IAAA,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;AACpD,IAAA,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;AACpD,IAAA,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;AACpD,IAAA,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE;AACrD,IAAA,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACnD,IAAA,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACrD,IAAA,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;AACnD,IAAA,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACpD,IAAA,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACpD,IAAA,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;AACpD,IAAA,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAA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"}