public class io.undertow.protocols.ssl.ALPNHackSSLEngine extends javax.net.ssl.SSLEngine
  minor version: 0
  major version: 59
  flags: flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: io.undertow.protocols.ssl.ALPNHackSSLEngine
  super_class: javax.net.ssl.SSLEngine
{
  public static final boolean ENABLED;
    descriptor: Z
    flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL

  private static final java.lang.reflect.Field HANDSHAKER;
    descriptor: Ljava/lang/reflect/Field;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL

  private static final java.lang.reflect.Field HANDSHAKER_PROTOCOL_VERSION;
    descriptor: Ljava/lang/reflect/Field;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL

  private static final java.lang.reflect.Field HANDSHAKE_HASH;
    descriptor: Ljava/lang/reflect/Field;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL

  private static final java.lang.reflect.Field HANDSHAKE_HASH_VERSION;
    descriptor: Ljava/lang/reflect/Field;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL

  private static final java.lang.reflect.Method HANDSHAKE_HASH_UPDATE;
    descriptor: Ljava/lang/reflect/Method;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL

  private static final java.lang.reflect.Method HANDSHAKE_HASH_PROTOCOL_DETERMINED;
    descriptor: Ljava/lang/reflect/Method;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL

  private static final java.lang.reflect.Field HANDSHAKE_HASH_DATA;
    descriptor: Ljava/lang/reflect/Field;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL

  private static final java.lang.reflect.Field HANDSHAKE_HASH_FIN_MD;
    descriptor: Ljava/lang/reflect/Field;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL

  private static final java.lang.Class<?> SSL_ENGINE_IMPL_CLASS;
    descriptor: Ljava/lang/Class;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    Signature: Ljava/lang/Class<*>;

  private final javax.net.ssl.SSLEngine delegate;
    descriptor: Ljavax/net/ssl/SSLEngine;
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL

  private boolean unwrapHelloSeen;
    descriptor: Z
    flags: (0x0002) ACC_PRIVATE

  private boolean ourHelloSent;
    descriptor: Z
    flags: (0x0002) ACC_PRIVATE

  private io.undertow.protocols.ssl.ALPNHackServerByteArrayOutputStream alpnHackServerByteArrayOutputStream;
    descriptor: Lio/undertow/protocols/ssl/ALPNHackServerByteArrayOutputStream;
    flags: (0x0002) ACC_PRIVATE

  private io.undertow.protocols.ssl.ALPNHackClientByteArrayOutputStream ALPNHackClientByteArrayOutputStream;
    descriptor: Lio/undertow/protocols/ssl/ALPNHackClientByteArrayOutputStream;
    flags: (0x0002) ACC_PRIVATE

  private java.util.List<java.lang.String> applicationProtocols;
    descriptor: Ljava/util/List;
    flags: (0x0002) ACC_PRIVATE
    Signature: Ljava/util/List<Ljava/lang/String;>;

  private java.lang.String selectedApplicationProtocol;
    descriptor: Ljava/lang/String;
    flags: (0x0002) ACC_PRIVATE

  private java.nio.ByteBuffer bufferedWrapData;
    descriptor: Ljava/nio/ByteBuffer;
    flags: (0x0002) ACC_PRIVATE

  static void <clinit>();
    descriptor: ()V
    flags: (0x0008) ACC_STATIC
    Code:
      stack=6, locals=11, args_size=0
         0: .line 66
            iconst_1
            istore 0 /* enabled */
        start local 0 // boolean enabled
         1: .line 77
            ldc "sun.security.ssl.ProtocolVersion"
            iconst_1
            invokestatic java.lang.ClassLoader.getSystemClassLoader:()Ljava/lang/ClassLoader;
            invokestatic java.lang.Class.forName:(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
            astore 10 /* protocolVersionClass */
        start local 10 // java.lang.Class protocolVersionClass
         2: .line 78
            ldc "sun.security.ssl.SSLEngineImpl"
            iconst_1
            invokestatic java.lang.ClassLoader.getSystemClassLoader:()Ljava/lang/ClassLoader;
            invokestatic java.lang.Class.forName:(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
            astore 9 /* sslEngineImpleClass */
        start local 9 // java.lang.Class sslEngineImpleClass
         3: .line 79
            aload 9 /* sslEngineImpleClass */
            ldc "handshaker"
            invokevirtual java.lang.Class.getDeclaredField:(Ljava/lang/String;)Ljava/lang/reflect/Field;
            astore 1 /* handshaker */
        start local 1 // java.lang.reflect.Field handshaker
         4: .line 80
            aload 1 /* handshaker */
            iconst_1
            invokevirtual java.lang.reflect.Field.setAccessible:(Z)V
         5: .line 81
            aload 1 /* handshaker */
            invokevirtual java.lang.reflect.Field.getType:()Ljava/lang/Class;
            ldc "handshakeHash"
            invokevirtual java.lang.Class.getDeclaredField:(Ljava/lang/String;)Ljava/lang/reflect/Field;
            astore 2 /* handshakeHash */
        start local 2 // java.lang.reflect.Field handshakeHash
         6: .line 82
            aload 2 /* handshakeHash */
            iconst_1
            invokevirtual java.lang.reflect.Field.setAccessible:(Z)V
         7: .line 83
            aload 1 /* handshaker */
            invokevirtual java.lang.reflect.Field.getType:()Ljava/lang/Class;
            ldc "protocolVersion"
            invokevirtual java.lang.Class.getDeclaredField:(Ljava/lang/String;)Ljava/lang/reflect/Field;
            astore 6 /* protocolVersion */
        start local 6 // java.lang.reflect.Field protocolVersion
         8: .line 84
            aload 6 /* protocolVersion */
            iconst_1
            invokevirtual java.lang.reflect.Field.setAccessible:(Z)V
         9: .line 85
            aload 2 /* handshakeHash */
            invokevirtual java.lang.reflect.Field.getType:()Ljava/lang/Class;
            ldc "version"
            invokevirtual java.lang.Class.getDeclaredField:(Ljava/lang/String;)Ljava/lang/reflect/Field;
            astore 3 /* handshakeHashVersion */
        start local 3 // java.lang.reflect.Field handshakeHashVersion
        10: .line 86
            aload 3 /* handshakeHashVersion */
            iconst_1
            invokevirtual java.lang.reflect.Field.setAccessible:(Z)V
        11: .line 87
            aload 2 /* handshakeHash */
            invokevirtual java.lang.reflect.Field.getType:()Ljava/lang/Class;
            ldc "update"
            iconst_3
            anewarray java.lang.Class
            dup
            iconst_0
            ldc [B
            aastore
            dup
            iconst_1
            getstatic java.lang.Integer.TYPE:Ljava/lang/Class;
            aastore
            dup
            iconst_2
            getstatic java.lang.Integer.TYPE:Ljava/lang/Class;
            aastore
            invokevirtual java.lang.Class.getDeclaredMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
            astore 7 /* handshakeHashUpdate */
        start local 7 // java.lang.reflect.Method handshakeHashUpdate
        12: .line 88
            aload 7 /* handshakeHashUpdate */
            iconst_1
            invokevirtual java.lang.reflect.Method.setAccessible:(Z)V
        13: .line 89
            aload 2 /* handshakeHash */
            invokevirtual java.lang.reflect.Field.getType:()Ljava/lang/Class;
            ldc "protocolDetermined"
            iconst_1
            anewarray java.lang.Class
            dup
            iconst_0
            aload 10 /* protocolVersionClass */
            aastore
            invokevirtual java.lang.Class.getDeclaredMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
            astore 8 /* handshakeHashProtocolDetermined */
        start local 8 // java.lang.reflect.Method handshakeHashProtocolDetermined
        14: .line 90
            aload 8 /* handshakeHashProtocolDetermined */
            iconst_1
            invokevirtual java.lang.reflect.Method.setAccessible:(Z)V
        15: .line 91
            aload 2 /* handshakeHash */
            invokevirtual java.lang.reflect.Field.getType:()Ljava/lang/Class;
            ldc "data"
            invokevirtual java.lang.Class.getDeclaredField:(Ljava/lang/String;)Ljava/lang/reflect/Field;
            astore 4 /* handshakeHashData */
        start local 4 // java.lang.reflect.Field handshakeHashData
        16: .line 92
            aload 4 /* handshakeHashData */
            iconst_1
            invokevirtual java.lang.reflect.Field.setAccessible:(Z)V
        17: .line 93
            aload 2 /* handshakeHash */
            invokevirtual java.lang.reflect.Field.getType:()Ljava/lang/Class;
            ldc "finMD"
            invokevirtual java.lang.Class.getDeclaredField:(Ljava/lang/String;)Ljava/lang/reflect/Field;
            astore 5 /* handshakeHashFinMd */
        start local 5 // java.lang.reflect.Field handshakeHashFinMd
        18: .line 94
            aload 5 /* handshakeHashFinMd */
            iconst_1
            invokevirtual java.lang.reflect.Field.setAccessible:(Z)V
        end local 10 // java.lang.Class protocolVersionClass
        19: .line 96
            goto 32
        end local 9 // java.lang.Class sslEngineImpleClass
        end local 8 // java.lang.reflect.Method handshakeHashProtocolDetermined
        end local 7 // java.lang.reflect.Method handshakeHashUpdate
        end local 6 // java.lang.reflect.Field protocolVersion
        end local 5 // java.lang.reflect.Field handshakeHashFinMd
        end local 4 // java.lang.reflect.Field handshakeHashData
        end local 3 // java.lang.reflect.Field handshakeHashVersion
        end local 2 // java.lang.reflect.Field handshakeHash
        end local 1 // java.lang.reflect.Field handshaker
      StackMap locals: int
      StackMap stack: java.lang.Exception
        20: astore 10 /* e */
        start local 10 // java.lang.Exception e
        21: .line 97
            getstatic io.undertow.UndertowLogger.ROOT_LOGGER:Lio/undertow/UndertowLogger;
            ldc "JDK8 ALPN Hack failed "
            aload 10 /* e */
            invokeinterface io.undertow.UndertowLogger.debug:(Ljava/lang/Object;Ljava/lang/Throwable;)V
        22: .line 98
            iconst_0
            istore 0 /* enabled */
        23: .line 99
            aconst_null
            astore 1 /* handshaker */
        start local 1 // java.lang.reflect.Field handshaker
        24: .line 100
            aconst_null
            astore 2 /* handshakeHash */
        start local 2 // java.lang.reflect.Field handshakeHash
        25: .line 101
            aconst_null
            astore 3 /* handshakeHashVersion */
        start local 3 // java.lang.reflect.Field handshakeHashVersion
        26: .line 102
            aconst_null
            astore 7 /* handshakeHashUpdate */
        start local 7 // java.lang.reflect.Method handshakeHashUpdate
        27: .line 103
            aconst_null
            astore 8 /* handshakeHashProtocolDetermined */
        start local 8 // java.lang.reflect.Method handshakeHashProtocolDetermined
        28: .line 104
            aconst_null
            astore 4 /* handshakeHashData */
        start local 4 // java.lang.reflect.Field handshakeHashData
        29: .line 105
            aconst_null
            astore 5 /* handshakeHashFinMd */
        start local 5 // java.lang.reflect.Field handshakeHashFinMd
        30: .line 106
            aconst_null
            astore 6 /* protocolVersion */
        start local 6 // java.lang.reflect.Field protocolVersion
        31: .line 107
            aconst_null
            astore 9 /* sslEngineImpleClass */
        end local 10 // java.lang.Exception e
        start local 9 // java.lang.Class sslEngineImpleClass
        32: .line 109
      StackMap locals: int java.lang.reflect.Field java.lang.reflect.Field java.lang.reflect.Field java.lang.reflect.Field java.lang.reflect.Field java.lang.reflect.Field java.lang.reflect.Method java.lang.reflect.Method java.lang.Class
      StackMap stack:
            iload 0 /* enabled */
            ifeq 33
            ldc "io.undertow.disable-jdk8-alpn"
            invokestatic java.lang.Boolean.getBoolean:(Ljava/lang/String;)Z
            ifne 33
            iconst_1
            goto 34
      StackMap locals:
      StackMap stack:
        33: iconst_0
      StackMap locals:
      StackMap stack: int
        34: putstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.ENABLED:Z
        35: .line 110
            aload 1 /* handshaker */
            putstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKER:Ljava/lang/reflect/Field;
        36: .line 111
            aload 2 /* handshakeHash */
            putstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKE_HASH:Ljava/lang/reflect/Field;
        37: .line 112
            aload 8 /* handshakeHashProtocolDetermined */
            putstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKE_HASH_PROTOCOL_DETERMINED:Ljava/lang/reflect/Method;
        38: .line 113
            aload 3 /* handshakeHashVersion */
            putstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKE_HASH_VERSION:Ljava/lang/reflect/Field;
        39: .line 114
            aload 7 /* handshakeHashUpdate */
            putstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKE_HASH_UPDATE:Ljava/lang/reflect/Method;
        40: .line 115
            aload 4 /* handshakeHashData */
            putstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKE_HASH_DATA:Ljava/lang/reflect/Field;
        41: .line 116
            aload 5 /* handshakeHashFinMd */
            putstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKE_HASH_FIN_MD:Ljava/lang/reflect/Field;
        42: .line 117
            aload 6 /* protocolVersion */
            putstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKER_PROTOCOL_VERSION:Ljava/lang/reflect/Field;
        43: .line 118
            aload 9 /* sslEngineImpleClass */
            putstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.SSL_ENGINE_IMPL_CLASS:Ljava/lang/Class;
        end local 9 // java.lang.Class sslEngineImpleClass
        end local 8 // java.lang.reflect.Method handshakeHashProtocolDetermined
        end local 7 // java.lang.reflect.Method handshakeHashUpdate
        end local 6 // java.lang.reflect.Field protocolVersion
        end local 5 // java.lang.reflect.Field handshakeHashFinMd
        end local 4 // java.lang.reflect.Field handshakeHashData
        end local 3 // java.lang.reflect.Field handshakeHashVersion
        end local 2 // java.lang.reflect.Field handshakeHash
        end local 1 // java.lang.reflect.Field handshaker
        end local 0 // boolean enabled
        44: .line 119
            return
      LocalVariableTable:
        Start  End  Slot                             Name  Signature
            1   44     0                          enabled  Z
            4   20     1                       handshaker  Ljava/lang/reflect/Field;
           24   44     1                       handshaker  Ljava/lang/reflect/Field;
            6   20     2                    handshakeHash  Ljava/lang/reflect/Field;
           25   44     2                    handshakeHash  Ljava/lang/reflect/Field;
           10   20     3             handshakeHashVersion  Ljava/lang/reflect/Field;
           26   44     3             handshakeHashVersion  Ljava/lang/reflect/Field;
           16   20     4                handshakeHashData  Ljava/lang/reflect/Field;
           29   44     4                handshakeHashData  Ljava/lang/reflect/Field;
           18   20     5               handshakeHashFinMd  Ljava/lang/reflect/Field;
           30   44     5               handshakeHashFinMd  Ljava/lang/reflect/Field;
            8   20     6                  protocolVersion  Ljava/lang/reflect/Field;
           31   44     6                  protocolVersion  Ljava/lang/reflect/Field;
           12   20     7              handshakeHashUpdate  Ljava/lang/reflect/Method;
           27   44     7              handshakeHashUpdate  Ljava/lang/reflect/Method;
           14   20     8  handshakeHashProtocolDetermined  Ljava/lang/reflect/Method;
           28   44     8  handshakeHashProtocolDetermined  Ljava/lang/reflect/Method;
            3   20     9              sslEngineImpleClass  Ljava/lang/Class<*>;
           32   44     9              sslEngineImpleClass  Ljava/lang/Class<*>;
            2   19    10             protocolVersionClass  Ljava/lang/Class<*>;
           21   32    10                                e  Ljava/lang/Exception;
      Exception table:
        from    to  target  type
           1    19      20  Class java.lang.Exception

  public void <init>(javax.net.ssl.SSLEngine);
    descriptor: (Ljavax/net/ssl/SSLEngine;)V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
        start local 1 // javax.net.ssl.SSLEngine delegate
         0: .line 132
            aload 0 /* this */
            invokespecial javax.net.ssl.SSLEngine.<init>:()V
         1: .line 124
            aload 0 /* this */
            iconst_0
            putfield io.undertow.protocols.ssl.ALPNHackSSLEngine.unwrapHelloSeen:Z
         2: .line 125
            aload 0 /* this */
            iconst_0
            putfield io.undertow.protocols.ssl.ALPNHackSSLEngine.ourHelloSent:Z
         3: .line 133
            aload 0 /* this */
            aload 1 /* delegate */
            putfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
         4: .line 134
            return
        end local 1 // javax.net.ssl.SSLEngine delegate
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot      Name  Signature
            0    5     0      this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;
            0    5     1  delegate  Ljavax/net/ssl/SSLEngine;
    MethodParameters:
          Name  Flags
      delegate  

  public static boolean isEnabled(javax.net.ssl.SSLEngine);
    descriptor: (Ljavax/net/ssl/SSLEngine;)Z
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
        start local 0 // javax.net.ssl.SSLEngine engine
         0: .line 137
            getstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.ENABLED:Z
            ifne 2
         1: .line 138
            iconst_0
            ireturn
         2: .line 140
      StackMap locals:
      StackMap stack:
            getstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.SSL_ENGINE_IMPL_CLASS:Ljava/lang/Class;
            aload 0 /* engine */
            invokevirtual java.lang.Object.getClass:()Ljava/lang/Class;
            invokevirtual java.lang.Class.isAssignableFrom:(Ljava/lang/Class;)Z
            ireturn
        end local 0 // javax.net.ssl.SSLEngine engine
      LocalVariableTable:
        Start  End  Slot    Name  Signature
            0    3     0  engine  Ljavax/net/ssl/SSLEngine;
    MethodParameters:
        Name  Flags
      engine  

  public javax.net.ssl.SSLEngineResult wrap(java.nio.ByteBuffer[], int, int, java.nio.ByteBuffer);
    descriptor: ([Ljava/nio/ByteBuffer;IILjava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=6, locals=12, args_size=5
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
        start local 1 // java.nio.ByteBuffer[] byteBuffers
        start local 2 // int i
        start local 3 // int i1
        start local 4 // java.nio.ByteBuffer byteBuffer
         0: .line 145
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.bufferedWrapData:Ljava/nio/ByteBuffer;
            ifnull 5
         1: .line 146
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.bufferedWrapData:Ljava/nio/ByteBuffer;
            invokevirtual java.nio.ByteBuffer.remaining:()I
            istore 5 /* prod */
        start local 5 // int prod
         2: .line 147
            aload 4 /* byteBuffer */
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.bufferedWrapData:Ljava/nio/ByteBuffer;
            invokevirtual java.nio.ByteBuffer.put:(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;
            pop
         3: .line 148
            aload 0 /* this */
            aconst_null
            putfield io.undertow.protocols.ssl.ALPNHackSSLEngine.bufferedWrapData:Ljava/nio/ByteBuffer;
         4: .line 149
            new javax.net.ssl.SSLEngineResult
            dup
            getstatic javax.net.ssl.SSLEngineResult$Status.OK:Ljavax/net/ssl/SSLEngineResult$Status;
            getstatic javax.net.ssl.SSLEngineResult$HandshakeStatus.NEED_WRAP:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
            iconst_0
            iload 5 /* prod */
            invokespecial javax.net.ssl.SSLEngineResult.<init>:(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
            areturn
        end local 5 // int prod
         5: .line 151
      StackMap locals:
      StackMap stack:
            aload 4 /* byteBuffer */
            invokevirtual java.nio.ByteBuffer.position:()I
            istore 5 /* pos */
        start local 5 // int pos
         6: .line 152
            aload 4 /* byteBuffer */
            invokevirtual java.nio.ByteBuffer.limit:()I
            istore 6 /* limit */
        start local 6 // int limit
         7: .line 153
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            aload 1 /* byteBuffers */
            iload 2 /* i */
            iload 3 /* i1 */
            aload 4 /* byteBuffer */
            invokevirtual javax.net.ssl.SSLEngine.wrap:([Ljava/nio/ByteBuffer;IILjava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;
            astore 7 /* res */
        start local 7 // javax.net.ssl.SSLEngineResult res
         8: .line 154
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.ourHelloSent:Z
            ifne 43
            aload 7 /* res */
            invokevirtual javax.net.ssl.SSLEngineResult.bytesProduced:()I
            ifle 43
         9: .line 155
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.getUseClientMode:()Z
            ifeq 24
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.applicationProtocols:Ljava/util/List;
            ifnull 24
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.applicationProtocols:Ljava/util/List;
            invokeinterface java.util.List.isEmpty:()Z
            ifne 24
        10: .line 156
            aload 0 /* this */
            iconst_1
            putfield io.undertow.protocols.ssl.ALPNHackSSLEngine.ourHelloSent:Z
        11: .line 157
            aload 0 /* this */
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokestatic io.undertow.protocols.ssl.ALPNHackSSLEngine.replaceClientByteOutput:(Ljavax/net/ssl/SSLEngine;)Lio/undertow/protocols/ssl/ALPNHackClientByteArrayOutputStream;
            putfield io.undertow.protocols.ssl.ALPNHackSSLEngine.ALPNHackClientByteArrayOutputStream:Lio/undertow/protocols/ssl/ALPNHackClientByteArrayOutputStream;
        12: .line 158
            aload 4 /* byteBuffer */
            invokevirtual java.nio.ByteBuffer.duplicate:()Ljava/nio/ByteBuffer;
            astore 8 /* newBuf */
        start local 8 // java.nio.ByteBuffer newBuf
        13: .line 159
            aload 8 /* newBuf */
            invokevirtual java.nio.ByteBuffer.flip:()Ljava/nio/Buffer;
            pop
        14: .line 160
            aload 8 /* newBuf */
            invokevirtual java.nio.ByteBuffer.remaining:()I
            newarray 8
            astore 9 /* data */
        start local 9 // byte[] data
        15: .line 161
            aload 8 /* newBuf */
            aload 9 /* data */
            invokevirtual java.nio.ByteBuffer.get:([B)Ljava/nio/ByteBuffer;
            pop
        16: .line 162
            aload 9 /* data */
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.applicationProtocols:Ljava/util/List;
            invokestatic io.undertow.protocols.ssl.ALPNHackClientHelloExplorer.rewriteClientHello:([BLjava/util/List;)[B
            astore 10 /* newData */
        start local 10 // byte[] newData
        17: .line 163
            aload 10 /* newData */
            ifnull 43
        18: .line 164
            aload 10 /* newData */
            arraylength
            iconst_5
            isub
            newarray 8
            astore 11 /* clientHelloMesage */
        start local 11 // byte[] clientHelloMesage
        19: .line 165
            aload 10 /* newData */
            iconst_5
            aload 11 /* clientHelloMesage */
            iconst_0
            aload 11 /* clientHelloMesage */
            arraylength
            invokestatic java.lang.System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V
        20: .line 166
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.ALPNHackClientByteArrayOutputStream:Lio/undertow/protocols/ssl/ALPNHackClientByteArrayOutputStream;
            aload 11 /* clientHelloMesage */
            invokevirtual io.undertow.protocols.ssl.ALPNHackClientByteArrayOutputStream.setSentClientHello:([B)V
        21: .line 167
            aload 4 /* byteBuffer */
            invokevirtual java.nio.ByteBuffer.clear:()Ljava/nio/Buffer;
            pop
        22: .line 168
            aload 4 /* byteBuffer */
            aload 10 /* newData */
            invokevirtual java.nio.ByteBuffer.put:([B)Ljava/nio/ByteBuffer;
            pop
        end local 11 // byte[] clientHelloMesage
        end local 10 // byte[] newData
        end local 9 // byte[] data
        end local 8 // java.nio.ByteBuffer newBuf
        23: .line 170
            goto 43
      StackMap locals: int int javax.net.ssl.SSLEngineResult
      StackMap stack:
        24: aload 0 /* this */
            invokevirtual io.undertow.protocols.ssl.ALPNHackSSLEngine.getUseClientMode:()Z
            ifne 43
        25: .line 171
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.selectedApplicationProtocol:Ljava/lang/String;
            ifnull 43
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.alpnHackServerByteArrayOutputStream:Lio/undertow/protocols/ssl/ALPNHackServerByteArrayOutputStream;
            ifnull 43
        26: .line 172
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.alpnHackServerByteArrayOutputStream:Lio/undertow/protocols/ssl/ALPNHackServerByteArrayOutputStream;
            invokevirtual io.undertow.protocols.ssl.ALPNHackServerByteArrayOutputStream.getServerHello:()[B
            astore 8 /* newServerHello */
        start local 8 // byte[] newServerHello
        27: .line 173
            aload 8 /* newServerHello */
            ifnull 43
        28: .line 174
            aload 4 /* byteBuffer */
            invokevirtual java.nio.ByteBuffer.flip:()Ljava/nio/Buffer;
            pop
        29: .line 175
            aload 4 /* byteBuffer */
            invokestatic io.undertow.protocols.ssl.ALPNHackServerHelloExplorer.extractRecords:(Ljava/nio/ByteBuffer;)Ljava/util/List;
            astore 9 /* records */
        start local 9 // java.util.List records
        30: .line 176
            aload 8 /* newServerHello */
            aload 9 /* records */
            invokestatic io.undertow.protocols.ssl.ALPNHackServerHelloExplorer.createNewOutputRecords:([BLjava/util/List;)Ljava/nio/ByteBuffer;
            astore 10 /* newData */
        start local 10 // java.nio.ByteBuffer newData
        31: .line 177
            aload 4 /* byteBuffer */
            iload 5 /* pos */
            invokevirtual java.nio.ByteBuffer.position:(I)Ljava/nio/Buffer;
            pop
        32: .line 178
            aload 4 /* byteBuffer */
            iload 6 /* limit */
            invokevirtual java.nio.ByteBuffer.limit:(I)Ljava/nio/Buffer;
            pop
        33: .line 179
            aload 10 /* newData */
            invokevirtual java.nio.ByteBuffer.remaining:()I
            aload 4 /* byteBuffer */
            invokevirtual java.nio.ByteBuffer.remaining:()I
            if_icmple 41
        34: .line 180
            aload 10 /* newData */
            invokevirtual java.nio.ByteBuffer.limit:()I
            istore 11 /* old */
        start local 11 // int old
        35: .line 181
            aload 10 /* newData */
            aload 10 /* newData */
            invokevirtual java.nio.ByteBuffer.position:()I
            aload 4 /* byteBuffer */
            invokevirtual java.nio.ByteBuffer.remaining:()I
            iadd
            invokevirtual java.nio.ByteBuffer.limit:(I)Ljava/nio/Buffer;
            pop
        36: .line 182
            new javax.net.ssl.SSLEngineResult
            dup
            aload 7 /* res */
            invokevirtual javax.net.ssl.SSLEngineResult.getStatus:()Ljavax/net/ssl/SSLEngineResult$Status;
            aload 7 /* res */
            invokevirtual javax.net.ssl.SSLEngineResult.getHandshakeStatus:()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
            aload 7 /* res */
            invokevirtual javax.net.ssl.SSLEngineResult.bytesConsumed:()I
            aload 10 /* newData */
            invokevirtual java.nio.ByteBuffer.remaining:()I
            invokespecial javax.net.ssl.SSLEngineResult.<init>:(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
            astore 7 /* res */
        37: .line 183
            aload 4 /* byteBuffer */
            aload 10 /* newData */
            invokevirtual java.nio.ByteBuffer.put:(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;
            pop
        38: .line 184
            aload 10 /* newData */
            iload 11 /* old */
            invokevirtual java.nio.ByteBuffer.limit:(I)Ljava/nio/Buffer;
            pop
        39: .line 185
            aload 0 /* this */
            aload 10 /* newData */
            putfield io.undertow.protocols.ssl.ALPNHackSSLEngine.bufferedWrapData:Ljava/nio/ByteBuffer;
        end local 11 // int old
        40: .line 186
            goto 43
        41: .line 187
      StackMap locals: byte[] java.util.List java.nio.ByteBuffer
      StackMap stack:
            new javax.net.ssl.SSLEngineResult
            dup
            aload 7 /* res */
            invokevirtual javax.net.ssl.SSLEngineResult.getStatus:()Ljavax/net/ssl/SSLEngineResult$Status;
            aload 7 /* res */
            invokevirtual javax.net.ssl.SSLEngineResult.getHandshakeStatus:()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
            aload 7 /* res */
            invokevirtual javax.net.ssl.SSLEngineResult.bytesConsumed:()I
            aload 10 /* newData */
            invokevirtual java.nio.ByteBuffer.remaining:()I
            invokespecial javax.net.ssl.SSLEngineResult.<init>:(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
            astore 7 /* res */
        42: .line 188
            aload 4 /* byteBuffer */
            aload 10 /* newData */
            invokevirtual java.nio.ByteBuffer.put:(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;
            pop
        end local 10 // java.nio.ByteBuffer newData
        end local 9 // java.util.List records
        end local 8 // byte[] newServerHello
        43: .line 194
      StackMap locals:
      StackMap stack:
            aload 7 /* res */
            invokevirtual javax.net.ssl.SSLEngineResult.bytesProduced:()I
            ifle 45
        44: .line 195
            aload 0 /* this */
            iconst_1
            putfield io.undertow.protocols.ssl.ALPNHackSSLEngine.ourHelloSent:Z
        45: .line 197
      StackMap locals:
      StackMap stack:
            aload 7 /* res */
            areturn
        end local 7 // javax.net.ssl.SSLEngineResult res
        end local 6 // int limit
        end local 5 // int pos
        end local 4 // java.nio.ByteBuffer byteBuffer
        end local 3 // int i1
        end local 2 // int i
        end local 1 // java.nio.ByteBuffer[] byteBuffers
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot               Name  Signature
            0   46     0               this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;
            0   46     1        byteBuffers  [Ljava/nio/ByteBuffer;
            0   46     2                  i  I
            0   46     3                 i1  I
            0   46     4         byteBuffer  Ljava/nio/ByteBuffer;
            2    5     5               prod  I
            6   46     5                pos  I
            7   46     6              limit  I
            8   46     7                res  Ljavax/net/ssl/SSLEngineResult;
           13   23     8             newBuf  Ljava/nio/ByteBuffer;
           15   23     9               data  [B
           17   23    10            newData  [B
           19   23    11  clientHelloMesage  [B
           27   43     8     newServerHello  [B
           30   43     9            records  Ljava/util/List<Ljava/nio/ByteBuffer;>;
           31   43    10            newData  Ljava/nio/ByteBuffer;
           35   40    11                old  I
    Exceptions:
      throws javax.net.ssl.SSLException
    MethodParameters:
             Name  Flags
      byteBuffers  
      i            
      i1           
      byteBuffer   

  public javax.net.ssl.SSLEngineResult unwrap(java.nio.ByteBuffer, java.nio.ByteBuffer[], int, int);
    descriptor: (Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;II)Ljavax/net/ssl/SSLEngineResult;
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=6, locals=19, args_size=5
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
        start local 1 // java.nio.ByteBuffer dataToUnwrap
        start local 2 // java.nio.ByteBuffer[] byteBuffers
        start local 3 // int i
        start local 4 // int i1
         0: .line 202
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.unwrapHelloSeen:Z
            ifne 48
         1: .line 203
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.getUseClientMode:()Z
            ifne 14
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.applicationProtocols:Ljava/util/List;
            ifnull 14
         2: .line 205
            aload 1 /* dataToUnwrap */
            invokevirtual java.nio.ByteBuffer.duplicate:()Ljava/nio/ByteBuffer;
            invokestatic io.undertow.protocols.ssl.ALPNHackClientHelloExplorer.exploreClientHello:(Ljava/nio/ByteBuffer;)Ljava/util/List;
            astore 5 /* result */
        start local 5 // java.util.List result
         3: .line 206
            aload 5 /* result */
            ifnull 10
         4: .line 207
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.applicationProtocols:Ljava/util/List;
            invokeinterface java.util.List.iterator:()Ljava/util/Iterator;
            astore 7
            goto 9
      StackMap locals: io.undertow.protocols.ssl.ALPNHackSSLEngine java.nio.ByteBuffer java.nio.ByteBuffer[] int int java.util.List top java.util.Iterator
      StackMap stack:
         5: aload 7
            invokeinterface java.util.Iterator.next:()Ljava/lang/Object;
            checkcast java.lang.String
            astore 6 /* protocol */
        start local 6 // java.lang.String protocol
         6: .line 208
            aload 5 /* result */
            aload 6 /* protocol */
            invokeinterface java.util.List.contains:(Ljava/lang/Object;)Z
            ifeq 9
         7: .line 209
            aload 0 /* this */
            aload 6 /* protocol */
            putfield io.undertow.protocols.ssl.ALPNHackSSLEngine.selectedApplicationProtocol:Ljava/lang/String;
         8: .line 210
            goto 10
        end local 6 // java.lang.String protocol
         9: .line 207
      StackMap locals:
      StackMap stack:
            aload 7
            invokeinterface java.util.Iterator.hasNext:()Z
            ifne 5
        10: .line 214
      StackMap locals: io.undertow.protocols.ssl.ALPNHackSSLEngine java.nio.ByteBuffer java.nio.ByteBuffer[] int int java.util.List
      StackMap stack:
            aload 0 /* this */
            iconst_1
            putfield io.undertow.protocols.ssl.ALPNHackSSLEngine.unwrapHelloSeen:Z
        end local 5 // java.util.List result
        11: .line 215
            goto 48
      StackMap locals: io.undertow.protocols.ssl.ALPNHackSSLEngine java.nio.ByteBuffer java.nio.ByteBuffer[] int int
      StackMap stack: java.nio.BufferUnderflowException
        12: pop
        13: .line 216
            new javax.net.ssl.SSLEngineResult
            dup
            getstatic javax.net.ssl.SSLEngineResult$Status.BUFFER_UNDERFLOW:Ljavax/net/ssl/SSLEngineResult$Status;
            getstatic javax.net.ssl.SSLEngineResult$HandshakeStatus.NEED_UNWRAP:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
            iconst_0
            iconst_0
            invokespecial javax.net.ssl.SSLEngineResult.<init>:(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
            areturn
        14: .line 218
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.getUseClientMode:()Z
            ifeq 48
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.ALPNHackClientByteArrayOutputStream:Lio/undertow/protocols/ssl/ALPNHackClientByteArrayOutputStream;
            ifnull 48
        15: .line 219
            aload 1 /* dataToUnwrap */
            invokevirtual java.nio.ByteBuffer.hasRemaining:()Z
            ifne 17
        16: .line 220
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            aload 1 /* dataToUnwrap */
            aload 2 /* byteBuffers */
            iload 3 /* i */
            iload 4 /* i1 */
            invokevirtual javax.net.ssl.SSLEngine.unwrap:(Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;II)Ljavax/net/ssl/SSLEngineResult;
            areturn
        17: .line 223
      StackMap locals:
      StackMap stack:
            aload 1 /* dataToUnwrap */
            invokevirtual java.nio.ByteBuffer.duplicate:()Ljava/nio/ByteBuffer;
            astore 5 /* dup */
        start local 5 // java.nio.ByteBuffer dup
        18: .line 224
            aload 5 /* dup */
            invokevirtual java.nio.ByteBuffer.get:()B
            istore 6 /* type */
        start local 6 // int type
        19: .line 225
            aload 5 /* dup */
            invokevirtual java.nio.ByteBuffer.get:()B
            istore 7 /* major */
        start local 7 // int major
        20: .line 226
            aload 5 /* dup */
            invokevirtual java.nio.ByteBuffer.get:()B
            istore 8 /* minor */
        start local 8 // int minor
        21: .line 227
            iload 6 /* type */
            bipush 22
            if_icmpne 48
            iload 7 /* major */
            iconst_3
            if_icmpne 48
            iload 8 /* minor */
            iconst_3
            if_icmpne 48
        22: .line 230
            aload 1 /* dataToUnwrap */
            invokevirtual java.nio.ByteBuffer.duplicate:()Ljava/nio/ByteBuffer;
            invokestatic io.undertow.protocols.ssl.ALPNHackServerHelloExplorer.extractRecords:(Ljava/nio/ByteBuffer;)Ljava/util/List;
            astore 9 /* records */
        start local 9 // java.util.List records
        23: .line 232
            aload 9 /* records */
            iconst_0
            invokeinterface java.util.List.get:(I)Ljava/lang/Object;
            checkcast java.nio.ByteBuffer
            astore 10 /* firstRecord */
        start local 10 // java.nio.ByteBuffer firstRecord
        24: .line 234
            new java.util.concurrent.atomic.AtomicReference
            dup
            invokespecial java.util.concurrent.atomic.AtomicReference.<init>:()V
            astore 11 /* alpnResult */
        start local 11 // java.util.concurrent.atomic.AtomicReference alpnResult
        25: .line 235
            aload 10 /* firstRecord */
            invokevirtual java.nio.ByteBuffer.duplicate:()Ljava/nio/ByteBuffer;
            astore 12 /* dupFirst */
        start local 12 // java.nio.ByteBuffer dupFirst
        26: .line 236
            aload 12 /* dupFirst */
            aload 10 /* firstRecord */
            invokevirtual java.nio.ByteBuffer.position:()I
            iconst_5
            iadd
            invokevirtual java.nio.ByteBuffer.position:(I)Ljava/nio/Buffer;
            pop
        27: .line 237
            aload 12 /* dupFirst */
            invokevirtual java.nio.ByteBuffer.duplicate:()Ljava/nio/ByteBuffer;
            astore 13 /* firstLessFraming */
        start local 13 // java.nio.ByteBuffer firstLessFraming
        28: .line 239
            aload 12 /* dupFirst */
            aload 11 /* alpnResult */
            invokestatic io.undertow.protocols.ssl.ALPNHackServerHelloExplorer.removeAlpnExtensionsFromServerHello:(Ljava/nio/ByteBuffer;Ljava/util/concurrent/atomic/AtomicReference;)[B
            astore 14 /* result */
        start local 14 // byte[] result
        29: .line 240
            aload 13 /* firstLessFraming */
            aload 12 /* dupFirst */
            invokevirtual java.nio.ByteBuffer.position:()I
            invokevirtual java.nio.ByteBuffer.limit:(I)Ljava/nio/Buffer;
            pop
        30: .line 241
            aload 0 /* this */
            iconst_1
            putfield io.undertow.protocols.ssl.ALPNHackSSLEngine.unwrapHelloSeen:Z
        31: .line 242
            aload 14 /* result */
            ifnull 48
        32: .line 243
            aload 0 /* this */
            aload 11 /* alpnResult */
            invokevirtual java.util.concurrent.atomic.AtomicReference.get:()Ljava/lang/Object;
            checkcast java.lang.String
            putfield io.undertow.protocols.ssl.ALPNHackSSLEngine.selectedApplicationProtocol:Ljava/lang/String;
        33: .line 244
            aload 14 /* result */
            arraylength
            aload 12 /* dupFirst */
            invokevirtual java.nio.ByteBuffer.remaining:()I
            iadd
            istore 15 /* newFirstRecordLength */
        start local 15 // int newFirstRecordLength
        34: .line 245
            iload 15 /* newFirstRecordLength */
            newarray 8
            astore 16 /* newFirstRecord */
        start local 16 // byte[] newFirstRecord
        35: .line 246
            aload 14 /* result */
            iconst_0
            aload 16 /* newFirstRecord */
            iconst_0
            aload 14 /* result */
            arraylength
            invokestatic java.lang.System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V
        36: .line 247
            aload 12 /* dupFirst */
            aload 16 /* newFirstRecord */
            aload 14 /* result */
            arraylength
            aload 12 /* dupFirst */
            invokevirtual java.nio.ByteBuffer.remaining:()I
            invokevirtual java.nio.ByteBuffer.get:([BII)Ljava/nio/ByteBuffer;
            pop
        37: .line 248
            aload 1 /* dataToUnwrap */
            aload 1 /* dataToUnwrap */
            invokevirtual java.nio.ByteBuffer.limit:()I
            invokevirtual java.nio.ByteBuffer.position:(I)Ljava/nio/Buffer;
            pop
        38: .line 250
            aload 13 /* firstLessFraming */
            invokevirtual java.nio.ByteBuffer.remaining:()I
            newarray 8
            astore 17 /* originalFirstRecord */
        start local 17 // byte[] originalFirstRecord
        39: .line 251
            aload 13 /* firstLessFraming */
            aload 17 /* originalFirstRecord */
            invokevirtual java.nio.ByteBuffer.get:([B)Ljava/nio/ByteBuffer;
            pop
        40: .line 253
            aload 16 /* newFirstRecord */
            aload 9 /* records */
            invokestatic io.undertow.protocols.ssl.ALPNHackServerHelloExplorer.createNewOutputRecords:([BLjava/util/List;)Ljava/nio/ByteBuffer;
            astore 18 /* newData */
        start local 18 // java.nio.ByteBuffer newData
        41: .line 254
            aload 1 /* dataToUnwrap */
            invokevirtual java.nio.ByteBuffer.clear:()Ljava/nio/Buffer;
            pop
        42: .line 255
            aload 1 /* dataToUnwrap */
            aload 18 /* newData */
            invokevirtual java.nio.ByteBuffer.put:(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;
            pop
        43: .line 256
            aload 1 /* dataToUnwrap */
            invokevirtual java.nio.ByteBuffer.flip:()Ljava/nio/Buffer;
            pop
        44: .line 257
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.ALPNHackClientByteArrayOutputStream:Lio/undertow/protocols/ssl/ALPNHackClientByteArrayOutputStream;
            aload 17 /* originalFirstRecord */
            invokevirtual io.undertow.protocols.ssl.ALPNHackClientByteArrayOutputStream.setReceivedServerHello:([B)V
        end local 18 // java.nio.ByteBuffer newData
        end local 17 // byte[] originalFirstRecord
        end local 16 // byte[] newFirstRecord
        end local 15 // int newFirstRecordLength
        end local 14 // byte[] result
        end local 13 // java.nio.ByteBuffer firstLessFraming
        end local 12 // java.nio.ByteBuffer dupFirst
        end local 11 // java.util.concurrent.atomic.AtomicReference alpnResult
        end local 10 // java.nio.ByteBuffer firstRecord
        end local 9 // java.util.List records
        end local 8 // int minor
        end local 7 // int major
        end local 6 // int type
        end local 5 // java.nio.ByteBuffer dup
        45: .line 260
            goto 48
      StackMap locals:
      StackMap stack: java.nio.BufferUnderflowException
        46: pop
        47: .line 261
            new javax.net.ssl.SSLEngineResult
            dup
            getstatic javax.net.ssl.SSLEngineResult$Status.BUFFER_UNDERFLOW:Ljavax/net/ssl/SSLEngineResult$Status;
            getstatic javax.net.ssl.SSLEngineResult$HandshakeStatus.NEED_UNWRAP:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
            iconst_0
            iconst_0
            invokespecial javax.net.ssl.SSLEngineResult.<init>:(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V
            areturn
        48: .line 265
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            aload 1 /* dataToUnwrap */
            aload 2 /* byteBuffers */
            iload 3 /* i */
            iload 4 /* i1 */
            invokevirtual javax.net.ssl.SSLEngine.unwrap:(Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;II)Ljavax/net/ssl/SSLEngineResult;
            astore 5 /* res */
        start local 5 // javax.net.ssl.SSLEngineResult res
        49: .line 266
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.getUseClientMode:()Z
            ifne 51
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.selectedApplicationProtocol:Ljava/lang/String;
            ifnull 51
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.alpnHackServerByteArrayOutputStream:Lio/undertow/protocols/ssl/ALPNHackServerByteArrayOutputStream;
            ifnonnull 51
        50: .line 267
            aload 0 /* this */
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.selectedApplicationProtocol:Ljava/lang/String;
            invokestatic io.undertow.protocols.ssl.ALPNHackSSLEngine.replaceServerByteOutput:(Ljavax/net/ssl/SSLEngine;Ljava/lang/String;)Lio/undertow/protocols/ssl/ALPNHackServerByteArrayOutputStream;
            putfield io.undertow.protocols.ssl.ALPNHackSSLEngine.alpnHackServerByteArrayOutputStream:Lio/undertow/protocols/ssl/ALPNHackServerByteArrayOutputStream;
        51: .line 269
      StackMap locals: javax.net.ssl.SSLEngineResult
      StackMap stack:
            aload 5 /* res */
            areturn
        end local 5 // javax.net.ssl.SSLEngineResult res
        end local 4 // int i1
        end local 3 // int i
        end local 2 // java.nio.ByteBuffer[] byteBuffers
        end local 1 // java.nio.ByteBuffer dataToUnwrap
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot                  Name  Signature
            0   52     0                  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;
            0   52     1          dataToUnwrap  Ljava/nio/ByteBuffer;
            0   52     2           byteBuffers  [Ljava/nio/ByteBuffer;
            0   52     3                     i  I
            0   52     4                    i1  I
            3   11     5                result  Ljava/util/List<Ljava/lang/String;>;
            6    9     6              protocol  Ljava/lang/String;
           18   45     5                   dup  Ljava/nio/ByteBuffer;
           19   45     6                  type  I
           20   45     7                 major  I
           21   45     8                 minor  I
           23   45     9               records  Ljava/util/List<Ljava/nio/ByteBuffer;>;
           24   45    10           firstRecord  Ljava/nio/ByteBuffer;
           25   45    11            alpnResult  Ljava/util/concurrent/atomic/AtomicReference<Ljava/lang/String;>;
           26   45    12              dupFirst  Ljava/nio/ByteBuffer;
           28   45    13      firstLessFraming  Ljava/nio/ByteBuffer;
           29   45    14                result  [B
           34   45    15  newFirstRecordLength  I
           35   45    16        newFirstRecord  [B
           39   45    17   originalFirstRecord  [B
           41   45    18               newData  Ljava/nio/ByteBuffer;
           49   52     5                   res  Ljavax/net/ssl/SSLEngineResult;
      Exception table:
        from    to  target  type
           2    11      12  Class java.nio.BufferUnderflowException
          17    45      46  Class java.nio.BufferUnderflowException
    Exceptions:
      throws javax.net.ssl.SSLException
    MethodParameters:
              Name  Flags
      dataToUnwrap  
      byteBuffers   
      i             
      i1            

  public java.lang.Runnable getDelegatedTask();
    descriptor: ()Ljava/lang/Runnable;
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 274
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.getDelegatedTask:()Ljava/lang/Runnable;
            areturn
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;

  public void closeInbound();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 279
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.closeInbound:()V
         1: .line 280
            return
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    2     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;
    Exceptions:
      throws javax.net.ssl.SSLException

  public boolean isInboundDone();
    descriptor: ()Z
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 284
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.isInboundDone:()Z
            ireturn
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;

  public void closeOutbound();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 289
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.closeOutbound:()V
         1: .line 290
            return
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    2     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;

  public boolean isOutboundDone();
    descriptor: ()Z
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 294
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.isOutboundDone:()Z
            ireturn
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;

  public java.lang.String[] getSupportedCipherSuites();
    descriptor: ()[Ljava/lang/String;
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 299
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.getSupportedCipherSuites:()[Ljava/lang/String;
            areturn
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;

  public java.lang.String[] getEnabledCipherSuites();
    descriptor: ()[Ljava/lang/String;
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 304
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.getEnabledCipherSuites:()[Ljava/lang/String;
            areturn
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;

  public void setEnabledCipherSuites(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
        start local 1 // java.lang.String[] strings
         0: .line 309
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            aload 1 /* strings */
            invokevirtual javax.net.ssl.SSLEngine.setEnabledCipherSuites:([Ljava/lang/String;)V
         1: .line 310
            return
        end local 1 // java.lang.String[] strings
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot     Name  Signature
            0    2     0     this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;
            0    2     1  strings  [Ljava/lang/String;
    MethodParameters:
         Name  Flags
      strings  

  public java.lang.String[] getSupportedProtocols();
    descriptor: ()[Ljava/lang/String;
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 314
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.getSupportedProtocols:()[Ljava/lang/String;
            areturn
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;

  public java.lang.String[] getEnabledProtocols();
    descriptor: ()[Ljava/lang/String;
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 319
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.getEnabledProtocols:()[Ljava/lang/String;
            areturn
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;

  public void setEnabledProtocols(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
        start local 1 // java.lang.String[] strings
         0: .line 324
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            aload 1 /* strings */
            invokevirtual javax.net.ssl.SSLEngine.setEnabledProtocols:([Ljava/lang/String;)V
         1: .line 325
            return
        end local 1 // java.lang.String[] strings
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot     Name  Signature
            0    2     0     this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;
            0    2     1  strings  [Ljava/lang/String;
    MethodParameters:
         Name  Flags
      strings  

  public javax.net.ssl.SSLSession getSession();
    descriptor: ()Ljavax/net/ssl/SSLSession;
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 329
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.getSession:()Ljavax/net/ssl/SSLSession;
            areturn
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;

  public void beginHandshake();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 334
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.beginHandshake:()V
         1: .line 335
            return
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    2     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;
    Exceptions:
      throws javax.net.ssl.SSLException

  public javax.net.ssl.SSLEngineResult$HandshakeStatus getHandshakeStatus();
    descriptor: ()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 339
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.getHandshakeStatus:()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
            areturn
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;

  public void setUseClientMode(boolean);
    descriptor: (Z)V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
        start local 1 // boolean b
         0: .line 344
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            iload 1 /* b */
            invokevirtual javax.net.ssl.SSLEngine.setUseClientMode:(Z)V
         1: .line 345
            return
        end local 1 // boolean b
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    2     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;
            0    2     1     b  Z
    MethodParameters:
      Name  Flags
      b     

  public boolean getUseClientMode();
    descriptor: ()Z
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 349
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.getUseClientMode:()Z
            ireturn
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;

  public void setNeedClientAuth(boolean);
    descriptor: (Z)V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
        start local 1 // boolean b
         0: .line 354
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            iload 1 /* b */
            invokevirtual javax.net.ssl.SSLEngine.setNeedClientAuth:(Z)V
         1: .line 355
            return
        end local 1 // boolean b
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    2     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;
            0    2     1     b  Z
    MethodParameters:
      Name  Flags
      b     

  public boolean getNeedClientAuth();
    descriptor: ()Z
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 359
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.getNeedClientAuth:()Z
            ireturn
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;

  public void setWantClientAuth(boolean);
    descriptor: (Z)V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
        start local 1 // boolean b
         0: .line 364
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            iload 1 /* b */
            invokevirtual javax.net.ssl.SSLEngine.setWantClientAuth:(Z)V
         1: .line 365
            return
        end local 1 // boolean b
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    2     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;
            0    2     1     b  Z
    MethodParameters:
      Name  Flags
      b     

  public boolean getWantClientAuth();
    descriptor: ()Z
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 369
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.getWantClientAuth:()Z
            ireturn
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;

  public void setEnableSessionCreation(boolean);
    descriptor: (Z)V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
        start local 1 // boolean b
         0: .line 374
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            iload 1 /* b */
            invokevirtual javax.net.ssl.SSLEngine.setEnableSessionCreation:(Z)V
         1: .line 375
            return
        end local 1 // boolean b
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    2     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;
            0    2     1     b  Z
    MethodParameters:
      Name  Flags
      b     

  public boolean getEnableSessionCreation();
    descriptor: ()Z
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 379
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.delegate:Ljavax/net/ssl/SSLEngine;
            invokevirtual javax.net.ssl.SSLEngine.getEnableSessionCreation:()Z
            ireturn
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;

  public void setApplicationProtocols(java.util.List<java.lang.String>);
    descriptor: (Ljava/util/List;)V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
        start local 1 // java.util.List applicationProtocols
         0: .line 389
            aload 0 /* this */
            aload 1 /* applicationProtocols */
            putfield io.undertow.protocols.ssl.ALPNHackSSLEngine.applicationProtocols:Ljava/util/List;
         1: .line 390
            return
        end local 1 // java.util.List applicationProtocols
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot                  Name  Signature
            0    2     0                  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;
            0    2     1  applicationProtocols  Ljava/util/List<Ljava/lang/String;>;
    Signature: (Ljava/util/List<Ljava/lang/String;>;)V
    MethodParameters:
                      Name  Flags
      applicationProtocols  

  public java.util.List<java.lang.String> getApplicationProtocols();
    descriptor: ()Ljava/util/List;
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 398
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.applicationProtocols:Ljava/util/List;
            areturn
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;
    Signature: ()Ljava/util/List<Ljava/lang/String;>;

  public java.lang.String getSelectedApplicationProtocol();
    descriptor: ()Ljava/lang/String;
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
         0: .line 407
            aload 0 /* this */
            getfield io.undertow.protocols.ssl.ALPNHackSSLEngine.selectedApplicationProtocol:Ljava/lang/String;
            areturn
        end local 0 // io.undertow.protocols.ssl.ALPNHackSSLEngine this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lio/undertow/protocols/ssl/ALPNHackSSLEngine;

  static io.undertow.protocols.ssl.ALPNHackServerByteArrayOutputStream replaceServerByteOutput(javax.net.ssl.SSLEngine, java.lang.String);
    descriptor: (Ljavax/net/ssl/SSLEngine;Ljava/lang/String;)Lio/undertow/protocols/ssl/ALPNHackServerByteArrayOutputStream;
    flags: (0x0008) ACC_STATIC
    Code:
      stack=5, locals=6, args_size=2
        start local 0 // javax.net.ssl.SSLEngine sslEngine
        start local 1 // java.lang.String selectedAlpnProtocol
         0: .line 413
            getstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKER:Ljava/lang/reflect/Field;
            aload 0 /* sslEngine */
            invokevirtual java.lang.reflect.Field.get:(Ljava/lang/Object;)Ljava/lang/Object;
            astore 2 /* handshaker */
        start local 2 // java.lang.Object handshaker
         1: .line 414
            getstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKE_HASH:Ljava/lang/reflect/Field;
            aload 2 /* handshaker */
            invokevirtual java.lang.reflect.Field.get:(Ljava/lang/Object;)Ljava/lang/Object;
            astore 3 /* hash */
        start local 3 // java.lang.Object hash
         2: .line 415
            getstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKE_HASH_DATA:Ljava/lang/reflect/Field;
            aload 3 /* hash */
            invokevirtual java.lang.reflect.Field.get:(Ljava/lang/Object;)Ljava/lang/Object;
            checkcast java.io.ByteArrayOutputStream
            astore 4 /* existing */
        start local 4 // java.io.ByteArrayOutputStream existing
         3: .line 417
            new io.undertow.protocols.ssl.ALPNHackServerByteArrayOutputStream
            dup
            aload 0 /* sslEngine */
            aload 4 /* existing */
            invokevirtual java.io.ByteArrayOutputStream.toByteArray:()[B
            aload 1 /* selectedAlpnProtocol */
            invokespecial io.undertow.protocols.ssl.ALPNHackServerByteArrayOutputStream.<init>:(Ljavax/net/ssl/SSLEngine;[BLjava/lang/String;)V
            astore 5 /* out */
        start local 5 // io.undertow.protocols.ssl.ALPNHackServerByteArrayOutputStream out
         4: .line 418
            getstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKE_HASH_DATA:Ljava/lang/reflect/Field;
            aload 3 /* hash */
            aload 5 /* out */
            invokevirtual java.lang.reflect.Field.set:(Ljava/lang/Object;Ljava/lang/Object;)V
         5: .line 419
            aload 5 /* out */
         6: areturn
        end local 5 // io.undertow.protocols.ssl.ALPNHackServerByteArrayOutputStream out
        end local 4 // java.io.ByteArrayOutputStream existing
        end local 3 // java.lang.Object hash
        end local 2 // java.lang.Object handshaker
         7: .line 420
      StackMap locals:
      StackMap stack: java.lang.Exception
            astore 2 /* e */
        start local 2 // java.lang.Exception e
         8: .line 421
            getstatic io.undertow.UndertowLogger.ROOT_LOGGER:Lio/undertow/UndertowLogger;
            ldc "Failed to replace hash output stream "
            aload 2 /* e */
            invokeinterface io.undertow.UndertowLogger.debug:(Ljava/lang/Object;Ljava/lang/Throwable;)V
         9: .line 422
            aconst_null
            areturn
        end local 2 // java.lang.Exception e
        end local 1 // java.lang.String selectedAlpnProtocol
        end local 0 // javax.net.ssl.SSLEngine sslEngine
      LocalVariableTable:
        Start  End  Slot                  Name  Signature
            0   10     0             sslEngine  Ljavax/net/ssl/SSLEngine;
            0   10     1  selectedAlpnProtocol  Ljava/lang/String;
            1    7     2            handshaker  Ljava/lang/Object;
            2    7     3                  hash  Ljava/lang/Object;
            3    7     4              existing  Ljava/io/ByteArrayOutputStream;
            4    7     5                   out  Lio/undertow/protocols/ssl/ALPNHackServerByteArrayOutputStream;
            8   10     2                     e  Ljava/lang/Exception;
      Exception table:
        from    to  target  type
           0     6       7  Class java.lang.Exception
    MethodParameters:
                      Name  Flags
      sslEngine             
      selectedAlpnProtocol  

  static io.undertow.protocols.ssl.ALPNHackClientByteArrayOutputStream replaceClientByteOutput(javax.net.ssl.SSLEngine);
    descriptor: (Ljavax/net/ssl/SSLEngine;)Lio/undertow/protocols/ssl/ALPNHackClientByteArrayOutputStream;
    flags: (0x0008) ACC_STATIC
    Code:
      stack=3, locals=4, args_size=1
        start local 0 // javax.net.ssl.SSLEngine sslEngine
         0: .line 428
            getstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKER:Ljava/lang/reflect/Field;
            aload 0 /* sslEngine */
            invokevirtual java.lang.reflect.Field.get:(Ljava/lang/Object;)Ljava/lang/Object;
            astore 1 /* handshaker */
        start local 1 // java.lang.Object handshaker
         1: .line 429
            getstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKE_HASH:Ljava/lang/reflect/Field;
            aload 1 /* handshaker */
            invokevirtual java.lang.reflect.Field.get:(Ljava/lang/Object;)Ljava/lang/Object;
            astore 2 /* hash */
        start local 2 // java.lang.Object hash
         2: .line 431
            new io.undertow.protocols.ssl.ALPNHackClientByteArrayOutputStream
            dup
            aload 0 /* sslEngine */
            invokespecial io.undertow.protocols.ssl.ALPNHackClientByteArrayOutputStream.<init>:(Ljavax/net/ssl/SSLEngine;)V
            astore 3 /* out */
        start local 3 // io.undertow.protocols.ssl.ALPNHackClientByteArrayOutputStream out
         3: .line 432
            getstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKE_HASH_DATA:Ljava/lang/reflect/Field;
            aload 2 /* hash */
            aload 3 /* out */
            invokevirtual java.lang.reflect.Field.set:(Ljava/lang/Object;Ljava/lang/Object;)V
         4: .line 433
            aload 3 /* out */
         5: areturn
        end local 3 // io.undertow.protocols.ssl.ALPNHackClientByteArrayOutputStream out
        end local 2 // java.lang.Object hash
        end local 1 // java.lang.Object handshaker
         6: .line 434
      StackMap locals:
      StackMap stack: java.lang.Exception
            astore 1 /* e */
        start local 1 // java.lang.Exception e
         7: .line 435
            getstatic io.undertow.UndertowLogger.ROOT_LOGGER:Lio/undertow/UndertowLogger;
            ldc "Failed to replace hash output stream "
            aload 1 /* e */
            invokeinterface io.undertow.UndertowLogger.debug:(Ljava/lang/Object;Ljava/lang/Throwable;)V
         8: .line 436
            aconst_null
            areturn
        end local 1 // java.lang.Exception e
        end local 0 // javax.net.ssl.SSLEngine sslEngine
      LocalVariableTable:
        Start  End  Slot        Name  Signature
            0    9     0   sslEngine  Ljavax/net/ssl/SSLEngine;
            1    6     1  handshaker  Ljava/lang/Object;
            2    6     2        hash  Ljava/lang/Object;
            3    6     3         out  Lio/undertow/protocols/ssl/ALPNHackClientByteArrayOutputStream;
            7    9     1           e  Ljava/lang/Exception;
      Exception table:
        from    to  target  type
           0     5       6  Class java.lang.Exception
    MethodParameters:
           Name  Flags
      sslEngine  

  static void regenerateHashes(javax.net.ssl.SSLEngine, java.io.ByteArrayOutputStream, byte[][]);
    descriptor: (Ljavax/net/ssl/SSLEngine;Ljava/io/ByteArrayOutputStream;[[B)V
    flags: (0x0088) ACC_STATIC, ACC_VARARGS
    Code:
      stack=6, locals=11, args_size=3
        start local 0 // javax.net.ssl.SSLEngine sslEngineToHack
        start local 1 // java.io.ByteArrayOutputStream data
        start local 2 // byte[][] hashBytes
         0: .line 442
            getstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKER:Ljava/lang/reflect/Field;
            aload 0 /* sslEngineToHack */
            invokevirtual java.lang.reflect.Field.get:(Ljava/lang/Object;)Ljava/lang/Object;
            astore 3 /* handshaker */
        start local 3 // java.lang.Object handshaker
         1: .line 443
            getstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKE_HASH:Ljava/lang/reflect/Field;
            aload 3 /* handshaker */
            invokevirtual java.lang.reflect.Field.get:(Ljava/lang/Object;)Ljava/lang/Object;
            astore 4 /* hash */
        start local 4 // java.lang.Object hash
         2: .line 444
            aload 1 /* data */
            invokevirtual java.io.ByteArrayOutputStream.reset:()V
         3: .line 445
            getstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKER_PROTOCOL_VERSION:Ljava/lang/reflect/Field;
            aload 3 /* handshaker */
            invokevirtual java.lang.reflect.Field.get:(Ljava/lang/Object;)Ljava/lang/Object;
            astore 5 /* protocolVersion */
        start local 5 // java.lang.Object protocolVersion
         4: .line 446
            getstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKE_HASH_VERSION:Ljava/lang/reflect/Field;
            aload 4 /* hash */
            iconst_m1
            invokestatic java.lang.Integer.valueOf:(I)Ljava/lang/Integer;
            invokevirtual java.lang.reflect.Field.set:(Ljava/lang/Object;Ljava/lang/Object;)V
         5: .line 447
            getstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKE_HASH_PROTOCOL_DETERMINED:Ljava/lang/reflect/Method;
            aload 4 /* hash */
            iconst_1
            anewarray java.lang.Object
            dup
            iconst_0
            aload 5 /* protocolVersion */
            aastore
            invokevirtual java.lang.reflect.Method.invoke:(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
            pop
         6: .line 448
            getstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKE_HASH_FIN_MD:Ljava/lang/reflect/Field;
            aload 4 /* hash */
            invokevirtual java.lang.reflect.Field.get:(Ljava/lang/Object;)Ljava/lang/Object;
            checkcast java.security.MessageDigest
            astore 6 /* digest */
        start local 6 // java.security.MessageDigest digest
         7: .line 449
            aload 6 /* digest */
            invokevirtual java.security.MessageDigest.reset:()V
         8: .line 450
            aload 2 /* hashBytes */
            dup
            astore 10
            arraylength
            istore 9
            iconst_0
            istore 8
            goto 12
      StackMap locals: javax.net.ssl.SSLEngine java.io.ByteArrayOutputStream byte[][] java.lang.Object java.lang.Object java.lang.Object java.security.MessageDigest top int int byte[][]
      StackMap stack:
         9: aload 10
            iload 8
            aaload
            astore 7 /* b */
        start local 7 // byte[] b
        10: .line 451
            getstatic io.undertow.protocols.ssl.ALPNHackSSLEngine.HANDSHAKE_HASH_UPDATE:Ljava/lang/reflect/Method;
            aload 4 /* hash */
            iconst_3
            anewarray java.lang.Object
            dup
            iconst_0
            aload 7 /* b */
            aastore
            dup
            iconst_1
            iconst_0
            invokestatic java.lang.Integer.valueOf:(I)Ljava/lang/Integer;
            aastore
            dup
            iconst_2
            aload 7 /* b */
            arraylength
            invokestatic java.lang.Integer.valueOf:(I)Ljava/lang/Integer;
            aastore
            invokevirtual java.lang.reflect.Method.invoke:(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
            pop
        end local 7 // byte[] b
        11: .line 450
            iinc 8 1
      StackMap locals:
      StackMap stack:
        12: iload 8
            iload 9
            if_icmplt 9
        end local 6 // java.security.MessageDigest digest
        end local 5 // java.lang.Object protocolVersion
        end local 4 // java.lang.Object hash
        end local 3 // java.lang.Object handshaker
        13: .line 453
            goto 17
      StackMap locals: javax.net.ssl.SSLEngine java.io.ByteArrayOutputStream byte[][]
      StackMap stack: java.lang.Exception
        14: astore 3 /* e */
        start local 3 // java.lang.Exception e
        15: .line 454
            aload 3 /* e */
            invokevirtual java.lang.Exception.printStackTrace:()V
        16: .line 455
            new java.lang.RuntimeException
            dup
            aload 3 /* e */
            invokespecial java.lang.RuntimeException.<init>:(Ljava/lang/Throwable;)V
            athrow
        end local 3 // java.lang.Exception e
        17: .line 457
      StackMap locals:
      StackMap stack:
            return
        end local 2 // byte[][] hashBytes
        end local 1 // java.io.ByteArrayOutputStream data
        end local 0 // javax.net.ssl.SSLEngine sslEngineToHack
      LocalVariableTable:
        Start  End  Slot             Name  Signature
            0   18     0  sslEngineToHack  Ljavax/net/ssl/SSLEngine;
            0   18     1             data  Ljava/io/ByteArrayOutputStream;
            0   18     2        hashBytes  [[B
            1   13     3       handshaker  Ljava/lang/Object;
            2   13     4             hash  Ljava/lang/Object;
            4   13     5  protocolVersion  Ljava/lang/Object;
            7   13     6           digest  Ljava/security/MessageDigest;
           10   11     7                b  [B
           15   17     3                e  Ljava/lang/Exception;
      Exception table:
        from    to  target  type
           0    13      14  Class java.lang.Exception
    MethodParameters:
                 Name  Flags
      sslEngineToHack  
      data             
      hashBytes        
}
SourceFile: "ALPNHackSSLEngine.java"
InnerClasses:
  public final HandshakeStatus = javax.net.ssl.SSLEngineResult$HandshakeStatus of javax.net.ssl.SSLEngineResult
  public final Status = javax.net.ssl.SSLEngineResult$Status of javax.net.ssl.SSLEngineResult