docs: private List<ErrorOccurrence> parseAcraOccurrencesTable(final String pDescription,
              final String pStacktraceMD5) throws IssueParseException {
  
          final List<ErrorOccurrence> occur = new ArrayList<ErrorOccurrence>();
  
          // escape braces { and } to use strings in regexp
          final String header = IssueDescriptionUtils.getOccurrencesTableHeader();
          final String escHeader = Pattern.quote(header);
  
          // regexp to find occurrences tables
          final Pattern p = Pattern.compile(escHeader + IssueDescriptionUtils.EOL + "(?:"
                  + OCCURR_LINE_PATTERN + IssueDescriptionUtils.EOL + "+)+", Pattern.DOTALL
                  | Pattern.CASE_INSENSITIVE);
          final Matcher m = p.matcher(pDescription);
  
          if (m.find()) {
              // regexp to find occurrences lines
              final Pattern pLine = Pattern.compile(OCCURR_LINE_PATTERN);
              final Matcher mLine = pLine.matcher(m.group());
              while (mLine.find()) {
                  try {
                      final StringTokenizer line = new StringTokenizer(mLine.group(), "|");
                      final String acraReportId = line.nextToken();
                      final String acraUserCrashDate = line.nextToken();
                      final String acraRunFor = line.nextToken();
                      final String acraAndroidVersion = line.nextToken();
                      final String acraVersionCode = line.nextToken();
                      final String acraVersionName = line.nextToken();
                      final String acraDevice = line.nextToken();
                      final ErrorOccurrence error = new ErrorOccurrence();
                      error.setReportId(acraReportId);
                      try {
                          error.setCrashDate(IssueDescriptionUtils.parseDate(acraUserCrashDate));
                          error.setRunFor(RunningTimeUtils.parseRunningTime(acraRunFor));
                      } catch (final ParseException e) {
                          throw new IssueParseException(
                                  "Unable to parse user crash date of ACRA report " + acraReportId, e);
                      }
                      error.setAndroidVersion(acraAndroidVersion);
                      error.setVersionCode(acraVersionCode);
                      error.setVersionName(acraVersionName);
                      error.setDevice(acraDevice);
                      occur.add(error);
                  } catch (final NoSuchElementException e) {
                      throw new IssueParseException("Unable to parse ACRA report line: "
                              + mLine.group(), e);
                  }
              }
          } else {
              throw new IssueParseException("No crash occurrence table found in the description");
          }
  
          if (m.find()) {
              throw new IssueParseException("More than 1 occurrence table found in the description");
          }
  
          if (CollectionUtils.isEmpty(occur)) {
              throw new IssueParseException("0 user crash occurrence found in the description");
          }
  
          return occur;
      }