code: int nextSymbol() {
          // Move to next group selector if required
          if (++groupPosition % HUFFMAN_GROUP_RUN_LENGTH == 0) {
              groupIndex++;
              if (groupIndex == selectors.length) {
                  throw new DecompressionException("error decoding block");
              }
              currentTable = selectors[groupIndex] & 0xff;
          }
  
          final Bzip2BitReader reader = this.reader;
          final int currentTable = this.currentTable;
          final int[] tableLimits = codeLimits[currentTable];
          final int[] tableBases = codeBases[currentTable];
          final int[] tableSymbols = codeSymbols[currentTable];
          int codeLength = minimumLengths[currentTable];
  
          // Starting with the minimum bit length for the table, read additional bits one at a time
          // until a complete code is recognised
          int codeBits = reader.readBits(codeLength);
          for (; codeLength <= HUFFMAN_DECODE_MAX_CODE_LENGTH; codeLength++) {
              if (codeBits <= tableLimits[codeLength]) {
                  // Convert the code to a symbol index and return
                  return tableSymbols[codeBits - tableBases[codeLength]];
              }
              codeBits = codeBits << 1 | reader.readBits(1);
          }
  
          throw new DecompressionException("a valid code was not recognised");
      }
docs: Decodes and returns the next symbol.
  @return The decoded symbol