code: Version readVersion() throws FormatException {
  
      if (parsedVersion != null) {
        return parsedVersion;
      }
  
      int dimension = bitMatrix.getHeight();
  
      int provisionalVersion = (dimension - 17) / 4;
      if (provisionalVersion <= 6) {
        return Version.getVersionForNumber(provisionalVersion);
      }
  
      // Read top-right version info: 3 wide by 6 tall
      int versionBits = 0;
      int ijMin = dimension - 11;
      for (int j = 5; j >= 0; j--) {
        for (int i = dimension - 9; i >= ijMin; i--) {
          versionBits = copyBit(i, j, versionBits);
        }
      }
  
      Version theParsedVersion = Version.decodeVersionInformation(versionBits);
      if (theParsedVersion != null && theParsedVersion.getDimensionForVersion() == dimension) {
        parsedVersion = theParsedVersion;
        return theParsedVersion;
      }
  
      // Hmm, failed. Try bottom left: 6 wide by 3 tall
      versionBits = 0;
      for (int i = 5; i >= 0; i--) {
        for (int j = dimension - 9; j >= ijMin; j--) {
          versionBits = copyBit(i, j, versionBits);
        }
      }
  
      theParsedVersion = Version.decodeVersionInformation(versionBits);
      if (theParsedVersion != null && theParsedVersion.getDimensionForVersion() == dimension) {
        parsedVersion = theParsedVersion;
        return theParsedVersion;
      }
      throw FormatException.getFormatInstance();
    }
docs: <p>Reads version information from one of its two locations within the QR Code.</p>
  
  @return {@link Version} encapsulating the QR Code's version
  @throws FormatException if both version information locations cannot be parsed as
  the valid encoding of version information