code: private static List<Integer> exploreRecord(
              ByteBuffer input) throws SSLException {
  
          // client version
          byte helloMajorVersion = input.get();
          byte helloMinorVersion = input.get();
          if (helloMajorVersion != 3 && helloMinorVersion != 3) {
              //we only care about TLS 1.2
              return null;
          }
  
  
          // ignore random
          for (int i = 0; i < 32; ++i) {// 32: the length of Random
              byte d = input.get();
          }
  
          // session id
          processByteVector8(input);
  
          // cipher_suites
  
          int int16 = getInt16(input);
          List<Integer> ciphers = new ArrayList<>();
          for (int i = 0; i < int16; i += 2) {
              ciphers.add(getInt16(input));
  
          }
  
          // compression methods
          processByteVector8(input);
          if (input.remaining() > 0) {
              return exploreExtensions(input, ciphers);
          }
          return null;
      }
docs: /*
  struct {
  uint32 gmt_unix_time;
  opaque random_bytes[28];
  } Random;
  
  opaque SessionID<0..32>;
  
  uint8 CipherSuite[2];
  
  enum { null(0), (255) } CompressionMethod;
  
  struct {
  ProtocolVersion client_version;
  Random random;
  SessionID session_id;
  CipherSuite cipher_suites<2..2^16-2>;
  CompressionMethod compression_methods<1..2^8-1>;
  select (extensions_present) {
  case false:
  struct {};
  case true:
  Extension extensions<0..2^16-1>;
  };
  } ClientHello;