docs: public List<HttpCookie> parse(byte[] headerValue, HeaderKeys cookieHeader) throws IllegalArgumentException {
          if (null == headerValue) {
              throw new IllegalArgumentException("Null input");
          }
  
          // initialize the member variables
          this.name = null;
          this.value = null;
          this.bytePosition = 0;
  
          // initialize the local variables
          CookieData token = null;
          HttpCookie cookie = null;
          List<HttpCookie> cookiesList = new LinkedList<HttpCookie>();
          int version = 0;
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
              Tr.debug(tc, "parse [" + GenericUtils.nullOutPasswords(headerValue, (byte) '&') + "] " + cookieHeader);
          }
  
          // keep looping through pulling individual cookies or cookie attributes
          // until we run out of input data
  
          while (this.bytePosition < headerValue.length) {
  
              // parse out the cookie name or type, then get the value
              token = matchAndParse(headerValue, cookieHeader);
              parseValue(headerValue, token);
              if (null == token) {
                  // parsed name may not exist yet
                  if (null != this.name && 0 != this.name.length) {
                      // Create an instance of the cookie
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, "Creating cookie, version " + version);
                      }
                      try {
                          cookie = new HttpCookie(GenericUtils.getEnglishString(this.name), GenericUtils.getEnglishString(this.value));
                      } catch (IllegalArgumentException iae) {
                          // no FFDC required
                          // Broken cookie name due to invalid characters
                          this.name = null;
                          this.value = null;
                          continue;
                      }
                      cookie.setVersion(version);
                      cookiesList.add(cookie);
                  }
  
              } else if (null != this.value) {
  
                  // version is a special cookie value in that it might
                  // be at the front of the line and does not apply to just
                  // one cookie instance
                  if (CookieData.cookieVersion.equals(token)) {
                      try {
                          version = GenericUtils.asIntValue(this.value);
                          if (null != cookie) {
                              cookie.setVersion(version);
                          }
                      } catch (NumberFormatException ne) {
                          FFDCFilter.processException(ne, getClass().getName() + ".parse", "166");
                          version = 0; // set back to default
                      }
                  } else if (null != cookie) {
                      token.set(cookie, this.value);
                  }
              }
              // reset for next parsing pass
              token = null;
              this.name = null;
              this.value = null;
  
          } // end - while have data to parse
  
          return cookiesList;
      }