docs: private void parseManifest(final FastZipEntry manifestZipEntry, final LogNode log)
              throws IOException, InterruptedException {
          // Load contents of manifest entry as a byte array
          final byte[] manifest = manifestZipEntry.load();
  
          // Find field keys (separated by newlines)
          for (int i = 0; i < manifest.length;) {
              // There cannot be any space after a newline before the manifest key, so key starts immediately
              boolean skip = false;
              if (manifest[i] == (byte) '\n' || manifest[i] == (byte) '\r') {
                  // Skip blank lines
                  skip = true;
  
              } else if (keyMatchesAtPosition(manifest, IMPLEMENTATION_TITLE_KEY, i)) {
                  final Entry<String, Integer> manifestValueAndEndIdx = getManifestValue(manifest,
                          i + IMPLEMENTATION_TITLE_KEY.length + 1);
                  if (manifestValueAndEndIdx.getKey().equalsIgnoreCase("Java Runtime Environment")) {
                      isJREJar = true;
                  }
                  i = manifestValueAndEndIdx.getValue();
  
              } else if (keyMatchesAtPosition(manifest, SPECIFICATION_TITLE_KEY, i)) {
                  final Entry<String, Integer> manifestValueAndEndIdx = getManifestValue(manifest,
                          i + SPECIFICATION_TITLE_KEY.length + 1);
                  if (manifestValueAndEndIdx.getKey().equalsIgnoreCase("Java Platform API Specification")) {
                      isJREJar = true;
                  }
                  i = manifestValueAndEndIdx.getValue();
  
              } else if (keyMatchesAtPosition(manifest, CLASS_PATH_KEY, i)) {
                  final Entry<String, Integer> manifestValueAndEndIdx = getManifestValue(manifest,
                          i + CLASS_PATH_KEY.length + 1);
                  // Add Class-Path manifest entry values to classpath
                  classPathManifestEntryValue = manifestValueAndEndIdx.getKey();
                  if (log != null) {
                      log.log("Found Class-Path entry in manifest file: " + classPathManifestEntryValue);
                  }
                  i = manifestValueAndEndIdx.getValue();
  
              } else if (keyMatchesAtPosition(manifest, BUNDLE_CLASSPATH_KEY, i)) {
                  final Entry<String, Integer> manifestValueAndEndIdx = getManifestValue(manifest,
                          i + BUNDLE_CLASSPATH_KEY.length + 1);
                  // Add Bundle-ClassPath manifest entry values to classpath
                  bundleClassPathManifestEntryValue = manifestValueAndEndIdx.getKey();
                  if (log != null) {
                      log.log("Found Bundle-ClassPath entry in manifest file: " + bundleClassPathManifestEntryValue);
                  }
                  i = manifestValueAndEndIdx.getValue();
  
              } else if (keyMatchesAtPosition(manifest, SPRING_BOOT_CLASSES_KEY, i)) {
                  final Entry<String, Integer> manifestValueAndEndIdx = getManifestValue(manifest,
                          i + SPRING_BOOT_CLASSES_KEY.length + 1);
                  final String springBootClassesFieldVal = manifestValueAndEndIdx.getKey();
                  if (!springBootClassesFieldVal.equals("BOOT-INF/classes")
                          && !springBootClassesFieldVal.equals("BOOT-INF/classes/")
                          && !springBootClassesFieldVal.equals("WEB-INF/classes")
                          && !springBootClassesFieldVal.equals("WEB-INF/classes/")) {
                      throw new IOException("Spring boot classes are at \"" + springBootClassesFieldVal
                              + "\" rather than the standard location \"BOOT-INF/classes/\" or \"WEB-INF/classes/\" "
                              + "-- please report this at https://github.com/classgraph/classgraph/issues");
                  }
                  i = manifestValueAndEndIdx.getValue();
  
              } else if (keyMatchesAtPosition(manifest, SPRING_BOOT_LIB_KEY, i)) {
                  final Entry<String, Integer> manifestValueAndEndIdx = getManifestValue(manifest,
                          i + SPRING_BOOT_LIB_KEY.length + 1);
                  final String springBootLibFieldVal = manifestValueAndEndIdx.getKey();
                  if (!springBootLibFieldVal.equals("BOOT-INF/lib") && !springBootLibFieldVal.equals("BOOT-INF/lib/")
                          && !springBootLibFieldVal.equals("WEB-INF/lib")
                          && !springBootLibFieldVal.equals("WEB-INF/lib/")) {
                      throw new IOException("Spring boot lib jars are at \"" + springBootLibFieldVal
                              + "\" rather than the standard location \"BOOT-INF/lib/\" or \"WEB-INF/lib/\" "
                              + "-- please report this at https://github.com/classgraph/classgraph/issues");
                  }
                  i = manifestValueAndEndIdx.getValue();
  
              } else if (keyMatchesAtPosition(manifest, MULTI_RELEASE_KEY, i)) {
                  final Entry<String, Integer> manifestValueAndEndIdx = getManifestValue(manifest,
                          i + MULTI_RELEASE_KEY.length + 1);
                  if (manifestValueAndEndIdx.getKey().equalsIgnoreCase("true")) {
                      isMultiReleaseJar = true;
                  }
                  i = manifestValueAndEndIdx.getValue();
  
              } else if (keyMatchesAtPosition(manifest, ADD_EXPORTS_KEY, i)) {
                  final Entry<String, Integer> manifestValueAndEndIdx = getManifestValue(manifest,
                          i + ADD_EXPORTS_KEY.length + 1);
                  addExportsManifestEntryValue = manifestValueAndEndIdx.getKey();
                  if (log != null) {
                      log.log("Found Add-Exports entry in manifest file: " + addExportsManifestEntryValue);
                  }
                  i = manifestValueAndEndIdx.getValue();
  
              } else if (keyMatchesAtPosition(manifest, ADD_OPENS_KEY, i)) {
                  final Entry<String, Integer> manifestValueAndEndIdx = getManifestValue(manifest,
                          i + ADD_OPENS_KEY.length + 1);
                  addExportsManifestEntryValue = manifestValueAndEndIdx.getKey();
                  if (log != null) {
                      log.log("Found Add-Opens entry in manifest file: " + addOpensManifestEntryValue);
                  }
                  i = manifestValueAndEndIdx.getValue();
  
              } else if (keyMatchesAtPosition(manifest, AUTOMATIC_MODULE_NAME_KEY, i)) {
                  final Entry<String, Integer> manifestValueAndEndIdx = getManifestValue(manifest,
                          i + AUTOMATIC_MODULE_NAME_KEY.length + 1);
                  automaticModuleNameManifestEntryValue = manifestValueAndEndIdx.getKey();
                  if (log != null) {
                      log.log("Found Automatic-Module-Name entry in manifest file: "
                              + automaticModuleNameManifestEntryValue);
                  }
                  i = manifestValueAndEndIdx.getValue();
  
              } else {
                  // Key name was unrecognized -- skip to next key
                  skip = true;
              }
  
              if (skip) {
                  // Field key didn't match -- skip to next key (after next newline that is not followed by a space)
                  for (; i < manifest.length - 2; i++) {
                      if (manifest[i] == (byte) '\r' && manifest[i + 1] == (byte) '\n'
                              && manifest[i + 2] != (byte) ' ') {
                          i += 2;
                          break;
                      } else if ((manifest[i] == (byte) '\r' || manifest[i] == (byte) '\n')
                              && manifest[i + 1] != (byte) ' ') {
                          i++;
                          break;
                      }
                  }
                  if (i >= manifest.length - 2) {
                      break;
                  }
              }
          }
      }