code: def getBWTRange(self, start, end):
          '''
          This function masks the complexity of retrieving a chunk of the BWT from the compressed format
          @param start - the beginning of the range to retrieve
          @param end - the end of the range in normal python notation (bwt[end] is not part of the return)
          @return - a range of integers representing the characters in the bwt from start to end
          '''
          #set aside an array block to fill
          startBlockIndex = start >> self.bitPower
          endBlockIndex = int(math.floor(float(end)/self.binSize))
          trueStart = startBlockIndex*self.binSize
          
          #first we will extract the range of blocks
          return self.decompressBlocks(startBlockIndex, endBlockIndex)[start-trueStart:end-trueStartf getBWTRange(self, start, end):
          '''
          This function masks the complexity of retrieving a chunk of the BWT from the compressed format
          @param start - the beginning of the range to retrieve
          @param end - the end of the range in normal python notation (bwt[end] is not part of the return)
          @return - a range of integers representing the characters in the bwt from start to end
          '''
          #set aside an array block to fill
          startBlockIndex = start >> self.bitPower
          endBlockIndex = int(math.floor(float(end)/self.binSize))
          trueStart = startBlockIndex*self.binSize
          
          #first we will extract the range of blocks
          return self.decompressBlocks(startBlockIndex, endBlockIndex)[start-trueStart:end-trueStart]
docs: This function masks the complexity of retrieving a chunk of the BWT from the compressed format
          @param start - the beginning of the range to retrieve
          @param end - the end of the range in normal python notation (bwt[end] is not part of the return)
          @return - a range of integers representing the characters in the bwt from start to end