Program: 101696
Project: 101696
Buggy source:
public String getRawText(Key key) throws BookException {
  checkActive();
  String charset=getBookMetaData().getModuleCharset();
  Verse verse=KeyUtil.getVerse(key);
  try {
    int testament=SwordConstants.getTestament(verse);
    long index=SwordConstants.getIndex(verse);
    if (compRaf[testament] == null) {
      return "String_Node_Str";
    }
    byte[] temp=SwordUtil.readRAF(compRaf[testament],index * COMP_ENTRY_SIZE,COMP_ENTRY_SIZE);
    if (temp == null || temp.length == 0) {
      return "String_Node_Str";
    }
    int blockNum=SwordUtil.decodeLittleEndian32AsInt(temp,0);
    int verseStart=SwordUtil.decodeLittleEndian32AsInt(temp,4);
    int verseSize=SwordUtil.decodeLittleEndian16(temp,8);
    byte[] uncompressed=null;
    if (blockNum == lastBlockNum && testament == lastTestament) {
      uncompressed=lastUncompressed;
    }
 else {
      temp=SwordUtil.readRAF(idxRaf[testament],blockNum * IDX_ENTRY_SIZE,IDX_ENTRY_SIZE);
      if (temp == null || temp.length == 0) {
        return "String_Node_Str";
      }
      long blockStart=SwordUtil.decodeLittleEndian32(temp,0);
      int blockSize=SwordUtil.decodeLittleEndian32AsInt(temp,4);
      int uncompressedSize=SwordUtil.decodeLittleEndian32AsInt(temp,8);
      byte[] data=SwordUtil.readRAF(textRaf[testament],blockStart,blockSize);
      decipher(data);
      uncompressed=SwordUtil.uncompress(data,uncompressedSize);
      lastBlockNum=blockNum;
      lastTestament=testament;
      lastUncompressed=uncompressed;
    }
    byte[] chopped=new byte[verseSize];
    System.arraycopy(uncompressed,verseStart,chopped,0,verseSize);
    return SwordUtil.decode(key,chopped,charset);
  }
 catch (  Exception ex) {
    throw new BookException(Msg.READ_FAIL,ex,new Object[]{verse.getName()});
  }
}

Fixed version (ground truth):
public String getRawText(Key key) throws BookException {
  checkActive();
  String charset=getBookMetaData().getModuleCharset();
  Verse verse=KeyUtil.getVerse(key);
  try {
    int testament=SwordConstants.getTestament(verse);
    int index=SwordConstants.getIndex(verse);
    if (compRaf[testament] == null) {
      return "String_Node_Str";
    }
    byte[] temp=SwordUtil.readRAF(compRaf[testament],index * COMP_ENTRY_SIZE,COMP_ENTRY_SIZE);
    if (temp == null || temp.length == 0) {
      return "String_Node_Str";
    }
    int blockNum=SwordUtil.decodeLittleEndian32(temp,0);
    int verseStart=SwordUtil.decodeLittleEndian32(temp,4);
    int verseSize=SwordUtil.decodeLittleEndian16(temp,8);
    byte[] uncompressed=null;
    if (blockNum == lastBlockNum && testament == lastTestament) {
      uncompressed=lastUncompressed;
    }
 else {
      temp=SwordUtil.readRAF(idxRaf[testament],blockNum * IDX_ENTRY_SIZE,IDX_ENTRY_SIZE);
      if (temp == null || temp.length == 0) {
        return "String_Node_Str";
      }
      int blockStart=SwordUtil.decodeLittleEndian32(temp,0);
      int blockSize=SwordUtil.decodeLittleEndian32(temp,4);
      int uncompressedSize=SwordUtil.decodeLittleEndian32(temp,8);
      byte[] data=SwordUtil.readRAF(textRaf[testament],blockStart,blockSize);
      decipher(data);
      uncompressed=SwordUtil.uncompress(data,uncompressedSize);
      lastBlockNum=blockNum;
      lastTestament=testament;
      lastUncompressed=uncompressed;
    }
    byte[] chopped=new byte[verseSize];
    System.arraycopy(uncompressed,verseStart,chopped,0,verseSize);
    return SwordUtil.decode(key,chopped,charset);
  }
 catch (  Exception ex) {
    throw new BookException(Msg.READ_FAIL,ex,new Object[]{verse.getName()});
  }
}