/*
 * WARNING: do not edit!
 * Generated by Makefile from include/openssl/ssl.h.in
 *
 * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
 * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
 * Copyright 2005 Nokia. All rights reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */



#ifndef OPENSSL_SSL_H
# define OPENSSL_SSL_H
# pragma once

# include <openssl/macros.h>
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define HEADER_SSL_H
# endif

# include <openssl/e_os2.h>
# include <openssl/opensslconf.h>
# include <openssl/comp.h>
# include <openssl/bio.h>
# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  include <openssl/x509.h>
#  include <openssl/crypto.h>
#  include <openssl/buffer.h>
# endif
# include <openssl/lhash.h>
# include <openssl/pem.h>
# include <openssl/hmac.h>
# include <openssl/async.h>

# include <openssl/safestack.h>
# include <openssl/symhacks.h>
# include <openssl/ct.h>
# include <openssl/sslerr.h>
# include <openssl/prov_ssl.h>

#ifdef  __cplusplus
extern "C" {
#endif

/* OpenSSL version number for ASN.1 encoding of the session information */
/*-
 * Version 0 - initial version
 * Version 1 - added the optional peer certificate
 */
# define SSL_SESSION_ASN1_VERSION 0x0001

# define SSL_MAX_SSL_SESSION_ID_LENGTH           32
# define SSL_MAX_SID_CTX_LENGTH                  32

# define SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES     (512/8)
# define SSL_MAX_KEY_ARG_LENGTH                  8
/* SSL_MAX_MASTER_KEY_LENGTH is defined in prov_ssl.h */

/* The maximum number of encrypt/decrypt pipelines we can support */
# define SSL_MAX_PIPELINES  32

/* text strings for the ciphers */

/* These are used to specify which ciphers to use and not to use */

# define SSL_TXT_LOW             "LOW"
# define SSL_TXT_MEDIUM          "MEDIUM"
# define SSL_TXT_HIGH            "HIGH"
# define SSL_TXT_FIPS            "FIPS"

# define SSL_TXT_aNULL           "aNULL"
# define SSL_TXT_eNULL           "eNULL"
# define SSL_TXT_NULL            "NULL"

# define SSL_TXT_kRSA            "kRSA"
# define SSL_TXT_kDHr            "kDHr"/* this cipher class has been removed */
# define SSL_TXT_kDHd            "kDHd"/* this cipher class has been removed */
# define SSL_TXT_kDH             "kDH"/* this cipher class has been removed */
# define SSL_TXT_kEDH            "kEDH"/* alias for kDHE */
# define SSL_TXT_kDHE            "kDHE"
# define SSL_TXT_kECDHr          "kECDHr"/* this cipher class has been removed */
# define SSL_TXT_kECDHe          "kECDHe"/* this cipher class has been removed */
# define SSL_TXT_kECDH           "kECDH"/* this cipher class has been removed */
# define SSL_TXT_kEECDH          "kEECDH"/* alias for kECDHE */
# define SSL_TXT_kECDHE          "kECDHE"
# define SSL_TXT_kPSK            "kPSK"
# define SSL_TXT_kRSAPSK         "kRSAPSK"
# define SSL_TXT_kECDHEPSK       "kECDHEPSK"
# define SSL_TXT_kDHEPSK         "kDHEPSK"
# define SSL_TXT_kGOST           "kGOST"
# define SSL_TXT_kGOST18         "kGOST18"
# define SSL_TXT_kSRP            "kSRP"

# define SSL_TXT_aRSA            "aRSA"
# define SSL_TXT_aDSS            "aDSS"
# define SSL_TXT_aDH             "aDH"/* this cipher class has been removed */
# define SSL_TXT_aECDH           "aECDH"/* this cipher class has been removed */
# define SSL_TXT_aECDSA          "aECDSA"
# define SSL_TXT_aPSK            "aPSK"
# define SSL_TXT_aGOST94         "aGOST94"
# define SSL_TXT_aGOST01         "aGOST01"
# define SSL_TXT_aGOST12         "aGOST12"
# define SSL_TXT_aGOST           "aGOST"
# define SSL_TXT_aSRP            "aSRP"

# define SSL_TXT_DSS             "DSS"
# define SSL_TXT_DH              "DH"
# define SSL_TXT_DHE             "DHE"/* same as "kDHE:-ADH" */
# define SSL_TXT_EDH             "EDH"/* alias for DHE */
# define SSL_TXT_ADH             "ADH"
# define SSL_TXT_RSA             "RSA"
# define SSL_TXT_ECDH            "ECDH"
# define SSL_TXT_EECDH           "EECDH"/* alias for ECDHE" */
# define SSL_TXT_ECDHE           "ECDHE"/* same as "kECDHE:-AECDH" */
# define SSL_TXT_AECDH           "AECDH"
# define SSL_TXT_ECDSA           "ECDSA"
# define SSL_TXT_PSK             "PSK"
# define SSL_TXT_SRP             "SRP"

# define SSL_TXT_DES             "DES"
# define SSL_TXT_3DES            "3DES"
# define SSL_TXT_RC4             "RC4"
# define SSL_TXT_RC2             "RC2"
# define SSL_TXT_IDEA            "IDEA"
# define SSL_TXT_SEED            "SEED"
# define SSL_TXT_AES128          "AES128"
# define SSL_TXT_AES256          "AES256"
# define SSL_TXT_AES             "AES"
# define SSL_TXT_AES_GCM         "AESGCM"
# define SSL_TXT_AES_CCM         "AESCCM"
# define SSL_TXT_AES_CCM_8       "AESCCM8"
# define SSL_TXT_CAMELLIA128     "CAMELLIA128"
# define SSL_TXT_CAMELLIA256     "CAMELLIA256"
# define SSL_TXT_CAMELLIA        "CAMELLIA"
# define SSL_TXT_CHACHA20        "CHACHA20"
# define SSL_TXT_GOST            "GOST89"
# define SSL_TXT_ARIA            "ARIA"
# define SSL_TXT_ARIA_GCM        "ARIAGCM"
# define SSL_TXT_ARIA128         "ARIA128"
# define SSL_TXT_ARIA256         "ARIA256"
# define SSL_TXT_GOST2012_GOST8912_GOST8912 "GOST2012-GOST8912-GOST8912"
# define SSL_TXT_CBC             "CBC"

# define SSL_TXT_MD5             "MD5"
# define SSL_TXT_SHA1            "SHA1"
# define SSL_TXT_SHA             "SHA"/* same as "SHA1" */
# define SSL_TXT_GOST94          "GOST94"
# define SSL_TXT_GOST89MAC       "GOST89MAC"
# define SSL_TXT_GOST12          "GOST12"
# define SSL_TXT_GOST89MAC12     "GOST89MAC12"
# define SSL_TXT_SHA256          "SHA256"
# define SSL_TXT_SHA384          "SHA384"

# define SSL_TXT_SSLV3           "SSLv3"
# define SSL_TXT_TLSV1           "TLSv1"
# define SSL_TXT_TLSV1_1         "TLSv1.1"
# define SSL_TXT_TLSV1_2         "TLSv1.2"

# define SSL_TXT_ALL             "ALL"

/*-
 * COMPLEMENTOF* definitions. These identifiers are used to (de-select)
 * ciphers normally not being used.
 * Example: "RC4" will activate all ciphers using RC4 including ciphers
 * without authentication, which would normally disabled by DEFAULT (due
 * the "!ADH" being part of default). Therefore "RC4:!COMPLEMENTOFDEFAULT"
 * will make sure that it is also disabled in the specific selection.
 * COMPLEMENTOF* identifiers are portable between version, as adjustments
 * to the default cipher setup will also be included here.
 *
 * COMPLEMENTOFDEFAULT does not experience the same special treatment that
 * DEFAULT gets, as only selection is being done and no sorting as needed
 * for DEFAULT.
 */
# define SSL_TXT_CMPALL          "COMPLEMENTOFALL"
# define SSL_TXT_CMPDEF          "COMPLEMENTOFDEFAULT"

/*
 * The following cipher list is used by default. It also is substituted when
 * an application-defined cipher list string starts with 'DEFAULT'.
 * This applies to ciphersuites for TLSv1.2 and below.
 * DEPRECATED IN 3.0.0, in favor of OSSL_default_cipher_list()
 * Update both macro and function simultaneously
 */
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_DEFAULT_CIPHER_LIST "ALL:!COMPLEMENTOFDEFAULT:!eNULL"
/*
 * This is the default set of TLSv1.3 ciphersuites
 * DEPRECATED IN 3.0.0, in favor of OSSL_default_ciphersuites()
 * Update both macro and function simultaneously
 */
#  define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \
                                   "TLS_CHACHA20_POLY1305_SHA256:" \
                                   "TLS_AES_128_GCM_SHA256"
# endif
/*
 * As of OpenSSL 1.0.0, ssl_create_cipher_list() in ssl/ssl_ciph.c always
 * starts with a reasonable order, and all we have to do for DEFAULT is
 * throwing out anonymous and unencrypted ciphersuites! (The latter are not
 * actually enabled by ALL, but "ALL:RSA" would enable some of them.)
 */

/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */
# define SSL_SENT_SHUTDOWN       1
# define SSL_RECEIVED_SHUTDOWN   2

#ifdef __cplusplus
}
#endif

#ifdef  __cplusplus
extern "C" {
#endif

# define SSL_FILETYPE_ASN1       X509_FILETYPE_ASN1
# define SSL_FILETYPE_PEM        X509_FILETYPE_PEM

/*
 * This is needed to stop compilers complaining about the 'struct ssl_st *'
 * function parameters used to prototype callbacks in SSL_CTX.
 */
typedef struct ssl_st *ssl_crock_st;
typedef struct tls_session_ticket_ext_st TLS_SESSION_TICKET_EXT;
typedef struct ssl_method_st SSL_METHOD;
typedef struct ssl_cipher_st SSL_CIPHER;
typedef struct ssl_session_st SSL_SESSION;
typedef struct tls_sigalgs_st TLS_SIGALGS;
typedef struct ssl_conf_ctx_st SSL_CONF_CTX;
typedef struct ssl_comp_st SSL_COMP;

STACK_OF(SSL_CIPHER);
STACK_OF(SSL_COMP);

/* SRTP protection profiles for use with the use_srtp extension (RFC 5764)*/
typedef struct srtp_protection_profile_st {
    const char *name;
    unsigned long id;
} SRTP_PROTECTION_PROFILE;
SKM_DEFINE_STACK_OF_INTERNAL(SRTP_PROTECTION_PROFILE, SRTP_PROTECTION_PROFILE, SRTP_PROTECTION_PROFILE)
#define sk_SRTP_PROTECTION_PROFILE_num(sk) OPENSSL_sk_num(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk))
#define sk_SRTP_PROTECTION_PROFILE_value(sk, idx) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_value(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk), (idx)))
#define sk_SRTP_PROTECTION_PROFILE_new(cmp) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new(ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp)))
#define sk_SRTP_PROTECTION_PROFILE_new_null() ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new_null())
#define sk_SRTP_PROTECTION_PROFILE_new_reserve(cmp, n) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new_reserve(ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp), (n)))
#define sk_SRTP_PROTECTION_PROFILE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (n))
#define sk_SRTP_PROTECTION_PROFILE_free(sk) OPENSSL_sk_free(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk))
#define sk_SRTP_PROTECTION_PROFILE_zero(sk) OPENSSL_sk_zero(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk))
#define sk_SRTP_PROTECTION_PROFILE_delete(sk, i) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_delete(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (i)))
#define sk_SRTP_PROTECTION_PROFILE_delete_ptr(sk, ptr) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_delete_ptr(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)))
#define sk_SRTP_PROTECTION_PROFILE_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))
#define sk_SRTP_PROTECTION_PROFILE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))
#define sk_SRTP_PROTECTION_PROFILE_pop(sk) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_pop(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk)))
#define sk_SRTP_PROTECTION_PROFILE_shift(sk) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_shift(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk)))
#define sk_SRTP_PROTECTION_PROFILE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk),ossl_check_SRTP_PROTECTION_PROFILE_freefunc_type(freefunc))
#define sk_SRTP_PROTECTION_PROFILE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr), (idx))
#define sk_SRTP_PROTECTION_PROFILE_set(sk, idx, ptr) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_set(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (idx), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)))
#define sk_SRTP_PROTECTION_PROFILE_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))
#define sk_SRTP_PROTECTION_PROFILE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))
#define sk_SRTP_PROTECTION_PROFILE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr), pnum)
#define sk_SRTP_PROTECTION_PROFILE_sort(sk) OPENSSL_sk_sort(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk))
#define sk_SRTP_PROTECTION_PROFILE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk))
#define sk_SRTP_PROTECTION_PROFILE_dup(sk) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_dup(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk)))
#define sk_SRTP_PROTECTION_PROFILE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_deep_copy(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_copyfunc_type(copyfunc), ossl_check_SRTP_PROTECTION_PROFILE_freefunc_type(freefunc)))
#define sk_SRTP_PROTECTION_PROFILE_set_cmp_func(sk, cmp) ((sk_SRTP_PROTECTION_PROFILE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp)))



typedef int (*tls_session_ticket_ext_cb_fn)(SSL *s, const unsigned char *data,
                                            int len, void *arg);
typedef int (*tls_session_secret_cb_fn)(SSL *s, void *secret, int *secret_len,
                                        STACK_OF(SSL_CIPHER) *peer_ciphers,
                                        const SSL_CIPHER **cipher, void *arg);

/* Extension context codes */
/* This extension is only allowed in TLS */
#define SSL_EXT_TLS_ONLY                        0x0001
/* This extension is only allowed in DTLS */
#define SSL_EXT_DTLS_ONLY                       0x0002
/* Some extensions may be allowed in DTLS but we don't implement them for it */
#define SSL_EXT_TLS_IMPLEMENTATION_ONLY         0x0004
/* Most extensions are not defined for SSLv3 but EXT_TYPE_renegotiate is */
#define SSL_EXT_SSL3_ALLOWED                    0x0008
/* Extension is only defined for TLS1.2 and below */
#define SSL_EXT_TLS1_2_AND_BELOW_ONLY           0x0010
/* Extension is only defined for TLS1.3 and above */
#define SSL_EXT_TLS1_3_ONLY                     0x0020
/* Ignore this extension during parsing if we are resuming */
#define SSL_EXT_IGNORE_ON_RESUMPTION            0x0040
#define SSL_EXT_CLIENT_HELLO                    0x0080
/* Really means TLS1.2 or below */
#define SSL_EXT_TLS1_2_SERVER_HELLO             0x0100
#define SSL_EXT_TLS1_3_SERVER_HELLO             0x0200
#define SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS     0x0400
#define SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST      0x0800
#define SSL_EXT_TLS1_3_CERTIFICATE              0x1000
#define SSL_EXT_TLS1_3_NEW_SESSION_TICKET       0x2000
#define SSL_EXT_TLS1_3_CERTIFICATE_REQUEST      0x4000

/* Typedefs for handling custom extensions */

typedef int (*custom_ext_add_cb)(SSL *s, unsigned int ext_type,
                                 const unsigned char **out, size_t *outlen,
                                 int *al, void *add_arg);

typedef void (*custom_ext_free_cb)(SSL *s, unsigned int ext_type,
                                   const unsigned char *out, void *add_arg);

typedef int (*custom_ext_parse_cb)(SSL *s, unsigned int ext_type,
                                   const unsigned char *in, size_t inlen,
                                   int *al, void *parse_arg);


typedef int (*SSL_custom_ext_add_cb_ex)(SSL *s, unsigned int ext_type,
                                        unsigned int context,
                                        const unsigned char **out,
                                        size_t *outlen, X509 *x,
                                        size_t chainidx,
                                        int *al, void *add_arg);

typedef void (*SSL_custom_ext_free_cb_ex)(SSL *s, unsigned int ext_type,
                                          unsigned int context,
                                          const unsigned char *out,
                                          void *add_arg);

typedef int (*SSL_custom_ext_parse_cb_ex)(SSL *s, unsigned int ext_type,
                                          unsigned int context,
                                          const unsigned char *in,
                                          size_t inlen, X509 *x,
                                          size_t chainidx,
                                          int *al, void *parse_arg);

/* Typedef for verification callback */
typedef int (*SSL_verify_cb)(int preverify_ok, X509_STORE_CTX *x509_ctx);

/* Typedef for SSL async callback */
typedef int (*SSL_async_callback_fn)(SSL *s, void *arg);

#define SSL_OP_BIT(n)  ((uint64_t)1 << (uint64_t)n)

/*
 * SSL/TLS connection options.
 */
    /* Disable Extended master secret */
# define SSL_OP_NO_EXTENDED_MASTER_SECRET                SSL_OP_BIT(0)
    /* Cleanse plaintext copies of data delivered to the application */
# define SSL_OP_CLEANSE_PLAINTEXT                        SSL_OP_BIT(1)
    /* Allow initial connection to servers that don't support RI */
# define SSL_OP_LEGACY_SERVER_CONNECT                    SSL_OP_BIT(2)
    /* Enable support for Kernel TLS */
# define SSL_OP_ENABLE_KTLS                              SSL_OP_BIT(3)
# define SSL_OP_TLSEXT_PADDING                           SSL_OP_BIT(4)
# define SSL_OP_SAFARI_ECDHE_ECDSA_BUG                   SSL_OP_BIT(6)
# define SSL_OP_IGNORE_UNEXPECTED_EOF                    SSL_OP_BIT(7)
# define SSL_OP_ALLOW_CLIENT_RENEGOTIATION               SSL_OP_BIT(8)
# define SSL_OP_DISABLE_TLSEXT_CA_NAMES                  SSL_OP_BIT(9)
    /* In TLSv1.3 allow a non-(ec)dhe based kex_mode */
# define SSL_OP_ALLOW_NO_DHE_KEX                         SSL_OP_BIT(10)
    /*
     * Disable SSL 3.0/TLS 1.0 CBC vulnerability workaround that was added
     * in OpenSSL 0.9.6d.  Usually (depending on the application protocol)
     * the workaround is not needed.  Unfortunately some broken SSL/TLS
     * implementations cannot handle it at all, which is why we include it
     * in SSL_OP_ALL. Added in 0.9.6e
     */
# define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS              SSL_OP_BIT(11)
    /* DTLS options */
# define SSL_OP_NO_QUERY_MTU                             SSL_OP_BIT(12)
    /* Turn on Cookie Exchange (on relevant for servers) */
# define SSL_OP_COOKIE_EXCHANGE                          SSL_OP_BIT(13)
    /* Don't use RFC4507 ticket extension */
# define SSL_OP_NO_TICKET                                SSL_OP_BIT(14)
# ifndef OPENSSL_NO_DTLS1_METHOD
    /*
     * Use Cisco's version identifier of DTLS_BAD_VER
     * (only with deprecated DTLSv1_client_method())
     */
#  define SSL_OP_CISCO_ANYCONNECT                        SSL_OP_BIT(15)
# endif
    /* As server, disallow session resumption on renegotiation */
# define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION   SSL_OP_BIT(16)
    /* Don't use compression even if supported */
# define SSL_OP_NO_COMPRESSION                           SSL_OP_BIT(17)
    /* Permit unsafe legacy renegotiation */
# define SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION        SSL_OP_BIT(18)
    /* Disable encrypt-then-mac */
# define SSL_OP_NO_ENCRYPT_THEN_MAC                      SSL_OP_BIT(19)
    /*
     * Enable TLSv1.3 Compatibility mode. This is on by default. A future
     * version of OpenSSL may have this disabled by default.
     */
# define SSL_OP_ENABLE_MIDDLEBOX_COMPAT                  SSL_OP_BIT(20)
    /*
     * Prioritize Chacha20Poly1305 when client does.
     * Modifies SSL_OP_CIPHER_SERVER_PREFERENCE
     */
# define SSL_OP_PRIORITIZE_CHACHA                        SSL_OP_BIT(21)
    /*
     * Set on servers to choose the cipher according to server's preferences.
     */
# define SSL_OP_CIPHER_SERVER_PREFERENCE                 SSL_OP_BIT(22)
    /*
     * If set, a server will allow a client to issue a SSLv3.0 version
     * number as latest version supported in the premaster secret, even when
     * TLSv1.0 (version 3.1) was announced in the client hello. Normally
     * this is forbidden to prevent version rollback attacks.
     */
# define SSL_OP_TLS_ROLLBACK_BUG                         SSL_OP_BIT(23)
    /*
     * Switches off automatic TLSv1.3 anti-replay protection for early data.
     * This is a server-side option only (no effect on the client).
     */
# define SSL_OP_NO_ANTI_REPLAY                           SSL_OP_BIT(24)
# define SSL_OP_NO_SSLv3                                 SSL_OP_BIT(25)
# define SSL_OP_NO_TLSv1                                 SSL_OP_BIT(26)
# define SSL_OP_NO_TLSv1_2                               SSL_OP_BIT(27)
# define SSL_OP_NO_TLSv1_1                               SSL_OP_BIT(28)
# define SSL_OP_NO_TLSv1_3                               SSL_OP_BIT(29)
# define SSL_OP_NO_DTLSv1                                SSL_OP_BIT(26)
# define SSL_OP_NO_DTLSv1_2                              SSL_OP_BIT(27)
    /* Disallow all renegotiation */
# define SSL_OP_NO_RENEGOTIATION                         SSL_OP_BIT(30)
    /*
     * Make server add server-hello extension from early version of
     * cryptopro draft, when GOST ciphersuite is negotiated. Required for
     * interoperability with CryptoPro CSP 3.x
     */
# define SSL_OP_CRYPTOPRO_TLSEXT_BUG                     SSL_OP_BIT(31)

/*
 * Option "collections."
 */
# define SSL_OP_NO_SSL_MASK \
        ( SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 \
          | SSL_OP_NO_TLSv1_2 | SSL_OP_NO_TLSv1_3 )
# define SSL_OP_NO_DTLS_MASK \
        ( SSL_OP_NO_DTLSv1 | SSL_OP_NO_DTLSv1_2 )

/* Various bug workarounds that should be rather harmless. */
# define SSL_OP_ALL \
        ( SSL_OP_CRYPTOPRO_TLSEXT_BUG | SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS \
          | SSL_OP_TLSEXT_PADDING | SSL_OP_SAFARI_ECDHE_ECDSA_BUG )

/*
 * OBSOLETE OPTIONS retained for compatibility
 */

# define SSL_OP_MICROSOFT_SESS_ID_BUG                    0x0
# define SSL_OP_NETSCAPE_CHALLENGE_BUG                   0x0
# define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG         0x0
# define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG              0x0
# define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER               0x0
# define SSL_OP_MSIE_SSLV2_RSA_PADDING                   0x0
# define SSL_OP_SSLEAY_080_CLIENT_DH_BUG                 0x0
# define SSL_OP_TLS_D5_BUG                               0x0
# define SSL_OP_TLS_BLOCK_PADDING_BUG                    0x0
# define SSL_OP_SINGLE_ECDH_USE                          0x0
# define SSL_OP_SINGLE_DH_USE                            0x0
# define SSL_OP_EPHEMERAL_RSA                            0x0
# define SSL_OP_NO_SSLv2                                 0x0
# define SSL_OP_PKCS1_CHECK_1                            0x0
# define SSL_OP_PKCS1_CHECK_2                            0x0
# define SSL_OP_NETSCAPE_CA_DN_BUG                       0x0
# define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG          0x0

/*
 * Allow SSL_write(..., n) to return r with 0 < r < n (i.e. report success
 * when just a single record has been written):
 */
# define SSL_MODE_ENABLE_PARTIAL_WRITE       0x00000001U
/*
 * Make it possible to retry SSL_write() with changed buffer location (buffer
 * contents must stay the same!); this is not the default to avoid the
 * misconception that non-blocking SSL_write() behaves like non-blocking
 * write():
 */
# define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 0x00000002U
/*
 * Never bother the application with retries if the transport is blocking:
 */
# define SSL_MODE_AUTO_RETRY 0x00000004U
/* Don't attempt to automatically build certificate chain */
# define SSL_MODE_NO_AUTO_CHAIN 0x00000008U
/*
 * Save RAM by releasing read and write buffers when they're empty. (SSL3 and
 * TLS only.) Released buffers are freed.
 */
# define SSL_MODE_RELEASE_BUFFERS 0x00000010U
/*
 * Send the current time in the Random fields of the ClientHello and
 * ServerHello records for compatibility with hypothetical implementations
 * that require it.
 */
# define SSL_MODE_SEND_CLIENTHELLO_TIME 0x00000020U
# define SSL_MODE_SEND_SERVERHELLO_TIME 0x00000040U
/*
 * Send TLS_FALLBACK_SCSV in the ClientHello. To be set only by applications
 * that reconnect with a downgraded protocol version; see
 * draft-ietf-tls-downgrade-scsv-00 for details. DO NOT ENABLE THIS if your
 * application attempts a normal handshake. Only use this in explicit
 * fallback retries, following the guidance in
 * draft-ietf-tls-downgrade-scsv-00.
 */
# define SSL_MODE_SEND_FALLBACK_SCSV 0x00000080U
/*
 * Support Asynchronous operation
 */
# define SSL_MODE_ASYNC 0x00000100U

/*
 * When using DTLS/SCTP, include the terminating zero in the label
 * used for computing the endpoint-pair shared secret. Required for
 * interoperability with implementations having this bug like these
 * older version of OpenSSL:
 * - OpenSSL 1.0.0 series
 * - OpenSSL 1.0.1 series
 * - OpenSSL 1.0.2 series
 * - OpenSSL 1.1.0 series
 * - OpenSSL 1.1.1 and 1.1.1a
 */
# define SSL_MODE_DTLS_SCTP_LABEL_LENGTH_BUG 0x00000400U

/* Cert related flags */
/*
 * Many implementations ignore some aspects of the TLS standards such as
 * enforcing certificate chain algorithms. When this is set we enforce them.
 */
# define SSL_CERT_FLAG_TLS_STRICT                0x00000001U

/* Suite B modes, takes same values as certificate verify flags */
# define SSL_CERT_FLAG_SUITEB_128_LOS_ONLY       0x10000
/* Suite B 192 bit only mode */
# define SSL_CERT_FLAG_SUITEB_192_LOS            0x20000
/* Suite B 128 bit mode allowing 192 bit algorithms */
# define SSL_CERT_FLAG_SUITEB_128_LOS            0x30000

/* Perform all sorts of protocol violations for testing purposes */
# define SSL_CERT_FLAG_BROKEN_PROTOCOL           0x10000000

/* Flags for building certificate chains */
/* Treat any existing certificates as untrusted CAs */
# define SSL_BUILD_CHAIN_FLAG_UNTRUSTED          0x1
/* Don't include root CA in chain */
# define SSL_BUILD_CHAIN_FLAG_NO_ROOT            0x2
/* Just check certificates already there */
# define SSL_BUILD_CHAIN_FLAG_CHECK              0x4
/* Ignore verification errors */
# define SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR       0x8
/* Clear verification errors from queue */
# define SSL_BUILD_CHAIN_FLAG_CLEAR_ERROR        0x10

/* Flags returned by SSL_check_chain */
/* Certificate can be used with this session */
# define CERT_PKEY_VALID         0x1
/* Certificate can also be used for signing */
# define CERT_PKEY_SIGN          0x2
/* EE certificate signing algorithm OK */
# define CERT_PKEY_EE_SIGNATURE  0x10
/* CA signature algorithms OK */
# define CERT_PKEY_CA_SIGNATURE  0x20
/* EE certificate parameters OK */
# define CERT_PKEY_EE_PARAM      0x40
/* CA certificate parameters OK */
# define CERT_PKEY_CA_PARAM      0x80
/* Signing explicitly allowed as opposed to SHA1 fallback */
# define CERT_PKEY_EXPLICIT_SIGN 0x100
/* Client CA issuer names match (always set for server cert) */
# define CERT_PKEY_ISSUER_NAME   0x200
/* Cert type matches client types (always set for server cert) */
# define CERT_PKEY_CERT_TYPE     0x400
/* Cert chain suitable to Suite B */
# define CERT_PKEY_SUITEB        0x800

# define SSL_CONF_FLAG_CMDLINE           0x1
# define SSL_CONF_FLAG_FILE              0x2
# define SSL_CONF_FLAG_CLIENT            0x4
# define SSL_CONF_FLAG_SERVER            0x8
# define SSL_CONF_FLAG_SHOW_ERRORS       0x10
# define SSL_CONF_FLAG_CERTIFICATE       0x20
# define SSL_CONF_FLAG_REQUIRE_PRIVATE   0x40
/* Configuration value types */
# define SSL_CONF_TYPE_UNKNOWN           0x0
# define SSL_CONF_TYPE_STRING            0x1
# define SSL_CONF_TYPE_FILE              0x2
# define SSL_CONF_TYPE_DIR               0x3
# define SSL_CONF_TYPE_NONE              0x4
# define SSL_CONF_TYPE_STORE             0x5

/* Maximum length of the application-controlled segment of a a TLSv1.3 cookie */
# define SSL_COOKIE_LENGTH                       4096

/*
 * Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value, they
 * cannot be used to clear bits.
 */

uint64_t SSL_CTX_get_options(const SSL_CTX *ctx);
uint64_t SSL_get_options(const SSL *s);
uint64_t SSL_CTX_clear_options(SSL_CTX *ctx, uint64_t op);
uint64_t SSL_clear_options(SSL *s, uint64_t op);
uint64_t SSL_CTX_set_options(SSL_CTX *ctx, uint64_t op);
uint64_t SSL_set_options(SSL *s, uint64_t op);

# define SSL_CTX_set_mode(ctx,op) \
        SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL)
# define SSL_CTX_clear_mode(ctx,op) \
        SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_MODE,(op),NULL)
# define SSL_CTX_get_mode(ctx) \
        SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,0,NULL)
# define SSL_clear_mode(ssl,op) \
        SSL_ctrl((ssl),SSL_CTRL_CLEAR_MODE,(op),NULL)
# define SSL_set_mode(ssl,op) \
        SSL_ctrl((ssl),SSL_CTRL_MODE,(op),NULL)
# define SSL_get_mode(ssl) \
        SSL_ctrl((ssl),SSL_CTRL_MODE,0,NULL)
# define SSL_set_mtu(ssl, mtu) \
        SSL_ctrl((ssl),SSL_CTRL_SET_MTU,(mtu),NULL)
# define DTLS_set_link_mtu(ssl, mtu) \
        SSL_ctrl((ssl),DTLS_CTRL_SET_LINK_MTU,(mtu),NULL)
# define DTLS_get_link_min_mtu(ssl) \
        SSL_ctrl((ssl),DTLS_CTRL_GET_LINK_MIN_MTU,0,NULL)

# define SSL_get_secure_renegotiation_support(ssl) \
        SSL_ctrl((ssl), SSL_CTRL_GET_RI_SUPPORT, 0, NULL)

# define SSL_CTX_set_cert_flags(ctx,op) \
        SSL_CTX_ctrl((ctx),SSL_CTRL_CERT_FLAGS,(op),NULL)
# define SSL_set_cert_flags(s,op) \
        SSL_ctrl((s),SSL_CTRL_CERT_FLAGS,(op),NULL)
# define SSL_CTX_clear_cert_flags(ctx,op) \
        SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL)
# define SSL_clear_cert_flags(s,op) \
        SSL_ctrl((s),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL)

void SSL_CTX_set_msg_callback(SSL_CTX *ctx,
                              void (*cb) (int write_p, int version,
                                          int content_type, const void *buf,
                                          size_t len, SSL *ssl, void *arg));
void SSL_set_msg_callback(SSL *ssl,
                          void (*cb) (int write_p, int version,
                                      int content_type, const void *buf,
                                      size_t len, SSL *ssl, void *arg));
# define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))
# define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))

# define SSL_get_extms_support(s) \
        SSL_ctrl((s),SSL_CTRL_GET_EXTMS_SUPPORT,0,NULL)

# ifndef OPENSSL_NO_SRP
/* see tls_srp.c */
#  ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0 __owur int SSL_SRP_CTX_init(SSL *s);
OSSL_DEPRECATEDIN_3_0 __owur int SSL_CTX_SRP_CTX_init(SSL_CTX *ctx);
OSSL_DEPRECATEDIN_3_0 int SSL_SRP_CTX_free(SSL *ctx);
OSSL_DEPRECATEDIN_3_0 int SSL_CTX_SRP_CTX_free(SSL_CTX *ctx);
OSSL_DEPRECATEDIN_3_0 __owur int SSL_srp_server_param_with_username(SSL *s,
                                                                    int *ad);
OSSL_DEPRECATEDIN_3_0 __owur int SRP_Calc_A_param(SSL *s);
#  endif
# endif

/* 100k max cert list */
# define SSL_MAX_CERT_LIST_DEFAULT (1024*100)

# define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT      (1024*20)

/*
 * This callback type is used inside SSL_CTX, SSL, and in the functions that
 * set them. It is used to override the generation of SSL/TLS session IDs in
 * a server. Return value should be zero on an error, non-zero to proceed.
 * Also, callbacks should themselves check if the id they generate is unique
 * otherwise the SSL handshake will fail with an error - callbacks can do
 * this using the 'ssl' value they're passed by;
 * SSL_has_matching_session_id(ssl, id, *id_len) The length value passed in
 * is set at the maximum size the session ID can be. In SSLv3/TLSv1 it is 32
 * bytes. The callback can alter this length to be less if desired. It is
 * also an error for the callback to set the size to zero.
 */
typedef int (*GEN_SESSION_CB) (SSL *ssl, unsigned char *id,
                               unsigned int *id_len);

# define SSL_SESS_CACHE_OFF                      0x0000
# define SSL_SESS_CACHE_CLIENT                   0x0001
# define SSL_SESS_CACHE_SERVER                   0x0002
# define SSL_SESS_CACHE_BOTH     (SSL_SESS_CACHE_CLIENT|SSL_SESS_CACHE_SERVER)
# define SSL_SESS_CACHE_NO_AUTO_CLEAR            0x0080
/* enough comments already ... see SSL_CTX_set_session_cache_mode(3) */
# define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP       0x0100
# define SSL_SESS_CACHE_NO_INTERNAL_STORE        0x0200
# define SSL_SESS_CACHE_NO_INTERNAL \
        (SSL_SESS_CACHE_NO_INTERNAL_LOOKUP|SSL_SESS_CACHE_NO_INTERNAL_STORE)
# define SSL_SESS_CACHE_UPDATE_TIME              0x0400

LHASH_OF(SSL_SESSION) *SSL_CTX_sessions(SSL_CTX *ctx);
# define SSL_CTX_sess_number(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_NUMBER,0,NULL)
# define SSL_CTX_sess_connect(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT,0,NULL)
# define SSL_CTX_sess_connect_good(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_GOOD,0,NULL)
# define SSL_CTX_sess_connect_renegotiate(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_RENEGOTIATE,0,NULL)
# define SSL_CTX_sess_accept(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT,0,NULL)
# define SSL_CTX_sess_accept_renegotiate(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_RENEGOTIATE,0,NULL)
# define SSL_CTX_sess_accept_good(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_GOOD,0,NULL)
# define SSL_CTX_sess_hits(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_HIT,0,NULL)
# define SSL_CTX_sess_cb_hits(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CB_HIT,0,NULL)
# define SSL_CTX_sess_misses(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_MISSES,0,NULL)
# define SSL_CTX_sess_timeouts(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_TIMEOUTS,0,NULL)
# define SSL_CTX_sess_cache_full(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CACHE_FULL,0,NULL)

void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx,
                             int (*new_session_cb) (struct ssl_st *ssl,
                                                    SSL_SESSION *sess));
int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx)) (struct ssl_st *ssl,
                                              SSL_SESSION *sess);
void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx,
                                void (*remove_session_cb) (struct ssl_ctx_st
                                                           *ctx,
                                                           SSL_SESSION *sess));
void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx)) (struct ssl_ctx_st *ctx,
                                                  SSL_SESSION *sess);
void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx,
                             SSL_SESSION *(*get_session_cb) (struct ssl_st
                                                             *ssl,
                                                             const unsigned char
                                                             *data, int len,
                                                             int *copy));
SSL_SESSION *(*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx)) (struct ssl_st *ssl,
                                                       const unsigned char *data,
                                                       int len, int *copy);
void SSL_CTX_set_info_callback(SSL_CTX *ctx,
                               void (*cb) (const SSL *ssl, int type, int val));
void (*SSL_CTX_get_info_callback(SSL_CTX *ctx)) (const SSL *ssl, int type,
                                                 int val);
void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx,
                                int (*client_cert_cb) (SSL *ssl, X509 **x509,
                                                       EVP_PKEY **pkey));
int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx)) (SSL *ssl, X509 **x509,
                                                 EVP_PKEY **pkey);
# ifndef OPENSSL_NO_ENGINE
__owur int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e);
# endif
void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx,
                                    int (*app_gen_cookie_cb) (SSL *ssl,
                                                              unsigned char
                                                              *cookie,
                                                              unsigned int
                                                              *cookie_len));
void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx,
                                  int (*app_verify_cookie_cb) (SSL *ssl,
                                                               const unsigned
                                                               char *cookie,
                                                               unsigned int
                                                               cookie_len));

void SSL_CTX_set_stateless_cookie_generate_cb(
    SSL_CTX *ctx,
    int (*gen_stateless_cookie_cb) (SSL *ssl,
                                    unsigned char *cookie,
                                    size_t *cookie_len));
void SSL_CTX_set_stateless_cookie_verify_cb(
    SSL_CTX *ctx,
    int (*verify_stateless_cookie_cb) (SSL *ssl,
                                       const unsigned char *cookie,
                                       size_t cookie_len));
# ifndef OPENSSL_NO_NEXTPROTONEG

typedef int (*SSL_CTX_npn_advertised_cb_func)(SSL *ssl,
                                              const unsigned char **out,
                                              unsigned int *outlen,
                                              void *arg);
void SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *s,
                                           SSL_CTX_npn_advertised_cb_func cb,
                                           void *arg);
#  define SSL_CTX_set_npn_advertised_cb SSL_CTX_set_next_protos_advertised_cb

typedef int (*SSL_CTX_npn_select_cb_func)(SSL *s,
                                          unsigned char **out,
                                          unsigned char *outlen,
                                          const unsigned char *in,
                                          unsigned int inlen,
                                          void *arg);
void SSL_CTX_set_next_proto_select_cb(SSL_CTX *s,
                                      SSL_CTX_npn_select_cb_func cb,
                                      void *arg);
#  define SSL_CTX_set_npn_select_cb SSL_CTX_set_next_proto_select_cb

void SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data,
                                    unsigned *len);
#  define SSL_get0_npn_negotiated SSL_get0_next_proto_negotiated
# endif

__owur int SSL_select_next_proto(unsigned char **out, unsigned char *outlen,
                                 const unsigned char *in, unsigned int inlen,
                                 const unsigned char *client,
                                 unsigned int client_len);

# define OPENSSL_NPN_UNSUPPORTED 0
# define OPENSSL_NPN_NEGOTIATED  1
# define OPENSSL_NPN_NO_OVERLAP  2

__owur int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos,
                                   unsigned int protos_len);
__owur int SSL_set_alpn_protos(SSL *ssl, const unsigned char *protos,
                               unsigned int protos_len);
typedef int (*SSL_CTX_alpn_select_cb_func)(SSL *ssl,
                                           const unsigned char **out,
                                           unsigned char *outlen,
                                           const unsigned char *in,
                                           unsigned int inlen,
                                           void *arg);
void SSL_CTX_set_alpn_select_cb(SSL_CTX *ctx,
                                SSL_CTX_alpn_select_cb_func cb,
                                void *arg);
void SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data,
                            unsigned int *len);

# ifndef OPENSSL_NO_PSK
/*
 * the maximum length of the buffer given to callbacks containing the
 * resulting identity/psk
 */
#  define PSK_MAX_IDENTITY_LEN 256
#  define PSK_MAX_PSK_LEN 512
typedef unsigned int (*SSL_psk_client_cb_func)(SSL *ssl,
                                               const char *hint,
                                               char *identity,
                                               unsigned int max_identity_len,
                                               unsigned char *psk,
                                               unsigned int max_psk_len);
void SSL_CTX_set_psk_client_callback(SSL_CTX *ctx, SSL_psk_client_cb_func cb);
void SSL_set_psk_client_callback(SSL *ssl, SSL_psk_client_cb_func cb);

typedef unsigned int (*SSL_psk_server_cb_func)(SSL *ssl,
                                               const char *identity,
                                               unsigned char *psk,
                                               unsigned int max_psk_len);
void SSL_CTX_set_psk_server_callback(SSL_CTX *ctx, SSL_psk_server_cb_func cb);
void SSL_set_psk_server_callback(SSL *ssl, SSL_psk_server_cb_func cb);

__owur int SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint);
__owur int SSL_use_psk_identity_hint(SSL *s, const char *identity_hint);
const char *SSL_get_psk_identity_hint(const SSL *s);
const char *SSL_get_psk_identity(const SSL *s);
# endif

typedef int (*SSL_psk_find_session_cb_func)(SSL *ssl,
                                            const unsigned char *identity,
                                            size_t identity_len,
                                            SSL_SESSION **sess);
typedef int (*SSL_psk_use_session_cb_func)(SSL *ssl, const EVP_MD *md,
                                           const unsigned char **id,
                                           size_t *idlen,
                                           SSL_SESSION **sess);

void SSL_set_psk_find_session_callback(SSL *s, SSL_psk_find_session_cb_func cb);
void SSL_CTX_set_psk_find_session_callback(SSL_CTX *ctx,
                                           SSL_psk_find_session_cb_func cb);
void SSL_set_psk_use_session_callback(SSL *s, SSL_psk_use_session_cb_func cb);
void SSL_CTX_set_psk_use_session_callback(SSL_CTX *ctx,
                                          SSL_psk_use_session_cb_func cb);

/* Register callbacks to handle custom TLS Extensions for client or server. */

__owur int SSL_CTX_has_client_custom_ext(const SSL_CTX *ctx,
                                         unsigned int ext_type);

__owur int SSL_CTX_add_client_custom_ext(SSL_CTX *ctx,
                                         unsigned int ext_type,
                                         custom_ext_add_cb add_cb,
                                         custom_ext_free_cb free_cb,
                                         void *add_arg,
                                         custom_ext_parse_cb parse_cb,
                                         void *parse_arg);

__owur int SSL_CTX_add_server_custom_ext(SSL_CTX *ctx,
                                         unsigned int ext_type,
                                         custom_ext_add_cb add_cb,
                                         custom_ext_free_cb free_cb,
                                         void *add_arg,
                                         custom_ext_parse_cb parse_cb,
                                         void *parse_arg);

__owur int SSL_CTX_add_custom_ext(SSL_CTX *ctx, unsigned int ext_type,
                                  unsigned int context,
                                  SSL_custom_ext_add_cb_ex add_cb,
                                  SSL_custom_ext_free_cb_ex free_cb,
                                  void *add_arg,
                                  SSL_custom_ext_parse_cb_ex parse_cb,
                                  void *parse_arg);

__owur int SSL_extension_supported(unsigned int ext_type);

# define SSL_NOTHING            1
# define SSL_WRITING            2
# define SSL_READING            3
# define SSL_X509_LOOKUP        4
# define SSL_ASYNC_PAUSED       5
# define SSL_ASYNC_NO_JOBS      6
# define SSL_CLIENT_HELLO_CB    7
# define SSL_RETRY_VERIFY       8

/* These will only be used when doing non-blocking IO */
# define SSL_want_nothing(s)         (SSL_want(s) == SSL_NOTHING)
# define SSL_want_read(s)            (SSL_want(s) == SSL_READING)
# define SSL_want_write(s)           (SSL_want(s) == SSL_WRITING)
# define SSL_want_x509_lookup(s)     (SSL_want(s) == SSL_X509_LOOKUP)
# define SSL_want_retry_verify(s)    (SSL_want(s) == SSL_RETRY_VERIFY)
# define SSL_want_async(s)           (SSL_want(s) == SSL_ASYNC_PAUSED)
# define SSL_want_async_job(s)       (SSL_want(s) == SSL_ASYNC_NO_JOBS)
# define SSL_want_client_hello_cb(s) (SSL_want(s) == SSL_CLIENT_HELLO_CB)

# define SSL_MAC_FLAG_READ_MAC_STREAM 1
# define SSL_MAC_FLAG_WRITE_MAC_STREAM 2
# define SSL_MAC_FLAG_READ_MAC_TLSTREE 4
# define SSL_MAC_FLAG_WRITE_MAC_TLSTREE 8

/*
 * A callback for logging out TLS key material. This callback should log out
 * |line| followed by a newline.
 */
typedef void (*SSL_CTX_keylog_cb_func)(const SSL *ssl, const char *line);

/*
 * SSL_CTX_set_keylog_callback configures a callback to log key material. This
 * is intended for debugging use with tools like Wireshark. The cb function
 * should log line followed by a newline.
 */
void SSL_CTX_set_keylog_callback(SSL_CTX *ctx, SSL_CTX_keylog_cb_func cb);

/*
 * SSL_CTX_get_keylog_callback returns the callback configured by
 * SSL_CTX_set_keylog_callback.
 */
SSL_CTX_keylog_cb_func SSL_CTX_get_keylog_callback(const SSL_CTX *ctx);

int SSL_CTX_set_max_early_data(SSL_CTX *ctx, uint32_t max_early_data);
uint32_t SSL_CTX_get_max_early_data(const SSL_CTX *ctx);
int SSL_set_max_early_data(SSL *s, uint32_t max_early_data);
uint32_t SSL_get_max_early_data(const SSL *s);
int SSL_CTX_set_recv_max_early_data(SSL_CTX *ctx, uint32_t recv_max_early_data);
uint32_t SSL_CTX_get_recv_max_early_data(const SSL_CTX *ctx);
int SSL_set_recv_max_early_data(SSL *s, uint32_t recv_max_early_data);
uint32_t SSL_get_recv_max_early_data(const SSL *s);

#ifdef __cplusplus
}
#endif

# include <openssl/ssl2.h>
# include <openssl/ssl3.h>
# include <openssl/tls1.h>      /* This is mostly sslv3 with a few tweaks */
# include <openssl/dtls1.h>     /* Datagram TLS */
# include <openssl/srtp.h>      /* Support for the use_srtp extension */

#ifdef  __cplusplus
extern "C" {
#endif

/*
 * These need to be after the above set of includes due to a compiler bug
 * in VisualStudio 2015
 */
SKM_DEFINE_STACK_OF_INTERNAL(SSL_CIPHER, const SSL_CIPHER, SSL_CIPHER)
#define sk_SSL_CIPHER_num(sk) OPENSSL_sk_num(ossl_check_const_SSL_CIPHER_sk_type(sk))
#define sk_SSL_CIPHER_value(sk, idx) ((const SSL_CIPHER *)OPENSSL_sk_value(ossl_check_const_SSL_CIPHER_sk_type(sk), (idx)))
#define sk_SSL_CIPHER_new(cmp) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new(ossl_check_SSL_CIPHER_compfunc_type(cmp)))
#define sk_SSL_CIPHER_new_null() ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new_null())
#define sk_SSL_CIPHER_new_reserve(cmp, n) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new_reserve(ossl_check_SSL_CIPHER_compfunc_type(cmp), (n)))
#define sk_SSL_CIPHER_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SSL_CIPHER_sk_type(sk), (n))
#define sk_SSL_CIPHER_free(sk) OPENSSL_sk_free(ossl_check_SSL_CIPHER_sk_type(sk))
#define sk_SSL_CIPHER_zero(sk) OPENSSL_sk_zero(ossl_check_SSL_CIPHER_sk_type(sk))
#define sk_SSL_CIPHER_delete(sk, i) ((const SSL_CIPHER *)OPENSSL_sk_delete(ossl_check_SSL_CIPHER_sk_type(sk), (i)))
#define sk_SSL_CIPHER_delete_ptr(sk, ptr) ((const SSL_CIPHER *)OPENSSL_sk_delete_ptr(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr)))
#define sk_SSL_CIPHER_push(sk, ptr) OPENSSL_sk_push(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr))
#define sk_SSL_CIPHER_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr))
#define sk_SSL_CIPHER_pop(sk) ((const SSL_CIPHER *)OPENSSL_sk_pop(ossl_check_SSL_CIPHER_sk_type(sk)))
#define sk_SSL_CIPHER_shift(sk) ((const SSL_CIPHER *)OPENSSL_sk_shift(ossl_check_SSL_CIPHER_sk_type(sk)))
#define sk_SSL_CIPHER_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SSL_CIPHER_sk_type(sk),ossl_check_SSL_CIPHER_freefunc_type(freefunc))
#define sk_SSL_CIPHER_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr), (idx))
#define sk_SSL_CIPHER_set(sk, idx, ptr) ((const SSL_CIPHER *)OPENSSL_sk_set(ossl_check_SSL_CIPHER_sk_type(sk), (idx), ossl_check_SSL_CIPHER_type(ptr)))
#define sk_SSL_CIPHER_find(sk, ptr) OPENSSL_sk_find(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr))
#define sk_SSL_CIPHER_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr))
#define sk_SSL_CIPHER_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr), pnum)
#define sk_SSL_CIPHER_sort(sk) OPENSSL_sk_sort(ossl_check_SSL_CIPHER_sk_type(sk))
#define sk_SSL_CIPHER_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SSL_CIPHER_sk_type(sk))
#define sk_SSL_CIPHER_dup(sk) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_dup(ossl_check_const_SSL_CIPHER_sk_type(sk)))
#define sk_SSL_CIPHER_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_deep_copy(ossl_check_const_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_copyfunc_type(copyfunc), ossl_check_SSL_CIPHER_freefunc_type(freefunc)))
#define sk_SSL_CIPHER_set_cmp_func(sk, cmp) ((sk_SSL_CIPHER_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_compfunc_type(cmp)))
SKM_DEFINE_STACK_OF_INTERNAL(SSL_COMP, SSL_COMP, SSL_COMP)
#define sk_SSL_COMP_num(sk) OPENSSL_sk_num(ossl_check_const_SSL_COMP_sk_type(sk))
#define sk_SSL_COMP_value(sk, idx) ((SSL_COMP *)OPENSSL_sk_value(ossl_check_const_SSL_COMP_sk_type(sk), (idx)))
#define sk_SSL_COMP_new(cmp) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new(ossl_check_SSL_COMP_compfunc_type(cmp)))
#define sk_SSL_COMP_new_null() ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new_null())
#define sk_SSL_COMP_new_reserve(cmp, n) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new_reserve(ossl_check_SSL_COMP_compfunc_type(cmp), (n)))
#define sk_SSL_COMP_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SSL_COMP_sk_type(sk), (n))
#define sk_SSL_COMP_free(sk) OPENSSL_sk_free(ossl_check_SSL_COMP_sk_type(sk))
#define sk_SSL_COMP_zero(sk) OPENSSL_sk_zero(ossl_check_SSL_COMP_sk_type(sk))
#define sk_SSL_COMP_delete(sk, i) ((SSL_COMP *)OPENSSL_sk_delete(ossl_check_SSL_COMP_sk_type(sk), (i)))
#define sk_SSL_COMP_delete_ptr(sk, ptr) ((SSL_COMP *)OPENSSL_sk_delete_ptr(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr)))
#define sk_SSL_COMP_push(sk, ptr) OPENSSL_sk_push(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr))
#define sk_SSL_COMP_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr))
#define sk_SSL_COMP_pop(sk) ((SSL_COMP *)OPENSSL_sk_pop(ossl_check_SSL_COMP_sk_type(sk)))
#define sk_SSL_COMP_shift(sk) ((SSL_COMP *)OPENSSL_sk_shift(ossl_check_SSL_COMP_sk_type(sk)))
#define sk_SSL_COMP_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SSL_COMP_sk_type(sk),ossl_check_SSL_COMP_freefunc_type(freefunc))
#define sk_SSL_COMP_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr), (idx))
#define sk_SSL_COMP_set(sk, idx, ptr) ((SSL_COMP *)OPENSSL_sk_set(ossl_check_SSL_COMP_sk_type(sk), (idx), ossl_check_SSL_COMP_type(ptr)))
#define sk_SSL_COMP_find(sk, ptr) OPENSSL_sk_find(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr))
#define sk_SSL_COMP_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr))
#define sk_SSL_COMP_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr), pnum)
#define sk_SSL_COMP_sort(sk) OPENSSL_sk_sort(ossl_check_SSL_COMP_sk_type(sk))
#define sk_SSL_COMP_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SSL_COMP_sk_type(sk))
#define sk_SSL_COMP_dup(sk) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_dup(ossl_check_const_SSL_COMP_sk_type(sk)))
#define sk_SSL_COMP_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_deep_copy(ossl_check_const_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_copyfunc_type(copyfunc), ossl_check_SSL_COMP_freefunc_type(freefunc)))
#define sk_SSL_COMP_set_cmp_func(sk, cmp) ((sk_SSL_COMP_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_compfunc_type(cmp)))


/* compatibility */
# define SSL_set_app_data(s,arg)         (SSL_set_ex_data(s,0,(char *)(arg)))
# define SSL_get_app_data(s)             (SSL_get_ex_data(s,0))
# define SSL_SESSION_set_app_data(s,a)   (SSL_SESSION_set_ex_data(s,0, \
                                                                  (char *)(a)))
# define SSL_SESSION_get_app_data(s)     (SSL_SESSION_get_ex_data(s,0))
# define SSL_CTX_get_app_data(ctx)       (SSL_CTX_get_ex_data(ctx,0))
# define SSL_CTX_set_app_data(ctx,arg)   (SSL_CTX_set_ex_data(ctx,0, \
                                                              (char *)(arg)))
# ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 void SSL_set_debug(SSL *s, int debug);
# endif

/* TLSv1.3 KeyUpdate message types */
/* -1 used so that this is an invalid value for the on-the-wire protocol */
#define SSL_KEY_UPDATE_NONE             -1
/* Values as defined for the on-the-wire protocol */
#define SSL_KEY_UPDATE_NOT_REQUESTED     0
#define SSL_KEY_UPDATE_REQUESTED         1

/*
 * The valid handshake states (one for each type message sent and one for each
 * type of message received). There are also two "special" states:
 * TLS = TLS or DTLS state
 * DTLS = DTLS specific state
 * CR/SR = Client Read/Server Read
 * CW/SW = Client Write/Server Write
 *
 * The "special" states are:
 * TLS_ST_BEFORE = No handshake has been initiated yet
 * TLS_ST_OK = A handshake has been successfully completed
 */
typedef enum {
    TLS_ST_BEFORE,
    TLS_ST_OK,
    DTLS_ST_CR_HELLO_VERIFY_REQUEST,
    TLS_ST_CR_SRVR_HELLO,
    TLS_ST_CR_CERT,
    TLS_ST_CR_CERT_STATUS,
    TLS_ST_CR_KEY_EXCH,
    TLS_ST_CR_CERT_REQ,
    TLS_ST_CR_SRVR_DONE,
    TLS_ST_CR_SESSION_TICKET,
    TLS_ST_CR_CHANGE,
    TLS_ST_CR_FINISHED,
    TLS_ST_CW_CLNT_HELLO,
    TLS_ST_CW_CERT,
    TLS_ST_CW_KEY_EXCH,
    TLS_ST_CW_CERT_VRFY,
    TLS_ST_CW_CHANGE,
    TLS_ST_CW_NEXT_PROTO,
    TLS_ST_CW_FINISHED,
    TLS_ST_SW_HELLO_REQ,
    TLS_ST_SR_CLNT_HELLO,
    DTLS_ST_SW_HELLO_VERIFY_REQUEST,
    TLS_ST_SW_SRVR_HELLO,
    TLS_ST_SW_CERT,
    TLS_ST_SW_KEY_EXCH,
    TLS_ST_SW_CERT_REQ,
    TLS_ST_SW_SRVR_DONE,
    TLS_ST_SR_CERT,
    TLS_ST_SR_KEY_EXCH,
    TLS_ST_SR_CERT_VRFY,
    TLS_ST_SR_NEXT_PROTO,
    TLS_ST_SR_CHANGE,
    TLS_ST_SR_FINISHED,
    TLS_ST_SW_SESSION_TICKET,
    TLS_ST_SW_CERT_STATUS,
    TLS_ST_SW_CHANGE,
    TLS_ST_SW_FINISHED,
    TLS_ST_SW_ENCRYPTED_EXTENSIONS,
    TLS_ST_CR_ENCRYPTED_EXTENSIONS,
    TLS_ST_CR_CERT_VRFY,
    TLS_ST_SW_CERT_VRFY,
    TLS_ST_CR_HELLO_REQ,
    TLS_ST_SW_KEY_UPDATE,
    TLS_ST_CW_KEY_UPDATE,
    TLS_ST_SR_KEY_UPDATE,
    TLS_ST_CR_KEY_UPDATE,
    TLS_ST_EARLY_DATA,
    TLS_ST_PENDING_EARLY_DATA_END,
    TLS_ST_CW_END_OF_EARLY_DATA,
    TLS_ST_SR_END_OF_EARLY_DATA
} OSSL_HANDSHAKE_STATE;

/*
 * Most of the following state values are no longer used and are defined to be
 * the closest equivalent value in the current state machine code. Not all
 * defines have an equivalent and are set to a dummy value (-1). SSL_ST_CONNECT
 * and SSL_ST_ACCEPT are still in use in the definition of SSL_CB_ACCEPT_LOOP,
 * SSL_CB_ACCEPT_EXIT, SSL_CB_CONNECT_LOOP and SSL_CB_CONNECT_EXIT.
 */

# define SSL_ST_CONNECT                  0x1000
# define SSL_ST_ACCEPT                   0x2000

# define SSL_ST_MASK                     0x0FFF

# define SSL_CB_LOOP                     0x01
# define SSL_CB_EXIT                     0x02
# define SSL_CB_READ                     0x04
# define SSL_CB_WRITE                    0x08
# define SSL_CB_ALERT                    0x4000/* used in callback */
# define SSL_CB_READ_ALERT               (SSL_CB_ALERT|SSL_CB_READ)
# define SSL_CB_WRITE_ALERT              (SSL_CB_ALERT|SSL_CB_WRITE)
# define SSL_CB_ACCEPT_LOOP              (SSL_ST_ACCEPT|SSL_CB_LOOP)
# define SSL_CB_ACCEPT_EXIT              (SSL_ST_ACCEPT|SSL_CB_EXIT)
# define SSL_CB_CONNECT_LOOP             (SSL_ST_CONNECT|SSL_CB_LOOP)
# define SSL_CB_CONNECT_EXIT             (SSL_ST_CONNECT|SSL_CB_EXIT)
# define SSL_CB_HANDSHAKE_START          0x10
# define SSL_CB_HANDSHAKE_DONE           0x20

/* Is the SSL_connection established? */
# define SSL_in_connect_init(a)          (SSL_in_init(a) && !SSL_is_server(a))
# define SSL_in_accept_init(a)           (SSL_in_init(a) && SSL_is_server(a))
int SSL_in_init(const SSL *s);
int SSL_in_before(const SSL *s);
int SSL_is_init_finished(const SSL *s);

/*
 * The following 3 states are kept in ssl->rlayer.rstate when reads fail, you
 * should not need these
 */
# define SSL_ST_READ_HEADER                      0xF0
# define SSL_ST_READ_BODY                        0xF1
# define SSL_ST_READ_DONE                        0xF2

/*-
 * Obtain latest Finished message
 *   -- that we sent (SSL_get_finished)
 *   -- that we expected from peer (SSL_get_peer_finished).
 * Returns length (0 == no Finished so far), copies up to 'count' bytes.
 */
size_t SSL_get_finished(const SSL *s, void *buf, size_t count);
size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count);

/*
 * use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 3 options are
 * 'ored' with SSL_VERIFY_PEER if they are desired
 */
# define SSL_VERIFY_NONE                 0x00
# define SSL_VERIFY_PEER                 0x01
# define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02
# define SSL_VERIFY_CLIENT_ONCE          0x04
# define SSL_VERIFY_POST_HANDSHAKE       0x08

# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  define OpenSSL_add_ssl_algorithms()   SSL_library_init()
#  define SSLeay_add_ssl_algorithms()    SSL_library_init()
# endif

/* More backward compatibility */
# define SSL_get_cipher(s) \
                SSL_CIPHER_get_name(SSL_get_current_cipher(s))
# define SSL_get_cipher_bits(s,np) \
                SSL_CIPHER_get_bits(SSL_get_current_cipher(s),np)
# define SSL_get_cipher_version(s) \
                SSL_CIPHER_get_version(SSL_get_current_cipher(s))
# define SSL_get_cipher_name(s) \
                SSL_CIPHER_get_name(SSL_get_current_cipher(s))
# define SSL_get_time(a)         SSL_SESSION_get_time(a)
# define SSL_set_time(a,b)       SSL_SESSION_set_time((a),(b))
# define SSL_get_timeout(a)      SSL_SESSION_get_timeout(a)
# define SSL_set_timeout(a,b)    SSL_SESSION_set_timeout((a),(b))

# define d2i_SSL_SESSION_bio(bp,s_id) ASN1_d2i_bio_of(SSL_SESSION,SSL_SESSION_new,d2i_SSL_SESSION,bp,s_id)
# define i2d_SSL_SESSION_bio(bp,s_id) ASN1_i2d_bio_of(SSL_SESSION,i2d_SSL_SESSION,bp,s_id)

DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION)
# define SSL_AD_REASON_OFFSET            1000/* offset to get SSL_R_... value
                                              * from SSL_AD_... */
/* These alert types are for SSLv3 and TLSv1 */
# define SSL_AD_CLOSE_NOTIFY             SSL3_AD_CLOSE_NOTIFY
/* fatal */
# define SSL_AD_UNEXPECTED_MESSAGE       SSL3_AD_UNEXPECTED_MESSAGE
/* fatal */
# define SSL_AD_BAD_RECORD_MAC           SSL3_AD_BAD_RECORD_MAC
# define SSL_AD_DECRYPTION_FAILED        TLS1_AD_DECRYPTION_FAILED
# define SSL_AD_RECORD_OVERFLOW          TLS1_AD_RECORD_OVERFLOW
/* fatal */
# define SSL_AD_DECOMPRESSION_FAILURE    SSL3_AD_DECOMPRESSION_FAILURE
/* fatal */
# define SSL_AD_HANDSHAKE_FAILURE        SSL3_AD_HANDSHAKE_FAILURE
/* Not for TLS */
# define SSL_AD_NO_CERTIFICATE           SSL3_AD_NO_CERTIFICATE
# define SSL_AD_BAD_CERTIFICATE          SSL3_AD_BAD_CERTIFICATE
# define SSL_AD_UNSUPPORTED_CERTIFICATE  SSL3_AD_UNSUPPORTED_CERTIFICATE
# define SSL_AD_CERTIFICATE_REVOKED      SSL3_AD_CERTIFICATE_REVOKED
# define SSL_AD_CERTIFICATE_EXPIRED      SSL3_AD_CERTIFICATE_EXPIRED
# define SSL_AD_CERTIFICATE_UNKNOWN      SSL3_AD_CERTIFICATE_UNKNOWN
/* fatal */
# define SSL_AD_ILLEGAL_PARAMETER        SSL3_AD_ILLEGAL_PARAMETER
/* fatal */
# define SSL_AD_UNKNOWN_CA               TLS1_AD_UNKNOWN_CA
/* fatal */
# define SSL_AD_ACCESS_DENIED            TLS1_AD_ACCESS_DENIED
/* fatal */
# define SSL_AD_DECODE_ERROR             TLS1_AD_DECODE_ERROR
# define SSL_AD_DECRYPT_ERROR            TLS1_AD_DECRYPT_ERROR
/* fatal */
# define SSL_AD_EXPORT_RESTRICTION       TLS1_AD_EXPORT_RESTRICTION
/* fatal */
# define SSL_AD_PROTOCOL_VERSION         TLS1_AD_PROTOCOL_VERSION
/* fatal */
# define SSL_AD_INSUFFICIENT_SECURITY    TLS1_AD_INSUFFICIENT_SECURITY
/* fatal */
# define SSL_AD_INTERNAL_ERROR           TLS1_AD_INTERNAL_ERROR
# define SSL_AD_USER_CANCELLED           TLS1_AD_USER_CANCELLED
# define SSL_AD_NO_RENEGOTIATION         TLS1_AD_NO_RENEGOTIATION
# define SSL_AD_MISSING_EXTENSION        TLS13_AD_MISSING_EXTENSION
# define SSL_AD_CERTIFICATE_REQUIRED     TLS13_AD_CERTIFICATE_REQUIRED
# define SSL_AD_UNSUPPORTED_EXTENSION    TLS1_AD_UNSUPPORTED_EXTENSION
# define SSL_AD_CERTIFICATE_UNOBTAINABLE TLS1_AD_CERTIFICATE_UNOBTAINABLE
# define SSL_AD_UNRECOGNIZED_NAME        TLS1_AD_UNRECOGNIZED_NAME
# define SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE
# define SSL_AD_BAD_CERTIFICATE_HASH_VALUE TLS1_AD_BAD_CERTIFICATE_HASH_VALUE
/* fatal */
# define SSL_AD_UNKNOWN_PSK_IDENTITY     TLS1_AD_UNKNOWN_PSK_IDENTITY
/* fatal */
# define SSL_AD_INAPPROPRIATE_FALLBACK   TLS1_AD_INAPPROPRIATE_FALLBACK
# define SSL_AD_NO_APPLICATION_PROTOCOL  TLS1_AD_NO_APPLICATION_PROTOCOL
# define SSL_ERROR_NONE                  0
# define SSL_ERROR_SSL                   1
# define SSL_ERROR_WANT_READ             2
# define SSL_ERROR_WANT_WRITE            3
# define SSL_ERROR_WANT_X509_LOOKUP      4
# define SSL_ERROR_SYSCALL               5/* look at error stack/return
                                           * value/errno */
# define SSL_ERROR_ZERO_RETURN           6
# define SSL_ERROR_WANT_CONNECT          7
# define SSL_ERROR_WANT_ACCEPT           8
# define SSL_ERROR_WANT_ASYNC            9
# define SSL_ERROR_WANT_ASYNC_JOB       10
# define SSL_ERROR_WANT_CLIENT_HELLO_CB 11
# define SSL_ERROR_WANT_RETRY_VERIFY    12

# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_CTRL_SET_TMP_DH                    3
#  define SSL_CTRL_SET_TMP_ECDH                  4
#  define SSL_CTRL_SET_TMP_DH_CB                 6
# endif

# define SSL_CTRL_GET_CLIENT_CERT_REQUEST        9
# define SSL_CTRL_GET_NUM_RENEGOTIATIONS         10
# define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS       11
# define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS       12
# define SSL_CTRL_GET_FLAGS                      13
# define SSL_CTRL_EXTRA_CHAIN_CERT               14
# define SSL_CTRL_SET_MSG_CALLBACK               15
# define SSL_CTRL_SET_MSG_CALLBACK_ARG           16
/* only applies to datagram connections */
# define SSL_CTRL_SET_MTU                17
/* Stats */
# define SSL_CTRL_SESS_NUMBER                    20
# define SSL_CTRL_SESS_CONNECT                   21
# define SSL_CTRL_SESS_CONNECT_GOOD              22
# define SSL_CTRL_SESS_CONNECT_RENEGOTIATE       23
# define SSL_CTRL_SESS_ACCEPT                    24
# define SSL_CTRL_SESS_ACCEPT_GOOD               25
# define SSL_CTRL_SESS_ACCEPT_RENEGOTIATE        26
# define SSL_CTRL_SESS_HIT                       27
# define SSL_CTRL_SESS_CB_HIT                    28
# define SSL_CTRL_SESS_MISSES                    29
# define SSL_CTRL_SESS_TIMEOUTS                  30
# define SSL_CTRL_SESS_CACHE_FULL                31
# define SSL_CTRL_MODE                           33
# define SSL_CTRL_GET_READ_AHEAD                 40
# define SSL_CTRL_SET_READ_AHEAD                 41
# define SSL_CTRL_SET_SESS_CACHE_SIZE            42
# define SSL_CTRL_GET_SESS_CACHE_SIZE            43
# define SSL_CTRL_SET_SESS_CACHE_MODE            44
# define SSL_CTRL_GET_SESS_CACHE_MODE            45
# define SSL_CTRL_GET_MAX_CERT_LIST              50
# define SSL_CTRL_SET_MAX_CERT_LIST              51
# define SSL_CTRL_SET_MAX_SEND_FRAGMENT          52
/* see tls1.h for macros based on these */
# define SSL_CTRL_SET_TLSEXT_SERVERNAME_CB       53
# define SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG      54
# define SSL_CTRL_SET_TLSEXT_HOSTNAME            55
# define SSL_CTRL_SET_TLSEXT_DEBUG_CB            56
# define SSL_CTRL_SET_TLSEXT_DEBUG_ARG           57
# define SSL_CTRL_GET_TLSEXT_TICKET_KEYS         58
# define SSL_CTRL_SET_TLSEXT_TICKET_KEYS         59
/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT    60 */
/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB 61 */
/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB_ARG 62 */
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB       63
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG   64
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE     65
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS     66
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS     67
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS      68
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS      69
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP        70
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP        71
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB      72
# endif
# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB    75
# define SSL_CTRL_SET_SRP_VERIFY_PARAM_CB                76
# define SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB             77
# define SSL_CTRL_SET_SRP_ARG            78
# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME               79
# define SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH               80
# define SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD               81
# define DTLS_CTRL_GET_TIMEOUT           73
# define DTLS_CTRL_HANDLE_TIMEOUT        74
# define SSL_CTRL_GET_RI_SUPPORT                 76
# define SSL_CTRL_CLEAR_MODE                     78
# define SSL_CTRL_SET_NOT_RESUMABLE_SESS_CB      79
# define SSL_CTRL_GET_EXTRA_CHAIN_CERTS          82
# define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS        83
# define SSL_CTRL_CHAIN                          88
# define SSL_CTRL_CHAIN_CERT                     89
# define SSL_CTRL_GET_GROUPS                     90
# define SSL_CTRL_SET_GROUPS                     91
# define SSL_CTRL_SET_GROUPS_LIST                92
# define SSL_CTRL_GET_SHARED_GROUP               93
# define SSL_CTRL_SET_SIGALGS                    97
# define SSL_CTRL_SET_SIGALGS_LIST               98
# define SSL_CTRL_CERT_FLAGS                     99
# define SSL_CTRL_CLEAR_CERT_FLAGS               100
# define SSL_CTRL_SET_CLIENT_SIGALGS             101
# define SSL_CTRL_SET_CLIENT_SIGALGS_LIST        102
# define SSL_CTRL_GET_CLIENT_CERT_TYPES          103
# define SSL_CTRL_SET_CLIENT_CERT_TYPES          104
# define SSL_CTRL_BUILD_CERT_CHAIN               105
# define SSL_CTRL_SET_VERIFY_CERT_STORE          106
# define SSL_CTRL_SET_CHAIN_CERT_STORE           107
# define SSL_CTRL_GET_PEER_SIGNATURE_NID         108
# define SSL_CTRL_GET_PEER_TMP_KEY               109
# define SSL_CTRL_GET_RAW_CIPHERLIST             110
# define SSL_CTRL_GET_EC_POINT_FORMATS           111
# define SSL_CTRL_GET_CHAIN_CERTS                115
# define SSL_CTRL_SELECT_CURRENT_CERT            116
# define SSL_CTRL_SET_CURRENT_CERT               117
# define SSL_CTRL_SET_DH_AUTO                    118
# define DTLS_CTRL_SET_LINK_MTU                  120
# define DTLS_CTRL_GET_LINK_MIN_MTU              121
# define SSL_CTRL_GET_EXTMS_SUPPORT              122
# define SSL_CTRL_SET_MIN_PROTO_VERSION          123
# define SSL_CTRL_SET_MAX_PROTO_VERSION          124
# define SSL_CTRL_SET_SPLIT_SEND_FRAGMENT        125
# define SSL_CTRL_SET_MAX_PIPELINES              126
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_TYPE     127
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB       128
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG   129
# define SSL_CTRL_GET_MIN_PROTO_VERSION          130
# define SSL_CTRL_GET_MAX_PROTO_VERSION          131
# define SSL_CTRL_GET_SIGNATURE_NID              132
# define SSL_CTRL_GET_TMP_KEY                    133
# define SSL_CTRL_GET_NEGOTIATED_GROUP           134
# define SSL_CTRL_SET_RETRY_VERIFY               136
# define SSL_CTRL_GET_VERIFY_CERT_STORE          137
# define SSL_CTRL_GET_CHAIN_CERT_STORE           138
# define SSL_CERT_SET_FIRST                      1
# define SSL_CERT_SET_NEXT                       2
# define SSL_CERT_SET_SERVER                     3
# define DTLSv1_get_timeout(ssl, arg) \
        SSL_ctrl(ssl,DTLS_CTRL_GET_TIMEOUT,0, (void *)(arg))
# define DTLSv1_handle_timeout(ssl) \
        SSL_ctrl(ssl,DTLS_CTRL_HANDLE_TIMEOUT,0, NULL)
# define SSL_num_renegotiations(ssl) \
        SSL_ctrl((ssl),SSL_CTRL_GET_NUM_RENEGOTIATIONS,0,NULL)
# define SSL_clear_num_renegotiations(ssl) \
        SSL_ctrl((ssl),SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS,0,NULL)
# define SSL_total_renegotiations(ssl) \
        SSL_ctrl((ssl),SSL_CTRL_GET_TOTAL_RENEGOTIATIONS,0,NULL)
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_CTX_set_tmp_dh(ctx,dh) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,(char *)(dh))
# endif
# define SSL_CTX_set_dh_auto(ctx, onoff) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_DH_AUTO,onoff,NULL)
# define SSL_set_dh_auto(s, onoff) \
        SSL_ctrl(s,SSL_CTRL_SET_DH_AUTO,onoff,NULL)
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_set_tmp_dh(ssl,dh) \
        SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH,0,(char *)(dh))
# endif
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_CTX_set_tmp_ecdh(ctx,ecdh) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH,0,(char *)(ecdh))
#  define SSL_set_tmp_ecdh(ssl,ecdh) \
        SSL_ctrl(ssl,SSL_CTRL_SET_TMP_ECDH,0,(char *)(ecdh))
# endif
# define SSL_CTX_add_extra_chain_cert(ctx,x509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)(x509))
# define SSL_CTX_get_extra_chain_certs(ctx,px509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,0,px509)
# define SSL_CTX_get_extra_chain_certs_only(ctx,px509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,1,px509)
# define SSL_CTX_clear_extra_chain_certs(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS,0,NULL)
# define SSL_CTX_set0_chain(ctx,sk) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,0,(char *)(sk))
# define SSL_CTX_set1_chain(ctx,sk) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,1,(char *)(sk))
# define SSL_CTX_add0_chain_cert(ctx,x509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,0,(char *)(x509))
# define SSL_CTX_add1_chain_cert(ctx,x509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,1,(char *)(x509))
# define SSL_CTX_get0_chain_certs(ctx,px509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERTS,0,px509)
# define SSL_CTX_clear_chain_certs(ctx) \
        SSL_CTX_set0_chain(ctx,NULL)
# define SSL_CTX_build_cert_chain(ctx, flags) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL)
# define SSL_CTX_select_current_cert(ctx,x509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)(x509))
# define SSL_CTX_set_current_cert(ctx, op) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURRENT_CERT, op, NULL)
# define SSL_CTX_set0_verify_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)(st))
# define SSL_CTX_set1_verify_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)(st))
# define SSL_CTX_get0_verify_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_VERIFY_CERT_STORE,0,(char *)(st))
# define SSL_CTX_set0_chain_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)(st))
# define SSL_CTX_set1_chain_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)(st))
# define SSL_CTX_get0_chain_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERT_STORE,0,(char *)(st))
# define SSL_set0_chain(s,sk) \
        SSL_ctrl(s,SSL_CTRL_CHAIN,0,(char *)(sk))
# define SSL_set1_chain(s,sk) \
        SSL_ctrl(s,SSL_CTRL_CHAIN,1,(char *)(sk))
# define SSL_add0_chain_cert(s,x509) \
        SSL_ctrl(s,SSL_CTRL_CHAIN_CERT,0,(char *)(x509))
# define SSL_add1_chain_cert(s,x509) \
        SSL_ctrl(s,SSL_CTRL_CHAIN_CERT,1,(char *)(x509))
# define SSL_get0_chain_certs(s,px509) \
        SSL_ctrl(s,SSL_CTRL_GET_CHAIN_CERTS,0,px509)
# define SSL_clear_chain_certs(s) \
        SSL_set0_chain(s,NULL)
# define SSL_build_cert_chain(s, flags) \
        SSL_ctrl(s,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL)
# define SSL_select_current_cert(s,x509) \
        SSL_ctrl(s,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)(x509))
# define SSL_set_current_cert(s,op) \
        SSL_ctrl(s,SSL_CTRL_SET_CURRENT_CERT, op, NULL)
# define SSL_set0_verify_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)(st))
# define SSL_set1_verify_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)(st))
#define SSL_get0_verify_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_GET_VERIFY_CERT_STORE,0,(char *)(st))
# define SSL_set0_chain_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)(st))
# define SSL_set1_chain_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)(st))
#define SSL_get0_chain_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_GET_CHAIN_CERT_STORE,0,(char *)(st))

# define SSL_get1_groups(s, glist) \
        SSL_ctrl(s,SSL_CTRL_GET_GROUPS,0,(int*)(glist))
# define SSL_CTX_set1_groups(ctx, glist, glistlen) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_GROUPS,glistlen,(int *)(glist))
# define SSL_CTX_set1_groups_list(ctx, s) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_GROUPS_LIST,0,(char *)(s))
# define SSL_set1_groups(s, glist, glistlen) \
        SSL_ctrl(s,SSL_CTRL_SET_GROUPS,glistlen,(char *)(glist))
# define SSL_set1_groups_list(s, str) \
        SSL_ctrl(s,SSL_CTRL_SET_GROUPS_LIST,0,(char *)(str))
# define SSL_get_shared_group(s, n) \
        SSL_ctrl(s,SSL_CTRL_GET_SHARED_GROUP,n,NULL)
# define SSL_get_negotiated_group(s) \
        SSL_ctrl(s,SSL_CTRL_GET_NEGOTIATED_GROUP,0,NULL)
# define SSL_CTX_set1_sigalgs(ctx, slist, slistlen) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS,slistlen,(int *)(slist))
# define SSL_CTX_set1_sigalgs_list(ctx, s) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)(s))
# define SSL_set1_sigalgs(s, slist, slistlen) \
        SSL_ctrl(s,SSL_CTRL_SET_SIGALGS,slistlen,(int *)(slist))
# define SSL_set1_sigalgs_list(s, str) \
        SSL_ctrl(s,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)(str))
# define SSL_CTX_set1_client_sigalgs(ctx, slist, slistlen) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS,slistlen,(int *)(slist))
# define SSL_CTX_set1_client_sigalgs_list(ctx, s) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)(s))
# define SSL_set1_client_sigalgs(s, slist, slistlen) \
        SSL_ctrl(s,SSL_CTRL_SET_CLIENT_SIGALGS,slistlen,(int *)(slist))
# define SSL_set1_client_sigalgs_list(s, str) \
        SSL_ctrl(s,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)(str))
# define SSL_get0_certificate_types(s, clist) \
        SSL_ctrl(s, SSL_CTRL_GET_CLIENT_CERT_TYPES, 0, (char *)(clist))
# define SSL_CTX_set1_client_certificate_types(ctx, clist, clistlen) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen, \
                     (char *)(clist))
# define SSL_set1_client_certificate_types(s, clist, clistlen) \
        SSL_ctrl(s,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen,(char *)(clist))
# define SSL_get_signature_nid(s, pn) \
        SSL_ctrl(s,SSL_CTRL_GET_SIGNATURE_NID,0,pn)
# define SSL_get_peer_signature_nid(s, pn) \
        SSL_ctrl(s,SSL_CTRL_GET_PEER_SIGNATURE_NID,0,pn)
# define SSL_get_peer_tmp_key(s, pk) \
        SSL_ctrl(s,SSL_CTRL_GET_PEER_TMP_KEY,0,pk)
# define SSL_get_tmp_key(s, pk) \
        SSL_ctrl(s,SSL_CTRL_GET_TMP_KEY,0,pk)
# define SSL_get0_raw_cipherlist(s, plst) \
        SSL_ctrl(s,SSL_CTRL_GET_RAW_CIPHERLIST,0,plst)
# define SSL_get0_ec_point_formats(s, plst) \
        SSL_ctrl(s,SSL_CTRL_GET_EC_POINT_FORMATS,0,plst)
# define SSL_CTX_set_min_proto_version(ctx, version) \
        SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL)
# define SSL_CTX_set_max_proto_version(ctx, version) \
        SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL)
# define SSL_CTX_get_min_proto_version(ctx) \
        SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL)
# define SSL_CTX_get_max_proto_version(ctx) \
        SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL)
# define SSL_set_min_proto_version(s, version) \
        SSL_ctrl(s, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL)
# define SSL_set_max_proto_version(s, version) \
        SSL_ctrl(s, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL)
# define SSL_get_min_proto_version(s) \
        SSL_ctrl(s, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL)
# define SSL_get_max_proto_version(s) \
        SSL_ctrl(s, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL)

const char *SSL_group_to_name(SSL *s, int id);

/* Backwards compatibility, original 1.1.0 names */
# define SSL_CTRL_GET_SERVER_TMP_KEY \
         SSL_CTRL_GET_PEER_TMP_KEY
# define SSL_get_server_tmp_key(s, pk) \
         SSL_get_peer_tmp_key(s, pk)

int SSL_set0_tmp_dh_pkey(SSL *s, EVP_PKEY *dhpkey);
int SSL_CTX_set0_tmp_dh_pkey(SSL_CTX *ctx, EVP_PKEY *dhpkey);

/*
 * The following symbol names are old and obsolete. They are kept
 * for compatibility reasons only and should not be used anymore.
 */
# define SSL_CTRL_GET_CURVES           SSL_CTRL_GET_GROUPS
# define SSL_CTRL_SET_CURVES           SSL_CTRL_SET_GROUPS
# define SSL_CTRL_SET_CURVES_LIST      SSL_CTRL_SET_GROUPS_LIST
# define SSL_CTRL_GET_SHARED_CURVE     SSL_CTRL_GET_SHARED_GROUP

# define SSL_get1_curves               SSL_get1_groups
# define SSL_CTX_set1_curves           SSL_CTX_set1_groups
# define SSL_CTX_set1_curves_list      SSL_CTX_set1_groups_list
# define SSL_set1_curves               SSL_set1_groups
# define SSL_set1_curves_list          SSL_set1_groups_list
# define SSL_get_shared_curve          SSL_get_shared_group


# ifndef OPENSSL_NO_DEPRECATED_1_1_0
/* Provide some compatibility macros for removed functionality. */
#  define SSL_CTX_need_tmp_RSA(ctx)                0
#  define SSL_CTX_set_tmp_rsa(ctx,rsa)             1
#  define SSL_need_tmp_RSA(ssl)                    0
#  define SSL_set_tmp_rsa(ssl,rsa)                 1
#  define SSL_CTX_set_ecdh_auto(dummy, onoff)      ((onoff) != 0)
#  define SSL_set_ecdh_auto(dummy, onoff)          ((onoff) != 0)
/*
 * We "pretend" to call the callback to avoid warnings about unused static
 * functions.
 */
#  define SSL_CTX_set_tmp_rsa_callback(ctx, cb)    while(0) (cb)(NULL, 0, 0)
#  define SSL_set_tmp_rsa_callback(ssl, cb)        while(0) (cb)(NULL, 0, 0)
# endif
__owur const BIO_METHOD *BIO_f_ssl(void);
__owur BIO *BIO_new_ssl(SSL_CTX *ctx, int client);
__owur BIO *BIO_new_ssl_connect(SSL_CTX *ctx);
__owur BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx);
__owur int BIO_ssl_copy_session_id(BIO *to, BIO *from);
void BIO_ssl_shutdown(BIO *ssl_bio);

__owur int SSL_CTX_set_cipher_list(SSL_CTX *, const char *str);
__owur SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth);
__owur SSL_CTX *SSL_CTX_new_ex(OSSL_LIB_CTX *libctx, const char *propq,
                               const SSL_METHOD *meth);
int SSL_CTX_up_ref(SSL_CTX *ctx);
void SSL_CTX_free(SSL_CTX *);
__owur long SSL_CTX_set_timeout(SSL_CTX *ctx, long t);
__owur long SSL_CTX_get_timeout(const SSL_CTX *ctx);
__owur X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *);
void SSL_CTX_set_cert_store(SSL_CTX *, X509_STORE *);
void SSL_CTX_set1_cert_store(SSL_CTX *, X509_STORE *);
__owur int SSL_want(const SSL *s);
__owur int SSL_clear(SSL *s);

void SSL_CTX_flush_sessions(SSL_CTX *ctx, long tm);

__owur const SSL_CIPHER *SSL_get_current_cipher(const SSL *s);
__owur const SSL_CIPHER *SSL_get_pending_cipher(const SSL *s);
__owur int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits);
__owur const char *SSL_CIPHER_get_version(const SSL_CIPHER *c);
__owur const char *SSL_CIPHER_get_name(const SSL_CIPHER *c);
__owur const char *SSL_CIPHER_standard_name(const SSL_CIPHER *c);
__owur const char *OPENSSL_cipher_name(const char *rfc_name);
__owur uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *c);
__owur uint16_t SSL_CIPHER_get_protocol_id(const SSL_CIPHER *c);
__owur int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *c);
__owur int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *c);
__owur const EVP_MD *SSL_CIPHER_get_handshake_digest(const SSL_CIPHER *c);
__owur int SSL_CIPHER_is_aead(const SSL_CIPHER *c);

__owur int SSL_get_fd(const SSL *s);
__owur int SSL_get_rfd(const SSL *s);
__owur int SSL_get_wfd(const SSL *s);
__owur const char *SSL_get_cipher_list(const SSL *s, int n);
__owur char *SSL_get_shared_ciphers(const SSL *s, char *buf, int size);
__owur int SSL_get_read_ahead(const SSL *s);
__owur int SSL_pending(const SSL *s);
__owur int SSL_has_pending(const SSL *s);
# ifndef OPENSSL_NO_SOCK
__owur int SSL_set_fd(SSL *s, int fd);
__owur int SSL_set_rfd(SSL *s, int fd);
__owur int SSL_set_wfd(SSL *s, int fd);
# endif
void SSL_set0_rbio(SSL *s, BIO *rbio);
void SSL_set0_wbio(SSL *s, BIO *wbio);
void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio);
__owur BIO *SSL_get_rbio(const SSL *s);
__owur BIO *SSL_get_wbio(const SSL *s);
__owur int SSL_set_cipher_list(SSL *s, const char *str);
__owur int SSL_CTX_set_ciphersuites(SSL_CTX *ctx, const char *str);
__owur int SSL_set_ciphersuites(SSL *s, const char *str);
void SSL_set_read_ahead(SSL *s, int yes);
__owur int SSL_get_verify_mode(const SSL *s);
__owur int SSL_get_verify_depth(const SSL *s);
__owur SSL_verify_cb SSL_get_verify_callback(const SSL *s);
void SSL_set_verify(SSL *s, int mode, SSL_verify_cb callback);
void SSL_set_verify_depth(SSL *s, int depth);
void SSL_set_cert_cb(SSL *s, int (*cb) (SSL *ssl, void *arg), void *arg);
# ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0 __owur int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa);
OSSL_DEPRECATEDIN_3_0
__owur int SSL_use_RSAPrivateKey_ASN1(SSL *ssl,
                                      const unsigned char *d, long len);
# endif
__owur int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey);
__owur int SSL_use_PrivateKey_ASN1(int pk, SSL *ssl, const unsigned char *d,
                                   long len);
__owur int SSL_use_certificate(SSL *ssl, X509 *x);
__owur int SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len);
__owur int SSL_use_cert_and_key(SSL *ssl, X509 *x509, EVP_PKEY *privatekey,
                                STACK_OF(X509) *chain, int override);


/* serverinfo file format versions */
# define SSL_SERVERINFOV1   1
# define SSL_SERVERINFOV2   2

/* Set serverinfo data for the current active cert. */
__owur int SSL_CTX_use_serverinfo(SSL_CTX *ctx, const unsigned char *serverinfo,
                                  size_t serverinfo_length);
__owur int SSL_CTX_use_serverinfo_ex(SSL_CTX *ctx, unsigned int version,
                                     const unsigned char *serverinfo,
                                     size_t serverinfo_length);
__owur int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file);

#ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0
__owur int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type);
#endif

__owur int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type);
__owur int SSL_use_certificate_file(SSL *ssl, const char *file, int type);

#ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0
__owur int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file,
                                          int type);
#endif
__owur int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file,
                                       int type);
__owur int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file,
                                        int type);
/* PEM type */
__owur int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file);
__owur int SSL_use_certificate_chain_file(SSL *ssl, const char *file);
__owur STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file);
__owur STACK_OF(X509_NAME)
*SSL_load_client_CA_file_ex(const char *file, OSSL_LIB_CTX *libctx,
                            const char *propq);
__owur int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs,
                                               const char *file);
int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs,
                                       const char *dir);
int SSL_add_store_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs,
                                       const char *uri);

# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  define SSL_load_error_strings() \
    OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS \
                     | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL)
# endif

__owur const char *SSL_state_string(const SSL *s);
__owur const char *SSL_rstate_string(const SSL *s);
__owur const char *SSL_state_string_long(const SSL *s);
__owur const char *SSL_rstate_string_long(const SSL *s);
__owur long SSL_SESSION_get_time(const SSL_SESSION *s);
__owur long SSL_SESSION_set_time(SSL_SESSION *s, long t);
__owur long SSL_SESSION_get_timeout(const SSL_SESSION *s);
__owur long SSL_SESSION_set_timeout(SSL_SESSION *s, long t);
__owur int SSL_SESSION_get_protocol_version(const SSL_SESSION *s);
__owur int SSL_SESSION_set_protocol_version(SSL_SESSION *s, int version);

__owur const char *SSL_SESSION_get0_hostname(const SSL_SESSION *s);
__owur int SSL_SESSION_set1_hostname(SSL_SESSION *s, const char *hostname);
void SSL_SESSION_get0_alpn_selected(const SSL_SESSION *s,
                                    const unsigned char **alpn,
                                    size_t *len);
__owur int SSL_SESSION_set1_alpn_selected(SSL_SESSION *s,
                                          const unsigned char *alpn,
                                          size_t len);
__owur const SSL_CIPHER *SSL_SESSION_get0_cipher(const SSL_SESSION *s);
__owur int SSL_SESSION_set_cipher(SSL_SESSION *s, const SSL_CIPHER *cipher);
__owur int SSL_SESSION_has_ticket(const SSL_SESSION *s);
__owur unsigned long SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *s);
void SSL_SESSION_get0_ticket(const SSL_SESSION *s, const unsigned char **tick,
                             size_t *len);
__owur uint32_t SSL_SESSION_get_max_early_data(const SSL_SESSION *s);
__owur int SSL_SESSION_set_max_early_data(SSL_SESSION *s,
                                          uint32_t max_early_data);
__owur int SSL_copy_session_id(SSL *to, const SSL *from);
__owur X509 *SSL_SESSION_get0_peer(SSL_SESSION *s);
__owur int SSL_SESSION_set1_id_context(SSL_SESSION *s,
                                       const unsigned char *sid_ctx,
                                       unsigned int sid_ctx_len);
__owur int SSL_SESSION_set1_id(SSL_SESSION *s, const unsigned char *sid,
                               unsigned int sid_len);
__owur int SSL_SESSION_is_resumable(const SSL_SESSION *s);

__owur SSL_SESSION *SSL_SESSION_new(void);
__owur SSL_SESSION *SSL_SESSION_dup(const SSL_SESSION *src);
const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s,
                                        unsigned int *len);
const unsigned char *SSL_SESSION_get0_id_context(const SSL_SESSION *s,
                                                 unsigned int *len);
__owur unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s);
# ifndef OPENSSL_NO_STDIO
int SSL_SESSION_print_fp(FILE *fp, const SSL_SESSION *ses);
# endif
int SSL_SESSION_print(BIO *fp, const SSL_SESSION *ses);
int SSL_SESSION_print_keylog(BIO *bp, const SSL_SESSION *x);
int SSL_SESSION_up_ref(SSL_SESSION *ses);
void SSL_SESSION_free(SSL_SESSION *ses);
__owur int i2d_SSL_SESSION(const SSL_SESSION *in, unsigned char **pp);
__owur int SSL_set_session(SSL *to, SSL_SESSION *session);
int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *session);
int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *session);
__owur int SSL_CTX_set_generate_session_id(SSL_CTX *ctx, GEN_SESSION_CB cb);
__owur int SSL_set_generate_session_id(SSL *s, GEN_SESSION_CB cb);
__owur int SSL_has_matching_session_id(const SSL *s,
                                       const unsigned char *id,
                                       unsigned int id_len);
SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp,
                             long length);

# ifdef OPENSSL_X509_H
__owur X509 *SSL_get0_peer_certificate(const SSL *s);
__owur X509 *SSL_get1_peer_certificate(const SSL *s);
/* Deprecated in 3.0.0 */
#  ifndef OPENSSL_NO_DEPRECATED_3_0
#   define SSL_get_peer_certificate SSL_get1_peer_certificate
#  endif
# endif

__owur STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s);

__owur int SSL_CTX_get_verify_mode(const SSL_CTX *ctx);
__owur int SSL_CTX_get_verify_depth(const SSL_CTX *ctx);
__owur SSL_verify_cb SSL_CTX_get_verify_callback(const SSL_CTX *ctx);
void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, SSL_verify_cb callback);
void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth);
void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx,
                                      int (*cb) (X509_STORE_CTX *, void *),
                                      void *arg);
void SSL_CTX_set_cert_cb(SSL_CTX *c, int (*cb) (SSL *ssl, void *arg),
                         void *arg);
# ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0
__owur int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa);
OSSL_DEPRECATEDIN_3_0
__owur int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d,
                                          long len);
# endif
__owur int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey);
__owur int SSL_CTX_use_PrivateKey_ASN1(int pk, SSL_CTX *ctx,
                                       const unsigned char *d, long len);
__owur int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x);
__owur int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len,
                                        const unsigned char *d);
__owur int SSL_CTX_use_cert_and_key(SSL_CTX *ctx, X509 *x509, EVP_PKEY *privatekey,
                                    STACK_OF(X509) *chain, int override);

void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb);
void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u);
pem_password_cb *SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx);
void *SSL_CTX_get_default_passwd_cb_userdata(SSL_CTX *ctx);
void SSL_set_default_passwd_cb(SSL *s, pem_password_cb *cb);
void SSL_set_default_passwd_cb_userdata(SSL *s, void *u);
pem_password_cb *SSL_get_default_passwd_cb(SSL *s);
void *SSL_get_default_passwd_cb_userdata(SSL *s);

__owur int SSL_CTX_check_private_key(const SSL_CTX *ctx);
__owur int SSL_check_private_key(const SSL *ctx);

__owur int SSL_CTX_set_session_id_context(SSL_CTX *ctx,
                                          const unsigned char *sid_ctx,
                                          unsigned int sid_ctx_len);

SSL *SSL_new(SSL_CTX *ctx);
int SSL_up_ref(SSL *s);
int SSL_is_dtls(const SSL *s);
__owur int SSL_set_session_id_context(SSL *ssl, const unsigned char *sid_ctx,
                                      unsigned int sid_ctx_len);

__owur int SSL_CTX_set_purpose(SSL_CTX *ctx, int purpose);
__owur int SSL_set_purpose(SSL *ssl, int purpose);
__owur int SSL_CTX_set_trust(SSL_CTX *ctx, int trust);
__owur int SSL_set_trust(SSL *ssl, int trust);

__owur int SSL_set1_host(SSL *s, const char *hostname);
__owur int SSL_add1_host(SSL *s, const char *hostname);
__owur const char *SSL_get0_peername(SSL *s);
void SSL_set_hostflags(SSL *s, unsigned int flags);

__owur int SSL_CTX_dane_enable(SSL_CTX *ctx);
__owur int SSL_CTX_dane_mtype_set(SSL_CTX *ctx, const EVP_MD *md,
                                  uint8_t mtype, uint8_t ord);
__owur int SSL_dane_enable(SSL *s, const char *basedomain);
__owur int SSL_dane_tlsa_add(SSL *s, uint8_t usage, uint8_t selector,
                             uint8_t mtype, const unsigned char *data, size_t dlen);
__owur int SSL_get0_dane_authority(SSL *s, X509 **mcert, EVP_PKEY **mspki);
__owur int SSL_get0_dane_tlsa(SSL *s, uint8_t *usage, uint8_t *selector,
                              uint8_t *mtype, const unsigned char **data,
                              size_t *dlen);
/*
 * Bridge opacity barrier between libcrypt and libssl, also needed to support
 * offline testing in test/danetest.c
 */
SSL_DANE *SSL_get0_dane(SSL *ssl);
/*
 * DANE flags
 */
unsigned long SSL_CTX_dane_set_flags(SSL_CTX *ctx, unsigned long flags);
unsigned long SSL_CTX_dane_clear_flags(SSL_CTX *ctx, unsigned long flags);
unsigned long SSL_dane_set_flags(SSL *ssl, unsigned long flags);
unsigned long SSL_dane_clear_flags(SSL *ssl, unsigned long flags);

__owur int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm);
__owur int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm);

__owur X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx);
__owur X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl);

# ifndef OPENSSL_NO_SRP
#  ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_username(SSL_CTX *ctx, char *name);
OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_password(SSL_CTX *ctx, char *password);
OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength);
OSSL_DEPRECATEDIN_3_0
int SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx,
                                        char *(*cb) (SSL *, void *));
OSSL_DEPRECATEDIN_3_0
int SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx,
                                          int (*cb) (SSL *, void *));
OSSL_DEPRECATEDIN_3_0
int SSL_CTX_set_srp_username_callback(SSL_CTX *ctx,
                                      int (*cb) (SSL *, int *, void *));
OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg);

OSSL_DEPRECATEDIN_3_0
int SSL_set_srp_server_param(SSL *s, const BIGNUM *N, const BIGNUM *g,
                             BIGNUM *sa, BIGNUM *v, char *info);
OSSL_DEPRECATEDIN_3_0
int SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass,
                                const char *grp);

OSSL_DEPRECATEDIN_3_0 __owur BIGNUM *SSL_get_srp_g(SSL *s);
OSSL_DEPRECATEDIN_3_0 __owur BIGNUM *SSL_get_srp_N(SSL *s);

OSSL_DEPRECATEDIN_3_0 __owur char *SSL_get_srp_username(SSL *s);
OSSL_DEPRECATEDIN_3_0 __owur char *SSL_get_srp_userinfo(SSL *s);
#  endif
# endif

/*
 * ClientHello callback and helpers.
 */

# define SSL_CLIENT_HELLO_SUCCESS 1
# define SSL_CLIENT_HELLO_ERROR   0
# define SSL_CLIENT_HELLO_RETRY   (-1)

typedef int (*SSL_client_hello_cb_fn) (SSL *s, int *al, void *arg);
void SSL_CTX_set_client_hello_cb(SSL_CTX *c, SSL_client_hello_cb_fn cb,
                                 void *arg);
int SSL_client_hello_isv2(SSL *s);
unsigned int SSL_client_hello_get0_legacy_version(SSL *s);
size_t SSL_client_hello_get0_random(SSL *s, const unsigned char **out);
size_t SSL_client_hello_get0_session_id(SSL *s, const unsigned char **out);
size_t SSL_client_hello_get0_ciphers(SSL *s, const unsigned char **out);
size_t SSL_client_hello_get0_compression_methods(SSL *s,
                                                 const unsigned char **out);
int SSL_client_hello_get1_extensions_present(SSL *s, int **out, size_t *outlen);
int SSL_client_hello_get0_ext(SSL *s, unsigned int type,
                              const unsigned char **out, size_t *outlen);

void SSL_certs_clear(SSL *s);
void SSL_free(SSL *ssl);
# ifdef OSSL_ASYNC_FD
/*
 * Windows application developer has to include windows.h to use these.
 */
__owur int SSL_waiting_for_async(SSL *s);
__owur int SSL_get_all_async_fds(SSL *s, OSSL_ASYNC_FD *fds, size_t *numfds);
__owur int SSL_get_changed_async_fds(SSL *s, OSSL_ASYNC_FD *addfd,
                                     size_t *numaddfds, OSSL_ASYNC_FD *delfd,
                                     size_t *numdelfds);
__owur int SSL_CTX_set_async_callback(SSL_CTX *ctx, SSL_async_callback_fn callback);
__owur int SSL_CTX_set_async_callback_arg(SSL_CTX *ctx, void *arg);
__owur int SSL_set_async_callback(SSL *s, SSL_async_callback_fn callback);
__owur int SSL_set_async_callback_arg(SSL *s, void *arg);
__owur int SSL_get_async_status(SSL *s, int *status);

# endif
__owur int SSL_accept(SSL *ssl);
__owur int SSL_stateless(SSL *s);
__owur int SSL_connect(SSL *ssl);
__owur int SSL_read(SSL *ssl, void *buf, int num);
__owur int SSL_read_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes);

# define SSL_READ_EARLY_DATA_ERROR   0
# define SSL_READ_EARLY_DATA_SUCCESS 1
# define SSL_READ_EARLY_DATA_FINISH  2

__owur int SSL_read_early_data(SSL *s, void *buf, size_t num,
                               size_t *readbytes);
__owur int SSL_peek(SSL *ssl, void *buf, int num);
__owur int SSL_peek_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes);
__owur ossl_ssize_t SSL_sendfile(SSL *s, int fd, off_t offset, size_t size,
                                 int flags);
__owur int SSL_write(SSL *ssl, const void *buf, int num);
__owur int SSL_write_ex(SSL *s, const void *buf, size_t num, size_t *written);
__owur int SSL_write_early_data(SSL *s, const void *buf, size_t num,
                                size_t *written);
long SSL_ctrl(SSL *ssl, int cmd, long larg, void *parg);
long SSL_callback_ctrl(SSL *, int, void (*)(void));
long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg);
long SSL_CTX_callback_ctrl(SSL_CTX *, int, void (*)(void));

# define SSL_EARLY_DATA_NOT_SENT    0
# define SSL_EARLY_DATA_REJECTED    1
# define SSL_EARLY_DATA_ACCEPTED    2

__owur int SSL_get_early_data_status(const SSL *s);

__owur int SSL_get_error(const SSL *s, int ret_code);
__owur const char *SSL_get_version(const SSL *s);

/* This sets the 'default' SSL version that SSL_new() will create */
# ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0
__owur int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth);
# endif

# ifndef OPENSSL_NO_SSL3_METHOD
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_method(void); /* SSLv3 */
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_client_method(void);
#  endif
# endif

#define SSLv23_method           TLS_method
#define SSLv23_server_method    TLS_server_method
#define SSLv23_client_method    TLS_client_method

/* Negotiate highest available SSL/TLS version */
__owur const SSL_METHOD *TLS_method(void);
__owur const SSL_METHOD *TLS_server_method(void);
__owur const SSL_METHOD *TLS_client_method(void);

# ifndef OPENSSL_NO_TLS1_METHOD
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_method(void); /* TLSv1.0 */
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_client_method(void);
#  endif
# endif

# ifndef OPENSSL_NO_TLS1_1_METHOD
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_method(void); /* TLSv1.1 */
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_client_method(void);
#  endif
# endif

# ifndef OPENSSL_NO_TLS1_2_METHOD
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_method(void); /* TLSv1.2 */
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_client_method(void);
#  endif
# endif

# ifndef OPENSSL_NO_DTLS1_METHOD
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_method(void); /* DTLSv1.0 */
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_client_method(void);
#  endif
# endif

# ifndef OPENSSL_NO_DTLS1_2_METHOD
/* DTLSv1.2 */
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_client_method(void);
#  endif
# endif

__owur const SSL_METHOD *DTLS_method(void); /* DTLS 1.0 and 1.2 */
__owur const SSL_METHOD *DTLS_server_method(void); /* DTLS 1.0 and 1.2 */
__owur const SSL_METHOD *DTLS_client_method(void); /* DTLS 1.0 and 1.2 */

__owur size_t DTLS_get_data_mtu(const SSL *s);

__owur STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s);
__owur STACK_OF(SSL_CIPHER) *SSL_CTX_get_ciphers(const SSL_CTX *ctx);
__owur STACK_OF(SSL_CIPHER) *SSL_get_client_ciphers(const SSL *s);
__owur STACK_OF(SSL_CIPHER) *SSL_get1_supported_ciphers(SSL *s);

__owur int SSL_do_handshake(SSL *s);
int SSL_key_update(SSL *s, int updatetype);
int SSL_get_key_update_type(const SSL *s);
int SSL_renegotiate(SSL *s);
int SSL_renegotiate_abbreviated(SSL *s);
__owur int SSL_renegotiate_pending(const SSL *s);
int SSL_new_session_ticket(SSL *s);
int SSL_shutdown(SSL *s);
__owur int SSL_verify_client_post_handshake(SSL *s);
void SSL_CTX_set_post_handshake_auth(SSL_CTX *ctx, int val);
void SSL_set_post_handshake_auth(SSL *s, int val);

__owur const SSL_METHOD *SSL_CTX_get_ssl_method(const SSL_CTX *ctx);
__owur const SSL_METHOD *SSL_get_ssl_method(const SSL *s);
__owur int SSL_set_ssl_method(SSL *s, const SSL_METHOD *method);
__owur const char *SSL_alert_type_string_long(int value);
__owur const char *SSL_alert_type_string(int value);
__owur const char *SSL_alert_desc_string_long(int value);
__owur const char *SSL_alert_desc_string(int value);

void SSL_set0_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list);
void SSL_CTX_set0_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list);
__owur const STACK_OF(X509_NAME) *SSL_get0_CA_list(const SSL *s);
__owur const STACK_OF(X509_NAME) *SSL_CTX_get0_CA_list(const SSL_CTX *ctx);
__owur int SSL_add1_to_CA_list(SSL *ssl, const X509 *x);
__owur int SSL_CTX_add1_to_CA_list(SSL_CTX *ctx, const X509 *x);
__owur const STACK_OF(X509_NAME) *SSL_get0_peer_CA_list(const SSL *s);

void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list);
void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list);
__owur STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s);
__owur STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *s);
__owur int SSL_add_client_CA(SSL *ssl, X509 *x);
__owur int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x);

void SSL_set_connect_state(SSL *s);
void SSL_set_accept_state(SSL *s);

__owur long SSL_get_default_timeout(const SSL *s);

# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  define SSL_library_init() OPENSSL_init_ssl(0, NULL)
# endif

__owur char *SSL_CIPHER_description(const SSL_CIPHER *, char *buf, int size);
__owur STACK_OF(X509_NAME) *SSL_dup_CA_list(const STACK_OF(X509_NAME) *sk);

__owur SSL *SSL_dup(SSL *ssl);

__owur X509 *SSL_get_certificate(const SSL *ssl);
/*
 * EVP_PKEY
 */
struct evp_pkey_st *SSL_get_privatekey(const SSL *ssl);

__owur X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx);
__owur EVP_PKEY *SSL_CTX_get0_privatekey(const SSL_CTX *ctx);

void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx, int mode);
__owur int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx);
void SSL_set_quiet_shutdown(SSL *ssl, int mode);
__owur int SSL_get_quiet_shutdown(const SSL *ssl);
void SSL_set_shutdown(SSL *ssl, int mode);
__owur int SSL_get_shutdown(const SSL *ssl);
__owur int SSL_version(const SSL *ssl);
__owur int SSL_client_version(const SSL *s);
__owur int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx);
__owur int SSL_CTX_set_default_verify_dir(SSL_CTX *ctx);
__owur int SSL_CTX_set_default_verify_file(SSL_CTX *ctx);
__owur int SSL_CTX_set_default_verify_store(SSL_CTX *ctx);
__owur int SSL_CTX_load_verify_file(SSL_CTX *ctx, const char *CAfile);
__owur int SSL_CTX_load_verify_dir(SSL_CTX *ctx, const char *CApath);
__owur int SSL_CTX_load_verify_store(SSL_CTX *ctx, const char *CAstore);
__owur int SSL_CTX_load_verify_locations(SSL_CTX *ctx,
                                                        const char *CAfile,
                                                        const char *CApath);
# define SSL_get0_session SSL_get_session/* just peek at pointer */
__owur SSL_SESSION *SSL_get_session(const SSL *ssl);
__owur SSL_SESSION *SSL_get1_session(SSL *ssl); /* obtain a reference count */
__owur SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl);
SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX *ctx);
void SSL_set_info_callback(SSL *ssl,
                           void (*cb) (const SSL *ssl, int type, int val));
void (*SSL_get_info_callback(const SSL *ssl)) (const SSL *ssl, int type,
                                               int val);
__owur OSSL_HANDSHAKE_STATE SSL_get_state(const SSL *ssl);

void SSL_set_verify_result(SSL *ssl, long v);
__owur long SSL_get_verify_result(const SSL *ssl);
__owur STACK_OF(X509) *SSL_get0_verified_chain(const SSL *s);

__owur size_t SSL_get_client_random(const SSL *ssl, unsigned char *out,
                                    size_t outlen);
__owur size_t SSL_get_server_random(const SSL *ssl, unsigned char *out,
                                    size_t outlen);
__owur size_t SSL_SESSION_get_master_key(const SSL_SESSION *sess,
                                         unsigned char *out, size_t outlen);
__owur int SSL_SESSION_set1_master_key(SSL_SESSION *sess,
                                       const unsigned char *in, size_t len);
uint8_t SSL_SESSION_get_max_fragment_length(const SSL_SESSION *sess);

#define SSL_get_ex_new_index(l, p, newf, dupf, freef) \
    CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, l, p, newf, dupf, freef)
__owur int SSL_set_ex_data(SSL *ssl, int idx, void *data);
void *SSL_get_ex_data(const SSL *ssl, int idx);
#define SSL_SESSION_get_ex_new_index(l, p, newf, dupf, freef) \
    CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_SESSION, l, p, newf, dupf, freef)
__owur int SSL_SESSION_set_ex_data(SSL_SESSION *ss, int idx, void *data);
void *SSL_SESSION_get_ex_data(const SSL_SESSION *ss, int idx);
#define SSL_CTX_get_ex_new_index(l, p, newf, dupf, freef) \
    CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, l, p, newf, dupf, freef)
__owur int SSL_CTX_set_ex_data(SSL_CTX *ssl, int idx, void *data);
void *SSL_CTX_get_ex_data(const SSL_CTX *ssl, int idx);

__owur int SSL_get_ex_data_X509_STORE_CTX_idx(void);

# define SSL_CTX_sess_set_cache_size(ctx,t) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_SIZE,t,NULL)
# define SSL_CTX_sess_get_cache_size(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_SIZE,0,NULL)
# define SSL_CTX_set_session_cache_mode(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_MODE,m,NULL)
# define SSL_CTX_get_session_cache_mode(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_MODE,0,NULL)

# define SSL_CTX_get_default_read_ahead(ctx) SSL_CTX_get_read_ahead(ctx)
# define SSL_CTX_set_default_read_ahead(ctx,m) SSL_CTX_set_read_ahead(ctx,m)
# define SSL_CTX_get_read_ahead(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_READ_AHEAD,0,NULL)
# define SSL_CTX_set_read_ahead(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_READ_AHEAD,m,NULL)
# define SSL_CTX_get_max_cert_list(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL)
# define SSL_CTX_set_max_cert_list(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL)
# define SSL_get_max_cert_list(ssl) \
        SSL_ctrl(ssl,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL)
# define SSL_set_max_cert_list(ssl,m) \
        SSL_ctrl(ssl,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL)

# define SSL_CTX_set_max_send_fragment(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL)
# define SSL_set_max_send_fragment(ssl,m) \
        SSL_ctrl(ssl,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL)
# define SSL_CTX_set_split_send_fragment(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SPLIT_SEND_FRAGMENT,m,NULL)
# define SSL_set_split_send_fragment(ssl,m) \
        SSL_ctrl(ssl,SSL_CTRL_SET_SPLIT_SEND_FRAGMENT,m,NULL)
# define SSL_CTX_set_max_pipelines(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_PIPELINES,m,NULL)
# define SSL_set_max_pipelines(ssl,m) \
        SSL_ctrl(ssl,SSL_CTRL_SET_MAX_PIPELINES,m,NULL)
# define SSL_set_retry_verify(ssl) \
        (SSL_ctrl(ssl,SSL_CTRL_SET_RETRY_VERIFY,0,NULL) > 0)

void SSL_CTX_set_default_read_buffer_len(SSL_CTX *ctx, size_t len);
void SSL_set_default_read_buffer_len(SSL *s, size_t len);

# ifndef OPENSSL_NO_DH
#  ifndef OPENSSL_NO_DEPRECATED_3_0
/* NB: the |keylength| is only applicable when is_export is true */
OSSL_DEPRECATEDIN_3_0
void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,
                                 DH *(*dh) (SSL *ssl, int is_export,
                                            int keylength));
OSSL_DEPRECATEDIN_3_0
void SSL_set_tmp_dh_callback(SSL *ssl,
                             DH *(*dh) (SSL *ssl, int is_export,
                                        int keylength));
#  endif
# endif

__owur const COMP_METHOD *SSL_get_current_compression(const SSL *s);
__owur const COMP_METHOD *SSL_get_current_expansion(const SSL *s);
__owur const char *SSL_COMP_get_name(const COMP_METHOD *comp);
__owur const char *SSL_COMP_get0_name(const SSL_COMP *comp);
__owur int SSL_COMP_get_id(const SSL_COMP *comp);
STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void);
__owur STACK_OF(SSL_COMP) *SSL_COMP_set0_compression_methods(STACK_OF(SSL_COMP)
                                                             *meths);
# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  define SSL_COMP_free_compression_methods() while(0) continue
# endif
__owur int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm);

const SSL_CIPHER *SSL_CIPHER_find(SSL *ssl, const unsigned char *ptr);
int SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *c);
int SSL_CIPHER_get_digest_nid(const SSL_CIPHER *c);
int SSL_bytes_to_cipher_list(SSL *s, const unsigned char *bytes, size_t len,
                             int isv2format, STACK_OF(SSL_CIPHER) **sk,
                             STACK_OF(SSL_CIPHER) **scsvs);

/* TLS extensions functions */
__owur int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len);

__owur int SSL_set_session_ticket_ext_cb(SSL *s,
                                         tls_session_ticket_ext_cb_fn cb,
                                         void *arg);

/* Pre-shared secret session resumption functions */
__owur int SSL_set_session_secret_cb(SSL *s,
                                     tls_session_secret_cb_fn session_secret_cb,
                                     void *arg);

void SSL_CTX_set_not_resumable_session_callback(SSL_CTX *ctx,
                                                int (*cb) (SSL *ssl,
                                                           int
                                                           is_forward_secure));

void SSL_set_not_resumable_session_callback(SSL *ssl,
                                            int (*cb) (SSL *ssl,
                                                       int is_forward_secure));

void SSL_CTX_set_record_padding_callback(SSL_CTX *ctx,
                                         size_t (*cb) (SSL *ssl, int type,
                                                       size_t len, void *arg));
void SSL_CTX_set_record_padding_callback_arg(SSL_CTX *ctx, void *arg);
void *SSL_CTX_get_record_padding_callback_arg(const SSL_CTX *ctx);
int SSL_CTX_set_block_padding(SSL_CTX *ctx, size_t block_size);

int SSL_set_record_padding_callback(SSL *ssl,
                                    size_t (*cb) (SSL *ssl, int type,
                                                  size_t len, void *arg));
void SSL_set_record_padding_callback_arg(SSL *ssl, void *arg);
void *SSL_get_record_padding_callback_arg(const SSL *ssl);
int SSL_set_block_padding(SSL *ssl, size_t block_size);

int SSL_set_num_tickets(SSL *s, size_t num_tickets);
size_t SSL_get_num_tickets(const SSL *s);
int SSL_CTX_set_num_tickets(SSL_CTX *ctx, size_t num_tickets);
size_t SSL_CTX_get_num_tickets(const SSL_CTX *ctx);

# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  define SSL_cache_hit(s) SSL_session_reused(s)
# endif

__owur int SSL_session_reused(const SSL *s);
__owur int SSL_is_server(const SSL *s);

__owur __owur SSL_CONF_CTX *SSL_CONF_CTX_new(void);
int SSL_CONF_CTX_finish(SSL_CONF_CTX *cctx);
void SSL_CONF_CTX_free(SSL_CONF_CTX *cctx);
unsigned int SSL_CONF_CTX_set_flags(SSL_CONF_CTX *cctx, unsigned int flags);
__owur unsigned int SSL_CONF_CTX_clear_flags(SSL_CONF_CTX *cctx,
                                             unsigned int flags);
__owur int SSL_CONF_CTX_set1_prefix(SSL_CONF_CTX *cctx, const char *pre);

void SSL_CONF_CTX_set_ssl(SSL_CONF_CTX *cctx, SSL *ssl);
void SSL_CONF_CTX_set_ssl_ctx(SSL_CONF_CTX *cctx, SSL_CTX *ctx);

__owur int SSL_CONF_cmd(SSL_CONF_CTX *cctx, const char *cmd, const char *value);
__owur int SSL_CONF_cmd_argv(SSL_CONF_CTX *cctx, int *pargc, char ***pargv);
__owur int SSL_CONF_cmd_value_type(SSL_CONF_CTX *cctx, const char *cmd);

void SSL_add_ssl_module(void);
int SSL_config(SSL *s, const char *name);
int SSL_CTX_config(SSL_CTX *ctx, const char *name);

# ifndef OPENSSL_NO_SSL_TRACE
void SSL_trace(int write_p, int version, int content_type,
               const void *buf, size_t len, SSL *ssl, void *arg);
# endif

# ifndef OPENSSL_NO_SOCK
int DTLSv1_listen(SSL *s, BIO_ADDR *client);
# endif

# ifndef OPENSSL_NO_CT

/*
 * A callback for verifying that the received SCTs are sufficient.
 * Expected to return 1 if they are sufficient, otherwise 0.
 * May return a negative integer if an error occurs.
 * A connection should be aborted if the SCTs are deemed insufficient.
 */
typedef int (*ssl_ct_validation_cb)(const CT_POLICY_EVAL_CTX *ctx,
                                    const STACK_OF(SCT) *scts, void *arg);

/*
 * Sets a |callback| that is invoked upon receipt of ServerHelloDone to validate
 * the received SCTs.
 * If the callback returns a non-positive result, the connection is terminated.
 * Call this function before beginning a handshake.
 * If a NULL |callback| is provided, SCT validation is disabled.
 * |arg| is arbitrary userdata that will be passed to the callback whenever it
 * is invoked. Ownership of |arg| remains with the caller.
 *
 * NOTE: A side-effect of setting a CT callback is that an OCSP stapled response
 *       will be requested.
 */
int SSL_set_ct_validation_callback(SSL *s, ssl_ct_validation_cb callback,
                                   void *arg);
int SSL_CTX_set_ct_validation_callback(SSL_CTX *ctx,
                                       ssl_ct_validation_cb callback,
                                       void *arg);
#define SSL_disable_ct(s) \
        ((void) SSL_set_validation_callback((s), NULL, NULL))
#define SSL_CTX_disable_ct(ctx) \
        ((void) SSL_CTX_set_validation_callback((ctx), NULL, NULL))

/*
 * The validation type enumerates the available behaviours of the built-in SSL
 * CT validation callback selected via SSL_enable_ct() and SSL_CTX_enable_ct().
 * The underlying callback is a static function in libssl.
 */
enum {
    SSL_CT_VALIDATION_PERMISSIVE = 0,
    SSL_CT_VALIDATION_STRICT
};

/*
 * Enable CT by setting up a callback that implements one of the built-in
 * validation variants.  The SSL_CT_VALIDATION_PERMISSIVE variant always
 * continues the handshake, the application can make appropriate decisions at
 * handshake completion.  The SSL_CT_VALIDATION_STRICT variant requires at
 * least one valid SCT, or else handshake termination will be requested.  The
 * handshake may continue anyway if SSL_VERIFY_NONE is in effect.
 */
int SSL_enable_ct(SSL *s, int validation_mode);
int SSL_CTX_enable_ct(SSL_CTX *ctx, int validation_mode);

/*
 * Report whether a non-NULL callback is enabled.
 */
int SSL_ct_is_enabled(const SSL *s);
int SSL_CTX_ct_is_enabled(const SSL_CTX *ctx);

/* Gets the SCTs received from a connection */
const STACK_OF(SCT) *SSL_get0_peer_scts(SSL *s);

/*
 * Loads the CT log list from the default location.
 * If a CTLOG_STORE has previously been set using SSL_CTX_set_ctlog_store,
 * the log information loaded from this file will be appended to the
 * CTLOG_STORE.
 * Returns 1 on success, 0 otherwise.
 */
int SSL_CTX_set_default_ctlog_list_file(SSL_CTX *ctx);

/*
 * Loads the CT log list from the specified file path.
 * If a CTLOG_STORE has previously been set using SSL_CTX_set_ctlog_store,
 * the log information loaded from this file will be appended to the
 * CTLOG_STORE.
 * Returns 1 on success, 0 otherwise.
 */
int SSL_CTX_set_ctlog_list_file(SSL_CTX *ctx, const char *path);

/*
 * Sets the CT log list used by all SSL connections created from this SSL_CTX.
 * Ownership of the CTLOG_STORE is transferred to the SSL_CTX.
 */
void SSL_CTX_set0_ctlog_store(SSL_CTX *ctx, CTLOG_STORE *logs);

/*
 * Gets the CT log list used by all SSL connections created from this SSL_CTX.
 * This will be NULL unless one of the following functions has been called:
 * - SSL_CTX_set_default_ctlog_list_file
 * - SSL_CTX_set_ctlog_list_file
 * - SSL_CTX_set_ctlog_store
 */
const CTLOG_STORE *SSL_CTX_get0_ctlog_store(const SSL_CTX *ctx);

# endif /* OPENSSL_NO_CT */

/* What the "other" parameter contains in security callback */
/* Mask for type */
# define SSL_SECOP_OTHER_TYPE    0xffff0000
# define SSL_SECOP_OTHER_NONE    0
# define SSL_SECOP_OTHER_CIPHER  (1 << 16)
# define SSL_SECOP_OTHER_CURVE   (2 << 16)
# define SSL_SECOP_OTHER_DH      (3 << 16)
# define SSL_SECOP_OTHER_PKEY    (4 << 16)
# define SSL_SECOP_OTHER_SIGALG  (5 << 16)
# define SSL_SECOP_OTHER_CERT    (6 << 16)

/* Indicated operation refers to peer key or certificate */
# define SSL_SECOP_PEER          0x1000

/* Values for "op" parameter in security callback */

/* Called to filter ciphers */
/* Ciphers client supports */
# define SSL_SECOP_CIPHER_SUPPORTED      (1 | SSL_SECOP_OTHER_CIPHER)
/* Cipher shared by client/server */
# define SSL_SECOP_CIPHER_SHARED         (2 | SSL_SECOP_OTHER_CIPHER)
/* Sanity check of cipher server selects */
# define SSL_SECOP_CIPHER_CHECK          (3 | SSL_SECOP_OTHER_CIPHER)
/* Curves supported by client */
# define SSL_SECOP_CURVE_SUPPORTED       (4 | SSL_SECOP_OTHER_CURVE)
/* Curves shared by client/server */
# define SSL_SECOP_CURVE_SHARED          (5 | SSL_SECOP_OTHER_CURVE)
/* Sanity check of curve server selects */
# define SSL_SECOP_CURVE_CHECK           (6 | SSL_SECOP_OTHER_CURVE)
/* Temporary DH key */
# define SSL_SECOP_TMP_DH                (7 | SSL_SECOP_OTHER_PKEY)
/* SSL/TLS version */
# define SSL_SECOP_VERSION               (9 | SSL_SECOP_OTHER_NONE)
/* Session tickets */
# define SSL_SECOP_TICKET                (10 | SSL_SECOP_OTHER_NONE)
/* Supported signature algorithms sent to peer */
# define SSL_SECOP_SIGALG_SUPPORTED      (11 | SSL_SECOP_OTHER_SIGALG)
/* Shared signature algorithm */
# define SSL_SECOP_SIGALG_SHARED         (12 | SSL_SECOP_OTHER_SIGALG)
/* Sanity check signature algorithm allowed */
# define SSL_SECOP_SIGALG_CHECK          (13 | SSL_SECOP_OTHER_SIGALG)
/* Used to get mask of supported public key signature algorithms */
# define SSL_SECOP_SIGALG_MASK           (14 | SSL_SECOP_OTHER_SIGALG)
/* Use to see if compression is allowed */
# define SSL_SECOP_COMPRESSION           (15 | SSL_SECOP_OTHER_NONE)
/* EE key in certificate */
# define SSL_SECOP_EE_KEY                (16 | SSL_SECOP_OTHER_CERT)
/* CA key in certificate */
# define SSL_SECOP_CA_KEY                (17 | SSL_SECOP_OTHER_CERT)
/* CA digest algorithm in certificate */
# define SSL_SECOP_CA_MD                 (18 | SSL_SECOP_OTHER_CERT)
/* Peer EE key in certificate */
# define SSL_SECOP_PEER_EE_KEY           (SSL_SECOP_EE_KEY | SSL_SECOP_PEER)
/* Peer CA key in certificate */
# define SSL_SECOP_PEER_CA_KEY           (SSL_SECOP_CA_KEY | SSL_SECOP_PEER)
/* Peer CA digest algorithm in certificate */
# define SSL_SECOP_PEER_CA_MD            (SSL_SECOP_CA_MD | SSL_SECOP_PEER)

void SSL_set_security_level(SSL *s, int level);
__owur int SSL_get_security_level(const SSL *s);
void SSL_set_security_callback(SSL *s,
                               int (*cb) (const SSL *s, const SSL_CTX *ctx,
                                          int op, int bits, int nid,
                                          void *other, void *ex));
int (*SSL_get_security_callback(const SSL *s)) (const SSL *s,
                                                const SSL_CTX *ctx, int op,
                                                int bits, int nid, void *other,
                                                void *ex);
void SSL_set0_security_ex_data(SSL *s, void *ex);
__owur void *SSL_get0_security_ex_data(const SSL *s);

void SSL_CTX_set_security_level(SSL_CTX *ctx, int level);
__owur int SSL_CTX_get_security_level(const SSL_CTX *ctx);
void SSL_CTX_set_security_callback(SSL_CTX *ctx,
                                   int (*cb) (const SSL *s, const SSL_CTX *ctx,
                                              int op, int bits, int nid,
                                              void *other, void *ex));
int (*SSL_CTX_get_security_callback(const SSL_CTX *ctx)) (const SSL *s,
                                                          const SSL_CTX *ctx,
                                                          int op, int bits,
                                                          int nid,
                                                          void *other,
                                                          void *ex);
void SSL_CTX_set0_security_ex_data(SSL_CTX *ctx, void *ex);
__owur void *SSL_CTX_get0_security_ex_data(const SSL_CTX *ctx);

/* OPENSSL_INIT flag 0x010000 reserved for internal use */
# define OPENSSL_INIT_NO_LOAD_SSL_STRINGS    0x00100000L
# define OPENSSL_INIT_LOAD_SSL_STRINGS       0x00200000L

# define OPENSSL_INIT_SSL_DEFAULT \
        (OPENSSL_INIT_LOAD_SSL_STRINGS | OPENSSL_INIT_LOAD_CRYPTO_STRINGS)

int OPENSSL_init_ssl(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings);

# ifndef OPENSSL_NO_UNIT_TEST
__owur const struct openssl_ssl_test_functions *SSL_test_functions(void);
# endif

__owur int SSL_free_buffers(SSL *ssl);
__owur int SSL_alloc_buffers(SSL *ssl);

/* Status codes passed to the decrypt session ticket callback. Some of these
 * are for internal use only and are never passed to the callback. */
typedef int SSL_TICKET_STATUS;

/* Support for ticket appdata */
/* fatal error, malloc failure */
# define SSL_TICKET_FATAL_ERR_MALLOC 0
/* fatal error, either from parsing or decrypting the ticket */
# define SSL_TICKET_FATAL_ERR_OTHER  1
/* No ticket present */
# define SSL_TICKET_NONE             2
/* Empty ticket present */
# define SSL_TICKET_EMPTY            3
/* the ticket couldn't be decrypted */
# define SSL_TICKET_NO_DECRYPT       4
/* a ticket was successfully decrypted */
# define SSL_TICKET_SUCCESS          5
/* same as above but the ticket needs to be renewed */
# define SSL_TICKET_SUCCESS_RENEW    6

/* Return codes for the decrypt session ticket callback */
typedef int SSL_TICKET_RETURN;

/* An error occurred */
#define SSL_TICKET_RETURN_ABORT             0
/* Do not use the ticket, do not send a renewed ticket to the client */
#define SSL_TICKET_RETURN_IGNORE            1
/* Do not use the ticket, send a renewed ticket to the client */
#define SSL_TICKET_RETURN_IGNORE_RENEW      2
/* Use the ticket, do not send a renewed ticket to the client */
#define SSL_TICKET_RETURN_USE               3
/* Use the ticket, send a renewed ticket to the client */
#define SSL_TICKET_RETURN_USE_RENEW         4

typedef int (*SSL_CTX_generate_session_ticket_fn)(SSL *s, void *arg);
typedef SSL_TICKET_RETURN (*SSL_CTX_decrypt_session_ticket_fn)(SSL *s, SSL_SESSION *ss,
                                                               const unsigned char *keyname,
                                                               size_t keyname_length,
                                                               SSL_TICKET_STATUS status,
                                                               void *arg);
int SSL_CTX_set_session_ticket_cb(SSL_CTX *ctx,
                                  SSL_CTX_generate_session_ticket_fn gen_cb,
                                  SSL_CTX_decrypt_session_ticket_fn dec_cb,
                                  void *arg);
int SSL_SESSION_set1_ticket_appdata(SSL_SESSION *ss, const void *data, size_t len);
int SSL_SESSION_get0_ticket_appdata(SSL_SESSION *ss, void **data, size_t *len);

typedef unsigned int (*DTLS_timer_cb)(SSL *s, unsigned int timer_us);

void DTLS_set_timer_cb(SSL *s, DTLS_timer_cb cb);


typedef int (*SSL_allow_early_data_cb_fn)(SSL *s, void *arg);
void SSL_CTX_set_allow_early_data_cb(SSL_CTX *ctx,
                                     SSL_allow_early_data_cb_fn cb,
                                     void *arg);
void SSL_set_allow_early_data_cb(SSL *s,
                                 SSL_allow_early_data_cb_fn cb,
                                 void *arg);

/* store the default cipher strings inside the library */
const char *OSSL_default_cipher_list(void);
const char *OSSL_default_ciphersuites(void);

#  ifndef OPENSSL_NO_QUIC
/*
 * QUIC integration - The QUIC interface matches BoringSSL
 *
 * ssl_encryption_level_t represents a specific QUIC encryption level used to
 * transmit handshake messages. BoringSSL has this as an 'enum'.
 */
#include <openssl/quic.h>

/* Used by Chromium/QUIC - moved from evp.h to avoid breaking FIPS checksums */
# define X25519_PRIVATE_KEY_LEN          32
# define X25519_PUBLIC_VALUE_LEN         32

/* moved from types.h to avoid breaking FIPS checksums */
typedef struct ssl_quic_method_st SSL_QUIC_METHOD;

typedef enum ssl_encryption_level_t {
    ssl_encryption_initial = 0,
    ssl_encryption_early_data,
    ssl_encryption_handshake,
    ssl_encryption_application
} OSSL_ENCRYPTION_LEVEL;

struct ssl_quic_method_st {
    int (*set_encryption_secrets)(SSL *ssl, OSSL_ENCRYPTION_LEVEL level,
                                  const uint8_t *read_secret,
                                  const uint8_t *write_secret, size_t secret_len);
    int (*add_handshake_data)(SSL *ssl, OSSL_ENCRYPTION_LEVEL level,
                              const uint8_t *data, size_t len);
    int (*flush_flight)(SSL *ssl);
    int (*send_alert)(SSL *ssl, enum ssl_encryption_level_t level, uint8_t alert);
};

__owur int SSL_CTX_set_quic_method(SSL_CTX *ctx, const SSL_QUIC_METHOD *quic_method);
__owur int SSL_set_quic_method(SSL *ssl, const SSL_QUIC_METHOD *quic_method);
__owur int SSL_set_quic_transport_params(SSL *ssl,
                                         const uint8_t *params,
                                         size_t params_len);
void SSL_get_peer_quic_transport_params(const SSL *ssl,
                                        const uint8_t **out_params,
                                        size_t *out_params_len);
__owur size_t SSL_quic_max_handshake_flight_len(const SSL *ssl, OSSL_ENCRYPTION_LEVEL level);
__owur OSSL_ENCRYPTION_LEVEL SSL_quic_read_level(const SSL *ssl);
__owur OSSL_ENCRYPTION_LEVEL SSL_quic_write_level(const SSL *ssl);
__owur int SSL_provide_quic_data(SSL *ssl, OSSL_ENCRYPTION_LEVEL level,
                                 const uint8_t *data, size_t len);
__owur int SSL_process_quic_post_handshake(SSL *ssl);

__owur int SSL_is_quic(SSL *ssl);

/* BoringSSL API */
void SSL_set_quic_use_legacy_codepoint(SSL *ssl, int use_legacy);

/*
 * Set an explicit value that you want to use
 * If 0 (default) the server will use the highest extenstion the client sent
 * If 0 (default) the client will send both extensions
 */
void SSL_set_quic_transport_version(SSL *ssl, int version);
__owur int SSL_get_quic_transport_version(const SSL *ssl);
/* Returns the negotiated version, or -1 on error */
__owur int SSL_get_peer_quic_transport_version(const SSL *ssl);

int SSL_CIPHER_get_prf_nid(const SSL_CIPHER *c);

void SSL_set_quic_early_data_enabled(SSL *ssl, int enabled);

#  endif

# ifdef  __cplusplus
}
# endif
#endif
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     /*
 * WARNING: do not edit!
 * Generated by Makefile from include/openssl/ssl.h.in
 *
 * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
 * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
 * Copyright 2005 Nokia. All rights reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */



#ifndef OPENSSL_SSL_H
# define OPENSSL_SSL_H
# pragma once

# include <openssl/macros.h>
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define HEADER_SSL_H
# endif

# include <openssl/e_os2.h>
# include <openssl/opensslconf.h>
# include <openssl/comp.h>
# include <openssl/bio.h>
# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  include <openssl/x509.h>
#  include <openssl/crypto.h>
#  include <openssl/buffer.h>
# endif
# include <openssl/lhash.h>
# include <openssl/pem.h>
# include <openssl/hmac.h>
# include <openssl/async.h>

# include <openssl/safestack.h>
# include <openssl/symhacks.h>
# include <openssl/ct.h>
# include <openssl/sslerr.h>
# include <openssl/prov_ssl.h>

#ifdef  __cplusplus
extern "C" {
#endif

/* OpenSSL version number for ASN.1 encoding of the session information */
/*-
 * Version 0 - initial version
 * Version 1 - added the optional peer certificate
 */
# define SSL_SESSION_ASN1_VERSION 0x0001

# define SSL_MAX_SSL_SESSION_ID_LENGTH           32
# define SSL_MAX_SID_CTX_LENGTH                  32

# define SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES     (512/8)
# define SSL_MAX_KEY_ARG_LENGTH                  8
/* SSL_MAX_MASTER_KEY_LENGTH is defined in prov_ssl.h */

/* The maximum number of encrypt/decrypt pipelines we can support */
# define SSL_MAX_PIPELINES  32

/* text strings for the ciphers */

/* These are used to specify which ciphers to use and not to use */

# define SSL_TXT_LOW             "LOW"
# define SSL_TXT_MEDIUM          "MEDIUM"
# define SSL_TXT_HIGH            "HIGH"
# define SSL_TXT_FIPS            "FIPS"

# define SSL_TXT_aNULL           "aNULL"
# define SSL_TXT_eNULL           "eNULL"
# define SSL_TXT_NULL            "NULL"

# define SSL_TXT_kRSA            "kRSA"
# define SSL_TXT_kDHr            "kDHr"/* this cipher class has been removed */
# define SSL_TXT_kDHd            "kDHd"/* this cipher class has been removed */
# define SSL_TXT_kDH             "kDH"/* this cipher class has been removed */
# define SSL_TXT_kEDH            "kEDH"/* alias for kDHE */
# define SSL_TXT_kDHE            "kDHE"
# define SSL_TXT_kECDHr          "kECDHr"/* this cipher class has been removed */
# define SSL_TXT_kECDHe          "kECDHe"/* this cipher class has been removed */
# define SSL_TXT_kECDH           "kECDH"/* this cipher class has been removed */
# define SSL_TXT_kEECDH          "kEECDH"/* alias for kECDHE */
# define SSL_TXT_kECDHE          "kECDHE"
# define SSL_TXT_kPSK            "kPSK"
# define SSL_TXT_kRSAPSK         "kRSAPSK"
# define SSL_TXT_kECDHEPSK       "kECDHEPSK"
# define SSL_TXT_kDHEPSK         "kDHEPSK"
# define SSL_TXT_kGOST           "kGOST"
# define SSL_TXT_kGOST18         "kGOST18"
# define SSL_TXT_kSRP            "kSRP"

# define SSL_TXT_aRSA            "aRSA"
# define SSL_TXT_aDSS            "aDSS"
# define SSL_TXT_aDH             "aDH"/* this cipher class has been removed */
# define SSL_TXT_aECDH           "aECDH"/* this cipher class has been removed */
# define SSL_TXT_aECDSA          "aECDSA"
# define SSL_TXT_aPSK            "aPSK"
# define SSL_TXT_aGOST94         "aGOST94"
# define SSL_TXT_aGOST01         "aGOST01"
# define SSL_TXT_aGOST12         "aGOST12"
# define SSL_TXT_aGOST           "aGOST"
# define SSL_TXT_aSRP            "aSRP"

# define SSL_TXT_DSS             "DSS"
# define SSL_TXT_DH              "DH"
# define SSL_TXT_DHE             "DHE"/* same as "kDHE:-ADH" */
# define SSL_TXT_EDH             "EDH"/* alias for DHE */
# define SSL_TXT_ADH             "ADH"
# define SSL_TXT_RSA             "RSA"
# define SSL_TXT_ECDH            "ECDH"
# define SSL_TXT_EECDH           "EECDH"/* alias for ECDHE" */
# define SSL_TXT_ECDHE           "ECDHE"/* same as "kECDHE:-AECDH" */
# define SSL_TXT_AECDH           "AECDH"
# define SSL_TXT_ECDSA           "ECDSA"
# define SSL_TXT_PSK             "PSK"
# define SSL_TXT_SRP             "SRP"

# define SSL_TXT_DES             "DES"
# define SSL_TXT_3DES            "3DES"
# define SSL_TXT_RC4             "RC4"
# define SSL_TXT_RC2             "RC2"
# define SSL_TXT_IDEA            "IDEA"
# define SSL_TXT_SEED            "SEED"
# define SSL_TXT_AES128          "AES128"
# define SSL_TXT_AES256          "AES256"
# define SSL_TXT_AES             "AES"
# define SSL_TXT_AES_GCM         "AESGCM"
# define SSL_TXT_AES_CCM         "AESCCM"
# define SSL_TXT_AES_CCM_8       "AESCCM8"
# define SSL_TXT_CAMELLIA128     "CAMELLIA128"
# define SSL_TXT_CAMELLIA256     "CAMELLIA256"
# define SSL_TXT_CAMELLIA        "CAMELLIA"
# define SSL_TXT_CHACHA20        "CHACHA20"
# define SSL_TXT_GOST            "GOST89"
# define SSL_TXT_ARIA            "ARIA"
# define SSL_TXT_ARIA_GCM        "ARIAGCM"
# define SSL_TXT_ARIA128         "ARIA128"
# define SSL_TXT_ARIA256         "ARIA256"
# define SSL_TXT_GOST2012_GOST8912_GOST8912 "GOST2012-GOST8912-GOST8912"
# define SSL_TXT_CBC             "CBC"

# define SSL_TXT_MD5             "MD5"
# define SSL_TXT_SHA1            "SHA1"
# define SSL_TXT_SHA             "SHA"/* same as "SHA1" */
# define SSL_TXT_GOST94          "GOST94"
# define SSL_TXT_GOST89MAC       "GOST89MAC"
# define SSL_TXT_GOST12          "GOST12"
# define SSL_TXT_GOST89MAC12     "GOST89MAC12"
# define SSL_TXT_SHA256          "SHA256"
# define SSL_TXT_SHA384          "SHA384"

# define SSL_TXT_SSLV3           "SSLv3"
# define SSL_TXT_TLSV1           "TLSv1"
# define SSL_TXT_TLSV1_1         "TLSv1.1"
# define SSL_TXT_TLSV1_2         "TLSv1.2"

# define SSL_TXT_ALL             "ALL"

/*-
 * COMPLEMENTOF* definitions. These identifiers are used to (de-select)
 * ciphers normally not being used.
 * Example: "RC4" will activate all ciphers using RC4 including ciphers
 * without authentication, which would normally disabled by DEFAULT (due
 * the "!ADH" being part of default). Therefore "RC4:!COMPLEMENTOFDEFAULT"
 * will make sure that it is also disabled in the specific selection.
 * COMPLEMENTOF* identifiers are portable between version, as adjustments
 * to the default cipher setup will also be included here.
 *
 * COMPLEMENTOFDEFAULT does not experience the same special treatment that
 * DEFAULT gets, as only selection is being done and no sorting as needed
 * for DEFAULT.
 */
# define SSL_TXT_CMPALL          "COMPLEMENTOFALL"
# define SSL_TXT_CMPDEF          "COMPLEMENTOFDEFAULT"

/*
 * The following cipher list is used by default. It also is substituted when
 * an application-defined cipher list string starts with 'DEFAULT'.
 * This applies to ciphersuites for TLSv1.2 and below.
 * DEPRECATED IN 3.0.0, in favor of OSSL_default_cipher_list()
 * Update both macro and function simultaneously
 */
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_DEFAULT_CIPHER_LIST "ALL:!COMPLEMENTOFDEFAULT:!eNULL"
/*
 * This is the default set of TLSv1.3 ciphersuites
 * DEPRECATED IN 3.0.0, in favor of OSSL_default_ciphersuites()
 * Update both macro and function simultaneously
 */
#  define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \
                                   "TLS_CHACHA20_POLY1305_SHA256:" \
                                   "TLS_AES_128_GCM_SHA256"
# endif
/*
 * As of OpenSSL 1.0.0, ssl_create_cipher_list() in ssl/ssl_ciph.c always
 * starts with a reasonable order, and all we have to do for DEFAULT is
 * throwing out anonymous and unencrypted ciphersuites! (The latter are not
 * actually enabled by ALL, but "ALL:RSA" would enable some of them.)
 */

/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */
# define SSL_SENT_SHUTDOWN       1
# define SSL_RECEIVED_SHUTDOWN   2

#ifdef __cplusplus
}
#endif

#ifdef  __cplusplus
extern "C" {
#endif

# define SSL_FILETYPE_ASN1       X509_FILETYPE_ASN1
# define SSL_FILETYPE_PEM        X509_FILETYPE_PEM

/*
 * This is needed to stop compilers complaining about the 'struct ssl_st *'
 * function parameters used to prototype callbacks in SSL_CTX.
 */
typedef struct ssl_st *ssl_crock_st;
typedef struct tls_session_ticket_ext_st TLS_SESSION_TICKET_EXT;
typedef struct ssl_method_st SSL_METHOD;
typedef struct ssl_cipher_st SSL_CIPHER;
typedef struct ssl_session_st SSL_SESSION;
typedef struct tls_sigalgs_st TLS_SIGALGS;
typedef struct ssl_conf_ctx_st SSL_CONF_CTX;
typedef struct ssl_comp_st SSL_COMP;

STACK_OF(SSL_CIPHER);
STACK_OF(SSL_COMP);

/* SRTP protection profiles for use with the use_srtp extension (RFC 5764)*/
typedef struct srtp_protection_profile_st {
    const char *name;
    unsigned long id;
} SRTP_PROTECTION_PROFILE;
SKM_DEFINE_STACK_OF_INTERNAL(SRTP_PROTECTION_PROFILE, SRTP_PROTECTION_PROFILE, SRTP_PROTECTION_PROFILE)
#define sk_SRTP_PROTECTION_PROFILE_num(sk) OPENSSL_sk_num(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk))
#define sk_SRTP_PROTECTION_PROFILE_value(sk, idx) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_value(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk), (idx)))
#define sk_SRTP_PROTECTION_PROFILE_new(cmp) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new(ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp)))
#define sk_SRTP_PROTECTION_PROFILE_new_null() ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new_null())
#define sk_SRTP_PROTECTION_PROFILE_new_reserve(cmp, n) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new_reserve(ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp), (n)))
#define sk_SRTP_PROTECTION_PROFILE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (n))
#define sk_SRTP_PROTECTION_PROFILE_free(sk) OPENSSL_sk_free(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk))
#define sk_SRTP_PROTECTION_PROFILE_zero(sk) OPENSSL_sk_zero(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk))
#define sk_SRTP_PROTECTION_PROFILE_delete(sk, i) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_delete(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (i)))
#define sk_SRTP_PROTECTION_PROFILE_delete_ptr(sk, ptr) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_delete_ptr(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)))
#define sk_SRTP_PROTECTION_PROFILE_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))
#define sk_SRTP_PROTECTION_PROFILE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))
#define sk_SRTP_PROTECTION_PROFILE_pop(sk) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_pop(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk)))
#define sk_SRTP_PROTECTION_PROFILE_shift(sk) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_shift(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk)))
#define sk_SRTP_PROTECTION_PROFILE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk),ossl_check_SRTP_PROTECTION_PROFILE_freefunc_type(freefunc))
#define sk_SRTP_PROTECTION_PROFILE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr), (idx))
#define sk_SRTP_PROTECTION_PROFILE_set(sk, idx, ptr) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_set(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (idx), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)))
#define sk_SRTP_PROTECTION_PROFILE_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))
#define sk_SRTP_PROTECTION_PROFILE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))
#define sk_SRTP_PROTECTION_PROFILE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr), pnum)
#define sk_SRTP_PROTECTION_PROFILE_sort(sk) OPENSSL_sk_sort(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk))
#define sk_SRTP_PROTECTION_PROFILE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk))
#define sk_SRTP_PROTECTION_PROFILE_dup(sk) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_dup(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk)))
#define sk_SRTP_PROTECTION_PROFILE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_deep_copy(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_copyfunc_type(copyfunc), ossl_check_SRTP_PROTECTION_PROFILE_freefunc_type(freefunc)))
#define sk_SRTP_PROTECTION_PROFILE_set_cmp_func(sk, cmp) ((sk_SRTP_PROTECTION_PROFILE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp)))



typedef int (*tls_session_ticket_ext_cb_fn)(SSL *s, const unsigned char *data,
                                            int len, void *arg);
typedef int (*tls_session_secret_cb_fn)(SSL *s, void *secret, int *secret_len,
                                        STACK_OF(SSL_CIPHER) *peer_ciphers,
                                        const SSL_CIPHER **cipher, void *arg);

/* Extension context codes */
/* This extension is only allowed in TLS */
#define SSL_EXT_TLS_ONLY                        0x0001
/* This extension is only allowed in DTLS */
#define SSL_EXT_DTLS_ONLY                       0x0002
/* Some extensions may be allowed in DTLS but we don't implement them for it */
#define SSL_EXT_TLS_IMPLEMENTATION_ONLY         0x0004
/* Most extensions are not defined for SSLv3 but EXT_TYPE_renegotiate is */
#define SSL_EXT_SSL3_ALLOWED                    0x0008
/* Extension is only defined for TLS1.2 and below */
#define SSL_EXT_TLS1_2_AND_BELOW_ONLY           0x0010
/* Extension is only defined for TLS1.3 and above */
#define SSL_EXT_TLS1_3_ONLY                     0x0020
/* Ignore this extension during parsing if we are resuming */
#define SSL_EXT_IGNORE_ON_RESUMPTION            0x0040
#define SSL_EXT_CLIENT_HELLO                    0x0080
/* Really means TLS1.2 or below */
#define SSL_EXT_TLS1_2_SERVER_HELLO             0x0100
#define SSL_EXT_TLS1_3_SERVER_HELLO             0x0200
#define SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS     0x0400
#define SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST      0x0800
#define SSL_EXT_TLS1_3_CERTIFICATE              0x1000
#define SSL_EXT_TLS1_3_NEW_SESSION_TICKET       0x2000
#define SSL_EXT_TLS1_3_CERTIFICATE_REQUEST      0x4000

/* Typedefs for handling custom extensions */

typedef int (*custom_ext_add_cb)(SSL *s, unsigned int ext_type,
                                 const unsigned char **out, size_t *outlen,
                                 int *al, void *add_arg);

typedef void (*custom_ext_free_cb)(SSL *s, unsigned int ext_type,
                                   const unsigned char *out, void *add_arg);

typedef int (*custom_ext_parse_cb)(SSL *s, unsigned int ext_type,
                                   const unsigned char *in, size_t inlen,
                                   int *al, void *parse_arg);


typedef int (*SSL_custom_ext_add_cb_ex)(SSL *s, unsigned int ext_type,
                                        unsigned int context,
                                        const unsigned char **out,
                                        size_t *outlen, X509 *x,
                                        size_t chainidx,
                                        int *al, void *add_arg);

typedef void (*SSL_custom_ext_free_cb_ex)(SSL *s, unsigned int ext_type,
                                          unsigned int context,
                                          const unsigned char *out,
                                          void *add_arg);

typedef int (*SSL_custom_ext_parse_cb_ex)(SSL *s, unsigned int ext_type,
                                          unsigned int context,
                                          const unsigned char *in,
                                          size_t inlen, X509 *x,
                                          size_t chainidx,
                                          int *al, void *parse_arg);

/* Typedef for verification callback */
typedef int (*SSL_verify_cb)(int preverify_ok, X509_STORE_CTX *x509_ctx);

/* Typedef for SSL async callback */
typedef int (*SSL_async_callback_fn)(SSL *s, void *arg);

#define SSL_OP_BIT(n)  ((uint64_t)1 << (uint64_t)n)

/*
 * SSL/TLS connection options.
 */
    /* Disable Extended master secret */
# define SSL_OP_NO_EXTENDED_MASTER_SECRET                SSL_OP_BIT(0)
    /* Cleanse plaintext copies of data delivered to the application */
# define SSL_OP_CLEANSE_PLAINTEXT                        SSL_OP_BIT(1)
    /* Allow initial connection to servers that don't support RI */
# define SSL_OP_LEGACY_SERVER_CONNECT                    SSL_OP_BIT(2)
    /* Enable support for Kernel TLS */
# define SSL_OP_ENABLE_KTLS                              SSL_OP_BIT(3)
# define SSL_OP_TLSEXT_PADDING                           SSL_OP_BIT(4)
# define SSL_OP_SAFARI_ECDHE_ECDSA_BUG                   SSL_OP_BIT(6)
# define SSL_OP_IGNORE_UNEXPECTED_EOF                    SSL_OP_BIT(7)
# define SSL_OP_ALLOW_CLIENT_RENEGOTIATION               SSL_OP_BIT(8)
# define SSL_OP_DISABLE_TLSEXT_CA_NAMES                  SSL_OP_BIT(9)
    /* In TLSv1.3 allow a non-(ec)dhe based kex_mode */
# define SSL_OP_ALLOW_NO_DHE_KEX                         SSL_OP_BIT(10)
    /*
     * Disable SSL 3.0/TLS 1.0 CBC vulnerability workaround that was added
     * in OpenSSL 0.9.6d.  Usually (depending on the application protocol)
     * the workaround is not needed.  Unfortunately some broken SSL/TLS
     * implementations cannot handle it at all, which is why we include it
     * in SSL_OP_ALL. Added in 0.9.6e
     */
# define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS              SSL_OP_BIT(11)
    /* DTLS options */
# define SSL_OP_NO_QUERY_MTU                             SSL_OP_BIT(12)
    /* Turn on Cookie Exchange (on relevant for servers) */
# define SSL_OP_COOKIE_EXCHANGE                          SSL_OP_BIT(13)
    /* Don't use RFC4507 ticket extension */
# define SSL_OP_NO_TICKET                                SSL_OP_BIT(14)
# ifndef OPENSSL_NO_DTLS1_METHOD
    /*
     * Use Cisco's version identifier of DTLS_BAD_VER
     * (only with deprecated DTLSv1_client_method())
     */
#  define SSL_OP_CISCO_ANYCONNECT                        SSL_OP_BIT(15)
# endif
    /* As server, disallow session resumption on renegotiation */
# define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION   SSL_OP_BIT(16)
    /* Don't use compression even if supported */
# define SSL_OP_NO_COMPRESSION                           SSL_OP_BIT(17)
    /* Permit unsafe legacy renegotiation */
# define SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION        SSL_OP_BIT(18)
    /* Disable encrypt-then-mac */
# define SSL_OP_NO_ENCRYPT_THEN_MAC                      SSL_OP_BIT(19)
    /*
     * Enable TLSv1.3 Compatibility mode. This is on by default. A future
     * version of OpenSSL may have this disabled by default.
     */
# define SSL_OP_ENABLE_MIDDLEBOX_COMPAT                  SSL_OP_BIT(20)
    /*
     * Prioritize Chacha20Poly1305 when client does.
     * Modifies SSL_OP_CIPHER_SERVER_PREFERENCE
     */
# define SSL_OP_PRIORITIZE_CHACHA                        SSL_OP_BIT(21)
    /*
     * Set on servers to choose the cipher according to server's preferences.
     */
# define SSL_OP_CIPHER_SERVER_PREFERENCE                 SSL_OP_BIT(22)
    /*
     * If set, a server will allow a client to issue a SSLv3.0 version
     * number as latest version supported in the premaster secret, even when
     * TLSv1.0 (version 3.1) was announced in the client hello. Normally
     * this is forbidden to prevent version rollback attacks.
     */
# define SSL_OP_TLS_ROLLBACK_BUG                         SSL_OP_BIT(23)
    /*
     * Switches off automatic TLSv1.3 anti-replay protection for early data.
     * This is a server-side option only (no effect on the client).
     */
# define SSL_OP_NO_ANTI_REPLAY                           SSL_OP_BIT(24)
# define SSL_OP_NO_SSLv3                                 SSL_OP_BIT(25)
# define SSL_OP_NO_TLSv1                                 SSL_OP_BIT(26)
# define SSL_OP_NO_TLSv1_2                               SSL_OP_BIT(27)
# define SSL_OP_NO_TLSv1_1                               SSL_OP_BIT(28)
# define SSL_OP_NO_TLSv1_3                               SSL_OP_BIT(29)
# define SSL_OP_NO_DTLSv1                                SSL_OP_BIT(26)
# define SSL_OP_NO_DTLSv1_2                              SSL_OP_BIT(27)
    /* Disallow all renegotiation */
# define SSL_OP_NO_RENEGOTIATION                         SSL_OP_BIT(30)
    /*
     * Make server add server-hello extension from early version of
     * cryptopro draft, when GOST ciphersuite is negotiated. Required for
     * interoperability with CryptoPro CSP 3.x
     */
# define SSL_OP_CRYPTOPRO_TLSEXT_BUG                     SSL_OP_BIT(31)

/*
 * Option "collections."
 */
# define SSL_OP_NO_SSL_MASK \
        ( SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 \
          | SSL_OP_NO_TLSv1_2 | SSL_OP_NO_TLSv1_3 )
# define SSL_OP_NO_DTLS_MASK \
        ( SSL_OP_NO_DTLSv1 | SSL_OP_NO_DTLSv1_2 )

/* Various bug workarounds that should be rather harmless. */
# define SSL_OP_ALL \
        ( SSL_OP_CRYPTOPRO_TLSEXT_BUG | SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS \
          | SSL_OP_TLSEXT_PADDING | SSL_OP_SAFARI_ECDHE_ECDSA_BUG )

/*
 * OBSOLETE OPTIONS retained for compatibility
 */

# define SSL_OP_MICROSOFT_SESS_ID_BUG                    0x0
# define SSL_OP_NETSCAPE_CHALLENGE_BUG                   0x0
# define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG         0x0
# define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG              0x0
# define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER               0x0
# define SSL_OP_MSIE_SSLV2_RSA_PADDING                   0x0
# define SSL_OP_SSLEAY_080_CLIENT_DH_BUG                 0x0
# define SSL_OP_TLS_D5_BUG                               0x0
# define SSL_OP_TLS_BLOCK_PADDING_BUG                    0x0
# define SSL_OP_SINGLE_ECDH_USE                          0x0
# define SSL_OP_SINGLE_DH_USE                            0x0
# define SSL_OP_EPHEMERAL_RSA                            0x0
# define SSL_OP_NO_SSLv2                                 0x0
# define SSL_OP_PKCS1_CHECK_1                            0x0
# define SSL_OP_PKCS1_CHECK_2                            0x0
# define SSL_OP_NETSCAPE_CA_DN_BUG                       0x0
# define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG          0x0

/*
 * Allow SSL_write(..., n) to return r with 0 < r < n (i.e. report success
 * when just a single record has been written):
 */
# define SSL_MODE_ENABLE_PARTIAL_WRITE       0x00000001U
/*
 * Make it possible to retry SSL_write() with changed buffer location (buffer
 * contents must stay the same!); this is not the default to avoid the
 * misconception that non-blocking SSL_write() behaves like non-blocking
 * write():
 */
# define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 0x00000002U
/*
 * Never bother the application with retries if the transport is blocking:
 */
# define SSL_MODE_AUTO_RETRY 0x00000004U
/* Don't attempt to automatically build certificate chain */
# define SSL_MODE_NO_AUTO_CHAIN 0x00000008U
/*
 * Save RAM by releasing read and write buffers when they're empty. (SSL3 and
 * TLS only.) Released buffers are freed.
 */
# define SSL_MODE_RELEASE_BUFFERS 0x00000010U
/*
 * Send the current time in the Random fields of the ClientHello and
 * ServerHello records for compatibility with hypothetical implementations
 * that require it.
 */
# define SSL_MODE_SEND_CLIENTHELLO_TIME 0x00000020U
# define SSL_MODE_SEND_SERVERHELLO_TIME 0x00000040U
/*
 * Send TLS_FALLBACK_SCSV in the ClientHello. To be set only by applications
 * that reconnect with a downgraded protocol version; see
 * draft-ietf-tls-downgrade-scsv-00 for details. DO NOT ENABLE THIS if your
 * application attempts a normal handshake. Only use this in explicit
 * fallback retries, following the guidance in
 * draft-ietf-tls-downgrade-scsv-00.
 */
# define SSL_MODE_SEND_FALLBACK_SCSV 0x00000080U
/*
 * Support Asynchronous operation
 */
# define SSL_MODE_ASYNC 0x00000100U

/*
 * When using DTLS/SCTP, include the terminating zero in the label
 * used for computing the endpoint-pair shared secret. Required for
 * interoperability with implementations having this bug like these
 * older version of OpenSSL:
 * - OpenSSL 1.0.0 series
 * - OpenSSL 1.0.1 series
 * - OpenSSL 1.0.2 series
 * - OpenSSL 1.1.0 series
 * - OpenSSL 1.1.1 and 1.1.1a
 */
# define SSL_MODE_DTLS_SCTP_LABEL_LENGTH_BUG 0x00000400U

/* Cert related flags */
/*
 * Many implementations ignore some aspects of the TLS standards such as
 * enforcing certificate chain algorithms. When this is set we enforce them.
 */
# define SSL_CERT_FLAG_TLS_STRICT                0x00000001U

/* Suite B modes, takes same values as certificate verify flags */
# define SSL_CERT_FLAG_SUITEB_128_LOS_ONLY       0x10000
/* Suite B 192 bit only mode */
# define SSL_CERT_FLAG_SUITEB_192_LOS            0x20000
/* Suite B 128 bit mode allowing 192 bit algorithms */
# define SSL_CERT_FLAG_SUITEB_128_LOS            0x30000

/* Perform all sorts of protocol violations for testing purposes */
# define SSL_CERT_FLAG_BROKEN_PROTOCOL           0x10000000

/* Flags for building certificate chains */
/* Treat any existing certificates as untrusted CAs */
# define SSL_BUILD_CHAIN_FLAG_UNTRUSTED          0x1
/* Don't include root CA in chain */
# define SSL_BUILD_CHAIN_FLAG_NO_ROOT            0x2
/* Just check certificates already there */
# define SSL_BUILD_CHAIN_FLAG_CHECK              0x4
/* Ignore verification errors */
# define SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR       0x8
/* Clear verification errors from queue */
# define SSL_BUILD_CHAIN_FLAG_CLEAR_ERROR        0x10

/* Flags returned by SSL_check_chain */
/* Certificate can be used with this session */
# define CERT_PKEY_VALID         0x1
/* Certificate can also be used for signing */
# define CERT_PKEY_SIGN          0x2
/* EE certificate signing algorithm OK */
# define CERT_PKEY_EE_SIGNATURE  0x10
/* CA signature algorithms OK */
# define CERT_PKEY_CA_SIGNATURE  0x20
/* EE certificate parameters OK */
# define CERT_PKEY_EE_PARAM      0x40
/* CA certificate parameters OK */
# define CERT_PKEY_CA_PARAM      0x80
/* Signing explicitly allowed as opposed to SHA1 fallback */
# define CERT_PKEY_EXPLICIT_SIGN 0x100
/* Client CA issuer names match (always set for server cert) */
# define CERT_PKEY_ISSUER_NAME   0x200
/* Cert type matches client types (always set for server cert) */
# define CERT_PKEY_CERT_TYPE     0x400
/* Cert chain suitable to Suite B */
# define CERT_PKEY_SUITEB        0x800

# define SSL_CONF_FLAG_CMDLINE           0x1
# define SSL_CONF_FLAG_FILE              0x2
# define SSL_CONF_FLAG_CLIENT            0x4
# define SSL_CONF_FLAG_SERVER            0x8
# define SSL_CONF_FLAG_SHOW_ERRORS       0x10
# define SSL_CONF_FLAG_CERTIFICATE       0x20
# define SSL_CONF_FLAG_REQUIRE_PRIVATE   0x40
/* Configuration value types */
# define SSL_CONF_TYPE_UNKNOWN           0x0
# define SSL_CONF_TYPE_STRING            0x1
# define SSL_CONF_TYPE_FILE              0x2
# define SSL_CONF_TYPE_DIR               0x3
# define SSL_CONF_TYPE_NONE              0x4
# define SSL_CONF_TYPE_STORE             0x5

/* Maximum length of the application-controlled segment of a a TLSv1.3 cookie */
# define SSL_COOKIE_LENGTH                       4096

/*
 * Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value, they
 * cannot be used to clear bits.
 */

uint64_t SSL_CTX_get_options(const SSL_CTX *ctx);
uint64_t SSL_get_options(const SSL *s);
uint64_t SSL_CTX_clear_options(SSL_CTX *ctx, uint64_t op);
uint64_t SSL_clear_options(SSL *s, uint64_t op);
uint64_t SSL_CTX_set_options(SSL_CTX *ctx, uint64_t op);
uint64_t SSL_set_options(SSL *s, uint64_t op);

# define SSL_CTX_set_mode(ctx,op) \
        SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL)
# define SSL_CTX_clear_mode(ctx,op) \
        SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_MODE,(op),NULL)
# define SSL_CTX_get_mode(ctx) \
        SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,0,NULL)
# define SSL_clear_mode(ssl,op) \
        SSL_ctrl((ssl),SSL_CTRL_CLEAR_MODE,(op),NULL)
# define SSL_set_mode(ssl,op) \
        SSL_ctrl((ssl),SSL_CTRL_MODE,(op),NULL)
# define SSL_get_mode(ssl) \
        SSL_ctrl((ssl),SSL_CTRL_MODE,0,NULL)
# define SSL_set_mtu(ssl, mtu) \
        SSL_ctrl((ssl),SSL_CTRL_SET_MTU,(mtu),NULL)
# define DTLS_set_link_mtu(ssl, mtu) \
        SSL_ctrl((ssl),DTLS_CTRL_SET_LINK_MTU,(mtu),NULL)
# define DTLS_get_link_min_mtu(ssl) \
        SSL_ctrl((ssl),DTLS_CTRL_GET_LINK_MIN_MTU,0,NULL)

# define SSL_get_secure_renegotiation_support(ssl) \
        SSL_ctrl((ssl), SSL_CTRL_GET_RI_SUPPORT, 0, NULL)

# define SSL_CTX_set_cert_flags(ctx,op) \
        SSL_CTX_ctrl((ctx),SSL_CTRL_CERT_FLAGS,(op),NULL)
# define SSL_set_cert_flags(s,op) \
        SSL_ctrl((s),SSL_CTRL_CERT_FLAGS,(op),NULL)
# define SSL_CTX_clear_cert_flags(ctx,op) \
        SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL)
# define SSL_clear_cert_flags(s,op) \
        SSL_ctrl((s),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL)

void SSL_CTX_set_msg_callback(SSL_CTX *ctx,
                              void (*cb) (int write_p, int version,
                                          int content_type, const void *buf,
                                          size_t len, SSL *ssl, void *arg));
void SSL_set_msg_callback(SSL *ssl,
                          void (*cb) (int write_p, int version,
                                      int content_type, const void *buf,
                                      size_t len, SSL *ssl, void *arg));
# define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))
# define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))

# define SSL_get_extms_support(s) \
        SSL_ctrl((s),SSL_CTRL_GET_EXTMS_SUPPORT,0,NULL)

# ifndef OPENSSL_NO_SRP
/* see tls_srp.c */
#  ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0 __owur int SSL_SRP_CTX_init(SSL *s);
OSSL_DEPRECATEDIN_3_0 __owur int SSL_CTX_SRP_CTX_init(SSL_CTX *ctx);
OSSL_DEPRECATEDIN_3_0 int SSL_SRP_CTX_free(SSL *ctx);
OSSL_DEPRECATEDIN_3_0 int SSL_CTX_SRP_CTX_free(SSL_CTX *ctx);
OSSL_DEPRECATEDIN_3_0 __owur int SSL_srp_server_param_with_username(SSL *s,
                                                                    int *ad);
OSSL_DEPRECATEDIN_3_0 __owur int SRP_Calc_A_param(SSL *s);
#  endif
# endif

/* 100k max cert list */
# define SSL_MAX_CERT_LIST_DEFAULT (1024*100)

# define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT      (1024*20)

/*
 * This callback type is used inside SSL_CTX, SSL, and in the functions that
 * set them. It is used to override the generation of SSL/TLS session IDs in
 * a server. Return value should be zero on an error, non-zero to proceed.
 * Also, callbacks should themselves check if the id they generate is unique
 * otherwise the SSL handshake will fail with an error - callbacks can do
 * this using the 'ssl' value they're passed by;
 * SSL_has_matching_session_id(ssl, id, *id_len) The length value passed in
 * is set at the maximum size the session ID can be. In SSLv3/TLSv1 it is 32
 * bytes. The callback can alter this length to be less if desired. It is
 * also an error for the callback to set the size to zero.
 */
typedef int (*GEN_SESSION_CB) (SSL *ssl, unsigned char *id,
                               unsigned int *id_len);

# define SSL_SESS_CACHE_OFF                      0x0000
# define SSL_SESS_CACHE_CLIENT                   0x0001
# define SSL_SESS_CACHE_SERVER                   0x0002
# define SSL_SESS_CACHE_BOTH     (SSL_SESS_CACHE_CLIENT|SSL_SESS_CACHE_SERVER)
# define SSL_SESS_CACHE_NO_AUTO_CLEAR            0x0080
/* enough comments already ... see SSL_CTX_set_session_cache_mode(3) */
# define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP       0x0100
# define SSL_SESS_CACHE_NO_INTERNAL_STORE        0x0200
# define SSL_SESS_CACHE_NO_INTERNAL \
        (SSL_SESS_CACHE_NO_INTERNAL_LOOKUP|SSL_SESS_CACHE_NO_INTERNAL_STORE)
# define SSL_SESS_CACHE_UPDATE_TIME              0x0400

LHASH_OF(SSL_SESSION) *SSL_CTX_sessions(SSL_CTX *ctx);
# define SSL_CTX_sess_number(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_NUMBER,0,NULL)
# define SSL_CTX_sess_connect(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT,0,NULL)
# define SSL_CTX_sess_connect_good(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_GOOD,0,NULL)
# define SSL_CTX_sess_connect_renegotiate(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_RENEGOTIATE,0,NULL)
# define SSL_CTX_sess_accept(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT,0,NULL)
# define SSL_CTX_sess_accept_renegotiate(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_RENEGOTIATE,0,NULL)
# define SSL_CTX_sess_accept_good(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_GOOD,0,NULL)
# define SSL_CTX_sess_hits(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_HIT,0,NULL)
# define SSL_CTX_sess_cb_hits(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CB_HIT,0,NULL)
# define SSL_CTX_sess_misses(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_MISSES,0,NULL)
# define SSL_CTX_sess_timeouts(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_TIMEOUTS,0,NULL)
# define SSL_CTX_sess_cache_full(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CACHE_FULL,0,NULL)

void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx,
                             int (*new_session_cb) (struct ssl_st *ssl,
                                                    SSL_SESSION *sess));
int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx)) (struct ssl_st *ssl,
                                              SSL_SESSION *sess);
void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx,
                                void (*remove_session_cb) (struct ssl_ctx_st
                                                           *ctx,
                                                           SSL_SESSION *sess));
void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx)) (struct ssl_ctx_st *ctx,
                                                  SSL_SESSION *sess);
void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx,
                             SSL_SESSION *(*get_session_cb) (struct ssl_st
                                                             *ssl,
                                                             const unsigned char
                                                             *data, int len,
                                                             int *copy));
SSL_SESSION *(*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx)) (struct ssl_st *ssl,
                                                       const unsigned char *data,
                                                       int len, int *copy);
void SSL_CTX_set_info_callback(SSL_CTX *ctx,
                               void (*cb) (const SSL *ssl, int type, int val));
void (*SSL_CTX_get_info_callback(SSL_CTX *ctx)) (const SSL *ssl, int type,
                                                 int val);
void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx,
                                int (*client_cert_cb) (SSL *ssl, X509 **x509,
                                                       EVP_PKEY **pkey));
int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx)) (SSL *ssl, X509 **x509,
                                                 EVP_PKEY **pkey);
# ifndef OPENSSL_NO_ENGINE
__owur int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e);
# endif
void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx,
                                    int (*app_gen_cookie_cb) (SSL *ssl,
                                                              unsigned char
                                                              *cookie,
                                                              unsigned int
                                                              *cookie_len));
void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx,
                                  int (*app_verify_cookie_cb) (SSL *ssl,
                                                               const unsigned
                                                               char *cookie,
                                                               unsigned int
                                                               cookie_len));

void SSL_CTX_set_stateless_cookie_generate_cb(
    SSL_CTX *ctx,
    int (*gen_stateless_cookie_cb) (SSL *ssl,
                                    unsigned char *cookie,
                                    size_t *cookie_len));
void SSL_CTX_set_stateless_cookie_verify_cb(
    SSL_CTX *ctx,
    int (*verify_stateless_cookie_cb) (SSL *ssl,
                                       const unsigned char *cookie,
                                       size_t cookie_len));
# ifndef OPENSSL_NO_NEXTPROTONEG

typedef int (*SSL_CTX_npn_advertised_cb_func)(SSL *ssl,
                                              const unsigned char **out,
                                              unsigned int *outlen,
                                              void *arg);
void SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *s,
                                           SSL_CTX_npn_advertised_cb_func cb,
                                           void *arg);
#  define SSL_CTX_set_npn_advertised_cb SSL_CTX_set_next_protos_advertised_cb

typedef int (*SSL_CTX_npn_select_cb_func)(SSL *s,
                                          unsigned char **out,
                                          unsigned char *outlen,
                                          const unsigned char *in,
                                          unsigned int inlen,
                                          void *arg);
void SSL_CTX_set_next_proto_select_cb(SSL_CTX *s,
                                      SSL_CTX_npn_select_cb_func cb,
                                      void *arg);
#  define SSL_CTX_set_npn_select_cb SSL_CTX_set_next_proto_select_cb

void SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data,
                                    unsigned *len);
#  define SSL_get0_npn_negotiated SSL_get0_next_proto_negotiated
# endif

__owur int SSL_select_next_proto(unsigned char **out, unsigned char *outlen,
                                 const unsigned char *in, unsigned int inlen,
                                 const unsigned char *client,
                                 unsigned int client_len);

# define OPENSSL_NPN_UNSUPPORTED 0
# define OPENSSL_NPN_NEGOTIATED  1
# define OPENSSL_NPN_NO_OVERLAP  2

__owur int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos,
                                   unsigned int protos_len);
__owur int SSL_set_alpn_protos(SSL *ssl, const unsigned char *protos,
                               unsigned int protos_len);
typedef int (*SSL_CTX_alpn_select_cb_func)(SSL *ssl,
                                           const unsigned char **out,
                                           unsigned char *outlen,
                                           const unsigned char *in,
                                           unsigned int inlen,
                                           void *arg);
void SSL_CTX_set_alpn_select_cb(SSL_CTX *ctx,
                                SSL_CTX_alpn_select_cb_func cb,
                                void *arg);
void SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data,
                            unsigned int *len);

# ifndef OPENSSL_NO_PSK
/*
 * the maximum length of the buffer given to callbacks containing the
 * resulting identity/psk
 */
#  define PSK_MAX_IDENTITY_LEN 256
#  define PSK_MAX_PSK_LEN 512
typedef unsigned int (*SSL_psk_client_cb_func)(SSL *ssl,
                                               const char *hint,
                                               char *identity,
                                               unsigned int max_identity_len,
                                               unsigned char *psk,
                                               unsigned int max_psk_len);
void SSL_CTX_set_psk_client_callback(SSL_CTX *ctx, SSL_psk_client_cb_func cb);
void SSL_set_psk_client_callback(SSL *ssl, SSL_psk_client_cb_func cb);

typedef unsigned int (*SSL_psk_server_cb_func)(SSL *ssl,
                                               const char *identity,
                                               unsigned char *psk,
                                               unsigned int max_psk_len);
void SSL_CTX_set_psk_server_callback(SSL_CTX *ctx, SSL_psk_server_cb_func cb);
void SSL_set_psk_server_callback(SSL *ssl, SSL_psk_server_cb_func cb);

__owur int SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint);
__owur int SSL_use_psk_identity_hint(SSL *s, const char *identity_hint);
const char *SSL_get_psk_identity_hint(const SSL *s);
const char *SSL_get_psk_identity(const SSL *s);
# endif

typedef int (*SSL_psk_find_session_cb_func)(SSL *ssl,
                                            const unsigned char *identity,
                                            size_t identity_len,
                                            SSL_SESSION **sess);
typedef int (*SSL_psk_use_session_cb_func)(SSL *ssl, const EVP_MD *md,
                                           const unsigned char **id,
                                           size_t *idlen,
                                           SSL_SESSION **sess);

void SSL_set_psk_find_session_callback(SSL *s, SSL_psk_find_session_cb_func cb);
void SSL_CTX_set_psk_find_session_callback(SSL_CTX *ctx,
                                           SSL_psk_find_session_cb_func cb);
void SSL_set_psk_use_session_callback(SSL *s, SSL_psk_use_session_cb_func cb);
void SSL_CTX_set_psk_use_session_callback(SSL_CTX *ctx,
                                          SSL_psk_use_session_cb_func cb);

/* Register callbacks to handle custom TLS Extensions for client or server. */

__owur int SSL_CTX_has_client_custom_ext(const SSL_CTX *ctx,
                                         unsigned int ext_type);

__owur int SSL_CTX_add_client_custom_ext(SSL_CTX *ctx,
                                         unsigned int ext_type,
                                         custom_ext_add_cb add_cb,
                                         custom_ext_free_cb free_cb,
                                         void *add_arg,
                                         custom_ext_parse_cb parse_cb,
                                         void *parse_arg);

__owur int SSL_CTX_add_server_custom_ext(SSL_CTX *ctx,
                                         unsigned int ext_type,
                                         custom_ext_add_cb add_cb,
                                         custom_ext_free_cb free_cb,
                                         void *add_arg,
                                         custom_ext_parse_cb parse_cb,
                                         void *parse_arg);

__owur int SSL_CTX_add_custom_ext(SSL_CTX *ctx, unsigned int ext_type,
                                  unsigned int context,
                                  SSL_custom_ext_add_cb_ex add_cb,
                                  SSL_custom_ext_free_cb_ex free_cb,
                                  void *add_arg,
                                  SSL_custom_ext_parse_cb_ex parse_cb,
                                  void *parse_arg);

__owur int SSL_extension_supported(unsigned int ext_type);

# define SSL_NOTHING            1
# define SSL_WRITING            2
# define SSL_READING            3
# define SSL_X509_LOOKUP        4
# define SSL_ASYNC_PAUSED       5
# define SSL_ASYNC_NO_JOBS      6
# define SSL_CLIENT_HELLO_CB    7
# define SSL_RETRY_VERIFY       8

/* These will only be used when doing non-blocking IO */
# define SSL_want_nothing(s)         (SSL_want(s) == SSL_NOTHING)
# define SSL_want_read(s)            (SSL_want(s) == SSL_READING)
# define SSL_want_write(s)           (SSL_want(s) == SSL_WRITING)
# define SSL_want_x509_lookup(s)     (SSL_want(s) == SSL_X509_LOOKUP)
# define SSL_want_retry_verify(s)    (SSL_want(s) == SSL_RETRY_VERIFY)
# define SSL_want_async(s)           (SSL_want(s) == SSL_ASYNC_PAUSED)
# define SSL_want_async_job(s)       (SSL_want(s) == SSL_ASYNC_NO_JOBS)
# define SSL_want_client_hello_cb(s) (SSL_want(s) == SSL_CLIENT_HELLO_CB)

# define SSL_MAC_FLAG_READ_MAC_STREAM 1
# define SSL_MAC_FLAG_WRITE_MAC_STREAM 2
# define SSL_MAC_FLAG_READ_MAC_TLSTREE 4
# define SSL_MAC_FLAG_WRITE_MAC_TLSTREE 8

/*
 * A callback for logging out TLS key material. This callback should log out
 * |line| followed by a newline.
 */
typedef void (*SSL_CTX_keylog_cb_func)(const SSL *ssl, const char *line);

/*
 * SSL_CTX_set_keylog_callback configures a callback to log key material. This
 * is intended for debugging use with tools like Wireshark. The cb function
 * should log line followed by a newline.
 */
void SSL_CTX_set_keylog_callback(SSL_CTX *ctx, SSL_CTX_keylog_cb_func cb);

/*
 * SSL_CTX_get_keylog_callback returns the callback configured by
 * SSL_CTX_set_keylog_callback.
 */
SSL_CTX_keylog_cb_func SSL_CTX_get_keylog_callback(const SSL_CTX *ctx);

int SSL_CTX_set_max_early_data(SSL_CTX *ctx, uint32_t max_early_data);
uint32_t SSL_CTX_get_max_early_data(const SSL_CTX *ctx);
int SSL_set_max_early_data(SSL *s, uint32_t max_early_data);
uint32_t SSL_get_max_early_data(const SSL *s);
int SSL_CTX_set_recv_max_early_data(SSL_CTX *ctx, uint32_t recv_max_early_data);
uint32_t SSL_CTX_get_recv_max_early_data(const SSL_CTX *ctx);
int SSL_set_recv_max_early_data(SSL *s, uint32_t recv_max_early_data);
uint32_t SSL_get_recv_max_early_data(const SSL *s);

#ifdef __cplusplus
}
#endif

# include <openssl/ssl2.h>
# include <openssl/ssl3.h>
# include <openssl/tls1.h>      /* This is mostly sslv3 with a few tweaks */
# include <openssl/dtls1.h>     /* Datagram TLS */
# include <openssl/srtp.h>      /* Support for the use_srtp extension */

#ifdef  __cplusplus
extern "C" {
#endif

/*
 * These need to be after the above set of includes due to a compiler bug
 * in VisualStudio 2015
 */
SKM_DEFINE_STACK_OF_INTERNAL(SSL_CIPHER, const SSL_CIPHER, SSL_CIPHER)
#define sk_SSL_CIPHER_num(sk) OPENSSL_sk_num(ossl_check_const_SSL_CIPHER_sk_type(sk))
#define sk_SSL_CIPHER_value(sk, idx) ((const SSL_CIPHER *)OPENSSL_sk_value(ossl_check_const_SSL_CIPHER_sk_type(sk), (idx)))
#define sk_SSL_CIPHER_new(cmp) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new(ossl_check_SSL_CIPHER_compfunc_type(cmp)))
#define sk_SSL_CIPHER_new_null() ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new_null())
#define sk_SSL_CIPHER_new_reserve(cmp, n) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new_reserve(ossl_check_SSL_CIPHER_compfunc_type(cmp), (n)))
#define sk_SSL_CIPHER_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SSL_CIPHER_sk_type(sk), (n))
#define sk_SSL_CIPHER_free(sk) OPENSSL_sk_free(ossl_check_SSL_CIPHER_sk_type(sk))
#define sk_SSL_CIPHER_zero(sk) OPENSSL_sk_zero(ossl_check_SSL_CIPHER_sk_type(sk))
#define sk_SSL_CIPHER_delete(sk, i) ((const SSL_CIPHER *)OPENSSL_sk_delete(ossl_check_SSL_CIPHER_sk_type(sk), (i)))
#define sk_SSL_CIPHER_delete_ptr(sk, ptr) ((const SSL_CIPHER *)OPENSSL_sk_delete_ptr(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr)))
#define sk_SSL_CIPHER_push(sk, ptr) OPENSSL_sk_push(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr))
#define sk_SSL_CIPHER_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr))
#define sk_SSL_CIPHER_pop(sk) ((const SSL_CIPHER *)OPENSSL_sk_pop(ossl_check_SSL_CIPHER_sk_type(sk)))
#define sk_SSL_CIPHER_shift(sk) ((const SSL_CIPHER *)OPENSSL_sk_shift(ossl_check_SSL_CIPHER_sk_type(sk)))
#define sk_SSL_CIPHER_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SSL_CIPHER_sk_type(sk),ossl_check_SSL_CIPHER_freefunc_type(freefunc))
#define sk_SSL_CIPHER_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr), (idx))
#define sk_SSL_CIPHER_set(sk, idx, ptr) ((const SSL_CIPHER *)OPENSSL_sk_set(ossl_check_SSL_CIPHER_sk_type(sk), (idx), ossl_check_SSL_CIPHER_type(ptr)))
#define sk_SSL_CIPHER_find(sk, ptr) OPENSSL_sk_find(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr))
#define sk_SSL_CIPHER_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr))
#define sk_SSL_CIPHER_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr), pnum)
#define sk_SSL_CIPHER_sort(sk) OPENSSL_sk_sort(ossl_check_SSL_CIPHER_sk_type(sk))
#define sk_SSL_CIPHER_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SSL_CIPHER_sk_type(sk))
#define sk_SSL_CIPHER_dup(sk) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_dup(ossl_check_const_SSL_CIPHER_sk_type(sk)))
#define sk_SSL_CIPHER_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_deep_copy(ossl_check_const_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_copyfunc_type(copyfunc), ossl_check_SSL_CIPHER_freefunc_type(freefunc)))
#define sk_SSL_CIPHER_set_cmp_func(sk, cmp) ((sk_SSL_CIPHER_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_compfunc_type(cmp)))
SKM_DEFINE_STACK_OF_INTERNAL(SSL_COMP, SSL_COMP, SSL_COMP)
#define sk_SSL_COMP_num(sk) OPENSSL_sk_num(ossl_check_const_SSL_COMP_sk_type(sk))
#define sk_SSL_COMP_value(sk, idx) ((SSL_COMP *)OPENSSL_sk_value(ossl_check_const_SSL_COMP_sk_type(sk), (idx)))
#define sk_SSL_COMP_new(cmp) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new(ossl_check_SSL_COMP_compfunc_type(cmp)))
#define sk_SSL_COMP_new_null() ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new_null())
#define sk_SSL_COMP_new_reserve(cmp, n) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new_reserve(ossl_check_SSL_COMP_compfunc_type(cmp), (n)))
#define sk_SSL_COMP_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SSL_COMP_sk_type(sk), (n))
#define sk_SSL_COMP_free(sk) OPENSSL_sk_free(ossl_check_SSL_COMP_sk_type(sk))
#define sk_SSL_COMP_zero(sk) OPENSSL_sk_zero(ossl_check_SSL_COMP_sk_type(sk))
#define sk_SSL_COMP_delete(sk, i) ((SSL_COMP *)OPENSSL_sk_delete(ossl_check_SSL_COMP_sk_type(sk), (i)))
#define sk_SSL_COMP_delete_ptr(sk, ptr) ((SSL_COMP *)OPENSSL_sk_delete_ptr(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr)))
#define sk_SSL_COMP_push(sk, ptr) OPENSSL_sk_push(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr))
#define sk_SSL_COMP_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr))
#define sk_SSL_COMP_pop(sk) ((SSL_COMP *)OPENSSL_sk_pop(ossl_check_SSL_COMP_sk_type(sk)))
#define sk_SSL_COMP_shift(sk) ((SSL_COMP *)OPENSSL_sk_shift(ossl_check_SSL_COMP_sk_type(sk)))
#define sk_SSL_COMP_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SSL_COMP_sk_type(sk),ossl_check_SSL_COMP_freefunc_type(freefunc))
#define sk_SSL_COMP_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr), (idx))
#define sk_SSL_COMP_set(sk, idx, ptr) ((SSL_COMP *)OPENSSL_sk_set(ossl_check_SSL_COMP_sk_type(sk), (idx), ossl_check_SSL_COMP_type(ptr)))
#define sk_SSL_COMP_find(sk, ptr) OPENSSL_sk_find(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr))
#define sk_SSL_COMP_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr))
#define sk_SSL_COMP_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr), pnum)
#define sk_SSL_COMP_sort(sk) OPENSSL_sk_sort(ossl_check_SSL_COMP_sk_type(sk))
#define sk_SSL_COMP_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SSL_COMP_sk_type(sk))
#define sk_SSL_COMP_dup(sk) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_dup(ossl_check_const_SSL_COMP_sk_type(sk)))
#define sk_SSL_COMP_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_deep_copy(ossl_check_const_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_copyfunc_type(copyfunc), ossl_check_SSL_COMP_freefunc_type(freefunc)))
#define sk_SSL_COMP_set_cmp_func(sk, cmp) ((sk_SSL_COMP_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_compfunc_type(cmp)))


/* compatibility */
# define SSL_set_app_data(s,arg)         (SSL_set_ex_data(s,0,(char *)(arg)))
# define SSL_get_app_data(s)             (SSL_get_ex_data(s,0))
# define SSL_SESSION_set_app_data(s,a)   (SSL_SESSION_set_ex_data(s,0, \
                                                                  (char *)(a)))
# define SSL_SESSION_get_app_data(s)     (SSL_SESSION_get_ex_data(s,0))
# define SSL_CTX_get_app_data(ctx)       (SSL_CTX_get_ex_data(ctx,0))
# define SSL_CTX_set_app_data(ctx,arg)   (SSL_CTX_set_ex_data(ctx,0, \
                                                              (char *)(arg)))
# ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 void SSL_set_debug(SSL *s, int debug);
# endif

/* TLSv1.3 KeyUpdate message types */
/* -1 used so that this is an invalid value for the on-the-wire protocol */
#define SSL_KEY_UPDATE_NONE             -1
/* Values as defined for the on-the-wire protocol */
#define SSL_KEY_UPDATE_NOT_REQUESTED     0
#define SSL_KEY_UPDATE_REQUESTED         1

/*
 * The valid handshake states (one for each type message sent and one for each
 * type of message received). There are also two "special" states:
 * TLS = TLS or DTLS state
 * DTLS = DTLS specific state
 * CR/SR = Client Read/Server Read
 * CW/SW = Client Write/Server Write
 *
 * The "special" states are:
 * TLS_ST_BEFORE = No handshake has been initiated yet
 * TLS_ST_OK = A handshake has been successfully completed
 */
typedef enum {
    TLS_ST_BEFORE,
    TLS_ST_OK,
    DTLS_ST_CR_HELLO_VERIFY_REQUEST,
    TLS_ST_CR_SRVR_HELLO,
    TLS_ST_CR_CERT,
    TLS_ST_CR_CERT_STATUS,
    TLS_ST_CR_KEY_EXCH,
    TLS_ST_CR_CERT_REQ,
    TLS_ST_CR_SRVR_DONE,
    TLS_ST_CR_SESSION_TICKET,
    TLS_ST_CR_CHANGE,
    TLS_ST_CR_FINISHED,
    TLS_ST_CW_CLNT_HELLO,
    TLS_ST_CW_CERT,
    TLS_ST_CW_KEY_EXCH,
    TLS_ST_CW_CERT_VRFY,
    TLS_ST_CW_CHANGE,
    TLS_ST_CW_NEXT_PROTO,
    TLS_ST_CW_FINISHED,
    TLS_ST_SW_HELLO_REQ,
    TLS_ST_SR_CLNT_HELLO,
    DTLS_ST_SW_HELLO_VERIFY_REQUEST,
    TLS_ST_SW_SRVR_HELLO,
    TLS_ST_SW_CERT,
    TLS_ST_SW_KEY_EXCH,
    TLS_ST_SW_CERT_REQ,
    TLS_ST_SW_SRVR_DONE,
    TLS_ST_SR_CERT,
    TLS_ST_SR_KEY_EXCH,
    TLS_ST_SR_CERT_VRFY,
    TLS_ST_SR_NEXT_PROTO,
    TLS_ST_SR_CHANGE,
    TLS_ST_SR_FINISHED,
    TLS_ST_SW_SESSION_TICKET,
    TLS_ST_SW_CERT_STATUS,
    TLS_ST_SW_CHANGE,
    TLS_ST_SW_FINISHED,
    TLS_ST_SW_ENCRYPTED_EXTENSIONS,
    TLS_ST_CR_ENCRYPTED_EXTENSIONS,
    TLS_ST_CR_CERT_VRFY,
    TLS_ST_SW_CERT_VRFY,
    TLS_ST_CR_HELLO_REQ,
    TLS_ST_SW_KEY_UPDATE,
    TLS_ST_CW_KEY_UPDATE,
    TLS_ST_SR_KEY_UPDATE,
    TLS_ST_CR_KEY_UPDATE,
    TLS_ST_EARLY_DATA,
    TLS_ST_PENDING_EARLY_DATA_END,
    TLS_ST_CW_END_OF_EARLY_DATA,
    TLS_ST_SR_END_OF_EARLY_DATA
} OSSL_HANDSHAKE_STATE;

/*
 * Most of the following state values are no longer used and are defined to be
 * the closest equivalent value in the current state machine code. Not all
 * defines have an equivalent and are set to a dummy value (-1). SSL_ST_CONNECT
 * and SSL_ST_ACCEPT are still in use in the definition of SSL_CB_ACCEPT_LOOP,
 * SSL_CB_ACCEPT_EXIT, SSL_CB_CONNECT_LOOP and SSL_CB_CONNECT_EXIT.
 */

# define SSL_ST_CONNECT                  0x1000
# define SSL_ST_ACCEPT                   0x2000

# define SSL_ST_MASK                     0x0FFF

# define SSL_CB_LOOP                     0x01
# define SSL_CB_EXIT                     0x02
# define SSL_CB_READ                     0x04
# define SSL_CB_WRITE                    0x08
# define SSL_CB_ALERT                    0x4000/* used in callback */
# define SSL_CB_READ_ALERT               (SSL_CB_ALERT|SSL_CB_READ)
# define SSL_CB_WRITE_ALERT              (SSL_CB_ALERT|SSL_CB_WRITE)
# define SSL_CB_ACCEPT_LOOP              (SSL_ST_ACCEPT|SSL_CB_LOOP)
# define SSL_CB_ACCEPT_EXIT              (SSL_ST_ACCEPT|SSL_CB_EXIT)
# define SSL_CB_CONNECT_LOOP             (SSL_ST_CONNECT|SSL_CB_LOOP)
# define SSL_CB_CONNECT_EXIT             (SSL_ST_CONNECT|SSL_CB_EXIT)
# define SSL_CB_HANDSHAKE_START          0x10
# define SSL_CB_HANDSHAKE_DONE           0x20

/* Is the SSL_connection established? */
# define SSL_in_connect_init(a)          (SSL_in_init(a) && !SSL_is_server(a))
# define SSL_in_accept_init(a)           (SSL_in_init(a) && SSL_is_server(a))
int SSL_in_init(const SSL *s);
int SSL_in_before(const SSL *s);
int SSL_is_init_finished(const SSL *s);

/*
 * The following 3 states are kept in ssl->rlayer.rstate when reads fail, you
 * should not need these
 */
# define SSL_ST_READ_HEADER                      0xF0
# define SSL_ST_READ_BODY                        0xF1
# define SSL_ST_READ_DONE                        0xF2

/*-
 * Obtain latest Finished message
 *   -- that we sent (SSL_get_finished)
 *   -- that we expected from peer (SSL_get_peer_finished).
 * Returns length (0 == no Finished so far), copies up to 'count' bytes.
 */
size_t SSL_get_finished(const SSL *s, void *buf, size_t count);
size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count);

/*
 * use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 3 options are
 * 'ored' with SSL_VERIFY_PEER if they are desired
 */
# define SSL_VERIFY_NONE                 0x00
# define SSL_VERIFY_PEER                 0x01
# define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02
# define SSL_VERIFY_CLIENT_ONCE          0x04
# define SSL_VERIFY_POST_HANDSHAKE       0x08

# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  define OpenSSL_add_ssl_algorithms()   SSL_library_init()
#  define SSLeay_add_ssl_algorithms()    SSL_library_init()
# endif

/* More backward compatibility */
# define SSL_get_cipher(s) \
                SSL_CIPHER_get_name(SSL_get_current_cipher(s))
# define SSL_get_cipher_bits(s,np) \
                SSL_CIPHER_get_bits(SSL_get_current_cipher(s),np)
# define SSL_get_cipher_version(s) \
                SSL_CIPHER_get_version(SSL_get_current_cipher(s))
# define SSL_get_cipher_name(s) \
                SSL_CIPHER_get_name(SSL_get_current_cipher(s))
# define SSL_get_time(a)         SSL_SESSION_get_time(a)
# define SSL_set_time(a,b)       SSL_SESSION_set_time((a),(b))
# define SSL_get_timeout(a)      SSL_SESSION_get_timeout(a)
# define SSL_set_timeout(a,b)    SSL_SESSION_set_timeout((a),(b))

# define d2i_SSL_SESSION_bio(bp,s_id) ASN1_d2i_bio_of(SSL_SESSION,SSL_SESSION_new,d2i_SSL_SESSION,bp,s_id)
# define i2d_SSL_SESSION_bio(bp,s_id) ASN1_i2d_bio_of(SSL_SESSION,i2d_SSL_SESSION,bp,s_id)

DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION)
# define SSL_AD_REASON_OFFSET            1000/* offset to get SSL_R_... value
                                              * from SSL_AD_... */
/* These alert types are for SSLv3 and TLSv1 */
# define SSL_AD_CLOSE_NOTIFY             SSL3_AD_CLOSE_NOTIFY
/* fatal */
# define SSL_AD_UNEXPECTED_MESSAGE       SSL3_AD_UNEXPECTED_MESSAGE
/* fatal */
# define SSL_AD_BAD_RECORD_MAC           SSL3_AD_BAD_RECORD_MAC
# define SSL_AD_DECRYPTION_FAILED        TLS1_AD_DECRYPTION_FAILED
# define SSL_AD_RECORD_OVERFLOW          TLS1_AD_RECORD_OVERFLOW
/* fatal */
# define SSL_AD_DECOMPRESSION_FAILURE    SSL3_AD_DECOMPRESSION_FAILURE
/* fatal */
# define SSL_AD_HANDSHAKE_FAILURE        SSL3_AD_HANDSHAKE_FAILURE
/* Not for TLS */
# define SSL_AD_NO_CERTIFICATE           SSL3_AD_NO_CERTIFICATE
# define SSL_AD_BAD_CERTIFICATE          SSL3_AD_BAD_CERTIFICATE
# define SSL_AD_UNSUPPORTED_CERTIFICATE  SSL3_AD_UNSUPPORTED_CERTIFICATE
# define SSL_AD_CERTIFICATE_REVOKED      SSL3_AD_CERTIFICATE_REVOKED
# define SSL_AD_CERTIFICATE_EXPIRED      SSL3_AD_CERTIFICATE_EXPIRED
# define SSL_AD_CERTIFICATE_UNKNOWN      SSL3_AD_CERTIFICATE_UNKNOWN
/* fatal */
# define SSL_AD_ILLEGAL_PARAMETER        SSL3_AD_ILLEGAL_PARAMETER
/* fatal */
# define SSL_AD_UNKNOWN_CA               TLS1_AD_UNKNOWN_CA
/* fatal */
# define SSL_AD_ACCESS_DENIED            TLS1_AD_ACCESS_DENIED
/* fatal */
# define SSL_AD_DECODE_ERROR             TLS1_AD_DECODE_ERROR
# define SSL_AD_DECRYPT_ERROR            TLS1_AD_DECRYPT_ERROR
/* fatal */
# define SSL_AD_EXPORT_RESTRICTION       TLS1_AD_EXPORT_RESTRICTION
/* fatal */
# define SSL_AD_PROTOCOL_VERSION         TLS1_AD_PROTOCOL_VERSION
/* fatal */
# define SSL_AD_INSUFFICIENT_SECURITY    TLS1_AD_INSUFFICIENT_SECURITY
/* fatal */
# define SSL_AD_INTERNAL_ERROR           TLS1_AD_INTERNAL_ERROR
# define SSL_AD_USER_CANCELLED           TLS1_AD_USER_CANCELLED
# define SSL_AD_NO_RENEGOTIATION         TLS1_AD_NO_RENEGOTIATION
# define SSL_AD_MISSING_EXTENSION        TLS13_AD_MISSING_EXTENSION
# define SSL_AD_CERTIFICATE_REQUIRED     TLS13_AD_CERTIFICATE_REQUIRED
# define SSL_AD_UNSUPPORTED_EXTENSION    TLS1_AD_UNSUPPORTED_EXTENSION
# define SSL_AD_CERTIFICATE_UNOBTAINABLE TLS1_AD_CERTIFICATE_UNOBTAINABLE
# define SSL_AD_UNRECOGNIZED_NAME        TLS1_AD_UNRECOGNIZED_NAME
# define SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE
# define SSL_AD_BAD_CERTIFICATE_HASH_VALUE TLS1_AD_BAD_CERTIFICATE_HASH_VALUE
/* fatal */
# define SSL_AD_UNKNOWN_PSK_IDENTITY     TLS1_AD_UNKNOWN_PSK_IDENTITY
/* fatal */
# define SSL_AD_INAPPROPRIATE_FALLBACK   TLS1_AD_INAPPROPRIATE_FALLBACK
# define SSL_AD_NO_APPLICATION_PROTOCOL  TLS1_AD_NO_APPLICATION_PROTOCOL
# define SSL_ERROR_NONE                  0
# define SSL_ERROR_SSL                   1
# define SSL_ERROR_WANT_READ             2
# define SSL_ERROR_WANT_WRITE            3
# define SSL_ERROR_WANT_X509_LOOKUP      4
# define SSL_ERROR_SYSCALL               5/* look at error stack/return
                                           * value/errno */
# define SSL_ERROR_ZERO_RETURN           6
# define SSL_ERROR_WANT_CONNECT          7
# define SSL_ERROR_WANT_ACCEPT           8
# define SSL_ERROR_WANT_ASYNC            9
# define SSL_ERROR_WANT_ASYNC_JOB       10
# define SSL_ERROR_WANT_CLIENT_HELLO_CB 11
# define SSL_ERROR_WANT_RETRY_VERIFY    12

# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_CTRL_SET_TMP_DH                    3
#  define SSL_CTRL_SET_TMP_ECDH                  4
#  define SSL_CTRL_SET_TMP_DH_CB                 6
# endif

# define SSL_CTRL_GET_CLIENT_CERT_REQUEST        9
# define SSL_CTRL_GET_NUM_RENEGOTIATIONS         10
# define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS       11
# define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS       12
# define SSL_CTRL_GET_FLAGS                      13
# define SSL_CTRL_EXTRA_CHAIN_CERT               14
# define SSL_CTRL_SET_MSG_CALLBACK               15
# define SSL_CTRL_SET_MSG_CALLBACK_ARG           16
/* only applies to datagram connections */
# define SSL_CTRL_SET_MTU                17
/* Stats */
# define SSL_CTRL_SESS_NUMBER                    20
# define SSL_CTRL_SESS_CONNECT                   21
# define SSL_CTRL_SESS_CONNECT_GOOD              22
# define SSL_CTRL_SESS_CONNECT_RENEGOTIATE       23
# define SSL_CTRL_SESS_ACCEPT                    24
# define SSL_CTRL_SESS_ACCEPT_GOOD               25
# define SSL_CTRL_SESS_ACCEPT_RENEGOTIATE        26
# define SSL_CTRL_SESS_HIT                       27
# define SSL_CTRL_SESS_CB_HIT                    28
# define SSL_CTRL_SESS_MISSES                    29
# define SSL_CTRL_SESS_TIMEOUTS                  30
# define SSL_CTRL_SESS_CACHE_FULL                31
# define SSL_CTRL_MODE                           33
# define SSL_CTRL_GET_READ_AHEAD                 40
# define SSL_CTRL_SET_READ_AHEAD                 41
# define SSL_CTRL_SET_SESS_CACHE_SIZE            42
# define SSL_CTRL_GET_SESS_CACHE_SIZE            43
# define SSL_CTRL_SET_SESS_CACHE_MODE            44
# define SSL_CTRL_GET_SESS_CACHE_MODE            45
# define SSL_CTRL_GET_MAX_CERT_LIST              50
# define SSL_CTRL_SET_MAX_CERT_LIST              51
# define SSL_CTRL_SET_MAX_SEND_FRAGMENT          52
/* see tls1.h for macros based on these */
# define SSL_CTRL_SET_TLSEXT_SERVERNAME_CB       53
# define SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG      54
# define SSL_CTRL_SET_TLSEXT_HOSTNAME            55
# define SSL_CTRL_SET_TLSEXT_DEBUG_CB            56
# define SSL_CTRL_SET_TLSEXT_DEBUG_ARG           57
# define SSL_CTRL_GET_TLSEXT_TICKET_KEYS         58
# define SSL_CTRL_SET_TLSEXT_TICKET_KEYS         59
/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT    60 */
/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB 61 */
/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB_ARG 62 */
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB       63
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG   64
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE     65
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS     66
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS     67
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS      68
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS      69
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP        70
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP        71
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB      72
# endif
# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB    75
# define SSL_CTRL_SET_SRP_VERIFY_PARAM_CB                76
# define SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB             77
# define SSL_CTRL_SET_SRP_ARG            78
# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME               79
# define SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH               80
# define SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD               81
# define DTLS_CTRL_GET_TIMEOUT           73
# define DTLS_CTRL_HANDLE_TIMEOUT        74
# define SSL_CTRL_GET_RI_SUPPORT                 76
# define SSL_CTRL_CLEAR_MODE                     78
# define SSL_CTRL_SET_NOT_RESUMABLE_SESS_CB      79
# define SSL_CTRL_GET_EXTRA_CHAIN_CERTS          82
# define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS        83
# define SSL_CTRL_CHAIN                          88
# define SSL_CTRL_CHAIN_CERT                     89
# define SSL_CTRL_GET_GROUPS                     90
# define SSL_CTRL_SET_GROUPS                     91
# define SSL_CTRL_SET_GROUPS_LIST                92
# define SSL_CTRL_GET_SHARED_GROUP               93
# define SSL_CTRL_SET_SIGALGS                    97
# define SSL_CTRL_SET_SIGALGS_LIST               98
# define SSL_CTRL_CERT_FLAGS                     99
# define SSL_CTRL_CLEAR_CERT_FLAGS               100
# define SSL_CTRL_SET_CLIENT_SIGALGS             101
# define SSL_CTRL_SET_CLIENT_SIGALGS_LIST        102
# define SSL_CTRL_GET_CLIENT_CERT_TYPES          103
# define SSL_CTRL_SET_CLIENT_CERT_TYPES          104
# define SSL_CTRL_BUILD_CERT_CHAIN               105
# define SSL_CTRL_SET_VERIFY_CERT_STORE          106
# define SSL_CTRL_SET_CHAIN_CERT_STORE           107
# define SSL_CTRL_GET_PEER_SIGNATURE_NID         108
# define SSL_CTRL_GET_PEER_TMP_KEY               109
# define SSL_CTRL_GET_RAW_CIPHERLIST             110
# define SSL_CTRL_GET_EC_POINT_FORMATS           111
# define SSL_CTRL_GET_CHAIN_CERTS                115
# define SSL_CTRL_SELECT_CURRENT_CERT            116
# define SSL_CTRL_SET_CURRENT_CERT               117
# define SSL_CTRL_SET_DH_AUTO                    118
# define DTLS_CTRL_SET_LINK_MTU                  120
# define DTLS_CTRL_GET_LINK_MIN_MTU              121
# define SSL_CTRL_GET_EXTMS_SUPPORT              122
# define SSL_CTRL_SET_MIN_PROTO_VERSION          123
# define SSL_CTRL_SET_MAX_PROTO_VERSION          124
# define SSL_CTRL_SET_SPLIT_SEND_FRAGMENT        125
# define SSL_CTRL_SET_MAX_PIPELINES              126
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_TYPE     127
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB       128
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG   129
# define SSL_CTRL_GET_MIN_PROTO_VERSION          130
# define SSL_CTRL_GET_MAX_PROTO_VERSION          131
# define SSL_CTRL_GET_SIGNATURE_NID              132
# define SSL_CTRL_GET_TMP_KEY                    133
# define SSL_CTRL_GET_NEGOTIATED_GROUP           134
# define SSL_CTRL_SET_RETRY_VERIFY               136
# define SSL_CTRL_GET_VERIFY_CERT_STORE          137
# define SSL_CTRL_GET_CHAIN_CERT_STORE           138
# define SSL_CERT_SET_FIRST                      1
# define SSL_CERT_SET_NEXT                       2
# define SSL_CERT_SET_SERVER                     3
# define DTLSv1_get_timeout(ssl, arg) \
        SSL_ctrl(ssl,DTLS_CTRL_GET_TIMEOUT,0, (void *)(arg))
# define DTLSv1_handle_timeout(ssl) \
        SSL_ctrl(ssl,DTLS_CTRL_HANDLE_TIMEOUT,0, NULL)
# define SSL_num_renegotiations(ssl) \
        SSL_ctrl((ssl),SSL_CTRL_GET_NUM_RENEGOTIATIONS,0,NULL)
# define SSL_clear_num_renegotiations(ssl) \
        SSL_ctrl((ssl),SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS,0,NULL)
# define SSL_total_renegotiations(ssl) \
        SSL_ctrl((ssl),SSL_CTRL_GET_TOTAL_RENEGOTIATIONS,0,NULL)
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_CTX_set_tmp_dh(ctx,dh) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,(char *)(dh))
# endif
# define SSL_CTX_set_dh_auto(ctx, onoff) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_DH_AUTO,onoff,NULL)
# define SSL_set_dh_auto(s, onoff) \
        SSL_ctrl(s,SSL_CTRL_SET_DH_AUTO,onoff,NULL)
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_set_tmp_dh(ssl,dh) \
        SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH,0,(char *)(dh))
# endif
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_CTX_set_tmp_ecdh(ctx,ecdh) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH,0,(char *)(ecdh))
#  define SSL_set_tmp_ecdh(ssl,ecdh) \
        SSL_ctrl(ssl,SSL_CTRL_SET_TMP_ECDH,0,(char *)(ecdh))
# endif
# define SSL_CTX_add_extra_chain_cert(ctx,x509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)(x509))
# define SSL_CTX_get_extra_chain_certs(ctx,px509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,0,px509)
# define SSL_CTX_get_extra_chain_certs_only(ctx,px509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,1,px509)
# define SSL_CTX_clear_extra_chain_certs(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS,0,NULL)
# define SSL_CTX_set0_chain(ctx,sk) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,0,(char *)(sk))
# define SSL_CTX_set1_chain(ctx,sk) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,1,(char *)(sk))
# define SSL_CTX_add0_chain_cert(ctx,x509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,0,(char *)(x509))
# define SSL_CTX_add1_chain_cert(ctx,x509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,1,(char *)(x509))
# define SSL_CTX_get0_chain_certs(ctx,px509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERTS,0,px509)
# define SSL_CTX_clear_chain_certs(ctx) \
        SSL_CTX_set0_chain(ctx,NULL)
# define SSL_CTX_build_cert_chain(ctx, flags) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL)
# define SSL_CTX_select_current_cert(ctx,x509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)(x509))
# define SSL_CTX_set_current_cert(ctx, op) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURRENT_CERT, op, NULL)
# define SSL_CTX_set0_verify_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)(st))
# define SSL_CTX_set1_verify_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)(st))
# define SSL_CTX_get0_verify_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_VERIFY_CERT_STORE,0,(char *)(st))
# define SSL_CTX_set0_chain_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)(st))
# define SSL_CTX_set1_chain_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)(st))
# define SSL_CTX_get0_chain_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERT_STORE,0,(char *)(st))
# define SSL_set0_chain(s,sk) \
        SSL_ctrl(s,SSL_CTRL_CHAIN,0,(char *)(sk))
# define SSL_set1_chain(s,sk) \
        SSL_ctrl(s,SSL_CTRL_CHAIN,1,(char *)(sk))
# define SSL_add0_chain_cert(s,x509) \
        SSL_ctrl(s,SSL_CTRL_CHAIN_CERT,0,(char *)(x509))
# define SSL_add1_chain_cert(s,x509) \
        SSL_ctrl(s,SSL_CTRL_CHAIN_CERT,1,(char *)(x509))
# define SSL_get0_chain_certs(s,px509) \
        SSL_ctrl(s,SSL_CTRL_GET_CHAIN_CERTS,0,px509)
# define SSL_clear_chain_certs(s) \
        SSL_set0_chain(s,NULL)
# define SSL_build_cert_chain(s, flags) \
        SSL_ctrl(s,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL)
# define SSL_select_current_cert(s,x509) \
        SSL_ctrl(s,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)(x509))
# define SSL_set_current_cert(s,op) \
        SSL_ctrl(s,SSL_CTRL_SET_CURRENT_CERT, op, NULL)
# define SSL_set0_verify_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)(st))
# define SSL_set1_verify_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)(st))
#define SSL_get0_verify_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_GET_VERIFY_CERT_STORE,0,(char *)(st))
# define SSL_set0_chain_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)(st))
# define SSL_set1_chain_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)(st))
#define SSL_get0_chain_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_GET_CHAIN_CERT_STORE,0,(char *)(st))

# define SSL_get1_groups(s, glist) \
        SSL_ctrl(s,SSL_CTRL_GET_GROUPS,0,(int*)(glist))
# define SSL_CTX_set1_groups(ctx, glist, glistlen) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_GROUPS,glistlen,(int *)(glist))
# define SSL_CTX_set1_groups_list(ctx, s) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_GROUPS_LIST,0,(char *)(s))
# define SSL_set1_groups(s, glist, glistlen) \
        SSL_ctrl(s,SSL_CTRL_SET_GROUPS,glistlen,(char *)(glist))
# define SSL_set1_groups_list(s, str) \
        SSL_ctrl(s,SSL_CTRL_SET_GROUPS_LIST,0,(char *)(str))
# define SSL_get_shared_group(s, n) \
        SSL_ctrl(s,SSL_CTRL_GET_SHARED_GROUP,n,NULL)
# define SSL_get_negotiated_group(s) \
        SSL_ctrl(s,SSL_CTRL_GET_NEGOTIATED_GROUP,0,NULL)
# define SSL_CTX_set1_sigalgs(ctx, slist, slistlen) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS,slistlen,(int *)(slist))
# define SSL_CTX_set1_sigalgs_list(ctx, s) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)(s))
# define SSL_set1_sigalgs(s, slist, slistlen) \
        SSL_ctrl(s,SSL_CTRL_SET_SIGALGS,slistlen,(int *)(slist))
# define SSL_set1_sigalgs_list(s, str) \
        SSL_ctrl(s,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)(str))
# define SSL_CTX_set1_client_sigalgs(ctx, slist, slistlen) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS,slistlen,(int *)(slist))
# define SSL_CTX_set1_client_sigalgs_list(ctx, s) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)(s))
# define SSL_set1_client_sigalgs(s, slist, slistlen) \
        SSL_ctrl(s,SSL_CTRL_SET_CLIENT_SIGALGS,slistlen,(int *)(slist))
# define SSL_set1_client_sigalgs_list(s, str) \
        SSL_ctrl(s,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)(str))
# define SSL_get0_certificate_types(s, clist) \
        SSL_ctrl(s, SSL_CTRL_GET_CLIENT_CERT_TYPES, 0, (char *)(clist))
# define SSL_CTX_set1_client_certificate_types(ctx, clist, clistlen) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen, \
                     (char *)(clist))
# define SSL_set1_client_certificate_types(s, clist, clistlen) \
        SSL_ctrl(s,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen,(char *)(clist))
# define SSL_get_signature_nid(s, pn) \
        SSL_ctrl(s,SSL_CTRL_GET_SIGNATURE_NID,0,pn)
# define SSL_get_peer_signature_nid(s, pn) \
        SSL_ctrl(s,SSL_CTRL_GET_PEER_SIGNATURE_NID,0,pn)
# define SSL_get_peer_tmp_key(s, pk) \
        SSL_ctrl(s,SSL_CTRL_GET_PEER_TMP_KEY,0,pk)
# define SSL_get_tmp_key(s, pk) \
        SSL_ctrl(s,SSL_CTRL_GET_TMP_KEY,0,pk)
# define SSL_get0_raw_cipherlist(s, plst) \
        SSL_ctrl(s,SSL_CTRL_GET_RAW_CIPHERLIST,0,plst)
# define SSL_get0_ec_point_formats(s, plst) \
        SSL_ctrl(s,SSL_CTRL_GET_EC_POINT_FORMATS,0,plst)
# define SSL_CTX_set_min_proto_version(ctx, version) \
        SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL)
# define SSL_CTX_set_max_proto_version(ctx, version) \
        SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL)
# define SSL_CTX_get_min_proto_version(ctx) \
        SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL)
# define SSL_CTX_get_max_proto_version(ctx) \
        SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL)
# define SSL_set_min_proto_version(s, version) \
        SSL_ctrl(s, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL)
# define SSL_set_max_proto_version(s, version) \
        SSL_ctrl(s, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL)
# define SSL_get_min_proto_version(s) \
        SSL_ctrl(s, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL)
# define SSL_get_max_proto_version(s) \
        SSL_ctrl(s, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL)

const char *SSL_group_to_name(SSL *s, int id);

/* Backwards compatibility, original 1.1.0 names */
# define SSL_CTRL_GET_SERVER_TMP_KEY \
         SSL_CTRL_GET_PEER_TMP_KEY
# define SSL_get_server_tmp_key(s, pk) \
         SSL_get_peer_tmp_key(s, pk)

int SSL_set0_tmp_dh_pkey(SSL *s, EVP_PKEY *dhpkey);
int SSL_CTX_set0_tmp_dh_pkey(SSL_CTX *ctx, EVP_PKEY *dhpkey);

/*
 * The following symbol names are old and obsolete. They are kept
 * for compatibility reasons only and should not be used anymore.
 */
# define SSL_CTRL_GET_CURVES           SSL_CTRL_GET_GROUPS
# define SSL_CTRL_SET_CURVES           SSL_CTRL_SET_GROUPS
# define SSL_CTRL_SET_CURVES_LIST      SSL_CTRL_SET_GROUPS_LIST
# define SSL_CTRL_GET_SHARED_CURVE     SSL_CTRL_GET_SHARED_GROUP

# define SSL_get1_curves               SSL_get1_groups
# define SSL_CTX_set1_curves           SSL_CTX_set1_groups
# define SSL_CTX_set1_curves_list      SSL_CTX_set1_groups_list
# define SSL_set1_curves               SSL_set1_groups
# define SSL_set1_curves_list          SSL_set1_groups_list
# define SSL_get_shared_curve          SSL_get_shared_group


# ifndef OPENSSL_NO_DEPRECATED_1_1_0
/* Provide some compatibility macros for removed functionality. */
#  define SSL_CTX_need_tmp_RSA(ctx)                0
#  define SSL_CTX_set_tmp_rsa(ctx,rsa)             1
#  define SSL_need_tmp_RSA(ssl)                    0
#  define SSL_set_tmp_rsa(ssl,rsa)                 1
#  define SSL_CTX_set_ecdh_auto(dummy, onoff)      ((onoff) != 0)
#  define SSL_set_ecdh_auto(dummy, onoff)          ((onoff) != 0)
/*
 * We "pretend" to call the callback to avoid warnings about unused static
 * functions.
 */
#  define SSL_CTX_set_tmp_rsa_callback(ctx, cb)    while(0) (cb)(NULL, 0, 0)
#  define SSL_set_tmp_rsa_callback(ssl, cb)        while(0) (cb)(NULL, 0, 0)
# endif
__owur const BIO_METHOD *BIO_f_ssl(void);
__owur BIO *BIO_new_ssl(SSL_CTX *ctx, int client);
__owur BIO *BIO_new_ssl_connect(SSL_CTX *ctx);
__owur BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx);
__owur int BIO_ssl_copy_session_id(BIO *to, BIO *from);
void BIO_ssl_shutdown(BIO *ssl_bio);

__owur int SSL_CTX_set_cipher_list(SSL_CTX *, const char *str);
__owur SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth);
__owur SSL_CTX *SSL_CTX_new_ex(OSSL_LIB_CTX *libctx, const char *propq,
                               const SSL_METHOD *meth);
int SSL_CTX_up_ref(SSL_CTX *ctx);
void SSL_CTX_free(SSL_CTX *);
__owur long SSL_CTX_set_timeout(SSL_CTX *ctx, long t);
__owur long SSL_CTX_get_timeout(const SSL_CTX *ctx);
__owur X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *);
void SSL_CTX_set_cert_store(SSL_CTX *, X509_STORE *);
void SSL_CTX_set1_cert_store(SSL_CTX *, X509_STORE *);
__owur int SSL_want(const SSL *s);
__owur int SSL_clear(SSL *s);

void SSL_CTX_flush_sessions(SSL_CTX *ctx, long tm);

__owur const SSL_CIPHER *SSL_get_current_cipher(const SSL *s);
__owur const SSL_CIPHER *SSL_get_pending_cipher(const SSL *s);
__owur int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits);
__owur const char *SSL_CIPHER_get_version(const SSL_CIPHER *c);
__owur const char *SSL_CIPHER_get_name(const SSL_CIPHER *c);
__owur const char *SSL_CIPHER_standard_name(const SSL_CIPHER *c);
__owur const char *OPENSSL_cipher_name(const char *rfc_name);
__owur uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *c);
__owur uint16_t SSL_CIPHER_get_protocol_id(const SSL_CIPHER *c);
__owur int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *c);
__owur int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *c);
__owur const EVP_MD *SSL_CIPHER_get_handshake_digest(const SSL_CIPHER *c);
__owur int SSL_CIPHER_is_aead(const SSL_CIPHER *c);

__owur int SSL_get_fd(const SSL *s);
__owur int SSL_get_rfd(const SSL *s);
__owur int SSL_get_wfd(const SSL *s);
__owur const char *SSL_get_cipher_list(const SSL *s, int n);
__owur char *SSL_get_shared_ciphers(const SSL *s, char *buf, int size);
__owur int SSL_get_read_ahead(const SSL *s);
__owur int SSL_pending(const SSL *s);
__owur int SSL_has_pending(const SSL *s);
# ifndef OPENSSL_NO_SOCK
__owur int SSL_set_fd(SSL *s, int fd);
__owur int SSL_set_rfd(SSL *s, int fd);
__owur int SSL_set_wfd(SSL *s, int fd);
# endif
void SSL_set0_rbio(SSL *s, BIO *rbio);
void SSL_set0_wbio(SSL *s, BIO *wbio);
void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio);
__owur BIO *SSL_get_rbio(const SSL *s);
__owur BIO *SSL_get_wbio(const SSL *s);
__owur int SSL_set_cipher_list(SSL *s, const char *str);
__owur int SSL_CTX_set_ciphersuites(SSL_CTX *ctx, const char *str);
__owur int SSL_set_ciphersuites(SSL *s, const char *str);
void SSL_set_read_ahead(SSL *s, int yes);
__owur int SSL_get_verify_mode(const SSL *s);
__owur int SSL_get_verify_depth(const SSL *s);
__owur SSL_verify_cb SSL_get_verify_callback(const SSL *s);
void SSL_set_verify(SSL *s, int mode, SSL_verify_cb callback);
void SSL_set_verify_depth(SSL *s, int depth);
void SSL_set_cert_cb(SSL *s, int (*cb) (SSL *ssl, void *arg), void *arg);
# ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0 __owur int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa);
OSSL_DEPRECATEDIN_3_0
__owur int SSL_use_RSAPrivateKey_ASN1(SSL *ssl,
                                      const unsigned char *d, long len);
# endif
__owur int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey);
__owur int SSL_use_PrivateKey_ASN1(int pk, SSL *ssl, const unsigned char *d,
                                   long len);
__owur int SSL_use_certificate(SSL *ssl, X509 *x);
__owur int SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len);
__owur int SSL_use_cert_and_key(SSL *ssl, X509 *x509, EVP_PKEY *privatekey,
                                STACK_OF(X509) *chain, int override);


/* serverinfo file format versions */
# define SSL_SERVERINFOV1   1
# define SSL_SERVERINFOV2   2

/* Set serverinfo data for the current active cert. */
__owur int SSL_CTX_use_serverinfo(SSL_CTX *ctx, const unsigned char *serverinfo,
                                  size_t serverinfo_length);
__owur int SSL_CTX_use_serverinfo_ex(SSL_CTX *ctx, unsigned int version,
                                     const unsigned char *serverinfo,
                                     size_t serverinfo_length);
__owur int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file);

#ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0
__owur int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type);
#endif

__owur int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type);
__owur int SSL_use_certificate_file(SSL *ssl, const char *file, int type);

#ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0
__owur int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file,
                                          int type);
#endif
__owur int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file,
                                       int type);
__owur int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file,
                                        int type);
/* PEM type */
__owur int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file);
__owur int SSL_use_certificate_chain_file(SSL *ssl, const char *file);
__owur STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file);
__owur STACK_OF(X509_NAME)
*SSL_load_client_CA_file_ex(const char *file, OSSL_LIB_CTX *libctx,
                            const char *propq);
__owur int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs,
                                               const char *file);
int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs,
                                       const char *dir);
int SSL_add_store_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs,
                                       const char *uri);

# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  define SSL_load_error_strings() \
    OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS \
                     | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL)
# endif

__owur const char *SSL_state_string(const SSL *s);
__owur const char *SSL_rstate_string(const SSL *s);
__owur const char *SSL_state_string_long(const SSL *s);
__owur const char *SSL_rstate_string_long(const SSL *s);
__owur long SSL_SESSION_get_time(const SSL_SESSION *s);
__owur long SSL_SESSION_set_time(SSL_SESSION *s, long t);
__owur long SSL_SESSION_get_timeout(const SSL_SESSION *s);
__owur long SSL_SESSION_set_timeout(SSL_SESSION *s, long t);
__owur int SSL_SESSION_get_protocol_version(const SSL_SESSION *s);
__owur int SSL_SESSION_set_protocol_version(SSL_SESSION *s, int version);

__owur const char *SSL_SESSION_get0_hostname(const SSL_SESSION *s);
__owur int SSL_SESSION_set1_hostname(SSL_SESSION *s, const char *hostname);
void SSL_SESSION_get0_alpn_selected(const SSL_SESSION *s,
                                    const unsigned char **alpn,
                                    size_t *len);
__owur int SSL_SESSION_set1_alpn_selected(SSL_SESSION *s,
                                          const unsigned char *alpn,
                                          size_t len);
__owur const SSL_CIPHER *SSL_SESSION_get0_cipher(const SSL_SESSION *s);
__owur int SSL_SESSION_set_cipher(SSL_SESSION *s, const SSL_CIPHER *cipher);
__owur int SSL_SESSION_has_ticket(const SSL_SESSION *s);
__owur unsigned long SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *s);
void SSL_SESSION_get0_ticket(const SSL_SESSION *s, const unsigned char **tick,
                             size_t *len);
__owur uint32_t SSL_SESSION_get_max_early_data(const SSL_SESSION *s);
__owur int SSL_SESSION_set_max_early_data(SSL_SESSION *s,
                                          uint32_t max_early_data);
__owur int SSL_copy_session_id(SSL *to, const SSL *from);
__owur X509 *SSL_SESSION_get0_peer(SSL_SESSION *s);
__owur int SSL_SESSION_set1_id_context(SSL_SESSION *s,
                                       const unsigned char *sid_ctx,
                                       unsigned int sid_ctx_len);
__owur int SSL_SESSION_set1_id(SSL_SESSION *s, const unsigned char *sid,
                               unsigned int sid_len);
__owur int SSL_SESSION_is_resumable(const SSL_SESSION *s);

__owur SSL_SESSION *SSL_SESSION_new(void);
__owur SSL_SESSION *SSL_SESSION_dup(const SSL_SESSION *src);
const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s,
                                        unsigned int *len);
const unsigned char *SSL_SESSION_get0_id_context(const SSL_SESSION *s,
                                                 unsigned int *len);
__owur unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s);
# ifndef OPENSSL_NO_STDIO
int SSL_SESSION_print_fp(FILE *fp, const SSL_SESSION *ses);
# endif
int SSL_SESSION_print(BIO *fp, const SSL_SESSION *ses);
int SSL_SESSION_print_keylog(BIO *bp, const SSL_SESSION *x);
int SSL_SESSION_up_ref(SSL_SESSION *ses);
void SSL_SESSION_free(SSL_SESSION *ses);
__owur int i2d_SSL_SESSION(const SSL_SESSION *in, unsigned char **pp);
__owur int SSL_set_session(SSL *to, SSL_SESSION *session);
int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *session);
int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *session);
__owur int SSL_CTX_set_generate_session_id(SSL_CTX *ctx, GEN_SESSION_CB cb);
__owur int SSL_set_generate_session_id(SSL *s, GEN_SESSION_CB cb);
__owur int SSL_has_matching_session_id(const SSL *s,
                                       const unsigned char *id,
                                       unsigned int id_len);
SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp,
                             long length);

# ifdef OPENSSL_X509_H
__owur X509 *SSL_get0_peer_certificate(const SSL *s);
__owur X509 *SSL_get1_peer_certificate(const SSL *s);
/* Deprecated in 3.0.0 */
#  ifndef OPENSSL_NO_DEPRECATED_3_0
#   define SSL_get_peer_certificate SSL_get1_peer_certificate
#  endif
# endif

__owur STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s);

__owur int SSL_CTX_get_verify_mode(const SSL_CTX *ctx);
__owur int SSL_CTX_get_verify_depth(const SSL_CTX *ctx);
__owur SSL_verify_cb SSL_CTX_get_verify_callback(const SSL_CTX *ctx);
void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, SSL_verify_cb callback);
void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth);
void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx,
                                      int (*cb) (X509_STORE_CTX *, void *),
                                      void *arg);
void SSL_CTX_set_cert_cb(SSL_CTX *c, int (*cb) (SSL *ssl, void *arg),
                         void *arg);
# ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0
__owur int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa);
OSSL_DEPRECATEDIN_3_0
__owur int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d,
                                          long len);
# endif
__owur int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey);
__owur int SSL_CTX_use_PrivateKey_ASN1(int pk, SSL_CTX *ctx,
                                       const unsigned char *d, long len);
__owur int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x);
__owur int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len,
                                        const unsigned char *d);
__owur int SSL_CTX_use_cert_and_key(SSL_CTX *ctx, X509 *x509, EVP_PKEY *privatekey,
                                    STACK_OF(X509) *chain, int override);

void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb);
void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u);
pem_password_cb *SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx);
void *SSL_CTX_get_default_passwd_cb_userdata(SSL_CTX *ctx);
void SSL_set_default_passwd_cb(SSL *s, pem_password_cb *cb);
void SSL_set_default_passwd_cb_userdata(SSL *s, void *u);
pem_password_cb *SSL_get_default_passwd_cb(SSL *s);
void *SSL_get_default_passwd_cb_userdata(SSL *s);

__owur int SSL_CTX_check_private_key(const SSL_CTX *ctx);
__owur int SSL_check_private_key(const SSL *ctx);

__owur int SSL_CTX_set_session_id_context(SSL_CTX *ctx,
                                          const unsigned char *sid_ctx,
                                          unsigned int sid_ctx_len);

SSL *SSL_new(SSL_CTX *ctx);
int SSL_up_ref(SSL *s);
int SSL_is_dtls(const SSL *s);
__owur int SSL_set_session_id_context(SSL *ssl, const unsigned char *sid_ctx,
                                      unsigned int sid_ctx_len);

__owur int SSL_CTX_set_purpose(SSL_CTX *ctx, int purpose);
__owur int SSL_set_purpose(SSL *ssl, int purpose);
__owur int SSL_CTX_set_trust(SSL_CTX *ctx, int trust);
__owur int SSL_set_trust(SSL *ssl, int trust);

__owur int SSL_set1_host(SSL *s, const char *hostname);
__owur int SSL_add1_host(SSL *s, const char *hostname);
__owur const char *SSL_get0_peername(SSL *s);
void SSL_set_hostflags(SSL *s, unsigned int flags);

__owur int SSL_CTX_dane_enable(SSL_CTX *ctx);
__owur int SSL_CTX_dane_mtype_set(SSL_CTX *ctx, const EVP_MD *md,
                                  uint8_t mtype, uint8_t ord);
__owur int SSL_dane_enable(SSL *s, const char *basedomain);
__owur int SSL_dane_tlsa_add(SSL *s, uint8_t usage, uint8_t selector,
                             uint8_t mtype, const unsigned char *data, size_t dlen);
__owur int SSL_get0_dane_authority(SSL *s, X509 **mcert, EVP_PKEY **mspki);
__owur int SSL_get0_dane_tlsa(SSL *s, uint8_t *usage, uint8_t *selector,
                              uint8_t *mtype, const unsigned char **data,
                              size_t *dlen);
/*
 * Bridge opacity barrier between libcrypt and libssl, also needed to support
 * offline testing in test/danetest.c
 */
SSL_DANE *SSL_get0_dane(SSL *ssl);
/*
 * DANE flags
 */
unsigned long SSL_CTX_dane_set_flags(SSL_CTX *ctx, unsigned long flags);
unsigned long SSL_CTX_dane_clear_flags(SSL_CTX *ctx, unsigned long flags);
unsigned long SSL_dane_set_flags(SSL *ssl, unsigned long flags);
unsigned long SSL_dane_clear_flags(SSL *ssl, unsigned long flags);

__owur int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm);
__owur int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm);

__owur X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx);
__owur X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl);

# ifndef OPENSSL_NO_SRP
#  ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_username(SSL_CTX *ctx, char *name);
OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_password(SSL_CTX *ctx, char *password);
OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength);
OSSL_DEPRECATEDIN_3_0
int SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx,
                                        char *(*cb) (SSL *, void *));
OSSL_DEPRECATEDIN_3_0
int SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx,
                                          int (*cb) (SSL *, void *));
OSSL_DEPRECATEDIN_3_0
int SSL_CTX_set_srp_username_callback(SSL_CTX *ctx,
                                      int (*cb) (SSL *, int *, void *));
OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg);

OSSL_DEPRECATEDIN_3_0
int SSL_set_srp_server_param(SSL *s, const BIGNUM *N, const BIGNUM *g,
                             BIGNUM *sa, BIGNUM *v, char *info);
OSSL_DEPRECATEDIN_3_0
int SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass,
                                const char *grp);

OSSL_DEPRECATEDIN_3_0 __owur BIGNUM *SSL_get_srp_g(SSL *s);
OSSL_DEPRECATEDIN_3_0 __owur BIGNUM *SSL_get_srp_N(SSL *s);

OSSL_DEPRECATEDIN_3_0 __owur char *SSL_get_srp_username(SSL *s);
OSSL_DEPRECATEDIN_3_0 __owur char *SSL_get_srp_userinfo(SSL *s);
#  endif
# endif

/*
 * ClientHello callback and helpers.
 */

# define SSL_CLIENT_HELLO_SUCCESS 1
# define SSL_CLIENT_HELLO_ERROR   0
# define SSL_CLIENT_HELLO_RETRY   (-1)

typedef int (*SSL_client_hello_cb_fn) (SSL *s, int *al, void *arg);
void SSL_CTX_set_client_hello_cb(SSL_CTX *c, SSL_client_hello_cb_fn cb,
                                 void *arg);
int SSL_client_hello_isv2(SSL *s);
unsigned int SSL_client_hello_get0_legacy_version(SSL *s);
size_t SSL_client_hello_get0_random(SSL *s, const unsigned char **out);
size_t SSL_client_hello_get0_session_id(SSL *s, const unsigned char **out);
size_t SSL_client_hello_get0_ciphers(SSL *s, const unsigned char **out);
size_t SSL_client_hello_get0_compression_methods(SSL *s,
                                                 const unsigned char **out);
int SSL_client_hello_get1_extensions_present(SSL *s, int **out, size_t *outlen);
int SSL_client_hello_get0_ext(SSL *s, unsigned int type,
                              const unsigned char **out, size_t *outlen);

void SSL_certs_clear(SSL *s);
void SSL_free(SSL *ssl);
# ifdef OSSL_ASYNC_FD
/*
 * Windows application developer has to include windows.h to use these.
 */
__owur int SSL_waiting_for_async(SSL *s);
__owur int SSL_get_all_async_fds(SSL *s, OSSL_ASYNC_FD *fds, size_t *numfds);
__owur int SSL_get_changed_async_fds(SSL *s, OSSL_ASYNC_FD *addfd,
                                     size_t *numaddfds, OSSL_ASYNC_FD *delfd,
                                     size_t *numdelfds);
__owur int SSL_CTX_set_async_callback(SSL_CTX *ctx, SSL_async_callback_fn callback);
__owur int SSL_CTX_set_async_callback_arg(SSL_CTX *ctx, void *arg);
__owur int SSL_set_async_callback(SSL *s, SSL_async_callback_fn callback);
__owur int SSL_set_async_callback_arg(SSL *s, void *arg);
__owur int SSL_get_async_status(SSL *s, int *status);

# endif
__owur int SSL_accept(SSL *ssl);
__owur int SSL_stateless(SSL *s);
__owur int SSL_connect(SSL *ssl);
__owur int SSL_read(SSL *ssl, void *buf, int num);
__owur int SSL_read_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes);

# define SSL_READ_EARLY_DATA_ERROR   0
# define SSL_READ_EARLY_DATA_SUCCESS 1
# define SSL_READ_EARLY_DATA_FINISH  2

__owur int SSL_read_early_data(SSL *s, void *buf, size_t num,
                               size_t *readbytes);
__owur int SSL_peek(SSL *ssl, void *buf, int num);
__owur int SSL_peek_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes);
__owur ossl_ssize_t SSL_sendfile(SSL *s, int fd, off_t offset, size_t size,
                                 int flags);
__owur int SSL_write(SSL *ssl, const void *buf, int num);
__owur int SSL_write_ex(SSL *s, const void *buf, size_t num, size_t *written);
__owur int SSL_write_early_data(SSL *s, const void *buf, size_t num,
                                size_t *written);
long SSL_ctrl(SSL *ssl, int cmd, long larg, void *parg);
long SSL_callback_ctrl(SSL *, int, void (*)(void));
long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg);
long SSL_CTX_callback_ctrl(SSL_CTX *, int, void (*)(void));

# define SSL_EARLY_DATA_NOT_SENT    0
# define SSL_EARLY_DATA_REJECTED    1
# define SSL_EARLY_DATA_ACCEPTED    2

__owur int SSL_get_early_data_status(const SSL *s);

__owur int SSL_get_error(const SSL *s, int ret_code);
__owur const char *SSL_get_version(const SSL *s);

/* This sets the 'default' SSL version that SSL_new() will create */
# ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0
__owur int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth);
# endif

# ifndef OPENSSL_NO_SSL3_METHOD
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_method(void); /* SSLv3 */
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_client_method(void);
#  endif
# endif

#define SSLv23_method           TLS_method
#define SSLv23_server_method    TLS_server_method
#define SSLv23_client_method    TLS_client_method

/* Negotiate highest available SSL/TLS version */
__owur const SSL_METHOD *TLS_method(void);
__owur const SSL_METHOD *TLS_server_method(void);
__owur const SSL_METHOD *TLS_client_method(void);

# ifndef OPENSSL_NO_TLS1_METHOD
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_method(void); /* TLSv1.0 */
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_client_method(void);
#  endif
# endif

# ifndef OPENSSL_NO_TLS1_1_METHOD
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_method(void); /* TLSv1.1 */
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_client_method(void);
#  endif
# endif

# ifndef OPENSSL_NO_TLS1_2_METHOD
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_method(void); /* TLSv1.2 */
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_client_method(void);
#  endif
# endif

# ifndef OPENSSL_NO_DTLS1_METHOD
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_method(void); /* DTLSv1.0 */
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_client_method(void);
#  endif
# endif

# ifndef OPENSSL_NO_DTLS1_2_METHOD
/* DTLSv1.2 */
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_client_method(void);
#  endif
# endif

__owur const SSL_METHOD *DTLS_method(void); /* DTLS 1.0 and 1.2 */
__owur const SSL_METHOD *DTLS_server_method(void); /* DTLS 1.0 and 1.2 */
__owur const SSL_METHOD *DTLS_client_method(void); /* DTLS 1.0 and 1.2 */

__owur size_t DTLS_get_data_mtu(const SSL *s);

__owur STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s);
__owur STACK_OF(SSL_CIPHER) *SSL_CTX_get_ciphers(const SSL_CTX *ctx);
__owur STACK_OF(SSL_CIPHER) *SSL_get_client_ciphers(const SSL *s);
__owur STACK_OF(SSL_CIPHER) *SSL_get1_supported_ciphers(SSL *s);

__owur int SSL_do_handshake(SSL *s);
int SSL_key_update(SSL *s, int updatetype);
int SSL_get_key_update_type(const SSL *s);
int SSL_renegotiate(SSL *s);
int SSL_renegotiate_abbreviated(SSL *s);
__owur int SSL_renegotiate_pending(const SSL *s);
int SSL_new_session_ticket(SSL *s);
int SSL_shutdown(SSL *s);
__owur int SSL_verify_client_post_handshake(SSL *s);
void SSL_CTX_set_post_handshake_auth(SSL_CTX *ctx, int val);
void SSL_set_post_handshake_auth(SSL *s, int val);

__owur const SSL_METHOD *SSL_CTX_get_ssl_method(const SSL_CTX *ctx);
__owur const SSL_METHOD *SSL_get_ssl_method(const SSL *s);
__owur int SSL_set_ssl_method(SSL *s, const SSL_METHOD *method);
__owur const char *SSL_alert_type_string_long(int value);
__owur const char *SSL_alert_type_string(int value);
__owur const char *SSL_alert_desc_string_long(int value);
__owur const char *SSL_alert_desc_string(int value);

void SSL_set0_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list);
void SSL_CTX_set0_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list);
__owur const STACK_OF(X509_NAME) *SSL_get0_CA_list(const SSL *s);
__owur const STACK_OF(X509_NAME) *SSL_CTX_get0_CA_list(const SSL_CTX *ctx);
__owur int SSL_add1_to_CA_list(SSL *ssl, const X509 *x);
__owur int SSL_CTX_add1_to_CA_list(SSL_CTX *ctx, const X509 *x);
__owur const STACK_OF(X509_NAME) *SSL_get0_peer_CA_list(const SSL *s);

void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list);
void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list);
__owur STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s);
__owur STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *s);
__owur int SSL_add_client_CA(SSL *ssl, X509 *x);
__owur int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x);

void SSL_set_connect_state(SSL *s);
void SSL_set_accept_state(SSL *s);

__owur long SSL_get_default_timeout(const SSL *s);

# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  define SSL_library_init() OPENSSL_init_ssl(0, NULL)
# endif

__owur char *SSL_CIPHER_description(const SSL_CIPHER *, char *buf, int size);
__owur STACK_OF(X509_NAME) *SSL_dup_CA_list(const STACK_OF(X509_NAME) *sk);

__owur SSL *SSL_dup(SSL *ssl);

__owur X509 *SSL_get_certificate(const SSL *ssl);
/*
 * EVP_PKEY
 */
struct evp_pkey_st *SSL_get_privatekey(const SSL *ssl);

__owur X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx);
__owur EVP_PKEY *SSL_CTX_get0_privatekey(const SSL_CTX *ctx);

void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx, int mode);
__owur int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx);
void SSL_set_quiet_shutdown(SSL *ssl, int mode);
__owur int SSL_get_quiet_shutdown(const SSL *ssl);
void SSL_set_shutdown(SSL *ssl, int mode);
__owur int SSL_get_shutdown(const SSL *ssl);
__owur int SSL_version(const SSL *ssl);
__owur int SSL_client_version(const SSL *s);
__owur int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx);
__owur int SSL_CTX_set_default_verify_dir(SSL_CTX *ctx);
__owur int SSL_CTX_set_default_verify_file(SSL_CTX *ctx);
__owur int SSL_CTX_set_default_verify_store(SSL_CTX *ctx);
__owur int SSL_CTX_load_verify_file(SSL_CTX *ctx, const char *CAfile);
__owur int SSL_CTX_load_verify_dir(SSL_CTX *ctx, const char *CApath);
__owur int SSL_CTX_load_verify_store(SSL_CTX *ctx, const char *CAstore);
__owur int SSL_CTX_load_verify_locations(SSL_CTX *ctx,
                                                        const char *CAfile,
                                                        const char *CApath);
# define SSL_get0_session SSL_get_session/* just peek at pointer */
__owur SSL_SESSION *SSL_get_session(const SSL *ssl);
__owur SSL_SESSION *SSL_get1_session(SSL *ssl); /* obtain a reference count */
__owur SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl);
SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX *ctx);
void SSL_set_info_callback(SSL *ssl,
                           void (*cb) (const SSL *ssl, int type, int val));
void (*SSL_get_info_callback(const SSL *ssl)) (const SSL *ssl, int type,
                                               int val);
__owur OSSL_HANDSHAKE_STATE SSL_get_state(const SSL *ssl);

void SSL_set_verify_result(SSL *ssl, long v);
__owur long SSL_get_verify_result(const SSL *ssl);
__owur STACK_OF(X509) *SSL_get0_verified_chain(const SSL *s);

__owur size_t SSL_get_client_random(const SSL *ssl, unsigned char *out,
                                    size_t outlen);
__owur size_t SSL_get_server_random(const SSL *ssl, unsigned char *out,
                                    size_t outlen);
__owur size_t SSL_SESSION_get_master_key(const SSL_SESSION *sess,
                                         unsigned char *out, size_t outlen);
__owur int SSL_SESSION_set1_master_key(SSL_SESSION *sess,
                                       const unsigned char *in, size_t len);
uint8_t SSL_SESSION_get_max_fragment_length(const SSL_SESSION *sess);

#define SSL_get_ex_new_index(l, p, newf, dupf, freef) \
    CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, l, p, newf, dupf, freef)
__owur int SSL_set_ex_data(SSL *ssl, int idx, void *data);
void *SSL_get_ex_data(const SSL *ssl, int idx);
#define SSL_SESSION_get_ex_new_index(l, p, newf, dupf, freef) \
    CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_SESSION, l, p, newf, dupf, freef)
__owur int SSL_SESSION_set_ex_data(SSL_SESSION *ss, int idx, void *data);
void *SSL_SESSION_get_ex_data(const SSL_SESSION *ss, int idx);
#define SSL_CTX_get_ex_new_index(l, p, newf, dupf, freef) \
    CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, l, p, newf, dupf, freef)
__owur int SSL_CTX_set_ex_data(SSL_CTX *ssl, int idx, void *data);
void *SSL_CTX_get_ex_data(const SSL_CTX *ssl, int idx);

__owur int SSL_get_ex_data_X509_STORE_CTX_idx(void);

# define SSL_CTX_sess_set_cache_size(ctx,t) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_SIZE,t,NULL)
# define SSL_CTX_sess_get_cache_size(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_SIZE,0,NULL)
# define SSL_CTX_set_session_cache_mode(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_MODE,m,NULL)
# define SSL_CTX_get_session_cache_mode(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_MODE,0,NULL)

# define SSL_CTX_get_default_read_ahead(ctx) SSL_CTX_get_read_ahead(ctx)
# define SSL_CTX_set_default_read_ahead(ctx,m) SSL_CTX_set_read_ahead(ctx,m)
# define SSL_CTX_get_read_ahead(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_READ_AHEAD,0,NULL)
# define SSL_CTX_set_read_ahead(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_READ_AHEAD,m,NULL)
# define SSL_CTX_get_max_cert_list(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL)
# define SSL_CTX_set_max_cert_list(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL)
# define SSL_get_max_cert_list(ssl) \
        SSL_ctrl(ssl,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL)
# define SSL_set_max_cert_list(ssl,m) \
        SSL_ctrl(ssl,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL)

# define SSL_CTX_set_max_send_fragment(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL)
# define SSL_set_max_send_fragment(ssl,m) \
        SSL_ctrl(ssl,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL)
# define SSL_CTX_set_split_send_fragment(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SPLIT_SEND_FRAGMENT,m,NULL)
# define SSL_set_split_send_fragment(ssl,m) \
        SSL_ctrl(ssl,SSL_CTRL_SET_SPLIT_SEND_FRAGMENT,m,NULL)
# define SSL_CTX_set_max_pipelines(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_PIPELINES,m,NULL)
# define SSL_set_max_pipelines(ssl,m) \
        SSL_ctrl(ssl,SSL_CTRL_SET_MAX_PIPELINES,m,NULL)
# define SSL_set_retry_verify(ssl) \
        (SSL_ctrl(ssl,SSL_CTRL_SET_RETRY_VERIFY,0,NULL) > 0)

void SSL_CTX_set_default_read_buffer_len(SSL_CTX *ctx, size_t len);
void SSL_set_default_read_buffer_len(SSL *s, size_t len);

# ifndef OPENSSL_NO_DH
#  ifndef OPENSSL_NO_DEPRECATED_3_0
/* NB: the |keylength| is only applicable when is_export is true */
OSSL_DEPRECATEDIN_3_0
void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,
                                 DH *(*dh) (SSL *ssl, int is_export,
                                            int keylength));
OSSL_DEPRECATEDIN_3_0
void SSL_set_tmp_dh_callback(SSL *ssl,
                             DH *(*dh) (SSL *ssl, int is_export,
                                        int keylength));
#  endif
# endif

__owur const COMP_METHOD *SSL_get_current_compression(const SSL *s);
__owur const COMP_METHOD *SSL_get_current_expansion(const SSL *s);
__owur const char *SSL_COMP_get_name(const COMP_METHOD *comp);
__owur const char *SSL_COMP_get0_name(const SSL_COMP *comp);
__owur int SSL_COMP_get_id(const SSL_COMP *comp);
STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void);
__owur STACK_OF(SSL_COMP) *SSL_COMP_set0_compression_methods(STACK_OF(SSL_COMP)
                                                             *meths);
# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  define SSL_COMP_free_compression_methods() while(0) continue
# endif
__owur int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm);

const SSL_CIPHER *SSL_CIPHER_find(SSL *ssl, const unsigned char *ptr);
int SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *c);
int SSL_CIPHER_get_digest_nid(const SSL_CIPHER *c);
int SSL_bytes_to_cipher_list(SSL *s, const unsigned char *bytes, size_t len,
                             int isv2format, STACK_OF(SSL_CIPHER) **sk,
                             STACK_OF(SSL_CIPHER) **scsvs);

/* TLS extensions functions */
__owur int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len);

__owur int SSL_set_session_ticket_ext_cb(SSL *s,
                                         tls_session_ticket_ext_cb_fn cb,
                                         void *arg);

/* Pre-shared secret session resumption functions */
__owur int SSL_set_session_secret_cb(SSL *s,
                                     tls_session_secret_cb_fn session_secret_cb,
                                     void *arg);

void SSL_CTX_set_not_resumable_session_callback(SSL_CTX *ctx,
                                                int (*cb) (SSL *ssl,
                                                           int
                                                           is_forward_secure));

void SSL_set_not_resumable_session_callback(SSL *ssl,
                                            int (*cb) (SSL *ssl,
                                                       int is_forward_secure));

void SSL_CTX_set_record_padding_callback(SSL_CTX *ctx,
                                         size_t (*cb) (SSL *ssl, int type,
                                                       size_t len, void *arg));
void SSL_CTX_set_record_padding_callback_arg(SSL_CTX *ctx, void *arg);
void *SSL_CTX_get_record_padding_callback_arg(const SSL_CTX *ctx);
int SSL_CTX_set_block_padding(SSL_CTX *ctx, size_t block_size);

int SSL_set_record_padding_callback(SSL *ssl,
                                    size_t (*cb) (SSL *ssl, int type,
                                                  size_t len, void *arg));
void SSL_set_record_padding_callback_arg(SSL *ssl, void *arg);
void *SSL_get_record_padding_callback_arg(const SSL *ssl);
int SSL_set_block_padding(SSL *ssl, size_t block_size);

int SSL_set_num_tickets(SSL *s, size_t num_tickets);
size_t SSL_get_num_tickets(const SSL *s);
int SSL_CTX_set_num_tickets(SSL_CTX *ctx, size_t num_tickets);
size_t SSL_CTX_get_num_tickets(const SSL_CTX *ctx);

# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  define SSL_cache_hit(s) SSL_session_reused(s)
# endif

__owur int SSL_session_reused(const SSL *s);
__owur int SSL_is_server(const SSL *s);

__owur __owur SSL_CONF_CTX *SSL_CONF_CTX_new(void);
int SSL_CONF_CTX_finish(SSL_CONF_CTX *cctx);
void SSL_CONF_CTX_free(SSL_CONF_CTX *cctx);
unsigned int SSL_CONF_CTX_set_flags(SSL_CONF_CTX *cctx, unsigned int flags);
__owur unsigned int SSL_CONF_CTX_clear_flags(SSL_CONF_CTX *cctx,
                                             unsigned int flags);
__owur int SSL_CONF_CTX_set1_prefix(SSL_CONF_CTX *cctx, const char *pre);

void SSL_CONF_CTX_set_ssl(SSL_CONF_CTX *cctx, SSL *ssl);
void SSL_CONF_CTX_set_ssl_ctx(SSL_CONF_CTX *cctx, SSL_CTX *ctx);

__owur int SSL_CONF_cmd(SSL_CONF_CTX *cctx, const char *cmd, const char *value);
__owur int SSL_CONF_cmd_argv(SSL_CONF_CTX *cctx, int *pargc, char ***pargv);
__owur int SSL_CONF_cmd_value_type(SSL_CONF_CTX *cctx, const char *cmd);

void SSL_add_ssl_module(void);
int SSL_config(SSL *s, const char *name);
int SSL_CTX_config(SSL_CTX *ctx, const char *name);

# ifndef OPENSSL_NO_SSL_TRACE
void SSL_trace(int write_p, int version, int content_type,
               const void *buf, size_t len, SSL *ssl, void *arg);
# endif

# ifndef OPENSSL_NO_SOCK
int DTLSv1_listen(SSL *s, BIO_ADDR *client);
# endif

# ifndef OPENSSL_NO_CT

/*
 * A callback for verifying that the received SCTs are sufficient.
 * Expected to return 1 if they are sufficient, otherwise 0.
 * May return a negative integer if an error occurs.
 * A connection should be aborted if the SCTs are deemed insufficient.
 */
typedef int (*ssl_ct_validation_cb)(const CT_POLICY_EVAL_CTX *ctx,
                                    const STACK_OF(SCT) *scts, void *arg);

/*
 * Sets a |callback| that is invoked upon receipt of ServerHelloDone to validate
 * the received SCTs.
 * If the callback returns a non-positive result, the connection is terminated.
 * Call this function before beginning a handshake.
 * If a NULL |callback| is provided, SCT validation is disabled.
 * |arg| is arbitrary userdata that will be passed to the callback whenever it
 * is invoked. Ownership of |arg| remains with the caller.
 *
 * NOTE: A side-effect of setting a CT callback is that an OCSP stapled response
 *       will be requested.
 */
int SSL_set_ct_validation_callback(SSL *s, ssl_ct_validation_cb callback,
                                   void *arg);
int SSL_CTX_set_ct_validation_callback(SSL_CTX *ctx,
                                       ssl_ct_validation_cb callback,
                                       void *arg);
#define SSL_disable_ct(s) \
        ((void) SSL_set_validation_callback((s), NULL, NULL))
#define SSL_CTX_disable_ct(ctx) \
        ((void) SSL_CTX_set_validation_callback((ctx), NULL, NULL))

/*
 * The validation type enumerates the available behaviours of the built-in SSL
 * CT validation callback selected via SSL_enable_ct() and SSL_CTX_enable_ct().
 * The underlying callback is a static function in libssl.
 */
enum {
    SSL_CT_VALIDATION_PERMISSIVE = 0,
    SSL_CT_VALIDATION_STRICT
};

/*
 * Enable CT by setting up a callback that implements one of the built-in
 * validation variants.  The SSL_CT_VALIDATION_PERMISSIVE variant always
 * continues the handshake, the application can make appropriate decisions at
 * handshake completion.  The SSL_CT_VALIDATION_STRICT variant requires at
 * least one valid SCT, or else handshake termination will be requested.  The
 * handshake may continue anyway if SSL_VERIFY_NONE is in effect.
 */
int SSL_enable_ct(SSL *s, int validation_mode);
int SSL_CTX_enable_ct(SSL_CTX *ctx, int validation_mode);

/*
 * Report whether a non-NULL callback is enabled.
 */
int SSL_ct_is_enabled(const SSL *s);
int SSL_CTX_ct_is_enabled(const SSL_CTX *ctx);

/* Gets the SCTs received from a connection */
const STACK_OF(SCT) *SSL_get0_peer_scts(SSL *s);

/*
 * Loads the CT log list from the default location.
 * If a CTLOG_STORE has previously been set using SSL_CTX_set_ctlog_store,
 * the log information loaded from this file will be appended to the
 * CTLOG_STORE.
 * Returns 1 on success, 0 otherwise.
 */
int SSL_CTX_set_default_ctlog_list_file(SSL_CTX *ctx);

/*
 * Loads the CT log list from the specified file path.
 * If a CTLOG_STORE has previously been set using SSL_CTX_set_ctlog_store,
 * the log information loaded from this file will be appended to the
 * CTLOG_STORE.
 * Returns 1 on success, 0 otherwise.
 */
int SSL_CTX_set_ctlog_list_file(SSL_CTX *ctx, const char *path);

/*
 * Sets the CT log list used by all SSL connections created from this SSL_CTX.
 * Ownership of the CTLOG_STORE is transferred to the SSL_CTX.
 */
void SSL_CTX_set0_ctlog_store(SSL_CTX *ctx, CTLOG_STORE *logs);

/*
 * Gets the CT log list used by all SSL connections created from this SSL_CTX.
 * This will be NULL unless one of the following functions has been called:
 * - SSL_CTX_set_default_ctlog_list_file
 * - SSL_CTX_set_ctlog_list_file
 * - SSL_CTX_set_ctlog_store
 */
const CTLOG_STORE *SSL_CTX_get0_ctlog_store(const SSL_CTX *ctx);

# endif /* OPENSSL_NO_CT */

/* What the "other" parameter contains in security callback */
/* Mask for type */
# define SSL_SECOP_OTHER_TYPE    0xffff0000
# define SSL_SECOP_OTHER_NONE    0
# define SSL_SECOP_OTHER_CIPHER  (1 << 16)
# define SSL_SECOP_OTHER_CURVE   (2 << 16)
# define SSL_SECOP_OTHER_DH      (3 << 16)
# define SSL_SECOP_OTHER_PKEY    (4 << 16)
# define SSL_SECOP_OTHER_SIGALG  (5 << 16)
# define SSL_SECOP_OTHER_CERT    (6 << 16)

/* Indicated operation refers to peer key or certificate */
# define SSL_SECOP_PEER          0x1000

/* Values for "op" parameter in security callback */

/* Called to filter ciphers */
/* Ciphers client supports */
# define SSL_SECOP_CIPHER_SUPPORTED      (1 | SSL_SECOP_OTHER_CIPHER)
/* Cipher shared by client/server */
# define SSL_SECOP_CIPHER_SHARED         (2 | SSL_SECOP_OTHER_CIPHER)
/* Sanity check of cipher server selects */
# define SSL_SECOP_CIPHER_CHECK          (3 | SSL_SECOP_OTHER_CIPHER)
/* Curves supported by client */
# define SSL_SECOP_CURVE_SUPPORTED       (4 | SSL_SECOP_OTHER_CURVE)
/* Curves shared by client/server */
# define SSL_SECOP_CURVE_SHARED          (5 | SSL_SECOP_OTHER_CURVE)
/* Sanity check of curve server selects */
# define SSL_SECOP_CURVE_CHECK           (6 | SSL_SECOP_OTHER_CURVE)
/* Temporary DH key */
# define SSL_SECOP_TMP_DH                (7 | SSL_SECOP_OTHER_PKEY)
/* SSL/TLS version */
# define SSL_SECOP_VERSION               (9 | SSL_SECOP_OTHER_NONE)
/* Session tickets */
# define SSL_SECOP_TICKET                (10 | SSL_SECOP_OTHER_NONE)
/* Supported signature algorithms sent to peer */
# define SSL_SECOP_SIGALG_SUPPORTED      (11 | SSL_SECOP_OTHER_SIGALG)
/* Shared signature algorithm */
# define SSL_SECOP_SIGALG_SHARED         (12 | SSL_SECOP_OTHER_SIGALG)
/* Sanity check signature algorithm allowed */
# define SSL_SECOP_SIGALG_CHECK          (13 | SSL_SECOP_OTHER_SIGALG)
/* Used to get mask of supported public key signature algorithms */
# define SSL_SECOP_SIGALG_MASK           (14 | SSL_SECOP_OTHER_SIGALG)
/* Use to see if compression is allowed */
# define SSL_SECOP_COMPRESSION           (15 | SSL_SECOP_OTHER_NONE)
/* EE key in certificate */
# define SSL_SECOP_EE_KEY                (16 | SSL_SECOP_OTHER_CERT)
/* CA key in certificate */
# define SSL_SECOP_CA_KEY                (17 | SSL_SECOP_OTHER_CERT)
/* CA digest algorithm in certificate */
# define SSL_SECOP_CA_MD                 (18 | SSL_SECOP_OTHER_CERT)
/* Peer EE key in certificate */
# define SSL_SECOP_PEER_EE_KEY           (SSL_SECOP_EE_KEY | SSL_SECOP_PEER)
/* Peer CA key in certificate */
# define SSL_SECOP_PEER_CA_KEY           (SSL_SECOP_CA_KEY | SSL_SECOP_PEER)
/* Peer CA digest algorithm in certificate */
# define SSL_SECOP_PEER_CA_MD            (SSL_SECOP_CA_MD | SSL_SECOP_PEER)

void SSL_set_security_level(SSL *s, int level);
__owur int SSL_get_security_level(const SSL *s);
void SSL_set_security_callback(SSL *s,
                               int (*cb) (const SSL *s, const SSL_CTX *ctx,
                                          int op, int bits, int nid,
                                          void *other, void *ex));
int (*SSL_get_security_callback(const SSL *s)) (const SSL *s,
                                                const SSL_CTX *ctx, int op,
                                                int bits, int nid, void *other,
                                                void *ex);
void SSL_set0_security_ex_data(SSL *s, void *ex);
__owur void *SSL_get0_security_ex_data(const SSL *s);

void SSL_CTX_set_security_level(SSL_CTX *ctx, int level);
__owur int SSL_CTX_get_security_level(const SSL_CTX *ctx);
void SSL_CTX_set_security_callback(SSL_CTX *ctx,
                                   int (*cb) (const SSL *s, const SSL_CTX *ctx,
                                              int op, int bits, int nid,
                                              void *other, void *ex));
int (*SSL_CTX_get_security_callback(const SSL_CTX *ctx)) (const SSL *s,
                                                          const SSL_CTX *ctx,
                                                          int op, int bits,
                                                          int nid,
                                                          void *other,
                                                          void *ex);
void SSL_CTX_set0_security_ex_data(SSL_CTX *ctx, void *ex);
__owur void *SSL_CTX_get0_security_ex_data(const SSL_CTX *ctx);

/* OPENSSL_INIT flag 0x010000 reserved for internal use */
# define OPENSSL_INIT_NO_LOAD_SSL_STRINGS    0x00100000L
# define OPENSSL_INIT_LOAD_SSL_STRINGS       0x00200000L

# define OPENSSL_INIT_SSL_DEFAULT \
        (OPENSSL_INIT_LOAD_SSL_STRINGS | OPENSSL_INIT_LOAD_CRYPTO_STRINGS)

int OPENSSL_init_ssl(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings);

# ifndef OPENSSL_NO_UNIT_TEST
__owur const struct openssl_ssl_test_functions *SSL_test_functions(void);
# endif

__owur int SSL_free_buffers(SSL *ssl);
__owur int SSL_alloc_buffers(SSL *ssl);

/* Status codes passed to the decrypt session ticket callback. Some of these
 * are for internal use only and are never passed to the callback. */
typedef int SSL_TICKET_STATUS;

/* Support for ticket appdata */
/* fatal error, malloc failure */
# define SSL_TICKET_FATAL_ERR_MALLOC 0
/* fatal error, either from parsing or decrypting the ticket */
# define SSL_TICKET_FATAL_ERR_OTHER  1
/* No ticket present */
# define SSL_TICKET_NONE             2
/* Empty ticket present */
# define SSL_TICKET_EMPTY            3
/* the ticket couldn't be decrypted */
# define SSL_TICKET_NO_DECRYPT       4
/* a ticket was successfully decrypted */
# define SSL_TICKET_SUCCESS          5
/* same as above but the ticket needs to be renewed */
# define SSL_TICKET_SUCCESS_RENEW    6

/* Return codes for the decrypt session ticket callback */
typedef int SSL_TICKET_RETURN;

/* An error occurred */
#define SSL_TICKET_RETURN_ABORT             0
/* Do not use the ticket, do not send a renewed ticket to the client */
#define SSL_TICKET_RETURN_IGNORE            1
/* Do not use the ticket, send a renewed ticket to the client */
#define SSL_TICKET_RETURN_IGNORE_RENEW      2
/* Use the ticket, do not send a renewed ticket to the client */
#define SSL_TICKET_RETURN_USE               3
/* Use the ticket, send a renewed ticket to the client */
#define SSL_TICKET_RETURN_USE_RENEW         4

typedef int (*SSL_CTX_generate_session_ticket_fn)(SSL *s, void *arg);
typedef SSL_TICKET_RETURN (*SSL_CTX_decrypt_session_ticket_fn)(SSL *s, SSL_SESSION *ss,
                                                               const unsigned char *keyname,
                                                               size_t keyname_length,
                                                               SSL_TICKET_STATUS status,
                                                               void *arg);
int SSL_CTX_set_session_ticket_cb(SSL_CTX *ctx,
                                  SSL_CTX_generate_session_ticket_fn gen_cb,
                                  SSL_CTX_decrypt_session_ticket_fn dec_cb,
                                  void *arg);
int SSL_SESSION_set1_ticket_appdata(SSL_SESSION *ss, const void *data, size_t len);
int SSL_SESSION_get0_ticket_appdata(SSL_SESSION *ss, void **data, size_t *len);

typedef unsigned int (*DTLS_timer_cb)(SSL *s, unsigned int timer_us);

void DTLS_set_timer_cb(SSL *s, DTLS_timer_cb cb);


typedef int (*SSL_allow_early_data_cb_fn)(SSL *s, void *arg);
void SSL_CTX_set_allow_early_data_cb(SSL_CTX *ctx,
                                     SSL_allow_early_data_cb_fn cb,
                                     void *arg);
void SSL_set_allow_early_data_cb(SSL *s,
                                 SSL_allow_early_data_cb_fn cb,
                                 void *arg);

/* store the default cipher strings inside the library */
const char *OSSL_default_cipher_list(void);
const char *OSSL_default_ciphersuites(void);

#  ifndef OPENSSL_NO_QUIC
/*
 * QUIC integration - The QUIC interface matches BoringSSL
 *
 * ssl_encryption_level_t represents a specific QUIC encryption level used to
 * transmit handshake messages. BoringSSL has this as an 'enum'.
 */
#include <openssl/quic.h>

/* Used by Chromium/QUIC - moved from evp.h to avoid breaking FIPS checksums */
# define X25519_PRIVATE_KEY_LEN          32
# define X25519_PUBLIC_VALUE_LEN         32

/* moved from types.h to avoid breaking FIPS checksums */
typedef struct ssl_quic_method_st SSL_QUIC_METHOD;

typedef enum ssl_encryption_level_t {
    ssl_encryption_initial = 0,
    ssl_encryption_early_data,
    ssl_encryption_handshake,
    ssl_encryption_application
} OSSL_ENCRYPTION_LEVEL;

struct ssl_quic_method_st {
    int (*set_encryption_secrets)(SSL *ssl, OSSL_ENCRYPTION_LEVEL level,
                                  const uint8_t *read_secret,
                                  const uint8_t *write_secret, size_t secret_len);
    int (*add_handshake_data)(SSL *ssl, OSSL_ENCRYPTION_LEVEL level,
                              const uint8_t *data, size_t len);
    int (*flush_flight)(SSL *ssl);
    int (*send_alert)(SSL *ssl, enum ssl_encryption_level_t level, uint8_t alert);
};

__owur int SSL_CTX_set_quic_method(SSL_CTX *ctx, const SSL_QUIC_METHOD *quic_method);
__owur int SSL_set_quic_method(SSL *ssl, const SSL_QUIC_METHOD *quic_method);
__owur int SSL_set_quic_transport_params(SSL *ssl,
                                         const uint8_t *params,
                                         size_t params_len);
void SSL_get_peer_quic_transport_params(const SSL *ssl,
                                        const uint8_t **out_params,
                                        size_t *out_params_len);
__owur size_t SSL_quic_max_handshake_flight_len(const SSL *ssl, OSSL_ENCRYPTION_LEVEL level);
__owur OSSL_ENCRYPTION_LEVEL SSL_quic_read_level(const SSL *ssl);
__owur OSSL_ENCRYPTION_LEVEL SSL_quic_write_level(const SSL *ssl);
__owur int SSL_provide_quic_data(SSL *ssl, OSSL_ENCRYPTION_LEVEL level,
                                 const uint8_t *data, size_t len);
__owur int SSL_process_quic_post_handshake(SSL *ssl);

__owur int SSL_is_quic(SSL *ssl);

/* BoringSSL API */
void SSL_set_quic_use_legacy_codepoint(SSL *ssl, int use_legacy);

/*
 * Set an explicit value that you want to use
 * If 0 (default) the server will use the highest extenstion the client sent
 * If 0 (default) the client will send both extensions
 */
void SSL_set_quic_transport_version(SSL *ssl, int version);
__owur int SSL_get_quic_transport_version(const SSL *ssl);
/* Returns the negotiated version, or -1 on error */
__owur int SSL_get_peer_quic_transport_version(const SSL *ssl);

int SSL_CIPHER_get_prf_nid(const SSL_CIPHER *c);

void SSL_set_quic_early_data_enabled(SSL *ssl, int enabled);

#  endif

# ifdef  __cplusplus
}
# endif
#endif
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     /*
 * WARNING: do not edit!
 * Generated by Makefile from include/openssl/x509v3.h.in
 *
 * Copyright 1999-2023 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */



#ifndef OPENSSL_X509V3_H
# define OPENSSL_X509V3_H
# pragma once

# include <openssl/macros.h>
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define HEADER_X509V3_H
# endif

# include <openssl/bio.h>
# include <openssl/x509.h>
# include <openssl/conf.h>
# include <openssl/x509v3err.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Forward reference */
struct v3_ext_method;
struct v3_ext_ctx;

/* Useful typedefs */

typedef void *(*X509V3_EXT_NEW)(void);
typedef void (*X509V3_EXT_FREE) (void *);
typedef void *(*X509V3_EXT_D2I)(void *, const unsigned char **, long);
typedef int (*X509V3_EXT_I2D) (const void *, unsigned char **);
typedef STACK_OF(CONF_VALUE) *
    (*X509V3_EXT_I2V) (const struct v3_ext_method *method, void *ext,
                       STACK_OF(CONF_VALUE) *extlist);
typedef void *(*X509V3_EXT_V2I)(const struct v3_ext_method *method,
                                struct v3_ext_ctx *ctx,
                                STACK_OF(CONF_VALUE) *values);
typedef char *(*X509V3_EXT_I2S)(const struct v3_ext_method *method,
                                void *ext);
typedef void *(*X509V3_EXT_S2I)(const struct v3_ext_method *method,
                                struct v3_ext_ctx *ctx, const char *str);
typedef int (*X509V3_EXT_I2R) (const struct v3_ext_method *method, void *ext,
                               BIO *out, int indent);
typedef void *(*X509V3_EXT_R2I)(const struct v3_ext_method *method,
                                struct v3_ext_ctx *ctx, const char *str);

/* V3 extension structure */

struct v3_ext_method {
    int ext_nid;
    int ext_flags;
/* If this is set the following four fields are ignored */
    ASN1_ITEM_EXP *it;
/* Old style ASN1 calls */
    X509V3_EXT_NEW ext_new;
    X509V3_EXT_FREE ext_free;
    X509V3_EXT_D2I d2i;
    X509V3_EXT_I2D i2d;
/* The following pair is used for string extensions */
    X509V3_EXT_I2S i2s;
    X509V3_EXT_S2I s2i;
/* The following pair is used for multi-valued extensions */
    X509V3_EXT_I2V i2v;
    X509V3_EXT_V2I v2i;
/* The following are used for raw extensions */
    X509V3_EXT_I2R i2r;
    X509V3_EXT_R2I r2i;
    void *usr_data;             /* Any extension specific data */
};

typedef struct X509V3_CONF_METHOD_st {
    char *(*get_string) (void *db, const char *section, const char *value);
    STACK_OF(CONF_VALUE) *(*get_section) (void *db, const char *section);
    void (*free_string) (void *db, char *string);
    void (*free_section) (void *db, STACK_OF(CONF_VALUE) *section);
} X509V3_CONF_METHOD;

/* Context specific info for producing X509 v3 extensions*/
struct v3_ext_ctx {
# define X509V3_CTX_TEST 0x1
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define CTX_TEST X509V3_CTX_TEST
# endif
# define X509V3_CTX_REPLACE 0x2
    int flags;
    X509 *issuer_cert;
    X509 *subject_cert;
    X509_REQ *subject_req;
    X509_CRL *crl;
    X509V3_CONF_METHOD *db_meth;
    void *db;
    EVP_PKEY *issuer_pkey;
/* Maybe more here */
};

typedef struct v3_ext_method X509V3_EXT_METHOD;

SKM_DEFINE_STACK_OF_INTERNAL(X509V3_EXT_METHOD, X509V3_EXT_METHOD, X509V3_EXT_METHOD)
#define sk_X509V3_EXT_METHOD_num(sk) OPENSSL_sk_num(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk))
#define sk_X509V3_EXT_METHOD_value(sk, idx) ((X509V3_EXT_METHOD *)OPENSSL_sk_value(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk), (idx)))
#define sk_X509V3_EXT_METHOD_new(cmp) ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_new(ossl_check_X509V3_EXT_METHOD_compfunc_type(cmp)))
#define sk_X509V3_EXT_METHOD_new_null() ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_new_null())
#define sk_X509V3_EXT_METHOD_new_reserve(cmp, n) ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_new_reserve(ossl_check_X509V3_EXT_METHOD_compfunc_type(cmp), (n)))
#define sk_X509V3_EXT_METHOD_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509V3_EXT_METHOD_sk_type(sk), (n))
#define sk_X509V3_EXT_METHOD_free(sk) OPENSSL_sk_free(ossl_check_X509V3_EXT_METHOD_sk_type(sk))
#define sk_X509V3_EXT_METHOD_zero(sk) OPENSSL_sk_zero(ossl_check_X509V3_EXT_METHOD_sk_type(sk))
#define sk_X509V3_EXT_METHOD_delete(sk, i) ((X509V3_EXT_METHOD *)OPENSSL_sk_delete(ossl_check_X509V3_EXT_METHOD_sk_type(sk), (i)))
#define sk_X509V3_EXT_METHOD_delete_ptr(sk, ptr) ((X509V3_EXT_METHOD *)OPENSSL_sk_delete_ptr(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr)))
#define sk_X509V3_EXT_METHOD_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr))
#define sk_X509V3_EXT_METHOD_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr))
#define sk_X509V3_EXT_METHOD_pop(sk) ((X509V3_EXT_METHOD *)OPENSSL_sk_pop(ossl_check_X509V3_EXT_METHOD_sk_type(sk)))
#define sk_X509V3_EXT_METHOD_shift(sk) ((X509V3_EXT_METHOD *)OPENSSL_sk_shift(ossl_check_X509V3_EXT_METHOD_sk_type(sk)))
#define sk_X509V3_EXT_METHOD_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509V3_EXT_METHOD_sk_type(sk),ossl_check_X509V3_EXT_METHOD_freefunc_type(freefunc))
#define sk_X509V3_EXT_METHOD_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr), (idx))
#define sk_X509V3_EXT_METHOD_set(sk, idx, ptr) ((X509V3_EXT_METHOD *)OPENSSL_sk_set(ossl_check_X509V3_EXT_METHOD_sk_type(sk), (idx), ossl_check_X509V3_EXT_METHOD_type(ptr)))
#define sk_X509V3_EXT_METHOD_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr))
#define sk_X509V3_EXT_METHOD_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr))
#define sk_X509V3_EXT_METHOD_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr), pnum)
#define sk_X509V3_EXT_METHOD_sort(sk) OPENSSL_sk_sort(ossl_check_X509V3_EXT_METHOD_sk_type(sk))
#define sk_X509V3_EXT_METHOD_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk))
#define sk_X509V3_EXT_METHOD_dup(sk) ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_dup(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk)))
#define sk_X509V3_EXT_METHOD_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_deep_copy(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_copyfunc_type(copyfunc), ossl_check_X509V3_EXT_METHOD_freefunc_type(freefunc)))
#define sk_X509V3_EXT_METHOD_set_cmp_func(sk, cmp) ((sk_X509V3_EXT_METHOD_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_compfunc_type(cmp)))


/* ext_flags values */
# define X509V3_EXT_DYNAMIC      0x1
# define X509V3_EXT_CTX_DEP      0x2
# define X509V3_EXT_MULTILINE    0x4

typedef BIT_STRING_BITNAME ENUMERATED_NAMES;

typedef struct BASIC_CONSTRAINTS_st {
    int ca;
    ASN1_INTEGER *pathlen;
} BASIC_CONSTRAINTS;

typedef struct PKEY_USAGE_PERIOD_st {
    ASN1_GENERALIZEDTIME *notBefore;
    ASN1_GENERALIZEDTIME *notAfter;
} PKEY_USAGE_PERIOD;

typedef struct otherName_st {
    ASN1_OBJECT *type_id;
    ASN1_TYPE *value;
} OTHERNAME;

typedef struct EDIPartyName_st {
    ASN1_STRING *nameAssigner;
    ASN1_STRING *partyName;
} EDIPARTYNAME;

typedef struct GENERAL_NAME_st {
# define GEN_OTHERNAME   0
# define GEN_EMAIL       1
# define GEN_DNS         2
# define GEN_X400        3
# define GEN_DIRNAME     4
# define GEN_EDIPARTY    5
# define GEN_URI         6
# define GEN_IPADD       7
# define GEN_RID         8
    int type;
    union {
        char *ptr;
        OTHERNAME *otherName;   /* otherName */
        ASN1_IA5STRING *rfc822Name;
        ASN1_IA5STRING *dNSName;
        ASN1_STRING *x400Address;
        X509_NAME *directoryName;
        EDIPARTYNAME *ediPartyName;
        ASN1_IA5STRING *uniformResourceIdentifier;
        ASN1_OCTET_STRING *iPAddress;
        ASN1_OBJECT *registeredID;
        /* Old names */
        ASN1_OCTET_STRING *ip;  /* iPAddress */
        X509_NAME *dirn;        /* dirn */
        ASN1_IA5STRING *ia5;    /* rfc822Name, dNSName,
                                 * uniformResourceIdentifier */
        ASN1_OBJECT *rid;       /* registeredID */
        ASN1_TYPE *other;       /* x400Address */
    } d;
} GENERAL_NAME;

typedef struct ACCESS_DESCRIPTION_st {
    ASN1_OBJECT *method;
    GENERAL_NAME *location;
} ACCESS_DESCRIPTION;

SKM_DEFINE_STACK_OF_INTERNAL(ACCESS_DESCRIPTION, ACCESS_DESCRIPTION, ACCESS_DESCRIPTION)
#define sk_ACCESS_DESCRIPTION_num(sk) OPENSSL_sk_num(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk))
#define sk_ACCESS_DESCRIPTION_value(sk, idx) ((ACCESS_DESCRIPTION *)OPENSSL_sk_value(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk), (idx)))
#define sk_ACCESS_DESCRIPTION_new(cmp) ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_new(ossl_check_ACCESS_DESCRIPTION_compfunc_type(cmp)))
#define sk_ACCESS_DESCRIPTION_new_null() ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_new_null())
#define sk_ACCESS_DESCRIPTION_new_reserve(cmp, n) ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_new_reserve(ossl_check_ACCESS_DESCRIPTION_compfunc_type(cmp), (n)))
#define sk_ACCESS_DESCRIPTION_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), (n))
#define sk_ACCESS_DESCRIPTION_free(sk) OPENSSL_sk_free(ossl_check_ACCESS_DESCRIPTION_sk_type(sk))
#define sk_ACCESS_DESCRIPTION_zero(sk) OPENSSL_sk_zero(ossl_check_ACCESS_DESCRIPTION_sk_type(sk))
#define sk_ACCESS_DESCRIPTION_delete(sk, i) ((ACCESS_DESCRIPTION *)OPENSSL_sk_delete(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), (i)))
#define sk_ACCESS_DESCRIPTION_delete_ptr(sk, ptr) ((ACCESS_DESCRIPTION *)OPENSSL_sk_delete_ptr(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr)))
#define sk_ACCESS_DESCRIPTION_push(sk, ptr) OPENSSL_sk_push(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr))
#define sk_ACCESS_DESCRIPTION_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr))
#define sk_ACCESS_DESCRIPTION_pop(sk) ((ACCESS_DESCRIPTION *)OPENSSL_sk_pop(ossl_check_ACCESS_DESCRIPTION_sk_type(sk)))
#define sk_ACCESS_DESCRIPTION_shift(sk) ((ACCESS_DESCRIPTION *)OPENSSL_sk_shift(ossl_check_ACCESS_DESCRIPTION_sk_type(sk)))
#define sk_ACCESS_DESCRIPTION_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ACCESS_DESCRIPTION_sk_type(sk),ossl_check_ACCESS_DESCRIPTION_freefunc_type(freefunc))
#define sk_ACCESS_DESCRIPTION_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr), (idx))
#define sk_ACCESS_DESCRIPTION_set(sk, idx, ptr) ((ACCESS_DESCRIPTION *)OPENSSL_sk_set(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), (idx), ossl_check_ACCESS_DESCRIPTION_type(ptr)))
#define sk_ACCESS_DESCRIPTION_find(sk, ptr) OPENSSL_sk_find(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr))
#define sk_ACCESS_DESCRIPTION_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr))
#define sk_ACCESS_DESCRIPTION_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr), pnum)
#define sk_ACCESS_DESCRIPTION_sort(sk) OPENSSL_sk_sort(ossl_check_ACCESS_DESCRIPTION_sk_type(sk))
#define sk_ACCESS_DESCRIPTION_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk))
#define sk_ACCESS_DESCRIPTION_dup(sk) ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_dup(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk)))
#define sk_ACCESS_DESCRIPTION_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_deep_copy(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_copyfunc_type(copyfunc), ossl_check_ACCESS_DESCRIPTION_freefunc_type(freefunc)))
#define sk_ACCESS_DESCRIPTION_set_cmp_func(sk, cmp) ((sk_ACCESS_DESCRIPTION_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_compfunc_type(cmp)))
SKM_DEFINE_STACK_OF_INTERNAL(GENERAL_NAME, GENERAL_NAME, GENERAL_NAME)
#define sk_GENERAL_NAME_num(sk) OPENSSL_sk_num(ossl_check_const_GENERAL_NAME_sk_type(sk))
#define sk_GENERAL_NAME_value(sk, idx) ((GENERAL_NAME *)OPENSSL_sk_value(ossl_check_const_GENERAL_NAME_sk_type(sk), (idx)))
#define sk_GENERAL_NAME_new(cmp) ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_new(ossl_check_GENERAL_NAME_compfunc_type(cmp)))
#define sk_GENERAL_NAME_new_null() ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_new_null())
#define sk_GENERAL_NAME_new_reserve(cmp, n) ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_new_reserve(ossl_check_GENERAL_NAME_compfunc_type(cmp), (n)))
#define sk_GENERAL_NAME_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_GENERAL_NAME_sk_type(sk), (n))
#define sk_GENERAL_NAME_free(sk) OPENSSL_sk_free(ossl_check_GENERAL_NAME_sk_type(sk))
#define sk_GENERAL_NAME_zero(sk) OPENSSL_sk_zero(ossl_check_GENERAL_NAME_sk_type(sk))
#define sk_GENERAL_NAME_delete(sk, i) ((GENERAL_NAME *)OPENSSL_sk_delete(ossl_check_GENERAL_NAME_sk_type(sk), (i)))
#define sk_GENERAL_NAME_delete_ptr(sk, ptr) ((GENERAL_NAME *)OPENSSL_sk_delete_ptr(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr)))
#define sk_GENERAL_NAME_push(sk, ptr) OPENSSL_sk_push(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr))
#define sk_GENERAL_NAME_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr))
#define sk_GENERAL_NAME_pop(sk) ((GENERAL_NAME *)OPENSSL_sk_pop(ossl_check_GENERAL_NAME_sk_type(sk)))
#define sk_GENERAL_NAME_shift(sk) ((GENERAL_NAME *)OPENSSL_sk_shift(ossl_check_GENERAL_NAME_sk_type(sk)))
#define sk_GENERAL_NAME_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_GENERAL_NAME_sk_type(sk),ossl_check_GENERAL_NAME_freefunc_type(freefunc))
#define sk_GENERAL_NAME_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr), (idx))
#define sk_GENERAL_NAME_set(sk, idx, ptr) ((GENERAL_NAME *)OPENSSL_sk_set(ossl_check_GENERAL_NAME_sk_type(sk), (idx), ossl_check_GENERAL_NAME_type(ptr)))
#define sk_GENERAL_NAME_find(sk, ptr) OPENSSL_sk_find(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr))
#define sk_GENERAL_NAME_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr))
#define sk_GENERAL_NAME_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr), pnum)
#define sk_GENERAL_NAME_sort(sk) OPENSSL_sk_sort(ossl_check_GENERAL_NAME_sk_type(sk))
#define sk_GENERAL_NAME_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_GENERAL_NAME_sk_type(sk))
#define sk_GENERAL_NAME_dup(sk) ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_dup(ossl_check_const_GENERAL_NAME_sk_type(sk)))
#define sk_GENERAL_NAME_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_deep_copy(ossl_check_const_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_copyfunc_type(copyfunc), ossl_check_GENERAL_NAME_freefunc_type(freefunc)))
#define sk_GENERAL_NAME_set_cmp_func(sk, cmp) ((sk_GENERAL_NAME_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_compfunc_type(cmp)))


typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS;
typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE;
typedef STACK_OF(ASN1_INTEGER) TLS_FEATURE;
typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES;

SKM_DEFINE_STACK_OF_INTERNAL(GENERAL_NAMES, GENERAL_NAMES, GENERAL_NAMES)
#define sk_GENERAL_NAMES_num(sk) OPENSSL_sk_num(ossl_check_const_GENERAL_NAMES_sk_type(sk))
#define sk_GENERAL_NAMES_value(sk, idx) ((GENERAL_NAMES *)OPENSSL_sk_value(ossl_check_const_GENERAL_NAMES_sk_type(sk), (idx)))
#define sk_GENERAL_NAMES_new(cmp) ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_new(ossl_check_GENERAL_NAMES_compfunc_type(cmp)))
#define sk_GENERAL_NAMES_new_null() ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_new_null())
#define sk_GENERAL_NAMES_new_reserve(cmp, n) ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_new_reserve(ossl_check_GENERAL_NAMES_compfunc_type(cmp), (n)))
#define sk_GENERAL_NAMES_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_GENERAL_NAMES_sk_type(sk), (n))
#define sk_GENERAL_NAMES_free(sk) OPENSSL_sk_free(ossl_check_GENERAL_NAMES_sk_type(sk))
#define sk_GENERAL_NAMES_zero(sk) OPENSSL_sk_zero(ossl_check_GENERAL_NAMES_sk_type(sk))
#define sk_GENERAL_NAMES_delete(sk, i) ((GENERAL_NAMES *)OPENSSL_sk_delete(ossl_check_GENERAL_NAMES_sk_type(sk), (i)))
#define sk_GENERAL_NAMES_delete_ptr(sk, ptr) ((GENERAL_NAMES *)OPENSSL_sk_delete_ptr(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr)))
#define sk_GENERAL_NAMES_push(sk, ptr) OPENSSL_sk_push(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr))
#define sk_GENERAL_NAMES_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr))
#define sk_GENERAL_NAMES_pop(sk) ((GENERAL_NAMES *)OPENSSL_sk_pop(ossl_check_GENERAL_NAMES_sk_type(sk)))
#define sk_GENERAL_NAMES_shift(sk) ((GENERAL_NAMES *)OPENSSL_sk_shift(ossl_check_GENERAL_NAMES_sk_type(sk)))
#define sk_GENERAL_NAMES_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_GENERAL_NAMES_sk_type(sk),ossl_check_GENERAL_NAMES_freefunc_type(freefunc))
#define sk_GENERAL_NAMES_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr), (idx))
#define sk_GENERAL_NAMES_set(sk, idx, ptr) ((GENERAL_NAMES *)OPENSSL_sk_set(ossl_check_GENERAL_NAMES_sk_type(sk), (idx), ossl_check_GENERAL_NAMES_type(ptr)))
#define sk_GENERAL_NAMES_find(sk, ptr) OPENSSL_sk_find(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr))
#define sk_GENERAL_NAMES_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr))
#define sk_GENERAL_NAMES_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr), pnum)
#define sk_GENERAL_NAMES_sort(sk) OPENSSL_sk_sort(ossl_check_GENERAL_NAMES_sk_type(sk))
#define sk_GENERAL_NAMES_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_GENERAL_NAMES_sk_type(sk))
#define sk_GENERAL_NAMES_dup(sk) ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_dup(ossl_check_const_GENERAL_NAMES_sk_type(sk)))
#define sk_GENERAL_NAMES_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_deep_copy(ossl_check_const_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_copyfunc_type(copyfunc), ossl_check_GENERAL_NAMES_freefunc_type(freefunc)))
#define sk_GENERAL_NAMES_set_cmp_func(sk, cmp) ((sk_GENERAL_NAMES_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_compfunc_type(cmp)))


typedef struct DIST_POINT_NAME_st {
    int type;
    union {
        GENERAL_NAMES *fullname;
        STACK_OF(X509_NAME_ENTRY) *relativename;
    } name;
/* If relativename then this contains the full distribution point name */
    X509_NAME *dpname;
} DIST_POINT_NAME;
/* All existing reasons */
# define CRLDP_ALL_REASONS       0x807f

# define CRL_REASON_NONE                         -1
# define CRL_REASON_UNSPECIFIED                  0
# define CRL_REASON_KEY_COMPROMISE               1
# define CRL_REASON_CA_COMPROMISE                2
# define CRL_REASON_AFFILIATION_CHANGED          3
# define CRL_REASON_SUPERSEDED                   4
# define CRL_REASON_CESSATION_OF_OPERATION       5
# define CRL_REASON_CERTIFICATE_HOLD             6
# define CRL_REASON_REMOVE_FROM_CRL              8
# define CRL_REASON_PRIVILEGE_WITHDRAWN          9
# define CRL_REASON_AA_COMPROMISE                10

struct DIST_POINT_st {
    DIST_POINT_NAME *distpoint;
    ASN1_BIT_STRING *reasons;
    GENERAL_NAMES *CRLissuer;
    int dp_reasons;
};

SKM_DEFINE_STACK_OF_INTERNAL(DIST_POINT, DIST_POINT, DIST_POINT)
#define sk_DIST_POINT_num(sk) OPENSSL_sk_num(ossl_check_const_DIST_POINT_sk_type(sk))
#define sk_DIST_POINT_value(sk, idx) ((DIST_POINT *)OPENSSL_sk_value(ossl_check_const_DIST_POINT_sk_type(sk), (idx)))
#define sk_DIST_POINT_new(cmp) ((STACK_OF(DIST_POINT) *)OPENSSL_sk_new(ossl_check_DIST_POINT_compfunc_type(cmp)))
#define sk_DIST_POINT_new_null() ((STACK_OF(DIST_POINT) *)OPENSSL_sk_new_null())
#define sk_DIST_POINT_new_reserve(cmp, n) ((STACK_OF(DIST_POINT) *)OPENSSL_sk_new_reserve(ossl_check_DIST_POINT_compfunc_type(cmp), (n)))
#define sk_DIST_POINT_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_DIST_POINT_sk_type(sk), (n))
#define sk_DIST_POINT_free(sk) OPENSSL_sk_free(ossl_check_DIST_POINT_sk_type(sk))
#define sk_DIST_POINT_zero(sk) OPENSSL_sk_zero(ossl_check_DIST_POINT_sk_type(sk))
#define sk_DIST_POINT_delete(sk, i) ((DIST_POINT *)OPENSSL_sk_delete(ossl_check_DIST_POINT_sk_type(sk), (i)))
#define sk_DIST_POINT_delete_ptr(sk, ptr) ((DIST_POINT *)OPENSSL_sk_delete_ptr(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr)))
#define sk_DIST_POINT_push(sk, ptr) OPENSSL_sk_push(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr))
#define sk_DIST_POINT_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr))
#define sk_DIST_POINT_pop(sk) ((DIST_POINT *)OPENSSL_sk_pop(ossl_check_DIST_POINT_sk_type(sk)))
#define sk_DIST_POINT_shift(sk) ((DIST_POINT *)OPENSSL_sk_shift(ossl_check_DIST_POINT_sk_type(sk)))
#define sk_DIST_POINT_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_DIST_POINT_sk_type(sk),ossl_check_DIST_POINT_freefunc_type(freefunc))
#define sk_DIST_POINT_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr), (idx))
#define sk_DIST_POINT_set(sk, idx, ptr) ((DIST_POINT *)OPENSSL_sk_set(ossl_check_DIST_POINT_sk_type(sk), (idx), ossl_check_DIST_POINT_type(ptr)))
#define sk_DIST_POINT_find(sk, ptr) OPENSSL_sk_find(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr))
#define sk_DIST_POINT_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr))
#define sk_DIST_POINT_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr), pnum)
#define sk_DIST_POINT_sort(sk) OPENSSL_sk_sort(ossl_check_DIST_POINT_sk_type(sk))
#define sk_DIST_POINT_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_DIST_POINT_sk_type(sk))
#define sk_DIST_POINT_dup(sk) ((STACK_OF(DIST_POINT) *)OPENSSL_sk_dup(ossl_check_const_DIST_POINT_sk_type(sk)))
#define sk_DIST_POINT_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(DIST_POINT) *)OPENSSL_sk_deep_copy(ossl_check_const_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_copyfunc_type(copyfunc), ossl_check_DIST_POINT_freefunc_type(freefunc)))
#define sk_DIST_POINT_set_cmp_func(sk, cmp) ((sk_DIST_POINT_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_compfunc_type(cmp)))


typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS;

struct AUTHORITY_KEYID_st {
    ASN1_OCTET_STRING *keyid;
    GENERAL_NAMES *issuer;
    ASN1_INTEGER *serial;
};

/* Strong extranet structures */

typedef struct SXNET_ID_st {
    ASN1_INTEGER *zone;
    ASN1_OCTET_STRING *user;
} SXNETID;

SKM_DEFINE_STACK_OF_INTERNAL(SXNETID, SXNETID, SXNETID)
#define sk_SXNETID_num(sk) OPENSSL_sk_num(ossl_check_const_SXNETID_sk_type(sk))
#define sk_SXNETID_value(sk, idx) ((SXNETID *)OPENSSL_sk_value(ossl_check_const_SXNETID_sk_type(sk), (idx)))
#define sk_SXNETID_new(cmp) ((STACK_OF(SXNETID) *)OPENSSL_sk_new(ossl_check_SXNETID_compfunc_type(cmp)))
#define sk_SXNETID_new_null() ((STACK_OF(SXNETID) *)OPENSSL_sk_new_null())
#define sk_SXNETID_new_reserve(cmp, n) ((STACK_OF(SXNETID) *)OPENSSL_sk_new_reserve(ossl_check_SXNETID_compfunc_type(cmp), (n)))
#define sk_SXNETID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SXNETID_sk_type(sk), (n))
#define sk_SXNETID_free(sk) OPENSSL_sk_free(ossl_check_SXNETID_sk_type(sk))
#define sk_SXNETID_zero(sk) OPENSSL_sk_zero(ossl_check_SXNETID_sk_type(sk))
#define sk_SXNETID_delete(sk, i) ((SXNETID *)OPENSSL_sk_delete(ossl_check_SXNETID_sk_type(sk), (i)))
#define sk_SXNETID_delete_ptr(sk, ptr) ((SXNETID *)OPENSSL_sk_delete_ptr(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr)))
#define sk_SXNETID_push(sk, ptr) OPENSSL_sk_push(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr))
#define sk_SXNETID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr))
#define sk_SXNETID_pop(sk) ((SXNETID *)OPENSSL_sk_pop(ossl_check_SXNETID_sk_type(sk)))
#define sk_SXNETID_shift(sk) ((SXNETID *)OPENSSL_sk_shift(ossl_check_SXNETID_sk_type(sk)))
#define sk_SXNETID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SXNETID_sk_type(sk),ossl_check_SXNETID_freefunc_type(freefunc))
#define sk_SXNETID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr), (idx))
#define sk_SXNETID_set(sk, idx, ptr) ((SXNETID *)OPENSSL_sk_set(ossl_check_SXNETID_sk_type(sk), (idx), ossl_check_SXNETID_type(ptr)))
#define sk_SXNETID_find(sk, ptr) OPENSSL_sk_find(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr))
#define sk_SXNETID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr))
#define sk_SXNETID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr), pnum)
#define sk_SXNETID_sort(sk) OPENSSL_sk_sort(ossl_check_SXNETID_sk_type(sk))
#define sk_SXNETID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SXNETID_sk_type(sk))
#define sk_SXNETID_dup(sk) ((STACK_OF(SXNETID) *)OPENSSL_sk_dup(ossl_check_const_SXNETID_sk_type(sk)))
#define sk_SXNETID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SXNETID) *)OPENSSL_sk_deep_copy(ossl_check_const_SXNETID_sk_type(sk), ossl_check_SXNETID_copyfunc_type(copyfunc), ossl_check_SXNETID_freefunc_type(freefunc)))
#define sk_SXNETID_set_cmp_func(sk, cmp) ((sk_SXNETID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_compfunc_type(cmp)))



typedef struct SXNET_st {
    ASN1_INTEGER *version;
    STACK_OF(SXNETID) *ids;
} SXNET;

typedef struct ISSUER_SIGN_TOOL_st {
    ASN1_UTF8STRING *signTool;
    ASN1_UTF8STRING *cATool;
    ASN1_UTF8STRING *signToolCert;
    ASN1_UTF8STRING *cAToolCert;
} ISSUER_SIGN_TOOL;

typedef struct NOTICEREF_st {
    ASN1_STRING *organization;
    STACK_OF(ASN1_INTEGER) *noticenos;
} NOTICEREF;

typedef struct USERNOTICE_st {
    NOTICEREF *noticeref;
    ASN1_STRING *exptext;
} USERNOTICE;

typedef struct POLICYQUALINFO_st {
    ASN1_OBJECT *pqualid;
    union {
        ASN1_IA5STRING *cpsuri;
        USERNOTICE *usernotice;
        ASN1_TYPE *other;
    } d;
} POLICYQUALINFO;

SKM_DEFINE_STACK_OF_INTERNAL(POLICYQUALINFO, POLICYQUALINFO, POLICYQUALINFO)
#define sk_POLICYQUALINFO_num(sk) OPENSSL_sk_num(ossl_check_const_POLICYQUALINFO_sk_type(sk))
#define sk_POLICYQUALINFO_value(sk, idx) ((POLICYQUALINFO *)OPENSSL_sk_value(ossl_check_const_POLICYQUALINFO_sk_type(sk), (idx)))
#define sk_POLICYQUALINFO_new(cmp) ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_new(ossl_check_POLICYQUALINFO_compfunc_type(cmp)))
#define sk_POLICYQUALINFO_new_null() ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_new_null())
#define sk_POLICYQUALINFO_new_reserve(cmp, n) ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_new_reserve(ossl_check_POLICYQUALINFO_compfunc_type(cmp), (n)))
#define sk_POLICYQUALINFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_POLICYQUALINFO_sk_type(sk), (n))
#define sk_POLICYQUALINFO_free(sk) OPENSSL_sk_free(ossl_check_POLICYQUALINFO_sk_type(sk))
#define sk_POLICYQUALINFO_zero(sk) OPENSSL_sk_zero(ossl_check_POLICYQUALINFO_sk_type(sk))
#define sk_POLICYQUALINFO_delete(sk, i) ((POLICYQUALINFO *)OPENSSL_sk_delete(ossl_check_POLICYQUALINFO_sk_type(sk), (i)))
#define sk_POLICYQUALINFO_delete_ptr(sk, ptr) ((POLICYQUALINFO *)OPENSSL_sk_delete_ptr(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr)))
#define sk_POLICYQUALINFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr))
#define sk_POLICYQUALINFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr))
#define sk_POLICYQUALINFO_pop(sk) ((POLICYQUALINFO *)OPENSSL_sk_pop(ossl_check_POLICYQUALINFO_sk_type(sk)))
#define sk_POLICYQUALINFO_shift(sk) ((POLICYQUALINFO *)OPENSSL_sk_shift(ossl_check_POLICYQUALINFO_sk_type(sk)))
#define sk_POLICYQUALINFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_POLICYQUALINFO_sk_type(sk),ossl_check_POLICYQUALINFO_freefunc_type(freefunc))
#define sk_POLICYQUALINFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr), (idx))
#define sk_POLICYQUALINFO_set(sk, idx, ptr) ((POLICYQUALINFO *)OPENSSL_sk_set(ossl_check_POLICYQUALINFO_sk_type(sk), (idx), ossl_check_POLICYQUALINFO_type(ptr)))
#define sk_POLICYQUALINFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr))
#define sk_POLICYQUALINFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr))
#define sk_POLICYQUALINFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr), pnum)
#define sk_POLICYQUALINFO_sort(sk) OPENSSL_sk_sort(ossl_check_POLICYQUALINFO_sk_type(sk))
#define sk_POLICYQUALINFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_POLICYQUALINFO_sk_type(sk))
#define sk_POLICYQUALINFO_dup(sk) ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_dup(ossl_check_const_POLICYQUALINFO_sk_type(sk)))
#define sk_POLICYQUALINFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_deep_copy(ossl_check_const_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_copyfunc_type(copyfunc), ossl_check_POLICYQUALINFO_freefunc_type(freefunc)))
#define sk_POLICYQUALINFO_set_cmp_func(sk, cmp) ((sk_POLICYQUALINFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_compfunc_type(cmp)))



typedef struct POLICYINFO_st {
    ASN1_OBJECT *policyid;
    STACK_OF(POLICYQUALINFO) *qualifiers;
} POLICYINFO;

SKM_DEFINE_STACK_OF_INTERNAL(POLICYINFO, POLICYINFO, POLICYINFO)
#define sk_POLICYINFO_num(sk) OPENSSL_sk_num(ossl_check_const_POLICYINFO_sk_type(sk))
#define sk_POLICYINFO_value(sk, idx) ((POLICYINFO *)OPENSSL_sk_value(ossl_check_const_POLICYINFO_sk_type(sk), (idx)))
#define sk_POLICYINFO_new(cmp) ((STACK_OF(POLICYINFO) *)OPENSSL_sk_new(ossl_check_POLICYINFO_compfunc_type(cmp)))
#define sk_POLICYINFO_new_null() ((STACK_OF(POLICYINFO) *)OPENSSL_sk_new_null())
#define sk_POLICYINFO_new_reserve(cmp, n) ((STACK_OF(POLICYINFO) *)OPENSSL_sk_new_reserve(ossl_check_POLICYINFO_compfunc_type(cmp), (n)))
#define sk_POLICYINFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_POLICYINFO_sk_type(sk), (n))
#define sk_POLICYINFO_free(sk) OPENSSL_sk_free(ossl_check_POLICYINFO_sk_type(sk))
#define sk_POLICYINFO_zero(sk) OPENSSL_sk_zero(ossl_check_POLICYINFO_sk_type(sk))
#define sk_POLICYINFO_delete(sk, i) ((POLICYINFO *)OPENSSL_sk_delete(ossl_check_POLICYINFO_sk_type(sk), (i)))
#define sk_POLICYINFO_delete_ptr(sk, ptr) ((POLICYINFO *)OPENSSL_sk_delete_ptr(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr)))
#define sk_POLICYINFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr))
#define sk_POLICYINFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr))
#define sk_POLICYINFO_pop(sk) ((POLICYINFO *)OPENSSL_sk_pop(ossl_check_POLICYINFO_sk_type(sk)))
#define sk_POLICYINFO_shift(sk) ((POLICYINFO *)OPENSSL_sk_shift(ossl_check_POLICYINFO_sk_type(sk)))
#define sk_POLICYINFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_POLICYINFO_sk_type(sk),ossl_check_POLICYINFO_freefunc_type(freefunc))
#define sk_POLICYINFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr), (idx))
#define sk_POLICYINFO_set(sk, idx, ptr) ((POLICYINFO *)OPENSSL_sk_set(ossl_check_POLICYINFO_sk_type(sk), (idx), ossl_check_POLICYINFO_type(ptr)))
#define sk_POLICYINFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr))
#define sk_POLICYINFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr))
#define sk_POLICYINFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr), pnum)
#define sk_POLICYINFO_sort(sk) OPENSSL_sk_sort(ossl_check_POLICYINFO_sk_type(sk))
#define sk_POLICYINFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_POLICYINFO_sk_type(sk))
#define sk_POLICYINFO_dup(sk) ((STACK_OF(POLICYINFO) *)OPENSSL_sk_dup(ossl_check_const_POLICYINFO_sk_type(sk)))
#define sk_POLICYINFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(POLICYINFO) *)OPENSSL_sk_deep_copy(ossl_check_const_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_copyfunc_type(copyfunc), ossl_check_POLICYINFO_freefunc_type(freefunc)))
#define sk_POLICYINFO_set_cmp_func(sk, cmp) ((sk_POLICYINFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_compfunc_type(cmp)))


typedef STACK_OF(POLICYINFO) CERTIFICATEPOLICIES;

typedef struct POLICY_MAPPING_st {
    ASN1_OBJECT *issuerDomainPolicy;
    ASN1_OBJECT *subjectDomainPolicy;
} POLICY_MAPPING;

SKM_DEFINE_STACK_OF_INTERNAL(POLICY_MAPPING, POLICY_MAPPING, POLICY_MAPPING)
#define sk_POLICY_MAPPING_num(sk) OPENSSL_sk_num(ossl_check_const_POLICY_MAPPING_sk_type(sk))
#define sk_POLICY_MAPPING_value(sk, idx) ((POLICY_MAPPING *)OPENSSL_sk_value(ossl_check_const_POLICY_MAPPING_sk_type(sk), (idx)))
#define sk_POLICY_MAPPING_new(cmp) ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_new(ossl_check_POLICY_MAPPING_compfunc_type(cmp)))
#define sk_POLICY_MAPPING_new_null() ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_new_null())
#define sk_POLICY_MAPPING_new_reserve(cmp, n) ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_new_reserve(ossl_check_POLICY_MAPPING_compfunc_type(cmp), (n)))
#define sk_POLICY_MAPPING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_POLICY_MAPPING_sk_type(sk), (n))
#define sk_POLICY_MAPPING_free(sk) OPENSSL_sk_free(ossl_check_POLICY_MAPPING_sk_type(sk))
#define sk_POLICY_MAPPING_zero(sk) OPENSSL_sk_zero(ossl_check_POLICY_MAPPING_sk_type(sk))
#define sk_POLICY_MAPPING_delete(sk, i) ((POLICY_MAPPING *)OPENSSL_sk_delete(ossl_check_POLICY_MAPPING_sk_type(sk), (i)))
#define sk_POLICY_MAPPING_delete_ptr(sk, ptr) ((POLICY_MAPPING *)OPENSSL_sk_delete_ptr(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr)))
#define sk_POLICY_MAPPING_push(sk, ptr) OPENSSL_sk_push(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr))
#define sk_POLICY_MAPPING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr))
#define sk_POLICY_MAPPING_pop(sk) ((POLICY_MAPPING *)OPENSSL_sk_pop(ossl_check_POLICY_MAPPING_sk_type(sk)))
#define sk_POLICY_MAPPING_shift(sk) ((POLICY_MAPPING *)OPENSSL_sk_shift(ossl_check_POLICY_MAPPING_sk_type(sk)))
#define sk_POLICY_MAPPING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_POLICY_MAPPING_sk_type(sk),ossl_check_POLICY_MAPPING_freefunc_type(freefunc))
#define sk_POLICY_MAPPING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr), (idx))
#define sk_POLICY_MAPPING_set(sk, idx, ptr) ((POLICY_MAPPING *)OPENSSL_sk_set(ossl_check_POLICY_MAPPING_sk_type(sk), (idx), ossl_check_POLICY_MAPPING_type(ptr)))
#define sk_POLICY_MAPPING_find(sk, ptr) OPENSSL_sk_find(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr))
#define sk_POLICY_MAPPING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr))
#define sk_POLICY_MAPPING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr), pnum)
#define sk_POLICY_MAPPING_sort(sk) OPENSSL_sk_sort(ossl_check_POLICY_MAPPING_sk_type(sk))
#define sk_POLICY_MAPPING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_POLICY_MAPPING_sk_type(sk))
#define sk_POLICY_MAPPING_dup(sk) ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_dup(ossl_check_const_POLICY_MAPPING_sk_type(sk)))
#define sk_POLICY_MAPPING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_deep_copy(ossl_check_const_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_copyfunc_type(copyfunc), ossl_check_POLICY_MAPPING_freefunc_type(freefunc)))
#define sk_POLICY_MAPPING_set_cmp_func(sk, cmp) ((sk_POLICY_MAPPING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_compfunc_type(cmp)))


typedef STACK_OF(POLICY_MAPPING) POLICY_MAPPINGS;

typedef struct GENERAL_SUBTREE_st {
    GENERAL_NAME *base;
    ASN1_INTEGER *minimum;
    ASN1_INTEGER *maximum;
} GENERAL_SUBTREE;

SKM_DEFINE_STACK_OF_INTERNAL(GENERAL_SUBTREE, GENERAL_SUBTREE, GENERAL_SUBTREE)
#define sk_GENERAL_SUBTREE_num(sk) OPENSSL_sk_num(ossl_check_const_GENERAL_SUBTREE_sk_type(sk))
#define sk_GENERAL_SUBTREE_value(sk, idx) ((GENERAL_SUBTREE *)OPENSSL_sk_value(ossl_check_const_GENERAL_SUBTREE_sk_type(sk), (idx)))
#define sk_GENERAL_SUBTREE_new(cmp) ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_new(ossl_check_GENERAL_SUBTREE_compfunc_type(cmp)))
#define sk_GENERAL_SUBTREE_new_null() ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_new_null())
#define sk_GENERAL_SUBTREE_new_reserve(cmp, n) ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_new_reserve(ossl_check_GENERAL_SUBTREE_compfunc_type(cmp), (n)))
#define sk_GENERAL_SUBTREE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_GENERAL_SUBTREE_sk_type(sk), (n))
#define sk_GENERAL_SUBTREE_free(sk) OPENSSL_sk_free(ossl_check_GENERAL_SUBTREE_sk_type(sk))
#define sk_GENERAL_SUBTREE_zero(sk) OPENSSL_sk_zero(ossl_check_GENERAL_SUBTREE_sk_type(sk))
#define sk_GENERAL_SUBTREE_delete(sk, i) ((GENERAL_SUBTREE *)OPENSSL_sk_delete(ossl_check_GENERAL_SUBTREE_sk_type(sk), (i)))
#define sk_GENERAL_SUBTREE_delete_ptr(sk, ptr) ((GENERAL_SUBTREE *)OPENSSL_sk_delete_ptr(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr)))
#define sk_GENERAL_SUBTREE_push(sk, ptr) OPENSSL_sk_push(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr))
#define sk_GENERAL_SUBTREE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr))
#define sk_GENERAL_SUBTREE_pop(sk) ((GENERAL_SUBTREE *)OPENSSL_sk_pop(ossl_check_GENERAL_SUBTREE_sk_type(sk)))
#define sk_GENERAL_SUBTREE_shift(sk) ((GENERAL_SUBTREE *)OPENSSL_sk_shift(ossl_check_GENERAL_SUBTREE_sk_type(sk)))
#define sk_GENERAL_SUBTREE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_GENERAL_SUBTREE_sk_type(sk),ossl_check_GENERAL_SUBTREE_freefunc_type(freefunc))
#define sk_GENERAL_SUBTREE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr), (idx))
#define sk_GENERAL_SUBTREE_set(sk, idx, ptr) ((GENERAL_SUBTREE *)OPENSSL_sk_set(ossl_check_GENERAL_SUBTREE_sk_type(sk), (idx), ossl_check_GENERAL_SUBTREE_type(ptr)))
#define sk_GENERAL_SUBTREE_find(sk, ptr) OPENSSL_sk_find(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr))
#define sk_GENERAL_SUBTREE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr))
#define sk_GENERAL_SUBTREE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr), pnum)
#define sk_GENERAL_SUBTREE_sort(sk) OPENSSL_sk_sort(ossl_check_GENERAL_SUBTREE_sk_type(sk))
#define sk_GENERAL_SUBTREE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_GENERAL_SUBTREE_sk_type(sk))
#define sk_GENERAL_SUBTREE_dup(sk) ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_dup(ossl_check_const_GENERAL_SUBTREE_sk_type(sk)))
#define sk_GENERAL_SUBTREE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_deep_copy(ossl_check_const_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_copyfunc_type(copyfunc), ossl_check_GENERAL_SUBTREE_freefunc_type(freefunc)))
#define sk_GENERAL_SUBTREE_set_cmp_func(sk, cmp) ((sk_GENERAL_SUBTREE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_compfunc_type(cmp)))


struct NAME_CONSTRAINTS_st {
    STACK_OF(GENERAL_SUBTREE) *permittedSubtrees;
    STACK_OF(GENERAL_SUBTREE) *excludedSubtrees;
};

typedef struct POLICY_CONSTRAINTS_st {
    ASN1_INTEGER *requireExplicitPolicy;
    ASN1_INTEGER *inhibitPolicyMapping;
} POLICY_CONSTRAINTS;

/* Proxy certificate structures, see RFC 3820 */
typedef struct PROXY_POLICY_st {
    ASN1_OBJECT *policyLanguage;
    ASN1_OCTET_STRING *policy;
} PROXY_POLICY;

typedef struct PROXY_CERT_INFO_EXTENSION_st {
    ASN1_INTEGER *pcPathLengthConstraint;
    PROXY_POLICY *proxyPolicy;
} PROXY_CERT_INFO_EXTENSION;

DECLARE_ASN1_FUNCTIONS(PROXY_POLICY)
DECLARE_ASN1_FUNCTIONS(PROXY_CERT_INFO_EXTENSION)

struct ISSUING_DIST_POINT_st {
    DIST_POINT_NAME *distpoint;
    int onlyuser;
    int onlyCA;
    ASN1_BIT_STRING *onlysomereasons;
    int indirectCRL;
    int onlyattr;
};

/* Values in idp_flags field */
/* IDP present */
# define IDP_PRESENT     0x1
/* IDP values inconsistent */
# define IDP_INVALID     0x2
/* onlyuser true */
# define IDP_ONLYUSER    0x4
/* onlyCA true */
# define IDP_ONLYCA      0x8
/* onlyattr true */
# define IDP_ONLYATTR    0x10
/* indirectCRL true */
# define IDP_INDIRECT    0x20
/* onlysomereasons present */
# define IDP_REASONS     0x40

# define X509V3_conf_err(val) ERR_add_error_data(6, \
                        "section:", (val)->section, \
                        ",name:", (val)->name, ",value:", (val)->value)

# define X509V3_set_ctx_test(ctx) \
    X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, X509V3_CTX_TEST)
# define X509V3_set_ctx_nodb(ctx) (ctx)->db = NULL;

# define EXT_BITSTRING(nid, table) { nid, 0, ASN1_ITEM_ref(ASN1_BIT_STRING), \
                        0,0,0,0, \
                        0,0, \
                        (X509V3_EXT_I2V)i2v_ASN1_BIT_STRING, \
                        (X509V3_EXT_V2I)v2i_ASN1_BIT_STRING, \
                        NULL, NULL, \
                        table}

# define EXT_IA5STRING(nid) { nid, 0, ASN1_ITEM_ref(ASN1_IA5STRING), \
                        0,0,0,0, \
                        (X509V3_EXT_I2S)i2s_ASN1_IA5STRING, \
                        (X509V3_EXT_S2I)s2i_ASN1_IA5STRING, \
                        0,0,0,0, \
                        NULL}

#define EXT_UTF8STRING(nid) { nid, 0, ASN1_ITEM_ref(ASN1_UTF8STRING), \
                        0,0,0,0, \
                        (X509V3_EXT_I2S)i2s_ASN1_UTF8STRING, \
                        (X509V3_EXT_S2I)s2i_ASN1_UTF8STRING, \
                        0,0,0,0, \
                        NULL}

# define EXT_END { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}

/* X509_PURPOSE stuff */

# define EXFLAG_BCONS            0x1
# define EXFLAG_KUSAGE           0x2
# define EXFLAG_XKUSAGE          0x4
# define EXFLAG_NSCERT           0x8

# define EXFLAG_CA               0x10
# define EXFLAG_SI               0x20 /* self-issued, maybe not self-signed */
# define EXFLAG_V1               0x40
# define EXFLAG_INVALID          0x80
/* EXFLAG_SET is set to indicate that some values have been precomputed */
# define EXFLAG_SET              0x100
# define EXFLAG_CRITICAL         0x200
# define EXFLAG_PROXY            0x400

# define EXFLAG_INVALID_POLICY   0x800
# define EXFLAG_FRESHEST         0x1000
# define EXFLAG_SS               0x2000 /* cert is apparently self-signed */

# define EXFLAG_BCONS_CRITICAL   0x10000
# define EXFLAG_AKID_CRITICAL    0x20000
# define EXFLAG_SKID_CRITICAL    0x40000
# define EXFLAG_SAN_CRITICAL     0x80000
# define EXFLAG_NO_FINGERPRINT   0x100000

# define KU_DIGITAL_SIGNATURE    0x0080
# define KU_NON_REPUDIATION      0x0040
# define KU_KEY_ENCIPHERMENT     0x0020
# define KU_DATA_ENCIPHERMENT    0x0010
# define KU_KEY_AGREEMENT        0x0008
# define KU_KEY_CERT_SIGN        0x0004
# define KU_CRL_SIGN             0x0002
# define KU_ENCIPHER_ONLY        0x0001
# define KU_DECIPHER_ONLY        0x8000

# define NS_SSL_CLIENT           0x80
# define NS_SSL_SERVER           0x40
# define NS_SMIME                0x20
# define NS_OBJSIGN              0x10
# define NS_SSL_CA               0x04
# define NS_SMIME_CA             0x02
# define NS_OBJSIGN_CA           0x01
# define NS_ANY_CA               (NS_SSL_CA|NS_SMIME_CA|NS_OBJSIGN_CA)

# define XKU_SSL_SERVER          0x1
# define XKU_SSL_CLIENT          0x2
# define XKU_SMIME               0x4
# define XKU_CODE_SIGN           0x8
# define XKU_SGC                 0x10 /* Netscape or MS Server-Gated Crypto */
# define XKU_OCSP_SIGN           0x20
# define XKU_TIMESTAMP           0x40
# define XKU_DVCS                0x80
# define XKU_ANYEKU              0x100

# define X509_PURPOSE_DYNAMIC    0x1
# define X509_PURPOSE_DYNAMIC_NAME       0x2

typedef struct x509_purpose_st {
    int purpose;
    int trust;                  /* Default trust ID */
    int flags;
    int (*check_purpose) (const struct x509_purpose_st *, const X509 *, int);
    char *name;
    char *sname;
    void *usr_data;
} X509_PURPOSE;

SKM_DEFINE_STACK_OF_INTERNAL(X509_PURPOSE, X509_PURPOSE, X509_PURPOSE)
#define sk_X509_PURPOSE_num(sk) OPENSSL_sk_num(ossl_check_const_X509_PURPOSE_sk_type(sk))
#define sk_X509_PURPOSE_value(sk, idx) ((X509_PURPOSE *)OPENSSL_sk_value(ossl_check_const_X509_PURPOSE_sk_type(sk), (idx)))
#define sk_X509_PURPOSE_new(cmp) ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_new(ossl_check_X509_PURPOSE_compfunc_type(cmp)))
#define sk_X509_PURPOSE_new_null() ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_new_null())
#define sk_X509_PURPOSE_new_reserve(cmp, n) ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_new_reserve(ossl_check_X509_PURPOSE_compfunc_type(cmp), (n)))
#define sk_X509_PURPOSE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_PURPOSE_sk_type(sk), (n))
#define sk_X509_PURPOSE_free(sk) OPENSSL_sk_free(ossl_check_X509_PURPOSE_sk_type(sk))
#define sk_X509_PURPOSE_zero(sk) OPENSSL_sk_zero(ossl_check_X509_PURPOSE_sk_type(sk))
#define sk_X509_PURPOSE_delete(sk, i) ((X509_PURPOSE *)OPENSSL_sk_delete(ossl_check_X509_PURPOSE_sk_type(sk), (i)))
#define sk_X509_PURPOSE_delete_ptr(sk, ptr) ((X509_PURPOSE *)OPENSSL_sk_delete_ptr(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr)))
#define sk_X509_PURPOSE_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr))
#define sk_X509_PURPOSE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr))
#define sk_X509_PURPOSE_pop(sk) ((X509_PURPOSE *)OPENSSL_sk_pop(ossl_check_X509_PURPOSE_sk_type(sk)))
#define sk_X509_PURPOSE_shift(sk) ((X509_PURPOSE *)OPENSSL_sk_shift(ossl_check_X509_PURPOSE_sk_type(sk)))
#define sk_X509_PURPOSE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_PURPOSE_sk_type(sk),ossl_check_X509_PURPOSE_freefunc_type(freefunc))
#define sk_X509_PURPOSE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr), (idx))
#define sk_X509_PURPOSE_set(sk, idx, ptr) ((X509_PURPOSE *)OPENSSL_sk_set(ossl_check_X509_PURPOSE_sk_type(sk), (idx), ossl_check_X509_PURPOSE_type(ptr)))
#define sk_X509_PURPOSE_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr))
#define sk_X509_PURPOSE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr))
#define sk_X509_PURPOSE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr), pnum)
#define sk_X509_PURPOSE_sort(sk) OPENSSL_sk_sort(ossl_check_X509_PURPOSE_sk_type(sk))
#define sk_X509_PURPOSE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_PURPOSE_sk_type(sk))
#define sk_X509_PURPOSE_dup(sk) ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_dup(ossl_check_const_X509_PURPOSE_sk_type(sk)))
#define sk_X509_PURPOSE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_copyfunc_type(copyfunc), ossl_check_X509_PURPOSE_freefunc_type(freefunc)))
#define sk_X509_PURPOSE_set_cmp_func(sk, cmp) ((sk_X509_PURPOSE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_compfunc_type(cmp)))



# define X509_PURPOSE_SSL_CLIENT         1
# define X509_PURPOSE_SSL_SERVER         2
# define X509_PURPOSE_NS_SSL_SERVER      3
# define X509_PURPOSE_SMIME_SIGN         4
# define X509_PURPOSE_SMIME_ENCRYPT      5
# define X509_PURPOSE_CRL_SIGN           6
# define X509_PURPOSE_ANY                7
# define X509_PURPOSE_OCSP_HELPER        8
# define X509_PURPOSE_TIMESTAMP_SIGN     9

# define X509_PURPOSE_MIN                1
# define X509_PURPOSE_MAX                9

/* Flags for X509V3_EXT_print() */

# define X509V3_EXT_UNKNOWN_MASK         (0xfL << 16)
/* Return error for unknown extensions */
# define X509V3_EXT_DEFAULT              0
/* Print error for unknown extensions */
# define X509V3_EXT_ERROR_UNKNOWN        (1L << 16)
/* ASN1 parse unknown extensions */
# define X509V3_EXT_PARSE_UNKNOWN        (2L << 16)
/* BIO_dump unknown extensions */
# define X509V3_EXT_DUMP_UNKNOWN         (3L << 16)

/* Flags for X509V3_add1_i2d */

# define X509V3_ADD_OP_MASK              0xfL
# define X509V3_ADD_DEFAULT              0L
# define X509V3_ADD_APPEND               1L
# define X509V3_ADD_REPLACE              2L
# define X509V3_ADD_REPLACE_EXISTING     3L
# define X509V3_ADD_KEEP_EXISTING        4L
# define X509V3_ADD_DELETE               5L
# define X509V3_ADD_SILENT               0x10

DECLARE_ASN1_FUNCTIONS(BASIC_CONSTRAINTS)

DECLARE_ASN1_FUNCTIONS(SXNET)
DECLARE_ASN1_FUNCTIONS(SXNETID)

DECLARE_ASN1_FUNCTIONS(ISSUER_SIGN_TOOL)

int SXNET_add_id_asc(SXNET **psx, const char *zone, const char *user, int userlen);
int SXNET_add_id_ulong(SXNET **psx, unsigned long lzone, const char *user,
                       int userlen);
int SXNET_add_id_INTEGER(SXNET **psx, ASN1_INTEGER *izone, const char *user,
                         int userlen);

ASN1_OCTET_STRING *SXNET_get_id_asc(SXNET *sx, const char *zone);
ASN1_OCTET_STRING *SXNET_get_id_ulong(SXNET *sx, unsigned long lzone);
ASN1_OCTET_STRING *SXNET_get_id_INTEGER(SXNET *sx, ASN1_INTEGER *zone);

DECLARE_ASN1_FUNCTIONS(AUTHORITY_KEYID)

DECLARE_ASN1_FUNCTIONS(PKEY_USAGE_PERIOD)

DECLARE_ASN1_FUNCTIONS(GENERAL_NAME)
DECLARE_ASN1_DUP_FUNCTION(GENERAL_NAME)
int GENERAL_NAME_cmp(GENERAL_NAME *a, GENERAL_NAME *b);

ASN1_BIT_STRING *v2i_ASN1_BIT_STRING(X509V3_EXT_METHOD *method,
                                     X509V3_CTX *ctx,
                                     STACK_OF(CONF_VALUE) *nval);
STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING(X509V3_EXT_METHOD *method,
                                          ASN1_BIT_STRING *bits,
                                          STACK_OF(CONF_VALUE) *extlist);
char *i2s_ASN1_IA5STRING(X509V3_EXT_METHOD *method, ASN1_IA5STRING *ia5);
ASN1_IA5STRING *s2i_ASN1_IA5STRING(X509V3_EXT_METHOD *method,
                                   X509V3_CTX *ctx, const char *str);
char *i2s_ASN1_UTF8STRING(X509V3_EXT_METHOD *method, ASN1_UTF8STRING *utf8);
ASN1_UTF8STRING *s2i_ASN1_UTF8STRING(X509V3_EXT_METHOD *method,
                                   X509V3_CTX *ctx, const char *str);

STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method,
                                       GENERAL_NAME *gen,
                                       STACK_OF(CONF_VALUE) *ret);
int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen);

DECLARE_ASN1_FUNCTIONS(GENERAL_NAMES)

STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method,
                                        GENERAL_NAMES *gen,
                                        STACK_OF(CONF_VALUE) *extlist);
GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method,
                                 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval);

DECLARE_ASN1_FUNCTIONS(OTHERNAME)
DECLARE_ASN1_FUNCTIONS(EDIPARTYNAME)
int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b);
void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value);
void *GENERAL_NAME_get0_value(const GENERAL_NAME *a, int *ptype);
int GENERAL_NAME_set0_othername(GENERAL_NAME *gen,
                                ASN1_OBJECT *oid, ASN1_TYPE *value);
int GENERAL_NAME_get0_otherName(const GENERAL_NAME *gen,
                                ASN1_OBJECT **poid, ASN1_TYPE **pvalue);

char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method,
                            const ASN1_OCTET_STRING *ia5);
ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method,
                                         X509V3_CTX *ctx, const char *str);

DECLARE_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE)
int i2a_ACCESS_DESCRIPTION(BIO *bp, const ACCESS_DESCRIPTION *a);

DECLARE_ASN1_ALLOC_FUNCTIONS(TLS_FEATURE)

DECLARE_ASN1_FUNCTIONS(CERTIFICATEPOLICIES)
DECLARE_ASN1_FUNCTIONS(POLICYINFO)
DECLARE_ASN1_FUNCTIONS(POLICYQUALINFO)
DECLARE_ASN1_FUNCTIONS(USERNOTICE)
DECLARE_ASN1_FUNCTIONS(NOTICEREF)

DECLARE_ASN1_FUNCTIONS(CRL_DIST_POINTS)
DECLARE_ASN1_FUNCTIONS(DIST_POINT)
DECLARE_ASN1_FUNCTIONS(DIST_POINT_NAME)
DECLARE_ASN1_FUNCTIONS(ISSUING_DIST_POINT)

int DIST_POINT_set_dpname(DIST_POINT_NAME *dpn, const X509_NAME *iname);

int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc);
int NAME_CONSTRAINTS_check_CN(X509 *x, NAME_CONSTRAINTS *nc);

DECLARE_ASN1_FUNCTIONS(ACCESS_DESCRIPTION)
DECLARE_ASN1_FUNCTIONS(AUTHORITY_INFO_ACCESS)

DECLARE_ASN1_ITEM(POLICY_MAPPING)
DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_MAPPING)
DECLARE_ASN1_ITEM(POLICY_MAPPINGS)

DECLARE_ASN1_ITEM(GENERAL_SUBTREE)
DECLARE_ASN1_ALLOC_FUNCTIONS(GENERAL_SUBTREE)

DECLARE_ASN1_ITEM(NAME_CONSTRAINTS)
DECLARE_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS)

DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_CONSTRAINTS)
DECLARE_ASN1_ITEM(POLICY_CONSTRAINTS)

GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out,
                               const X509V3_EXT_METHOD *method,
                               X509V3_CTX *ctx, int gen_type,
                               const char *value, int is_nc);

# ifdef OPENSSL_CONF_H
GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method,
                               X509V3_CTX *ctx, CONF_VALUE *cnf);
GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out,
                                  const X509V3_EXT_METHOD *method,
                                  X509V3_CTX *ctx, CONF_VALUE *cnf,
                                  int is_nc);

void X509V3_conf_free(CONF_VALUE *val);

X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid,
                                     const char *value);
X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, const char *name,
                                 const char *value);
int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, const char *section,
                            STACK_OF(X509_EXTENSION) **sk);
int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section,
                         X509 *cert);
int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section,
                             X509_REQ *req);
int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section,
                             X509_CRL *crl);

X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf,
                                    X509V3_CTX *ctx, int ext_nid,
                                    const char *value);
X509_EXTENSION *X509V3_EXT_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
                                const char *name, const char *value);
int X509V3_EXT_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
                        const char *section, X509 *cert);
int X509V3_EXT_REQ_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
                            const char *section, X509_REQ *req);
int X509V3_EXT_CRL_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
                            const char *section, X509_CRL *crl);

int X509V3_add_value_bool_nf(const char *name, int asn1_bool,
                             STACK_OF(CONF_VALUE) **extlist);
int X509V3_get_value_bool(const CONF_VALUE *value, int *asn1_bool);
int X509V3_get_value_int(const CONF_VALUE *value, ASN1_INTEGER **aint);
void X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf);
void X509V3_set_conf_lhash(X509V3_CTX *ctx, LHASH_OF(CONF_VALUE) *lhash);
# endif

char *X509V3_get_string(X509V3_CTX *ctx, const char *name, const char *section);
STACK_OF(CONF_VALUE) *X509V3_get_section(X509V3_CTX *ctx, const char *section);
void X509V3_string_free(X509V3_CTX *ctx, char *str);
void X509V3_section_free(X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section);
void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subject,
                    X509_REQ *req, X509_CRL *crl, int flags);
/* For API backward compatibility, this is separate from X509V3_set_ctx(): */
int X509V3_set_issuer_pkey(X509V3_CTX *ctx, EVP_PKEY *pkey);

int X509V3_add_value(const char *name, const char *value,
                     STACK_OF(CONF_VALUE) **extlist);
int X509V3_add_value_uchar(const char *name, const unsigned char *value,
                           STACK_OF(CONF_VALUE) **extlist);
int X509V3_add_value_bool(const char *name, int asn1_bool,
                          STACK_OF(CONF_VALUE) **extlist);
int X509V3_add_value_int(const char *name, const ASN1_INTEGER *aint,
                         STACK_OF(CONF_VALUE) **extlist);
char *i2s_ASN1_INTEGER(X509V3_EXT_METHOD *meth, const ASN1_INTEGER *aint);
ASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *meth, const char *value);
char *i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *meth, const ASN1_ENUMERATED *aint);
char *i2s_ASN1_ENUMERATED_TABLE(X509V3_EXT_METHOD *meth,
                                const ASN1_ENUMERATED *aint);
int X509V3_EXT_add(X509V3_EXT_METHOD *ext);
int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist);
int X509V3_EXT_add_alias(int nid_to, int nid_from);
void X509V3_EXT_cleanup(void);

const X509V3_EXT_METHOD *X509V3_EXT_get(X509_EXTENSION *ext);
const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid);
int X509V3_add_standard_extensions(void);
STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line);
void *X509V3_EXT_d2i(X509_EXTENSION *ext);
void *X509V3_get_d2i(const STACK_OF(X509_EXTENSION) *x, int nid, int *crit,
                     int *idx);

X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc);
int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value,
                    int crit, unsigned long flags);

#ifndef OPENSSL_NO_DEPRECATED_1_1_0
/* The new declarations are in crypto.h, but the old ones were here. */
# define hex_to_string OPENSSL_buf2hexstr
# define string_to_hex OPENSSL_hexstr2buf
#endif

void X509V3_EXT_val_prn(BIO *out, STACK_OF(CONF_VALUE) *val, int indent,
                        int ml);
int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, unsigned long flag,
                     int indent);
#ifndef OPENSSL_NO_STDIO
int X509V3_EXT_print_fp(FILE *out, X509_EXTENSION *ext, int flag, int indent);
#endif
int X509V3_extensions_print(BIO *out, const char *title,
                            const STACK_OF(X509_EXTENSION) *exts,
                            unsigned long flag, int indent);

int X509_check_ca(X509 *x);
int X509_check_purpose(X509 *x, int id, int ca);
int X509_supported_extension(X509_EXTENSION *ex);
int X509_PURPOSE_set(int *p, int purpose);
int X509_check_issued(X509 *issuer, X509 *subject);
int X509_check_akid(const X509 *issuer, const AUTHORITY_KEYID *akid);
void X509_set_proxy_flag(X509 *x);
void X509_set_proxy_pathlen(X509 *x, long l);
long X509_get_proxy_pathlen(X509 *x);

uint32_t X509_get_extension_flags(X509 *x);
uint32_t X509_get_key_usage(X509 *x);
uint32_t X509_get_extended_key_usage(X509 *x);
const ASN1_OCTET_STRING *X509_get0_subject_key_id(X509 *x);
const ASN1_OCTET_STRING *X509_get0_authority_key_id(X509 *x);
const GENERAL_NAMES *X509_get0_authority_issuer(X509 *x);
const ASN1_INTEGER *X509_get0_authority_serial(X509 *x);

int X509_PURPOSE_get_count(void);
X509_PURPOSE *X509_PURPOSE_get0(int idx);
int X509_PURPOSE_get_by_sname(const char *sname);
int X509_PURPOSE_get_by_id(int id);
int X509_PURPOSE_add(int id, int trust, int flags,
                     int (*ck) (const X509_PURPOSE *, const X509 *, int),
                     const char *name, const char *sname, void *arg);
char *X509_PURPOSE_get0_name(const X509_PURPOSE *xp);
char *X509_PURPOSE_get0_sname(const X509_PURPOSE *xp);
int X509_PURPOSE_get_trust(const X509_PURPOSE *xp);
void X509_PURPOSE_cleanup(void);
int X509_PURPOSE_get_id(const X509_PURPOSE *);

STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x);
STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x);
void X509_email_free(STACK_OF(OPENSSL_STRING) *sk);
STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x);
/* Flags for X509_check_* functions */

/*
 * Always check subject name for host match even if subject alt names present
 */
# define X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT    0x1
/* Disable wildcard matching for dnsName fields and common name. */
# define X509_CHECK_FLAG_NO_WILDCARDS    0x2
/* Wildcards must not match a partial label. */
# define X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS 0x4
/* Allow (non-partial) wildcards to match multiple labels. */
# define X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS 0x8
/* Constraint verifier subdomain patterns to match a single labels. */
# define X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS 0x10
/* Never check the subject CN */
# define X509_CHECK_FLAG_NEVER_CHECK_SUBJECT    0x20
/*
 * Match reference identifiers starting with "." to any sub-domain.
 * This is a non-public flag, turned on implicitly when the subject
 * reference identity is a DNS name.
 */
# define _X509_CHECK_FLAG_DOT_SUBDOMAINS 0x8000

int X509_check_host(X509 *x, const char *chk, size_t chklen,
                    unsigned int flags, char **peername);
int X509_check_email(X509 *x, const char *chk, size_t chklen,
                     unsigned int flags);
int X509_check_ip(X509 *x, const unsigned char *chk, size_t chklen,
                  unsigned int flags);
int X509_check_ip_asc(X509 *x, const char *ipasc, unsigned int flags);

ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc);
ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc);
int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE) *dn_sk,
                             unsigned long chtype);

void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node, int indent);
SKM_DEFINE_STACK_OF_INTERNAL(X509_POLICY_NODE, X509_POLICY_NODE, X509_POLICY_NODE)
#define sk_X509_POLICY_NODE_num(sk) OPENSSL_sk_num(ossl_check_const_X509_POLICY_NODE_sk_type(sk))
#define sk_X509_POLICY_NODE_value(sk, idx) ((X509_POLICY_NODE *)OPENSSL_sk_value(ossl_check_const_X509_POLICY_NODE_sk_type(sk), (idx)))
#define sk_X509_POLICY_NODE_new(cmp) ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_new(ossl_check_X509_POLICY_NODE_compfunc_type(cmp)))
#define sk_X509_POLICY_NODE_new_null() ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_new_null())
#define sk_X509_POLICY_NODE_new_reserve(cmp, n) ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_new_reserve(ossl_check_X509_POLICY_NODE_compfunc_type(cmp), (n)))
#define sk_X509_POLICY_NODE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_POLICY_NODE_sk_type(sk), (n))
#define sk_X509_POLICY_NODE_free(sk) OPENSSL_sk_free(ossl_check_X509_POLICY_NODE_sk_type(sk))
#define sk_X509_POLICY_NODE_zero(sk) OPENSSL_sk_zero(ossl_check_X509_POLICY_NODE_sk_type(sk))
#define sk_X509_POLICY_NODE_delete(sk, i) ((X509_POLICY_NODE *)OPENSSL_sk_delete(ossl_check_X509_POLICY_NODE_sk_type(sk), (i)))
#define sk_X509_POLICY_NODE_delete_ptr(sk, ptr) ((X509_POLICY_NODE *)OPENSSL_sk_delete_ptr(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr)))
#define sk_X509_POLICY_NODE_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr))
#define sk_X509_POLICY_NODE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr))
#define sk_X509_POLICY_NODE_pop(sk) ((X509_POLICY_NODE *)OPENSSL_sk_pop(ossl_check_X509_POLICY_NODE_sk_type(sk)))
#define sk_X509_POLICY_NODE_shift(sk) ((X509_POLICY_NODE *)OPENSSL_sk_shift(ossl_check_X509_POLICY_NODE_sk_type(sk)))
#define sk_X509_POLICY_NODE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_POLICY_NODE_sk_type(sk),ossl_check_X509_POLICY_NODE_freefunc_type(freefunc))
#define sk_X509_POLICY_NODE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr), (idx))
#define sk_X509_POLICY_NODE_set(sk, idx, ptr) ((X509_POLICY_NODE *)OPENSSL_sk_set(ossl_check_X509_POLICY_NODE_sk_type(sk), (idx), ossl_check_X509_POLICY_NODE_type(ptr)))
#define sk_X509_POLICY_NODE_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr))
#define sk_X509_POLICY_NODE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr))
#define sk_X509_POLICY_NODE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr), pnum)
#define sk_X509_POLICY_NODE_sort(sk) OPENSSL_sk_sort(ossl_check_X509_POLICY_NODE_sk_type(sk))
#define sk_X509_POLICY_NODE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_POLICY_NODE_sk_type(sk))
#define sk_X509_POLICY_NODE_dup(sk) ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_dup(ossl_check_const_X509_POLICY_NODE_sk_type(sk)))
#define sk_X509_POLICY_NODE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_copyfunc_type(copyfunc), ossl_check_X509_POLICY_NODE_freefunc_type(freefunc)))
#define sk_X509_POLICY_NODE_set_cmp_func(sk, cmp) ((sk_X509_POLICY_NODE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_compfunc_type(cmp)))



#ifndef OPENSSL_NO_RFC3779
typedef struct ASRange_st {
    ASN1_INTEGER *min, *max;
} ASRange;

# define ASIdOrRange_id          0
# define ASIdOrRange_range       1

typedef struct ASIdOrRange_st {
    int type;
    union {
        ASN1_INTEGER *id;
        ASRange *range;
    } u;
} ASIdOrRange;

SKM_DEFINE_STACK_OF_INTERNAL(ASIdOrRange, ASIdOrRange, ASIdOrRange)
#define sk_ASIdOrRange_num(sk) OPENSSL_sk_num(ossl_check_const_ASIdOrRange_sk_type(sk))
#define sk_ASIdOrRange_value(sk, idx) ((ASIdOrRange *)OPENSSL_sk_value(ossl_check_const_ASIdOrRange_sk_type(sk), (idx)))
#define sk_ASIdOrRange_new(cmp) ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_new(ossl_check_ASIdOrRange_compfunc_type(cmp)))
#define sk_ASIdOrRange_new_null() ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_new_null())
#define sk_ASIdOrRange_new_reserve(cmp, n) ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_new_reserve(ossl_check_ASIdOrRange_compfunc_type(cmp), (n)))
#define sk_ASIdOrRange_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASIdOrRange_sk_type(sk), (n))
#define sk_ASIdOrRange_free(sk) OPENSSL_sk_free(ossl_check_ASIdOrRange_sk_type(sk))
#define sk_ASIdOrRange_zero(sk) OPENSSL_sk_zero(ossl_check_ASIdOrRange_sk_type(sk))
#define sk_ASIdOrRange_delete(sk, i) ((ASIdOrRange *)OPENSSL_sk_delete(ossl_check_ASIdOrRange_sk_type(sk), (i)))
#define sk_ASIdOrRange_delete_ptr(sk, ptr) ((ASIdOrRange *)OPENSSL_sk_delete_ptr(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr)))
#define sk_ASIdOrRange_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr))
#define sk_ASIdOrRange_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr))
#define sk_ASIdOrRange_pop(sk) ((ASIdOrRange *)OPENSSL_sk_pop(ossl_check_ASIdOrRange_sk_type(sk)))
#define sk_ASIdOrRange_shift(sk) ((ASIdOrRange *)OPENSSL_sk_shift(ossl_check_ASIdOrRange_sk_type(sk)))
#define sk_ASIdOrRange_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASIdOrRange_sk_type(sk),ossl_check_ASIdOrRange_freefunc_type(freefunc))
#define sk_ASIdOrRange_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr), (idx))
#define sk_ASIdOrRange_set(sk, idx, ptr) ((ASIdOrRange *)OPENSSL_sk_set(ossl_check_ASIdOrRange_sk_type(sk), (idx), ossl_check_ASIdOrRange_type(ptr)))
#define sk_ASIdOrRange_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr))
#define sk_ASIdOrRange_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr))
#define sk_ASIdOrRange_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr), pnum)
#define sk_ASIdOrRange_sort(sk) OPENSSL_sk_sort(ossl_check_ASIdOrRange_sk_type(sk))
#define sk_ASIdOrRange_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASIdOrRange_sk_type(sk))
#define sk_ASIdOrRange_dup(sk) ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_dup(ossl_check_const_ASIdOrRange_sk_type(sk)))
#define sk_ASIdOrRange_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_deep_copy(ossl_check_const_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_copyfunc_type(copyfunc), ossl_check_ASIdOrRange_freefunc_type(freefunc)))
#define sk_ASIdOrRange_set_cmp_func(sk, cmp) ((sk_ASIdOrRange_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_compfunc_type(cmp)))


typedef STACK_OF(ASIdOrRange) ASIdOrRanges;

# define ASIdentifierChoice_inherit              0
# define ASIdentifierChoice_asIdsOrRanges        1

typedef struct ASIdentifierChoice_st {
    int type;
    union {
        ASN1_NULL *inherit;
        ASIdOrRanges *asIdsOrRanges;
    } u;
} ASIdentifierChoice;

typedef struct ASIdentifiers_st {
    ASIdentifierChoice *asnum, *rdi;
} ASIdentifiers;

DECLARE_ASN1_FUNCTIONS(ASRange)
DECLARE_ASN1_FUNCTIONS(ASIdOrRange)
DECLARE_ASN1_FUNCTIONS(ASIdentifierChoice)
DECLARE_ASN1_FUNCTIONS(ASIdentifiers)

typedef struct IPAddressRange_st {
    ASN1_BIT_STRING *min, *max;
} IPAddressRange;

# define IPAddressOrRange_addressPrefix  0
# define IPAddressOrRange_addressRange   1

typedef struct IPAddressOrRange_st {
    int type;
    union {
        ASN1_BIT_STRING *addressPrefix;
        IPAddressRange *addressRange;
    } u;
} IPAddressOrRange;

SKM_DEFINE_STACK_OF_INTERNAL(IPAddressOrRange, IPAddressOrRange, IPAddressOrRange)
#define sk_IPAddressOrRange_num(sk) OPENSSL_sk_num(ossl_check_const_IPAddressOrRange_sk_type(sk))
#define sk_IPAddressOrRange_value(sk, idx) ((IPAddressOrRange *)OPENSSL_sk_value(ossl_check_const_IPAddressOrRange_sk_type(sk), (idx)))
#define sk_IPAddressOrRange_new(cmp) ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_new(ossl_check_IPAddressOrRange_compfunc_type(cmp)))
#define sk_IPAddressOrRange_new_null() ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_new_null())
#define sk_IPAddressOrRange_new_reserve(cmp, n) ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_new_reserve(ossl_check_IPAddressOrRange_compfunc_type(cmp), (n)))
#define sk_IPAddressOrRange_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_IPAddressOrRange_sk_type(sk), (n))
#define sk_IPAddressOrRange_free(sk) OPENSSL_sk_free(ossl_check_IPAddressOrRange_sk_type(sk))
#define sk_IPAddressOrRange_zero(sk) OPENSSL_sk_zero(ossl_check_IPAddressOrRange_sk_type(sk))
#define sk_IPAddressOrRange_delete(sk, i) ((IPAddressOrRange *)OPENSSL_sk_delete(ossl_check_IPAddressOrRange_sk_type(sk), (i)))
#define sk_IPAddressOrRange_delete_ptr(sk, ptr) ((IPAddressOrRange *)OPENSSL_sk_delete_ptr(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr)))
#define sk_IPAddressOrRange_push(sk, ptr) OPENSSL_sk_push(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr))
#define sk_IPAddressOrRange_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr))
#define sk_IPAddressOrRange_pop(sk) ((IPAddressOrRange *)OPENSSL_sk_pop(ossl_check_IPAddressOrRange_sk_type(sk)))
#define sk_IPAddressOrRange_shift(sk) ((IPAddressOrRange *)OPENSSL_sk_shift(ossl_check_IPAddressOrRange_sk_type(sk)))
#define sk_IPAddressOrRange_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_IPAddressOrRange_sk_type(sk),ossl_check_IPAddressOrRange_freefunc_type(freefunc))
#define sk_IPAddressOrRange_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr), (idx))
#define sk_IPAddressOrRange_set(sk, idx, ptr) ((IPAddressOrRange *)OPENSSL_sk_set(ossl_check_IPAddressOrRange_sk_type(sk), (idx), ossl_check_IPAddressOrRange_type(ptr)))
#define sk_IPAddressOrRange_find(sk, ptr) OPENSSL_sk_find(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr))
#define sk_IPAddressOrRange_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr))
#define sk_IPAddressOrRange_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr), pnum)
#define sk_IPAddressOrRange_sort(sk) OPENSSL_sk_sort(ossl_check_IPAddressOrRange_sk_type(sk))
#define sk_IPAddressOrRange_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_IPAddressOrRange_sk_type(sk))
#define sk_IPAddressOrRange_dup(sk) ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_dup(ossl_check_const_IPAddressOrRange_sk_type(sk)))
#define sk_IPAddressOrRange_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_deep_copy(ossl_check_const_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_copyfunc_type(copyfunc), ossl_check_IPAddressOrRange_freefunc_type(freefunc)))
#define sk_IPAddressOrRange_set_cmp_func(sk, cmp) ((sk_IPAddressOrRange_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_compfunc_type(cmp)))


typedef STACK_OF(IPAddressOrRange) IPAddressOrRanges;

# define IPAddressChoice_inherit                 0
# define IPAddressChoice_addressesOrRanges       1

typedef struct IPAddressChoice_st {
    int type;
    union {
        ASN1_NULL *inherit;
        IPAddressOrRanges *addressesOrRanges;
    } u;
} IPAddressChoice;

typedef struct IPAddressFamily_st {
    ASN1_OCTET_STRING *addressFamily;
    IPAddressChoice *ipAddressChoice;
} IPAddressFamily;

SKM_DEFINE_STACK_OF_INTERNAL(IPAddressFamily, IPAddressFamily, IPAddressFamily)
#define sk_IPAddressFamily_num(sk) OPENSSL_sk_num(ossl_check_const_IPAddressFamily_sk_type(sk))
#define sk_IPAddressFamily_value(sk, idx) ((IPAddressFamily *)OPENSSL_sk_value(ossl_check_const_IPAddressFamily_sk_type(sk), (idx)))
#define sk_IPAddressFamily_new(cmp) ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_new(ossl_check_IPAddressFamily_compfunc_type(cmp)))
#define sk_IPAddressFamily_new_null() ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_new_null())
#define sk_IPAddressFamily_new_reserve(cmp, n) ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_new_reserve(ossl_check_IPAddressFamily_compfunc_type(cmp), (n)))
#define sk_IPAddressFamily_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_IPAddressFamily_sk_type(sk), (n))
#define sk_IPAddressFamily_free(sk) OPENSSL_sk_free(ossl_check_IPAddressFamily_sk_type(sk))
#define sk_IPAddressFamily_zero(sk) OPENSSL_sk_zero(ossl_check_IPAddressFamily_sk_type(sk))
#define sk_IPAddressFamily_delete(sk, i) ((IPAddressFamily *)OPENSSL_sk_delete(ossl_check_IPAddressFamily_sk_type(sk), (i)))
#define sk_IPAddressFamily_delete_ptr(sk, ptr) ((IPAddressFamily *)OPENSSL_sk_delete_ptr(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr)))
#define sk_IPAddressFamily_push(sk, ptr) OPENSSL_sk_push(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr))
#define sk_IPAddressFamily_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr))
#define sk_IPAddressFamily_pop(sk) ((IPAddressFamily *)OPENSSL_sk_pop(ossl_check_IPAddressFamily_sk_type(sk)))
#define sk_IPAddressFamily_shift(sk) ((IPAddressFamily *)OPENSSL_sk_shift(ossl_check_IPAddressFamily_sk_type(sk)))
#define sk_IPAddressFamily_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_IPAddressFamily_sk_type(sk),ossl_check_IPAddressFamily_freefunc_type(freefunc))
#define sk_IPAddressFamily_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr), (idx))
#define sk_IPAddressFamily_set(sk, idx, ptr) ((IPAddressFamily *)OPENSSL_sk_set(ossl_check_IPAddressFamily_sk_type(sk), (idx), ossl_check_IPAddressFamily_type(ptr)))
#define sk_IPAddressFamily_find(sk, ptr) OPENSSL_sk_find(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr))
#define sk_IPAddressFamily_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr))
#define sk_IPAddressFamily_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr), pnum)
#define sk_IPAddressFamily_sort(sk) OPENSSL_sk_sort(ossl_check_IPAddressFamily_sk_type(sk))
#define sk_IPAddressFamily_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_IPAddressFamily_sk_type(sk))
#define sk_IPAddressFamily_dup(sk) ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_dup(ossl_check_const_IPAddressFamily_sk_type(sk)))
#define sk_IPAddressFamily_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_deep_copy(ossl_check_const_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_copyfunc_type(copyfunc), ossl_check_IPAddressFamily_freefunc_type(freefunc)))
#define sk_IPAddressFamily_set_cmp_func(sk, cmp) ((sk_IPAddressFamily_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_compfunc_type(cmp)))



typedef STACK_OF(IPAddressFamily) IPAddrBlocks;

DECLARE_ASN1_FUNCTIONS(IPAddressRange)
DECLARE_ASN1_FUNCTIONS(IPAddressOrRange)
DECLARE_ASN1_FUNCTIONS(IPAddressChoice)
DECLARE_ASN1_FUNCTIONS(IPAddressFamily)

/*
 * API tag for elements of the ASIdentifer SEQUENCE.
 */
# define V3_ASID_ASNUM   0
# define V3_ASID_RDI     1

/*
 * AFI values, assigned by IANA.  It'd be nice to make the AFI
 * handling code totally generic, but there are too many little things
 * that would need to be defined for other address families for it to
 * be worth the trouble.
 */
# define IANA_AFI_IPV4   1
# define IANA_AFI_IPV6   2

/*
 * Utilities to construct and extract values from RFC3779 extensions,
 * since some of the encodings (particularly for IP address prefixes
 * and ranges) are a bit tedious to work with directly.
 */
int X509v3_asid_add_inherit(ASIdentifiers *asid, int which);
int X509v3_asid_add_id_or_range(ASIdentifiers *asid, int which,
                                ASN1_INTEGER *min, ASN1_INTEGER *max);
int X509v3_addr_add_inherit(IPAddrBlocks *addr,
                            const unsigned afi, const unsigned *safi);
int X509v3_addr_add_prefix(IPAddrBlocks *addr,
                           const unsigned afi, const unsigned *safi,
                           unsigned char *a, const int prefixlen);
int X509v3_addr_add_range(IPAddrBlocks *addr,
                          const unsigned afi, const unsigned *safi,
                          unsigned char *min, unsigned char *max);
unsigned X509v3_addr_get_afi(const IPAddressFamily *f);
int X509v3_addr_get_range(IPAddressOrRange *aor, const unsigned afi,
                          unsigned char *min, unsigned char *max,
                          const int length);

/*
 * Canonical forms.
 */
int X509v3_asid_is_canonical(ASIdentifiers *asid);
int X509v3_addr_is_canonical(IPAddrBlocks *addr);
int X509v3_asid_canonize(ASIdentifiers *asid);
int X509v3_addr_canonize(IPAddrBlocks *addr);

/*
 * Tests for inheritance and containment.
 */
int X509v3_asid_inherits(ASIdentifiers *asid);
int X509v3_addr_inherits(IPAddrBlocks *addr);
int X509v3_asid_subset(ASIdentifiers *a, ASIdentifiers *b);
int X509v3_addr_subset(IPAddrBlocks *a, IPAddrBlocks *b);

/*
 * Check whether RFC 3779 extensions nest properly in chains.
 */
int X509v3_asid_validate_path(X509_STORE_CTX *);
int X509v3_addr_validate_path(X509_STORE_CTX *);
int X509v3_asid_validate_resource_set(STACK_OF(X509) *chain,
                                      ASIdentifiers *ext,
                                      int allow_inheritance);
int X509v3_addr_validate_resource_set(STACK_OF(X509) *chain,
                                      IPAddrBlocks *ext, int allow_inheritance);

#endif                         /* OPENSSL_NO_RFC3779 */

SKM_DEFINE_STACK_OF_INTERNAL(ASN1_STRING, ASN1_STRING, ASN1_STRING)
#define sk_ASN1_STRING_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_STRING_sk_type(sk))
#define sk_ASN1_STRING_value(sk, idx) ((ASN1_STRING *)OPENSSL_sk_value(ossl_check_const_ASN1_STRING_sk_type(sk), (idx)))
#define sk_ASN1_STRING_new(cmp) ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_new(ossl_check_ASN1_STRING_compfunc_type(cmp)))
#define sk_ASN1_STRING_new_null() ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_new_null())
#define sk_ASN1_STRING_new_reserve(cmp, n) ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_STRING_compfunc_type(cmp), (n)))
#define sk_ASN1_STRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_STRING_sk_type(sk), (n))
#define sk_ASN1_STRING_free(sk) OPENSSL_sk_free(ossl_check_ASN1_STRING_sk_type(sk))
#define sk_ASN1_STRING_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_STRING_sk_type(sk))
#define sk_ASN1_STRING_delete(sk, i) ((ASN1_STRING *)OPENSSL_sk_delete(ossl_check_ASN1_STRING_sk_type(sk), (i)))
#define sk_ASN1_STRING_delete_ptr(sk, ptr) ((ASN1_STRING *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr)))
#define sk_ASN1_STRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr))
#define sk_ASN1_STRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr))
#define sk_ASN1_STRING_pop(sk) ((ASN1_STRING *)OPENSSL_sk_pop(ossl_check_ASN1_STRING_sk_type(sk)))
#define sk_ASN1_STRING_shift(sk) ((ASN1_STRING *)OPENSSL_sk_shift(ossl_check_ASN1_STRING_sk_type(sk)))
#define sk_ASN1_STRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_STRING_sk_type(sk),ossl_check_ASN1_STRING_freefunc_type(freefunc))
#define sk_ASN1_STRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr), (idx))
#define sk_ASN1_STRING_set(sk, idx, ptr) ((ASN1_STRING *)OPENSSL_sk_set(ossl_check_ASN1_STRING_sk_type(sk), (idx), ossl_check_ASN1_STRING_type(ptr)))
#define sk_ASN1_STRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr))
#define sk_ASN1_STRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr))
#define sk_ASN1_STRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr), pnum)
#define sk_ASN1_STRING_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_STRING_sk_type(sk))
#define sk_ASN1_STRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_STRING_sk_type(sk))
#define sk_ASN1_STRING_dup(sk) ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_dup(ossl_check_const_ASN1_STRING_sk_type(sk)))
#define sk_ASN1_STRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_copyfunc_type(copyfunc), ossl_check_ASN1_STRING_freefunc_type(freefunc)))
#define sk_ASN1_STRING_set_cmp_func(sk, cmp) ((sk_ASN1_STRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_compfunc_type(cmp)))


/*
 * Admission Syntax
 */
typedef struct NamingAuthority_st NAMING_AUTHORITY;
typedef struct ProfessionInfo_st PROFESSION_INFO;
typedef struct Admissions_st ADMISSIONS;
typedef struct AdmissionSyntax_st ADMISSION_SYNTAX;
DECLARE_ASN1_FUNCTIONS(NAMING_AUTHORITY)
DECLARE_ASN1_FUNCTIONS(PROFESSION_INFO)
DECLARE_ASN1_FUNCTIONS(ADMISSIONS)
DECLARE_ASN1_FUNCTIONS(ADMISSION_SYNTAX)
SKM_DEFINE_STACK_OF_INTERNAL(PROFESSION_INFO, PROFESSION_INFO, PROFESSION_INFO)
#define sk_PROFESSION_INFO_num(sk) OPENSSL_sk_num(ossl_check_const_PROFESSION_INFO_sk_type(sk))
#define sk_PROFESSION_INFO_value(sk, idx) ((PROFESSION_INFO *)OPENSSL_sk_value(ossl_check_const_PROFESSION_INFO_sk_type(sk), (idx)))
#define sk_PROFESSION_INFO_new(cmp) ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_new(ossl_check_PROFESSION_INFO_compfunc_type(cmp)))
#define sk_PROFESSION_INFO_new_null() ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_new_null())
#define sk_PROFESSION_INFO_new_reserve(cmp, n) ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_new_reserve(ossl_check_PROFESSION_INFO_compfunc_type(cmp), (n)))
#define sk_PROFESSION_INFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_PROFESSION_INFO_sk_type(sk), (n))
#define sk_PROFESSION_INFO_free(sk) OPENSSL_sk_free(ossl_check_PROFESSION_INFO_sk_type(sk))
#define sk_PROFESSION_INFO_zero(sk) OPENSSL_sk_zero(ossl_check_PROFESSION_INFO_sk_type(sk))
#define sk_PROFESSION_INFO_delete(sk, i) ((PROFESSION_INFO *)OPENSSL_sk_delete(ossl_check_PROFESSION_INFO_sk_type(sk), (i)))
#define sk_PROFESSION_INFO_delete_ptr(sk, ptr) ((PROFESSION_INFO *)OPENSSL_sk_delete_ptr(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr)))
#define sk_PROFESSION_INFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr))
#define sk_PROFESSION_INFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr))
#define sk_PROFESSION_INFO_pop(sk) ((PROFESSION_INFO *)OPENSSL_sk_pop(ossl_check_PROFESSION_INFO_sk_type(sk)))
#define sk_PROFESSION_INFO_shift(sk) ((PROFESSION_INFO *)OPENSSL_sk_shift(ossl_check_PROFESSION_INFO_sk_type(sk)))
#define sk_PROFESSION_INFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_PROFESSION_INFO_sk_type(sk),ossl_check_PROFESSION_INFO_freefunc_type(freefunc))
#define sk_PROFESSION_INFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr), (idx))
#define sk_PROFESSION_INFO_set(sk, idx, ptr) ((PROFESSION_INFO *)OPENSSL_sk_set(ossl_check_PROFESSION_INFO_sk_type(sk), (idx), ossl_check_PROFESSION_INFO_type(ptr)))
#define sk_PROFESSION_INFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr))
#define sk_PROFESSION_INFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr))
#define sk_PROFESSION_INFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr), pnum)
#define sk_PROFESSION_INFO_sort(sk) OPENSSL_sk_sort(ossl_check_PROFESSION_INFO_sk_type(sk))
#define sk_PROFESSION_INFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_PROFESSION_INFO_sk_type(sk))
#define sk_PROFESSION_INFO_dup(sk) ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_dup(ossl_check_const_PROFESSION_INFO_sk_type(sk)))
#define sk_PROFESSION_INFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_deep_copy(ossl_check_const_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_copyfunc_type(copyfunc), ossl_check_PROFESSION_INFO_freefunc_type(freefunc)))
#define sk_PROFESSION_INFO_set_cmp_func(sk, cmp) ((sk_PROFESSION_INFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_compfunc_type(cmp)))
SKM_DEFINE_STACK_OF_INTERNAL(ADMISSIONS, ADMISSIONS, ADMISSIONS)
#define sk_ADMISSIONS_num(sk) OPENSSL_sk_num(ossl_check_const_ADMISSIONS_sk_type(sk))
#define sk_ADMISSIONS_value(sk, idx) ((ADMISSIONS *)OPENSSL_sk_value(ossl_check_const_ADMISSIONS_sk_type(sk), (idx)))
#define sk_ADMISSIONS_new(cmp) ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_new(ossl_check_ADMISSIONS_compfunc_type(cmp)))
#define sk_ADMISSIONS_new_null() ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_new_null())
#define sk_ADMISSIONS_new_reserve(cmp, n) ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_new_reserve(ossl_check_ADMISSIONS_compfunc_type(cmp), (n)))
#define sk_ADMISSIONS_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ADMISSIONS_sk_type(sk), (n))
#define sk_ADMISSIONS_free(sk) OPENSSL_sk_free(ossl_check_ADMISSIONS_sk_type(sk))
#define sk_ADMISSIONS_zero(sk) OPENSSL_sk_zero(ossl_check_ADMISSIONS_sk_type(sk))
#define sk_ADMISSIONS_delete(sk, i) ((ADMISSIONS *)OPENSSL_sk_delete(ossl_check_ADMISSIONS_sk_type(sk), (i)))
#define sk_ADMISSIONS_delete_ptr(sk, ptr) ((ADMISSIONS *)OPENSSL_sk_delete_ptr(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr)))
#define sk_ADMISSIONS_push(sk, ptr) OPENSSL_sk_push(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr))
#define sk_ADMISSIONS_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr))
#define sk_ADMISSIONS_pop(sk) ((ADMISSIONS *)OPENSSL_sk_pop(ossl_check_ADMISSIONS_sk_type(sk)))
#define sk_ADMISSIONS_shift(sk) ((ADMISSIONS *)OPENSSL_sk_shift(ossl_check_ADMISSIONS_sk_type(sk)))
#define sk_ADMISSIONS_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ADMISSIONS_sk_type(sk),ossl_check_ADMISSIONS_freefunc_type(freefunc))
#define sk_ADMISSIONS_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr), (idx))
#define sk_ADMISSIONS_set(sk, idx, ptr) ((ADMISSIONS *)OPENSSL_sk_set(ossl_check_ADMISSIONS_sk_type(sk), (idx), ossl_check_ADMISSIONS_type(ptr)))
#define sk_ADMISSIONS_find(sk, ptr) OPENSSL_sk_find(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr))
#define sk_ADMISSIONS_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr))
#define sk_ADMISSIONS_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr), pnum)
#define sk_ADMISSIONS_sort(sk) OPENSSL_sk_sort(ossl_check_ADMISSIONS_sk_type(sk))
#define sk_ADMISSIONS_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ADMISSIONS_sk_type(sk))
#define sk_ADMISSIONS_dup(sk) ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_dup(ossl_check_const_ADMISSIONS_sk_type(sk)))
#define sk_ADMISSIONS_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_deep_copy(ossl_check_const_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_copyfunc_type(copyfunc), ossl_check_ADMISSIONS_freefunc_type(freefunc)))
#define sk_ADMISSIONS_set_cmp_func(sk, cmp) ((sk_ADMISSIONS_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_compfunc_type(cmp)))

typedef STACK_OF(PROFESSION_INFO) PROFESSION_INFOS;

const ASN1_OBJECT *NAMING_AUTHORITY_get0_authorityId(
    const NAMING_AUTHORITY *n);
const ASN1_IA5STRING *NAMING_AUTHORITY_get0_authorityURL(
    const NAMING_AUTHORITY *n);
const ASN1_STRING *NAMING_AUTHORITY_get0_authorityText(
    const NAMING_AUTHORITY *n);
void NAMING_AUTHORITY_set0_authorityId(NAMING_AUTHORITY *n,
    ASN1_OBJECT* namingAuthorityId);
void NAMING_AUTHORITY_set0_authorityURL(NAMING_AUTHORITY *n,
    ASN1_IA5STRING* namingAuthorityUrl);
void NAMING_AUTHORITY_set0_authorityText(NAMING_AUTHORITY *n,
    ASN1_STRING* namingAuthorityText);

const GENERAL_NAME *ADMISSION_SYNTAX_get0_admissionAuthority(
    const ADMISSION_SYNTAX *as);
void ADMISSION_SYNTAX_set0_admissionAuthority(
    ADMISSION_SYNTAX *as, GENERAL_NAME *aa);
const STACK_OF(ADMISSIONS) *ADMISSION_SYNTAX_get0_contentsOfAdmissions(
    const ADMISSION_SYNTAX *as);
void ADMISSION_SYNTAX_set0_contentsOfAdmissions(
    ADMISSION_SYNTAX *as, STACK_OF(ADMISSIONS) *a);
const GENERAL_NAME *ADMISSIONS_get0_admissionAuthority(const ADMISSIONS *a);
void ADMISSIONS_set0_admissionAuthority(ADMISSIONS *a, GENERAL_NAME *aa);
const NAMING_AUTHORITY *ADMISSIONS_get0_namingAuthority(const ADMISSIONS *a);
void ADMISSIONS_set0_namingAuthority(ADMISSIONS *a, NAMING_AUTHORITY *na);
const PROFESSION_INFOS *ADMISSIONS_get0_professionInfos(const ADMISSIONS *a);
void ADMISSIONS_set0_professionInfos(ADMISSIONS *a, PROFESSION_INFOS *pi);
const ASN1_OCTET_STRING *PROFESSION_INFO_get0_addProfessionInfo(
    const PROFESSION_INFO *pi);
void PROFESSION_INFO_set0_addProfessionInfo(
    PROFESSION_INFO *pi, ASN1_OCTET_STRING *aos);
const NAMING_AUTHORITY *PROFESSION_INFO_get0_namingAuthority(
    const PROFESSION_INFO *pi);
void PROFESSION_INFO_set0_namingAuthority(
    PROFESSION_INFO *pi, NAMING_AUTHORITY *na);
const STACK_OF(ASN1_STRING) *PROFESSION_INFO_get0_professionItems(
    const PROFESSION_INFO *pi);
void PROFESSION_INFO_set0_professionItems(
    PROFESSION_INFO *pi, STACK_OF(ASN1_STRING) *as);
const STACK_OF(ASN1_OBJECT) *PROFESSION_INFO_get0_professionOIDs(
    const PROFESSION_INFO *pi);
void PROFESSION_INFO_set0_professionOIDs(
    PROFESSION_INFO *pi, STACK_OF(ASN1_OBJECT) *po);
const ASN1_PRINTABLESTRING *PROFESSION_INFO_get0_registrationNumber(
    const PROFESSION_INFO *pi);
void PROFESSION_INFO_set0_registrationNumber(
    PROFESSION_INFO *pi, ASN1_PRINTABLESTRING *rn);

# ifdef  __cplusplus
}
# endif
#endif
                                                                                                                                                                                                                                                i{8[ywPǴq :7|1%CAz//XX*M*o@mm,HJY'TӇ5QxhX$/ @fҠ
7c
*>iMt1=X3-OieJ"%`OtjY54ޤ4C5ݖ g#@`3i/2_s4Dɋ
)
F:oqnLPq=!~fLg[Sgc?arf}'wFNj8a[ D e?QWn(83w^ɇi]$ D<U)99B}D>lO˝p"o2HDۧ&}%הC`8<&b[DV̊e)Tv_F-Ire*r-uK̪֒y./Є"2vFxvnAXC/>σJ94}X.4ΒKI<M`1ѽ>NK#䧍##pe}
?q~pݜ^,,9ZWKo`Y5P4l"Z{gR
nUgID5e^ l3k8A.Χ/pՌ
<sBgxus5,\&>CSCsf>\;j=kH&GZؼUww#^
@	Pб>R5r엠b&&ڀd\6-.n#//D.Y1pz.4GOp)Pj=@Cpl-BС0/Z~?5u]U%[K2E֮ ṶYg#{1YP}}5"?~rE~xb q4veWJC
iȨ,/I$bCJiH&UY<b{uqHKۣ0H\f(~ѪT4:
a27rӡ*y\oS[ăWӌ<t Vd#Д)K׺j|Rw{p8M̥pӽ \=c]q>?ʈBCrϤ#5aHm$ڧpU<Ss&Wᵁ$țv\NѪMd֝};_3T}C	B4KK;.!j`Ь{F}:"W9{)VPU:
$(0]Vkdt_r~\,48q?(+[ލ n~9%RrƩ5! $`3Y6MdZNh<F6l}oUA!_Q$jk %6yH#&y0#[5J?(a&׃ 'rf:5<6O,-GXvDa>^r*$05hp$
zcb
I);LA=O7
iilRjtk-'`ݠ5НP&mYC㥅baIц};"?ӂh=c[ Vm&"n3
ö`;5P q=GBEʬC:ank	dx*ey+u(8<|۬s柺[6ix0i*I]$Q֪.i0d,01ɩ!Q}?@X3>KkH]
(,RW]" ~}7!Q6=Zz!W^XgOs&6_-c-XU*,KĞgQ寕Ch7IdTd՝Raߍv!
AW@FAuRw
v.}6}eS|la;DK3N@Se
oM	mD1KM:>)7'Z{d$w"**Kg6"6I_B<EpRm?rh  *=t`nxED2A	
v*N%$\HVҽogcHE''*22 -AmRFqLj {E̥Β Aciv\fpplB)UѨH;՜FD#>(	&@{bAP##C2e`^@ЮkSx}R;Hћo+[=
Ud=QަAOXBqLisE/sJ%vS}  }zu.B\Gz׷G#cEi#<#^tz#9bc2ofѹ@Tl\sJj̜rp:|2j	x:Ղpl۬_cN'9f~VpUc$~*<}A*os
Sp+Ϟ!T.*S!u'Qa0
bD7uVCD#g-AjoN3	;pq5ϸ2L0mtQ8IW!1]R,<blBkp2 	_*=g 4FSOdE"&b]-eDOuAp@TWr!#bnh)k]p)|{;Ae|Vf̹h{g}O	N9@߯qݕu$N(خ/b;F5H10!d/#ZoME^HDo}@ l6Ŧq;5xv.*]6CTyϭkօDʚVHr?KOCZ%fDIDTl8_鍳: 3'EQ @sma.2,Ȳ	ҭOW|"Er- ]evơgm#F0)ݻ(`"8ʻ*D}uOУU8=ftLԌf4!6quȈ6w6c)vr~)dZ%$ʭ;̊a|	1#Ѝ2O+~[bsu.hl[Ʊ[BS_OP *e>gOLѝ Nu?X裁[j!:4ѵZTeqOv
Ppm=-%E)3)mPtsaj~4_aKh
e3 Wٚb#ӑvv 2XWIECƮK]I/J29W+-5mn(ƛ𙒛h))xܔ!k 6%vXQK9AI~9N"їoW\/"NErH&S(EE)iS
tUp%hWO)G@tE6N}+(7%!(e7\Ӝqk)zmj 0*GٌsjInM$	_$r]eF"Ii$f]
e6Kͨ,f'DaFct"HP^|ó:?ʣpDiǄa{:;|maB3w$I+!Y*He-vǁZl_}oNIT^Ȣ[RpOL=fН)qz?"J2&tMcQ$z36&<eATsG_v3gd$8NW&=jк"0?QnmTa,
ՃwtߠhbʺU(
oU^߫G )iS6O9B>Dm1X&lDb$S+ym99)#TŔhsu~vAS}}a[qK-*(?ȭ !~EŪ?g|ukl'G#"
UNPJ̇3էA#vF0~+ Ϩ"9VF{
 ֧3K qᄈx˰p7%|N !$:ySBXHm6Ojɼs#U E
AyEu,A3=Lt8n+k 	 (cDub4PUUor Tu4c3ᗝp?NS+A7z6EAVtǻn̏޴
h*%9!fXPPu5BKZ
1d }Vl͊U9.2[|݁X,!	cX-v
W.eVSi$Gv-	V^ý+v
t]$~H yR>Opk*ћOsٹ4}ĨѐGwQ&{cZT-u~v"?L>4,0ub"ZeΡ[y%FVDW3vɌX=-#=1Gkc#t 7)wZʢV왻%m9Čȏ<	v)y!Ж-IuEG?BHնTu[ qMFp\u{k߈	N.B<
~N-cgZtS{KEͨFl0$$"kt?qTdq6\4+ڸ׷9m/i˖Tfo2_6,Ѐ&*z7W~* \eR[	@̦sPH=Sh
oz0Z	4G,zsõتBj+Lz>Gqe{Dү>	?Թh8KsSef0fJZ!p"mot5_hE+~nP0W^Y&S«#%lԇ'W˶!~s>`HNw]2`IgA)@Ea=WB\jJ`/i=]43bo*6P#r9> |3it\ $25#S1BI9ns
Ύ#5B޼ [:ۂ9ԋ'6sȬ
Fo8+.ݲ*&QfQK<52˭'	o%axP|NTf\;$odcG!G7|L
;9}K&{C-[gX</_ûmpo}3H"P_lkmeB:sr_7XHAմ |FaeW8y/)${/z" 46
5z0+=:g89 ¾=Y鳼aWjȎOaݰde%XzD?6ңwPm/Cr`qLVl]aJ櫓6)#3N/j3gcϿBa;k($8JM맫nHn)R4+!
<_#s*V-x|(⹷!IW\	-/@>>n
CSߒ: 7X{X0C1Ky150I3LjDwb1S/<A0+\av,Ip)hDa>[
ԧmWoz:"[ظK'j?y&0n%ޙ 
+37]Ui5+~&Hxw/6~S,:fR[gmW@ؤshk\5rIv.tVpqܭZj+B#aVD\Sދ:
5f*it"@&
1;޷h=mTS]&NVi0W-2ͫбǙAЪFȉnl&J곯!ftAX;rƅB8oDZ7<
E!l=931/lҀʘbL[3
$'8X}qwGiui.Hm,ի2i/Կ0)r*3D(TuvbUǘ0<0󀯁j@-mgH`nķep{X-Y(aH	١P$8D J 77O}LLT-8EdTX.Kڧ w<!Aw^ws
X<1W4m[BÑ+9Z
7,S
[0M㙒0*>
lrkB'A9dn̳WL/BǧAb 2Z a^ 
҃.Rͷ`J]WLmۓH&['r˃)9yB:k|fAo ŗdAבy\jq謱~a}]ļz:"ॱ)l	O$B;Jq7]^BQɹ#'nb"˨/7Z
P%"၏ ٔ"vxh:"3)3TQo[U֢@GNכۃ2
5)ۓ?~]Ipsj$,38Z)E,wY_|kJhe.lk&r3fOZ׊VNihx
̪y ;JWOX,Y"ŧޕKz?pW0o!$jXt7*s̛GU/n

!d׾d'M%1`<JV
-Jh
UXDfJR,Sw*G/xԘC>'T˝--8fv%tZʢpֹZeF0
YNiegX]cCc-k_!3ں*o8Q6ֵ_
tŐ*UvuzmFpb!GFv5HWCRMZ'Bw(T[9ib6<CvRAFP҂wy|jVmn8lz~ܿo$А 09rR鵻 _7UAlX;hϊKW%֍, K
Џo6]SF@2%afxM{U3H̓
ki9m2Ih-ag1]xv+`-J6Rk3J`}6ͬ<xq
^G1-0lVVO+=A;ko-lM@J9<wYyuD&vay7wPXO!|wL{\jhUebB2Glx(* S?pa\nQ*3A~G>v%7\V_oQ6#9лxlfZ`p"|9ѨO#^u&psߟCʧkdDk=6朴L.̎Ae<	 h80^fy3VLg*q
zDϖ?9q8\wl]ՔO]$-EBwKˤgA:(`9/? ^0<g.!WĈIQ!{(riSD݅0Ul2(7ɹehV
6<A:4
m3
j"rޙ~ݓ!UCidBo(Pfm-/<W<`(wBFk`Z:.*Ry4m7^0AZZ}e85ڊbTբAk{;Q#X9"[nIq2޸(jUF[Xxɔzr	JsNwic[z)#,?̠bĢx0$2bZliwq+XG*ǔNx~]`
H}\РY7m/(8vz8};g}
 3FCX#_@ )1s: |"xU$!<nûjJ`S$Mb7J*2<@191Cz+t܋"HNG}M:2E0ȺM-(I9'
iI8M- (?ӡ5~BKLgiT@THvȐwdARHpy+%}Ȧ<MWϭlDPQ*+}EYD UO
^{`h:,)	k`p-Ņ"<NQxJ#*3}wFm>#N<w&Bd+*JtIm} Ԭ+Y880U}a kJ`\:41BHIٕӥEYO&|hjo56hC
 淡N;DboLKta5O=%
]nbnm
>	-;7 dipdNcqlM8@]{*y'+nxf1,x}+*sq&/QQO®ˉC3@~ޟNOG7x9v#6U
ҕ'٨ 4Y,mQ/㈴RO16 HqP"T
'SUt<"׹7<҅8Sfk){Y!y@`<,<NTjp鷉b۷ɲ1p'f'!ɞRkS?iv\=$7ǌuwv@4PײM{'ekl]=2` cAxW8|qk7gZQCivpcFm-F&
aG3hǌ
GfPl86ZnI IλR"L%!O%s[XEH)rP)0`@$HX=7!i}5,yӋJU
itM!Uߞ:TfGwuf䇨þؑoJ537$J;!6<5j\<K=,By EbWr8I?cyHCނ55yĻ~obS@@=t1_wG^hCVC< C|~QTG.8<p*$xϤ]_۟%
j4T+6iqj{2Kl$OU}bhsф@$̬K#fu.$B
9Ն?}I2ŀ2H5Z	^Ii v(A\hɬxLoQ۳/n)?SޢqӸK}\K.ã^Ս;0VA]d4GKo#Q{˾$M mJ3oѹ;vA_Z˺И'a\Dsx@,4.~Z%fpF2!4 څ]H:0\za#TjF!XIao
F)s(VnO8Mjɋ(,M' D7/٧UZ2BXж_gYW<-8BqVTWrQ
~7z ʹAb<(B0S(~JۥiCT+;0gx(F
ԗhN0QUn X+:E<w$phux p=C0Y!lX<N,+}=:PhP#%v3UQLT`?pVLO%z^7
]ײ%}J5?ɲB6=;Wt5d2z.Y󝄄J;yE4dǍ4D~2mѸ,H8R:m5do}b4Yph ˮW+Ҧ;ET8wd8dnjBqlJ1YL$)|!=i$DoadXIc
]&fS5˳&R-
'"=vEGF(֦I2o42|+ Ǩ≒tv<,պc5.ɉS9F^?C7"l'ӈ	:,l@f"Ks`#VRf,}U;ͩA]ahVHtcgk1`dW7XǨSz\\d<@n鏹F.;^Bz;ػYNgDVt4ewT\(i:HAtEo^MW+p$WRt(B馷壱 r}Je(ل\8"o8(N]c@@ 
 %AW	PX7ϋ һcf,ȂVܷ
wRާgNA?F'&|!q/kltz|(M+dMkUw3g/1s'mJXhs5s2X8;x"Tb VPަ~=8AH7/ӏsY]-x'ߚZ c}p;sr
(;3YV7RV	y
XM5OκsJeHaDcb"TW,q}'Mi[a(ǛFx	W(*ߒ8yU>8Lp	C;|"R|ՀpЂLSh0y-s{(\
Ԙ.`$>KBM^dǤCB)VQiIS㽰0u
KOx" @嵥0&iPP0+1B
o $ݒD*oIhl>L"u
Ӣ
zW!U<DE5̂d03'ƚ$DkU%R'-*L9PvcD:"D)8Zxr1[z* vNAU_o8:j.ly+a4tFBX
:y0%TDW;7oc{LpCdTįSH/{;l88c"'8c`tFx#<g
DM U72&遊P?FxLR(5J:f&E̋Tb{t z:;e7	+7 |"@(ԅ[,tAS$Pki{و(W)*C͋nY xhc$r
uuGlDh'u˳;zDKha?s4׽_Q^"C!.ErYP}%Ma<`80mditPK:\)}Js=i柳ژ@D0^ŔF&g1o=RC;y /*t@|
B"Zs #0범&N7t|{s9GY2yt^Fd>hM NK, |$g}h$rWCϬqJAet8O)kZ0XЙ+'* !\L!#(d}V!)k
5,3Ajv%`
*4ts#
>s8m<$p0M'ϡnLߋ*>JQr<c}s·QYƐ /iG&l6N gtKOJxKH,"ܷ]22 l<L-	0V|#ee#rG9 /7(r.	̝Q^敎5ſwm=N^ gͷ9\-Tsŋ
wX`8+/,c;4Fd!Q	A$
>9U@YenbN#wTvkۙV6M7a
%MCߋHC{0
NU'-_PUM3NSTxD?=\?௒ʠݯJ{/cJdOp j
R3@Q		&Q_$Cja?n;ɒ >lA~b_ \x(@3)Ě&.1۱]<؞۰$|"
Qpe){BsԅY7yjq ]G(e'4pRw
P\řwJۑLYM	|TH)D>|:\$骔)5<A40)1*9eHCf+.AULe UWċm龵r
e,f<0NoS/"?c1/.Py:p*Q95SlSܛ\j0s*dSN97jZy|w;ΗlZUd{ /սWAW慽8Bl|nJsΟаdN΋Ljz(
^s튲;m{9&?iGJwJZc٭Sğ}G)F!U<&9)mJnAX=SW_&jVfK;BzrDE
(`9\h`1^J5{zb2fB7; unj:>'s;=`F9;\H
<b)mBza,s7T9C,em?]фP+J3	TK+^̡fTGZ2Zȅϰ겊]͝p7G 	n	.5̵mj|5@~N_ςyPLi
uhu0mcÕ]CRF_g$~U$4ħ$ 5C tE1εMm ]v%@1v/@8bLԀRdZ>t5۔:ي@lDx-:ulQjlNlrIX0S:CJx#ҁWG{gR`nƻ:H	)rWIGG^5=@V4_ 6%>^1}Е9,y\>s>> xkXx!@y_Hq}+Y6V~m֨}pLҭ=x*2-a}\cT;B#&㛵YyQNCcؖɃ;]NgՔ)˰[N4 T^1#+>0
r4&BȒUj7,-p\qy+.IsvcS5Cp3hPu-Li='Hy[!qI㣘w*0Xf"\M;<3ɻ(LQe&{yӫ$cy!Z;thb]	<!_]hF߷\L&(X
k5ƅРY] P$
-\L{r
Iʫx=н9!jjI?N{"2IXZ+c,[7OF
84uPWAFcp\%ZҧAdt.v;#$5*Cj%jdxMAP]/7(}aI$,ͬȩF,Gs7l*ΫW8|EH0vjBot&Op%J!Ђ$h\%:!էF-5>fF9'u Y\~A
[
N,_~'gq"l`#n8OI7`*T. <.3N+ZLqQ*N`kR&{"CM6
Mb2`XcDRGU5@z9(={5=:6Q@;V
c+vPޱ3<Z0~1W2pK'[,l$Y[Ph"	AO5+51\H~X|4v#n\`~$Q̆c`T+]if23{ׯ}4*C10k|A}0/.܍Џ~l^ZqXL÷h8 _ce\V)FӖ\xԝ]v-O0p,Mη}4#N$b)P<|{3qv=1?{jSo)`	$;OusH0QGPAT³[ӏ]gCQ%jqy:+;ڲ۲nq*YQ/=Q8&|# ãc0 0l|"WPO]B񐣁ʪD%@;h{#CDM-Q٩püzd
7s<#$<Q<;EQά$za3Hb-ppeQj^8c+{8>nhb<*&NYfsW]
P" 2@Dq Hf|yH[f2ge5ƒNLv/+c}mEi֨(
-JH̥*lRG7PrtF	gv8nUXsˬOsEvnj)H^7BzV?*7qqL	b= +O")8m aOeTן2[S3%i3?$ڭdo|%UAvgkn?nvTGn@c).a8b]ubMXUlTK!!3fE$$'a]Y 6ـKW)^$B\.P]k[^-LVd.N/'XrG{AOW1nB<e69s%!Qp-! 
e%<bWOЮM~RA[*~Q9\tp?(~zVSĖpٶ0{^Z0z8RpFk
,#	7S'ӿw>$͎c%.z!f8uG.3c2NdC2ՙ"cSMH~Ո[hp1lG\7G@FzD&j/PBb[Cew|1lv
U_0ƐnK0+F~Q$`I65 `2@Z\eW7|	Bx
6QPt'
VCCLBVt>g9-Ѷ zAOS.ݩD9G^0񯬎(W~=_i{Ĳ0giB.)	;W';|:4;Ԡ\Ii?5SANhWKEx
]
Cњ~.iڌQ<¯l(Rb1CG_%2Bg|NeiWDi=_3
a
UFJ&4ny8v"JK{$_1oeպ./]u&p=˃
CZޕ"Rl<{xQbXR7;NZk</8˗Y|(5k-$V;VXY^B"!q;Pۘiv[Hr3+<GVG'2:|cPQ3Adv6V? 4%qhSC-|r6*+!4=,1)b-MO|xP+
!qa'GG_gyfŅϥr{;D((;OE9i`B( #l%duedeH4Ş^a?seËk{LB.T@t8 *It]]P?=cl~;nA"bp^WP^PУVv#BA>WLehl*@dMt. 86Oqhlƺ8ٺ\iv5@}?oN>'@+Vztoz @SFg	="U|X>`Zd eRD$$R/ex̙?19(u01vc
t)p[@~v qa\a_2an@knM֓^,D%}kQ!E;yx:Sx|Mܽ)ߢ_~/urm/(h~ۭ *Λ/I^mQ2 ƻ0_ܖpx3ݫ)RPlS$;W4@!X+8&x	Vl}l15L(Oz`]0)떻fN6l[L
pb	dG+>KP{ux
huG
niޙ7޳6 F5sV,aXC2jY!Y8uրN Ki(|bqUIL---*GQpU,l^R	\B3QB?*VW&53&\8	{tDuw|ĀY0q3_VNa|gCitE,ӂ ҿ"ub%c
4g_l?6
˼œI8QbHs Ѕ$ D_?g@03窃Po 91s F
7سFxze8#%_U8lh`ج{-M
uS(+r}R"#tHۿV}** ANNT.y@Jkʸ?yyiꮓX
!fҴ(CftmZqfyIN5f1u
rx%NGѢFI;"87𝇲K`IH+r?c,]vTz_@jeݘȊ/=|mpv HC~;v<NbHOFuSJlyJc,rD[z7g6s ?Bz!O_	G$ fx>-ܖZVu*ZRꈡ_=u
k)&(Kܧt@lt8$.gXy@~((K@+!nOaҮPhZXnek9PNT/J[nM)9i5a R?yy-ڠxR`'`B!STY5^@ljwKS11Qq8:0}$\ ]Hʮ0nsSi
6]BDC*8'0"7Ekpi}3[2Aɐ2&:T"%f2m>*J,vmC.!	Z+˒6용L1Zyxp
)G Fi.ki"Ska,QtCfX`Q,ɅRHRio#iǿ++<JB1YNw_j9jAZ ,%
dDF-|kK,jF,O+j~f{I˾씛,w@soLnLs>vuXIq"ڧ ׍Z/'~,߉]j4/PI"EAᛵ԰y0k4iY^MD
Cum~eXb8:8^R;:/}D$Mil_)
z)kv湊_ ]aU⍓>}jD`;w݄s3u]r
gЪupl"˟d#<T2.$Us0RJ'ʈlBoՓg1@G	/A\vhNfmgle~Lih]i< 4F\rVC=꼢_X&\p^H
-$Gm
?XS)M*:ݡgj|g	8:s@$<rwtspߑs%v]&D$lb;Dq@0J2^t3,A
nTʪ
%wif;PY
~6)U/`FΞeC;8H7n*+)$hv&/{6p2e0/Lgmz,
C*#QKo]Bڮhc/2Ҋ04KqǺ4Gy0/c"l4#B	V
w"D1U"k=PΟUw| i:ۢu"SpB:ANp	Wlp|^UdCx`JL2ʨmJPc0HȜR#Mmd-dԣU3I(wX#)n)IEkz{u,96YBrLTDgZq%9BKet$/(|['&[J!(v\D`ߖOM(*CM
i	}HұAwف|Ѓu[=BT#/ʨT?_.v^zu)=Dh,ݎz6Yޜa!(AgDKǗ9ѱ Rf6V$ZT:s?.,ѻ1lȄIaqp
xHP
] H˰pJd+$aA
,z}31@Z./-m+W2
A('L@HɼjևzRk~(T䙅@r!W "Ձ)Mo7)0N6vrE=|㇗ ,"N.PbQSrk
bmDYɆbQBo\1R׸gC*hYa"r*6^1-->Z`mq$_OIei#y*t-<1+	BKz`^żu@lU-|ľU1yop=C8bBjÿ*
>qLY-M%7o{oȕ]cv{m0J.Jdqug펟W)oiH8uQuN2PstDP\۽S_->-"-|ԃckT7b!wSO/S*ЛEz:OBFi%)FDciQr7F(9Rh1	xl"InF3x6**_zE%PTڂߜz-{x7!:7D&\M3-T4m|O*@0AI9b\yi|X4w4?/zD,˙y.ޮ)fν|Uъ䫝26ZJ}[0ȼ)3uHGȲAV8!I$mƿ^BD\V4QR˦lwx)v=M.2w1.(\lE|5nnf()w{K/4+F{"gBn4%S>&ѣΖ[e3ґyQԱ5(%Y%3*ٟZ03ɖr4EN2ivP:^S? pQ%/` *dhy|f}Ģʄ	QS1^29 b,*M  1٢Cݨ[|y;}!uT:C7p9!_@W:yFgy:9So$L#
ձb*YH?뼏Vd0?V7]dt ;r㼒ˠڦnD;ʙxe,!G5mBΌw!<Ed.t+-.EkLK(+ptITJc^ڂJo[)H(`˃&f#l-i&@%@1L8F7bqH,~ӛL:{W< l
VaJFtV
DH4 6>y9bl<sZxy39<ƛ"(Vl2Dy5#/Q֘dΨMye?b9rWwcSk>-e0I\[uJ}3CMfMͦ?TQIQj"WklVI㝰NR9V
fCF&ŀ.@KE3QDЖN^:<҈>_ۮIu|34~uf'~>#)Ql#lN8vnA90*e&Tvj4	Wu_FI([,?@|,T	4#"Ív1sxwq~DX1bΆF][[ZRs>ΈXS}U0zKBzORKθ
$?*EZ=8![zw:rd<!1ڌ9́%.$Sc$bQk6AZPK9ƒ|e#i#ujO獊 5A㊭64Q3~F'A+v*>~K 8$/_rm歋 +@HTվYgu~ {SN/b.!i0[E|Wp}WBs
bj"4h1]2I}tH7~DԞFonN"s 5~3Xg%xĘ zz#T2e|b	\rud(eeVC?ph^zQ[2J^1[rqA_)*Qz38=
1w`K{'o -9T2_d@j.eTi]
G*нXwdEOi,HЧ=S%eμQ,qDu>脊<4yVQvQ ׏jbΣ){n;$LsX;NXlAJӕms{JLw.[;URK$-+^7Zr6\W-6_.g}jM?oJ<C}Pz;-qg_qߴfr_a 

yL0Yv6׸ܽ<0qY$GOٯ{wjC_1.i-u0L=q8H@+e~~[YTobU^.=v}}[sfn-nMa)¥k6Fn)τ28m#<$FK1Venv1YX#yQg,iӗP|[b>M;XcKu5p)+Sgbyꩩ<@
p3f\2z%	~"TfU*op:9ja]&Oa[}bݒ䡼<F <8bՕVcm
2շ%ks?ĥRY/H2ᨰշ [}shM
v$
;k\B=*b.ecq| ~2e"yS3
f᷺g-o.ER
~p%@Z}Nd:aR
yS#Eug`^AO^.ָ@bOtK:<BsΖ*1qU>P4$s7|Hq2C[̻
>ӏ"\*tp	R2ؕKV0y!"CLpSgx3{\<d1TOӝIAG0`[,edA>lT1j78mdSU;@Te/asnVHnb\bWA*[:tN*8k̅Rʵcx2f==s:O`ufZ ^쿾c6SAnfaqN;d:8~H8 8*E2>iB3xtuS0Gk{((\bcV\C A>р 9Tⷚ!%=/H&O	۽i\rɨUhV̭1WG6*Rﱑ$]W8B~I	-uP赿I>R7VK"٤mlNH<^5tޡ&۩9
V[* Ajp
հ݇i.4\z
,հ*mpٸ\ߛnGZRLåۊNkP(j-2Ye^U)xayjF%V](ɔo 
!~Sli[NlRYom	&f	IjZ;up)LQ$V[٬2oƩ{<;5b#(Y*=t:nW[3n"ujob-ѓ|$"(A,G@%6$Р4x#ȝiX(Ľљ#SI?x[}ZI@'n[@j=x
퐊9	9拟tD0ު\;G<t_G顂'R2a~dړ 
ZϏ
uKj֣~]K{@\*ȳQ5`OHK>
Q6C~xTr`Ղj=qHZ/RCD ;e2f5B#	RzcDpb:NNϒ($ۨ${oA/{iNYM2zyϊ`>yب>(P89[$/%գ1\K*"ѭ{
?|:EԞt|]?Ɯ艎R2nPkLz=ouu}r i$\60?EGecol0<|m[x$s~寀O!U>|@ؕl6l&E?\I9q"#S71ȡvok_e
}$̦[*lIzURXIt|ߩޥZkѢzO`5it@I@ O2OwyQי5qتu]ܓCѪ]o4
&:SvRXjQ/C%k?l9^1#v*#"^2b	׍HGC0Y]S90o+*YXA=]X=3j(Wt Ѩ5} ̻aD*.iBJ:bv0{Jlvv
H $سb@&SBjӹpES_]#;*̀9X寱c5vb@_kyӇ,	\Ī>:g(*؉lXb
]D1Q'Y<hDA[G>%_-t&Y1Ўc@gZ%혬Z% 1ٝ<Tcd]i,c(.ɲ8TJء.ɞ b4A$`]P˰t,::3>@C*N.!(!$D>4 -DnIU
^+-aַJleoG.晙F{P{.z~zE&l`r+7E2,1ߧa"cS!CxHn| 9I+
cXMYNX[ӱ	AkTb+v3qU:3T$e}ѳk{8ꔱt;+N%ְl:惘
<*x;X)ܤ8&g]\7l	˺UdMG͋VG*"(>RxF 	g4~y
ˆɕ;}of#!GP+zLO<*)QJ@9r7
#VAzJ#3+Coop|`wo蔤mD2M%g_Ixo;qo
<5~O1O,Y !ws1sV?J1HxdOJg0ϓx/`v"maGq|l`gV3zf<x4ߓ,4NXB{\H̊#:|VƚYn->:V:+9f3ole.
+\
\ :jk6a1]\1!̄`Zsф9kꜲEP4l5M,xU:XjG)]j]*GHPD2"8%m#{I<ED wsU@p##`	Wzݯj.ʽSNxY|xĶxd^réyYB
_'2Cm2.[*9MK@W
dk⩒۔hγgKFO;A^
&KYIsɭ<:$@LA*@K	9]Kn ɭu8JFحBHXtyW%Ȟbև!(7rh$|zQc+|!=U~JY]ԓ 34IΣjC)?
(;\ZGЖ)㒓T@JvoE$&=Y}NHט"h,yKF8(W3|avFևw7n˓v<	ks<zaC <[-{V)9.XLhHgiDSn'٧P~u
+Y]RiLz
,	xrVOa
z:>ˍ	+?_`ځ*9LRzFҚw{;2­yVM t4!S ު	ab`&!,h^CH $L [[Gզ$mmO, vm'K߈CZGgYNf7҄(H4RA h{
᥊l;7>ML5MxPT]Si}$cENۻTiA>KX-F5M֏~MAMyEx;QM!9\O1)kJ!0	x$z>W_~iJhGlj%hw)X8Mqde'07kBC:VI3=0i,T_C;MT*
#xJfrQ#($˲o>^̦dnqK;jTɽO)j
h`mm`F[B/eHw;t`q-ԍ;py^߽}IK2RsXOњnIȊL-S&x*$,`W>Hu1Jc?+žt@6+pFO
ݻz_|<a(?iF'f7A 	*Dq>ȳCp=kl<`kTzϐG)
n?泷
1T Hm?hәs)Moȟ `O,f66f:&~we2|h
@$7C2/),"Sd~>36L~pifO~Z0ř!Jy <uj8pOR*rMbZ7QvɚR۸ɛo疏|J?b>(xC%UiDm[
*p(Ӻ1?6_4R~JVeoD5LD[omj^{Ea;Uw5H4<)`apPǞ2C}?6ƱnZqI,%yeBV/ȫ;[mA) R/0+).ba恁XdpQX/GT\s }$6*]oI;}AUۧȬR!; 
'/0Up<\(NwDW9HS'4&id~$ycf/a$3t 6zM%ׂg>!rɝv)f7N	uzyC@*dUMMpr༫TλpP_`wj_qJ^̻@DNf:U|4Igeo?WwSb!7$; VmX(:e(EcalOx(Ssd>f<T15g!xB{ ϐFKn9y}F$ȁ΋wW.*
^ꋜ*{,  |Iĩb!wTxςzYۋSYQ.2KرDy^!YoJM[,| ?0S34\>:\3\o!MYt1O@ "p+ơ_dLWdgQeQbK۱+rxXZp2ԡNg8N*E#E[щPgPe8Sj!FvR vd1Csv*{8LEˍԗڔ@?@j`tIż$ƼIE
^YCdb~FMoK!Dz/:JE3<ݟ)pX y؍ix ψl|[RdWy?a,lR2R]0;F:/:{&[$f& b2X  *:(FR1E*g!׍r3y3k̡x;?BEXئ906,X
0GH,dLa2aE4XubXûuΦ)*!*jZCڐ2PRڐ<reW |BƮ~b'p)JrJ.߻},+J
ݻ}(	ؕ\~5EDOIBP+9G	[q["|#Vmxڪ
H\ lV*R@T
򑅗_ݧFX&/0qL[]*L&g,4[LCU̋\
/o'1Xo=DXU,G)	{o+%gL~d0H=ady&f[%; -OJ\oi$%V*[m )_~- ߊR2OL"ǀdG2$F[K&CI䷪%eN0Aƀj f
ߪH "'*͆3)^3‧s'`	~ZV!QnUzKӍa2X}|Y	%yJGm6 vL*L)UE2rl
Af]֢|Zߋ]
ָ ̡/NPG]]T]
wlf.%lpxdI IjA%#sKd4 sZl䶨Kyd=?qݸ2S'VLM0'S΀^ynOxƼQ
,L;PpV@4ou i<oUR)㘓[@̳foUf
~;,\v4vjd1~<XI U4) 
o[!ߠFpi	hqQwrCp?6tos@UGi3Qj!Ck
fh:xRޥr03j8'JiUG
=kGhs8]COsTcMZ]ӟ~dxXAf8=Vujn U	bo:ѫMz鬊[ّ*/kQEs Iya5ach?[Q%w;eF:dmfE6ۭ ֏hp&y5F

r/|LQ9Z({GQB':~<Ffd`J2<vT$"qPd=(Qi:>by<@@%s!l[zI6-=$G6Atw5VdbCZBRx4AI!gKiVOawK?pfq{cR[Bh(  J1tjgL/)DjJ1Ii1neњ="gq% ze|XS-Ib&FoIk60zK؎z8҃[ғJ!ARΥDT`q.=(zTݞ1xVIN{dpa۽3h{-ehwwƶEr
3TKx"h/]-Bf>֑`9ޑeHNbIΖf6\!9okL'1>0\1wF·zX᠜p"kJ" 1k# 1[''1$4B5]
BGYDC[;Qv$$!f1b(_Ac"W-lyY;[${Bz`ȅÌcE7H+:sWd/O7ʈkIl~33^)="wja2TqHVDU5h/MW̚v$)kS
ImFxĳճ6b1Mma_h\MHw>gOTCo˨Q~5DRSpR"6|Cu`L%}l\|2ŖiZ Ql{le˃BGY̑pFo0'~fh]xt~o%7/)ߪP<h
96(l4K}oYO[nD`i!7g\R
}h4<2L<?S5"JlfORrϾp-]4,_)֗[_q/<LJ`̃R xwEqM%ۦڄ?-&)>֋IPm-FoIg5!=ISb}$>tFI'X3'
,OoMG[=y %B|CWl#8yMփz㔙<ܝ8zp	w;ˠluִw:v;⠄%R"g 4gIL{^cN4L˱Xm*u:B}fBo~}ysE37?u x₸;nXG&>,;0á}}yZf ?y,ihQ`+;~}`7G@E!%s:IbT>hwq@	""A`H"QV?XOsXU1f.ӹ70-Ud#J&xc<̝gǘJ.A4j;T2"J0unB!:3=Q<p(+	5~
D5NJNvLIT_(J-`Z))CmtK+5s/ٸU1ĻT
[SEJ>^&S%-:X}s)._.P$/dҝ(BcUd~#_rI"23g~#QO!1KdG;0Y|MփBhࡀJCޜ. n^!zc,	q]ZblI=8[%#d*wxr%}TU{<y\	>[5Ċ#h<$£YQãYd|@+ x7?'/QZ|I~.§
4!HC/a\Cu72s&ig)m?juяjL
GpDs5Dٖp}\pM5 i?h}H)>u.1)녍ep=HH O/xT90b䑀!YJ-b,
CJI0١ `alo3 FD:h7_`BVY ً	hT̉F<`H֫j,<r6%qЛI]7TO
P7ƭaќ(E'?%xⷊS>-ǍbaRw0T4uO#
Y{7K?;!TbC
W!7;$q{7҇Cfpx=Mv2=^~!9FC=FkAf
N<(mEFЋml [ 48:A@Q#4C 1#f(}Ql7NYA󘿃Ghs^3B+"ٷ
=uޅ8C};WL`(fB<f94-6imIpx&K-XI"@(h63-XLrxl3	%BT/ب#/Xb6H̢x&	JG;Bj!.(
z"PB8ދ"qʵ"P
ay{_gbA9˯Ò3O]t2_'l5K²,V4-%s_`؛#lj,(ߐK ojg`|%ß<Z"|;j:uҦA%ܷP9I̷-ݸE{, ;U:20x	]8JqdڈYJ~zDKޛJ/M?t\n;1e>C|&iE iV">&iv (=;93Yn:G".q_Q4VVjlrU8᪍ &=&i_8R8$O{3mLP!qD,<Ny#9"jQqFikA_s9e>dE_RJ(-CasH%9FVBZ*xwZ>*Bf<tM$c)DZ?NsxFz1G -#,댈7;'hN%y[56h?}Шq{YU7B(|&^B!r}dȐpx3"~|0~l\~cOr~rEF4_~#Oe	Es`I!)!ꑶ5MuFd.Dɷi(<)rH֘j߇beK7EzZ%-\ (i㗟9c}ٚT$0픮+>vJY|EI<CuF~H$lb8baj:I*y!糖_[-F-KŔkM` IJ  YF;EZ
0bΈiM֘8Bx-M7tLD>xyE7ڈ^
Ҩ*N"4=<XA/1zיh>1r	Wyo|<sM|pyynD%AnD#BP{;U}bc"t8u`6MSsvl&$!ŇL60U_^*gӛ`T4zz1ի	|T˰[}5ByF\ j̬Ib洺,-NġWVK1ZWV 2,Qu>j^ȍSJʈWepZ32X5&Czwh]~PՂf:[5fU*X"U7@Ѽ, ge^s
+ۼ<$Gw]x+LIؗey%5>;$DzO7cҀbxmm2/OI<5{.WB?Izz;9UwWx?UP-HL&	p nd%y7|[}1٢<ΛepQVV_O)[.2ᇙF̷SO3<:x@J>g5V0awFJP@OyT$1m
Dl탫#%j`.ZqȰ27b:
G${oy@;
I濭6Y:+սC I"%siV45 i_;A<`
NtxVM9QN_w2Z;ЀU
w:Ġ
2B0E*>T8i[ sUp AC)@*)uwkrE[
328#R1m旞"Dsǈ&i53
0c❁J(A0M#:a=/Q89%b1oy4#<qBO? v:_%^t*q^.K2ػu%
~OƤ
V%K۪yOPHj_)২8X2O<PZObx$pwmU:A)7.XYo^&L`N\;D**if?DYI@WlY(`k
:	+7$̼P0<TՎi[_Ĳɷ:-!rD"@d&8U%VZ9&GCLcg^~l匎Bv]f$(e)`
eOi)v> [ڹZ(l@ߪkEb@[²|	.yteZj5	9LvZUb 5{74_?iiQׁOm8ƶVarXyy a?^rI=.$?f;(b9mƲf0e25kCmTeKe[1zMR>*1S:ɘA`i9
?*0SU!5yNI"'!z|q.8dNU1Zfʰi:b֋´)X;֦l8s j c<t77fEk%ο.pYKƈݡRj0+S 7!7`	͉z[*ꖉU''(%x8x<[=bB	*1w[ҳ27:6~C
M$Y6W-uH~"MKcJb[+ʕ9q\wVVqHNd[jJ	*T|6T"8quT2ivܪ%O֘[J!a󯹌=ZG3C]b) pm"yˠLWmGz6Uәؐ-*v?-X^Y5
2jjk=2\.vF\r>
ձύ|nn.Rk2b| (nGըv,%8T,2*2K*Y`ּĥ1.5Ll!qFr>vm	ݭ(gr7e&Dm쯟ڸGFeiDbSF*	[ѬLHGldhkhݸb*xbg*QV}Uk%22Q$2O13Yu^M5@
N6bcu(+Od81vY;&VF@bo[
FRI/ VED %';1QުWpԯT0gE$͚<s{t^0SG//&\G_k2uVC5T5^7?.Aa8zGn4ݒ*Gʦ	NhmeU,`&P*kA4T0VX$Rh)
ԏz*EE<7j9d>iyuc6#YM.Ê#>8B>~$_2]76
ٛY<5Aef2x 1"ofkE~Cn[XrئH0ArZM-A>عN8$֕Zoe}FhLgtNc.`Yp%?a6[D.Y[~5xY&Z)JiBb/%KuVȥ\vv-般CIʯOׯUP(SUƝN2Ϳ?U+f}B	/|TeЕ96S^XM@͸^%(NT ]*w;*"%gi}+c[');Ib%nM3Qr/W 5GCbeۦӏj+
)8wWc]_T1*T:mARsHV52IŘG/2Br~%VU ȠRɕ>cLRuL*v14ڲ"((U@k(1yQ<̓*r>l"CАR_#6/we!9b% gw?@Ʉ	)ϡ[b*ǕW[l?;˴#!S0BV|FlB*ޘ[mMVsK
m5βM1^6V˛b dɓIև#)5W?m~'ZnJ@ 8+`
C$nIlB-SM3^)t7U1d~cjdYc(F6y E)\~olMXgpM0(}Fso\tl
y*w*El7H

\Pż-xcA<brM#8[2}
ZxBh෪Ԁ.&b+4S"LizVü~Q:?Rゼy9ڪfUS-XAt$s#N:RqO̍y|ugȃɳ*~l̻- )#
pdVkJ#dIJ+G*T~=$2}|@!+V\~Fs/-WϬ1|hGLze Lc2׏ z x?m{ hs3uVze"w]&xq'NOjk}
?+}|ikeO猐K!j%r̑*ᚙ2RVW#E?r)~-?Ut:8ЂkS!S@ UzSyGnY,VB襮rLyʽ4Tz.
5
&VSyb@V1'  Q]m#G<BmyU+%l[pA/Mfs. <H5
i1_%F:%wJ")acyn0x<i[Qk0 
j:^dtbJ*
ւ!Cț^4ӛǜ!^r.ece!|!
#h;2SU1U\Zhnp[ h[1:{x'I==0ޑg(H7`G-xb5VAeO[@PQb`]˙I %AUد9X|8G1.T cUfJ#-xl$f/*
 * WARNING: do not edit!
 * Generated by Makefile from include/openssl/ssl.h.in
 *
 * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
 * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
 * Copyright 2005 Nokia. All rights reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */



#ifndef OPENSSL_SSL_H
# define OPENSSL_SSL_H
# pragma once

# include <openssl/macros.h>
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define HEADER_SSL_H
# endif

# include <openssl/e_os2.h>
# include <openssl/opensslconf.h>
# include <openssl/comp.h>
# include <openssl/bio.h>
# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  include <openssl/x509.h>
#  include <openssl/crypto.h>
#  include <openssl/buffer.h>
# endif
# include <openssl/lhash.h>
# include <openssl/pem.h>
# include <openssl/hmac.h>
# include <openssl/async.h>

# include <openssl/safestack.h>
# include <openssl/symhacks.h>
# include <openssl/ct.h>
# include <openssl/sslerr.h>
# include <openssl/prov_ssl.h>

#ifdef  __cplusplus
extern "C" {
#endif

/* OpenSSL version number for ASN.1 encoding of the session information */
/*-
 * Version 0 - initial version
 * Version 1 - added the optional peer certificate
 */
# define SSL_SESSION_ASN1_VERSION 0x0001

# define SSL_MAX_SSL_SESSION_ID_LENGTH           32
# define SSL_MAX_SID_CTX_LENGTH                  32

# define SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES     (512/8)
# define SSL_MAX_KEY_ARG_LENGTH                  8
/* SSL_MAX_MASTER_KEY_LENGTH is defined in prov_ssl.h */

/* The maximum number of encrypt/decrypt pipelines we can support */
# define SSL_MAX_PIPELINES  32

/* text strings for the ciphers */

/* These are used to specify which ciphers to use and not to use */

# define SSL_TXT_LOW             "LOW"
# define SSL_TXT_MEDIUM          "MEDIUM"
# define SSL_TXT_HIGH            "HIGH"
# define SSL_TXT_FIPS            "FIPS"

# define SSL_TXT_aNULL           "aNULL"
# define SSL_TXT_eNULL           "eNULL"
# define SSL_TXT_NULL            "NULL"

# define SSL_TXT_kRSA            "kRSA"
# define SSL_TXT_kDHr            "kDHr"/* this cipher class has been removed */
# define SSL_TXT_kDHd            "kDHd"/* this cipher class has been removed */
# define SSL_TXT_kDH             "kDH"/* this cipher class has been removed */
# define SSL_TXT_kEDH            "kEDH"/* alias for kDHE */
# define SSL_TXT_kDHE            "kDHE"
# define SSL_TXT_kECDHr          "kECDHr"/* this cipher class has been removed */
# define SSL_TXT_kECDHe          "kECDHe"/* this cipher class has been removed */
# define SSL_TXT_kECDH           "kECDH"/* this cipher class has been removed */
# define SSL_TXT_kEECDH          "kEECDH"/* alias for kECDHE */
# define SSL_TXT_kECDHE          "kECDHE"
# define SSL_TXT_kPSK            "kPSK"
# define SSL_TXT_kRSAPSK         "kRSAPSK"
# define SSL_TXT_kECDHEPSK       "kECDHEPSK"
# define SSL_TXT_kDHEPSK         "kDHEPSK"
# define SSL_TXT_kGOST           "kGOST"
# define SSL_TXT_kGOST18         "kGOST18"
# define SSL_TXT_kSRP            "kSRP"

# define SSL_TXT_aRSA            "aRSA"
# define SSL_TXT_aDSS            "aDSS"
# define SSL_TXT_aDH             "aDH"/* this cipher class has been removed */
# define SSL_TXT_aECDH           "aECDH"/* this cipher class has been removed */
# define SSL_TXT_aECDSA          "aECDSA"
# define SSL_TXT_aPSK            "aPSK"
# define SSL_TXT_aGOST94         "aGOST94"
# define SSL_TXT_aGOST01         "aGOST01"
# define SSL_TXT_aGOST12         "aGOST12"
# define SSL_TXT_aGOST           "aGOST"
# define SSL_TXT_aSRP            "aSRP"

# define SSL_TXT_DSS             "DSS"
# define SSL_TXT_DH              "DH"
# define SSL_TXT_DHE             "DHE"/* same as "kDHE:-ADH" */
# define SSL_TXT_EDH             "EDH"/* alias for DHE */
# define SSL_TXT_ADH             "ADH"
# define SSL_TXT_RSA             "RSA"
# define SSL_TXT_ECDH            "ECDH"
# define SSL_TXT_EECDH           "EECDH"/* alias for ECDHE" */
# define SSL_TXT_ECDHE           "ECDHE"/* same as "kECDHE:-AECDH" */
# define SSL_TXT_AECDH           "AECDH"
# define SSL_TXT_ECDSA           "ECDSA"
# define SSL_TXT_PSK             "PSK"
# define SSL_TXT_SRP             "SRP"

# define SSL_TXT_DES             "DES"
# define SSL_TXT_3DES            "3DES"
# define SSL_TXT_RC4             "RC4"
# define SSL_TXT_RC2             "RC2"
# define SSL_TXT_IDEA            "IDEA"
# define SSL_TXT_SEED            "SEED"
# define SSL_TXT_AES128          "AES128"
# define SSL_TXT_AES256          "AES256"
# define SSL_TXT_AES             "AES"
# define SSL_TXT_AES_GCM         "AESGCM"
# define SSL_TXT_AES_CCM         "AESCCM"
# define SSL_TXT_AES_CCM_8       "AESCCM8"
# define SSL_TXT_CAMELLIA128     "CAMELLIA128"
# define SSL_TXT_CAMELLIA256     "CAMELLIA256"
# define SSL_TXT_CAMELLIA        "CAMELLIA"
# define SSL_TXT_CHACHA20        "CHACHA20"
# define SSL_TXT_GOST            "GOST89"
# define SSL_TXT_ARIA            "ARIA"
# define SSL_TXT_ARIA_GCM        "ARIAGCM"
# define SSL_TXT_ARIA128         "ARIA128"
# define SSL_TXT_ARIA256         "ARIA256"
# define SSL_TXT_GOST2012_GOST8912_GOST8912 "GOST2012-GOST8912-GOST8912"
# define SSL_TXT_CBC             "CBC"

# define SSL_TXT_MD5             "MD5"
# define SSL_TXT_SHA1            "SHA1"
# define SSL_TXT_SHA             "SHA"/* same as "SHA1" */
# define SSL_TXT_GOST94          "GOST94"
# define SSL_TXT_GOST89MAC       "GOST89MAC"
# define SSL_TXT_GOST12          "GOST12"
# define SSL_TXT_GOST89MAC12     "GOST89MAC12"
# define SSL_TXT_SHA256          "SHA256"
# define SSL_TXT_SHA384          "SHA384"

# define SSL_TXT_SSLV3           "SSLv3"
# define SSL_TXT_TLSV1           "TLSv1"
# define SSL_TXT_TLSV1_1         "TLSv1.1"
# define SSL_TXT_TLSV1_2         "TLSv1.2"

# define SSL_TXT_ALL             "ALL"

/*-
 * COMPLEMENTOF* definitions. These identifiers are used to (de-select)
 * ciphers normally not being used.
 * Example: "RC4" will activate all ciphers using RC4 including ciphers
 * without authentication, which would normally disabled by DEFAULT (due
 * the "!ADH" being part of default). Therefore "RC4:!COMPLEMENTOFDEFAULT"
 * will make sure that it is also disabled in the specific selection.
 * COMPLEMENTOF* identifiers are portable between version, as adjustments
 * to the default cipher setup will also be included here.
 *
 * COMPLEMENTOFDEFAULT does not experience the same special treatment that
 * DEFAULT gets, as only selection is being done and no sorting as needed
 * for DEFAULT.
 */
# define SSL_TXT_CMPALL          "COMPLEMENTOFALL"
# define SSL_TXT_CMPDEF          "COMPLEMENTOFDEFAULT"

/*
 * The following cipher list is used by default. It also is substituted when
 * an application-defined cipher list string starts with 'DEFAULT'.
 * This applies to ciphersuites for TLSv1.2 and below.
 * DEPRECATED IN 3.0.0, in favor of OSSL_default_cipher_list()
 * Update both macro and function simultaneously
 */
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_DEFAULT_CIPHER_LIST "ALL:!COMPLEMENTOFDEFAULT:!eNULL"
/*
 * This is the default set of TLSv1.3 ciphersuites
 * DEPRECATED IN 3.0.0, in favor of OSSL_default_ciphersuites()
 * Update both macro and function simultaneously
 */
#  define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \
                                   "TLS_CHACHA20_POLY1305_SHA256:" \
                                   "TLS_AES_128_GCM_SHA256"
# endif
/*
 * As of OpenSSL 1.0.0, ssl_create_cipher_list() in ssl/ssl_ciph.c always
 * starts with a reasonable order, and all we have to do for DEFAULT is
 * throwing out anonymous and unencrypted ciphersuites! (The latter are not
 * actually enabled by ALL, but "ALL:RSA" would enable some of them.)
 */

/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */
# define SSL_SENT_SHUTDOWN       1
# define SSL_RECEIVED_SHUTDOWN   2

#ifdef __cplusplus
}
#endif

#ifdef  __cplusplus
extern "C" {
#endif

# define SSL_FILETYPE_ASN1       X509_FILETYPE_ASN1
# define SSL_FILETYPE_PEM        X509_FILETYPE_PEM

/*
 * This is needed to stop compilers complaining about the 'struct ssl_st *'
 * function parameters used to prototype callbacks in SSL_CTX.
 */
typedef struct ssl_st *ssl_crock_st;
typedef struct tls_session_ticket_ext_st TLS_SESSION_TICKET_EXT;
typedef struct ssl_method_st SSL_METHOD;
typedef struct ssl_cipher_st SSL_CIPHER;
typedef struct ssl_session_st SSL_SESSION;
typedef struct tls_sigalgs_st TLS_SIGALGS;
typedef struct ssl_conf_ctx_st SSL_CONF_CTX;
typedef struct ssl_comp_st SSL_COMP;

STACK_OF(SSL_CIPHER);
STACK_OF(SSL_COMP);

/* SRTP protection profiles for use with the use_srtp extension (RFC 5764)*/
typedef struct srtp_protection_profile_st {
    const char *name;
    unsigned long id;
} SRTP_PROTECTION_PROFILE;
SKM_DEFINE_STACK_OF_INTERNAL(SRTP_PROTECTION_PROFILE, SRTP_PROTECTION_PROFILE, SRTP_PROTECTION_PROFILE)
#define sk_SRTP_PROTECTION_PROFILE_num(sk) OPENSSL_sk_num(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk))
#define sk_SRTP_PROTECTION_PROFILE_value(sk, idx) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_value(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk), (idx)))
#define sk_SRTP_PROTECTION_PROFILE_new(cmp) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new(ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp)))
#define sk_SRTP_PROTECTION_PROFILE_new_null() ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new_null())
#define sk_SRTP_PROTECTION_PROFILE_new_reserve(cmp, n) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new_reserve(ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp), (n)))
#define sk_SRTP_PROTECTION_PROFILE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (n))
#define sk_SRTP_PROTECTION_PROFILE_free(sk) OPENSSL_sk_free(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk))
#define sk_SRTP_PROTECTION_PROFILE_zero(sk) OPENSSL_sk_zero(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk))
#define sk_SRTP_PROTECTION_PROFILE_delete(sk, i) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_delete(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (i)))
#define sk_SRTP_PROTECTION_PROFILE_delete_ptr(sk, ptr) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_delete_ptr(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)))
#define sk_SRTP_PROTECTION_PROFILE_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))
#define sk_SRTP_PROTECTION_PROFILE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))
#define sk_SRTP_PROTECTION_PROFILE_pop(sk) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_pop(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk)))
#define sk_SRTP_PROTECTION_PROFILE_shift(sk) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_shift(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk)))
#define sk_SRTP_PROTECTION_PROFILE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk),ossl_check_SRTP_PROTECTION_PROFILE_freefunc_type(freefunc))
#define sk_SRTP_PROTECTION_PROFILE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr), (idx))
#define sk_SRTP_PROTECTION_PROFILE_set(sk, idx, ptr) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_set(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (idx), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)))
#define sk_SRTP_PROTECTION_PROFILE_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))
#define sk_SRTP_PROTECTION_PROFILE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))
#define sk_SRTP_PROTECTION_PROFILE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr), pnum)
#define sk_SRTP_PROTECTION_PROFILE_sort(sk) OPENSSL_sk_sort(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk))
#define sk_SRTP_PROTECTION_PROFILE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk))
#define sk_SRTP_PROTECTION_PROFILE_dup(sk) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_dup(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk)))
#define sk_SRTP_PROTECTION_PROFILE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_deep_copy(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_copyfunc_type(copyfunc), ossl_check_SRTP_PROTECTION_PROFILE_freefunc_type(freefunc)))
#define sk_SRTP_PROTECTION_PROFILE_set_cmp_func(sk, cmp) ((sk_SRTP_PROTECTION_PROFILE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp)))



typedef int (*tls_session_ticket_ext_cb_fn)(SSL *s, const unsigned char *data,
                                            int len, void *arg);
typedef int (*tls_session_secret_cb_fn)(SSL *s, void *secret, int *secret_len,
                                        STACK_OF(SSL_CIPHER) *peer_ciphers,
                                        const SSL_CIPHER **cipher, void *arg);

/* Extension context codes */
/* This extension is only allowed in TLS */
#define SSL_EXT_TLS_ONLY                        0x0001
/* This extension is only allowed in DTLS */
#define SSL_EXT_DTLS_ONLY                       0x0002
/* Some extensions may be allowed in DTLS but we don't implement them for it */
#define SSL_EXT_TLS_IMPLEMENTATION_ONLY         0x0004
/* Most extensions are not defined for SSLv3 but EXT_TYPE_renegotiate is */
#define SSL_EXT_SSL3_ALLOWED                    0x0008
/* Extension is only defined for TLS1.2 and below */
#define SSL_EXT_TLS1_2_AND_BELOW_ONLY           0x0010
/* Extension is only defined for TLS1.3 and above */
#define SSL_EXT_TLS1_3_ONLY                     0x0020
/* Ignore this extension during parsing if we are resuming */
#define SSL_EXT_IGNORE_ON_RESUMPTION            0x0040
#define SSL_EXT_CLIENT_HELLO                    0x0080
/* Really means TLS1.2 or below */
#define SSL_EXT_TLS1_2_SERVER_HELLO             0x0100
#define SSL_EXT_TLS1_3_SERVER_HELLO             0x0200
#define SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS     0x0400
#define SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST      0x0800
#define SSL_EXT_TLS1_3_CERTIFICATE              0x1000
#define SSL_EXT_TLS1_3_NEW_SESSION_TICKET       0x2000
#define SSL_EXT_TLS1_3_CERTIFICATE_REQUEST      0x4000

/* Typedefs for handling custom extensions */

typedef int (*custom_ext_add_cb)(SSL *s, unsigned int ext_type,
                                 const unsigned char **out, size_t *outlen,
                                 int *al, void *add_arg);

typedef void (*custom_ext_free_cb)(SSL *s, unsigned int ext_type,
                                   const unsigned char *out, void *add_arg);

typedef int (*custom_ext_parse_cb)(SSL *s, unsigned int ext_type,
                                   const unsigned char *in, size_t inlen,
                                   int *al, void *parse_arg);


typedef int (*SSL_custom_ext_add_cb_ex)(SSL *s, unsigned int ext_type,
                                        unsigned int context,
                                        const unsigned char **out,
                                        size_t *outlen, X509 *x,
                                        size_t chainidx,
                                        int *al, void *add_arg);

typedef void (*SSL_custom_ext_free_cb_ex)(SSL *s, unsigned int ext_type,
                                          unsigned int context,
                                          const unsigned char *out,
                                          void *add_arg);

typedef int (*SSL_custom_ext_parse_cb_ex)(SSL *s, unsigned int ext_type,
                                          unsigned int context,
                                          const unsigned char *in,
                                          size_t inlen, X509 *x,
                                          size_t chainidx,
                                          int *al, void *parse_arg);

/* Typedef for verification callback */
typedef int (*SSL_verify_cb)(int preverify_ok, X509_STORE_CTX *x509_ctx);

/* Typedef for SSL async callback */
typedef int (*SSL_async_callback_fn)(SSL *s, void *arg);

#define SSL_OP_BIT(n)  ((uint64_t)1 << (uint64_t)n)

/*
 * SSL/TLS connection options.
 */
    /* Disable Extended master secret */
# define SSL_OP_NO_EXTENDED_MASTER_SECRET                SSL_OP_BIT(0)
    /* Cleanse plaintext copies of data delivered to the application */
# define SSL_OP_CLEANSE_PLAINTEXT                        SSL_OP_BIT(1)
    /* Allow initial connection to servers that don't support RI */
# define SSL_OP_LEGACY_SERVER_CONNECT                    SSL_OP_BIT(2)
    /* Enable support for Kernel TLS */
# define SSL_OP_ENABLE_KTLS                              SSL_OP_BIT(3)
# define SSL_OP_TLSEXT_PADDING                           SSL_OP_BIT(4)
# define SSL_OP_SAFARI_ECDHE_ECDSA_BUG                   SSL_OP_BIT(6)
# define SSL_OP_IGNORE_UNEXPECTED_EOF                    SSL_OP_BIT(7)
# define SSL_OP_ALLOW_CLIENT_RENEGOTIATION               SSL_OP_BIT(8)
# define SSL_OP_DISABLE_TLSEXT_CA_NAMES                  SSL_OP_BIT(9)
    /* In TLSv1.3 allow a non-(ec)dhe based kex_mode */
# define SSL_OP_ALLOW_NO_DHE_KEX                         SSL_OP_BIT(10)
    /*
     * Disable SSL 3.0/TLS 1.0 CBC vulnerability workaround that was added
     * in OpenSSL 0.9.6d.  Usually (depending on the application protocol)
     * the workaround is not needed.  Unfortunately some broken SSL/TLS
     * implementations cannot handle it at all, which is why we include it
     * in SSL_OP_ALL. Added in 0.9.6e
     */
# define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS              SSL_OP_BIT(11)
    /* DTLS options */
# define SSL_OP_NO_QUERY_MTU                             SSL_OP_BIT(12)
    /* Turn on Cookie Exchange (on relevant for servers) */
# define SSL_OP_COOKIE_EXCHANGE                          SSL_OP_BIT(13)
    /* Don't use RFC4507 ticket extension */
# define SSL_OP_NO_TICKET                                SSL_OP_BIT(14)
# ifndef OPENSSL_NO_DTLS1_METHOD
    /*
     * Use Cisco's version identifier of DTLS_BAD_VER
     * (only with deprecated DTLSv1_client_method())
     */
#  define SSL_OP_CISCO_ANYCONNECT                        SSL_OP_BIT(15)
# endif
    /* As server, disallow session resumption on renegotiation */
# define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION   SSL_OP_BIT(16)
    /* Don't use compression even if supported */
# define SSL_OP_NO_COMPRESSION                           SSL_OP_BIT(17)
    /* Permit unsafe legacy renegotiation */
# define SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION        SSL_OP_BIT(18)
    /* Disable encrypt-then-mac */
# define SSL_OP_NO_ENCRYPT_THEN_MAC                      SSL_OP_BIT(19)
    /*
     * Enable TLSv1.3 Compatibility mode. This is on by default. A future
     * version of OpenSSL may have this disabled by default.
     */
# define SSL_OP_ENABLE_MIDDLEBOX_COMPAT                  SSL_OP_BIT(20)
    /*
     * Prioritize Chacha20Poly1305 when client does.
     * Modifies SSL_OP_CIPHER_SERVER_PREFERENCE
     */
# define SSL_OP_PRIORITIZE_CHACHA                        SSL_OP_BIT(21)
    /*
     * Set on servers to choose the cipher according to server's preferences.
     */
# define SSL_OP_CIPHER_SERVER_PREFERENCE                 SSL_OP_BIT(22)
    /*
     * If set, a server will allow a client to issue a SSLv3.0 version
     * number as latest version supported in the premaster secret, even when
     * TLSv1.0 (version 3.1) was announced in the client hello. Normally
     * this is forbidden to prevent version rollback attacks.
     */
# define SSL_OP_TLS_ROLLBACK_BUG                         SSL_OP_BIT(23)
    /*
     * Switches off automatic TLSv1.3 anti-replay protection for early data.
     * This is a server-side option only (no effect on the client).
     */
# define SSL_OP_NO_ANTI_REPLAY                           SSL_OP_BIT(24)
# define SSL_OP_NO_SSLv3                                 SSL_OP_BIT(25)
# define SSL_OP_NO_TLSv1                                 SSL_OP_BIT(26)
# define SSL_OP_NO_TLSv1_2                               SSL_OP_BIT(27)
# define SSL_OP_NO_TLSv1_1                               SSL_OP_BIT(28)
# define SSL_OP_NO_TLSv1_3                               SSL_OP_BIT(29)
# define SSL_OP_NO_DTLSv1                                SSL_OP_BIT(26)
# define SSL_OP_NO_DTLSv1_2                              SSL_OP_BIT(27)
    /* Disallow all renegotiation */
# define SSL_OP_NO_RENEGOTIATION                         SSL_OP_BIT(30)
    /*
     * Make server add server-hello extension from early version of
     * cryptopro draft, when GOST ciphersuite is negotiated. Required for
     * interoperability with CryptoPro CSP 3.x
     */
# define SSL_OP_CRYPTOPRO_TLSEXT_BUG                     SSL_OP_BIT(31)

/*
 * Option "collections."
 */
# define SSL_OP_NO_SSL_MASK \
        ( SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 \
          | SSL_OP_NO_TLSv1_2 | SSL_OP_NO_TLSv1_3 )
# define SSL_OP_NO_DTLS_MASK \
        ( SSL_OP_NO_DTLSv1 | SSL_OP_NO_DTLSv1_2 )

/* Various bug workarounds that should be rather harmless. */
# define SSL_OP_ALL \
        ( SSL_OP_CRYPTOPRO_TLSEXT_BUG | SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS \
          | SSL_OP_TLSEXT_PADDING | SSL_OP_SAFARI_ECDHE_ECDSA_BUG )

/*
 * OBSOLETE OPTIONS retained for compatibility
 */

# define SSL_OP_MICROSOFT_SESS_ID_BUG                    0x0
# define SSL_OP_NETSCAPE_CHALLENGE_BUG                   0x0
# define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG         0x0
# define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG              0x0
# define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER               0x0
# define SSL_OP_MSIE_SSLV2_RSA_PADDING                   0x0
# define SSL_OP_SSLEAY_080_CLIENT_DH_BUG                 0x0
# define SSL_OP_TLS_D5_BUG                               0x0
# define SSL_OP_TLS_BLOCK_PADDING_BUG                    0x0
# define SSL_OP_SINGLE_ECDH_USE                          0x0
# define SSL_OP_SINGLE_DH_USE                            0x0
# define SSL_OP_EPHEMERAL_RSA                            0x0
# define SSL_OP_NO_SSLv2                                 0x0
# define SSL_OP_PKCS1_CHECK_1                            0x0
# define SSL_OP_PKCS1_CHECK_2                            0x0
# define SSL_OP_NETSCAPE_CA_DN_BUG                       0x0
# define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG          0x0

/*
 * Allow SSL_write(..., n) to return r with 0 < r < n (i.e. report success
 * when just a single record has been written):
 */
# define SSL_MODE_ENABLE_PARTIAL_WRITE       0x00000001U
/*
 * Make it possible to retry SSL_write() with changed buffer location (buffer
 * contents must stay the same!); this is not the default to avoid the
 * misconception that non-blocking SSL_write() behaves like non-blocking
 * write():
 */
# define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 0x00000002U
/*
 * Never bother the application with retries if the transport is blocking:
 */
# define SSL_MODE_AUTO_RETRY 0x00000004U
/* Don't attempt to automatically build certificate chain */
# define SSL_MODE_NO_AUTO_CHAIN 0x00000008U
/*
 * Save RAM by releasing read and write buffers when they're empty. (SSL3 and
 * TLS only.) Released buffers are freed.
 */
# define SSL_MODE_RELEASE_BUFFERS 0x00000010U
/*
 * Send the current time in the Random fields of the ClientHello and
 * ServerHello records for compatibility with hypothetical implementations
 * that require it.
 */
# define SSL_MODE_SEND_CLIENTHELLO_TIME 0x00000020U
# define SSL_MODE_SEND_SERVERHELLO_TIME 0x00000040U
/*
 * Send TLS_FALLBACK_SCSV in the ClientHello. To be set only by applications
 * that reconnect with a downgraded protocol version; see
 * draft-ietf-tls-downgrade-scsv-00 for details. DO NOT ENABLE THIS if your
 * application attempts a normal handshake. Only use this in explicit
 * fallback retries, following the guidance in
 * draft-ietf-tls-downgrade-scsv-00.
 */
# define SSL_MODE_SEND_FALLBACK_SCSV 0x00000080U
/*
 * Support Asynchronous operation
 */
# define SSL_MODE_ASYNC 0x00000100U

/*
 * When using DTLS/SCTP, include the terminating zero in the label
 * used for computing the endpoint-pair shared secret. Required for
 * interoperability with implementations having this bug like these
 * older version of OpenSSL:
 * - OpenSSL 1.0.0 series
 * - OpenSSL 1.0.1 series
 * - OpenSSL 1.0.2 series
 * - OpenSSL 1.1.0 series
 * - OpenSSL 1.1.1 and 1.1.1a
 */
# define SSL_MODE_DTLS_SCTP_LABEL_LENGTH_BUG 0x00000400U

/* Cert related flags */
/*
 * Many implementations ignore some aspects of the TLS standards such as
 * enforcing certificate chain algorithms. When this is set we enforce them.
 */
# define SSL_CERT_FLAG_TLS_STRICT                0x00000001U

/* Suite B modes, takes same values as certificate verify flags */
# define SSL_CERT_FLAG_SUITEB_128_LOS_ONLY       0x10000
/* Suite B 192 bit only mode */
# define SSL_CERT_FLAG_SUITEB_192_LOS            0x20000
/* Suite B 128 bit mode allowing 192 bit algorithms */
# define SSL_CERT_FLAG_SUITEB_128_LOS            0x30000

/* Perform all sorts of protocol violations for testing purposes */
# define SSL_CERT_FLAG_BROKEN_PROTOCOL           0x10000000

/* Flags for building certificate chains */
/* Treat any existing certificates as untrusted CAs */
# define SSL_BUILD_CHAIN_FLAG_UNTRUSTED          0x1
/* Don't include root CA in chain */
# define SSL_BUILD_CHAIN_FLAG_NO_ROOT            0x2
/* Just check certificates already there */
# define SSL_BUILD_CHAIN_FLAG_CHECK              0x4
/* Ignore verification errors */
# define SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR       0x8
/* Clear verification errors from queue */
# define SSL_BUILD_CHAIN_FLAG_CLEAR_ERROR        0x10

/* Flags returned by SSL_check_chain */
/* Certificate can be used with this session */
# define CERT_PKEY_VALID         0x1
/* Certificate can also be used for signing */
# define CERT_PKEY_SIGN          0x2
/* EE certificate signing algorithm OK */
# define CERT_PKEY_EE_SIGNATURE  0x10
/* CA signature algorithms OK */
# define CERT_PKEY_CA_SIGNATURE  0x20
/* EE certificate parameters OK */
# define CERT_PKEY_EE_PARAM      0x40
/* CA certificate parameters OK */
# define CERT_PKEY_CA_PARAM      0x80
/* Signing explicitly allowed as opposed to SHA1 fallback */
# define CERT_PKEY_EXPLICIT_SIGN 0x100
/* Client CA issuer names match (always set for server cert) */
# define CERT_PKEY_ISSUER_NAME   0x200
/* Cert type matches client types (always set for server cert) */
# define CERT_PKEY_CERT_TYPE     0x400
/* Cert chain suitable to Suite B */
# define CERT_PKEY_SUITEB        0x800

# define SSL_CONF_FLAG_CMDLINE           0x1
# define SSL_CONF_FLAG_FILE              0x2
# define SSL_CONF_FLAG_CLIENT            0x4
# define SSL_CONF_FLAG_SERVER            0x8
# define SSL_CONF_FLAG_SHOW_ERRORS       0x10
# define SSL_CONF_FLAG_CERTIFICATE       0x20
# define SSL_CONF_FLAG_REQUIRE_PRIVATE   0x40
/* Configuration value types */
# define SSL_CONF_TYPE_UNKNOWN           0x0
# define SSL_CONF_TYPE_STRING            0x1
# define SSL_CONF_TYPE_FILE              0x2
# define SSL_CONF_TYPE_DIR               0x3
# define SSL_CONF_TYPE_NONE              0x4
# define SSL_CONF_TYPE_STORE             0x5

/* Maximum length of the application-controlled segment of a a TLSv1.3 cookie */
# define SSL_COOKIE_LENGTH                       4096

/*
 * Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value, they
 * cannot be used to clear bits.
 */

uint64_t SSL_CTX_get_options(const SSL_CTX *ctx);
uint64_t SSL_get_options(const SSL *s);
uint64_t SSL_CTX_clear_options(SSL_CTX *ctx, uint64_t op);
uint64_t SSL_clear_options(SSL *s, uint64_t op);
uint64_t SSL_CTX_set_options(SSL_CTX *ctx, uint64_t op);
uint64_t SSL_set_options(SSL *s, uint64_t op);

# define SSL_CTX_set_mode(ctx,op) \
        SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL)
# define SSL_CTX_clear_mode(ctx,op) \
        SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_MODE,(op),NULL)
# define SSL_CTX_get_mode(ctx) \
        SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,0,NULL)
# define SSL_clear_mode(ssl,op) \
        SSL_ctrl((ssl),SSL_CTRL_CLEAR_MODE,(op),NULL)
# define SSL_set_mode(ssl,op) \
        SSL_ctrl((ssl),SSL_CTRL_MODE,(op),NULL)
# define SSL_get_mode(ssl) \
        SSL_ctrl((ssl),SSL_CTRL_MODE,0,NULL)
# define SSL_set_mtu(ssl, mtu) \
        SSL_ctrl((ssl),SSL_CTRL_SET_MTU,(mtu),NULL)
# define DTLS_set_link_mtu(ssl, mtu) \
        SSL_ctrl((ssl),DTLS_CTRL_SET_LINK_MTU,(mtu),NULL)
# define DTLS_get_link_min_mtu(ssl) \
        SSL_ctrl((ssl),DTLS_CTRL_GET_LINK_MIN_MTU,0,NULL)

# define SSL_get_secure_renegotiation_support(ssl) \
        SSL_ctrl((ssl), SSL_CTRL_GET_RI_SUPPORT, 0, NULL)

# define SSL_CTX_set_cert_flags(ctx,op) \
        SSL_CTX_ctrl((ctx),SSL_CTRL_CERT_FLAGS,(op),NULL)
# define SSL_set_cert_flags(s,op) \
        SSL_ctrl((s),SSL_CTRL_CERT_FLAGS,(op),NULL)
# define SSL_CTX_clear_cert_flags(ctx,op) \
        SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL)
# define SSL_clear_cert_flags(s,op) \
        SSL_ctrl((s),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL)

void SSL_CTX_set_msg_callback(SSL_CTX *ctx,
                              void (*cb) (int write_p, int version,
                                          int content_type, const void *buf,
                                          size_t len, SSL *ssl, void *arg));
void SSL_set_msg_callback(SSL *ssl,
                          void (*cb) (int write_p, int version,
                                      int content_type, const void *buf,
                                      size_t len, SSL *ssl, void *arg));
# define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))
# define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))

# define SSL_get_extms_support(s) \
        SSL_ctrl((s),SSL_CTRL_GET_EXTMS_SUPPORT,0,NULL)

# ifndef OPENSSL_NO_SRP
/* see tls_srp.c */
#  ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0 __owur int SSL_SRP_CTX_init(SSL *s);
OSSL_DEPRECATEDIN_3_0 __owur int SSL_CTX_SRP_CTX_init(SSL_CTX *ctx);
OSSL_DEPRECATEDIN_3_0 int SSL_SRP_CTX_free(SSL *ctx);
OSSL_DEPRECATEDIN_3_0 int SSL_CTX_SRP_CTX_free(SSL_CTX *ctx);
OSSL_DEPRECATEDIN_3_0 __owur int SSL_srp_server_param_with_username(SSL *s,
                                                                    int *ad);
OSSL_DEPRECATEDIN_3_0 __owur int SRP_Calc_A_param(SSL *s);
#  endif
# endif

/* 100k max cert list */
# define SSL_MAX_CERT_LIST_DEFAULT (1024*100)

# define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT      (1024*20)

/*
 * This callback type is used inside SSL_CTX, SSL, and in the functions that
 * set them. It is used to override the generation of SSL/TLS session IDs in
 * a server. Return value should be zero on an error, non-zero to proceed.
 * Also, callbacks should themselves check if the id they generate is unique
 * otherwise the SSL handshake will fail with an error - callbacks can do
 * this using the 'ssl' value they're passed by;
 * SSL_has_matching_session_id(ssl, id, *id_len) The length value passed in
 * is set at the maximum size the session ID can be. In SSLv3/TLSv1 it is 32
 * bytes. The callback can alter this length to be less if desired. It is
 * also an error for the callback to set the size to zero.
 */
typedef int (*GEN_SESSION_CB) (SSL *ssl, unsigned char *id,
                               unsigned int *id_len);

# define SSL_SESS_CACHE_OFF                      0x0000
# define SSL_SESS_CACHE_CLIENT                   0x0001
# define SSL_SESS_CACHE_SERVER                   0x0002
# define SSL_SESS_CACHE_BOTH     (SSL_SESS_CACHE_CLIENT|SSL_SESS_CACHE_SERVER)
# define SSL_SESS_CACHE_NO_AUTO_CLEAR            0x0080
/* enough comments already ... see SSL_CTX_set_session_cache_mode(3) */
# define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP       0x0100
# define SSL_SESS_CACHE_NO_INTERNAL_STORE        0x0200
# define SSL_SESS_CACHE_NO_INTERNAL \
        (SSL_SESS_CACHE_NO_INTERNAL_LOOKUP|SSL_SESS_CACHE_NO_INTERNAL_STORE)
# define SSL_SESS_CACHE_UPDATE_TIME              0x0400

LHASH_OF(SSL_SESSION) *SSL_CTX_sessions(SSL_CTX *ctx);
# define SSL_CTX_sess_number(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_NUMBER,0,NULL)
# define SSL_CTX_sess_connect(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT,0,NULL)
# define SSL_CTX_sess_connect_good(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_GOOD,0,NULL)
# define SSL_CTX_sess_connect_renegotiate(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_RENEGOTIATE,0,NULL)
# define SSL_CTX_sess_accept(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT,0,NULL)
# define SSL_CTX_sess_accept_renegotiate(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_RENEGOTIATE,0,NULL)
# define SSL_CTX_sess_accept_good(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_GOOD,0,NULL)
# define SSL_CTX_sess_hits(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_HIT,0,NULL)
# define SSL_CTX_sess_cb_hits(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CB_HIT,0,NULL)
# define SSL_CTX_sess_misses(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_MISSES,0,NULL)
# define SSL_CTX_sess_timeouts(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_TIMEOUTS,0,NULL)
# define SSL_CTX_sess_cache_full(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CACHE_FULL,0,NULL)

void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx,
                             int (*new_session_cb) (struct ssl_st *ssl,
                                                    SSL_SESSION *sess));
int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx)) (struct ssl_st *ssl,
                                              SSL_SESSION *sess);
void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx,
                                void (*remove_session_cb) (struct ssl_ctx_st
                                                           *ctx,
                                                           SSL_SESSION *sess));
void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx)) (struct ssl_ctx_st *ctx,
                                                  SSL_SESSION *sess);
void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx,
                             SSL_SESSION *(*get_session_cb) (struct ssl_st
                                                             *ssl,
                                                             const unsigned char
                                                             *data, int len,
                                                             int *copy));
SSL_SESSION *(*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx)) (struct ssl_st *ssl,
                                                       const unsigned char *data,
                                                       int len, int *copy);
void SSL_CTX_set_info_callback(SSL_CTX *ctx,
                               void (*cb) (const SSL *ssl, int type, int val));
void (*SSL_CTX_get_info_callback(SSL_CTX *ctx)) (const SSL *ssl, int type,
                                                 int val);
void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx,
                                int (*client_cert_cb) (SSL *ssl, X509 **x509,
                                                       EVP_PKEY **pkey));
int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx)) (SSL *ssl, X509 **x509,
                                                 EVP_PKEY **pkey);
# ifndef OPENSSL_NO_ENGINE
__owur int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e);
# endif
void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx,
                                    int (*app_gen_cookie_cb) (SSL *ssl,
                                                              unsigned char
                                                              *cookie,
                                                              unsigned int
                                                              *cookie_len));
void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx,
                                  int (*app_verify_cookie_cb) (SSL *ssl,
                                                               const unsigned
                                                               char *cookie,
                                                               unsigned int
                                                               cookie_len));

void SSL_CTX_set_stateless_cookie_generate_cb(
    SSL_CTX *ctx,
    int (*gen_stateless_cookie_cb) (SSL *ssl,
                                    unsigned char *cookie,
                                    size_t *cookie_len));
void SSL_CTX_set_stateless_cookie_verify_cb(
    SSL_CTX *ctx,
    int (*verify_stateless_cookie_cb) (SSL *ssl,
                                       const unsigned char *cookie,
                                       size_t cookie_len));
# ifndef OPENSSL_NO_NEXTPROTONEG

typedef int (*SSL_CTX_npn_advertised_cb_func)(SSL *ssl,
                                              const unsigned char **out,
                                              unsigned int *outlen,
                                              void *arg);
void SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *s,
                                           SSL_CTX_npn_advertised_cb_func cb,
                                           void *arg);
#  define SSL_CTX_set_npn_advertised_cb SSL_CTX_set_next_protos_advertised_cb

typedef int (*SSL_CTX_npn_select_cb_func)(SSL *s,
                                          unsigned char **out,
                                          unsigned char *outlen,
                                          const unsigned char *in,
                                          unsigned int inlen,
                                          void *arg);
void SSL_CTX_set_next_proto_select_cb(SSL_CTX *s,
                                      SSL_CTX_npn_select_cb_func cb,
                                      void *arg);
#  define SSL_CTX_set_npn_select_cb SSL_CTX_set_next_proto_select_cb

void SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data,
                                    unsigned *len);
#  define SSL_get0_npn_negotiated SSL_get0_next_proto_negotiated
# endif

__owur int SSL_select_next_proto(unsigned char **out, unsigned char *outlen,
                                 const unsigned char *in, unsigned int inlen,
                                 const unsigned char *client,
                                 unsigned int client_len);

# define OPENSSL_NPN_UNSUPPORTED 0
# define OPENSSL_NPN_NEGOTIATED  1
# define OPENSSL_NPN_NO_OVERLAP  2

__owur int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos,
                                   unsigned int protos_len);
__owur int SSL_set_alpn_protos(SSL *ssl, const unsigned char *protos,
                               unsigned int protos_len);
typedef int (*SSL_CTX_alpn_select_cb_func)(SSL *ssl,
                                           const unsigned char **out,
                                           unsigned char *outlen,
                                           const unsigned char *in,
                                           unsigned int inlen,
                                           void *arg);
void SSL_CTX_set_alpn_select_cb(SSL_CTX *ctx,
                                SSL_CTX_alpn_select_cb_func cb,
                                void *arg);
void SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data,
                            unsigned int *len);

# ifndef OPENSSL_NO_PSK
/*
 * the maximum length of the buffer given to callbacks containing the
 * resulting identity/psk
 */
#  define PSK_MAX_IDENTITY_LEN 256
#  define PSK_MAX_PSK_LEN 512
typedef unsigned int (*SSL_psk_client_cb_func)(SSL *ssl,
                                               const char *hint,
                                               char *identity,
                                               unsigned int max_identity_len,
                                               unsigned char *psk,
                                               unsigned int max_psk_len);
void SSL_CTX_set_psk_client_callback(SSL_CTX *ctx, SSL_psk_client_cb_func cb);
void SSL_set_psk_client_callback(SSL *ssl, SSL_psk_client_cb_func cb);

typedef unsigned int (*SSL_psk_server_cb_func)(SSL *ssl,
                                               const char *identity,
                                               unsigned char *psk,
                                               unsigned int max_psk_len);
void SSL_CTX_set_psk_server_callback(SSL_CTX *ctx, SSL_psk_server_cb_func cb);
void SSL_set_psk_server_callback(SSL *ssl, SSL_psk_server_cb_func cb);

__owur int SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint);
__owur int SSL_use_psk_identity_hint(SSL *s, const char *identity_hint);
const char *SSL_get_psk_identity_hint(const SSL *s);
const char *SSL_get_psk_identity(const SSL *s);
# endif

typedef int (*SSL_psk_find_session_cb_func)(SSL *ssl,
                                            const unsigned char *identity,
                                            size_t identity_len,
                                            SSL_SESSION **sess);
typedef int (*SSL_psk_use_session_cb_func)(SSL *ssl, const EVP_MD *md,
                                           const unsigned char **id,
                                           size_t *idlen,
                                           SSL_SESSION **sess);

void SSL_set_psk_find_session_callback(SSL *s, SSL_psk_find_session_cb_func cb);
void SSL_CTX_set_psk_find_session_callback(SSL_CTX *ctx,
                                           SSL_psk_find_session_cb_func cb);
void SSL_set_psk_use_session_callback(SSL *s, SSL_psk_use_session_cb_func cb);
void SSL_CTX_set_psk_use_session_callback(SSL_CTX *ctx,
                                          SSL_psk_use_session_cb_func cb);

/* Register callbacks to handle custom TLS Extensions for client or server. */

__owur int SSL_CTX_has_client_custom_ext(const SSL_CTX *ctx,
                                         unsigned int ext_type);

__owur int SSL_CTX_add_client_custom_ext(SSL_CTX *ctx,
                                         unsigned int ext_type,
                                         custom_ext_add_cb add_cb,
                                         custom_ext_free_cb free_cb,
                                         void *add_arg,
                                         custom_ext_parse_cb parse_cb,
                                         void *parse_arg);

__owur int SSL_CTX_add_server_custom_ext(SSL_CTX *ctx,
                                         unsigned int ext_type,
                                         custom_ext_add_cb add_cb,
                                         custom_ext_free_cb free_cb,
                                         void *add_arg,
                                         custom_ext_parse_cb parse_cb,
                                         void *parse_arg);

__owur int SSL_CTX_add_custom_ext(SSL_CTX *ctx, unsigned int ext_type,
                                  unsigned int context,
                                  SSL_custom_ext_add_cb_ex add_cb,
                                  SSL_custom_ext_free_cb_ex free_cb,
                                  void *add_arg,
                                  SSL_custom_ext_parse_cb_ex parse_cb,
                                  void *parse_arg);

__owur int SSL_extension_supported(unsigned int ext_type);

# define SSL_NOTHING            1
# define SSL_WRITING            2
# define SSL_READING            3
# define SSL_X509_LOOKUP        4
# define SSL_ASYNC_PAUSED       5
# define SSL_ASYNC_NO_JOBS      6
# define SSL_CLIENT_HELLO_CB    7
# define SSL_RETRY_VERIFY       8

/* These will only be used when doing non-blocking IO */
# define SSL_want_nothing(s)         (SSL_want(s) == SSL_NOTHING)
# define SSL_want_read(s)            (SSL_want(s) == SSL_READING)
# define SSL_want_write(s)           (SSL_want(s) == SSL_WRITING)
# define SSL_want_x509_lookup(s)     (SSL_want(s) == SSL_X509_LOOKUP)
# define SSL_want_retry_verify(s)    (SSL_want(s) == SSL_RETRY_VERIFY)
# define SSL_want_async(s)           (SSL_want(s) == SSL_ASYNC_PAUSED)
# define SSL_want_async_job(s)       (SSL_want(s) == SSL_ASYNC_NO_JOBS)
# define SSL_want_client_hello_cb(s) (SSL_want(s) == SSL_CLIENT_HELLO_CB)

# define SSL_MAC_FLAG_READ_MAC_STREAM 1
# define SSL_MAC_FLAG_WRITE_MAC_STREAM 2
# define SSL_MAC_FLAG_READ_MAC_TLSTREE 4
# define SSL_MAC_FLAG_WRITE_MAC_TLSTREE 8

/*
 * A callback for logging out TLS key material. This callback should log out
 * |line| followed by a newline.
 */
typedef void (*SSL_CTX_keylog_cb_func)(const SSL *ssl, const char *line);

/*
 * SSL_CTX_set_keylog_callback configures a callback to log key material. This
 * is intended for debugging use with tools like Wireshark. The cb function
 * should log line followed by a newline.
 */
void SSL_CTX_set_keylog_callback(SSL_CTX *ctx, SSL_CTX_keylog_cb_func cb);

/*
 * SSL_CTX_get_keylog_callback returns the callback configured by
 * SSL_CTX_set_keylog_callback.
 */
SSL_CTX_keylog_cb_func SSL_CTX_get_keylog_callback(const SSL_CTX *ctx);

int SSL_CTX_set_max_early_data(SSL_CTX *ctx, uint32_t max_early_data);
uint32_t SSL_CTX_get_max_early_data(const SSL_CTX *ctx);
int SSL_set_max_early_data(SSL *s, uint32_t max_early_data);
uint32_t SSL_get_max_early_data(const SSL *s);
int SSL_CTX_set_recv_max_early_data(SSL_CTX *ctx, uint32_t recv_max_early_data);
uint32_t SSL_CTX_get_recv_max_early_data(const SSL_CTX *ctx);
int SSL_set_recv_max_early_data(SSL *s, uint32_t recv_max_early_data);
uint32_t SSL_get_recv_max_early_data(const SSL *s);

#ifdef __cplusplus
}
#endif

# include <openssl/ssl2.h>
# include <openssl/ssl3.h>
# include <openssl/tls1.h>      /* This is mostly sslv3 with a few tweaks */
# include <openssl/dtls1.h>     /* Datagram TLS */
# include <openssl/srtp.h>      /* Support for the use_srtp extension */

#ifdef  __cplusplus
extern "C" {
#endif

/*
 * These need to be after the above set of includes due to a compiler bug
 * in VisualStudio 2015
 */
SKM_DEFINE_STACK_OF_INTERNAL(SSL_CIPHER, const SSL_CIPHER, SSL_CIPHER)
#define sk_SSL_CIPHER_num(sk) OPENSSL_sk_num(ossl_check_const_SSL_CIPHER_sk_type(sk))
#define sk_SSL_CIPHER_value(sk, idx) ((const SSL_CIPHER *)OPENSSL_sk_value(ossl_check_const_SSL_CIPHER_sk_type(sk), (idx)))
#define sk_SSL_CIPHER_new(cmp) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new(ossl_check_SSL_CIPHER_compfunc_type(cmp)))
#define sk_SSL_CIPHER_new_null() ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new_null())
#define sk_SSL_CIPHER_new_reserve(cmp, n) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new_reserve(ossl_check_SSL_CIPHER_compfunc_type(cmp), (n)))
#define sk_SSL_CIPHER_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SSL_CIPHER_sk_type(sk), (n))
#define sk_SSL_CIPHER_free(sk) OPENSSL_sk_free(ossl_check_SSL_CIPHER_sk_type(sk))
#define sk_SSL_CIPHER_zero(sk) OPENSSL_sk_zero(ossl_check_SSL_CIPHER_sk_type(sk))
#define sk_SSL_CIPHER_delete(sk, i) ((const SSL_CIPHER *)OPENSSL_sk_delete(ossl_check_SSL_CIPHER_sk_type(sk), (i)))
#define sk_SSL_CIPHER_delete_ptr(sk, ptr) ((const SSL_CIPHER *)OPENSSL_sk_delete_ptr(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr)))
#define sk_SSL_CIPHER_push(sk, ptr) OPENSSL_sk_push(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr))
#define sk_SSL_CIPHER_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr))
#define sk_SSL_CIPHER_pop(sk) ((const SSL_CIPHER *)OPENSSL_sk_pop(ossl_check_SSL_CIPHER_sk_type(sk)))
#define sk_SSL_CIPHER_shift(sk) ((const SSL_CIPHER *)OPENSSL_sk_shift(ossl_check_SSL_CIPHER_sk_type(sk)))
#define sk_SSL_CIPHER_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SSL_CIPHER_sk_type(sk),ossl_check_SSL_CIPHER_freefunc_type(freefunc))
#define sk_SSL_CIPHER_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr), (idx))
#define sk_SSL_CIPHER_set(sk, idx, ptr) ((const SSL_CIPHER *)OPENSSL_sk_set(ossl_check_SSL_CIPHER_sk_type(sk), (idx), ossl_check_SSL_CIPHER_type(ptr)))
#define sk_SSL_CIPHER_find(sk, ptr) OPENSSL_sk_find(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr))
#define sk_SSL_CIPHER_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr))
#define sk_SSL_CIPHER_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr), pnum)
#define sk_SSL_CIPHER_sort(sk) OPENSSL_sk_sort(ossl_check_SSL_CIPHER_sk_type(sk))
#define sk_SSL_CIPHER_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SSL_CIPHER_sk_type(sk))
#define sk_SSL_CIPHER_dup(sk) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_dup(ossl_check_const_SSL_CIPHER_sk_type(sk)))
#define sk_SSL_CIPHER_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_deep_copy(ossl_check_const_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_copyfunc_type(copyfunc), ossl_check_SSL_CIPHER_freefunc_type(freefunc)))
#define sk_SSL_CIPHER_set_cmp_func(sk, cmp) ((sk_SSL_CIPHER_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_compfunc_type(cmp)))
SKM_DEFINE_STACK_OF_INTERNAL(SSL_COMP, SSL_COMP, SSL_COMP)
#define sk_SSL_COMP_num(sk) OPENSSL_sk_num(ossl_check_const_SSL_COMP_sk_type(sk))
#define sk_SSL_COMP_value(sk, idx) ((SSL_COMP *)OPENSSL_sk_value(ossl_check_const_SSL_COMP_sk_type(sk), (idx)))
#define sk_SSL_COMP_new(cmp) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new(ossl_check_SSL_COMP_compfunc_type(cmp)))
#define sk_SSL_COMP_new_null() ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new_null())
#define sk_SSL_COMP_new_reserve(cmp, n) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new_reserve(ossl_check_SSL_COMP_compfunc_type(cmp), (n)))
#define sk_SSL_COMP_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SSL_COMP_sk_type(sk), (n))
#define sk_SSL_COMP_free(sk) OPENSSL_sk_free(ossl_check_SSL_COMP_sk_type(sk))
#define sk_SSL_COMP_zero(sk) OPENSSL_sk_zero(ossl_check_SSL_COMP_sk_type(sk))
#define sk_SSL_COMP_delete(sk, i) ((SSL_COMP *)OPENSSL_sk_delete(ossl_check_SSL_COMP_sk_type(sk), (i)))
#define sk_SSL_COMP_delete_ptr(sk, ptr) ((SSL_COMP *)OPENSSL_sk_delete_ptr(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr)))
#define sk_SSL_COMP_push(sk, ptr) OPENSSL_sk_push(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr))
#define sk_SSL_COMP_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr))
#define sk_SSL_COMP_pop(sk) ((SSL_COMP *)OPENSSL_sk_pop(ossl_check_SSL_COMP_sk_type(sk)))
#define sk_SSL_COMP_shift(sk) ((SSL_COMP *)OPENSSL_sk_shift(ossl_check_SSL_COMP_sk_type(sk)))
#define sk_SSL_COMP_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SSL_COMP_sk_type(sk),ossl_check_SSL_COMP_freefunc_type(freefunc))
#define sk_SSL_COMP_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr), (idx))
#define sk_SSL_COMP_set(sk, idx, ptr) ((SSL_COMP *)OPENSSL_sk_set(ossl_check_SSL_COMP_sk_type(sk), (idx), ossl_check_SSL_COMP_type(ptr)))
#define sk_SSL_COMP_find(sk, ptr) OPENSSL_sk_find(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr))
#define sk_SSL_COMP_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr))
#define sk_SSL_COMP_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr), pnum)
#define sk_SSL_COMP_sort(sk) OPENSSL_sk_sort(ossl_check_SSL_COMP_sk_type(sk))
#define sk_SSL_COMP_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SSL_COMP_sk_type(sk))
#define sk_SSL_COMP_dup(sk) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_dup(ossl_check_const_SSL_COMP_sk_type(sk)))
#define sk_SSL_COMP_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_deep_copy(ossl_check_const_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_copyfunc_type(copyfunc), ossl_check_SSL_COMP_freefunc_type(freefunc)))
#define sk_SSL_COMP_set_cmp_func(sk, cmp) ((sk_SSL_COMP_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_compfunc_type(cmp)))


/* compatibility */
# define SSL_set_app_data(s,arg)         (SSL_set_ex_data(s,0,(char *)(arg)))
# define SSL_get_app_data(s)             (SSL_get_ex_data(s,0))
# define SSL_SESSION_set_app_data(s,a)   (SSL_SESSION_set_ex_data(s,0, \
                                                                  (char *)(a)))
# define SSL_SESSION_get_app_data(s)     (SSL_SESSION_get_ex_data(s,0))
# define SSL_CTX_get_app_data(ctx)       (SSL_CTX_get_ex_data(ctx,0))
# define SSL_CTX_set_app_data(ctx,arg)   (SSL_CTX_set_ex_data(ctx,0, \
                                                              (char *)(arg)))
# ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 void SSL_set_debug(SSL *s, int debug);
# endif

/* TLSv1.3 KeyUpdate message types */
/* -1 used so that this is an invalid value for the on-the-wire protocol */
#define SSL_KEY_UPDATE_NONE             -1
/* Values as defined for the on-the-wire protocol */
#define SSL_KEY_UPDATE_NOT_REQUESTED     0
#define SSL_KEY_UPDATE_REQUESTED         1

/*
 * The valid handshake states (one for each type message sent and one for each
 * type of message received). There are also two "special" states:
 * TLS = TLS or DTLS state
 * DTLS = DTLS specific state
 * CR/SR = Client Read/Server Read
 * CW/SW = Client Write/Server Write
 *
 * The "special" states are:
 * TLS_ST_BEFORE = No handshake has been initiated yet
 * TLS_ST_OK = A handshake has been successfully completed
 */
typedef enum {
    TLS_ST_BEFORE,
    TLS_ST_OK,
    DTLS_ST_CR_HELLO_VERIFY_REQUEST,
    TLS_ST_CR_SRVR_HELLO,
    TLS_ST_CR_CERT,
    TLS_ST_CR_CERT_STATUS,
    TLS_ST_CR_KEY_EXCH,
    TLS_ST_CR_CERT_REQ,
    TLS_ST_CR_SRVR_DONE,
    TLS_ST_CR_SESSION_TICKET,
    TLS_ST_CR_CHANGE,
    TLS_ST_CR_FINISHED,
    TLS_ST_CW_CLNT_HELLO,
    TLS_ST_CW_CERT,
    TLS_ST_CW_KEY_EXCH,
    TLS_ST_CW_CERT_VRFY,
    TLS_ST_CW_CHANGE,
    TLS_ST_CW_NEXT_PROTO,
    TLS_ST_CW_FINISHED,
    TLS_ST_SW_HELLO_REQ,
    TLS_ST_SR_CLNT_HELLO,
    DTLS_ST_SW_HELLO_VERIFY_REQUEST,
    TLS_ST_SW_SRVR_HELLO,
    TLS_ST_SW_CERT,
    TLS_ST_SW_KEY_EXCH,
    TLS_ST_SW_CERT_REQ,
    TLS_ST_SW_SRVR_DONE,
    TLS_ST_SR_CERT,
    TLS_ST_SR_KEY_EXCH,
    TLS_ST_SR_CERT_VRFY,
    TLS_ST_SR_NEXT_PROTO,
    TLS_ST_SR_CHANGE,
    TLS_ST_SR_FINISHED,
    TLS_ST_SW_SESSION_TICKET,
    TLS_ST_SW_CERT_STATUS,
    TLS_ST_SW_CHANGE,
    TLS_ST_SW_FINISHED,
    TLS_ST_SW_ENCRYPTED_EXTENSIONS,
    TLS_ST_CR_ENCRYPTED_EXTENSIONS,
    TLS_ST_CR_CERT_VRFY,
    TLS_ST_SW_CERT_VRFY,
    TLS_ST_CR_HELLO_REQ,
    TLS_ST_SW_KEY_UPDATE,
    TLS_ST_CW_KEY_UPDATE,
    TLS_ST_SR_KEY_UPDATE,
    TLS_ST_CR_KEY_UPDATE,
    TLS_ST_EARLY_DATA,
    TLS_ST_PENDING_EARLY_DATA_END,
    TLS_ST_CW_END_OF_EARLY_DATA,
    TLS_ST_SR_END_OF_EARLY_DATA
} OSSL_HANDSHAKE_STATE;

/*
 * Most of the following state values are no longer used and are defined to be
 * the closest equivalent value in the current state machine code. Not all
 * defines have an equivalent and are set to a dummy value (-1). SSL_ST_CONNECT
 * and SSL_ST_ACCEPT are still in use in the definition of SSL_CB_ACCEPT_LOOP,
 * SSL_CB_ACCEPT_EXIT, SSL_CB_CONNECT_LOOP and SSL_CB_CONNECT_EXIT.
 */

# define SSL_ST_CONNECT                  0x1000
# define SSL_ST_ACCEPT                   0x2000

# define SSL_ST_MASK                     0x0FFF

# define SSL_CB_LOOP                     0x01
# define SSL_CB_EXIT                     0x02
# define SSL_CB_READ                     0x04
# define SSL_CB_WRITE                    0x08
# define SSL_CB_ALERT                    0x4000/* used in callback */
# define SSL_CB_READ_ALERT               (SSL_CB_ALERT|SSL_CB_READ)
# define SSL_CB_WRITE_ALERT              (SSL_CB_ALERT|SSL_CB_WRITE)
# define SSL_CB_ACCEPT_LOOP              (SSL_ST_ACCEPT|SSL_CB_LOOP)
# define SSL_CB_ACCEPT_EXIT              (SSL_ST_ACCEPT|SSL_CB_EXIT)
# define SSL_CB_CONNECT_LOOP             (SSL_ST_CONNECT|SSL_CB_LOOP)
# define SSL_CB_CONNECT_EXIT             (SSL_ST_CONNECT|SSL_CB_EXIT)
# define SSL_CB_HANDSHAKE_START          0x10
# define SSL_CB_HANDSHAKE_DONE           0x20

/* Is the SSL_connection established? */
# define SSL_in_connect_init(a)          (SSL_in_init(a) && !SSL_is_server(a))
# define SSL_in_accept_init(a)           (SSL_in_init(a) && SSL_is_server(a))
int SSL_in_init(const SSL *s);
int SSL_in_before(const SSL *s);
int SSL_is_init_finished(const SSL *s);

/*
 * The following 3 states are kept in ssl->rlayer.rstate when reads fail, you
 * should not need these
 */
# define SSL_ST_READ_HEADER                      0xF0
# define SSL_ST_READ_BODY                        0xF1
# define SSL_ST_READ_DONE                        0xF2

/*-
 * Obtain latest Finished message
 *   -- that we sent (SSL_get_finished)
 *   -- that we expected from peer (SSL_get_peer_finished).
 * Returns length (0 == no Finished so far), copies up to 'count' bytes.
 */
size_t SSL_get_finished(const SSL *s, void *buf, size_t count);
size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count);

/*
 * use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 3 options are
 * 'ored' with SSL_VERIFY_PEER if they are desired
 */
# define SSL_VERIFY_NONE                 0x00
# define SSL_VERIFY_PEER                 0x01
# define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02
# define SSL_VERIFY_CLIENT_ONCE          0x04
# define SSL_VERIFY_POST_HANDSHAKE       0x08

# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  define OpenSSL_add_ssl_algorithms()   SSL_library_init()
#  define SSLeay_add_ssl_algorithms()    SSL_library_init()
# endif

/* More backward compatibility */
# define SSL_get_cipher(s) \
                SSL_CIPHER_get_name(SSL_get_current_cipher(s))
# define SSL_get_cipher_bits(s,np) \
                SSL_CIPHER_get_bits(SSL_get_current_cipher(s),np)
# define SSL_get_cipher_version(s) \
                SSL_CIPHER_get_version(SSL_get_current_cipher(s))
# define SSL_get_cipher_name(s) \
                SSL_CIPHER_get_name(SSL_get_current_cipher(s))
# define SSL_get_time(a)         SSL_SESSION_get_time(a)
# define SSL_set_time(a,b)       SSL_SESSION_set_time((a),(b))
# define SSL_get_timeout(a)      SSL_SESSION_get_timeout(a)
# define SSL_set_timeout(a,b)    SSL_SESSION_set_timeout((a),(b))

# define d2i_SSL_SESSION_bio(bp,s_id) ASN1_d2i_bio_of(SSL_SESSION,SSL_SESSION_new,d2i_SSL_SESSION,bp,s_id)
# define i2d_SSL_SESSION_bio(bp,s_id) ASN1_i2d_bio_of(SSL_SESSION,i2d_SSL_SESSION,bp,s_id)

DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION)
# define SSL_AD_REASON_OFFSET            1000/* offset to get SSL_R_... value
                                              * from SSL_AD_... */
/* These alert types are for SSLv3 and TLSv1 */
# define SSL_AD_CLOSE_NOTIFY             SSL3_AD_CLOSE_NOTIFY
/* fatal */
# define SSL_AD_UNEXPECTED_MESSAGE       SSL3_AD_UNEXPECTED_MESSAGE
/* fatal */
# define SSL_AD_BAD_RECORD_MAC           SSL3_AD_BAD_RECORD_MAC
# define SSL_AD_DECRYPTION_FAILED        TLS1_AD_DECRYPTION_FAILED
# define SSL_AD_RECORD_OVERFLOW          TLS1_AD_RECORD_OVERFLOW
/* fatal */
# define SSL_AD_DECOMPRESSION_FAILURE    SSL3_AD_DECOMPRESSION_FAILURE
/* fatal */
# define SSL_AD_HANDSHAKE_FAILURE        SSL3_AD_HANDSHAKE_FAILURE
/* Not for TLS */
# define SSL_AD_NO_CERTIFICATE           SSL3_AD_NO_CERTIFICATE
# define SSL_AD_BAD_CERTIFICATE          SSL3_AD_BAD_CERTIFICATE
# define SSL_AD_UNSUPPORTED_CERTIFICATE  SSL3_AD_UNSUPPORTED_CERTIFICATE
# define SSL_AD_CERTIFICATE_REVOKED      SSL3_AD_CERTIFICATE_REVOKED
# define SSL_AD_CERTIFICATE_EXPIRED      SSL3_AD_CERTIFICATE_EXPIRED
# define SSL_AD_CERTIFICATE_UNKNOWN      SSL3_AD_CERTIFICATE_UNKNOWN
/* fatal */
# define SSL_AD_ILLEGAL_PARAMETER        SSL3_AD_ILLEGAL_PARAMETER
/* fatal */
# define SSL_AD_UNKNOWN_CA               TLS1_AD_UNKNOWN_CA
/* fatal */
# define SSL_AD_ACCESS_DENIED            TLS1_AD_ACCESS_DENIED
/* fatal */
# define SSL_AD_DECODE_ERROR             TLS1_AD_DECODE_ERROR
# define SSL_AD_DECRYPT_ERROR            TLS1_AD_DECRYPT_ERROR
/* fatal */
# define SSL_AD_EXPORT_RESTRICTION       TLS1_AD_EXPORT_RESTRICTION
/* fatal */
# define SSL_AD_PROTOCOL_VERSION         TLS1_AD_PROTOCOL_VERSION
/* fatal */
# define SSL_AD_INSUFFICIENT_SECURITY    TLS1_AD_INSUFFICIENT_SECURITY
/* fatal */
# define SSL_AD_INTERNAL_ERROR           TLS1_AD_INTERNAL_ERROR
# define SSL_AD_USER_CANCELLED           TLS1_AD_USER_CANCELLED
# define SSL_AD_NO_RENEGOTIATION         TLS1_AD_NO_RENEGOTIATION
# define SSL_AD_MISSING_EXTENSION        TLS13_AD_MISSING_EXTENSION
# define SSL_AD_CERTIFICATE_REQUIRED     TLS13_AD_CERTIFICATE_REQUIRED
# define SSL_AD_UNSUPPORTED_EXTENSION    TLS1_AD_UNSUPPORTED_EXTENSION
# define SSL_AD_CERTIFICATE_UNOBTAINABLE TLS1_AD_CERTIFICATE_UNOBTAINABLE
# define SSL_AD_UNRECOGNIZED_NAME        TLS1_AD_UNRECOGNIZED_NAME
# define SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE
# define SSL_AD_BAD_CERTIFICATE_HASH_VALUE TLS1_AD_BAD_CERTIFICATE_HASH_VALUE
/* fatal */
# define SSL_AD_UNKNOWN_PSK_IDENTITY     TLS1_AD_UNKNOWN_PSK_IDENTITY
/* fatal */
# define SSL_AD_INAPPROPRIATE_FALLBACK   TLS1_AD_INAPPROPRIATE_FALLBACK
# define SSL_AD_NO_APPLICATION_PROTOCOL  TLS1_AD_NO_APPLICATION_PROTOCOL
# define SSL_ERROR_NONE                  0
# define SSL_ERROR_SSL                   1
# define SSL_ERROR_WANT_READ             2
# define SSL_ERROR_WANT_WRITE            3
# define SSL_ERROR_WANT_X509_LOOKUP      4
# define SSL_ERROR_SYSCALL               5/* look at error stack/return
                                           * value/errno */
# define SSL_ERROR_ZERO_RETURN           6
# define SSL_ERROR_WANT_CONNECT          7
# define SSL_ERROR_WANT_ACCEPT           8
# define SSL_ERROR_WANT_ASYNC            9
# define SSL_ERROR_WANT_ASYNC_JOB       10
# define SSL_ERROR_WANT_CLIENT_HELLO_CB 11
# define SSL_ERROR_WANT_RETRY_VERIFY    12

# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_CTRL_SET_TMP_DH                    3
#  define SSL_CTRL_SET_TMP_ECDH                  4
#  define SSL_CTRL_SET_TMP_DH_CB                 6
# endif

# define SSL_CTRL_GET_CLIENT_CERT_REQUEST        9
# define SSL_CTRL_GET_NUM_RENEGOTIATIONS         10
# define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS       11
# define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS       12
# define SSL_CTRL_GET_FLAGS                      13
# define SSL_CTRL_EXTRA_CHAIN_CERT               14
# define SSL_CTRL_SET_MSG_CALLBACK               15
# define SSL_CTRL_SET_MSG_CALLBACK_ARG           16
/* only applies to datagram connections */
# define SSL_CTRL_SET_MTU                17
/* Stats */
# define SSL_CTRL_SESS_NUMBER                    20
# define SSL_CTRL_SESS_CONNECT                   21
# define SSL_CTRL_SESS_CONNECT_GOOD              22
# define SSL_CTRL_SESS_CONNECT_RENEGOTIATE       23
# define SSL_CTRL_SESS_ACCEPT                    24
# define SSL_CTRL_SESS_ACCEPT_GOOD               25
# define SSL_CTRL_SESS_ACCEPT_RENEGOTIATE        26
# define SSL_CTRL_SESS_HIT                       27
# define SSL_CTRL_SESS_CB_HIT                    28
# define SSL_CTRL_SESS_MISSES                    29
# define SSL_CTRL_SESS_TIMEOUTS                  30
# define SSL_CTRL_SESS_CACHE_FULL                31
# define SSL_CTRL_MODE                           33
# define SSL_CTRL_GET_READ_AHEAD                 40
# define SSL_CTRL_SET_READ_AHEAD                 41
# define SSL_CTRL_SET_SESS_CACHE_SIZE            42
# define SSL_CTRL_GET_SESS_CACHE_SIZE            43
# define SSL_CTRL_SET_SESS_CACHE_MODE            44
# define SSL_CTRL_GET_SESS_CACHE_MODE            45
# define SSL_CTRL_GET_MAX_CERT_LIST              50
# define SSL_CTRL_SET_MAX_CERT_LIST              51
# define SSL_CTRL_SET_MAX_SEND_FRAGMENT          52
/* see tls1.h for macros based on these */
# define SSL_CTRL_SET_TLSEXT_SERVERNAME_CB       53
# define SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG      54
# define SSL_CTRL_SET_TLSEXT_HOSTNAME            55
# define SSL_CTRL_SET_TLSEXT_DEBUG_CB            56
# define SSL_CTRL_SET_TLSEXT_DEBUG_ARG           57
# define SSL_CTRL_GET_TLSEXT_TICKET_KEYS         58
# define SSL_CTRL_SET_TLSEXT_TICKET_KEYS         59
/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT    60 */
/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB 61 */
/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB_ARG 62 */
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB       63
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG   64
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE     65
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS     66
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS     67
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS      68
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS      69
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP        70
# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP        71
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB      72
# endif
# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB    75
# define SSL_CTRL_SET_SRP_VERIFY_PARAM_CB                76
# define SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB             77
# define SSL_CTRL_SET_SRP_ARG            78
# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME               79
# define SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH               80
# define SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD               81
# define DTLS_CTRL_GET_TIMEOUT           73
# define DTLS_CTRL_HANDLE_TIMEOUT        74
# define SSL_CTRL_GET_RI_SUPPORT                 76
# define SSL_CTRL_CLEAR_MODE                     78
# define SSL_CTRL_SET_NOT_RESUMABLE_SESS_CB      79
# define SSL_CTRL_GET_EXTRA_CHAIN_CERTS          82
# define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS        83
# define SSL_CTRL_CHAIN                          88
# define SSL_CTRL_CHAIN_CERT                     89
# define SSL_CTRL_GET_GROUPS                     90
# define SSL_CTRL_SET_GROUPS                     91
# define SSL_CTRL_SET_GROUPS_LIST                92
# define SSL_CTRL_GET_SHARED_GROUP               93
# define SSL_CTRL_SET_SIGALGS                    97
# define SSL_CTRL_SET_SIGALGS_LIST               98
# define SSL_CTRL_CERT_FLAGS                     99
# define SSL_CTRL_CLEAR_CERT_FLAGS               100
# define SSL_CTRL_SET_CLIENT_SIGALGS             101
# define SSL_CTRL_SET_CLIENT_SIGALGS_LIST        102
# define SSL_CTRL_GET_CLIENT_CERT_TYPES          103
# define SSL_CTRL_SET_CLIENT_CERT_TYPES          104
# define SSL_CTRL_BUILD_CERT_CHAIN               105
# define SSL_CTRL_SET_VERIFY_CERT_STORE          106
# define SSL_CTRL_SET_CHAIN_CERT_STORE           107
# define SSL_CTRL_GET_PEER_SIGNATURE_NID         108
# define SSL_CTRL_GET_PEER_TMP_KEY               109
# define SSL_CTRL_GET_RAW_CIPHERLIST             110
# define SSL_CTRL_GET_EC_POINT_FORMATS           111
# define SSL_CTRL_GET_CHAIN_CERTS                115
# define SSL_CTRL_SELECT_CURRENT_CERT            116
# define SSL_CTRL_SET_CURRENT_CERT               117
# define SSL_CTRL_SET_DH_AUTO                    118
# define DTLS_CTRL_SET_LINK_MTU                  120
# define DTLS_CTRL_GET_LINK_MIN_MTU              121
# define SSL_CTRL_GET_EXTMS_SUPPORT              122
# define SSL_CTRL_SET_MIN_PROTO_VERSION          123
# define SSL_CTRL_SET_MAX_PROTO_VERSION          124
# define SSL_CTRL_SET_SPLIT_SEND_FRAGMENT        125
# define SSL_CTRL_SET_MAX_PIPELINES              126
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_TYPE     127
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB       128
# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG   129
# define SSL_CTRL_GET_MIN_PROTO_VERSION          130
# define SSL_CTRL_GET_MAX_PROTO_VERSION          131
# define SSL_CTRL_GET_SIGNATURE_NID              132
# define SSL_CTRL_GET_TMP_KEY                    133
# define SSL_CTRL_GET_NEGOTIATED_GROUP           134
# define SSL_CTRL_SET_RETRY_VERIFY               136
# define SSL_CTRL_GET_VERIFY_CERT_STORE          137
# define SSL_CTRL_GET_CHAIN_CERT_STORE           138
# define SSL_CERT_SET_FIRST                      1
# define SSL_CERT_SET_NEXT                       2
# define SSL_CERT_SET_SERVER                     3
# define DTLSv1_get_timeout(ssl, arg) \
        SSL_ctrl(ssl,DTLS_CTRL_GET_TIMEOUT,0, (void *)(arg))
# define DTLSv1_handle_timeout(ssl) \
        SSL_ctrl(ssl,DTLS_CTRL_HANDLE_TIMEOUT,0, NULL)
# define SSL_num_renegotiations(ssl) \
        SSL_ctrl((ssl),SSL_CTRL_GET_NUM_RENEGOTIATIONS,0,NULL)
# define SSL_clear_num_renegotiations(ssl) \
        SSL_ctrl((ssl),SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS,0,NULL)
# define SSL_total_renegotiations(ssl) \
        SSL_ctrl((ssl),SSL_CTRL_GET_TOTAL_RENEGOTIATIONS,0,NULL)
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_CTX_set_tmp_dh(ctx,dh) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,(char *)(dh))
# endif
# define SSL_CTX_set_dh_auto(ctx, onoff) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_DH_AUTO,onoff,NULL)
# define SSL_set_dh_auto(s, onoff) \
        SSL_ctrl(s,SSL_CTRL_SET_DH_AUTO,onoff,NULL)
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_set_tmp_dh(ssl,dh) \
        SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH,0,(char *)(dh))
# endif
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define SSL_CTX_set_tmp_ecdh(ctx,ecdh) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH,0,(char *)(ecdh))
#  define SSL_set_tmp_ecdh(ssl,ecdh) \
        SSL_ctrl(ssl,SSL_CTRL_SET_TMP_ECDH,0,(char *)(ecdh))
# endif
# define SSL_CTX_add_extra_chain_cert(ctx,x509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)(x509))
# define SSL_CTX_get_extra_chain_certs(ctx,px509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,0,px509)
# define SSL_CTX_get_extra_chain_certs_only(ctx,px509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,1,px509)
# define SSL_CTX_clear_extra_chain_certs(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS,0,NULL)
# define SSL_CTX_set0_chain(ctx,sk) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,0,(char *)(sk))
# define SSL_CTX_set1_chain(ctx,sk) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,1,(char *)(sk))
# define SSL_CTX_add0_chain_cert(ctx,x509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,0,(char *)(x509))
# define SSL_CTX_add1_chain_cert(ctx,x509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,1,(char *)(x509))
# define SSL_CTX_get0_chain_certs(ctx,px509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERTS,0,px509)
# define SSL_CTX_clear_chain_certs(ctx) \
        SSL_CTX_set0_chain(ctx,NULL)
# define SSL_CTX_build_cert_chain(ctx, flags) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL)
# define SSL_CTX_select_current_cert(ctx,x509) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)(x509))
# define SSL_CTX_set_current_cert(ctx, op) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURRENT_CERT, op, NULL)
# define SSL_CTX_set0_verify_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)(st))
# define SSL_CTX_set1_verify_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)(st))
# define SSL_CTX_get0_verify_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_VERIFY_CERT_STORE,0,(char *)(st))
# define SSL_CTX_set0_chain_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)(st))
# define SSL_CTX_set1_chain_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)(st))
# define SSL_CTX_get0_chain_cert_store(ctx,st) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERT_STORE,0,(char *)(st))
# define SSL_set0_chain(s,sk) \
        SSL_ctrl(s,SSL_CTRL_CHAIN,0,(char *)(sk))
# define SSL_set1_chain(s,sk) \
        SSL_ctrl(s,SSL_CTRL_CHAIN,1,(char *)(sk))
# define SSL_add0_chain_cert(s,x509) \
        SSL_ctrl(s,SSL_CTRL_CHAIN_CERT,0,(char *)(x509))
# define SSL_add1_chain_cert(s,x509) \
        SSL_ctrl(s,SSL_CTRL_CHAIN_CERT,1,(char *)(x509))
# define SSL_get0_chain_certs(s,px509) \
        SSL_ctrl(s,SSL_CTRL_GET_CHAIN_CERTS,0,px509)
# define SSL_clear_chain_certs(s) \
        SSL_set0_chain(s,NULL)
# define SSL_build_cert_chain(s, flags) \
        SSL_ctrl(s,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL)
# define SSL_select_current_cert(s,x509) \
        SSL_ctrl(s,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)(x509))
# define SSL_set_current_cert(s,op) \
        SSL_ctrl(s,SSL_CTRL_SET_CURRENT_CERT, op, NULL)
# define SSL_set0_verify_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)(st))
# define SSL_set1_verify_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)(st))
#define SSL_get0_verify_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_GET_VERIFY_CERT_STORE,0,(char *)(st))
# define SSL_set0_chain_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)(st))
# define SSL_set1_chain_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)(st))
#define SSL_get0_chain_cert_store(s,st) \
        SSL_ctrl(s,SSL_CTRL_GET_CHAIN_CERT_STORE,0,(char *)(st))

# define SSL_get1_groups(s, glist) \
        SSL_ctrl(s,SSL_CTRL_GET_GROUPS,0,(int*)(glist))
# define SSL_CTX_set1_groups(ctx, glist, glistlen) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_GROUPS,glistlen,(int *)(glist))
# define SSL_CTX_set1_groups_list(ctx, s) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_GROUPS_LIST,0,(char *)(s))
# define SSL_set1_groups(s, glist, glistlen) \
        SSL_ctrl(s,SSL_CTRL_SET_GROUPS,glistlen,(char *)(glist))
# define SSL_set1_groups_list(s, str) \
        SSL_ctrl(s,SSL_CTRL_SET_GROUPS_LIST,0,(char *)(str))
# define SSL_get_shared_group(s, n) \
        SSL_ctrl(s,SSL_CTRL_GET_SHARED_GROUP,n,NULL)
# define SSL_get_negotiated_group(s) \
        SSL_ctrl(s,SSL_CTRL_GET_NEGOTIATED_GROUP,0,NULL)
# define SSL_CTX_set1_sigalgs(ctx, slist, slistlen) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS,slistlen,(int *)(slist))
# define SSL_CTX_set1_sigalgs_list(ctx, s) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)(s))
# define SSL_set1_sigalgs(s, slist, slistlen) \
        SSL_ctrl(s,SSL_CTRL_SET_SIGALGS,slistlen,(int *)(slist))
# define SSL_set1_sigalgs_list(s, str) \
        SSL_ctrl(s,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)(str))
# define SSL_CTX_set1_client_sigalgs(ctx, slist, slistlen) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS,slistlen,(int *)(slist))
# define SSL_CTX_set1_client_sigalgs_list(ctx, s) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)(s))
# define SSL_set1_client_sigalgs(s, slist, slistlen) \
        SSL_ctrl(s,SSL_CTRL_SET_CLIENT_SIGALGS,slistlen,(int *)(slist))
# define SSL_set1_client_sigalgs_list(s, str) \
        SSL_ctrl(s,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)(str))
# define SSL_get0_certificate_types(s, clist) \
        SSL_ctrl(s, SSL_CTRL_GET_CLIENT_CERT_TYPES, 0, (char *)(clist))
# define SSL_CTX_set1_client_certificate_types(ctx, clist, clistlen) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen, \
                     (char *)(clist))
# define SSL_set1_client_certificate_types(s, clist, clistlen) \
        SSL_ctrl(s,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen,(char *)(clist))
# define SSL_get_signature_nid(s, pn) \
        SSL_ctrl(s,SSL_CTRL_GET_SIGNATURE_NID,0,pn)
# define SSL_get_peer_signature_nid(s, pn) \
        SSL_ctrl(s,SSL_CTRL_GET_PEER_SIGNATURE_NID,0,pn)
# define SSL_get_peer_tmp_key(s, pk) \
        SSL_ctrl(s,SSL_CTRL_GET_PEER_TMP_KEY,0,pk)
# define SSL_get_tmp_key(s, pk) \
        SSL_ctrl(s,SSL_CTRL_GET_TMP_KEY,0,pk)
# define SSL_get0_raw_cipherlist(s, plst) \
        SSL_ctrl(s,SSL_CTRL_GET_RAW_CIPHERLIST,0,plst)
# define SSL_get0_ec_point_formats(s, plst) \
        SSL_ctrl(s,SSL_CTRL_GET_EC_POINT_FORMATS,0,plst)
# define SSL_CTX_set_min_proto_version(ctx, version) \
        SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL)
# define SSL_CTX_set_max_proto_version(ctx, version) \
        SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL)
# define SSL_CTX_get_min_proto_version(ctx) \
        SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL)
# define SSL_CTX_get_max_proto_version(ctx) \
        SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL)
# define SSL_set_min_proto_version(s, version) \
        SSL_ctrl(s, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL)
# define SSL_set_max_proto_version(s, version) \
        SSL_ctrl(s, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL)
# define SSL_get_min_proto_version(s) \
        SSL_ctrl(s, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL)
# define SSL_get_max_proto_version(s) \
        SSL_ctrl(s, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL)

const char *SSL_group_to_name(SSL *s, int id);

/* Backwards compatibility, original 1.1.0 names */
# define SSL_CTRL_GET_SERVER_TMP_KEY \
         SSL_CTRL_GET_PEER_TMP_KEY
# define SSL_get_server_tmp_key(s, pk) \
         SSL_get_peer_tmp_key(s, pk)

int SSL_set0_tmp_dh_pkey(SSL *s, EVP_PKEY *dhpkey);
int SSL_CTX_set0_tmp_dh_pkey(SSL_CTX *ctx, EVP_PKEY *dhpkey);

/*
 * The following symbol names are old and obsolete. They are kept
 * for compatibility reasons only and should not be used anymore.
 */
# define SSL_CTRL_GET_CURVES           SSL_CTRL_GET_GROUPS
# define SSL_CTRL_SET_CURVES           SSL_CTRL_SET_GROUPS
# define SSL_CTRL_SET_CURVES_LIST      SSL_CTRL_SET_GROUPS_LIST
# define SSL_CTRL_GET_SHARED_CURVE     SSL_CTRL_GET_SHARED_GROUP

# define SSL_get1_curves               SSL_get1_groups
# define SSL_CTX_set1_curves           SSL_CTX_set1_groups
# define SSL_CTX_set1_curves_list      SSL_CTX_set1_groups_list
# define SSL_set1_curves               SSL_set1_groups
# define SSL_set1_curves_list          SSL_set1_groups_list
# define SSL_get_shared_curve          SSL_get_shared_group


# ifndef OPENSSL_NO_DEPRECATED_1_1_0
/* Provide some compatibility macros for removed functionality. */
#  define SSL_CTX_need_tmp_RSA(ctx)                0
#  define SSL_CTX_set_tmp_rsa(ctx,rsa)             1
#  define SSL_need_tmp_RSA(ssl)                    0
#  define SSL_set_tmp_rsa(ssl,rsa)                 1
#  define SSL_CTX_set_ecdh_auto(dummy, onoff)      ((onoff) != 0)
#  define SSL_set_ecdh_auto(dummy, onoff)          ((onoff) != 0)
/*
 * We "pretend" to call the callback to avoid warnings about unused static
 * functions.
 */
#  define SSL_CTX_set_tmp_rsa_callback(ctx, cb)    while(0) (cb)(NULL, 0, 0)
#  define SSL_set_tmp_rsa_callback(ssl, cb)        while(0) (cb)(NULL, 0, 0)
# endif
__owur const BIO_METHOD *BIO_f_ssl(void);
__owur BIO *BIO_new_ssl(SSL_CTX *ctx, int client);
__owur BIO *BIO_new_ssl_connect(SSL_CTX *ctx);
__owur BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx);
__owur int BIO_ssl_copy_session_id(BIO *to, BIO *from);
void BIO_ssl_shutdown(BIO *ssl_bio);

__owur int SSL_CTX_set_cipher_list(SSL_CTX *, const char *str);
__owur SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth);
__owur SSL_CTX *SSL_CTX_new_ex(OSSL_LIB_CTX *libctx, const char *propq,
                               const SSL_METHOD *meth);
int SSL_CTX_up_ref(SSL_CTX *ctx);
void SSL_CTX_free(SSL_CTX *);
__owur long SSL_CTX_set_timeout(SSL_CTX *ctx, long t);
__owur long SSL_CTX_get_timeout(const SSL_CTX *ctx);
__owur X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *);
void SSL_CTX_set_cert_store(SSL_CTX *, X509_STORE *);
void SSL_CTX_set1_cert_store(SSL_CTX *, X509_STORE *);
__owur int SSL_want(const SSL *s);
__owur int SSL_clear(SSL *s);

void SSL_CTX_flush_sessions(SSL_CTX *ctx, long tm);

__owur const SSL_CIPHER *SSL_get_current_cipher(const SSL *s);
__owur const SSL_CIPHER *SSL_get_pending_cipher(const SSL *s);
__owur int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits);
__owur const char *SSL_CIPHER_get_version(const SSL_CIPHER *c);
__owur const char *SSL_CIPHER_get_name(const SSL_CIPHER *c);
__owur const char *SSL_CIPHER_standard_name(const SSL_CIPHER *c);
__owur const char *OPENSSL_cipher_name(const char *rfc_name);
__owur uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *c);
__owur uint16_t SSL_CIPHER_get_protocol_id(const SSL_CIPHER *c);
__owur int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *c);
__owur int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *c);
__owur const EVP_MD *SSL_CIPHER_get_handshake_digest(const SSL_CIPHER *c);
__owur int SSL_CIPHER_is_aead(const SSL_CIPHER *c);

__owur int SSL_get_fd(const SSL *s);
__owur int SSL_get_rfd(const SSL *s);
__owur int SSL_get_wfd(const SSL *s);
__owur const char *SSL_get_cipher_list(const SSL *s, int n);
__owur char *SSL_get_shared_ciphers(const SSL *s, char *buf, int size);
__owur int SSL_get_read_ahead(const SSL *s);
__owur int SSL_pending(const SSL *s);
__owur int SSL_has_pending(const SSL *s);
# ifndef OPENSSL_NO_SOCK
__owur int SSL_set_fd(SSL *s, int fd);
__owur int SSL_set_rfd(SSL *s, int fd);
__owur int SSL_set_wfd(SSL *s, int fd);
# endif
void SSL_set0_rbio(SSL *s, BIO *rbio);
void SSL_set0_wbio(SSL *s, BIO *wbio);
void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio);
__owur BIO *SSL_get_rbio(const SSL *s);
__owur BIO *SSL_get_wbio(const SSL *s);
__owur int SSL_set_cipher_list(SSL *s, const char *str);
__owur int SSL_CTX_set_ciphersuites(SSL_CTX *ctx, const char *str);
__owur int SSL_set_ciphersuites(SSL *s, const char *str);
void SSL_set_read_ahead(SSL *s, int yes);
__owur int SSL_get_verify_mode(const SSL *s);
__owur int SSL_get_verify_depth(const SSL *s);
__owur SSL_verify_cb SSL_get_verify_callback(const SSL *s);
void SSL_set_verify(SSL *s, int mode, SSL_verify_cb callback);
void SSL_set_verify_depth(SSL *s, int depth);
void SSL_set_cert_cb(SSL *s, int (*cb) (SSL *ssl, void *arg), void *arg);
# ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0 __owur int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa);
OSSL_DEPRECATEDIN_3_0
__owur int SSL_use_RSAPrivateKey_ASN1(SSL *ssl,
                                      const unsigned char *d, long len);
# endif
__owur int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey);
__owur int SSL_use_PrivateKey_ASN1(int pk, SSL *ssl, const unsigned char *d,
                                   long len);
__owur int SSL_use_certificate(SSL *ssl, X509 *x);
__owur int SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len);
__owur int SSL_use_cert_and_key(SSL *ssl, X509 *x509, EVP_PKEY *privatekey,
                                STACK_OF(X509) *chain, int override);


/* serverinfo file format versions */
# define SSL_SERVERINFOV1   1
# define SSL_SERVERINFOV2   2

/* Set serverinfo data for the current active cert. */
__owur int SSL_CTX_use_serverinfo(SSL_CTX *ctx, const unsigned char *serverinfo,
                                  size_t serverinfo_length);
__owur int SSL_CTX_use_serverinfo_ex(SSL_CTX *ctx, unsigned int version,
                                     const unsigned char *serverinfo,
                                     size_t serverinfo_length);
__owur int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file);

#ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0
__owur int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type);
#endif

__owur int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type);
__owur int SSL_use_certificate_file(SSL *ssl, const char *file, int type);

#ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0
__owur int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file,
                                          int type);
#endif
__owur int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file,
                                       int type);
__owur int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file,
                                        int type);
/* PEM type */
__owur int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file);
__owur int SSL_use_certificate_chain_file(SSL *ssl, const char *file);
__owur STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file);
__owur STACK_OF(X509_NAME)
*SSL_load_client_CA_file_ex(const char *file, OSSL_LIB_CTX *libctx,
                            const char *propq);
__owur int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs,
                                               const char *file);
int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs,
                                       const char *dir);
int SSL_add_store_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs,
                                       const char *uri);

# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  define SSL_load_error_strings() \
    OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS \
                     | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL)
# endif

__owur const char *SSL_state_string(const SSL *s);
__owur const char *SSL_rstate_string(const SSL *s);
__owur const char *SSL_state_string_long(const SSL *s);
__owur const char *SSL_rstate_string_long(const SSL *s);
__owur long SSL_SESSION_get_time(const SSL_SESSION *s);
__owur long SSL_SESSION_set_time(SSL_SESSION *s, long t);
__owur long SSL_SESSION_get_timeout(const SSL_SESSION *s);
__owur long SSL_SESSION_set_timeout(SSL_SESSION *s, long t);
__owur int SSL_SESSION_get_protocol_version(const SSL_SESSION *s);
__owur int SSL_SESSION_set_protocol_version(SSL_SESSION *s, int version);

__owur const char *SSL_SESSION_get0_hostname(const SSL_SESSION *s);
__owur int SSL_SESSION_set1_hostname(SSL_SESSION *s, const char *hostname);
void SSL_SESSION_get0_alpn_selected(const SSL_SESSION *s,
                                    const unsigned char **alpn,
                                    size_t *len);
__owur int SSL_SESSION_set1_alpn_selected(SSL_SESSION *s,
                                          const unsigned char *alpn,
                                          size_t len);
__owur const SSL_CIPHER *SSL_SESSION_get0_cipher(const SSL_SESSION *s);
__owur int SSL_SESSION_set_cipher(SSL_SESSION *s, const SSL_CIPHER *cipher);
__owur int SSL_SESSION_has_ticket(const SSL_SESSION *s);
__owur unsigned long SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *s);
void SSL_SESSION_get0_ticket(const SSL_SESSION *s, const unsigned char **tick,
                             size_t *len);
__owur uint32_t SSL_SESSION_get_max_early_data(const SSL_SESSION *s);
__owur int SSL_SESSION_set_max_early_data(SSL_SESSION *s,
                                          uint32_t max_early_data);
__owur int SSL_copy_session_id(SSL *to, const SSL *from);
__owur X509 *SSL_SESSION_get0_peer(SSL_SESSION *s);
__owur int SSL_SESSION_set1_id_context(SSL_SESSION *s,
                                       const unsigned char *sid_ctx,
                                       unsigned int sid_ctx_len);
__owur int SSL_SESSION_set1_id(SSL_SESSION *s, const unsigned char *sid,
                               unsigned int sid_len);
__owur int SSL_SESSION_is_resumable(const SSL_SESSION *s);

__owur SSL_SESSION *SSL_SESSION_new(void);
__owur SSL_SESSION *SSL_SESSION_dup(const SSL_SESSION *src);
const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s,
                                        unsigned int *len);
const unsigned char *SSL_SESSION_get0_id_context(const SSL_SESSION *s,
                                                 unsigned int *len);
__owur unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s);
# ifndef OPENSSL_NO_STDIO
int SSL_SESSION_print_fp(FILE *fp, const SSL_SESSION *ses);
# endif
int SSL_SESSION_print(BIO *fp, const SSL_SESSION *ses);
int SSL_SESSION_print_keylog(BIO *bp, const SSL_SESSION *x);
int SSL_SESSION_up_ref(SSL_SESSION *ses);
void SSL_SESSION_free(SSL_SESSION *ses);
__owur int i2d_SSL_SESSION(const SSL_SESSION *in, unsigned char **pp);
__owur int SSL_set_session(SSL *to, SSL_SESSION *session);
int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *session);
int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *session);
__owur int SSL_CTX_set_generate_session_id(SSL_CTX *ctx, GEN_SESSION_CB cb);
__owur int SSL_set_generate_session_id(SSL *s, GEN_SESSION_CB cb);
__owur int SSL_has_matching_session_id(const SSL *s,
                                       const unsigned char *id,
                                       unsigned int id_len);
SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp,
                             long length);

# ifdef OPENSSL_X509_H
__owur X509 *SSL_get0_peer_certificate(const SSL *s);
__owur X509 *SSL_get1_peer_certificate(const SSL *s);
/* Deprecated in 3.0.0 */
#  ifndef OPENSSL_NO_DEPRECATED_3_0
#   define SSL_get_peer_certificate SSL_get1_peer_certificate
#  endif
# endif

__owur STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s);

__owur int SSL_CTX_get_verify_mode(const SSL_CTX *ctx);
__owur int SSL_CTX_get_verify_depth(const SSL_CTX *ctx);
__owur SSL_verify_cb SSL_CTX_get_verify_callback(const SSL_CTX *ctx);
void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, SSL_verify_cb callback);
void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth);
void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx,
                                      int (*cb) (X509_STORE_CTX *, void *),
                                      void *arg);
void SSL_CTX_set_cert_cb(SSL_CTX *c, int (*cb) (SSL *ssl, void *arg),
                         void *arg);
# ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0
__owur int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa);
OSSL_DEPRECATEDIN_3_0
__owur int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d,
                                          long len);
# endif
__owur int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey);
__owur int SSL_CTX_use_PrivateKey_ASN1(int pk, SSL_CTX *ctx,
                                       const unsigned char *d, long len);
__owur int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x);
__owur int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len,
                                        const unsigned char *d);
__owur int SSL_CTX_use_cert_and_key(SSL_CTX *ctx, X509 *x509, EVP_PKEY *privatekey,
                                    STACK_OF(X509) *chain, int override);

void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb);
void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u);
pem_password_cb *SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx);
void *SSL_CTX_get_default_passwd_cb_userdata(SSL_CTX *ctx);
void SSL_set_default_passwd_cb(SSL *s, pem_password_cb *cb);
void SSL_set_default_passwd_cb_userdata(SSL *s, void *u);
pem_password_cb *SSL_get_default_passwd_cb(SSL *s);
void *SSL_get_default_passwd_cb_userdata(SSL *s);

__owur int SSL_CTX_check_private_key(const SSL_CTX *ctx);
__owur int SSL_check_private_key(const SSL *ctx);

__owur int SSL_CTX_set_session_id_context(SSL_CTX *ctx,
                                          const unsigned char *sid_ctx,
                                          unsigned int sid_ctx_len);

SSL *SSL_new(SSL_CTX *ctx);
int SSL_up_ref(SSL *s);
int SSL_is_dtls(const SSL *s);
__owur int SSL_set_session_id_context(SSL *ssl, const unsigned char *sid_ctx,
                                      unsigned int sid_ctx_len);

__owur int SSL_CTX_set_purpose(SSL_CTX *ctx, int purpose);
__owur int SSL_set_purpose(SSL *ssl, int purpose);
__owur int SSL_CTX_set_trust(SSL_CTX *ctx, int trust);
__owur int SSL_set_trust(SSL *ssl, int trust);

__owur int SSL_set1_host(SSL *s, const char *hostname);
__owur int SSL_add1_host(SSL *s, const char *hostname);
__owur const char *SSL_get0_peername(SSL *s);
void SSL_set_hostflags(SSL *s, unsigned int flags);

__owur int SSL_CTX_dane_enable(SSL_CTX *ctx);
__owur int SSL_CTX_dane_mtype_set(SSL_CTX *ctx, const EVP_MD *md,
                                  uint8_t mtype, uint8_t ord);
__owur int SSL_dane_enable(SSL *s, const char *basedomain);
__owur int SSL_dane_tlsa_add(SSL *s, uint8_t usage, uint8_t selector,
                             uint8_t mtype, const unsigned char *data, size_t dlen);
__owur int SSL_get0_dane_authority(SSL *s, X509 **mcert, EVP_PKEY **mspki);
__owur int SSL_get0_dane_tlsa(SSL *s, uint8_t *usage, uint8_t *selector,
                              uint8_t *mtype, const unsigned char **data,
                              size_t *dlen);
/*
 * Bridge opacity barrier between libcrypt and libssl, also needed to support
 * offline testing in test/danetest.c
 */
SSL_DANE *SSL_get0_dane(SSL *ssl);
/*
 * DANE flags
 */
unsigned long SSL_CTX_dane_set_flags(SSL_CTX *ctx, unsigned long flags);
unsigned long SSL_CTX_dane_clear_flags(SSL_CTX *ctx, unsigned long flags);
unsigned long SSL_dane_set_flags(SSL *ssl, unsigned long flags);
unsigned long SSL_dane_clear_flags(SSL *ssl, unsigned long flags);

__owur int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm);
__owur int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm);

__owur X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx);
__owur X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl);

# ifndef OPENSSL_NO_SRP
#  ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_username(SSL_CTX *ctx, char *name);
OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_password(SSL_CTX *ctx, char *password);
OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength);
OSSL_DEPRECATEDIN_3_0
int SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx,
                                        char *(*cb) (SSL *, void *));
OSSL_DEPRECATEDIN_3_0
int SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx,
                                          int (*cb) (SSL *, void *));
OSSL_DEPRECATEDIN_3_0
int SSL_CTX_set_srp_username_callback(SSL_CTX *ctx,
                                      int (*cb) (SSL *, int *, void *));
OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg);

OSSL_DEPRECATEDIN_3_0
int SSL_set_srp_server_param(SSL *s, const BIGNUM *N, const BIGNUM *g,
                             BIGNUM *sa, BIGNUM *v, char *info);
OSSL_DEPRECATEDIN_3_0
int SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass,
                                const char *grp);

OSSL_DEPRECATEDIN_3_0 __owur BIGNUM *SSL_get_srp_g(SSL *s);
OSSL_DEPRECATEDIN_3_0 __owur BIGNUM *SSL_get_srp_N(SSL *s);

OSSL_DEPRECATEDIN_3_0 __owur char *SSL_get_srp_username(SSL *s);
OSSL_DEPRECATEDIN_3_0 __owur char *SSL_get_srp_userinfo(SSL *s);
#  endif
# endif

/*
 * ClientHello callback and helpers.
 */

# define SSL_CLIENT_HELLO_SUCCESS 1
# define SSL_CLIENT_HELLO_ERROR   0
# define SSL_CLIENT_HELLO_RETRY   (-1)

typedef int (*SSL_client_hello_cb_fn) (SSL *s, int *al, void *arg);
void SSL_CTX_set_client_hello_cb(SSL_CTX *c, SSL_client_hello_cb_fn cb,
                                 void *arg);
int SSL_client_hello_isv2(SSL *s);
unsigned int SSL_client_hello_get0_legacy_version(SSL *s);
size_t SSL_client_hello_get0_random(SSL *s, const unsigned char **out);
size_t SSL_client_hello_get0_session_id(SSL *s, const unsigned char **out);
size_t SSL_client_hello_get0_ciphers(SSL *s, const unsigned char **out);
size_t SSL_client_hello_get0_compression_methods(SSL *s,
                                                 const unsigned char **out);
int SSL_client_hello_get1_extensions_present(SSL *s, int **out, size_t *outlen);
int SSL_client_hello_get0_ext(SSL *s, unsigned int type,
                              const unsigned char **out, size_t *outlen);

void SSL_certs_clear(SSL *s);
void SSL_free(SSL *ssl);
# ifdef OSSL_ASYNC_FD
/*
 * Windows application developer has to include windows.h to use these.
 */
__owur int SSL_waiting_for_async(SSL *s);
__owur int SSL_get_all_async_fds(SSL *s, OSSL_ASYNC_FD *fds, size_t *numfds);
__owur int SSL_get_changed_async_fds(SSL *s, OSSL_ASYNC_FD *addfd,
                                     size_t *numaddfds, OSSL_ASYNC_FD *delfd,
                                     size_t *numdelfds);
__owur int SSL_CTX_set_async_callback(SSL_CTX *ctx, SSL_async_callback_fn callback);
__owur int SSL_CTX_set_async_callback_arg(SSL_CTX *ctx, void *arg);
__owur int SSL_set_async_callback(SSL *s, SSL_async_callback_fn callback);
__owur int SSL_set_async_callback_arg(SSL *s, void *arg);
__owur int SSL_get_async_status(SSL *s, int *status);

# endif
__owur int SSL_accept(SSL *ssl);
__owur int SSL_stateless(SSL *s);
__owur int SSL_connect(SSL *ssl);
__owur int SSL_read(SSL *ssl, void *buf, int num);
__owur int SSL_read_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes);

# define SSL_READ_EARLY_DATA_ERROR   0
# define SSL_READ_EARLY_DATA_SUCCESS 1
# define SSL_READ_EARLY_DATA_FINISH  2

__owur int SSL_read_early_data(SSL *s, void *buf, size_t num,
                               size_t *readbytes);
__owur int SSL_peek(SSL *ssl, void *buf, int num);
__owur int SSL_peek_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes);
__owur ossl_ssize_t SSL_sendfile(SSL *s, int fd, off_t offset, size_t size,
                                 int flags);
__owur int SSL_write(SSL *ssl, const void *buf, int num);
__owur int SSL_write_ex(SSL *s, const void *buf, size_t num, size_t *written);
__owur int SSL_write_early_data(SSL *s, const void *buf, size_t num,
                                size_t *written);
long SSL_ctrl(SSL *ssl, int cmd, long larg, void *parg);
long SSL_callback_ctrl(SSL *, int, void (*)(void));
long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg);
long SSL_CTX_callback_ctrl(SSL_CTX *, int, void (*)(void));

# define SSL_EARLY_DATA_NOT_SENT    0
# define SSL_EARLY_DATA_REJECTED    1
# define SSL_EARLY_DATA_ACCEPTED    2

__owur int SSL_get_early_data_status(const SSL *s);

__owur int SSL_get_error(const SSL *s, int ret_code);
__owur const char *SSL_get_version(const SSL *s);

/* This sets the 'default' SSL version that SSL_new() will create */
# ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0
__owur int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth);
# endif

# ifndef OPENSSL_NO_SSL3_METHOD
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_method(void); /* SSLv3 */
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_client_method(void);
#  endif
# endif

#define SSLv23_method           TLS_method
#define SSLv23_server_method    TLS_server_method
#define SSLv23_client_method    TLS_client_method

/* Negotiate highest available SSL/TLS version */
__owur const SSL_METHOD *TLS_method(void);
__owur const SSL_METHOD *TLS_server_method(void);
__owur const SSL_METHOD *TLS_client_method(void);

# ifndef OPENSSL_NO_TLS1_METHOD
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_method(void); /* TLSv1.0 */
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_client_method(void);
#  endif
# endif

# ifndef OPENSSL_NO_TLS1_1_METHOD
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_method(void); /* TLSv1.1 */
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_client_method(void);
#  endif
# endif

# ifndef OPENSSL_NO_TLS1_2_METHOD
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_method(void); /* TLSv1.2 */
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_client_method(void);
#  endif
# endif

# ifndef OPENSSL_NO_DTLS1_METHOD
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_method(void); /* DTLSv1.0 */
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_client_method(void);
#  endif
# endif

# ifndef OPENSSL_NO_DTLS1_2_METHOD
/* DTLSv1.2 */
#  ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_server_method(void);
OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_client_method(void);
#  endif
# endif

__owur const SSL_METHOD *DTLS_method(void); /* DTLS 1.0 and 1.2 */
__owur const SSL_METHOD *DTLS_server_method(void); /* DTLS 1.0 and 1.2 */
__owur const SSL_METHOD *DTLS_client_method(void); /* DTLS 1.0 and 1.2 */

__owur size_t DTLS_get_data_mtu(const SSL *s);

__owur STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s);
__owur STACK_OF(SSL_CIPHER) *SSL_CTX_get_ciphers(const SSL_CTX *ctx);
__owur STACK_OF(SSL_CIPHER) *SSL_get_client_ciphers(const SSL *s);
__owur STACK_OF(SSL_CIPHER) *SSL_get1_supported_ciphers(SSL *s);

__owur int SSL_do_handshake(SSL *s);
int SSL_key_update(SSL *s, int updatetype);
int SSL_get_key_update_type(const SSL *s);
int SSL_renegotiate(SSL *s);
int SSL_renegotiate_abbreviated(SSL *s);
__owur int SSL_renegotiate_pending(const SSL *s);
int SSL_new_session_ticket(SSL *s);
int SSL_shutdown(SSL *s);
__owur int SSL_verify_client_post_handshake(SSL *s);
void SSL_CTX_set_post_handshake_auth(SSL_CTX *ctx, int val);
void SSL_set_post_handshake_auth(SSL *s, int val);

__owur const SSL_METHOD *SSL_CTX_get_ssl_method(const SSL_CTX *ctx);
__owur const SSL_METHOD *SSL_get_ssl_method(const SSL *s);
__owur int SSL_set_ssl_method(SSL *s, const SSL_METHOD *method);
__owur const char *SSL_alert_type_string_long(int value);
__owur const char *SSL_alert_type_string(int value);
__owur const char *SSL_alert_desc_string_long(int value);
__owur const char *SSL_alert_desc_string(int value);

void SSL_set0_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list);
void SSL_CTX_set0_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list);
__owur const STACK_OF(X509_NAME) *SSL_get0_CA_list(const SSL *s);
__owur const STACK_OF(X509_NAME) *SSL_CTX_get0_CA_list(const SSL_CTX *ctx);
__owur int SSL_add1_to_CA_list(SSL *ssl, const X509 *x);
__owur int SSL_CTX_add1_to_CA_list(SSL_CTX *ctx, const X509 *x);
__owur const STACK_OF(X509_NAME) *SSL_get0_peer_CA_list(const SSL *s);

void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list);
void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list);
__owur STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s);
__owur STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *s);
__owur int SSL_add_client_CA(SSL *ssl, X509 *x);
__owur int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x);

void SSL_set_connect_state(SSL *s);
void SSL_set_accept_state(SSL *s);

__owur long SSL_get_default_timeout(const SSL *s);

# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  define SSL_library_init() OPENSSL_init_ssl(0, NULL)
# endif

__owur char *SSL_CIPHER_description(const SSL_CIPHER *, char *buf, int size);
__owur STACK_OF(X509_NAME) *SSL_dup_CA_list(const STACK_OF(X509_NAME) *sk);

__owur SSL *SSL_dup(SSL *ssl);

__owur X509 *SSL_get_certificate(const SSL *ssl);
/*
 * EVP_PKEY
 */
struct evp_pkey_st *SSL_get_privatekey(const SSL *ssl);

__owur X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx);
__owur EVP_PKEY *SSL_CTX_get0_privatekey(const SSL_CTX *ctx);

void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx, int mode);
__owur int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx);
void SSL_set_quiet_shutdown(SSL *ssl, int mode);
__owur int SSL_get_quiet_shutdown(const SSL *ssl);
void SSL_set_shutdown(SSL *ssl, int mode);
__owur int SSL_get_shutdown(const SSL *ssl);
__owur int SSL_version(const SSL *ssl);
__owur int SSL_client_version(const SSL *s);
__owur int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx);
__owur int SSL_CTX_set_default_verify_dir(SSL_CTX *ctx);
__owur int SSL_CTX_set_default_verify_file(SSL_CTX *ctx);
__owur int SSL_CTX_set_default_verify_store(SSL_CTX *ctx);
__owur int SSL_CTX_load_verify_file(SSL_CTX *ctx, const char *CAfile);
__owur int SSL_CTX_load_verify_dir(SSL_CTX *ctx, const char *CApath);
__owur int SSL_CTX_load_verify_store(SSL_CTX *ctx, const char *CAstore);
__owur int SSL_CTX_load_verify_locations(SSL_CTX *ctx,
                                                        const char *CAfile,
                                                        const char *CApath);
# define SSL_get0_session SSL_get_session/* just peek at pointer */
__owur SSL_SESSION *SSL_get_session(const SSL *ssl);
__owur SSL_SESSION *SSL_get1_session(SSL *ssl); /* obtain a reference count */
__owur SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl);
SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX *ctx);
void SSL_set_info_callback(SSL *ssl,
                           void (*cb) (const SSL *ssl, int type, int val));
void (*SSL_get_info_callback(const SSL *ssl)) (const SSL *ssl, int type,
                                               int val);
__owur OSSL_HANDSHAKE_STATE SSL_get_state(const SSL *ssl);

void SSL_set_verify_result(SSL *ssl, long v);
__owur long SSL_get_verify_result(const SSL *ssl);
__owur STACK_OF(X509) *SSL_get0_verified_chain(const SSL *s);

__owur size_t SSL_get_client_random(const SSL *ssl, unsigned char *out,
                                    size_t outlen);
__owur size_t SSL_get_server_random(const SSL *ssl, unsigned char *out,
                                    size_t outlen);
__owur size_t SSL_SESSION_get_master_key(const SSL_SESSION *sess,
                                         unsigned char *out, size_t outlen);
__owur int SSL_SESSION_set1_master_key(SSL_SESSION *sess,
                                       const unsigned char *in, size_t len);
uint8_t SSL_SESSION_get_max_fragment_length(const SSL_SESSION *sess);

#define SSL_get_ex_new_index(l, p, newf, dupf, freef) \
    CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, l, p, newf, dupf, freef)
__owur int SSL_set_ex_data(SSL *ssl, int idx, void *data);
void *SSL_get_ex_data(const SSL *ssl, int idx);
#define SSL_SESSION_get_ex_new_index(l, p, newf, dupf, freef) \
    CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_SESSION, l, p, newf, dupf, freef)
__owur int SSL_SESSION_set_ex_data(SSL_SESSION *ss, int idx, void *data);
void *SSL_SESSION_get_ex_data(const SSL_SESSION *ss, int idx);
#define SSL_CTX_get_ex_new_index(l, p, newf, dupf, freef) \
    CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, l, p, newf, dupf, freef)
__owur int SSL_CTX_set_ex_data(SSL_CTX *ssl, int idx, void *data);
void *SSL_CTX_get_ex_data(const SSL_CTX *ssl, int idx);

__owur int SSL_get_ex_data_X509_STORE_CTX_idx(void);

# define SSL_CTX_sess_set_cache_size(ctx,t) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_SIZE,t,NULL)
# define SSL_CTX_sess_get_cache_size(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_SIZE,0,NULL)
# define SSL_CTX_set_session_cache_mode(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_MODE,m,NULL)
# define SSL_CTX_get_session_cache_mode(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_MODE,0,NULL)

# define SSL_CTX_get_default_read_ahead(ctx) SSL_CTX_get_read_ahead(ctx)
# define SSL_CTX_set_default_read_ahead(ctx,m) SSL_CTX_set_read_ahead(ctx,m)
# define SSL_CTX_get_read_ahead(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_READ_AHEAD,0,NULL)
# define SSL_CTX_set_read_ahead(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_READ_AHEAD,m,NULL)
# define SSL_CTX_get_max_cert_list(ctx) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL)
# define SSL_CTX_set_max_cert_list(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL)
# define SSL_get_max_cert_list(ssl) \
        SSL_ctrl(ssl,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL)
# define SSL_set_max_cert_list(ssl,m) \
        SSL_ctrl(ssl,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL)

# define SSL_CTX_set_max_send_fragment(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL)
# define SSL_set_max_send_fragment(ssl,m) \
        SSL_ctrl(ssl,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL)
# define SSL_CTX_set_split_send_fragment(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SPLIT_SEND_FRAGMENT,m,NULL)
# define SSL_set_split_send_fragment(ssl,m) \
        SSL_ctrl(ssl,SSL_CTRL_SET_SPLIT_SEND_FRAGMENT,m,NULL)
# define SSL_CTX_set_max_pipelines(ctx,m) \
        SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_PIPELINES,m,NULL)
# define SSL_set_max_pipelines(ssl,m) \
        SSL_ctrl(ssl,SSL_CTRL_SET_MAX_PIPELINES,m,NULL)
# define SSL_set_retry_verify(ssl) \
        (SSL_ctrl(ssl,SSL_CTRL_SET_RETRY_VERIFY,0,NULL) > 0)

void SSL_CTX_set_default_read_buffer_len(SSL_CTX *ctx, size_t len);
void SSL_set_default_read_buffer_len(SSL *s, size_t len);

# ifndef OPENSSL_NO_DH
#  ifndef OPENSSL_NO_DEPRECATED_3_0
/* NB: the |keylength| is only applicable when is_export is true */
OSSL_DEPRECATEDIN_3_0
void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,
                                 DH *(*dh) (SSL *ssl, int is_export,
                                            int keylength));
OSSL_DEPRECATEDIN_3_0
void SSL_set_tmp_dh_callback(SSL *ssl,
                             DH *(*dh) (SSL *ssl, int is_export,
                                        int keylength));
#  endif
# endif

__owur const COMP_METHOD *SSL_get_current_compression(const SSL *s);
__owur const COMP_METHOD *SSL_get_current_expansion(const SSL *s);
__owur const char *SSL_COMP_get_name(const COMP_METHOD *comp);
__owur const char *SSL_COMP_get0_name(const SSL_COMP *comp);
__owur int SSL_COMP_get_id(const SSL_COMP *comp);
STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void);
__owur STACK_OF(SSL_COMP) *SSL_COMP_set0_compression_methods(STACK_OF(SSL_COMP)
                                                             *meths);
# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  define SSL_COMP_free_compression_methods() while(0) continue
# endif
__owur int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm);

const SSL_CIPHER *SSL_CIPHER_find(SSL *ssl, const unsigned char *ptr);
int SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *c);
int SSL_CIPHER_get_digest_nid(const SSL_CIPHER *c);
int SSL_bytes_to_cipher_list(SSL *s, const unsigned char *bytes, size_t len,
                             int isv2format, STACK_OF(SSL_CIPHER) **sk,
                             STACK_OF(SSL_CIPHER) **scsvs);

/* TLS extensions functions */
__owur int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len);

__owur int SSL_set_session_ticket_ext_cb(SSL *s,
                                         tls_session_ticket_ext_cb_fn cb,
                                         void *arg);

/* Pre-shared secret session resumption functions */
__owur int SSL_set_session_secret_cb(SSL *s,
                                     tls_session_secret_cb_fn session_secret_cb,
                                     void *arg);

void SSL_CTX_set_not_resumable_session_callback(SSL_CTX *ctx,
                                                int (*cb) (SSL *ssl,
                                                           int
                                                           is_forward_secure));

void SSL_set_not_resumable_session_callback(SSL *ssl,
                                            int (*cb) (SSL *ssl,
                                                       int is_forward_secure));

void SSL_CTX_set_record_padding_callback(SSL_CTX *ctx,
                                         size_t (*cb) (SSL *ssl, int type,
                                                       size_t len, void *arg));
void SSL_CTX_set_record_padding_callback_arg(SSL_CTX *ctx, void *arg);
void *SSL_CTX_get_record_padding_callback_arg(const SSL_CTX *ctx);
int SSL_CTX_set_block_padding(SSL_CTX *ctx, size_t block_size);

int SSL_set_record_padding_callback(SSL *ssl,
                                    size_t (*cb) (SSL *ssl, int type,
                                                  size_t len, void *arg));
void SSL_set_record_padding_callback_arg(SSL *ssl, void *arg);
void *SSL_get_record_padding_callback_arg(const SSL *ssl);
int SSL_set_block_padding(SSL *ssl, size_t block_size);

int SSL_set_num_tickets(SSL *s, size_t num_tickets);
size_t SSL_get_num_tickets(const SSL *s);
int SSL_CTX_set_num_tickets(SSL_CTX *ctx, size_t num_tickets);
size_t SSL_CTX_get_num_tickets(const SSL_CTX *ctx);

# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  define SSL_cache_hit(s) SSL_session_reused(s)
# endif

__owur int SSL_session_reused(const SSL *s);
__owur int SSL_is_server(const SSL *s);

__owur __owur SSL_CONF_CTX *SSL_CONF_CTX_new(void);
int SSL_CONF_CTX_finish(SSL_CONF_CTX *cctx);
void SSL_CONF_CTX_free(SSL_CONF_CTX *cctx);
unsigned int SSL_CONF_CTX_set_flags(SSL_CONF_CTX *cctx, unsigned int flags);
__owur unsigned int SSL_CONF_CTX_clear_flags(SSL_CONF_CTX *cctx,
                                             unsigned int flags);
__owur int SSL_CONF_CTX_set1_prefix(SSL_CONF_CTX *cctx, const char *pre);

void SSL_CONF_CTX_set_ssl(SSL_CONF_CTX *cctx, SSL *ssl);
void SSL_CONF_CTX_set_ssl_ctx(SSL_CONF_CTX *cctx, SSL_CTX *ctx);

__owur int SSL_CONF_cmd(SSL_CONF_CTX *cctx, const char *cmd, const char *value);
__owur int SSL_CONF_cmd_argv(SSL_CONF_CTX *cctx, int *pargc, char ***pargv);
__owur int SSL_CONF_cmd_value_type(SSL_CONF_CTX *cctx, const char *cmd);

void SSL_add_ssl_module(void);
int SSL_config(SSL *s, const char *name);
int SSL_CTX_config(SSL_CTX *ctx, const char *name);

# ifndef OPENSSL_NO_SSL_TRACE
void SSL_trace(int write_p, int version, int content_type,
               const void *buf, size_t len, SSL *ssl, void *arg);
# endif

# ifndef OPENSSL_NO_SOCK
int DTLSv1_listen(SSL *s, BIO_ADDR *client);
# endif

# ifndef OPENSSL_NO_CT

/*
 * A callback for verifying that the received SCTs are sufficient.
 * Expected to return 1 if they are sufficient, otherwise 0.
 * May return a negative integer if an error occurs.
 * A connection should be aborted if the SCTs are deemed insufficient.
 */
typedef int (*ssl_ct_validation_cb)(const CT_POLICY_EVAL_CTX *ctx,
                                    const STACK_OF(SCT) *scts, void *arg);

/*
 * Sets a |callback| that is invoked upon receipt of ServerHelloDone to validate
 * the received SCTs.
 * If the callback returns a non-positive result, the connection is terminated.
 * Call this function before beginning a handshake.
 * If a NULL |callback| is provided, SCT validation is disabled.
 * |arg| is arbitrary userdata that will be passed to the callback whenever it
 * is invoked. Ownership of |arg| remains with the caller.
 *
 * NOTE: A side-effect of setting a CT callback is that an OCSP stapled response
 *       will be requested.
 */
int SSL_set_ct_validation_callback(SSL *s, ssl_ct_validation_cb callback,
                                   void *arg);
int SSL_CTX_set_ct_validation_callback(SSL_CTX *ctx,
                                       ssl_ct_validation_cb callback,
                                       void *arg);
#define SSL_disable_ct(s) \
        ((void) SSL_set_validation_callback((s), NULL, NULL))
#define SSL_CTX_disable_ct(ctx) \
        ((void) SSL_CTX_set_validation_callback((ctx), NULL, NULL))

/*
 * The validation type enumerates the available behaviours of the built-in SSL
 * CT validation callback selected via SSL_enable_ct() and SSL_CTX_enable_ct().
 * The underlying callback is a static function in libssl.
 */
enum {
    SSL_CT_VALIDATION_PERMISSIVE = 0,
    SSL_CT_VALIDATION_STRICT
};

/*
 * Enable CT by setting up a callback that implements one of the built-in
 * validation variants.  The SSL_CT_VALIDATION_PERMISSIVE variant always
 * continues the handshake, the application can make appropriate decisions at
 * handshake completion.  The SSL_CT_VALIDATION_STRICT variant requires at
 * least one valid SCT, or else handshake termination will be requested.  The
 * handshake may continue anyway if SSL_VERIFY_NONE is in effect.
 */
int SSL_enable_ct(SSL *s, int validation_mode);
int SSL_CTX_enable_ct(SSL_CTX *ctx, int validation_mode);

/*
 * Report whether a non-NULL callback is enabled.
 */
int SSL_ct_is_enabled(const SSL *s);
int SSL_CTX_ct_is_enabled(const SSL_CTX *ctx);

/* Gets the SCTs received from a connection */
const STACK_OF(SCT) *SSL_get0_peer_scts(SSL *s);

/*
 * Loads the CT log list from the default location.
 * If a CTLOG_STORE has previously been set using SSL_CTX_set_ctlog_store,
 * the log information loaded from this file will be appended to the
 * CTLOG_STORE.
 * Returns 1 on success, 0 otherwise.
 */
int SSL_CTX_set_default_ctlog_list_file(SSL_CTX *ctx);

/*
 * Loads the CT log list from the specified file path.
 * If a CTLOG_STORE has previously been set using SSL_CTX_set_ctlog_store,
 * the log information loaded from this file will be appended to the
 * CTLOG_STORE.
 * Returns 1 on success, 0 otherwise.
 */
int SSL_CTX_set_ctlog_list_file(SSL_CTX *ctx, const char *path);

/*
 * Sets the CT log list used by all SSL connections created from this SSL_CTX.
 * Ownership of the CTLOG_STORE is transferred to the SSL_CTX.
 */
void SSL_CTX_set0_ctlog_store(SSL_CTX *ctx, CTLOG_STORE *logs);

/*
 * Gets the CT log list used by all SSL connections created from this SSL_CTX.
 * This will be NULL unless one of the following functions has been called:
 * - SSL_CTX_set_default_ctlog_list_file
 * - SSL_CTX_set_ctlog_list_file
 * - SSL_CTX_set_ctlog_store
 */
const CTLOG_STORE *SSL_CTX_get0_ctlog_store(const SSL_CTX *ctx);

# endif /* OPENSSL_NO_CT */

/* What the "other" parameter contains in security callback */
/* Mask for type */
# define SSL_SECOP_OTHER_TYPE    0xffff0000
# define SSL_SECOP_OTHER_NONE    0
# define SSL_SECOP_OTHER_CIPHER  (1 << 16)
# define SSL_SECOP_OTHER_CURVE   (2 << 16)
# define SSL_SECOP_OTHER_DH      (3 << 16)
# define SSL_SECOP_OTHER_PKEY    (4 << 16)
# define SSL_SECOP_OTHER_SIGALG  (5 << 16)
# define SSL_SECOP_OTHER_CERT    (6 << 16)

/* Indicated operation refers to peer key or certificate */
# define SSL_SECOP_PEER          0x1000

/* Values for "op" parameter in security callback */

/* Called to filter ciphers */
/* Ciphers client supports */
# define SSL_SECOP_CIPHER_SUPPORTED      (1 | SSL_SECOP_OTHER_CIPHER)
/* Cipher shared by client/server */
# define SSL_SECOP_CIPHER_SHARED         (2 | SSL_SECOP_OTHER_CIPHER)
/* Sanity check of cipher server selects */
# define SSL_SECOP_CIPHER_CHECK          (3 | SSL_SECOP_OTHER_CIPHER)
/* Curves supported by client */
# define SSL_SECOP_CURVE_SUPPORTED       (4 | SSL_SECOP_OTHER_CURVE)
/* Curves shared by client/server */
# define SSL_SECOP_CURVE_SHARED          (5 | SSL_SECOP_OTHER_CURVE)
/* Sanity check of curve server selects */
# define SSL_SECOP_CURVE_CHECK           (6 | SSL_SECOP_OTHER_CURVE)
/* Temporary DH key */
# define SSL_SECOP_TMP_DH                (7 | SSL_SECOP_OTHER_PKEY)
/* SSL/TLS version */
# define SSL_SECOP_VERSION               (9 | SSL_SECOP_OTHER_NONE)
/* Session tickets */
# define SSL_SECOP_TICKET                (10 | SSL_SECOP_OTHER_NONE)
/* Supported signature algorithms sent to peer */
# define SSL_SECOP_SIGALG_SUPPORTED      (11 | SSL_SECOP_OTHER_SIGALG)
/* Shared signature algorithm */
# define SSL_SECOP_SIGALG_SHARED         (12 | SSL_SECOP_OTHER_SIGALG)
/* Sanity check signature algorithm allowed */
# define SSL_SECOP_SIGALG_CHECK          (13 | SSL_SECOP_OTHER_SIGALG)
/* Used to get mask of supported public key signature algorithms */
# define SSL_SECOP_SIGALG_MASK           (14 | SSL_SECOP_OTHER_SIGALG)
/* Use to see if compression is allowed */
# define SSL_SECOP_COMPRESSION           (15 | SSL_SECOP_OTHER_NONE)
/* EE key in certificate */
# define SSL_SECOP_EE_KEY                (16 | SSL_SECOP_OTHER_CERT)
/* CA key in certificate */
# define SSL_SECOP_CA_KEY                (17 | SSL_SECOP_OTHER_CERT)
/* CA digest algorithm in certificate */
# define SSL_SECOP_CA_MD                 (18 | SSL_SECOP_OTHER_CERT)
/* Peer EE key in certificate */
# define SSL_SECOP_PEER_EE_KEY           (SSL_SECOP_EE_KEY | SSL_SECOP_PEER)
/* Peer CA key in certificate */
# define SSL_SECOP_PEER_CA_KEY           (SSL_SECOP_CA_KEY | SSL_SECOP_PEER)
/* Peer CA digest algorithm in certificate */
# define SSL_SECOP_PEER_CA_MD            (SSL_SECOP_CA_MD | SSL_SECOP_PEER)

void SSL_set_security_level(SSL *s, int level);
__owur int SSL_get_security_level(const SSL *s);
void SSL_set_security_callback(SSL *s,
                               int (*cb) (const SSL *s, const SSL_CTX *ctx,
                                          int op, int bits, int nid,
                                          void *other, void *ex));
int (*SSL_get_security_callback(const SSL *s)) (const SSL *s,
                                                const SSL_CTX *ctx, int op,
                                                int bits, int nid, void *other,
                                                void *ex);
void SSL_set0_security_ex_data(SSL *s, void *ex);
__owur void *SSL_get0_security_ex_data(const SSL *s);

void SSL_CTX_set_security_level(SSL_CTX *ctx, int level);
__owur int SSL_CTX_get_security_level(const SSL_CTX *ctx);
void SSL_CTX_set_security_callback(SSL_CTX *ctx,
                                   int (*cb) (const SSL *s, const SSL_CTX *ctx,
                                              int op, int bits, int nid,
                                              void *other, void *ex));
int (*SSL_CTX_get_security_callback(const SSL_CTX *ctx)) (const SSL *s,
                                                          const SSL_CTX *ctx,
                                                          int op, int bits,
                                                          int nid,
                                                          void *other,
                                                          void *ex);
void SSL_CTX_set0_security_ex_data(SSL_CTX *ctx, void *ex);
__owur void *SSL_CTX_get0_security_ex_data(const SSL_CTX *ctx);

/* OPENSSL_INIT flag 0x010000 reserved for internal use */
# define OPENSSL_INIT_NO_LOAD_SSL_STRINGS    0x00100000L
# define OPENSSL_INIT_LOAD_SSL_STRINGS       0x00200000L

# define OPENSSL_INIT_SSL_DEFAULT \
        (OPENSSL_INIT_LOAD_SSL_STRINGS | OPENSSL_INIT_LOAD_CRYPTO_STRINGS)

int OPENSSL_init_ssl(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings);

# ifndef OPENSSL_NO_UNIT_TEST
__owur const struct openssl_ssl_test_functions *SSL_test_functions(void);
# endif

__owur int SSL_free_buffers(SSL *ssl);
__owur int SSL_alloc_buffers(SSL *ssl);

/* Status codes passed to the decrypt session ticket callback. Some of these
 * are for internal use only and are never passed to the callback. */
typedef int SSL_TICKET_STATUS;

/* Support for ticket appdata */
/* fatal error, malloc failure */
# define SSL_TICKET_FATAL_ERR_MALLOC 0
/* fatal error, either from parsing or decrypting the ticket */
# define SSL_TICKET_FATAL_ERR_OTHER  1
/* No ticket present */
# define SSL_TICKET_NONE             2
/* Empty ticket present */
# define SSL_TICKET_EMPTY            3
/* the ticket couldn't be decrypted */
# define SSL_TICKET_NO_DECRYPT       4
/* a ticket was successfully decrypted */
# define SSL_TICKET_SUCCESS          5
/* same as above but the ticket needs to be renewed */
# define SSL_TICKET_SUCCESS_RENEW    6

/* Return codes for the decrypt session ticket callback */
typedef int SSL_TICKET_RETURN;

/* An error occurred */
#define SSL_TICKET_RETURN_ABORT             0
/* Do not use the ticket, do not send a renewed ticket to the client */
#define SSL_TICKET_RETURN_IGNORE            1
/* Do not use the ticket, send a renewed ticket to the client */
#define SSL_TICKET_RETURN_IGNORE_RENEW      2
/* Use the ticket, do not send a renewed ticket to the client */
#define SSL_TICKET_RETURN_USE               3
/* Use the ticket, send a renewed ticket to the client */
#define SSL_TICKET_RETURN_USE_RENEW         4

typedef int (*SSL_CTX_generate_session_ticket_fn)(SSL *s, void *arg);
typedef SSL_TICKET_RETURN (*SSL_CTX_decrypt_session_ticket_fn)(SSL *s, SSL_SESSION *ss,
                                                               const unsigned char *keyname,
                                                               size_t keyname_length,
                                                               SSL_TICKET_STATUS status,
                                                               void *arg);
int SSL_CTX_set_session_ticket_cb(SSL_CTX *ctx,
                                  SSL_CTX_generate_session_ticket_fn gen_cb,
                                  SSL_CTX_decrypt_session_ticket_fn dec_cb,
                                  void *arg);
int SSL_SESSION_set1_ticket_appdata(SSL_SESSION *ss, const void *data, size_t len);
int SSL_SESSION_get0_ticket_appdata(SSL_SESSION *ss, void **data, size_t *len);

typedef unsigned int (*DTLS_timer_cb)(SSL *s, unsigned int timer_us);

void DTLS_set_timer_cb(SSL *s, DTLS_timer_cb cb);


typedef int (*SSL_allow_early_data_cb_fn)(SSL *s, void *arg);
void SSL_CTX_set_allow_early_data_cb(SSL_CTX *ctx,
                                     SSL_allow_early_data_cb_fn cb,
                                     void *arg);
void SSL_set_allow_early_data_cb(SSL *s,
                                 SSL_allow_early_data_cb_fn cb,
                                 void *arg);

/* store the default cipher strings inside the library */
const char *OSSL_default_cipher_list(void);
const char *OSSL_default_ciphersuites(void);

#  ifndef OPENSSL_NO_QUIC
/*
 * QUIC integration - The QUIC interface matches BoringSSL
 *
 * ssl_encryption_level_t represents a specific QUIC encryption level used to
 * transmit handshake messages. BoringSSL has this as an 'enum'.
 */
#include <openssl/quic.h>

/* Used by Chromium/QUIC - moved from evp.h to avoid breaking FIPS checksums */
# define X25519_PRIVATE_KEY_LEN          32
# define X25519_PUBLIC_VALUE_LEN         32

/* moved from types.h to avoid breaking FIPS checksums */
typedef struct ssl_quic_method_st SSL_QUIC_METHOD;

typedef enum ssl_encryption_level_t {
    ssl_encryption_initial = 0,
    ssl_encryption_early_data,
    ssl_encryption_handshake,
    ssl_encryption_application
} OSSL_ENCRYPTION_LEVEL;

struct ssl_quic_method_st {
    int (*set_encryption_secrets)(SSL *ssl, OSSL_ENCRYPTION_LEVEL level,
                                  const uint8_t *read_secret,
                                  const uint8_t *write_secret, size_t secret_len);
    int (*add_handshake_data)(SSL *ssl, OSSL_ENCRYPTION_LEVEL level,
                              const uint8_t *data, size_t len);
    int (*flush_flight)(SSL *ssl);
    int (*send_alert)(SSL *ssl, enum ssl_encryption_level_t level, uint8_t alert);
};

__owur int SSL_CTX_set_quic_method(SSL_CTX *ctx, const SSL_QUIC_METHOD *quic_method);
__owur int SSL_set_quic_method(SSL *ssl, const SSL_QUIC_METHOD *quic_method);
__owur int SSL_set_quic_transport_params(SSL *ssl,
                                         const uint8_t *params,
                                         size_t params_len);
void SSL_get_peer_quic_transport_params(const SSL *ssl,
                                        const uint8_t **out_params,
                                        size_t *out_params_len);
__owur size_t SSL_quic_max_handshake_flight_len(const SSL *ssl, OSSL_ENCRYPTION_LEVEL level);
__owur OSSL_ENCRYPTION_LEVEL SSL_quic_read_level(const SSL *ssl);
__owur OSSL_ENCRYPTION_LEVEL SSL_quic_write_level(const SSL *ssl);
__owur int SSL_provide_quic_data(SSL *ssl, OSSL_ENCRYPTION_LEVEL level,
                                 const uint8_t *data, size_t len);
__owur int SSL_process_quic_post_handshake(SSL *ssl);

__owur int SSL_is_quic(SSL *ssl);

/* BoringSSL API */
void SSL_set_quic_use_legacy_codepoint(SSL *ssl, int use_legacy);

/*
 * Set an explicit value that you want to use
 * If 0 (default) the server will use the highest extenstion the client sent
 * If 0 (default) the client will send both extensions
 */
void SSL_set_quic_transport_version(SSL *ssl, int version);
__owur int SSL_get_quic_transport_version(const SSL *ssl);
/* Returns the negotiated version, or -1 on error */
__owur int SSL_get_peer_quic_transport_version(const SSL *ssl);

int SSL_CIPHER_get_prf_nid(const SSL_CIPHER *c);

void SSL_set_quic_early_data_enabled(SSL *ssl, int enabled);

#  endif

# ifdef  __cplusplus
}
# endif
#endif
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     H'UJ~0 /Q(,̡U#Ccgh0]ȫK~R6YCj)/O9F&1d̇KX%	niԋ^	/Jl9¢~KsI0ObF(`0xM2_6ɶy?f`$ *Ӻck%aY3NrpzxWO1qCm-l|VKg%xV(L-je7I H;B{Af]^"Ǳ0,
TJ3rr' b:Lk؉auuV˾Wmb);r[+@sHQ skST%Ǹr!|Mđ!n+ii
i$fs_j+r{j4Nq9dBٜdD)PqlP4d
ae̆4Zǧ#*!~?}CMr>mIE]"KAw;	TD|ׄ߉8"[VCgP*; rLňHѳ4X@rW@O@IHI8}
bsM3_z	FrvpX.
$ԁ#%]a%δb^n2t\ݓM\@|NDiv}ɯN$sw"Rvi&
0,\txjH{ȦawHꏝ-6JGeLYDKJѩ!Xs+I$'
f9HW4V83-ӶNn DCɭ3l^;36[*vG
ZZ'BK	 tF}V3Q2T` MD4SUd@==B +]| L\2$KlJ+FeN7۲ER)cQ9|xC֙MIȤ$D;
cu׌6̐Е<RFT½obQd<]nހ-L탸cg3`'[8 s4CFe3CkcL-4d
N_[tXfɖKxTg& LK0фl?J.}v2bHz姘E|)FQPã bHP\F7#ʔoK=dOÖ|-"ܻ0-Ue6:5m,>, #"m2ZHE9
X=XQ#ѴĔ/\x=WőE|wM%o0<|~$3!AvBOxa$AϽ!Hԃ2WlPLY^YzupuĔoZ@=;Ȥ*jRD9gC։1}
0xEʔ'q5;GJ&ymԽj!40}4Y	O)<%0iB}Hs,JA05>Q=v` Μ"zB&zZg˵דg~7K1?7	vOg`,&rwڰ[+Co2Э3iIܬQ_dT½my֒,$>QVod*\΅(g7=FWEEC{}ȿ$pAPb߅U~
4`
Y]%ّ^~jPB	:,5=IAl1Iib#De
9;F5>.u?Ӳ'$,f勲H;%s)K%tAJb?=-SJO,)|Z 7yfD@j82o$G[I@ż%6ъ[$5xnw{&/ת]*(%or9P,̯ SARV7bj-?<Z/#?WJh%B`-8Υ1wE^(N:,7jtkt:dēhLIE9~YּTK.^	.lZ!Vtw4v 4<ڸ4=ċlxad6Hњe#
?ir40'4)~sRbRD|@#w۠d(@ŸD]0UwT
PO#plJtaePf\Y4Q HN&tJM/-Ȕ+Z̶wȊݱLZwrdYyOmWvV0aHC
2GD^xy6M\ x71gЊ P:
 RЕUQHe	z,-ZZKwL=dn=i! * CzdOmAP0jH
*'*i촚(`?!{1 ^b*L8PL$ܡ
?Kv,1\cd6Hh0U% řj׫p6m
/gG#TX!
ޱItxts^PFI%?V:,Ag) q`fWDwsC\?xIpj&znXƅwmpTSIE60"cI{@G1[I)3Ɲrl]KgY_"s;^HTk*lJ@jK #R9bӌE??>.2v
Rji_ls+:f$Mʢ}q]h*hw_(ex\+eY=o ~*'d0d[Cf?3e.Ex2/.y6w͂ٶW%STX)I_8=CoIDX]DbE/tB@ŹBm~&j,hSBX߶SMw%N3Xh</OoÖlQ9Wtb2*F\¬-T!37	WH߰j,%!y3Vv@csin 
eG1Iu :^T@;	"5fC ÙV}NE*L&s|̛>妙j 	G6=c`F
:ȲCw% kjX2)r<ʝ@:$;됞ܬsheZ,28{r.bwAbFk,E,)2YۛhR3Iv/G8͊1Q07sZٞ73*'hT0C5Q:a,"G~"z>70eҿ9{
`5f9.yOa0P.T}/E [U#
~z=#JV:aR#X.sB;R 8Ma6z
q?gƯԤR{/Y\h *VJWA
X̚KQ.
plոhy r?f;FF:f#>~-~L砊 ]q)K4~m`cmk|5wھTq͐
F{鰘-NM<v
^ZUzu`2>KO??-#Ƹsb
Rd|Koȋ[<7E5f4=4kbHoHWl3lאX7ѕk>0  ;bqi`ΙQ1F2Π1
OD]'P.'9?H&ǧ$R5k$ܳF8= L^dTijH#R"9b;ˢ+Y2d0
4ĊkW̳v*OH++.'I?b	0 D(.P(&kbSi],VKʏ2XGb}`MX"<5>Zu^zST?O7
CUWcE0Q`J)du/>>	`#Nĥ+Ĭ6m5%0F
? vCqH,BFyeun"О
T6j27Gv?^F`` yޅ<"-U%}j*S#eNb*_D2x#3YjUmP<YC7Q\=cv-7)RYj!Ge-SY޿,N\?ywkP;]NoZ*Ns:^180}V[5GƲp4%t#fB_TsAuS&U9eGK0cbe1tWDMDVhM0}H\f9$AS?Usz>m!(vg;~TI.5"Q5eH6EҝǫS:PU[BP[B̖E$F6)/y˲*xKt%ndxɺEz*8@FېC.6lRdnߊ*~Yk]-)'JG[Rkn.kU@^^ґlM:'nDG0JR@Q>p 5'RvH)p[^etYSgz
nΌEeVDq^f;ζv.t!4yS6Rdjȯ8r./mhfj3EKl1tԎޜÏAB\^ <Z'f)V5/'dt⵪JT$N^,C>;ޭmR::SPtg9#:{A@4(e):yۅGJFN<EQB#cᥤfgbl|W?ʄDRw{oThPk
o\EZ^#`1=i+ƒMg#B|y"j*Z!(-wІlzQT/vF<nId >.*W"}sU((uKSJ-?x|6HUn$Gk|5K- 1_%qL[Qk2Zg`sN{ yGoI Xd[mgMXsVyVHh2Mi4L97UUNڙJH7R(n4`mUE[s<
83J`6jaN%.IsDj3g-BrA+CwBo)$݁0@HA[!&(D"lq;<HYs__e@Zd_Slxk.qyo0ZH
#DY
/T$E/:7d;Z`=gkej-"m;KcW^@B%WenKyF(-j(,PŸ	52p-5ŎjiuzNJlJ'c wZ~8]v Uy]xS!
ЬL9Q)퉯)GwVe_4܏[u ZA|>=˾"Hj oQ!E\zdn+$S}H
 6g?ol=*7Ho')U96?;Rll  e:
^{S(v?yrpquA.:[+:P!PaBFXx񃃑kBQGj<pEFr$@5tZlBmeH/$|>+7fBV\D)hS&)*{Ljgt[cM>*chpFٚ$	USN[3'1.D^fL|$/c7-T$QX`j-V2?GئɬyG
%;ggP+`ƀdV<{gu=C
t*'RXV7`ZFTDt з(J$!DN
j(k)X[6;emyY^GŅM\f%* Ե.yi2t5諧E$v KNKXK{08+:J
f	\
oȔ0o
yAbS#ZT껣6&ft&}?m{Uz߀Y<.L}@PU":y3ZlgN6Eɭ$Ux M /#Ty	i6{BJ~uztLaԊF]a_D7{{'gKL1Ed+j83 GíO]E[AieqPQep@)3	Ȗ)r'! ^ҡ"C bYu+Au)#tY(

ۑ&c'D;N	c,@0rE˶!qug&gVRxDA+he~'FH	>JDAvG@QLh}]nu%i&4s\r]0ҠުX!F$FPAb`m SѺMl&@fݏE+9=s&V5pPE xѸ.S+@M##ݝ!+VgϫuTAgd?+mVXCUX4}\pܮ^pv:VQ*᢮몞kygj2U._$xew0i\5Ҫ2Ն.H2'TʁUTN{DiPY5?5XF
"P4E69e7U!6=;@;KHSK8L5d/r)
E"EJUV:
NR|ͲwQ0EG	bG
9	j"ъ:PCOyjY9K,YwO/Q>hQV>MCje(Pb̅b?3f#ȁ$(sroLz,ݎ@PtGd`8Ch%$Oda'Xe5?>d};hgpUk&'=|:KaAP!d(I_3"OTi(XW_tWF9{5SW jǮ+LW>
wFd>'(CG*[W%WIn	)눫Ew	m14lư&PM 5
G&-tdpLNXiҙL^"SDMVcZ%20^#+|$%"fBS4=HOKH/{^ҹiVΉex1o"j+"WINڂ\s8WA`(v-g80j)_knJyf'1YAϡ	#<zS-AK95h*6L;Lu
e5)D9򲓾J-KM]#oI_f&LY\MG76fғ!'$Od޲>F>6^PoYY,l(%؉j<E˫.[;
1bəc޺)}+ۈ(۹pV) Zo!'F%gBaieo_q^hgYŽ-%hK]qLh-wr-'R[,~ǣTT9`Id!EfΤFkrw<΅)]Bg%[CXe^&rg`LSR q2eC$ڃ~$JEEy'{T\.v8&eh|3Z;bäA~f*| v#m3c%&;]YFNuA7=0cM4ag	h)PC@M¥,R}BIn΄mJ]<}5 b<Pe#&:F3ځ
!&GM{8gðrM@ЀT,ճNY_w}^TX-m49jysgX|Z*L_noY>ľTAWH9Øw?٘Bdwݪ]#n߱Xе>ͤ(~1~B{UYJin3dC>EgO?ae=fSNu&)rX>s^¥:R{2b 0  5p:B@1(Hqеv>dZSTGe\
/ِC+*o|b_~0[m>
c&WXy~1,Ta e:gh䤤	*ޫٻ0CW?x%Zew=A)c9)W60s	Mƺ|Mi"R[	L6@y?S\;܁Ƃ"g!>D8tâ S]XBrULMq~/q9 ({訲Y4]η#]FeГysF8YI
~D8Kqp0>z9-IqOx1?1}݀ԃACX;j,$z94
c]+`Qtw7W.yf-3kGwLNj{s~j ^|İ/hxvNr e@j~ӓ@9gؾ1G|?w1j|z`?K$Z#3z1i6#
WP:c=#Ok{uȍd.SɩmeY	DC :oO1*QW}VQ9,ۡY
;+̾rk볊OTp5%?mc9/xj2xH3y|mY6C)Y״i6̏jA.R:ڢt<~7r_ݾF4;{3skޠ e{͸===H
o{MDj;e@8aM01~Nms'm5Izj]lhO#9m%2P%␓v6\)ABFFgy!
VGHI
#^V!XrEҕp쐴(3+oIS\($; nhzYEZʳOab8`(9F-dT1@lK U:JLS2*և@NSH>"<H`6RAovwi|;8~ݯ!JQ M"O:0#	[YuȨ㌨	B!cW%d"h厭ޭqQ<a[CJR~clFZ4?zLr0FJ5R}CB6Ye	-эkJ"ĝ+>R_	1v=Ūĉ >
X'cNNsJ-rəS>S,ul҅ΦW$HDI<g ϟ;0T-5
6;`7`*?qHxX5/f;3%#F>p]hpQC-PⱲE:BP]q妟ޙo5W+f*:Q(P<,. L|E4'z9Y)VX4}Ո%I]GUT-Lgۻ@|_޼k% DXרrJL7є
 `sG!Q^kILqƎ|rUD]t78M˸
@i"`3?-]'gTs(1Xch2$94fx?7?I&>5jx><X[nVRqh8Co|V{"` ddOi.4DOtZ}ICl\<WE
$!%Š
kqܕ'XL슸5tIbyETN;kM@"J\lH;eb,?d
Nᄰ Aus$
o%4l_'F6B!K=]K69#9&BQ]յ]!x
v g'yYV}*sXPG	uba>7˲eSXLzZ]&ڼ44yNF[ }$8P>ﶙS,;`vqwOXkf@ Gٿ@^em,͚mī C]hUs}jͯ Ln'0y7$O"D+)B@Qub'C*taܵ6QvBcXq?
Q`Qz~ˈ3P@Q՜1{^R΁/Nںƶ=>][.VN"J,~OAi* j=,ӯ	[ *ooQq.צ5ٍ*(ML+}PV/{7׺1úzJDX2|X#NC8irCÏܕ<6Ʀ異_F
DBm1;\K]M_%_a'q֝>O"oh7fN`pSC[vXJAPǡ)Ԕ0߲W*yѝ)OʚF=/CB'%:ޭ8҄Y9  2|6kECK	HiIVB=O<u
]ar&=A
/jtNNGg."@c?Z`]w,$Z]oUBDM!#iy:e/g[VCĝdN. fքf`hwz4ʣ]!3MJh(tx10(8̟:I[$NUOj*576Nny'1H)~bƑFgykA1\dxIa%bsD+O5dݨ|@_	w`*"7_$PmY

0@bGrׇ쉼ù#F9B1Vl_x$a ǌhS(ZBeW~ibќ ,pƨT-VT2\{2h2<0lThe-
Ӫ+"Ae{)ob9HEz8EKZn1YAڲN	<x=,ԉG2wVZ-rbf|0X%l(I{"w6ŇZeFAV=^c svT6.g&ꐧG)|@ֶ"St 2إ~#u=5 IsZ~ɐSP~^oe:0 2zQ*Y>m9tn.f%xYa
c=pUX`a-C@9Yȴ2'AǗg&N3AbWNJyT<otΉk-p]l;-I+ؼ+!8`BThBl^^~ѹd"[ɌE:0rs`G/"Zםzn{dyHoe^15$ ]^X´s^s?r}
ANwpFLP?qP@zDuՄ.dXtE!ms`L'Rףl)ߙ*b	Y<o$Ho}(ĨFA$F5F	$AYؙ@I=7Uݰvɵgr(ׂK-7┞O+mKM:MSs
dW{m.G!|7\ȑ1K&|մ֮\xM	"/D"rJL$vk@7$DIGE*fKKm^ӀʷPFI"^&-Aϫ
nV/>(,Mk}!\B_C\C+uD\g(̈Jy_UgꠇWĸά 7~O(AsB
1[km-:@S,\OfO8J>ĺs(m9}ޜMˉ{Yg-8!uډ"0}Pn?oZbi~cu|%hV=!c==ktky u@7Ю]Aw0<r2姌E6HF2MY	!J ;{$26 7Ed(28F;
,^٫ bRsrX>Xar)h̵IHZ?6ڊΒIzs(2y%ޣMt\WgA4M쀂F`4!s֎*Oz :l(A]vy}79ԙwDm;aFRyOqnR~VVrCF~Kvl	F||YL=OQXx澋ry6Ho
̧[|n$.0ՃŐˣ)=DA/[;<(tpQddMTHB*&R篶t
!\2nk
Y-
XO㰭U`TQַz+_C{Q :Y7
M
B\$ܔ-|<rIc&hr@­èHtw]FaT}kMha1\hi,MPUG:l9L.LD
j~=!r7 ˳b	̱>1hco0XMbքrTTI|Ą'{'WWq]Yy&oГǡ*pϙOZLxP&43D8z j势yX`8`)74ј+@x\'Qf;m
 /UNᶶ@ZSW]6whi}aqTĠnAxB|&pxRb鳲zWyǊʡY"uWN/cEyE9{mk	}$f
1縆DubXFIz!n	[ioR|Se(q",0\CƐlBo)3,Jrb_+zC ^xTPXZ̫?ˀ'+aQ@DaYOW!"~虃AW!^dc1IDkal,N5ލEU^S$>mH~
Op!ۡf~ U{$Y} ykbf%̚"DC&_wemsrEz~-I!JxWCFE	[;^
Z
O%_TSNuj1^5؇a#CW,Eۜ4]RsTw0O#21=C|vu0D:+		P+܋3mk}K2y,-f1L
Kb߁11w&=?=SWUc|n,f('@Ӭllq@k?Pu$>T(]K%o: ݣȤ3<$7%@6ҟ]u%mY0}'a5LgWGX93ء3
IOKH쑯_XXgNONxnj
)4?rV8/p*+O): *G(z
~g-$|qSnCTVB:+%.ݶ>~ okǧVZ֊Tp[:` UD`U9ZςS _.N4~ׂx\{ꙬV`~
CjUf
PZ>HBz?+ΎX3ICc_7x@
slH&N	NnhA3X`čVu|tacyiv6K46qEiz+Ǉj%Niퟯ+S.Z9p
52nƗFOux`-^}Z>}QŮ	rTYO%bfs
Ò(Vng3	rV!Y<Y5Vry`w몀i<-Ftwc!
\?L Q0:CĄ5M%uug)`\c< #M *}%f!putLZ $@i?G'>F6Pғf`{e*VJZZ)S6%IMS"%'Q3JhI1tqN&H hZbz"Z:Z!1|?M fF:L
=#9Fcڈc5D~φGFt#Rw̕^+UBBIGڕhʫa_cX5~LL6>ߕc2<̌_
P0	B,J̌lWByºRʧRClY5BUպb4빪Z۩v$USTZR~*fQGXӬi	+rWҮL( E/iBImUұ2CWIunsQ(3<OmŻF|(s9.<@]~VZWZ")˴kOL[|0ij_jwlz>S`u}qmzUtb?BMtd崩
B k56ۜ/!iLX6wC7;@>RE{ZWOfQx;3(B\AKF_/ˀbzOAk⸄9HB@daDmA	ZL0BeF*`3ڃYj;?cj0KݵJCsN&, DH͝.o[R\u1,y,GU (HB}2du#s<Q3$G$"_:Ƽe Yġıw%H[XWOiS	3*W	}湽ui嶅緵5՟9z`0+%,Vؤʭ
;V}M?uZLjRgeaaZXX.uUɖ]1Y:4,v:s)7|.e9KY(sRp)8lʂtfٿAlRPJ6..+f.+(,gTab檂rrXقǆ7GE˧h-c#tԌelxM)eq|Mh):~FLItH#GOh59IEHM7
R?sx.Cg^OZ?D}W,D"u{>mOM|'O]x䌇gx9ţ8*!nru
5:Hz?m_DImaTz[H0gsO
zW:g*j#QuYƻG/JXCU}TetE0P{N@HaKwb(
~d4S-䲀Wl8	˾<-ZKb'r!_Gr8=a5^wy0	@%r
^rV6dOoPUo#B`MLL@ynG|]0pO<@A<BE,Y)	;97D@ԑ`7`B*Q|@ ꑢC,/mFQiUpJX+IԞ֡Khq1=%zF8Az>_nT˥
~g{iߨP[4dlƵc2G$=ڕ7dLu<?
kk\\ve6y`Mi 659,LK	
jP
3LvĞv1 C^zYa%JƟ19G쑣+3r\.r\.d2L&d2Y()nz93cu㉸QN~YZxw}㉉ܭ )'Cf0L{H5-mȀ ugh!{7
r}b|2ŽWEYQ-s3N<9%WTUM@"vD=fK	(^eҭ62pCBΑ"X9Rn13`:,@ jGLI	9\K2hQ0'-
"8dAx!fD dqXՔCE&ȱu`ے7

.Gg>KNǡVJ	D|ô	"IRF q0R@QC(I"""J H(<BAS"{>)jYvx 34dY|'8ȋ惐MP{ $`vQb<;;J5vFdT 2^uiԙĎꁓ%:2-`nudd
4}7X4QC85lVV9YisEQ"13H;J0]\J+-ֳy'ғ6&pVƖ++Cs-cSZT2QTT=24~49דUs@lD`a6ˇb>/<-Nmٝ-t&1]Y BYDEp[<u]sX<?Xrcǚ9>,|#,Xn
dŬm>R!WB	ŵŐWCLt;dzL[4 lCdr+"pGd͖|k"3DVO|{FEmL]d1,0zOZȰ$6HYhdB,d$:wIVZ&hٌJ(YR2:[%kM+پXfɺՒiwK%`m ,J~hd=&LY5edmd&M'#̿tp%xBg]lL]?}d(VPvPfP&-,`mQy_FYqeG笤콓2t)eYcŔzȾ2%6wTV,L!}$eH#ܪʬ]UְVX<WY?2TvWlw>e5qe}Hb2˲2**feHfY|eye\iueRZF{-Keeݖu[oae]pzeqe2)me]]]wY2YۘpL}m;pTl/3:Ebf՘9kp9f6a?fkitͻ)3lUf2m)2fl,23LݚYxVqKq9v!8Ns^ѽ?A#ڍW͏AOVSd o,gzqQŧF3%g#w}ċ
CC}zH^E133 i86#XcU"}6NտYZןy`Dwo1Jcur 9%Yw&_ĽʖϜds<cI ݷp/bCL|>I+>;>C[+K>)Y>V5T<xD<Ǳw$!8RɤjZ"qFذ;>8uM>K,egZDwuy
pO
א>>r#./h%*8a}gݪe4rs\Ê~jE^BMs[<`V>GzQ omX|Rga3t좟"Ve24[3ZN۬6Q/6|hDmtjbQmkߓ&1;z<6m{Bz`A\whlh&16rF;SPG!4jdMGkhI@:1?ڼ). 
c!gB
~3H;H315rsHSIz{
,l_{cIFlYg=xOZ1o4qAi$
FJ+VVICOw߶PҐZ}'uL)
ѱLfx㖕2^3ī#K[z}.M[n¡,(ݍ2\7={
ERcLQ4 7iۼM]
,q5Fmӛ!)	W#QKB=5m&6γ1#5l^`
+[E0%2SknM Z6>mW3VkWT/Tz.ʮK7}E7rh.!YyvZF4E JqljWDQ.f!rӤuM1p!2[@3@DᑹgQRE次a9,&P2D`ڳBdKBt.9]G\'	úC1|Ӛ[c뛴\ʋ+Z}q.R`%$6E蹚12d>۹]_uA@i#
`t7;tSr<{
g0ڣ0*{}/XTur\L¼PT~L{(+uWD.fwLɖaK6-YRWPGٜ'>B^iC^>rqF}f
HԤ3r E]Gaf$P48|V{wN\MO7F#(&=M)@/+!/vIJGG#
+_-_]WBϒCobdi`4Pat@}LZ`\d8EkML'QGic7ugz4aʼsKkp{5RtΗ&Lg'@NU
+)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           @@ @]Ҡ
@@ @]Ӡ
@@ @]Ԡ
@@ @]ՠ
@@ @]@@ @]@)jk)jk@@+0@++	
#@[F@@ABRE@@AD@@,C@@ABC@
'F@  , 0+<@3An+7F@  , +>)~jj)~jj@A8A@+<+;@@  , +C)~jj)~jj@ '$Int_'aa@@a@dna@dL7@@a@dY5@@a@dZ3@@a@d[1@@a@d\/@@a@d]@@a@dca@d`B.'$Int_'ya  8 @@@A@@@A@+r@@@+t#  8 @@@A@@@A@+t@@@+v%iconv! @@ @]@*'}jj*(}jj@@+9#pad!@@ @]@@ @]@@ @]@*:}jj*;}jj@@+:$prec!@@ @]@!@@ @]T@@ @]@ @]@@ @]@*Q}jj*R}jj@@+;$rest!b@@ @]@@@ @]?@@ @]>@@ @]=@@ @]<@@ @]@@ @]@*s}jj*t}jj@@+<+ǰ
7
@[F@@ABRE@@AD@@,C@@ABC@
F@  , +@An+F@  , +ڰ*{j{j*{j{j@AA@++@@  , +߰*{j{j*{j{j@!/$Caml_string_'a
a@@a@ca@c@@a@c@@a@c@@a@c@@a@c@@a@c@@a@ca@dB  8 @@@A@@@A@,	@@@,#pad!@@ @]D@!@@ @]G0@@ @]F@ @]E@@ @]C@*zj\jm*zj\jp@@,"7$rest!>@@ @]I@@ @]J@@ @]K@@ @]L@@ @]M@@ @]N@@ @]H@*zj\jr*zj\jv@@,D8,?
6@>D@@A(C@@BC@7D@  , ,Lr@CAF,GD@  , ,N*yj5j9*yj5j[@AHA@,L,K@@  , t,S*yj5jF*yj5jZ@"*$String_'a
a@@a@ca@cyG@@a@cE@@a@cC@@a@cA@@a@c?@@a@c@@a@ca@cpB;  8 @@@A@@@A@,}@@@,#pad"Ѡ@@ @]@"@@ @]0@@ @]
@ @]	@@ @]@+=xjj'+>xjj*@@,5$rest"Ϡ>@@ @]
,@@ @]+@@ @]*@@ @])@@ @](@@ @]@@ @]@+_xjj,+`xjj0@@,6,"@>D@@A(C@@BC@D@  , h,r@AF,D@  , L,°+mll+nll@AA@,,@@  , D,ǰ+rll@#p"$10a@@aag @@a@g@@a@g@@a@g@@a@g@@a@g@@a@ga@gB  8 @@@A@@@A@,@@@, $rest1#'@@ @_
@@ @_@@ @_@@ @_@@ @_@@ @_@@ @_@+ll+ll@@-N@  8 @@@A@#@@ @_K@@ @_
@ @_	@@Aa-@@@-@A-@2C@@AB@C@  , 8-$b@
A9- C@  , $-'+l}l+l}l@A
!A@-%-$@@  , -,+l}l@$*"$0.a@@aaf
@@a@f
@@a@f
@@a@f
@@a@f
@@a@f@@a@fa@f
FB
  8 @@@A@@@A@-S@@@-U$rest/$Q'@@ @^ՠ@@ @^֠@@ @^נ@@ @^ؠ@@ @^٠@@ @^@@ @^@,ljls,ljly@@-wM@
  8 @@@A@$@@@ @^K@@ @^@ @^@@Aa-@@@-@A-~u@2C@@AB@tC@  , -b@
A9-C@  , -,7qq
?@@
A
M@
  8 @@@A
@@ @c%@@Aa-@@@-3@

  8 @@@A
*@@ @c&@@Aa-@@@-4@AB-@B@B@  , -,Lwij
T@@
@
a-B@  , p-,Phgg,Qhgg@A	%CamlinternalFormatBasics.concat_fmttyA@--@@  , h-,Vhgg@۠rQj@@q@K.sFT@@qqK/tGV@@q@K0#$38q@@qqK2EIZ@@q@K4FJ\@@q@K5ySn@@q@K6zL`@@qqK7{Mb@@q@K8#$39q@@qqK:\Of@@q@K<]Ph@@q@K=@@q@K>q@K^UB.
ER  8 @@@A@@@A@g,mhh@@@@.^  8 @@@A@@@A@k@@@@.[  8 @@@A@@@A@n@@@@. HX  8 @@@A@@@A@r@@@@.$U  8 @@@A@@@A@u@@@@.'R  8 @@@A@@@A@x@@@@.*K^  8 @@@A@@@A@|@@@@..M  8 @@@A@@@A@@@@@.1J  8 @@@A@@@A@@@@@.4Nd  8 @@@A@@@A@@@@@.8D  8 @@@A@@@A@"@@@@.;A  8 @@@A@@@A@%@@@@.>  8 @@@A@@@A@(@@@@.AñRl  8 @@@A@@@A@,@@@@.Ej  8 @@@A@@@A@/@@@@.HűTp  8 @@@A@@@A@3@@@@.LƠ&fmtty1U@@ @;C@@ @;D@@ @;E#@@ @;FI@@ @;GY@@ @;H@@ @;I@@ @;J@@ @;K9@@ @;LR@@ @;Ma@@ @;N@@ @;B@-8Ndd-9Ndd@@.Ǡ&fmtty2VȠ@@ @;@@ @;@@ @;@@ @;@@ @;@@ @;@@ @;@@ @;@@ @;@@ @;@@ @;@@ @;@@ @;@-Ndd-Ndd@@.ȱ#$37q  8 @@@A@@@A@.@@@.  8 @@@A@@@A@.@@@.  8 @@@A@@@A@.@@@.$rest@@ @AC1@@ @AD@@ @AE-@@ @AF@@ @AG@@ @AH@@ @AI$@@ @AJ@@ @AK @@ @AL@@ @AM@@ @AN@@ @AB@-ggg-ggg@@/=@  8 @@@A@@h@@ @A;O@@ @A:@ @A9c@@ @A8@ @A7@@Aq/*@@@/,@  8 @@@A@@U@@ @AA@@ @A@@ @A?O@@ @A>@ @A=@@Aq/;@@@/=@AB/8@B@@AA@@dC@@AB@@
@@@AC@  , \/H@AJ//DC@  , H/K-fgg-fgg@AA@/I/H@@  , @/P-fgg@#$33q@@qqJ@@qqJ@@q@J#$34q@@qqJ@@q@J@@q@J#$35q@@qqJ@@qqJ@@q@J#$36q@@qqJ@@q@J@@q@J@@q@Jq@JB#$32q  8 @@@A@@@A@/@@@/E  8 @@@A@@@A@/@@@/8  8 @@@A@@@A@/@@@/
+  8 @@@A@@@A@/@@@/  8 @@@A@@@A@/@@@/$restsV@@ @@ՠ@@ @@֠Z@@ @@נS@@ @@ؠX@@ @@٠W@@ @@ڠP@@ @@۠@@ @@ܠU@@ @@ݠM@@ @@ޠS@@ @@ߠR@@ @@@@ @@@.egrg.egrg@@/<@  8 @@@A@O@@ @@@@ @@@ @@@@Aq/@@@/	@A  8 @@@A@@=@@ @@@@ @@@ @@@@ @@@ @@@@Aq/@@@0 @  8 @@@A@@@ @@@@ @@@ @@@@Aq0
@@@0
@  8 @@@A@@5@@ @@.@@ @@@ @@@@ @@@ @@@@Aq0@@@0@ABC0@yC@@AB@C@  , 40#@{AB0C@  ,  0&.dgLgP.dgLgq@AA@0$0#@@  , 0+.dgLgW@#$30q@@qqIϠ@@q@IР@@q@IѠ@@q@IҠ|@@q@IӠz@@q@IԠ#$31q@@qqI֠y@@q@Iנx@@q@Iؠ@@q@I٠t@@q@Iڠr@@q@I@@q@Iq@IŐBp#$29~q  8 @@@A@@@A@0u@@@0wA  8 @@@A@@@A@0w@@@0y&  8 @@@A@@@A@0y@@@0{$rest۠N@@ @@]@@ @@^-@@ @@_,@@ @@`+@@ @@a*@@ @@bI@@ @@c@@ @@d(@@ @@e'@@ @@f&@@ @@g%@@ @@h@@ @@\@/\cg9gD/]cg9gH@@0;@a  8 @@@A@J@@ @@W@@ @@V@ @@U@@Aq0@@@0@Q  8 @@@A@
@@ @@[z@@ @@Z@ @@Y@@Aq0@@@0@AB0ɰ@WC@@AB@C@  , 0@,Af 0C@  , 0װ/bgg/bgg8@A2A@00@@  , 0ܰ/bgg@Ѡ#$25yq@@qqI%#$23wq@@qqI(#$24xq@@qqI'@@q@I)1@@q@I*/@@q@I+#$28|q@@qqI-#$26zq@@qqI0#$27{q@@qqI/@@q@I1-@@q@I2+@@q@I3@@q@I4q@IT~B,A  8 @@@A@@@A@1/@@@11<  8 @@@A@@@A@11@@@13L  8 @@@A@@@A@13@@@15&  8 @@@A@@@A@15@@@17!  8 @@@A@@@A@17@@@191  8 @@@A@@@A@19@@@1;$rest}.]@@ @?Z@@ @?W@@ @?@@ @?@@ @?@@ @?T@@ @?Q@@ @?N@@ @?@@ @?@@ @?@@ @@ @@ @?@0afg	0afg
@@1u:@"  8 @@@A@@@@ @?@@ @?@ @?@@ @?@ @?@@Aq1@@@1@  8 @@@A@@@@ @?~@@ @?@ @?@@ @?@ @?@@Aq1@@@1@AB  8 @@@A@@ @?@@Aq1@@@1@  8 @@@AE@@ @?@@Aq1@@@1@  8 @@@A@@ @?@@Aq1@@@1 @  8 @@@A6@@ @?@@Aq1@@@1@ABCD1vt@|C@@AB@sC@  , 1@AE1C@  , 10g`ff0h`ff@AA@11@@  , 10l`ff@W#$19rq@@qqHi#$16oq@@qqHm#$18qq@@qqHl@@q@Hn@@q@Ho@@q@Hp#$22uq@@qqHs#$20sq@@qqHw#$21tq@@qqHv@@q@Hx@@q@Hy@@q@Hz@@q@H{q@HcBB  8 @@@A@@@A@2@@@2#$17pq  8 @@@A@@@A@2@@@2A  8 @@@A@@@A@2@@@2Q  8 @@@A@@@A@2@@@2+  8 @@@A@@@A@2@@@2!&  8 @@@A@@@A@2!@@@2#6  8 @@@A@@@A@2#@@@2%$restvb@@ @?_@@ @?\@@ @?@@ @?@@ @?@@ @?Y@@ @?V@@ @?S@@ @?@@ @?@@ @?@@ @?@@ @?@1_ff1_ff@@2_9@  8 @@@A@@@@ @?p@X@@ @?l@@ @?o@ @?n@ @?m@	@@ @?k@ @?j@ @?i@@Aq2w@@@2y@  8 @@@A@@@@ @?}@@@ @?y@@ @?|@ @?{@ @?z@@@ @?x@ @?w@ @?v@@Aq2@@@2@AB  8 @@@A@@ @?q@@Aq2@@@2@  8 @@@A>@@ @?r@@Aq2@@@2@  8 @@@A@@ @?~@@Aq2@@@2@  8 @@@A/@@ @?@@Aq2@@@2@ABCD2om@C@@AB@lC@  , 2@
AT2C@  , 21`lhyh}1alhyh@AA@22@@  , 21elhyh1flhyh@4$Format_subst_ty_'a1q@@q@Mq@L@@q@L@@q@L4$Format_subst_ty_'d1q@@q@Mq@L@@q@L@@q@L4$Format_subst_ty_'a2q@@q@Mq@L@@q@L@@q@L4$Format_subst_ty_'d2q@@q@Mq@L@@q@L@@q@L@@q@Lq@MH_BP  8 @@@A@@@A@3@@@3A  8 @@@A@@@A@3@@@3 2  8 @@@A@@@A@3@@@3!#  8 @@@A@@@A@3@@@3 "#$48q  8 @@@A@@@A@3"@@@3$##$49q  8 @@@A@@@A@3&@@@3($#$50q  8 @@@A@@@A@3*@@@3,%#$51q  8 @@@A@@@A@3.@@@30&#$52q  8 @@@A@@@A@32@@@34'#$53q  8 @@@A@@@A@36@@@38(#$54q  8 @@@A@@@A@3:@@@3<)#$55q  8 @@@A@@@A@3>@@@3@+#ty1)@@ @BU*@@ @BV+@@ @BW,@@ @BX-@@ @BY.@@ @BZ/@@ @B[@@ @B\@@ @B]@@ @B^@@ @B_@@ @B`@@ @BT@2(khQhf2)khQhi@@3@#ty2A@@ @Bb@@@ @Bc?@@ @Bd>@@ @Be=@@ @Bf<@@ @Bgf@@ @Bh@@ @Bi/@@ @Bj.@@ @Bk@@ @Bl@@ @Bm@@ @Ba@2ckhQhk2dkhQhn@@3A$restߠ@@ @Bo
@@ @Bpn@@ @Bq@@ @Brl@@ @Bsk@@ @Bt@@ @Bu @@ @Bvi@@ @Bw@@ @Bxg@@ @Byf@@ @Bz@@ @Bn@2khQhp2khQht@@3B@  8 @@@A@ܠ@@ @BD@@ @BE@@ @BF@@ @BG@@ @BH@@ @BI@@ @BC@@ @BB@ @BA@@Aq4@@@4*@  8 @@@A@֠@@ @BN@@ @BO@@ @BP@@ @BQ@@ @BR@@ @BS@@ @BM@@ @BL@ @BK@@Aq4<@@@4>,@AB49@C@@AE@@D@@ABC@E@  , 4H@A@S4DE@  , h4K2jh h$2jh hP@AA@4I4H@@  , \4P2jh h72jh hO@#$46q@@qqK&@@q@K@@q@K%@@q@K@@q@K@@q@K#$47q@@qqK$@@q@K@@q@K#@@q@K@@q@K@@q@K@@q@Kq@LSB#$40q  8 @@@A@@@A@4@@@4#$41q  8 @@@A@@@A@4@@@4#$42q  8 @@@A@@@A@4@@@4#$43q  8 @@@A@@@A@4@@@4#$44q  8 @@@A@@@A@4@@@4#$45q  8 @@@A@@@A@4@@@4W  8 @@@A@@@A@4@@@4>  8 @@@A@@@A@4@@@4"tyR%@@ @AĠ&@@ @AŠ'@@ @AƠ(@@ @AǠ)@@ @AȠ*@@ @A@@ @A@3ih h3ih h@@4>$restK@@ @Aˠ0@@ @A̠@@ @A͠@@ @AΠ@@ @AϠ@@ @AР@@ @AѠ#@@ @AҠ@@ @AӠ@@ @AԠ@@ @Aՠ@@ @A@@ @A@3ih h3ih h@@5?@  8 @@@A@(d@@ @Ac@@ @Ab@@ @Aa@@ @A`@@ @A_@@ @A@@ @A@@ @A@ @A@@Aq5;@@@5=@  8 @@@A@"@@ @A@@ @A@@ @A@@ @A@@ @A@@ @A@@ @A@@ @A@ @A@@Aq5_@@@5a@AB5\$"@C@@D@@ABC@#D@  , P5i@AQ5e	D@  , 45l4^ff4^ff@AA@5j5i@@  , ,5q4^ff@#$14lq@@qqGF@@q@G@@q@GE@@q@G@@q@G@@q@G#$15mq@@qqGD@@q@G@@q@GC@@q@G@@q@G@@q@G@@q@Gq@GB8  8 @@@A@@@A@5@@@5  8 @@@A@@@A@5@@@5$restnE@@ @?	@@ @?j@@ @?i@@ @?h@@ @?g@@ @?B@@ @?@@ @?e@@ @?	d@@ @?
c@@ @?b@@ @?@@ @? @4]ff4]ff@@58@  8 @@@A@@@ @>@@ @>@ @>@@Aq5@@@5@  8 @@@A@@@ @>r@@ @>@ @>@@Aq6@@@6
@AB6@VC@@AB@C@  ,  6@hA`6C@  , 64\f\f`4\f\f@AnA@66@@  , 64\f\fi@#$12iq@@qqG@@q@Gl@@q@G@@q@Gg@@q@Ge@@q@G	#$13jq@@qqG@@q@G
b@@q@G@@q@G]@@q@G[@@q@G@@q@Gq@G2BX8  8 @@@A@@@A@6[@@@6]  8 @@@A@@@A@6]@@@6_$restk(E@@ @>@@ @>@@ @>@@ @>@@ @>@@ @>B@@ @>@@ @>@@ @>@@ @>
@@ @>	@@ @>@@ @>@5@[fGfT5A[fGfX@@67@E  8 @@@A@@@ @>@@ @>@ @>@@Aq6@@@6@4  8 @@@A@@@ @>r@@ @>@ @>@@Aq6@@@6@AB6tr@VC@@AB@qC@  , 6@	A`6C@  , 65eZff#5fZffF@A	A@66@@  , 65jZff,@ !#$10fq@@qqF^@@q@F`	@@q@Fa@@q@Fb	@@q@Fc	@@q@Fd#$11gq@@qqFf@@q@Fh		@@q@Fi@@q@Fj	@@q@Fk	@@q@Fl@@q@Fmq@F	UB8  8 @@@A@@@A@7@@@7  8 @@@A@@@A@7@@@7ߠ$resth fE@@ @>1	W@@ @>2@@ @>3@@ @>4@@ @>5@@ @>6B@@ @>7	J@@ @>8@@ @>9@@ @>:@@ @>;@@ @><@@ @>0@5Yf
f5Yf
f@@7@6@  8 @@@A@ C@@ @>+@@ @>*@ @>)@@Aq7J@@@7L@  8 @@@A@ 7@@ @>/r@@ @>.@ @>-@@Aq7V@@@7X@AB7S@VC@@AB@C@  , 7^@	A`7ZC@  , 7a6Xee6
Xef	@A	A@7_7^@@  , 7f6Xee@!_"$8cq@@qqE;@@q@E	@@q@E:@@q@E	@@q@E	@@q@E"$9dq@@qqE9@@q@Eà	@@q@EĠ8@@q@EŠ	@@q@EƠ	@@q@E@@q@Eq@E	B	8  8 @@@A@@@A@7@@@7  8 @@@A@@@A@7@@@7۠$reste!E@@ @=ɠ	@@ @=ʠ	_@@ @=ˠ	^@@ @=̠	]@@ @=͠	\@@ @=ΠB@@ @=Ϡ	@@ @=Р	Z@@ @=Ѡ	Y@@ @=Ҡ	X@@ @=Ӡ	W@@ @=@@ @=@6Wee6Wee@@75@	  8 @@@A@!@@ @=@@ @=@ @=@@Aq7@@@7@	  8 @@@A@!u@@ @=r@@ @=@ @=@@Aq7@@@7@AB7@VC@@AB@C@  , 8@
]A`8C@  , 86Vee6Vee@A
cA@88@@  , 8
6Vee@""$6`q@@qqE@@q@E
a@@q@E@@q@E
\@@q@E
Z@@q@E"$7aq@@qqE@@q@E
W@@q@E@@q@E 
R@@q@E!
P@@q@E"@@q@E#q@EC
B
M8  8 @@@A@@@A@8P@@@8R  8 @@@A@@@A@8R@@@8Tנ$restb"E@@ @=a
@@ @=b
@@ @=c
@@ @=d
@@ @=e
@@ @=fB@@ @=g
@@ @=h
@@ @=i
 @@ @=j	@@ @=k	@@ @=l@@ @=`@75Uee76Uee@@84@
:  8 @@@A@"@@ @=[@@ @=Z@ @=Y@@Aq8@@@8@
)  8 @@@A@"@@ @=_r@@ @=^@ @=]@@Aq8@@@8@AB8	i	g@VC@@AB@	fC@  , 8@A`8C@  , l87ZTebef7[Tebe@A
A@88@@  , d87_Tebem@#۠"$4]q@@qqDo@@q@Dq@@q@Dr@@q@Ds@@q@Dt@@q@Du"$5^q@@qqDw@@q@Dy
@@q@Dz@@q@D{
@@q@D|
@@q@D}@@q@D~q@DJB
8  8 @@@A@@@A@8@@@8  8 @@@A@@@A@8@@@8Ӡ$rest_$ E@@ @<L@@ @<
@@ @<
@@ @<
@@ @<
@@ @<B@@ @<?@@ @= 
@@ @=
@@ @=
@@ @=
@@ @=@@ @<@7SeOeZ7SeOe^@@953@
  8 @@@A@#@@ @<@@ @<@ @<@@Aq9?@@@9A@
  8 @@@A@#@@ @<r@@ @<@ @<@@Aq9K@@@9M@AB9H

@VC@@AB@

C@  , X9S@A`9OC@  , D9V8Re&e*8Re&eN@AA@9T9S@@  , <9[8Re&e4@%"$2Zq@@qqCʠ	0@@q@C̠@@q@C͠	/@@q@CΠ@@q@CϠ@@q@CР"$3[q@@qqCҠ	.@@q@CԠ@@q@Cՠ	-@@q@C֠@@q@Cנ@@q@C@@q@Cq@CB8  8 @@@A@@@A@9@@@9  8 @@@A@@@A@9@@@9Ϡ$rest\%^E@@ @<@@ @<T@@ @<S@@ @<R@@ @<Q@@ @<B@@ @<@@ @<O@@ @<N@@ @<M@@ @<L@@ @<@@ @<@8Qee8Qee"@@92@  8 @@@A@%;@@ @<@@ @<@ @<@@Aq9@@@9@w  8 @@@A@%/@@ @<r@@ @<@ @<@@Aq9@@@9@AB9

@VC@@AB@
C@  , 09@RA`9C@  , 98Pdd8Pde@AXA@99@@  , :8Pdd@&W"$0Wq@@qqC%	@@q@C'V@@q@C(	@@q@C)Q@@q@C*O@@q@C+"$1Xq@@qqC-	@@q@C/L@@q@C0	@@q@C1G@@q@C2E@@q@C3@@q@C4q@CTBB8  8 @@@A@@@A@:E@@@:G  8 @@@A@@@A@:G@@@:Iˠ$restY&E@@ @<)@@ @<*@@ @<+@@ @<,@@ @<-@@ @<.B@@ @</@@ @<0@@ @<1@@ @<2@@ @<3@@ @<4@@ @<(@9*Odd9+Odd@@:1@/  8 @@@A@&y@@ @<#@@ @<"@ @<!@@Aq:@@@:@  8 @@@A@&m@@ @<'r@@ @<&@ @<%@@Aq:@@@:@AB:^\@VC@@AB@[C@  , :@A`:C@  , :9Omhh@@A@T  8 @@@A@@@ @B@@Aq:@@@:.@AL  8 @@@AK@@ @B@@Aq:@@@:-@E  8 @@@A1@@ @B@@Aq:@@@:0@A=  8 @@@A<@@ @B@@Aq:@@@:/@BC:@B@B@  , :ǰ9rNdd@@
!@:B@  , :˰9v1aa9w1aa7@A	"CamlinternalFormatBasics.erase_relA@::@@  , :Ѱ9|1aa'@ R@@i@,4i@, T@@ii,5i@, V@@i@,6i@,	#$54 i@@ii,7i@,
 Z@@i@,8i@, \@@i@,9i@,@@i@,):A;>  8 @@@A@@@A@92a8aX@@@@; :  8 @@@A@@@A@@@@@;! 5  8 @@@A@@@A@@@@@;$ $ X  8 @@@A@@@A@@@@@;( +  8 @@@A@@@A@@@@@;+ &  8 @@@A@@@A@@@@@;.  ^  8 @@@A@@@A@@@@@;2  `  8 @@@A@@@A@@@@@;6  b  8 @@@A@@@A@@@@@;:  d  8 @@@A@@@A@!@@@@;>  f  8 @@@A@@@A@%@@@@;B  h  8 @@@A@@@A@)@@@@;F #$53 i  8 @@@A@@@A@;H@@@;J V  8 @@@A@@@A@;J@@@;L #$55 i  8 @@@A@@@A@;N@@@;P $rest ~}@@ @!y@@ @!u@@ @!q@@ @!l@@ @!h@@ @!C@@ @!D@@ @!E@@ @!4@@ @!G@@ @!H@@ @!@@ @!@:70`a	:80`a
@@;@n  8 @@@A@@@@ @!X@@ @!@ @!@@ @!@ @!@@Ai;@@@; @k  8 @@@A@@8@@ @!@@ @!@ @!4@@ @!@ @!@@Ai;@@@; @AB;@%paramCA@@lB@@AB@@@@@AB@  , ;@A1;BP  , l;Ű:p/``:q/``@AA@;;@@  , d;ʰ:u/``@#$49 i@@ii+i@+b@@ii+i@+c@@i@+i@+d#$50 i@@ii+i@+e@@i@+i@+f@@i@+i@+g@@i@+,A#$48 i  8 @@@A@@@A@<@@@< 1  8 @@@A@@@A@<@@@<   8 @@@A@@@A@<@@@<
 #$51 i  8 @@@A@@@A@<@@@< #$52 i  8 @@@A@@@A@<@@@< $rest ݠF@@ @!A;@@ @!B7@@ @!C=@@ @!D.@@ @!E*@@ @!F)@@ @!G@@ @!H@@ @!I2@@ @!J@@ @!K@@ @!L@@ @!@@:.``:.``@@<N@u  8 @@@A@U@@ @!/@@ @!.@ @!-@@Ai<Z@@@<\ @A  8 @@@A@@@@ @!5@@ @!4@ @!3@@ @!2@ @!1@@Ai<j@@@<l @  8 @@@A@@@ @!9D@@ @!8@ @!7@@Ai<v@@@<x @  8 @@@A@@@@ @!?.@@ @!>@ @!=H@@ @!<@ @!;@@Ai<@@@< @ABC<@@{B@@AB@B@  , \<@AB<BϠ  , H<;>-``;?-``@AA@<<@@  , @<;C-``@p#$46 i@@ii*i@*@@i@*i@*@@i@*i@*&@@i@*i@*@@i@*i@*@@i@*i@*@@i@*A#$45 i  8 @@@A@@@A@<@@@< ,  8 @@@A@@@A@<@@@< #$47 i  8 @@@A@@@A@<@@@< $rest !5;@@ @ ɠ@@ @ ʠ@@ @ ˠX@@ @ ̠@@ @ ͠@@ @ Π%@@ @ Ϡ@@ @ Р@@ @ Ѡ^@@ @ Ҡ@@ @ Ӡ@@ @ @@ @ @;,``;,``@@=@6  8 @@@A@M@@ @ y@@ @ @ @ @@Ai=@@@= @  8 @@@A@
@@ @ 2@@ @ @ @ @@Ai='@@@=) @AB=$@t@XB@@AB@qB@  , 8=/@aAi =+Bo  , $=3;+`q`u;+`q`@AhA@=1=0@@  , =8;+`q`~@#$41 i@@ii*Ci@*#$39 i@@ii*Di@*#$40 i@@ii*Ei@*@@i@*Fi@*g@@i@*Gi@*e@@i@*Hi@*@@i@*8Af(  8 @@@A@@@A@=t@@@=v !  8 @@@A@@@A@=v@@@=x 5  8 @@@A@@@A@=x@@@=z ߱#$42 i  8 @@@A@@@A@=|@@@=~ #$43 i  8 @@@A@@@A@=@@@= #$44 i  8 @@@A@@@A@=@@@= $rest "yL@@ @ aG@@ @ bB@@ @ c	@@ @ d@@ @ e@@ @ f%@@ @ g2@@ @ h3@@ @ i@@ @ j5@@ @ k4@@ @ l@@ @ `@<j*`\`i<k*`\`m@@=@  8 @@@A@@@@ @ S|@@ @ R@ @ Q@@ @ P@ @ O@@Ai=@@@= @f  8 @@@A@@3@@ @ ]1@@ @ \@ @ [>@@ @ Z@ @ Y@@Ai=@@@= @AB  8 @@@A@@ @ T@@Ai=@@@= @  8 @@@A@@ @ U@@Ai=@@@= @I  8 @@@A@@ @ ^@@Ai=@@@= @K  8 @@@A@@ @ _@@Ai=@@@> @ABCD=@L@B@@AB@IB@  , >@9AE>BG  ,  ><)`>`B<)`>`[@A@A@>	>@@  , ><)`>`K@#$35 i@@ii)i@)n#$32 i@@ii)i@)o#$34 i@@ii)i@)p@@i@)i@)q?@@i@)i@)r=@@i@)i@)s@@i@)uA?)  8 @@@A@@@A@>M@@@>O б#$33 i  8 @@@A@@@A@>Q@@@>S &  8 @@@A@@@A@>S@@@>U :  8 @@@A@@@A@>U@@@>W ӱ#$36 i  8 @@@A@@@A@>Y@@@>[ ױ#$37 i  8 @@@A@@@A@>]@@@>_ ر#$38 i  8 @@@A@@@A@>a@@@>c ٠$rest #Q@@ @L@@ @G@@ @@@ @@@ @{@@ @%@@ @2@@ @3@@ @@@ @@@ @@@ @@@ @@=G(`)`6=H(`)`:@@>
@  8 @@@A@@@@ @@a@@ @@@ @@ @@ @@	@@ @@ @@ @@@Ai>@@@> @K  8 @@@A@@;@@ @@@@ @>@@ @@ @@ @@M@@ @@ @@ @@@Ai>@@@> @AB  8 @@@A@@ @@@Ai>@@@> @  8 @@@A@@ @@@Ai>@@@> @X  8 @@@Ao@@ @@@Ai>@@@> @Z  8 @@@Aq@@ @@@Ai>@@@> @ABCD>@8@B@@AB@5B@  , >@%AT>B3  , >='__='_`(@A,A@>>@@  , >='_`='_`'@ՠ4$Format_subst_ty_'a1 i@@i@(i@(-@@i@(i@(+@@i@(i@(4$Format_subst_ty_'d1 i@@i@(i@()@@i@(i@('@@i@(i@(@@i@(_A06  8 @@@A@@@A@?>@@@?@ #  8 @@@A@@@A@?@@@@?B ñ4$Format_subst_ty_'a2 i  8 @@@A@@@A@?D@@@?F ı4$Format_subst_ty_'d2 i  8 @@@A@@@A@?H@@@?J ű#$24 i  8 @@@A@@@A@?L@@@?N Ʊ#$25 i  8 @@@A@@@A@?P@@@?R Ǳ#$26 i  8 @@@A@@@A@?T@@@?V ȱ#$27 i  8 @@@A@@@A@?X@@@?Z ɱ#$28 i  8 @@@A@@@A@?\@@@?^ ʱ#$29 i  8 @@@A@@@A@?`@@@?b ˱#$30 i  8 @@@A@@@A@?d@@@?f ̱#$31 i  8 @@@A@@@A@?h@@@?j Π#ty1 &')@@ @S*@@ @T+@@ @U,@@ @V-@@ @W.@@ @X/@@ @Y@@ @Z@@ @[@@ @\@@ @]@@ @^@@ @R@>R&__>S&__@@?
$_ty2 &A@@ @`@@@ @a?@@ @b>@@ @c=@@ @d<@@ @ef@@ @f[@@ @gZ@@ @h4@@ @i@@ @j@@ @k@@ @_@>&__>&__@@?$rest &@@ @m@@ @n
@@ @o@@ @p@@ @q @@ @r'@@ @s@@ @t@@ @u8@@ @v@@ @w@@ @x@@ @l@>&__>&__@@@"@H  8 @@@A@&@@ @B@@ @C@@ @D@@ @E@@ @F@@ @G@@ @A@@ @@@ @?@@Ai@D@@@@F @  8 @@@A@&@@ @L@@ @M@@ @N@@ @O@@ @P@@ @Q@@ @K@@ @J@ @I@@Ai@h@@@@j @AB@e@@AB@@C@@AB@C@  , @r{@ADQ@n	C  , @v?!%__?"%__@AA@@t@s@@  , @{?&%__?'%__@!T#$22 i@@ii'i@'̠@@i@'i@'͠@@i@'i@'Π
@@i@'i@'Ϡ@@i@'i@'Р@@i@'i@'@@i@'ېA#$16 i  8 @@@A@@@A@@@@@@ #$17 i  8 @@@A@@@A@@@@@@ #$18 i  8 @@@A@@@A@@@@@@ #$19 i  8 @@@A@@@A@@@@@@ #$20 i  8 @@@A@@@A@@@@@@ #$21 i  8 @@@A@@@A@@@@@@ F  8 @@@A@@@A@@@@@@ #$23 i  8 @@@A@@@A@@@@@@ "ty (n'@@ @ (@@ @à)@@ @Ġ*@@ @Š+@@ @Ơ,@@ @@@ @@?$__?$__@@@$rest (g}@@ @ɠ$@@ @ʠ @@ @ˠ~@@ @̠@@ @͠@@ @ΠM@@ @Ϡ@@ @Р@@ @Ѡ@@ @Ҡ@@ @Ӡ@@ @@@ @@?$__?$__@@A6	@\  8 @@@A@(Ee@@ @d@@ @c@@ @b@@ @a@@ @`@@ @@@ @@@ @@ @@@AiAX@@@AZ @  8 @@@A@(?@@ @@@ @@@ @@@ @@@ @@@ @@@ @a@@ @@ @@@AiA|@@@A~ @ABAy@@AB@@C@@AB@C@  , A@AQA	CƠ  , xA@5#_m_q@6#_m_@AA@AA@@  , pA@:#_m_y@"g#$14 i@@ii'
i@&@@i@'i@&@@i@'i@&@@i@'i@&@@i@'i@&@@i@'i@&@@i@'A'  8 @@@A@@@A@A@@@A #$15 i  8 @@@A@@@A@A@@@A $rest )6@@ @A@@ @B@@ @CJ@@ @D@@ @E@@ @F%@@ @Gw@@ @Hv@@ @IP@@ @Jt@@ @Ks@@ @L@@ @@@@"_Y_e@"_Y_i@@B@(  8 @@@A@)@@ @;s@@ @:@ @9@@AiB@@@B @  8 @@@A@)@@ @?1@@ @>@ @=@@AiB@@@B @ABB@e@WB@@AB@bB@  , hB @RAcBB`  , TB$@!_;_?@!_;_X@AYA@B"B!@@  , LB)@!_;_H@##$12 i@@ii&ki@&>Y@@i@&li@&?W@@i@&mi@&@@@i@&ni@&AR@@i@&oi@&BP@@i@&pi@&C@@i@&`AM'  8 @@@A@@@A@B[@@@B] #$13 i  8 @@@A@@@A@B_@@@Ba $rest +*6@@ @٠@@ @ڠ@@ @۠@@ @ܠ}@@ @ݠy@@ @ޠ%@@ @ߠ@@ @@@ @@@ @@@ @
@@ @@@ @@AC _&_3AD _&_7@@B@  8 @@@A@+@@ @s@@ @@ @@@AiB@@@B @9  8 @@@A@*@@ @1@@ @@ @@@AiB@@@B @ABB@@WB@@AB@B@  , DB@AcBB  , 0BAi^^Aj^^@AA@BB@@  , (BðAn^^@#"$8 i@@ii%'i@$@@i@%(i@$@@i@%)i@$Q@@i@%*i@$@@i@%+i@$@@i@%,i@$@@i@%"A'  8 @@@A@@@A@B@@@B "$9 i  8 @@@A@@@A@B@@@B $rest ,[6@@ @	$@@ @
 @@ @~@@ @@@ @
@@ @%@@ @@@ @@@ @@@ @@@ @@@ @@@ @@A^^A^^@@C6@\  8 @@@A@,9@@ @s@@ @@ @@@AiC@@@@CB @  8 @@@A@,-@@ @1@@ @@ @@@AiCL@@@CN @ABCI@@WB@@AB@B@  ,  CT@AcCPB  , CXB__B__%@AA@CVCU@@  , C]B__@$5#$10 i@@ii%i@%@@i@%i@%@@i@%i@%@@i@%i@%@@i@%i@%@@i@%i@%@@i@%A'  8 @@@A@@@A@C@@@C #$11 i  8 @@@A@@@A@C@@@C $rest -6@@ @q@@ @r@@ @s@@ @t@@ @u@@ @v%@@ @wE@@ @xD@@ @y@@ @zB@@ @{A@@ @|@@ @p@Bw^^Bx^_ @@C@  8 @@@A@-j@@ @ks@@ @j@ @i@@AiC@@@C @m  8 @@@A@-^@@ @o1@@ @n@ @m@@AiC@@@C @ABC@3@WB@@AB@0B@  ,  C@	 AcCB.  ,  CB^^B^^@A	'A@CC@@  ,  CB^^@$Ϡ"$6 i@@ii$i@$X	'@@i@$i@$Y	%@@i@$i@$Z@@i@$i@$[	 @@i@$i@$\	@@i@$i@$]@@i@$z	VA	'  8 @@@A@@@A@D)@@@D+ "$7 i  8 @@@A@@@A@D-@@@D/ $rest .6@@ @	X@@ @	T@@ @@@ @	K@@ @	G@@ @%@@ @@@ @@@ @@@ @@@ @@@ @@@ @@C^^C^^@@Dj@	  8 @@@A@.@@ @s@@ @@ @@@AiDt@@@Dv @	  8 @@@A@.@@ @1@@ @@ @@@AiD@@@D @ABD}@@WB@@AB@B@  ,  D@	AcDBȠ  ,  DC7^i^mC8^i^@A	A@DD@@  ,  DC<^i^t@%i"$4 i@@ii#i@#	@@i@#i@#	@@i@#i@#	@@i@#i@#	@@i@#i@#	@@i@#i@#@@i@#	A	'  8 @@@A@@@A@D@@@D "$5 i  8 @@@A@@@A@D@@@D $rest /6@@ @9	@@ @:	@@ @;	L@@ @<	@@ @=	@@ @>%@@ @?	y@@ @@	x@@ @A	R@@ @B	v@@ @C	u@@ @D@@ @8@C^V^aC^V^e@@E@
*  8 @@@A@/@@ @3s@@ @2@ @1@@AiE@@@E @	  8 @@@A@/@@ @71@@ @6@ @5@@AiE@@@E @ABE@	g@WB@@AB@	dB@  ,  E"@
TAcEB	b  ,  E&C^7^;C^7^U@A
[A@E$E#@@  ,  E+C^7^E@&"$2 i@@ii#Ai@#
[@@i@#Bi@#
Y@@i@#Ci@#	@@i@#Di@#
T@@i@#Ei@#
R@@i@#Fi@#@@i@#6
A
O'  8 @@@A@@@A@E]@@@E_ "$3 i  8 @@@A@@@A@Ea@@@Ec $rest 16@@ @Ѡ
@@ @Ҡ
@@ @Ӡ	@@ @Ԡ
@@ @ՠ
{@@ @֠%@@ @נ
@@ @ؠ
@@ @٠	@@ @ڠ
@@ @۠
@@ @@@ @@DE^!^/DF^!^3@@E@
  8 @@@A@0@@ @s@@ @@ @@@AiE@@@E @
;  8 @@@A@0@@ @1@@ @@ @@@AiE@@@E @ABE@
@WB@@AB@	B@  ,  E@
AcEB	  ,  |EDk^^Dl^^ @A
A@EE@@  ,  tEŰDp^^@&"$0 i@@ii"i@"r
@@i@"i@"s
@@i@"i@"t
S@@i@"i@"u
@@i@"i@"v
@@i@"i@"w@@i@"$A
'  8 @@@A@@@A@E@@@E "$1 i  8 @@@A@@@A@E@@@E $rest 2P6@@ @i&@@ @j"@@ @k
@@ @l@@ @m@@ @n%@@ @o
@@ @p
@@ @q
@@ @r
@@ @s
@@ @t@@ @h@D]]D]^ @@F8 @^  8 @@@A@2.@@ @cs@@ @b@ @a@@AiFB@@@FD @
  8 @@@A@2"@@ @g1@@ @f@ @e@@AiFN@@@FP @ABFK@
@WB@@AB@
B@  ,  lFV@AcFRB
  ,  TFZE2a8aL@@@AO@c  8 @@@A
@@ @"@@AiFc@@@Fe @Aa  8 @@@A@@ @"@@AiFi@@@Fk @
  8 @@@A
@@ @"@@AiFp@@@Fr @
  8 @@@A@@ @"@@AiFw@@@Fy @ABCFt@
@A@
A
  , HF~cA@pFyA
@         
   &./boot(./stdlib@CODE QDLPT    DLLS    PRIM  DATA ޱSYMB  CRCS  	DBUG q3   Caml1999X030                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        99N@  -@@R@  vR@  ̌JC!pC7!t@@ @  N@E![[E"[[@@Ge"p'CD!t@@ @  f@E.[[E/[[@@Gr%_decl0type_declaration@@ @  g@E:[\E;[\@@G~"p191@@ @  ˎR@  o@EF\\EG\\@@G"s1:@@ @  ˏR@  p@ER\\ES\\ @@GG@ 
3D@@Ae.G@@HB@@AB<C@@&F@@AA@@E@@ABC@D@@A9yC@@9B@@AB@G@  ,   DGEp]]Eq]]@AA@GG@@  ,   <GEu]]Ev]]@AA@GG@@  ,   4GEz]]E{]]@AA@GG@@  ,   GE]]x@@AnG+G@  ,   GðE];]YE];]f@AA@GG@@  ,   GȰE];]_@AA@GG@@  ,   G̰E];]c	AAA@GG@@  ,   GаE];]T
@@A!r:N@  ˰@E\\E\\@@G"p':@@ @  @E];]NE];]P@@GG@ Z/LS@AN@BMONL@K@@AL@BCDK@M@  ,   GE]],E]]:@AA@GG@@  ,   GE]]2@AA@GG@@  ,   tGE]]'	@@A.!l: :@@ @  @@ @  @E]]"E]]#@@HH
@)@AM@@v@ABu&Dm@M@  ,   PHE\] T@@AFH@@A~@B}.Du@KA  ,   LH!E\\E\\@ABH C@J
  ,    H*E\\@@$AH'F@  ,   H.E\\@@(AH+F@  ,   H2E\\$E\\J@@ @  sR@  ˍ4CH8@@A@@AB@C@  ,   HCF\\@@=AH@CA  ,   HIDAA@HD@@A@B@B  ,   HOF^e^}~@A}A@HLHK@@  ,   HSA	 Printtyp.wrap_printing_env.(fun)A@HOHN@@  ,   HVF^4^LF^4^c@E@@O@  @P@  8AG9F$^^@#env9@F)^^/@@Hl!f9@F/^^0F0^^1@@HsHn@B@@AA@@B@?ZB@@A9C@@B@B@  ,   H~F>^4^6F?^4^J@E@@O@  -P@  (A(HB@  ,   H@@@+HB@  ,   \HFM^e^FN^e^@@=@0H@wA@@A@9B@@A@A@  ,   HHFX__@@AG99@F_^^F`^^@@H#env9@Ff^^Fg^^@@H!f9@Fm^^Fn^^@@HH@B@@AC@@A@@AB@9B@@A@C@  ,   4HF|^^F}^_@@9O@  O@  ͷ9O@  Ͷ@P@  P@  A0HD@  ,   $H̰F^^F^_@@A5HC@  ,   HѰF^^@@@9H"C@  ,    HհF``F``@@AH69F``@$path9@F``/@@H#env9@F``0F``3@@H!l$listID!t@@ @  ·@@ @  ΆP@  t@F`6`<F`6`=@@IH@!A@@AC@@*B@@AB@9C@@:B@@AB@C@  ,   IFb=bTFb=br@D@@T@  T@  $@@T@  9T@  @U@  #U@  @U@  7]BS!p7@@ @  @F``F``@@I5#remGנD@@ @  @@ @  @F``G ``@@IC)normalize@:@@ @  %R@  R@  @ @  R@  @G`aG`a
@@IU"p';@@ @  ?R@  7@GaAaKGaAaM@@Ia"idG
@@ @  ϩS@  ϟ@G)aaG*aa@@ImIh@l@H@@ABm@2F@@ACKE@@$G@@Aq@FD@@ABDr@H@  ,   I}G=bbG>bb9@7+@@S@  S@  T@  BcIH@  ,   IGKbbGLbb5@A=Printtyp.is_unambiguous.(fun)A@II@@  ,   I@@AlI%HA  ,   IGVaaGWab@AѐAsI*B('C@G  ,   xIG`a_aeGaa_a@;f@@R@  UR@  ϞS@  hBIG@  ,   hIGna_arGoa_a@A#A@II@@  ,   TI@@AIGA  ,   PIGxaAaPGyaAa[@AAI"I@FBC@F  ,   HI°GaAaG@@AIF@  ,   DIưG`aG`a=AA	!Printtyp.is_unambiguous.normalizeA@II@@  ,   4ḬG`a @@AIɰ@]@AYBC@E@  ,   I԰G`d`fG`d`@;@@P@  ΟP@  Q@  βBIC@  ,   IG`d`rG`d`@@E|@@Q@  )@@Q@  @Q@  &AID@  ,   I+@@*AICA  ,   IG`6`@G`6``@A1B!I@@@AB@B  ,   J G`6`8;@@:@)IB@  ,   JG`a>@R@  =+@@R@  &R@  @S@  
S@  2S@  $MCՐNS@!p@XG`a@@J!J@	A@@A@AC@@;B@@AB@A@  ,   J*G`ad@@c@J'A@  ,   J.Ga_aGa_a@E@@R@  υR@  ϐR@  ύA!p
R@  [@Ga_awH a_ax@@JCJ>@A@@A@B@@AC@@B@B@  ,   xJLHa_a|H
a_a@@@JJA@  ,   pJQHbb"Hbb4@9@@T@  T@  ͐B7!pE@@S@  S@  @H%bbH&bb@@JiJd@A@@A@
C@@;_B@@AB@A@  ,   hJr!H2bb/@H@@T@  AJtB@  ,   XJ{*@@JvA@  ,   PJ}H=
ff@AA@JzJy@@  ,   DJ@AI;&HHdUdU@!p;&@HMdUdi@@J"p';,P@  @HTddHUdd@@J!s=@@ @  P@  @H`ddHadd@@J(get_path@E@@@ @  P@  =[@@ @  +P@  @ @  P@  @HueeHvee@@J#p'';UP@  a@H~f8f@Hf8fC@@JJ@#5<B@@%E@@AB@A@@=D@@AF@@8C@@ABC@;H@@A<F@@<YG@@AB=:D@@=OC@@AGB@@=$E@@ABC@F@  ,   $JHf8fhHf8fj@@!AaJް@"@A6F@@"@AB!@ @A@BC@F@  ,   JHf8fJHf8fU@6O@  k1ArJ2-C&@I@  ,   JHf8f<9@@8AxJE@  ,   JHeseHese@@=A}J@>@A8F@@>@AB=C6@F@  ,   KHeseHese@=@@Q@  ҴR@  Ҟ<@@R@  ҵR@  Ҡ@S@  ҥS@  S@  ҳ\AK+J@  ,   K!HeseHese@F@@T@  ҶT@  U@  jAK(9J@  ,   HK/H	ffH	ff,@@pAK->E@  ,   <K4HeeHef@==@@R@  @@R@  R@  BK=NE@  ,   ,KDIeeIee@AA@KBKA@@  ,   KII	ee@EG6!t@@S@  /S@  &S@  @S@  S@  @@T@  T@  DT@  -AK`qE@  ,   KgI'eeI(	ff-@@AKevE@  ,   KlI,eQeU@@AKizE@  ,   KpI0eeI1eeMAA	 Printtyp.best_type_path.get_pathA@KoKn@@  ,   KvI6ee@@AKs@@AC@D@  ,   K}I=ddI>de@@ @  P@  ŐCK@@A@A@  ,   KILdd@@A	KA@  ,   KIPddIQdd@AA@KK@@  ,   K@AK
A@  ,   xKIW dd@@AKA@  ,   pKI[ddI\dd@AA@KK@@  ,   `K@AKA@  ,   @KIbdldn@@@KA@  ,   4KIfee,6@=N@  TN@  ̟9B+	9>@K@A@@A@<rC@@A(D@@> B@@AB@A@  ,   KI|eeL@@K@KA@  ,   KIgg+@@*AK&;Igg/@K@A@@A@<.C@@A<D@@<RB@@AB@A@  ,   KҰIgg=@@<AKA@  ,   KְIggA@@@@KA@  ,   KڰIhhK@@JAKB;IhhP@"ty;@UIhh@@KK@$Z=B@@AA@@B@<>B@@A@B@  ,   KIhhIhh@AbA@KK@@  ,   KIhh@@fA$name	 &stringO@@ @  ױR@  ץ@Ih.h=Ih.hA@@L	ˠL@$}@C&@AE?D@@)@AB(@E@  ,   LIh\hIh\h@@A"LE@  ,   LIh\heIh\h~@=2@@P@  Q@  B/,L#E@  ,   hL*Ih\hb9@@A4$1L(#E@  ,   L/Ihh@@@UL,@G@AF@A@  ,   L5I#hiI#hi5@=@@Q@  dQ@  حR@  wBK<J!hh@$name	<@J	!hh@@LLLG@	A@@A@<C@@A<UD@@<B@@AB@A@  ,   LWJ#hiJ#hi.@A	#Printtyp.name_is_already_used.(fun)A@LVLU@@  ,   L]J"hhJ"hh@>#@@P@  1P@  RQ@  @ܐB(LdA@  ,   pLk@@@+Lg A@  ,   hLnJ.#hi!J/#hi-@;.@@R@  ؗR@  ؖB9%name'	<;Q@  ؀@J>#hiJ?#hi@@LL}@B@@Ak	A@@B@DB@@A@B@  ,   \L@2AL
BA  ,   PL9A6@OL@@A
@A  ,   4LJUQoo@@AL<J\9kk@.name_generator	<@Ja9kk@@Lՠ!t	<@Jg9kkJh9kk@@L֠$name	<R@  @Jo>llJp>ll@@LL@DDCC@@E@@AB B@@A@@AC@=EB@@A<C@@B@E@  ,   ,LưJPooJPoo@ACA@LL@@  ,   $L˰JPoo@AGA@LL@@  ,   LϰJPoo	@@KA:LE@  ,   LӰJPooJPoo@=@@R@  /S@  ,VBFL*E@  ,   L߰JPoo\@@[AJL.E@  ,   LJMoNoXJMoNoi@<O@  
O@  dASL@%_FE@@A;@B43C1@E@  ,   L@mA[LE@  ,   LJJnnJJno@@rAd$name	@@ @  U@  @J@llJ@lm @@Mؠ,current_name	!J@@ @  T@  @@ @  T@  @JDnnJDnn@@M٠!i	"JK@@ @  %T@  @@ @  $T@  @JEn*n8JEn*n9@@M,ڠ0/M(@%IFD@-I@@AB@J@@AH@HG@@BCD}@J@  ,   M?JFnEnUK FnEn@>T@@T@  ~U@  ;BQLMEJ@  ,   MLKFnEnaK
FnEn@A;Printtyp.name_of_type.(fun)A@MKMJ@@  ,   XMRKHnnKHnn@@A]*XMQ)J@  ,   PMXKGnnKGnn@_@@V@  ܒX@  ܣېBj7eM^6J@  ,   <MeK%Gnn
@F'@@X@  ܤX@  Y@  ܱAxEsMlDJ@  ,   $MsK3GnnK4Hnn@@A~KyMrJJ@  ,   MyK9FnEnO@@AP~MwOJ@  ,   M~K>En*n<K?En*nA@AA@M|M{@@  ,   MKCEn*n4@@AZMY@Q@ABC@I@  ,   MKLDnnKMDnn&@A 	A@MM@@  ,    MKQDnn@@ 
AhM@h@ABC@H@  ,   MKZ>ll @@ AM@@AB@D@  ,   lMKa=llKb=ll@=N@  ۬N@  d "BM@@AB@G@  ,   @MKn=ll +@@ *AMC@  ,   MKr<l`lfKs<l`lx@ 0BM@@A@B@F@  ,   MK|<l`lb 9@@ 8@&MB@  ,   MKFnEntKFnEn@R@@U@  hU@  gzBӠ%name'	#@@T@  bT@  D@KFnEnjKFnEno@@MMӰ@B@@A	$A@@B@B@@A@B@  ,   M"@AMBA  ,   MA@M@@A@A  ,   MKSoo p@I pBM\=MKSoo w@!t	'=M@ |KSoo@@MM@	A@@A@=}C@@=B@@AB@A@  ,   NKSoo @@ @NA@  ,   N	KWpOpZ @>>@@O@  >@@O@  @O@  @@O@  O@   BM=dKUpp @#tyl	*=d@ KUpp+@@N)ߠ#tyl	+C2@@ @  P@  ݰ@@ @  ݽP@  ݫ@KVp.p4KVp.p7@@N;N6@BA@@A@>B@@A@B@  ,   NDLWpOpfLWpOp@A;Printtyp.remove_names.(fun)A@NCNB@@  ,   tNJL
WpOpQ @@ A/NGBA  ,   pNPLVp.p:LVp.pK@A ِB6NO@@A@A
  ,   PNYLVp.p0 @@ @=NVA@  ,   DN]LWpOpyLWpOp@0@@R@  R@  $S@  !BM"ty	,[P@  @L/WpOplL0WpOpn@@NsNn@Z	-A@@B@@AB@RB@@A@B@  ,   0N}L=WpOpu @@8ANzBA  ,   $N?A<@fN~@@A@A  ,   NLH^q*qZ!)@A!(A@NN@@  ,    NLL^q*qO!-@@!,AM=nLQ]qq!2@!t	3=n@!7LV]qq'@@NN@	A@@A@=B@@A@A@  ,   NL`^q*q3La^q*qI@1<@@P@  ޛP@  ޼Q@  ު!IBNA@  ,   NLn^q*q,!O@@!N@"NA@  ,   NLr`qiqLs`qiq@=@@O@  
!]AN+=L}`qiqi!d@"ty	6=@!iL`qiqz@@NN@	A@@A@=B@@A@B@  ,   N̰L`qiq}!s@@!r@N	A@  ,   NаLerrLerr@@!}ANF=Laqq!@"ty	9=@!Laqq@@N"px	:=E@@ @  5P@  +@LbqqLbqq@@NN@B@@AA@@B@>B@@A>C@@=D@@AB@B@  ,   NLdqqLdqr@A!A@NN@@  ,   tNLcqq!@@!A,NB@  ,   hOLcqqLcqq@1@@P@  DP@  SQ@  N!A:O"B@  ,   \OLcqq!@@!A>O&BA  ,   XOLbqqLbqq@A!AEO@,@A+@A
  ,   DOLbqq!@@!@LOA@  ,   8O"LjrLrpLjrLru@@!AN=Lhr$r$!@"ty	==@!Lhr$r4@@O0O+@'LB@@AA@@B@?C@@B[B@@AB@B@  ,   ,O<Lmrr!@@!AO9B@  ,    O@M lrrMlrr@1@@Q@  Q@  R@  !A(!p	>@@@ @  @MkrvrMkrvr@@OWOR@'@AC@@'@AB&@C@  ,   O^MlrrMlrr@@@@R@   R@  B@@R@  R@  @S@  S@  S@  "$A)OpC@  ,   OwM7lrr7@@")A-Ot"C@  ,   O{M;ir7r9".@@"-@XOx@J@AI@A@  ,   OMArs	s
MBvss@A:Printtyp.namable_row.(fun)A@OO@@  ,   hOMGprr"@@@"?@N>MLorr"E@#row	A>@"JMQorr@@OO@	A@@A@@A@  ,   \OMYvssMZvss@@A!f	B=@@P@  P@  @Mers	sMfrs	s@@OO@(SC@@AB@@	EA@@AB@&B@@A@C@  ,   LOMvus_sMwus_s@
l@@S@  :A%!c	C$boolE@@ @  @Mts?sPMts?sQ@@O!l	D=DQ@@ @  @@ @  @Mts?sSMts?sT@@OOذ@4@!E@@AB4@D@@A5@BC3@E@  ,   8O1Mus_s@@eA*OE@  ,   $OMus_sMus_s@@jA/OE@  ,   OMus_sj
@@nA3OE@  ,   OMsss)Msss9@C)row_field@@ @  yAbO@S@AQ@BO@B@  ,   PMsss#j@@AiP BA  ,   P	A@P@[@AY@A  ,   PM|;|=M|;|N@MQ@@O@  BP@  ="ӐAO>bM|'|'"@"ty	k>b@"M|'|8@@P#P@	A@@A@>B@@A@A@  ,   P*"@@"@P&A@  ,   P-M||"@@"AO>cM|j|j"@P.@	nA@@A@?KC@@A?3D@@?gB@@AB@A@  ,   xP?M||#@@#AP<A@  ,   lPCN||#@@#@P@A@  ,   \PGN||N||@M@@P@  Q@  #AO>pN||#@PP@<	qA@@A@>C@@@LB@@AB@A@  ,   PP_#)@@#(@P[A@  ,   <PbN"}}*N#}}<@M@@P@  Q@  #9AO>vN.} } #?@Pk@W	tA@@A@KB@@A>D@@GYC@@AB@A@  ,   (P|N<}}N=}}(@M@@P@  Q@  #SAPA@  ,   P#X@@#W@PA@  ,   PNK}w}yNL}w}@M@@O@  GP@  ?#hAP>NX}Y}Y#o@"ty	w>@#tN]}Y}t@@PP@	A@@A@>B@@A>C@@B@A@  ,    P#@@#~@P
A@  ,   PNl}}Nm}}@M@@O@  qP@  i#AP1>Ny}}#@#tyl	z>@#N~}}@@PP@	A@@A@?B@@A>C@@B@A@  ,   Pʰ#@@#@P
A@  ,   PͰNy    #@4@@P@  P@  "Q@  #BP]=Nx    #@#sch	=@#Nx    @@P#ppf	=@Nx    Nx    @@P"ty	=@Nx    Nx    @@PP@B@@AC@@A@@AB@>B@@A@C@  ,   PNy    #@@#@(P
C@  ,   QN{     >#@@#@P=N{      #@#ppf	=@#N{     8@@Q"ty	=@N{     9N{     ;@@QQ@B@@AA@@B@=B@@A@B@  ,   hQ N    N    @Nc@@O@  P@  z$AP=N}  S  S$%@==h#ppf	=@$,N}  S  d@@Q:"ty
 =@N}  S  eN}  S  g@@QAQ<@B@@AA@@B@=C@@??B@@AB@B@  ,   \QL,$@@@$?@#QHB@  ,   8QOO  +  A$J@@$I@'#ppf
=@$QO  +  ;@@QY"ty
=@O  +  <O  +  >@@Q`Q[@B@@AA@@B@>"B@@A@B@  ,   QiO)  U  nO*  U  @N@@O@  P@  $pAI#ppf
=@$yO8  U  h@@Q{"ty
=@O>  U  iO?  U  k@@QQ}@B@@AA@@B@?B@@A>FC@@B@B@  ,   Q$$@@$@QB@  ,   QOP     $@@$AQ=OZ    $@#ppf
=@$O_    @@Q!p
=@Oe    Of    @@Q"p'
	=P@  #@On    Oo    @@Q!s

D@@ @  5P@  $@Oz    O{    @@Q!p
=P@  ;@O    O    @@Q!t
G@@ @  `P@  P@O    O    @@QQΰ@*GC@@AF:A@@5E@@ABCB@@/D@@G@@ABC@BC@@GB@@AB@GA  ,   QO    O    @A$B\Q@@ABC@F  ,   QO    $@@$AeQ	F@  ,   QO    O    @@%AiQ)$C@E@  ,   RO    O    @@%ApQE@  ,   RO    %
@@%AtRE@  ,   R
O    O    @g_@ @  'P@  3%AR@<@:@AB5@B@  ,   RO    %!@@% @RB@  ,   lRO    %+@@%*AQ>O  G  G%3@%*opt*
C>@@ @  @O  G  ]O  G  oA@R3>&
>!O@  @O  G  j@@R9#ppf
>@O  G  qO  G  t@@R@"ty
>@P  G  uP  G  w@@RGRB@#C@@D@@ABB@@A@@AC@BBB@@A?C@@B@D@  ,   lRVP  z  P  z  @O@@O@  P@  Q@  %kABR]D@  ,   `Rd@%nADR_D@  ,   XRfP&  z  |%s@@%rAHRc!D@  ,   PRjP*  G  k;@@%vAIRg@%@A"!B@C@  ,   @Rq@%{AO%*sth*
>a@@RvRq@/@	D@@AB.-C+@D@  ,   (R}@%@]RxC@  ,   RP?    P@    @O@@O@  #P@  %AR>UPL    %@"ty
>U@%PQ    @@RR@	A@@A@@B@@A@JC@@B@A@  ,   R%@@%@R
A@  ,   RP`  n  rPa  !  2@A	"Printtyp.tree_of_constraints.(fun)A@RR@@  ,   RPf  \  ^%@@%@R3>_Pk  ;  ;%@&params
>_@%Pp  ;  Y@@RR@	A@@A@@gB@@A@A@  ,   RPz  !  -P{  !  1@@A"ty
>l@P  n  wP  n  y@@R$list
>mO@  f@P  n  zP  n  ~@@R#ty'
@s)type_expr@@ @  wQ@  m@P    P    @@RRٰ@A@@A#B@@C@@AB@@B@@A@C@  ,   RP    P     @AIA@RR@@  ,   RP    @AMA@RR@@  ,   RP     P    @>SB;"tr
@@@ @  Q@  @P    P    @@SR@&@D@@AB'&C$@E@  ,   S"@hASDA  ,   SP    P    @AoBVS5C  ,   SP    -@@uA[S:C@  ,   xSP    P    @A@@P@  ~AeSDD@  ,   dS$P    P    @R@  AnS&MC@  ,   TS-P    s@@ArS*QCA  ,   PS3P    P    @AAyS2@X@X@ABU@B  ,   <S=P    @@@S:B@  ,   SAQ  3  8&`@@&_AR>ΐQ  B  B&f@#tyl
 >@&kQ  B  W@@SO&params
!Q>@@ @  V@@ @  xP@  @Q  Z  `Q  Z  f@@S_SZ@B@@AA@@B@@BA  ,   ShQ(  i  mQ)  &  2@A&C(Sg@@A@@A
  ,   SqQ1  |  Q2    	@A<Printtyp.filter_params.(fun)A@SpSo@@  ,   SwQ7  Z  \&@@&@5St
A@  ,   S{Q;    Q<    @A
A@SySx@@  ,   S@A?#tyl
"4P@  @QH  |  QI  |  @@S"ty
#?P@  @QQ  |  QR  |  @@S"ty
$
@@ @  .R@  $@Q]    Q^    @@SS@CA@@%B@@AB@@C@  ,   SQj    Qk    @A9A@SS@@  ,   SQo    @[>A3SD@  ,   SQu    @ACA@SS@@  ,   SQy    Qz    @AHA@SS@@  ,   S@JA>SC@  ,   SQ    Q    @D@@Q@  FR@  AUBJS)C@  ,   S̰Q    Q@@ZANS-CA  ,   |SҰQ    Q    @AaAUSѰ@32B@@B
  ,   hS۰Q    `@@i@\SB@  ,   HS߰Q    Q    @A	/Printtyp.mark_loops_constructor_arguments.(fun)A@SS@@  ,   8SQ    '
@@'	ASt?MQ  I  I'@!l
(A5>@@ @  @@ @  @Q    Q    @@SS@B@@A"
*A@@B@BLB@@A@BB  ,   TQ  y  Q  y  @@',A#!l
'ATH@@ @  @@ @  @Q  y  Q  y  @@TT@B@@A@B@B  ,   T!'FA'C@9T@$@A"@A   ,   T&Q    Q    @@G@C!l
)?@@P@  P@  @Q    Q    @@T6T1@A@@A@BB@@A@A@  ,   T=QI  ,  E'h@&stringO@@P@ H8`8^(out_type@@P@ J@@P@ I&optionJ8k(out_type@@P@ L@@P@ K@P@ GP@ mP@ d'AS?)R*G    '@#ppfN?)@'R/G    @@Tr!cO?#@R5G    
R6G    @@TyTt@
A@@B@@AB@BB@@A?C@@B@B@  ,   TRDH    REH    *@Q@@O@  P@ 'A(TB@  ,   T'@@'@+TB@  ,   TRSM    '@V@@P@ $boolE@@P@ 8(out_type@@P@ @P@ P@ P@ 'ܐATC?PRsK  ^  ^'@#ppfR?P@'RxK  ^  k@@T!lS?J@R~K  ^  lRK  ^  m@@TT@
A@@B@@AB@BB@@A?C@@B@B@  ,   xTͰRL  p  rRL  p  @R@@O@ P@ (A(TB@  ,   lTٰ(	@@(@+TB@  ,   XTܰRP    (@A(A@TT@@  ,   PTRP    RP    @@@@O@ P@ (BT?jRO    (&@"idV?j@(+RO    @@T$declW?g@RO    RO    @@T"rsX?e@RO    RO    @@U U @B@@AC@@A@@AB@JyB@@A@^C@@B@D@  ,   @URP    RP    @Jo@@O@ P@ (OA2UC@  ,   4UB@(R@4UC@  ,   U RS  <  W(]@93,out_sig_item@@P@ \P@ Q@ v(fCT?RR    (o@"id[?@(tRR    0@@U:#ppf\?@RR    1RR    4@@UA$decl]?|@SR    5SR    9@@UHUC@A@@AC@@B@@AB@?B@@A@C@  ,   USSS  <  >(@@(@(UP
C@  ,   UWSW    (@A(A@UTUS@@  ,   U[SW    (@@(AT?S"U    (@#ppf`?@(S'U    @@Uj!aa?@S-U    S.U    @@Uq#tysb@C
@@ @ @@ @ P@ @S=V    S>V    @@UU|@A@@A"B@@C@@AB@@B@@A@CA  ,   USNV    SOV    @A(ѐA4U@@@AB
@B  ,   USXV    (@@(@<UB@  ,   US\]    S]]    @A(A@UU@@  ,   USa]    Sb]    @?(AU>?Sj[  &  &(@(ext_argse?@(So[  &  b@@U
,ext_ret_typef?@Su[  &  cSv[  &  o@@UU@B@@AA@@B@FCB@@A@D@@CsC@@AB@C@  ,   U*@)A U
B@  ,   UȰSd  s  w)@A)A@UU@@  ,   tṴSd  s  ~Sd  s  @A)A@UU@@  ,   hU	@)A/#resg?@S^    S^    @@U"nmhFYFX@@ @ FV@@ @ @ @ @@ @ Q@ @S_    S_    @@U
#retiC@@ @ NQ@ >@Sa    Sa    
@@U$argsjA$C@@ @ e@@ @ dQ@ X@Sb  )  1Sb  )  5@@VV
@F@@AX@BW@;D@@ACC@@'E@@ABC\@F@  ,   `VSc  b  f)e@@)dAMVFA  ,   \V"Sb  )  8Sb  )  ^@A)kATV!mkCj@E
  ,   PV+Sb  )  -)t@@)sA[V(EA  ,   LV1Sa    
Sa    %@A)zBbV0|z#!@BCz@D  ,   <V;Sa    )@@)AjV8D@  ,   4V?S`    )@@)AnV<D@  ,   ,VCT_    )@@)AqV@@1@AB@C@  ,   VJT
\  r  t)@@)@VGB@  ,    VNT    )@A)A@VKVJ@@  ,   VR@)AU@0T f    )@"idm@0@)T%f    @@Vh#extn@-@T+f    T,f    @@Vo"eso@)@T2f    T3f    @@Vv'ty_namep@@ @ P@ @T?h    T@h    @@V)ty_paramsqAA@@ @ @@ @ P@  @TOi    TPi    @@V*type_paramr@D0@@ @ P@ >@@ @ P@ @ @ P@ @Tdo    Teo    "@@V)ty_paramsvL%>@@ @ )P@ 
@@ @ P@ @Tvt  c  iTwt  c  r@@V$namex#@@@ @ VP@ L@Tw    Tw    @@V$argsyADb@@ @ |@@ @ {P@ \@Tx    Tx    @@V#retzRDr@@ @ ~@@ @ }P@ ]@Tx    Tx    @@V#ext{Td9out_extension_constructor@@ @ P@ @T}  U  [T}  U  ^@@V"es|Tr.out_ext_status@@ @ P@ @T    "T    $@@WV@/wI@@ADK@@MA@@AB)LB@@C@@A[H@@AJ@@ABCD@@rGE@@F@@ABD@EC@@AFB@@A1I@@ABBG@@ErD@@ACBH@@EKE@@DF@@ABD@M@  ,   W0T  y  T  y  @@*AW.1.@+@AB*'C! D@L@  ,   W:T  Z  oT  Z  x@@*AW8
L@  ,   W?T  9  OU   9  Y@@*AW=L@  ,   WDU    *@@*AWAL@  ,   WHU~  a  eU	    @A*A@WFWE@@  ,   WMU
}  U  W*@@*AWJBAC;:D4@K@  ,   hWTUy    U{  9  O@@ @ `P@ z*B	WZ@V@AS@Q@Q@ABCNMDG@H@  ,   PWgU'x    *@@*AWd
HA  ,   LWmU-w    U.w    @A*AWld@b@AB^]CW@G  ,   <WxU8w    *@@*A#Wu	GA  ,   8W~U>u  u  yU?u  u  @A*͐B*W}m@jiBCg@F  ,   (WUHu  u  UIu  u  @A	,Printtyp.tree_of_extension_constructor.(fun)A@WW@@  ,   WUNt  c  e*@@*A8WF@  ,   WURp  %  )USr  O  ]@A	1Printtyp.tree_of_extension_constructor.type_paramA@WW@@  ,    WUXn    UYn    @T@@O@ P@ *BIWB1@@ABC@E@  ,   WUhm    Uim    @T@@O@ P@ *AYWE@  ,   WUtl  {  }Uul  {  @T@@O@ P@ {+	BeWE@  ,   WUl  {  @EG]@@P@ P@ n@@Q@ |Q@ Q@ +BxW/E@  ,   WӰUk  Y  [Uk  Y  y@U@@O@ gP@ T+(BW;E@  ,   |W߰Uj  8  :Uj  8  W@U"@@O@ @P@ -+4BWGE@  ,   hW+9@@+8AWJEA  ,   dWUi    Ui    4@A+?AW@@@ABC@D  ,   TWUi    +J@@+IAW	DA  ,   PXUh    Uh    @A+PBX @@AB@C  ,   4XUg    Ug    @UN@@O@ P@ +`AXC@  ,   $X+e@@+d@XC@  ,   XUr  O  Z@@AUo    @X@'uA@@A@@AB  ,    X(Uq  2  LUq  2  N@@A"idt@(@@ @ @Uq  2  EUq  2  G@@X6X1@B@@A@B@@B  ,   X=A@!X8A  ,   X@V u  u  Vu  u  @E@@R@ *R@ CS@ :B"tywE@@P@ ;P@ @Vu  u  Vu  u  @@XYXT@A@@A@FB@@AC@@B@A@  ,   XbV"u  u  "@@@X_A@  ,   lXfV&    +@F@@P@ ,P@ QQ@ F+CXBV6    +@"idB@+V;    @@X~ #ppfB@VA    VB    @@X!#extB@VH    VI    @@X"X@A@@AC@@B@@AB@BgB@@A@C@  ,   XXVW    +@@+@(X
C@  ,   XV[  3  J+@A+A@XX@@  ,   XV_    +@@+AX@B'Vi  7  7,@"idB'@,	Vn  7  X@@X$#ppfB$@Vt  7  YVu  7  \@@X%#extB"@V{  7  ]V|  7  `@@X&$name%E@@ @ P@ @V  ~  V  ~  @@X'$argsCFg@@ @ @@ @ P@ @V    V    @@X(#retTFw@@ @ @@ @ P@ @V    V    @@X)X@1_E@@A'G@@<A@@ABJC@@9D@@AHB@@ F@@ABC@CC@@GB@@AB@G@  ,   YV    V    @<-@ @ P@ ,cBiY@@A@BC@D@  ,   YV    ,m@@,lAqYDA  ,   YV  ~  V  ~  @A,sAxY*@'@AB$@C  ,   Y"V  c  eV  c  |@Ve@@O@ P@ y,AY'C@  ,   Y.,@@,@Y*C@  ,   Y1V    ,@A,A@Y.Y-@@  ,   Y5@,AXBV  ~  ~,@"idB@,W  ~  @@YE+$declB@W  ~  W	  ~  @@YL,"id%@@ @  P@  @W    W    @@YX-"tyF@@ @ !
P@ ! @W     W!    	@@Yd."vdV,out_val_decl@@ @ !P@ !@W.  1  7W/  1  9@@Yr/"vd+Outcometree,out_val_decl@@ @ !P@ !?@W?    W@    @@Y0Y~@BA@@A<CKB@@4D@@F,E@@ABC@E]B@@A@F@  ,   YWT    WU    @@,AaY@2F@@A@B@@@ABC@F@  ,   |YWa    Wb    @.-Bq!p)Primitive+description@@ @ !H@Wr    Ws    @@Y1Y1@G@@A0BC+@G@  ,   hY@-AYG@  ,   8YW    - @@-AY><&C3@E@  ,   4YŰW  <  @W    @A-&A@YY@@  ,   YʰW  1  3-+@@-*AYǰIG@D@AB?@DA  ,   YӰW    W    -@A-4AYҰ@S@S@ABJ@C  ,   YݰW    ->@@-=AYCA  ,   YW    W    @A-DAY@c@a@ABZ@B  ,   YW    -N@@-M@YB@  ,   YW  :  U-X@@@P@ !P@ "Q@ "
-_BYC8W    -h@"idC8@-mW    .@@Z	3#ppfC5@W    /W    2@@Z4$declC3@W    3W    7@@Z5Z@A@@AC@@B@@AB@CyB@@A@C@  ,   Z"W  :  <-@@-@(Z
C@  ,   Z&W    7-@A-A@Z#Z"@@  ,   Z*@-AYC?W    -@$kindC7@W    W    @@Z87"tyC6@W    W    @@Z?8"tyA@@ @ "k@X    X     @@ZI;ZD@'*match*ED@@A#C@@B)9A@@F"B@@AC@@F@  ,   Z\X    X    @A-A@ZZZY@@  ,   Za@-A8"tyN@@ @ "Z@X)    X*    @@Zm9#tylCYN@@ @ "\@@ @ "[@X7    X8     @@Z{:Zv@2F5@A/@B.@!H,@G@@ABC@@H@  ,   ZXI    XJ    @@@ @ "@-AfZ@D@AB@BA@=@AC@@D@  ,   ZXX    XY    @N*field_kind@@ @ "3.AwZ@R@AQB@@C@  ,   ZXg    .@@.A~ZCA  ,   Z.A.@Z@[@A@@A  ,   ZXr    .%@@.$AZWCX|  A  A./@#schC@.4X  A  V@@Z=(concreteC@X  A  WX  A  _@@Z>$csilC@X  A  `X  A  d@@Z?#labC@X  A  fX  A  i@@Z@$kindC@X  A  kX  A  o@@ZA"tyC@X  A  qX  A  s@@ZBZ@(C@@A"B@@F@@G@@ABC)A@@7D@@E@@ABD@DD@@AJ@B@@HC@@AB@G@  ,   ZX    X    @A.rA@ZZ@@  ,   [X    @A.vA@[[ @@  ,   x[X  n  rX  n  @XK@@O@ #P@ #z.Ad$kind@@ @ "P@ "@X    X    @@[$C$privU?@@ @ "P@ "@X    X    @@[1D$virtUL@@ @ #P@ "@X    X    @@[>E"tyO@@ @ #CP@ #)@Y    Y    @@[JF#tylD8O@@ @ #E@@ @ #DP@ #*@Y    !Y    $@@[ZG#ttyH@@ @ #fP@ #V@Y"  G  OY#  G  R@@[fH[a@3K@@A@B@WHBC@PI@@A@N@@AB9M@0L@@KJ@@ABCD@N@  ,   p[~v~@@.Am[zNA  ,   l[YC  G  UYD  G  j@A.Bt[!@@ABCD@M
  ,   \[YO  G  K@@/A~[
M@  ,   H[YS    (YT    C@[P@ @ #-P@ #B/
A[4C0@@)@ABCD@J@  ,   <[Yf    4@A/A@[[@@  ,   ,[Yj    @@/A[J@  ,   $[Yn    Yo    @>J@@Q@ #Q@ #%R@ #/)B[KBD@I@  ,   [Y    @@/1A[I@  ,    [ðY    @@/5A['D@HA  ,   [˰Y    Y    @A/>A[G  ,   [ҰY  w  Y    @@/EA![G@  ,   [װY  w  |Y  w  @L@@O@ "P@ "/PB-[G@  ,   [Y  w  y/V@@/UA1[GA  ,   [/\A/Y@/[@@@ABC@D  ,   [Y    ./i@@.out_class_type@@P@ .P@ .Q@ ./rC[DAY    /z@#ppf
DA@/Y    @@\	~#cty
D;@Y    Y    @@\\@
A@@B@@AB@DC@@AJ#B@@DD@@AB@B@  ,   p\Y    Y    @Y`@@O@ .P@ ./B*\"B@  ,   `\)Y    Y    @Yl@@O@ .lP@ .d/A6\.#B@  ,   T\5/@@/@9\1&B@  ,   @\8Y  z  |/@A/A@\5\4@@  ,   (\<Y  ʻ  Y  ʻ  @@/A[DaZ  Q  Q/@%param
!Da@/Z  Q  n@@\K(variance
"D^@Z  Q  oZ  Q  w@@\R\M@4D@@AB@@A@@AB@JB@@A@D@  ,   \^Z  ʢ  ʹZ  ʢ  ʺ@@/A#!s
#D^@@ @ /
@Z(  ʢ  ʳZ)  ʢ  ʴ@@\l\g@E@@A@BC@E@  ,   \sZ3  z  ʃZ4  z  ʜ@J@@ @ ./B<\v@'@A%@B$@C@  ,   \Z@    -/@@/AC\}B@  ,   \ZD    ZE    
@@0AH\B@  ,   \ZI    ZJ    @M@@O@ /7P@ /&0AT\B@  ,   \ZU    @E@@P@ /'P@ /5Q@ /10Aa\%B@  ,   l\j@0@c\'B@  ,   X\Zd"  ˍ  ˑZe$    @A0)A@\\@@  ,   L\Zi#    Zj#    @@0.A0x!v
%D@Zp!  x  ˈZq!  x  ˉ@@\\@
A@@A@@B@  ,   @\Zy#    Zz#    @@0>A\B@  ,   8\Z~#    Z#    @?Z@@Q@ /Q@ /R@ /0KB\B@  ,   \̰Z#    #@@0PA"\B@  ,   \аZ"  ˍ  ˮZ"  ˍ  ˻@@0UA'\B@  ,   \հZ"  ˍ  ˙Z"  ˍ  ˨@?q@@Q@ /rQ@ /R@ /0bB5\-B@  ,   \?@0e@7\/A@  ,   \Z3  ͯ  ͱ0@A0A@\\@@  ,   \Z4  ͼ  Z4  ͼ  @Zp@@O@ 1'P@ 170ǐA\DZ&    0@"id
(D@0Z&    2@@]"cl
)D@Z&    3Z&    5@@]"rs
*D@Z&    6Z&    8@@]&params
+HH@@ @ /@@ @ /P@ /@Z'  ;  AZ'  ;  G@@]"#sty
,J)type_expr@@ @ 0YP@ 0O@Z,    Z,    @@]0(vir_flag
-$@@ @ 1P@ 1@Z2  ͉  ͏Z2  ͉  ͗@@]<]7@=B@@ADC@@2D@@AB:A@@%E@@F@@ABC@KE@@ALC@@E@L@@ABHH@@LD@@AKF@@BCEI@@KyG@@AE{K@@EJ@@RB@@ABCD@I@  ,   ]a[!5    ["5    $@JĠZ.out_type_param@@O@ 1)@@O@ 1(O@ 1V1EC~]m6H@  ,   ]t[45    @W(Asttypes(variance@"O@ 1
+injectivity@*O@ 1@O@ 1O@ 1O@ 1pO@ 1C@@P@ 1WP@ 1P@ 11nA]_H@  ,   ][]6  &  +[^6  &  U@E@@O@ 1*P@ 11zC]kG@  ,   d][i7  W  \[j7  W  j@S@@O@ 1+P@ 11A]wF@  ,   \]@1A]yF@  ,   H][w2  ͉  ͋1@@1A]|zzx@w@ABCt@E@  ,   H][0  O  h[0  O  ͆@[@@O@ 1P@ 1Q@ 01A]E@  ,   @]Ͱ[0  O  {@Mc@@Q@ 0Q@ 01A]E@  ,   ,]@1A]E@  ,   $]ڰ[0  O  T[0  O  b@N@@P@ 0Q@ 01A]+E@  ,   ][/    [/    M@[)@@O@ 0P@ 01ÐB]7E@  ,    ][/    6@KРM@@P@ 0P@ 0@@Q@ 0Q@ 0Q@ 01֐B]JE@  ,   ^[-    [-    @[H@@O@ 0P@ 0t1B^
VE@  ,   ^1@@1A^
YEA  ,   ^[,    [,    @A1A$^@BC@D  ,   ^ [+  ̣  ̥[+  ̣  @[c@@O@ 0NP@ 0@1B4^%D@  ,   ^,[*  ̅  ̇[*  ̅  ̡@[o@@O@ 0-P@ 02	B@^1D@  ,   x^8[)  j  l[)  j  ̃@[{@@O@ 0P@ /2AL^=(D@  ,   l^D2@@2AO^@+DA  ,   h^I\	'  ;  J\
'  ;  e@A2 AV^H@@AB@C  ,   T^S\'  ;  =2*@@2)@^^PC@  ,   ,^W\:  Ώ  Ϊ24@	7@@P@ 2P@ 2:Q@ 2/2;C^	E\'9  m  m2D@"id
0E@2I\,9  m  ΅@@^o#ppf
1E@\29  m  Ά\39  m  Ή@@^v"cl
2E@\99  m  Ί\:9  m  Ό@@^}^x@A@@AC@@B@@AB@FIB@@A@C@  ,   ^\H:  Ώ  Α2e@@2d@(^
C@  ,   ^\LT    2o@A2nA@^^@@  ,   ^\PU    \QU    @\@@O@ 5P@ 52zA^GF\d<    2@"id
5F@2\i<    @@^"cl
6F@\o<    \p<    @@^"rs
7F@\v<    \w<    @@^&params
8T7@@ @ 2uP@ 2]@@ @ 2jP@ 2X@\=    \=    @@^#sty
9@@ @ 2P@ 2@\B  ϕ  ϛ\B  ϕ  Ϟ@@^$sign
:L{/class_signature@@ @ 3P@ 3@\H  S  Y\H  S  ]@@^$virt
;O@@ @ 3P@ 3@\J  Џ  Е\J  Џ  Й@@^^@KB@@ARC@@@D@@ABHA@@&F@@A3E@@G@@ABC@ME@@NbC@@ABFK@@MD@@AMUF@@BCGH@@M/G@@AG1J@@G~I@@TB@@ABCD@J@  ,   _\V    \V    ;@Lz@@O@ 5@@O@ 5O@ 503C_!4I@  ,   _(\V    @@O@ 5}@!O@ 5~@O@ 5|O@ 5vO@ 5JO@ 5@@P@ 51P@ 5oP@ 5b3%A_ATI@  ,   _H]W  =  B]	W  =  m@G@@O@ 5P@ 531C_M`H@  ,   _T]X  o  t]X  o  ҂@T@@O@ 5P@ 53=A_YlG@  ,   _`@3@A_[nG@  ,   _b]"Q  p  w]#Q  p  ѽ@U@@Q@ 3Q@ 4Q@ 43MCӠ&fields
<$listI&stringO@@ @ 3M"*field_kind@@ @ 3M(@@ @ 3@ @ 3@@ @ 3Q@ 3@]NK  М  Х]OK  М  Ы@@__@8 G@@A@,H@@ABC@BD@H@  ,   h_]^Q  p  с]_Q  p  Ѩ@A	)Printtyp.tree_of_cltype_declaration.(fun)A@__@@  ,   D_]dM    ]eP  c  o@Qj@@Q@ 3Q@ 4oR@ 33BB_H@  ,   4_]rN    ]sO    b@AA@__@@  ,   $_T@@3AJ_&H@  ,   _]zL  в  и]{L  в  @QL@@ @ 3Q@ 3@ @ 3Q@ 33A._Ű1C@F@  ,   _ΰ]L  в  @Ms)type_expr@@R@ 3R@ 3S@ 33A?_F@  ,   _ݰ]J  Џ  Б3@@3AC_FA  ,   _]H  S  `]H  S  Њ@A3ƐAJ_@@ABC@E  ,   _]H  S  U3@@3AS_	E@  ,   _]F    2]F    P@]7@@O@ 3P@ 3Q@ 3t3ݐAa_E@  ,   ` ]F    E@O@@Q@ 3Q@ 33Al`"E@  ,   `@3An`$E@  ,   `
]F    ]F    ,@Q"@@P@ 3jQ@ 3e3Az`0E@  ,   `]E    ]E    @]\@@O@ 3ZP@ 3%4B`<E@  ,   `%]E     @NO@@P@ 32P@ 3@@Q@ 3&Q@ 3UQ@ 3D4B`1OE@  ,   p`8]C    ]C    @]{@@O@ 3P@ 24!B`=[E@  ,   X`D4&@@4%A`@^EA  ,   T`I^	B  ϕ  ϡ^
B  ϕ  Ͻ@A4,A`HZXXV@BCO@D  ,   <`S^A  k  m^A  k  ϓ@]@@O@ 2P@ 24<B`XD@  ,   $`_^@  M  O^ @  M  i@]@@O@ 2P@ 24HB`dD@  ,   `k^+?  2  4^,?  2  K@]@@O@ 2P@ 24TA`p(D@  ,   `w4Y@@4XA`s+DA  ,   `|^<=    ^==    -@A4_B`{@@AB@C  ,   `^F=    4i@@4h@`C@  ,   `^JO    C^KO    `@V@@T@ 4)T@ 4\U@ 4JB)#lab
=IH@@Q@ 48Q@ 4@^_N    ^`N    @@``@B@@A/
>A@@B@B@@A@B@  ,   `^mO    -^nO    ?@Rs@@T@ 4*T@ 4:U@ 47B#`B@  ,   `^{O    (^|O    a@@A(`BA  ,   t`A!@T`@@A@A  ,   X`ǰ^Q  p  і^Q  p  ѧ@@)A^"vr
?T,virtual_flag@@Q@ 4Q@ 4@^Q  p  ы^Q  p  э@@`!b
@uQ@ 4@^Q  p  ё^Q  p  ђ@@``ݰ@A@@A/
BC/
AB@@!D@@AB@@DA  ,   L`SAP@`@@@AB@@C  ,   $`^[  Ҩ  4@@@P@ 5P@ 6Q@ 6	4C`HO^Z  ҅  ҅4@"id
EHO@4^Z  ҅  Ҟ@@a#ppf
FHL@^Z  ҅  ҟ^Z  ҅  Ң@@a"cl
GHJ@^Z  ҅  ң^Z  ҅  ҥ@@aa@A@@AC@@B@@AB@HB@@A@C@  ,   a(^[  Ҩ  Ҫ5@@5@(a%
C@  ,   a,^v  $  &^v  $  :@^o@@O@ 7YP@ 7S5!A`Hb__  
  
50@$fenv
JHb@55__  
  @@aI%ftree
KHT@__  
  _
_  
  $@@aP#arg
LHK@__  
  %__  
  (@@aW#env
M^N@@ @ 6=P@ 62@_b  w  }_ b  w  Ӏ@@ac(old_pers
NS@@ @ 6LP@ 6A@_+c  Ӕ  Ӛ_,c  Ӕ  Ӣ@@ao'old_map
OSS@@ @ 6[P@ 6P@_8e    _9e    @@a|)old_depth
P_@@ @ 6jP@ 6_@_Df    _Ef    @@a(old_cont
QSS@@ @ 6z@@ @ 6yP@ 6n@_Tg  
  _Ug  
  @@a$tree
RHO@ 6@_\i  O  U_]i  O  Y@@aa@TA@@OD@@ABdC@@bB@@A$H@@2G@@AB@F@@NE@@I@@ABCD@TF@@AT,E@@^B@@ABTG@@T[C@@ATJD@@BS$H@@SI@@ACD@I@  ,   aŰ5@@5Aa&I@  ,   aȰ_t    _t    @@5Aa+I@  ,   aͰ_s    @@5Aa/I@  ,   aѰ_r    	@@5Aa3I@  ,   aհ_q  բ  զ
@@5Aa7I@  ,   aٰ_n  1  8_u    "@@5Aa<I@  ,   aް_k  Ԃ  ԥ_k  Ԃ  ԧ@@5AaAI@  ,   a_k  Ԃ  Ԋ_k  Ԃ  ԟ@X8@@Q@ 6Q@ 6R@ 65ڐAaOI@  ,   la_j  i  k5@@5AaSIA  ,   `a_i  O  \_i  O  e@A5Aa[WVP@O@ACDL@H  ,   Tb_h  0  2_h  0  M@_E@@O@ 6P@ 65AbH@  ,   Hb_h  0  C@I$5Ab
H@  ,   @b6@@6AbH@  ,   8b_g  
  6@@6Abyu@s@q@ABp CDk@G@  ,   ,b _f    6@@6Ab~@|@Ax(BCs@F@  ,    b(_e    6@@6Ab%@@~@ABC{@E@  ,   b0_c  Ӕ  Ӗ6@@6Ab-@@AC@D@  ,   b7_b  w  y6&@@6%@b4@@AB@C@  ,   b>_  ؑ  ص_  ؑ  @A69A@b<b;@@  ,   bC@6;AaI*`  t  t6A@%ident
%Ident!t@@ @ ;@`  ؑ  ؤ`  ؑ  ة@@bWbR@B@@A1@A@@B@@BB  ,   ba`!  v  ٟ6\@A6[A@b^b]@@  ,   be@6]A#%ident
!!t@@ @ ;V@ ;@`2    `3    @@bvbr@C'B@@A#@B@@C!  ,   b6|A6y@=b|@(@A@@A&  ,   pb`F  ڐ  ڒ6@@6Ab5IZ`M  ٵ  ٵ6@#idsIZ@6`R  ٵ  @@b#envIQ@`X  ٵ  `Y  ٵ  @@b'hide_id@Zu@@ @ =P@ <@_@@ @ =P@ <P@ <@ @ <P@ <@ @ <P@ <@`s    `t    @@bb@&A@@A C@@/B@@AB@IB@@A@C@  ,   lb°`    `  ~  ڊAA5Printtyp.hide.hide_idA@bb@@  ,   \bȰ`    6@@6@AbŰ@@@AB@B@  ,   Dbϰ`  ~  ڇ
@@AK7
@"id6@`    @@b#env	3@`    `    @@bbް@
A@@B@@AB@IB@@A@B@  ,   (b`  <  \`  <  s@%Ident!t@@Q@ =Q@ =R@ =7A,bD@  ,   b`  <  B`  <  }@@=A1bB@  ,    c`  	  `  	  6@E@@R@ <R@ <S@ <JA?c-B@  ,   c`  	  
P@@O@Cc1B@  ,   c`  ۊ  ێ7@@7AbIɐ`  ڳ  ڳ7$@#idsI@7)`  ڳ  @@c%!f
I@`  ڳ  `  ڳ  @@c,;with_hidden_in_printing_env@[[@@ @ =@@ @ =P@ =c@@[T@@ @ =@ @ =kP@ =@ @ =P@ =j@ @ =lP@ =d@ @ =eP@ =b@a    a    @@cOcJ@.A@@A5B@@*C@@AB@]TB@@AJ)D@@JC@@AB@C@  ,   c^a  ]  aa  ]  ۂ@@7eAIc\C@  ,   cca#  ;  =7j@@7iAMc`C@  ,   cga'    a(    5AA	6Printtyp.with_hidden_items.with_hidden_in_printing_envA@cfce@@  ,   lcma-    7t@@7s@Vcj@@@AB@B@  ,   Tcta4    a5    @@`l@@Q@ =@Q@ =AhT@#idsS@aF    @@c!fL@aL    aM    @@cc@
A@@B@@AB@]B@@AJhD@@JC@@AB@D@  ,   Dca]    a^    3@@eP@ =vbP@ =oP@ =u@Q@ =Q@ =BA/cC@  ,   ,cao    H@@G@3c!B@  ,   cas    at    @I{)signature@@P@ >7ǐAclJKa  ۱  ۱7@#envJK@7a  ۱  @@c!xJH@a  ۱  a  ۱  @@cc̰@B@@AA@@B@@C@  ,   cذa    7@@7@c	B@  ,   cܰa  o  7@G/out_module_type@@P@ MP@ MQ@ M7BcHa  o  o8 @#ppfH@8a  o  ~@@c#mtyH@a  o  a  o  @@cc@
A@@B@@AB@JkB@@A@B@  ,   da  o  8@@8@dB@  ,   d	a    8"@@@P@ MP@ MQ@ M8)BcHa    82@"idH@87a    @@d!#ppfH@a    a    @@d($declH@a    a    @@d/d*@A@@AC@@B@@AB@IB@@A@C@  ,   d:a    8S@@8R@(d7
C@  ,   dd>a.    8]@@8\AcHÐb#    8d@'refresh@S@@ @ NcQ@ N@Th@@ @ NQ@ N@TQ@ NO@@ @ N^Q@ NTg@@ @ N~Q@ N@ @ NQ@ NQ@ NGTt@@ @ N}Q@ NH@ @ NIQ@ N@ @ NQ@ N@ @ NQ@ N@ @ N	Q@ N@b?$    b@$    @@d!!mTT@@ @ NQ@ N@bL+  A  GbM+  A  H@@d&!sT@@ @ NQ@ N@bX+  A  JbY+  A  K@@d'd@=cC@@ E@@AB3A@@`B@@D@@ABC@QD@@ATC@@TB@@AB@E@  ,   \dbq-    8@@8AsdE@  ,   Hdbu,  N  Rbv,  N  @8,@ @ NQ@ N8ېC~d@@@AB@B@  ,   $dŰb,  N  u@A8A@dd@@  ,   dɰb+  A  C8@@8AdB@  ,   dͰb$    b*  0  =AA=Printtyp.refresh_weak.refreshA@dd@@  ,   dӰb$    8@@8@dа@4@A.@A@  ,   dٰb*  0  9@AA@dd@@  ,   d@
A@!t@b$    @@d"$name@b$    b$    @@d#!m@b$    b$    @@d$!s@b$    b$    @@d%d@E@@AB@@B3A@@D@@A'C@@BC@RB@@A@E@  ,   eb&    b)  &  /@ABA@e
e@@  ,   eb'    b'    @HC<eF@  ,   eb(    b(    %@OBCe!E@  ,   pe"@RAEe#E@  ,   he$b%    b%    @V9@@Q@ NFR@ N0]BQe)/E@  ,   \e0b%    @R8@@R@ N1R@ NDS@ N@jA^e6<E@  ,   Le=b%    p@@oAbe:@EA  ,   8eCvAs@be>@B@AA@=@AB<@C  ,   $eJc
6    c6    @@K/I_II@O@ P@@O@ P@O@ P
Q@ O@@O@ OIII@O@ PQ@ O@@O@ O@O@ O9Ae,Iݐc40    9@'showvalI@9c90    @@e|)#envI@c?0    c@0    @@e*!xI@cF0    cG0    @@e+*extend_val@IP@ Ow@IP@ O@ @ OP@ O@ @ OP@ O~I@ @ OP@ O@ @ OP@ Ox@ @ OyP@ Ov@cg4  +  1ch4  +  ;@@e,,post_process@JP@ O`JX @ O@ @ OP@ O@@ @ OP@ O@ @ OP@ O[@J!@ @ OP@ O@@ @ OP@ O@ @ OP@ O@c5  t  zc5  t  @@e0eѰ@_B@@ARD@@3E@@ABiC@@^A@@AC@adB@@AJfE@@B\C@@KD@@AC@F@  ,   ec6    :@KѠJX`LJVJ/@P@ P@@P@ P@P@ P@@P@ PP@ PJP@ P;:$Be-E@  ,    f:)@@:(Af0E@  ,   fc5  t  c5  t  AA	!Printtyp.print_items.post_processA@ff@@  ,   fc5  t  v:3@@:2Af@9@9@AB65C3@D@  ,   fc4  +  <c4  +  pAA?Printtyp.print_items.extend_valA@ff@@  ,   fc3    c3    )@c_@@O@ OuP@ Om:GAf!@O@AKJBH@C@  ,   f+c2    c2    @cn@@O@ ObP@ OZ:VAf0C@  ,   f7c1    c1    @cz@@O@ OOP@ OG:bAf<C@  ,   fC:g@@:f@f?C@  ,   fFd4  +  T0@A/A@fCfB@@  ,   fJd
4  +  ]4@J4Bǐd4  +  -=@#env@Bd4  +  ?@@f[-'sigitem@d4  +  Ad4  +  H@@fb.'outcome@d%4  +  Id&4  +  P@@fi/fd@B@@AC@@5TA@@D@@ABC@B@@A@D@  ,   fw1@^A)frDA  ,   lf{eAb@*fv@@A@B@B  ,   LfdA5  t  dB5  t  @@J@Q@ OʠJ@Q@ O@Q@ OA%琰@#env@dX5  t  dY5  t  @@f1!l@d_5  t  d`5  t  @@f2f@C@@AB@@5A@@AB@#B@@A@D@  ,   @fdo5  t  @@A!fCA  ,   ,fA@#f@@A@A  ,   fdz;  N  P:@@:@fyJ␰d:  /  /:@#ppfJ@:d:  /  F@@f4$treeJ@d:  /  Gd:  /  K@@f5fʰ@B@@AA@@B@@B@  ,   fְd>    ;@JJ@@O@ R@@O@ RO@ R!;AfJߐd=    ;@#ppfJ@;d=    @@f7"sgJ@d=    d=    @@f8f@B@@AA@@B@K!C@@MB@@AB@B@  ,   gd>    ;2@@;1@ f
B@  ,   xgdN    ;<@@;;AfJ琰dA    ;D@*sourcefileJ@;IdA    5@@g:#ppfJ@dA    6dA    9@@g;"sgJ@dA    :dA    <@@g#<!tM%Q@@ @ Rw@@ @ RvP@ Rj@dE    dE    @@g3=g.@"B@@AA@@+C@@D@@ABC@bB@@AKeE@@B^!C@@MQD@@AC@D@  ,   pgFeL    eL    @d@@O@ SP@ SQ@ S;AL)conflicts\@@ @ RQ@ R@eI  /  7eI  /  @@@g_>gZ@E@@A.@B-,C(@E@  ,   \gfe&J  x  |e'K    @d@@P@ SwQ@ SP;BgkE@  ,   Lgre2J  x  e3J  x  @(Location!t@@R@ Sb;A-gz F@  ,   8geAK    @A;A@g~g}@@  ,   0g>@@;A4g'EA  ,   ,geJI  /  CeKI  /  t@A;Bg[D  ,   geQH  "  )eRM    
@@;AgaD@  ,    geVG  	  eWG  	  !@Ys@@Q@ RQ@ RR@ R;ՐAgoD@  ,   gedF    eeF    @UR@@Q@ RQ@ RR@ R;A(WarningsgD@  ,   gevF    ;@@;AgDA  ,   ge|E    e}E    @A;Ag@@AB@C  ,   gưeD    eD    @e	@@O@ RiP@ Ra<AgC@  ,   gҰeC  z  |eC  z  @e@@O@ RVP@ RN<AgC@  ,   gް<@@<@gC@  ,   |gea  t  z<@@<AgKeR  T  T<&@!tK@<+eR  T  c@@g@"t'K@eR  T  deR  T  f@@gA!t!@@ @ TCP@ T8@eS  i  oeS  i  p@@hB"t'"@@ @ TPP@ T9@eS  i  ~eS  i  @@hCh@
oF
nE@@A!C0B@@D.A@@AB@[B@@AXD@@ZJC@@AB@F@  ,   ph'e^  N  [e^  N  `@@<dAO!pY@@ @ T@eV    eV    @@h<D"tlU\@@ @ T@@ @ T@fV    fV    @@hKE"p'Y@@ @ T@fV    fV    @@hUF#tl'\@@ @ T@@ @ T@fV    f V    @@hcG"p1X@@ @ TR@ T@f+W    f,W    @@hoH"s1[@@ @ TR@ T@f7W    f8W    @@h{I"p2Y@@ @ TR@ T@fCW    
fDW    @@hJ"s2[@@ @ TR@ T@fOW    fPW    @@hKh@AiNAmK@AmJ@@VH@@AB?M@@*P@@A7L@@!O@@ABC@@AoI@@XG@@ABD@P@  ,   <hfo\    fp\    @@@S@ U<A"tl]]?@@ @ US@ Us@@ @ U}S@ Um@f[    f[    @@hN#tl']]Q@@ @ US@ U@@ @ US@ Un@f[    f[    @@hOhذJ7(Q8@R9@ABD@S@  ,   (hf\    f\    !@:U@ U='A7hR@  ,   hAf]  %  M@@=,A;hRA  ,   hf[    f[    @A=3BhgTRBD@Q  ,    i f[    f[    @F=>Bi rP@  , if[    @@=CAivP@  , ifZ  w  fZ  w  @Z @@R@ UkS@ U_=NBiP@  , i@=QAiP@  , ifY  K  rfY  K  v@@=VA"n1\`@@ @ U@fY  K  WfY  K  Y@@i(L"n2\j@@ @ U	@fY  K  _fY  K  a@@i2Mi-@@AQ@@R@@ABC#CD@R@  , i=fY  K  gfY  K  n@@=zA$i;R@  , <iBgX  -  3g_  a  j@@=Ai@P@  , (iGgW    gW    )@Ҡ@ @ TR@ T=A$iM@@A@@ABC@D9@M@  , iZgW    gW    @@ @ TR@ T=A7i`@V@A@@ABRCK@J@  , ~ilg,W    *@@=A@ii	J@  , ~8ipg0T    =@@=Aim@]@AY@BV@DA  , ~4iyg9S  i  g:S  i  @A=Aixa@B`@C
  , ~ igBS  i  sgCS  i  y@=Ai@p@Al@Bk@B@  , ~igLS  i  k=@@=@iB@  , }igPo  H  Q=@A=A@ii@@  , }i@=AiYMg[e    =@!tL@g`e    gae    @@iT"t'M @gge    ghe    @@iU"t'MQ@ V@goi  4  <gpi  4  >@@iV%firstWL@@ @ VQ@ V@g{l    g|l    @@iW&secondWX@@ @ WQ@ V@gm    gm    @@iXiư@E@@A8A@@F@@AB8C@@,D5B@@AC@XB@@AMD@@WC@@AB@F@  , }ign  "  =gn  "  G@A>$A@ii@@  , }i@>&ARiF@  , }ign  "  )gn  "  7@Z@@P@ W(Q@ W$>1B^i'F@  , }ign  "  &>7@@>6Abi+FA  , }igm    gm    @A>=Bii31@B-,C(@E  , }jgm    >G@@>FAqjEA  , }j
gl    gl    @A>MBxj	@A@A=<B8@D  , }jgl    >W@@>VAjD@  , }jgi  4  mgi  4  o@@>[Aj
I@F@ABE@C@  , }j gi  4  ]gi  4  g@MP@ WP@ V>gAj#
C@  , }|j*
@>jAj%C@  , }pj,gi  4  Dgi  4  K@X@@Q@ V>sAj/D@  , }\j6gi  4  Ogi  4  W@S@ V>|Aj8"C@  , }Hj?gi  4  8>@@>Aj<&C@  , }@jChg    hg    (@A>A@jAj@@@  , }8jHhg    @M>BjG1C@  , }(jNhg    hg    	@g@@P@ VQ@ V}>AjS=C@  , } jZhg     @YK@@R@ V~R@ VS@ V>Aj`JC@  , }jgh'g    h(g    ,@@>AjeOC@  , }jlh,f    h-f    @[@@P@ VrQ@ Vl>Bjq[C@  , |jxh8f    >@@>Aju_CA  , |j~>A>@jy@@A@A  , |jhCt    >@@>AjIM̐hJq  e  e>@#ppfM@>hOq  e  {@@jZ!tM@hUs    hVs    @@j\"t'M@h\s    h]s    @@j]j@9A@@AB@@D@@AC@@BC@@DB  , |hjhnr    hor    @@>A+!tM@hur    hvr    @@j[j@@A@C@@AB@@C  , |Hj?
A?@9j@ @@AB@@B  , |4jǰhz    ?h@A?gA@jj@@  , |,j˰hz    hz    @MQ@ Z?oBjMhx  Z  Z?w@"tpM@hx  Z  |hx  Z  ~@@ja#tp'M@hx  Z  hx  Z  @@jbj@9A@@AC@@B@@AB@`B@@A@D@  , |jhz    hz    @MQ@ Z?B'jC@  , |j4@?A)jC@  , |jhy    hy    @A?A@jj@@  , {khy    @M?B4k C@  , {k@?A6k"C@  , {k
hy    hy    @\@@P@ ZWQ@ ZQ?BBk.C@  , {khy    ?@@?AFk2CA  , {k?A?@Hk@5@A0@A  , {tk!h  W  ]?@@?AjM鐰h|    ?@#ppfM@?h|    @@k0d!p
M@h~  E  Nh~  E  O@@k7f"p'M@h~  E  Ph~  E  R@@k>gk9@D@@A
C@@B:)A@@B@@AC@@DB  , {DkLi}    -i
}    D@@?A+!pN@i}    (i}    )@@kWekR@C@@AB@@C  , {$k^@A@@8kY@B@@B  , {kci#  o  v@@@@Ak0Mi+  }  }@@"t1M@i0  }  i1  }  @@ktt#t1'M@i7  }  i8  }  @@k{u"t2 M@i>  }  i?  }  @@kv#t2'!M@iE  }  iF  }  @@kwk@CsED tB@@A:w"A@@)G@@AB#F@@D@@C@@ABC@OOB@@A@G@  , { ki_  '  [i`  '  n@@@LA=kG@  , zkid  '  Eie  '  U@]@@R@ _R@ _S@ _@YBKk'G@  , zkir  '  1is  '  A@Y`@@R@ _R@ _S@ _@gBYk5G@  , zki  '  .@m@@@lA]k9G@  , zkİi    i    &@@@qAbk>G@  , zkɰi    i    @b@@R@ _|R@ _S@ _@~BpkLG@  , zkװi    i    @]@@R@ _}R@ _S@ _@B~kZG@  , zki    @@@@Ak^GA  , zTk@A@@k@[@AR@A  , zDki  -  @@@@@AkM(T  8 @@@A@@@A@@@@@k}@  8 @@@AMM@@ @ `s@@AUk@@@l @Ak@:)A@@A@@AC  , z4li    i    ,@@@A@  8 @@@AMM@@ @ `f@@AUl@@@l@AlA  , z$li    i    @@@A(@$  8 @@@ANN@@ @ `Y@@AUl!@@@l#~@Al#A  , zl&@A@@3l!&A"  , z l)i    @@@@AkMАi  _  _@@l*@;IA@@A@NjB@@A@AC  , yl9i    i    @@@Al7@DvCDuB@@A@B@C  , ylGj  ~  j  ~  @@A A !d,O`M@@ @ `@j  ~  j  ~  @@lVlQ@B@@A)@B'@B%  , ytl]AAA@2lX.A(  , yhl`j   j  tj!  j  v@@AAl1M吰j(    A'@/printing_statusLM@A,j-    @@lp"trMM@j3    j4    @@lw+clean_traceN@MS@ b@aMR@ b"@@ @ b$S@ b
S@ b@ @ bS@ b@ @ bS@ b@jL    jM    @@ll@C@@A+B@@'A@@AB@@C@  , y`ljY  w  AX@AAWA@ll@@  , yTlj]  w  A\@kANR@ bj@@S@ bnS@ bAcCG#eltRN@jm  w  {jn  w  ~@@l#remSkSN@@ @ b]@jx  w  jy  w  @@ll@,@E@@AB-@D@@A.@BC@@E@  , y<l-@AAl
E@  , y lȰj  Z  \A@@AAgl:C@  , yl̰j    j  ,  TAA	&Printtyp.prepare_any_trace.clean_traceA@ll@@  , ylҰj    A@@A@plϰ@C@AA@B@@B@  , xlٰj  ,  S
@@Azf
@!xPe@j    @@l!lQf@j    j    @@ll@E`xC@@A
A@@B@@AB@B@@A@C@  , xlj    (j    +@A-A@ll@@  , xl@/A#lC@  , xm j    j    $@@4A(lC@  , xmj    j    @A9A@mm@@  , xm
@;A/mC@  , xmj    j    @NAA6m@! B@B@  , xmj    I@@H@<mB@  , xtmj    A@bDN>@@S@ bS@ cS@ bABlN|j    A@!fVN|@Aj    @@m1"trWN_@j    j    @@m8m3@B@@AA@@B@NC@@NB@@AB@B@  , x\mCk    B@@B@ m@
B@  , x0mGk  k  "@@B@m#ppfbk @@ @ e@k  k  @@mUmP@<<cA@@B@@AB@@B@  , xm]k  BW@@BVAm/Nk"  B\@!tfN@Bak'  @@mjme@!thB
A@@A@@B@  , wmsk3  k4 D @ABmA@mqmp@@  , wmxk8  k9 D @ABrA@mvmu@@  , wm}k= D bk> D ~@a@@U@ fhV@ fzB}B*#rowg\	@@ @ f@kO  kP  @@m&'@@ @ fU@ f@kY  kZ  @@mm@F{C@@$initzE@@ABD@@<@AC@@I@  , wmkj D jkk D x@b,@@V@ f @ fBA-mI@  , wmkv  kw  -@\;@@T@ fT@ fT@ fBA;m@%@AB@@D@  , wpmǰk  T@@BABmD@  , w\m˰k  k  @\N@@T@ f/ @ f%BːANmD@  , wLmװk  @@BARmD@  , vm۰k  k  @'@@ @ eBِAmް@u@A@@A@  , vmk  B@@B@mA@  , vmk  B@ABA@mm@@  , vm@BAmNk  B@!tkN@k  k  @@m"t'lN@k  k  @@n"t'mNS@ f@k  k  @@nn@<nA@@AC@@DB@@AB@ND@@A\cB@@QC@@AB@D@  , vnk  k  @kc@@R@ g9S@ g7T@ g3C&A;n%D@  , vn,@C)A=n' D@  , vn.k  k  @P@@T@ gT@ g'U@ g!C6BKn5.D@  , vn<k  k  @k@@R@ gS@ g CBAWnA:D@  , vnHCG@@CFAZnD=DA  , vnMl
  l  @ACMAanLEB@?@AB>@C  , v|nWl  CW@@CVAinTCA  , vhn]C]ACZ@knX@P@AI@A  , v\nbl"  Ch@ACgA@n_n^@@  , vLnfl&  Cl@@CkAn<N䐰l-  Cs@'compactqN@Cxl2  :@@nu!trN@l8  <l9  =@@n|"t'sN@l?  ?l@  A@@nn~@FE@@AB@@B=otA@@D@@AC@@BC@\B@@AO2C@@B@E@  , vDnlV  lW  @ACA@nn@@  , v4nl[  l\  @k@@S@ gT@ gCA=n"E@  , v(n@@CA@n%E@  , vnlj a lk a @@CAEn*E@  , unlo E Mlp E V@c1@@S@ gd @ g_CAQn@3@A20C,@D@  , unl~ E GC@@CAXnDA  , unCAC@Yn<@B6@B  , u|nɰl  C@Qz@@R@ h]T@ hpCڐBnO#l  C@!pwO#@Cl  @@nnذ@	A@@A@dB@@A@A@  , ulnl  C@@C@n	A@  , uLnl  /C@@C@nO l  C@#ppfzO @Dl  ,@@nn@	A@@A@@A@  , u,nl S hD@@D@nDml S UD@#ppf~Dm@Dl S b@@oo@=A@@B@@AB@@B@  , uol , 5D@@DAnOl  D@#envO@Dl  @@o"tyO@l  l  @@o$o@GC@@AB@@A@@AB@@C@  , to.l  l  +@@DA!!p`@@ @ jq@l  l  @@o<o7@D@@A@BC@@D@  , toCm  m  @c@@S@ jh @ jaDƐB<oH@'@A%@B@@B@  , toRm  D@@D@CoOB@  , ttoVm  m  @l@@R@ k
S@ kDߐAo;O:m' < <D@#envO:@Dm, < M@@oo#ty1O4@m2 < Nm3 < Q@@ov#ty2O0@m9 < Rm: < U@@o}$snap_(snapshot@@ @ jS@ j@mG X ^mH X b@@o#resia@@ @ jS@ j@mS z mT z @@oo@3C@@AE@@"D@@AB1B@@,A@@AC@@E@  , tdoNE&@@E%AEoE@  , tDomg  mh  @@E*AIo@@A=wE@@B@#tagF@@ABC@@F@  , tomw  mx  @l@@S@ jT@ jE@C`o@)@'@AB&%C@@H@  , soǰm z |EJ@@EIAhoDA  , soͰm X em X v@AEPAoo̰@9@A54B@@C  , soװm X ZEZ@@EY@woC@  , so۰m 	 	Ed@@EcAoOm  Ek@#envO@Epm  @@o"t3O@m  m  @@o"t4O@m  m  @@oo@ED@@AC@@BB@@A@@AC@PB@@AOC@@B@E@  , spm 	c 	im	 	 	@AEA@p	p@@  , spm 	c 	n@A?Printtyp.explanation_diff.(fun)A@pp
@@  , sp
@EA:#ty1d@@ @ kj@m 	 	"m 	 	%@@p!#ty2d@@ @ kk@m 	 	'm 	 	*@@p+p&3+@+@AG@@F@@ABC-@G@  , sp4m 	/ 	Km 	/ 	_@b@@T@ mT@ m9U@ m0EŐC+p;G@  , stpBn 	/ 	8n 	/ 	G@]@@T@ mT@ mU@ mEӐB9pI#G@  , shpP@@EA<pL&G@  , spSn  n  	@AEA@pQpP@@  , rpXn  @AHA@pUpT@@  , rp\	@EA#ty1d@@ @ kS@n$ M \n% M _@@ph#ty2d@@ @ kT@n. M an/ M d@@prpmzr@r@AG@@F@@ABCt@G@  , rp{n;  l n<  l @bX@@T@ kT@ kU@ kFC+pG@  , rpnI  l unJ  l @^7@@T@ kT@ kU@ kFB9p#G@  , rp@@FA<p&G@  , r\pnZ / 1F#@@F"@p@@AB@C@  , r0pna  nb  	@@@I#ppfP)@@ @ k@nk  nl  @@pp@
A@@A@@A@  , rpnt 	z 	nu	 	 	@@@#ppfP<@@ @ mO@n~ 	c 	sn 	c 	v@@pp@
A@@A@@A@  , qpǰn 
O 
Un 
O 
v@@FVApP<n
 
 
F\@#ppfP<@Fan
 
 
 @@ppа@?A@@B@@AB@PB@@A@BB  , qpn 
 
Fp@@FoA$tagsO&stringO@@ @ n@@ @ n@n 
w 
n 
w 
@@pp@"@A@C@@AB @C  , qpFAF@3p)B!  , qtqn 8 Wn 8 e@@n@@S@ qS@ rWV0@@S@ qS@ rV@S@ rbS@ rFApPhn 
 
F@#posPh@Fn 
 
@@q!Š$explPc@n 
 
n 
  @@q(Ơ!pg!t@@ @ o@n  n  @@q5q0@A@@AC@@!B@@AB@QC@@]B@@AB@C@  , qlqBo  A@@FA0q?C@  , q,qFo ~ o  @@FA5!xe@@ @ o@o n yo n z@@qTqO@@A@C@@AB@C@  , qq[o f sF@AFA@qXqW@@  , qq_@FAJqZ@)@'@AB&@B@  , pqdo$ ( ,o% ( m@@FARqbB@  , pqio) 
 F@@F@VqfB@  , pqmo-7  G@AGA@qjqi@@  , pqqo17   G@@o*@@T@ s}Q@@T@ s|@T@ s{T@ y GEq[PT  8 @@@A@@@A@G@@@qʠ#posP@@ @ sU@oK6  oL6  @@q@  8 @@@AT*comparison@@ @ sT@@AUq@@@q@Aq@@A@@B@@AB@PD@@AQC@@QB@@AB@B@  , p`qog9  oh9  @P@@U@ z#W@ z.GHA2#qE@  , pDqG@GLA5&qBF  , p0qoy.  oz1 ~ @AGTA@qq@@  , p(qo~.  @MT@ wVG[DG#posQ@@ @ s@o+  o+  @@qҠ!kQ4@@ @ s@o,  o,  @@qӠ!eep@@ @ s-@o-  o-  @@q@W  8 @@@AT+unification@@ @ s@@AUq@@@q@Aq@B@@A"C@@Z@/D@@ABCX@D@  , pqo/ ! Ao/ ! Z@@o@@U@ wTU@ xW(@@U@ wUU@ x@U@ x&U@ xGBH'rI@  , orV@GAK*r!D[  , oro4  o4  @@GA@  8 @@@AU,1@@ @ sA@@AUr@@@r@Ar0Dj  , or"o% 
 
o*  @AGA@r r@@  , or'o% 
 
@T@ u/GĐE#posQz@@ @ s@o% 
 
o% 
 
@@r9Р&fieldsPj(Asttypes%label@@ @ s
S)row_field@@ @ s@ @ s	@@ @ s@p% 
 
p% 
 
@@rVrQ@!B@@A@-C@@AB@C@  , ohr^p) _ rp) _ @m&@@U@ w4U@ w@@U@ wU@ w(HBAriF@  , oXrpp0) _ |p1) _ @AHA@rnrm@@  , o<ruS@H
AHrpC  , o rxp8! 
 
p9! 
 
A@AHA@rvru@@  , or}p=! 
 
@
HB!s@@ @ r@pI   
 pJ   
@@rr@@B@@AB@B@  , o r@H+ArBޠ  , nrpV$ 
x 
~pW$ 
x 
@AH1A@rr@@  , nrp[$ 
x 
@*T@ toH8A!@  8 @@@AU@@ @ r@@AUr@@@r@Ar@@A
@A@  , nr@HFA.
rA  , nrHMAHJ@1rA  , nrpuI  pvM ; @@AHVA@rr@@  , nrpzI  @QR@ -H]ErQȐp;  He@#preQ@Hjp;  @@r۠!tQ@pI  pI  @@rrΰ@KFC@@AAA@@B@@D@@ABC@hB@@A_TC@@B@D@  , nPr/@HA$rDF  , n4rpD  pH ~ @AHA@rr@@  , n,rpD  @QR@ }HD3!p$Path!t@@ @ z@pD  pD  @@sr@C@@A/@-@AB*@C@  , ms
"@HAsC&  , ms
p<  p> F ^@AHA@ss
@@  , msp<  @QHDV!uTd)type_expr@@ @ z@p<  p<  @@s#s@N@AK@C@@ABJ@C@  , ms*@HAs%CF  , ms-p? _ pC  @AHA@s+s*@@  , ms2p? _ @RR@ {HՐDx!pE!t@@ @ z@q? _ zq? _ {@@sFsA@C@@ArCBl@C@  , mdsL@HAsGCh  , mLsOqQ  H@@HAsL@{LBu@Bo  , mDsVqO X ^qO X @AHA@sTsS@@  , m<s[qO X c@R1R@ HBs\B@  , m sc
@IAs^B  , lsfIAI@saB  , lsiq)X  q*\ B G@AIA@sgsf@@  , lsnq.X  @@q'@@T@ VS@@T@ U@T@ TT@ ICsYR1T  8 @@@A@@@A@I'@@@s#posR@@ @ %@qGX  qHX  @@ss@BrA@@B@@AB@@B@  , ls*@I7AsBC  , lsqWT 
 5qXW  @AI>A@ss@@  , lsq\T 
 9@,ICD%#posR@@ @ @qhT 
 +qiT 
 .@@s!f@@ @ @qsT 
 /qtT 
 0@@ss@B@@A.@C@@AB@@C@  , lhs(@IcAsC,  , lLs°q^ p vIi@AIhA@ss@@  , lDsưq^ p {Im@XT@ IoAP@Q  8 @@@AV@@ @ 2@@AUs@@@s@AsѰ@K@A@@A@  , l,s@I~A^sAH  , lsIAI@asAK  , lsqz  q{  @AIA@ss@@  , lsqz  @@Sn@@T@ Sj@@T@ @T@ T@ IEsֱR]T  8 @@@A@@@A@I@@@s%intro@q@@T@ FW@ Y+@@T@ GW@ @T@ T@ @q`  q`  @@t$prevoɠURR@@T@ 
T@ 
@@T@ 	T@ @q`  q`  @@t&#envS@@T@ T@ @q`  q`  @@t2!xU)type_expr@@ @ @qv ! :qv ! ;@@t>!yU)type_expr@@ @ @rv ! <rv ! =@@tJtE@LG@@A+B@@VD@@ABC8A@@FC@@A'F@@E@@ABC@SeF@@AS$G@@SE@@ABT
D@@b[B@@A`C@@BC@G@  , kti@JAutdG@  , ktkr+  r,  @AJA@tith@@  , ktpr0  @AJA@tmtl@@  , ktt	@JAto*G@  , kltvr6w B Fr7w B \@q@@U@ V@ J)At{@32B0.C(@F@  , kdtJ1@@J0AtFF  , kHtrJq  rKq  @AJ7A@tt@@  , k@trOq  @T@ J>B$name@@ @ e@r]p P ur^p P y@@tt@U@AS@E@@ABT@Q@ACM@E@  , k(t @JTAt	E$  , ktrmo 4 8rno 4 O@@JZA$kindSS,b]@@R@ @R@ R@ &@@ @ E@rd | rd | @@t'contextRݠV)type_expr@@ @ L@@ @ K@rd | rd | @@t#pre@r@@ @ JU@@ @ I@ @ HV@ @re  re  @@tt@M\E@@)F@@AB@@AG@@AB@H@@A@BCD@H@  , ktrm  &rm  ,@AJA@tt@@  , jt@JAMtZCD@G@  , jurj r zrl  @,V@ ~JF[$namev@@ @ @ri ' bri ' f@@u$diffX+Vf)type_expr@@ @ !@@ @  @ri ' hri ' l@@u&u!@MHA@A>@I@@AB@@A?@(J@@ABCD@J@  , ju63@JA,u1J@  , ju8rh  rh  &@_JD#ctxs@@ @ @sg  sg  @@uHuC@`@A]@H@@ABND@H@  , iuP@JAuKH@  , iuRse  @@JAuOVGΠ  , iuWsu  su   @@KAe!oXp#objl@@ @ @@ @ @s(t  s)t  @@ulug@ @A@E@@ABC@E  , ixuus5s  s6s  @@K"A!vX'variant@@ @ x@@ @ w@sEr  sFr  @@uu	8@5@E@@ABC3@E  , iPusQc _ csRc _ {@@K>A!sR@ R@ R@ %@s_b  Hs`b  I@@u!t
@sfb  Xsgb  Y@@uu@NHN!FN$E@@AfeBc@a@A#I@@G@@ABC`@I5  , i uKkAKh@u>mCe@D:  , huðs  Kv@A7Printtyp.mismatch.(fun)A@uu@@  , huȰs  K{@@Kz@uTs m mK@%introT@Ks m @@u#envT@s m s m @@u%traceT@s m s m @@uu@B@@AC@@A@@AB@TB@@A@C@  , htus  s  @@.@+$prevTT$@@ @ @s  s  @@v!hT,R@ @s  s  @@v
v@A@@B@@AB@;D@@ATB@@DC@@AB@B@  , h\vs  	s  @@KAuTs  K@#misT@Ks  @@v& #ppfT	@s  s  @@v-v(@B@@AA@@B@@B@  , hPv4s   K@@KA'explainT,@s  s  @@v>v9@C@@A@@AB@@C@  , h8vEt  K@@K@-vBB@  , h vIt	 k tL@@LAv.T&t - -L@#envT&@Lt - H@@vX#ppfT#@t - It - L@@v_!tT!@t" - Mt# - N@@vfva@ND@@AC@@BB@@A@@AC@lGB@@A@D@  , gvtt4  t5 E b@@L3A-!ph)@@ @ @t> e rt? e s@@vv}@DOF@@ABE@@BC@F@  , gvtL  tM  @te0type_declaration@@S@ LRB v1.@@AB.-C+@I@  , gvt] | t^ c j@@L\A)v	E@  , gLvtb Q SLa@@L`@Yv@;@A:9B7@C@  , g8vti  tj  @ALnA@vv@@  , g0vtn  @T:LsBvTetv x xL{@(empty_trTe@Lt{ x @@v	!dYӠT`@@ @ @t  t  @@v
vİ@C@@AB@@EA@@AB@WLB@@A@C@  , g vհt  t   @@h@@T@ M@T@ N@T@ L@T@ KLA5vD@  , gv@@LA7v CB  , fvt  
L@@LA<v@%@A#@B!@B	  , fvLAL@AvB  , fvt E Qt E W@ALA@vv@@  , fv@LAvTyt  L@'txt_gotTy@Lt  1@@w	'txt_butTm@t  2t  9@@w
w@EA@@A
B@@C@@AB@ZB@@AZ`C@@B@CB  , f|w t  L@@LA'!dTy@t X at X b@@w+!dZBZd@@ @ @@ @ T@ @@ @ T@ @t f pt f q@@wAw<@E$D@@A5@B32C0@EA  , fxwLu f tu
 f @AMB-wK@
@AA@B?>C<@D  , fdwWu f lM"@@M!A6wT	D=  , fLw\M'AM$@]wWLC@  , f$w_u ` lu  ` n@@M0AwGTu& 4 4M7@#envT@M<u+ 4 P@@wn#ppfT@u1 4 Qu2 4 T@@wuwp@C@@AF^A@@B@@AB@UWB@@A@CB  , fwuC  uD  @t@@S@ T@ MZC-#te1T@uR o uS o @@w#te2T@uY o uZ o @@ww@PGPEPD@@A1@B0@/@AH@@F@@ABC1@H@  , ew-M@@MA$wH2  , ewMAM@Pw?C5  , ewuw    ux    @TZR@ R@ MBwTu  M@,trace_formatT@Mu   @@w#envT@u   u   @@w"trT@u   u   @@w$txt1T@u   u   @@w#ppfT@u   u   @@w$txt2T@u   u   @@w5ty_expect_explanationT@u   u   2@@w"trm&Yj'@@ @ j+@@ @ @ @ T@@ @ @@ @ S@ @u  A  Gu  A  I@@x#misV1@V~@@ @ W@@ @ @ @ @@ @ S@ Z@u    u    @@x. x)@`F@@AI@@NC@@AB:H_E@@pG@@A]D@@BPB@@KA@@ACD@sB@@AVEM@@YXI@@ABUO@@XJ@@Z
G@@ABCVL@@XK@@AVN@@YH@@AfD@@fdC@@ABCZF@@[|E@@AUP@@BDE@I@  , exa@N5Ax\3I@  , excv# # #N:@Fh@@T@ T@ T@ NAA#eltZj@@ @ j@@ @ @ @ UUR@ h@@ @ @vC    vD    @@x!"tr w)Z)j@@ @ Ơj@@ @ @ @ Š@@ @ @@ @ @v]    v^    @@x"#exnw
@@ @ @vg # #vh # #@@x(x@AK@@A@L@@ABC-J|Dt@L@  , exT@NAJxL@  , exvy # #N@@NANxL@  , e`xv} #E #Kv~ #E #k@v @@S@ T@ NA^"trm[j@@ @ ,j@@ @ -@ @ +@@ @ *@@ @ )T@ 	@v ! ! v ! !"@@x#$headt\k@@ @ p@ @ o@@ @ n@@ @ mT@ T@v !R !\v !R !`@@x$"trn|\k+@@ @ ڠgj@@ @ @ @ @@ @ T@ @@ @ T@ @v ! !v ! !@@y%*head_error@v@@ @ hs@@ @ @ @ 
T@ @v ! !v ! !@@y-&"trn\G\f@@ @ A@@ @ @@@ @ ?@@ @ >T@ &@w " "w " "@@yE'y@@BcQ@@1S@@ABC!TQRPD@T@  , eHyUw #m #@@O+AyRT@  , eHyYw # #"w # #C@v@@S@ T@ U@ mO8Cy` T@  , e(yg@O;Ayb"T@  , e yiw) " #w* " #@j~@@T@ PU@ MOFByn.T@  , eyuw5 "/ "5w6 " "@VR@ hONGyv6T@  , dy}w= " "w> " "@@V,T@ @x)\\\@@T@ @@T@ @@T@ @@T@ T@ V;T@ @T@ @T@ T@  OnByVY@  , dyw] " "w^ " "@m@@V@ V@ W@ O|AydY@  , dywk " "6@@VYT@ VUT@ @T@ T@ 1OAypW@  , dyBb@@OAysTA  , dyw| " "w} " "+@AOAy{sD@S
  , d|yŰw " "q@@OAySA  , dxy˰w ! !w ! "@AOCyʰ$@@ABCD@R
  , d\yװw ! !@@OAy
RA  , dXyݰw ! !w ! !@AOByܰD@Q
  , dHyw ! !w ! !@@\l@@U@ ӠhM@@U@ @U@ @@U@ ]@U@ @@U@ @U@ O֐A9y"R@  , d0zw ! !@@OA=z&QA  , d,zw !R !cw !R !@AOBDz
d@BCD@P  , dzw !R !X@@OAMz	PA  , dzw ! !%w ! !N@AOCzoD@O
  , cz%w ! !@@OAz"O@  , cz)w    P @@OAz&K@  , cz-w    P@@PAoz*IA  , cz3w    w    @AP
Cvz2@	@A@BD@H  , cz>w    P@@PAz;	HA  , czDx  A  Lx  A  @APBzCD	@G
  , czMx
  A  Zx  A  @A4Printtyp.error.(fun)A@zLzK@@  , chzSx  5  7x  5  ?@w@@R@ S@ P0AzXG@  , c\z_P5@@P4@z[G@  , cHzbx"  A  gx#  A  ~@AA@z`z_@@  , c<zgx'  A  j@l@@T@ (U@ $A!t[@@ @ @x8  A  _x9  A  `@@z|"t'[@@ @ 
@xB  A  axC  A  c@@zz@B@@AA@@B@[?B@@A@B@  , c0z-@?@z	B@  , czxQ $1 $IxR $| $@A;Printtyp.report_error.(fun)A@zz@@  , bzxW $1 $3Pt@@PsAzW5xc # #P@,trace_format	W5@Pxh # #@@z*#ppf
W0@xn # #xo # #@@z+#envW.@xu # #xv # #@@z,"trW,@x| # #x} # #@@z-(
lW#@@ @ 8@x # #x # $A@z.W/W*R@ >@x # $@@z/$txt1W"@x $ $%x $ $)@@z1$txt2W@x $ $*x $ $.@@z2zٰ@#C@@A2E@@;F@@AB.D@@EG@@AB@@A@@%H@@ABCD@WC@@l
B@@AB@H@  , bzx # $/@AcA@zz@@  , bz@PA]z@@ABC@G@  , bz
@PAd(W`@
@{0z@%@	H@@AB&%C#D@H@  , b{t@P@r{G@  , b{
x # $G@@{@s{
@IA@@A@@A@  , bT{x $1 $Tx $| $@@@{@IA@@A@nE@@AXB@@xD@@ABkF@@C@@AYH@@BSI@@bG@@ACD@A@  , bL{.Q.AQ*A@{){(@@  , b({0Q0AQ,A@{+{*@@  , a{2QEAQAA@{-{,@@  , a{4QGAQCA@{/{.@@  , a{6x 'Q 'tQO@@QNA{!!d^NV@@ @ Z@y  'Q 'oy 'Q 'p@@{D7{?@B@@AJ-A@@B@]B@@A@BA  , a{PQiAQf@{8{K@
@A@A  , at{Uy ' 'Qt@pV[@@T@ T@ T@ Q|BQ!fV@Qy& ' '@@{i:"trVt@y, ' 'y- ' '@@{p;{k@B@@AA@@B@\B@@AWC@@B@B@  , aX{{y; ' 'Q@@Q@{x
B@  , aH{y? *g *mQ@I@@T@ T@ T@ QAR!,filter_trace&V|@QyT (! (9@@{=(get_diff'VP@yZ (! (:y[ (! (B@@{>#fst(V:@ya (! (Cyb (! (F@@{?)keep_last)V8@yh (! (Gyi (! (P@@{@#txt*V9@yo (! (Qyp (! (T@@{A#ppf+V7@yv (! (Uyw (! (X@@{B"tr,V5@y} (! (Yy~ (! ([@@{C#exn3z-@@ @ @y *; *Dy *; *G@@{J{ư@H@@AAG@@B5E@@>F@@AC1D@@&B@@A A@@0C@@ABD@\}E@@iB@@AB^D@@_C@@AC@H@  , aD{g@RA]{H@  , a<{y *K *QR
@@RAa{H@  , a({y *+ *8y *+ *:@@RAe{@"@A! BC@K@  , a{y ) )y ) *@y8@@T@ U@ R Dz#elt-Vz@y ( (y ( (@@|D#tr'.zV@@ @ u@y ( (y ( (@@|E*diffed_elt/VS@ {@y ( (y ( (@@|F"tr0q_8_{i@@ @ @@ @ @@ @ @@ @ U@ @y ( (y ( (@@|6G"tr1q_VS@ F@@ @ HU@ ,@z  )p )|z )p )~@@|DH|?@4N@@AGM@@{@ABzyCwvP2Ox@IL@@Ay@BCDx@P@  , `|Vaz * **@@RzAY|SP@  , `|Zz ) )z ) )@@RA]|XCD@O@  , `|bz" ) )z# ) )@ARA@|`|_@@  , `|g@RAh#elt2W@z+ ) )z, ) )@@|oI|j+P+*BCD@P@  , `|wz7 )p )x"@@RAy|tOA  , `|}z= ( (z> )E )l@ARA||=3CD@N  , `|zG ) )
@v_W`W[@V@ @@V@ @@V@ V@ %V@ RA|N@  , `|z] ) )D@@v_n@@V@ k@@V@ @V@ @@V@  X@ @@V@ r._͠@V@ @@V@ X@ @@V@ @V@ RA|DO@  , `p|ǰz ) )+@@_ޠn@@Y@ k-@@Y@ @Y@ @@Y@ _@Y@ @@Y@ @Y@ SA|bO@  , `X|z )E )Rh@WS
B|hN@  , `D|z ( (@@SA|lNA  , `@|z ( (z ( (@ASA|@@A)@B('C%wD@M
  , `4|z ( (@@S!A|
M@  , ` }z ( (S&@@S%Ay|G@  , _}z (^ (bS*@@S)@}}G@  , _}	z	
 , ,$z	
 , ,[@ASKA@}}@@  , _}z	
 , ,)@VSPBSW
z	 + +SW@$diff>`,W@@ @ @z		 + ,z		 + ,@@}"S}@B@@AL?A@@B@`B@@A@B@  , _},#@SkA}'
BB  , _}0z	 ,\ ,gSr@@SqA}-@@A@A  , _x}7SyASv@$}2A  , _p}:z	 , ,S@ASA@}7}6@@  , _h}>z	 , ,S@VSBSW{	
 ,m ,oS@$diffB`\W@@ @ N@{	 , ,{	 , ,@@}RU}M@B@@AL;CA@@B@`B@@A@B@  , _T}\"@SA}W
BA  , _H}`SAS@}[@@A
@A  , _4}e{%	 -  -FS@A	#Printtyp.Subtype.report_error.(fun)A@}c}b@@  , ^}j{*	 -  -$S@@S@T#ppfEV@S{4	 , -@@}wW#envFV@{:	 , -
{;	 , -@@}~X#tr1GV@{A	 , -{B	 , -@@}Y$txt1HV@{H	 , -{I	 , -@@}Z#tr2IV@{O	 , -{P	 , -@@}[}@!D@@A(E@@C@@ABA@@B@@AC@y"B@@A[G@@WL@@ABXK@@[F@@^IE@@ABCXI@@YH@@kD@@ABWvN@@XJ@@AWM@@nC@@ABCD@E@  , ^}{z	" / /{{	# / 0@@{v@@U@ HU@ @r_lkv@@U@ Rkz@@U@ S@U@ QV@ nX(@@U@ rV@ 
@@U@ DU@ W@U@ @U@ @U@ U@ A}E}#tr1JsYpp@@ @ p@@ @ @ @ @@ @ @@ @ V@ @{	 -a -k{	 -a -n@@~\#tr2Ms-_p.@@ @ p2@@ @ @ @ Wz@@ @ @@ @ V@ y@{	 - -{	 - -@@~ _*keep_firstPw@@ @ V@ @{	 .# .-{	 .# .7@@~,b#misQ\D@\@@ @ ]@@ @ @ @ @@ @ V@ j@{	  /1 /={	  /1 /@@@~Ac~<@&D@@AE@@M-RA@@ABbB@@IC@@AC@yB@@AO@@\TF@@ABXK@@XJ@@\E@@ABCN@@^D@@AYH@@BYG@@loC@@AX*M@@BCDP@@R@@Y[I@@ABQ@@XiL@@ACE@H@  , ^<~q|1	$ 0 0|2	$ 0 0,@@U@ U@ @U@ U@ A~w;F@  , ^$~~|>	! /t /||?	% 0- 0S@@A~|@EA  , ^ ~|E	  /1 /C|F	  /1 /p@A!C~@H@AE@BCBC@@D  , ^~|P	  /1 /L|Q	  /1 /h@@|H@@W@ %^@@W@ $@W@ #5A~F@  , ]~|_	  /1 /9!@@:A~D@  , ]~|c	 / /|d	 / /+@@?A~D@  , ]~|h	 . .|i	 . /@{@@U@ V@ [JD~)D@  , ]~|t	 . .|u	 . .@@|p@@V@ ZV@ @sZIlp@@V@ ~lt@@V@ @V@ }W@ @@V@ W@ 6@@V@ pV@ /V@ @V@ @V@ V@ muE~TH@  , ]L~߰7`@@yA~WD@  , ]D~|	 .I .{|	 .I .@@~A~@@AB@C@  , ]8~|	 . .|	 . .@@A~C@  , \~|	 .# .)q@@A
~CA  , \~|	 - -|	 - .@AB~@@@AB@B  , \~|	 - -|	 - .@AA@~~@@  , \||	 - -@@A
BA  , \t
|	 -q -y|	 -q -@AB	@@A@A
  , \h|	 -q -|	 -q -@AA@@@  , \L|	 -Q -W|	 -Q -_@|[@@U@ V@ AA@  , \@$@@@ A@  , \4'|	 -q -|	 -q -@AA@%$@@  , \$,|	 -q -@@@Ġ!tKZW@@ @ @|	 -q -|	 -q -@@:]"t'LZZ@@ @ ,@} 	 -q -}	 -q -@@D^?@B@@AA@@B@_B@@A@B@  , \M}
	 - .
}	 - .@AA@KJ@@  , [R}	 - -@@@n!tN`@@ @ @}	 - -}	 - -@@``"t'O`@@ @ @}&	 - -}'	 - -@@jae@B@@AA@@B@`B@@A@B@  , [s}3	 * *}4	 * *@@	%Printtyp.Subtype.filter_subtype_traceAV)keep_last6Y@};	  * *}<	  * *@@Mz@B@@ANh;A@@B@[B@@A@Y@@@ABC  , [}M	 + +}N	 + +@AA@@@  , [}R	 + +@YB!!d9bYS@ G@@ @ S@}`	 +} +}a	 +} +@@P#rem:~FY@@ @ T@}k	 +} +}l	 +} +@@Q@E!d7D@@A#elt8C@@B9@9@F@@ABC97F@  , [3@JA*F7  , [ð}	 +W +z}	 +W +|@@PAQbݠ0@@ @ HV@ E@}	 * +}	 * +@@N[S9@@ @ F@}	 * *}	 * +@@Oװ@XPE@@A-@+@ABa@a@AC_]E@  , [}	 +W +q}	 +W +t@AsA@@@  , [@uA%E@  , [|}	 +W +_*@@yA)E@  , [p}	 + +*}	 + +=@b@@T@ ~A3E@  , [d
}	 + +S@@A7!Et  , [$ rAA@VBx  , [}	* 0 0V@A	*Printtyp.report_ambiguous_type_error.(fun)A@@@  , Z	}	* 0 0V@@V@Yc}	) 0_ 0_V@#ppfVYc@V}	) 0_ 0@@f#envWY`@}	) 0_ 0}	) 0_ 0@@#g#tp0XY^@}	) 0_ 0}	) 0_ 0@@*h#tplYYU@}	) 0_ 0}	) 0_ 0@@1i$txt1ZYF@}	) 0_ 0}	) 0_ 0@@8j$txt2[Y;@}	) 0_ 0}	) 0_ 0@@?k$txt3\Y6@~	) 0_ 0~	) 0_ 0@@FlA@/F@@A6G@@+E@@AB%D@@!C@@AB@@A@@ABC@ncC@@AcCD@@BcE@@a0F@@qyB@@ABC@G@  , Za~!	. 1$ 10~"	. 1$ 1<@YpS@ ;S@ vcB`#tp0]c vo@@ @ a@@ @ `V@ P@~7	, 0 0~8	, 0 0@@{mv@Ob_A@@B@@AB@oF@@AnB@@eG@@AB_H@@cvC@@A]I@@BWJ@@SK@@AcVD@@ahE@@ABCD@B@  , Z6@A-B@  , Zd~Y	4 1 1~Z	4 1 1@ccN@@V@ @@V@ V@ A>"tp^YS@ S@ l@~o	/ 1= 1D~p	/ 1= 1F@@n@Y&C@@A;@D@@A;@BC:@G@  , ZH~}	0 1K 1S~~	5 1 2@@A
D@  , Z °~	; 2| 2~	; 2| 2@{{dcz@@V@ @@V@ 
@@V@ V@ !͐Bjϰ!YWBU@F@  , Yذ~	7 2 2#~	< 2 2@@AqC@  , Yݰ~	- 1 1@@AudBA  , Y~	, 0 0~	, 0 1@AA@l@Ah@A
  , Y~	+ 0 0~	+ 0 0@~/@@U@ OV@ GAA@  , Y@@@A@  , Y|~	B 3 3W@dTd2@@T@ @@T@ T@  T@ WՐA"tycY@W~	A 3v 3@@r#ppfdY@~	A 3v 3~	A 3v 3@@s#ty'eY@~	A 3v 3~	A 3v 3@@!t@B@@AC@@A@@AB@dB@@AdpC@@B@C@  , Yt.~	B 3 3~	B 3 3@AWA@,+@@  , Yd3~	B 3 3X@@X@+0C@  , YL7~	D 3 4
~	D 3 4!@AXA@54@@  , YD<~	D 3 4~	D 3 4 @AXA@:9@@  , Y0A	E 4" 4&X@A	'Printtyp.tree_of_type_declaration.(fun)A@?>@@  , YF	D 3 3X@@X@8%identgY@X#	C 3 3@@Qv"tdhY@	C 3 3	C 3 3@@Xw"rsiY@	C 3 3	C 3 3@@_xZ@C@@AA@@B@@AB@kB@@AhC@@B@C@  , Xl,	E 4" 41-	E 4" 4U@@,@'j@PVjA@@A@+C@@AE@@(D@@kB@@ABC@A@  , X}=  >  @@5Printtyp.filter_traceAP,trace_formatYb@F  G  @@)keep_lastZbR@ c'@O  P  @@@
B@@AP|`A@@C@@AB@cBB@@A@b@@@ACD  , Xc < \d < @A&A@@@  , Xh < a@b+C-!d]dàbR@ c?@@ @ cP@v < Pw < Q@@#rem^\b@@ @ cQ@ < U < X@@@F!d[E@@A#elt\D@@<@AB;@G@@A;@BC:8G@  , X4@WA+G8  , Xڰ  9  ;@@]A^d1@@ @ cAU@ c=@    @@c:t @ c@@@ @ c>@    @@@ZiyF@@A0@B-+ecBCa_F@  , X  0  3@AA@@@  , X|@A&F@  , Xp  +@@A*F@  , Xd	     @d#@@S@ cA4F@  , XX
  @@A8 Fv  , X    @@A#rem_c@@ @ cU@    @@'"@]@A@B@E@@A@BCE  , W1AA@-C  , W5        @@.Printtyp.traceA#fstd@         @@Ci#txtdP@ \@    	    @@Lj#ppfdP@ \@        @@UkP@D@@AQ?A@@BB@@C@@AC@eB@@A@e @@@ADB  , W|g'    (    @@dQ@ ^@dQ@ ^dQ@ ^@Q@ ^@Q@ ^Q@ _)>BA#gotd@=    >    @@l(expectedd@D    E    @@m#rem*e	@@ @ \@O    P     @@n@[rF@@G@@ABB@$H@@AD@BCB@E@@AC@BDB@I@  , Whc  ,  2d    @@nA/H@  , Whh    i    *@@@Q@ ]MR@ ]KR@ \{B=!H@  , WL@~A?#H@  , W@x    
@@AC'HW  , W~AA@iD[  , V        @@6Printtyp.functor_paramAgg@        @@ggO@ L@        @@"idgO@ L@        @@!qgO@ L@        @@@C@@AB@@A@@(D@@ABC@|B@@A@g@@@h2 @@ABD@  , V  /  7  /  k@A<Printtyp.functor_param.(fun)A@@@  , V    @@=A="idh @        
@@	!
E! CE@  , V    @@M@L)D@  , Vx  /  B  /  j@@@@QA@@A@ND@@hZB@@AB@E@@YC@@AC@A@  , Vp$	  f  p	  f  v@A;Printtyp.functor_parametersA@#"@@  , Vd*@Ah`h`@  ,  H  ,  K@@2
.custom_printerhOO@ J@  ,  L  ,  Z@@;6@
B@@AR$A@@C@@AB@}@E@@A@h-C@@h@@@ABCC  , VHM
        @he*A*"idhW@
  w  |
  w  ~@@[%paramhQ@
  w  
  w  @@b]@[_F[^D@@A-@E@@ABG0.C,*H@  , V<q1
    2
    @hDND$qG@  , Vx8    @@SA(uG1  , U}=  ,  4>  ,  J@hO@ Kc[A\"idh@I    J    @@%paramh@P    Q    @@!q6h@@ @ J@[    	\    
@@=d@G9@ABIh@H@@Ah@BCgeL@  , Ul  Z  bm  Z  @hO@ K{D/I@  , Ut    @@A3Im  , UTy  ,  G
AA@qCr  , U0~        *@A7Printtyp.tree_of_moduleA@@@  , U(İ        @K@@O@ JiP@ Ju
A"idi1O@ F@        @@i/uj<O@ JK@@ @ JO@        @@#mtyj<O@ JU@        @@	"rsi7O@ J\@        @@
@ C@@*D@@ABB@@A@@AC@~ B@@AjO@@BjM@@C@@AuYF@@kJ@@ABCkK@@mH@@AzD@@yE@@ABnG@@mrI@@AjN@@k?L@@ABCD@ja @@j @@ABi @@i@@@ACi @@j6 @@Aj @@i @@ABDF@  , U.        @j~O@ J/rBe/=E@  , U 6        )@y@@O@ JkP@ J~Aq;ID@  , TB@@s=KD@  , TD        @A	$Printtyp.tree_of_modtype_declarationA@CB@@  , TJ
        @@@O@ J.P@ J9
A"idiO@ F@        @@`$decliO@ I@%    &    @@i#mtyjP@ I@-     &.     )@@ql@A@@AB@@C@@AB@~xE@@Ak	R@@BkeP@@F@@AuI@@lHM@@ABCkN@@n\K@@Az~G@@yH@@ABoJ@@mL@@Ak@Q@@kO@@ABCD@j @@k @@ABj@@@iC@@ACj- @@j @@Aj @@jW @@ABDD@  , Tb@_AQ5C@  , Th   I  Wi   I  d@@dAU@]\C@@A<@<@AB9C@  , Ts  e  wt  e  @jpBc#mtyk
@@ @ J@  e  p  e  s@@Q@Q@D@@ABCP4D@  , T@AD@  , Tp̰     "@@@xɰ@\ BX<B@  , TLҰ        @@8Printtyp.tree_of_sigitemA"id"!t@@ @ Ep@        @@ $decllJ@@ @ Eq@        @@"rszT@@ @ Er@        @@@C@@'D@@ABSA@@B@@AC@H@@AkU@@BkS@@I@@Av]L@@lP@@ABClQ@@nN@@A{
J@@zK@@ABoM@@nvO@@AkT@@lCR@@ABCD@ke @@k @@ABjC@@jF@@ACj@@@k: @@Ak @@j @@ABDDG  , T4  w  }  w  @@bA"id}"!t@@ @ Eg@  U  c  U  e@@G$decl~l@@ @ Eh@
  U  g  U  k@@Q"rsz@@ @ Ei@  U  m  U  o@@[V@C@@'D@@ABa@B@@AC_CD3  , Sf&  +  1'  +  T@@A"id{##!t@@ @ E_@4    5    @@x$decl|j@@ @ E`@>    ?    #@@}@B@@AC@@@ABhCX  , SK    L    
@AA@@@  , SP    @@AJ"idx#N!t@@ @ EV@_    
`    @@"mdyR@@ @ EX@i    j    @@"rsz{@@ @ EY@s    t    @@(ellipsisl@@ @ EQ@ E@  "  ,  "  4@@@E@@A3D@@(C@@AB@ B@@ACEA  , SѰ  7  ?    @ABBа@@A@BCD  , Sܰ  7  K    @A>Printtyp.tree_of_sigitem.(fun)A@@@  , S  "  (W@@AQD  , SP        @@A"idu#@@ @ EL@        @@#extvo@@ @ EM@        @@"eswo@@ @ EN@        @@@B@@AC@@&D@@A@BCD  , S        @@DAР"idr#@@ @ EC@  c  p  c  r@@&$declsqg@@ @ ED@  c  t  c  x@@0"rst{@@ @ EE@  c  z  c  |@@:5@C@@$D@@AB@@B@@AC>"D  , RE  ;  A  ;  b@@sA"idp$!t@@ @ E;@    +    -@@W$declqo@@ @ E<@    /    3@@a\@B@@AC@@g@ABcGC7  , Rj*    @A@ g@n@AjNA>  , Rq1    2    @@Ao@U[A@@A@@AB  , R|<  U  =  U  @@Az@^RE^QD^OC^NB@@A@B@@E  , RA@A  , QS    T    @A	)Printtyp.trees_of_recursive_sigitem_groupA@@@  , QY    @l7O@ DCY#envZlTO@ C>@i    j    @@/syntactic_group[/Signature_group)rec_group@@ @ C@x    y    +@@'display\@(sig_item@@ @ CP@ Cl@@ @ CP@ ClYO@ C@ @ CP@ C@ @ CP@ C@  J  P  J  W@@#envj@@ @ DP@ D@        @@%itemsl$listImi@@ @ D8@@ @ D7@  *  8  *  =@@#idsm|u~@@ @ DQ@ D}@@ @ DQ@ Dx@  A  K  A  N@@
@_~ME@@AUC@@B7DoB@@G@@A1F@@mA@@ABC@K@@AmX@@BnV@@"L@@AxsO@@nS@@ABCnT@@pQ@@A} M@@|N@@ABqP@@pR@@AmW@@nYU@@ABCD@m{ @@m @@ABlF@@lI@@AClC@@mP @@Am5 @@l@@@ABDH@  , QH    @mO@ EBIDG@  , QP    @A	/Printtyp.trees_of_recursive_sigitem_group.(fun)A@NM@@  , QU@APKGA  , QY  A  Q  A  @AƐBXSN@J@AH@BCG+F  , Qd$  A  Z%  A  @AA@ba@@  , Qi)  A  G@@AfF@  , Qxm-    .    )@AA@kj@@  , Qpr2    @O@ DQBנ!xkm@@ @ D0@>    ?    @@}xs@l@F@@ABCmQG@  , Q\I    @AA@@@  , QTM    N    (@m\O@ DjAG@  , QH)@ AF@  , Q$X    @@A@@A@@ABhDA  , Q b    c    @ABBrC
  , Qk    @@AC@  , Qo  J  Xp  J  AA	1Printtyp.trees_of_recursive_sigitem_group.displayA@@@  , Pu  J  L"@@!@@@A@BB@  , P|  J  w
@AA@@@  , P  J  ~@mFA#	@!x^@@ @ C@  J  Y  J  Z@@Ͱ@
A@@A@mfB@@A@A@  , P@'@A@  , P۰  A  d  A  @@@?!xnn]@@Q@ DQ@ D@  A  _  A  `@@@A@@A@nB@@A@A@  , P        @@@V@VoA@@A@@B@@AC@@B@A@  , Pt        @B@@O@ CmP@ Ch>Printtyp.tree_of_signature_recA $env'=mO@ AA@  G  a  G  e@@ޠ"sg>nO@ A@  G  f  G  h@@ߠ*structured?m@@ @ BP@ A@@ @ BOP@ A@  k  q  k  {@@2:collect_trees_of_rec_groupS@mP@ B3@@ @ CYP@ CVmO@ CW@ @ CXP@ C @ @ CP@ B@        @@JE@D@@ABB@@B;A@@4C@@AC@SN@@An[@@Bo@Y@@[O@@AyR@@p#V@@ABCoW@@r7T@@A~YP@@}Q@@ABrS@@qU@@AoZ@@oX@@ABCD@n @@n @@ABmI@@mL@@ACnF@@n @@Ann@@@n2C@@ABDD@  , PhA    @@{Ay~9D@  , PdE    F    AA	9Printtyp.tree_of_signature_rec.collect_trees_of_rec_groupA@@@  , P@K    @@A@A@A@?B=!CA  , P<T  k  ~U  k  @AAJ@BG+B
  , P,]  k  	@&Stdlib#Seq!tnM@@Q@ B@@Q@ BAB@  , Pq  k  m1@@@B@  , Pu    0@A/A@@@  , Oy  n  rz  n  @@@P@ CUQ@ CP:A>C@%groupU@H    @@#envV@@ @ CQ@ C@        @@$env'WnzO@ C@        @@+group_treesXn|O@ C@        @@@a_LC@@A"B@@E@@A,A@@D@@ABC@B@@AC@@BzLD@@nE@@AC@E@  , OI|@@{A@E@  , O  
    (  f@/(@ @ CQ@ C=AK@"@A@B@B@  , O  (  0@A	?Printtyp.tree_of_signature_rec.collect_trees_of_rec_group.(fun)A@@@  , O    @@AWB@  , O    @@@Z@-@A*@A@  , O$  (  ;  (  e@@@b"@XYA@@A@^D@@AeC@@nB@@AB@A@  , Ox3  ߒ  ߝ  ߒ  ߭@A	 Printtyp.tree_of_signature.(fun)A@21@@  , Oh9  =  B@AA@65@@  , OL=  ߒ  ߔ  =  E@@:Printtyp.tree_of_signature@"sg6oI@  w  ߍ  w  ߏ@@ID@
A@@A@LQ@@Ao^@@Bp9\@@TR@@AzU@@qY@@ABCpZ@@s0W@@ARS@@~T@@ABsV@@rX@@Ap]@@p[@@ABCD@o @@o @@ABnL@@nO@@ACoI@@o@@@AogC@@o+F@@ABDA@  , O8z:    ;    0@AGA@xw@@  , O(?     @    <@@LAC"sg8ojO@ @@H  ߒ  ߲I  ߒ  ߴ@@ڠ+tree_groups9opO@ A-@P  ߸  Q  ߸  @@@A@@
B@@AB@B@@AoC@@B@BA  , O$a  ߸  b  ߸  @AnB"@@A@A
  , Oj  ߸  ߾+@@v@)A@  , Nn    *o    -@A{A@@@  , Ns    !t    /@@A6$_env:o@{    |    @@ܠ!l;o@        @@@B@@AX<A@@B@@BA  , NVA@N˰@@A@@A  , Nհ  ߒ  ߩ  ߒ  ߬@@@#env7@@ @ A@  ߒ  ߢ  ߒ  ߥ@@ް@
A@@A@@A@  , N  3  9  3  I@A	"Printtyp.tree_of_functor_parameterA@@@  , N  3  ?@A	(Printtyp.tree_of_functor_parameter.(fun)A@@@  , N@A@X5A@@A@T@@Apa@@Bp_@@U@@A{PX@@q\@@ABCqx]@@sZ@@AV@@vW@@ABtY@@si[@@Ap`@@q6^@@ABCD@pX@@@p @@ABoO@@o~R@@ACoL@@p-C@@ApF@@oI@@ABDAB  , N'  7  =  7  u@A?A@%$@@  , N,  7  p@ACA@)(@@  , N0  7  B@AGA@-,@@  , N4  7  I  7  o@pO@ ?NB%param.<'!t@@ @ @"@@ @ @!@  J  U
  J  Z@@PҠ&ty_arg/p@@ @ @#@  J  \  J  b@@ZӠ$name1V@@ @ @}Q@ @^@@ @ @_Q@ @=@(  g  q)  g  u@@lԠ#env2@g@@ @ @Q@ @aQ@ @b@ @ @cQ@ @>@9  g  w:  g  z@@}x@E@@A)D@@BFC@7B@@ACtF@  , Nhb@AOE@  , NDK  ޖ  ޮL  ޖ  ޼@AA@@@  , N8P  ޖ  ި@@AV@BE@  , NV    W    @AA@@@  , N[    @:Ad"id3^@@ @ @S@f  ޽  g  ޽  @@@CGG@@AF@@B.,CG@  , Ms     t    -@HQ@ @ΐD@
@A:8BF@  , M)@@A!F@  , M°  g  m@@A2C  , Mǰ    @A@}A  , M|̰  ޖ  ޹A@@@#env4_@  ޖ  ޲  ޖ  ޵@@Ѱ@
A@@A@@A@  , Mp۰  3  H@@@!k0pO@ @0@  3  C  3  D@@@A@@A@@A@  , Mh        @A8Printtyp.tree_of_modtypeA@@@  , M`    @@@P@ ?Q@ ?B8"|àq^O@ >@@ @ ? @        &A@Ơqi#qfO@ ?@     @@Ǡ!p)q@@ @ ?4@        @@@B@@AD@@E@@A%param?CZ	-A@@BC@&W@@Aqd@@Brb@@.X@@A|[@@r_@@ABCr`@@u
]@@A,Y@@Z@@ABu\@@t^@@Aqc@@rea@@ABCD@qC@@q@@@ABpR@@pU@@ACpO@@q\F@@AqAI@@qL@@ABDE@  , MPTi@fAZO<E@  , M<V  ݡ  ݧ  ݡ  @AkA@TS@@  , M0[@mAe%param'q@@ @ ?0@&    '    	@@jˠ&ty_res(q@@ @ ?1@0    1    @@t̠%param*qO@ ?@8     9    %@@|͠#env+@qq@ @ ?Q@ ?@C    'D    *@@Π#res,qO@ ?@K  ^  hL  ^  k@@@dCG@@Az@By@H@@A%I;F|@J@@A6E@@BCDz^JA  , M,d  ^  ne  ^  ݝ@ACL@
@ABCjI  , Mo  ^  {p  ^  ݖ@@rO@ ?O@ ?2O@ ?@R@ ?R@ ?АAcJ@  , M  ^  ݍ  ^  ݕ@AA@@@  , Mư  ^  dp@@Al I@  , Lʰ  -  5  -  T@\U@ @ ?Q@ ?Awа@>-BCF@  , Lڰ    @@A~F@  , Lް  ܌  ܒ    @AA@@@  , L        @qA"sg&q@@ @ ?,@  t  ܆  t  ܈@@@@E@@ABCE@  , L@AE@  , L  ܌  ܳ  ܌  @@AE@  , L#@AE@  , L  F  L  F  s@AA@ @@  , L  F  W@	@@P@ ?AQ@ ?Q"B!p%u!t@@ @ ?)@  3  A  3  B@@@E@@A@BCE@  , Lt&#@8A!E@  , LP(    *=@@<A
rO@ ?'@,@@(@@AB
D@  , LH2    !.@@FA8/@@A@BC@  , L89@KA>9$:@
@=8@%@AD@@"@AB D@  , L$D@VA?CA  , LH    ]AA\@E(@B&
B  , LO  ɐ  ɖ  ɐ  @A;Printtyp.tree_of_class_typeA@NM@@  , KU  ɐ  ɫ  ɐ  @tO@ *C#scht@%  A  \&  A  _@@iX&paramstO@ )>@-  A  `.  A  f@@qY!ly)arg_label@@ @ )X@9    :    @@}v"ty@@ @ )Y@C    D    @@w#ctyu@@ @ )Z@M    N     @@x#lab
@@ @ -6Q@ ,@Y  %  /Z  %  2@@y"tr
z6@@ @ -Q@ -=@e
  ȇ  ȑf
  ȇ  ȓ@@z@'D@@A>F@@!G@@A[
A@@BCLB@@VC@@AH@@>E@@ABD@B@@A{H@@B|?F@@|uE@@ACzI@@D@@AxL@@BDuM@@C@@AzJ@@Bz#K@@{G@@ACE@u@@@@AH@  , K@A|.H@  , Kٰ  k  w  k  Ɍ@=R@ -B۰7.@,@*@ABD)G@  , K
@AG@  , K  E  U  E  j@@A@e`H@@AE@BDCC>D7H@  , Kh  "  /  "  D@VB$path
~@@ @ -g@
    
    @@{"ty
@@ @ -m@
    
    @@|
@eJeI*@Am@BlkCf@"L@@Af@Kf@ABDeML@  , KP".@A)L@  , KH$
    
    @~9@@R@ -S@ -ېB5)L@  , K40@A7+!L@  , J2  ȳ    ȳ  @@@R@ -^ @ -XA7\G@  , J>  ȳ  ȼV@@A;`G@  , JB  Ȗ  Ƞ  Ȗ  ȭ@~W@@Q@ -LR@ -GAGlG@  , JpN
  ȇ  ȍ@@AKpG@  , JdR  5  {  5  }@@AP@@ABwCF@  , J\[  5  d  5  u@
A[F@  , JLb@A]
F@  , JDd$  5  Q%  5  ^@@@R@ -R@ -*S@ -%AkF@  , J$r2  %  +#@@"AoFC  , Ix8    9    @A)A@vu@@  , I}=    >    @zvD@@P@ ,@@P@ ,P@ ,9A6$sign/class_signature@@ @ )S@^    _    @@_#styG@@ @ *WQ@ *M@j    k    @@`'self_tye{L@@ @ *wQ@ *q@@ @ *rQ@ *`@|    )}    0@@a&fields.Q.N@@ @ *ՠ.K@@ @ *֠{q@@ @ *@ @ *@@ @ *Q@ *@  Ĳ  Ľ  Ĳ  @@b$csil
  @ *@@ @ *Q@ *@        #@@c$csil
v@@ @ +*Q@ +"@@ @ +&Q@ *@  ,  6  ,  :@@d(all_vars
l$Vars#key@@ @ +Q@ +{,mutable_flag@@ @ +Q@ +{,virtual_flag@@ @ +Q@ +@@ @ +Q@ +@ @ +Q@ +@@ @ +Q@ +W@        @@.h(all_vars

y1@@ @ +٠+@@ @ +ڠ&@@ @ +۠@@ @ +@ @ +Q@ +@@ @ +Q@ +@  Ɓ  Ƌ  Ɓ  Ɠ@@On$csil
w@@ @ ,Q@ ,@@ @ ,Q@ +@  ƫ  Ƶ  ƫ  ƹ@@ao$csil
w&@@ @ ,@@ @ ,Q@ ,r@-  x  ǂ.  x  ǆ@@qul@fG@@KLK@@ABN/MJI@@H@@A@@ABC@F@@AD@@E@@ABDN@  , I@<ANA  , IR  ǉ  ǑS  ǉ  @ACC	%CDM  , I\  ǉ  Ǡ]  ǉ  @@Ơwb@@R@ ,@@R@ ,@wZ@@R@ ,w@@R@ , @@R@ ,@R@ ,@R@ ,@R@ ,gB-$O@  , I|  x  ~D@@lA1(MA  , I°  Ƽ     W  n@AsC8UJGCCDL  , I̰      B  V@A	!Printtyp.tree_of_class_type.(fun)A@@@  , IpҰ  ƫ  ƱZ@@AFLA  , Ilذ  Ɓ  Ɩ  Ɓ  Ƨ@AAMװ@k@g@ABb_C*[D&K
  , I\  Ɓ  Ƈl@@AW
KA  , IX        4@AC^@~@AtpBAnC<mD8 J
  , I@        "@A*A@@@  , I(    @@AmJA  , I$  =  E  Ś  @ACt BWCRDN6I  , I  T  ^  T  ř@A@A@
	@@  , I   Ś  ũ@|@@Q@ +,Q@ +|@@Q@ +-Q@ +@Q@ +Q@ *@@R@ +
R@ +TR@ +KڐA((I@  , H/  ,  2@@A,,I@  , H3    @@A0@@@ABCDgH@  , H<        @|I@@ @ *Q@ *@ @ *Q@ *AG@@A@BC}F@  , HR    @/@@R@ *R@ *S@ *
AXF@  , H_  Ĳ  ĸ@@A\F@  , Hc#  ė  Ĥ$  ė  Ĩ@@Aa@@ABCE@  , Hl,  R  \-  R  Ė@AA@ji@@  , Hq1  R  a@A!A@nm@@  , Hu5  R  s6  R  Ĕ@N@  Y(BvE@  , H}=  R  ĉ@@@R@ *R@ *3A E@  , Ht@6A"E@  , HlJ  3  >K  3  L@@@Q@ *oR@ *jAA .E@  , H`V    %@@FA2EA  , H\\    ]    @AMAS@@@ABCD  , HHg    /@@WA	D5  , H4l  Ô  Üm  Ô  @A]A@@@  , H,q  Ô  ér  Ô  @@@P@ *
Q@ *hB`"p'#!t@@ @ )M@  t    t  @@Z#tyl}P@@ @ )O@@ @ )N@  t    t  @@[#ctyxX@@ @ )P@  t    t  @@\#sty2@@ @ )oQ@ )e@        ¢@@])namespaceB@@ @ *Q@ )@  W  c  W  l@@^@'D@@H@@ABFF@@U@ACS@R@A$G@@?E@@ABDQ9I@  , H  Ô    Ô  @}q}@@P@ *@@P@ *P@ *;ʐBbH@  , Hs@Ad!HA  , H#  W  o  W  Ð@AԐAk"@)@A&%Bw$CpXG  , G.  W  _@@At+	G@  , G2  "  *  "  K@@Ay0G@  , G7        @r@@R@ )R@ )S@ )B>G@  , GE  ¼    ¼  @@@Q@ )Q@ )R@ )BL*G@  , GS  ¼    ¼  @~@@Q@ )AV4H@  , G]  ¼  @@
AZ8GA  , G|c#    ¥$    ¸@AAb@@@`@ABCF  , Gln.    @@Ak	F  , G8s#AA"@o'@@ABC  , G$z:  T  v;  T  Ř@AA@xw@@  , G?  T  Ő@AA@|{@@  , G	@A$csil
Q@ *@K  T  cL  T  g@@e#ty1
r@R  T  iS  T  l@@f#ty2
s@Y  T  nZ  T  q@@g@B@@A_
A@@D@@AC@@BC@@DA  , FA@@B@@B  , Fp    q    !@AA@@@  , Fu    @AA@@@  , F	@A.!l
@@ @ +@        @@i!m
Q@ +@        @@j!v
	Q@ +@        @@k!t
Q@ +@        @@l#all
Q@ +@        
@@m@A@@A1C@@)F@@AB_
B@@D@@'E@@ABC@@FA  , FA,@k@
@AB@@C  , F      B  U@A5A@@@  , F    A@A9A@@@  , F`
    ,    @@~@@R@ ,!S@ ,VDB$csil
Q@ +@        @@"p!l
@@Q@ ,iQ@ ,@        @@.q!m
L,mutable_flag@@Q@ ,1Q@ ,@        @@<r!v
0p@@Q@ ,CQ@ ,@        @@Hs!t
~@@Q@ ,WQ@ ,@        @@TtO@@B@@A8F@@.E@@AB`A
A@@C@@&D@@ABC@C@@B@@AB@G@  , FPhg@ATcFA  , F,lA@g@@A@B
@B  , Fr2    
3    @@@P@ (Q@ (;Printtyp.prepare_class_typeA&paramsz@C    D    @@J"ty@@ @ #@M    N    @@U#ctyz
@@ @ #@W    X    @@V@C@@A`A@@#B@@D@@ABC@XC@@AD@@zE@@B@@ABC@zA@@@AD@  , F ?q    ?@@8A6DC  , Ew    x    @A	!Printtyp.prepare_class_type.(fun)A@@@  , E}  ^  d~  ^  @ @@P@ %Q@ %KBL$sign5@@ @ #@  
    
  #@@O#styK@@ @ $Q@ $@  '  1  '  4@@P"pxG@@ @ $Q@ $@  o  y  o  {@@Q&fields2~2{@@ @ %q2x@@ @ %r@@ @ %s@ @ %p@@ @ %oQ@ %T@        @@R@j|F@@A"G@@q@ABn@2E@@AIC@@AD@@ABCqiG@  , E  ^  n  ^  @AaA@@@  , E`    @@AXG@  , E|!        T@:.@@ @ %tQ@ %U@ @ %XQ@ %nAi,@@A$CE@  , El6    0@2h@@R@ %uR@ %S@ %ŐAy<E@  , ETC    '@@A}@E@  , ELG        @AA@ED@@  , E8L    @@AIE@  , E0P        @@@P@ %RQ@ %!ސAU)E@  , E$\@AW+E@  , E^        @s@@Q@ %R@ %Bc7E@  , Ej*    N@@Ag;EA  , E p0  o  ~1  o  @AAoC@dcBCD  , Dz:  o  u^@@AwDA  , D@  '  7A  '  J@AAS@t@ABC  , DJ  '  -n@@AC٠  , DO    P    @@A"_p@@ @ #@\    ]    @@K#tylӠ"@@ @ #@@ @ #@j    k    
@@L#cty{*@@ @ #@t    u    @@M#sty5@@ @ #Q@ #@        !@@N@C@@A)@(@AE@@-D@@ABC( E@  , Dϰ        @@WA@E@  , D԰        @)@@R@ $4R@ $S@ $xdBNE@  , D        @@)type_expr@@S@ $$boolE@@S@ $@S@ $xAb0F@  , D`  k  x  k  @u@@S@ $@S@ $cT@ $SBp>E@  , D8  ;  D  ;  j@@@Q@ #Q@ $#R@ $B~LE@  , D(  ;  N  ;  Y@w@@Q@ $AVF@  , D  ;  A@@AZEA  , D"    $    7@AA!b@@^@ABC}D  , C-    @@A*	D|  , C2AA@.@@@ABB  , C9  ^    ^  @@@S@ %S@ %|5@@S@ %@@S@ %S@ %@T@ %T@ %T@ %A#met3@@Q@ %Q@ %Š|d@@Q@ %נ@@Q@ %@Q@ %Q@ %@*  ^  s+  ^  v@@nSi@A@@A@B@@A|C@@B@A@  , Cw7  ^  z8  ^  @@@&uA@  , C|<    =    @@A"ty@@P@ 'eP@ 'T@H    I    @@T@bsBbvA@@C@@AB@B@@A@CA  , CA@@@A@B  , C|`E    aE    @A6Printtyp.tree_of_labelA@@@  , CtfE    gE    @~O@ 	A>!lK~O@ R@rD    sD    @@@A@@A@mD@@C@@ABIJ@@E@@AC(K@@IB@@AF@@BI@@zG@@H@@ABCD@~ @@A~ @@~@@@# @@ABCC@  , CLװE    E    @~O@ :B1(A@  , C4@@=@3*A@  , C,;    ;    @A<Printtyp.tree_of_constructorA@@@  , C ;    ;    @O@ YA"cdBO@ @7  +  C7  +  E@@$nameC`@@ @ P@ @8  H  N8  H  R@@#argD@@@ @ P@ 3P@ @ @ P@ @9  l  r9  l  u@@@lD@@AC@@B-A@@'B@@AC@G@@F@@ABM@@rH@@ACN@@E@@ANI@@BL@@J@@K@@ABCD@K@@@Af @@#C@@ @@ABCE@  , C>\@YAP9(D@  , C@ B  u  {B  u  @A^A@>=@@  , BEB  u  B  u  @AcA@CB@@  , BJ
@eA`#resG@@ @ @<    <    @@X"nmHՠ@@ @ @@ @ @ @ @@ @ Q@ @+=    ,=    @@o#retI@@ @ NQ@ >@7?    %8?    (@@{$argsJQ@ Y@?@  G  Q@@  G  U@@~mj@
H@@ABk@k@A3F@@?E@@ G@@ABCDo[H@  , BQA  b  hQ@@AIHA  , BW@  G  XX@  G  ^@AAPD}iG
  , B`@  G  M`@@AWGA  , Bf?    +g?    C@AĐB^$#@"@ABCzF  , Bq?    !q@@Ag	F@  , Bu>    u@@Ak
F@  , By=    y@@An@@3@ABCE@  , B:    @@A@@ABC@  , BȰ9  l  v9  l  AA	 Printtyp.tree_of_constructor.argA@@@  , Bpΰ9  l  n@@A˰@BBA  , Blְ8  H  U8  H  h@AAհ@@AA
  , BT߰8  H  J@@@A@  , B@9  l  {@@@@@cFA@@A@C@@B@@AB@A@  , B85    5    )@A	&Printtyp.tree_of_constructor_argumentsA@@@  , B05    5    '@AA@@@  , B(5    
@_ߠ٠@P@ x@@P@ wP@ B!l@A"@@ @ @@@ @ ?@5    5    @@@B@@AdAA@@B@J@@I@@ABP@@tK@@ACQ@@H@@APL@@BO@@M@@N@@ABCD@MC@@Ah@@@%F@@ @@ABCC@  , B@N@KA3;$BB  , AD4    4    @@RAؠ!l?A=@@ @ ;@@ @ :@4    4    @@VQ@B@@A:@B8$B  , A]3    k@Aj@Z@A@A?+A!  , Ad$+    %1  n  @A:Printtyp.tree_of_type_declA@cb@@  , Aj*/    +/    M@.Type_immediacy!t@@P@ Q@ A"id
/@I     J    @@$decl
0O@  :@R    S    @@&params
1
@@ @  c@@ @  bP@  T@b  &  ,c  &  2@@+ty_manifest
5]@@ @ P@  @@ @  P@  @t    u    @@*type_param
S@U@@ @ P@ }@@ @ P@ @ @ P@ @  Q  W  Q  a@@͠,type_defined
W@@@ @ P@ ba@@ @ P@ Y}@@ @ *P@ ~@@ @ S~@@ @ T@ @ RP@ @ @  P@ @@ @ 
P@ @ @ P@ @ @ P@ @        @@Ϡ0tree_of_manifest@@@ @ P@ \P@ ]@ @ ^P@ [@        @@ߠ$nameb@@ @ P@ @  p  w  p  {@@$$argsC~(@@ @ ݠ~A@@ @ ߠ~?@@ @ @ @ @ @ @@ @ P@ @  p  }  p  @@B+constraintsk@@ @ @@ @ @ @ @@ @ P@ @        @@Y"ty@@ @ tP@ @!    "    @@e$priv,private_flag@@ @ wP@ @/    0    @@s'unboxedI@@ @ zP@ @;    <    @@z@nH@@AbI@@GK@@AA@@BCB@@wJ@@AC@@.M@@AG@@=L@@ABCD@@F@@AE@@*N@@ABDE@QM@@L@@AB-S@@N@@ACT@@-K@@AO@@BcR@@^P@@Q@@ABCD@F@@AC@@I@@@@@ABCP@  , AxW@TAB<N@  , AL}    ~    ;@eP@ \AJ%cstrs@@ @ ,@@ @ +@        @@#rep96variant_representation@@ @ -@        @@ܰ@oUOe@Ac@b@A%Q@@c@ABCba_@S@@AP@@a@ABC^][@R@@ABDE[GS@  , A@    =@AA@@@  , A8        :@a,@R@ @@R@ R@ BK
.S@  , AT!  X  w@@AO2@'@A@BC@BDE}iQ@  , @#    #    @P@ 'A$lblsn@@ @ ?@@ @ >@"  x  "  x  @@4#rep5record_representation@@ @ @@"  x  "  x  @@@;_C@#Q@@A@B@S@@AP@@@ABC@R@@ABDES@  , @T#    8@AA@QP@@  , @X#    #    @\<O@ 37O@ 42O@ 5@R@ 2@@R@ 1R@ GBHf+S@  , @m-%    1.%    6@@	AMk0/@*@A@BC]DEQ@  , @tx8%    %9%    )@@AXvQ@  , @X}a=%    7@@A\zQ@  , @A'  K  SB'  K  m@)P@  AH @*Q@@A@BC@ P@@ABDEQ@  , ?V)    @@1AX
@
@ABCD O@  , ?_  @  R`  @  p@@;A&
O@  , ?|d    e    @LP@ CB0"ty@@ @ h@r  q  s  q  @@v.-+@XR@@A+@P@@ABC*)'@PQ@@ABDE'R@  , ?\ư"    @@aAð@?=@:BC7DE0P@  , ?<ϰ    #    @@kAV:O@  , ?԰    p@@oAZѰWN>D;'KA  , ?ܰ        @AxAc۰b_@\@AB[JCODH4J
  , >    @@Am
J@  , >  p    p  @ڠ@ @ P@ Ax@r@Aq@m`BCfD_KG@  , >  p  r@@A	G@  , >      -  jAA	+Printtyp.tree_of_type_decl.tree_of_manifestA@ @@  , >    @@A@@ABxCq]F@  , >    
    AA	'Printtyp.tree_of_type_decl.type_definedA@@@  , >    @@A @@ABCkE@  , >  d  h    @A	%Printtyp.tree_of_type_decl.type_paramA@@@  , >$  Q  S@@A!.@@@ABCyD@  , >,  T  Z    @q@@O@ P@ ]P@ sАB%cstrs
;tK@@ @ 1@@ @ 0@  2  D  2  I@@HǠ$_rep
<s@@ @ 2@  2  K  2  O@@RM@pE@@AF@@@AB2CF@  , >p\  d  l    @A	 Printtyp.tree_of_type_decl.(fun)A@[Z@@  , >Tb6@A*]F@  , >8d$    	%    4@8P@ wB!l
=HS@@ @ D@@ @ C@7    8    @@{ʠ$_rep
>G@@ @ E@A    B    @@@3@A @B@F@@AcBCF@  , >(N    O    2@A2A@@@  , >/@,A(F@  , =U  5  FV  5  H@@1ArCE@  , =\    /]    1@@8AE@  , =a    =@@<A!}D@  , =e     .f     2@@AA%@qD@@A%@B$@ @ACD@  , =q    r    @AMA@@@  , =v    w    @@@Q@ R@ XA?"ty
6A@@ @  @  3  >  3  @@@ "ty
7@@@ @ zR@  @  D  P  D  R@@Ӱ0P@L@FE@@ABCB.F@  , =+/@@{A"
F@  , =        @@A&@q[FB@Ae@Bd@`@@ABCS?F@  , =d        @@A6#row
8w@@ @ @        @@Ġ#row
9(row_desc@@ @ T@ @        @@
@qJqG.@A@B@@AI'H@@A@ABCnJ@  , =!  H  X  H  @TA2#id'
:@@ @ A@    &    )@@1,@qLqK(@A@B@M@@A@B$!CDM@  , =A  H  a @AA@>=@@  , <E  H  k  H  @AA@CB@@  , <J)@A$EM@  , <L    3
    D@a@@T@ oU@ hB0Q%M@  , <X@A2S'M@  , <TZ        @@AhX@K@A@BHCIA  , <Pe%    &    @AAsdRONBCH  , <@o/    @@
A{lH@  , ;s3    4    @Sv@@ @  AvCE@  , ;?  D  L@@A|E@  , ;C    D    @@@O@  P@  %B
BC@  , ;Q    @o.@@P@  P@  @@Q@  Q@  Q@  :BC@  , ;pd    e    @@@O@  P@  rFB+!C@  , ;Tp  u  wq  u  @@@O@  ^P@  KRB7-C@  , ;8W@@VA:0C@  , ;,  ^  j  ^  l@@[A?@r6D@@A?@B>C+D@  , ;ʰ      O  ]@
@@O@  7P@  lBS"ty
2U@@ @  z@  ~    ~  @@$vars
3:q)type_expr@@ @  @@ @  R@  @        @@1k@h@A"E@@F@@ABC]IF@  , ;      :  N@AA@@@  , :7@A-FA  , :        @AB4G@}@@ABCp\E  , :    F@@A=
	E@  , :  X  Z@@ACA  , :  &  5  &  S@AA@@@ABpB  , :$    
    #@g@@O@  SP@  KƐA)B@  , :0@@@,B@  , :3  :  K  :  M@@Ab1@"ty
4A@@A@]B@@A@AB  , :TA        9@@AqA)type_expr@@Q@  Q@  @
        @@QL@rDrCrB@@A$@B!@D@  , :L^        @s@@S@  T@  B$cD@  , :4j*    )@@
A(gD/  , 9osA@j9A2  , 9r2    3    1@@@!l
R[@@Q@ Q@ j@>    ?    @@}@A@@A@B@@A@A@  , 9`I  v  J  v  @@@R@ S@ 3A\!c
?@@Q@ VQ@ f@\  d  q]  d  r@@@A@@A@B@@AC@@B@A@  , 9P i    @@L@A@  , 9@m    @@A.@@i
VA@@A@@AB  , 98z  q  {  q  @@A"id
U@@ @ @  q    q  @@ð@B@@A@B@@B  , 8A@ A  , 8Ұ  k  o@AA@@@  , 8ְ  k  p  k  }@ǐA^@$decl
Y@    @@Р%abstr
Z@@ @ QQ@ @        @@Ѡ$vari
^
@@ @ Q@ 
@@ @ Q@ @ @ Q@ Q@@ @ fQ@ K@  L  T  L  X@@@-B@@A4A@@$C@@AB@C@@AD@@B@@AgE@@BC@D@  , 8!    
    @?CK!C@  , 8(        @A	-Printtyp.tree_of_type_decl.type_defined.(fun)A@'&@@  , 8.\@AS)CA  , 82  [  a	  8  c@A"CZ1&$@B!@B
  , 8t;  k  s    7@AA@98@@  , 8P@   L  P0@@/Af=B@  , 84D        @@@S@ S@ T@ <Bu#tll
[c@@ @ ,@@ @ +@        @@`Ҡ$_rep
\@@ @ -@&    '    @@je@sB@@A[@C@@ABZ@C@  , 8$s3    4    @AKA@qp@@  , 7x8    4@@gA*uC@  , 7|<  a  k=  a  @@lAzm@Bj@B@  , 7C  !  +D  !  D@@sAB@  , 7H    I    G@@xAB@  , 7dM    }@@|@@}@Az@A@  , 7LS    T    @@k@G"cd
]@@S@ S@ @_    `    @@@A@@A@@A@  , 7<h    i    6@@AҠ"ty
_@@Q@ Q@ U@v  k  xw  k  z@@֠!v
`@@Q@ Q@ s@  k  {  k  |@@נ&is_var
a$boolE@@ @ S@ z@        @@а@C@@A,B@@"A@@AB@C@@B@@AB@C@  , 74  n  z    @AA@@@  , 7(        @@AB#inj
b@@ @ S@ @        @@٠"co
cL:@@ @ S@ @  ;  L  ;  N@@ڠ"cn
dLG@@ @ S@ @  ;  P  ;  R@@@tE@@AF@@#G@@AB0D@@G@AFEBCC@H@  , 7!        @@A:H@  , 7&    ?@@A>#H@  , 7*  n    n  @@AC(H@  , 6/        
@@AH-G@  , 64        @@AM2$G@  , 69W@AO4&G@  , 6;  ;  V  ;  j@H<@ @ S@ AA@.@Ar@BqpCn@D@  , 6L   Z  r
   Z  v@@$AJ@tD@@A}@B|{Cy@D@  , 6W        :@4@@W@ W@ XX@ A7B"ty@@ @ @*  w  +  w  @@ni
EC@E@  , 6t4    $@t)type_expr@@X@ BX@ VY@ QUA|E@  , 6XC    ,@@ZA"E@  , 6,G    H    *@5@@U@  U@ V@ JgBC@  , 5U    @@lAC@  , 5Y    @@pACA  , 5_    `    @AwA@@A@B@B  , 5i    
@3@@T@ T@ U@ AB@  , 5v    @@@B@  , 5z    {    @AA@@@  , 5    @A"tyh@@P@ <P@ @        @@ݠ$cocnP@ @        @@԰@A@@B@@AB@B@@A*C@@B@C@  , 5    &@@@R@ +R@ DS@ ;ÐB,C@  , 57@@.B@  , 5h    )    ,@@Ax@#ty1@    @@ @	A@@A@B@@AaC@@B@A@  , 5`	  -  >@AA@@@  , 5X
  -  M  -  d@@@Q@ R@ B""ty@@ @ t@  -  8  -  :@@"@B@@A$@B#@C@  , 5H(@#A#B@  , 50*     (@@'@6',A@  , 5(.r  +  1r  +  ;@A:Printtyp.tree_of_typfieldsA@-,@@  , 54@A#sch	@i  !  7i  !  :@@>$rest	DO@  @i  !  ;i  !  ?@@F$rest	JQ@  @@ @  Q@  @k  U  _k  U  c@@UP@l=	A@@ADB@@(C@@AB@CN@@A P@@ME@@ABF@@K@@dM@@ABC7O@@D@@AQ@@BJ@@G@@A(H@@BCI@@=R@@AL@@C@@tB@@ABCDE@ @@A @@7 @@AB{@@@ @@A @@BCD@  , 5Om    Pm    @AaA@@@  , 5Tm    @fBc@vD@@AF@BBAC?D@  , 4@oAkD@  , 4bn    cn    @@tAp
D@  , 4go    ho    @@yAuD@  , 4lp    mp    !@gQ@  A~D@  , 4	@AD@  , 4twk  U  [@@Ad_^B\:CB  , 4lv    v    @AA@@@  , 4dİv    v    @AA@@@  , 4T
@A!s	O@  @s  <  As  <  B@@!t	O@  @s  <  Ds  <  E@@!l	O@  @@ @  @s  <  Js  <  K@@%field	$O@  ]Q@  ^@ @  _Q@  \@t  O  Yt  O  ^@@&fields	Q@  m@u  ~  u  ~  @@$rest	Q@  n@u  ~  u  ~  @@	@vIvE@@A+H@@K@@AB;D@@@ACJ@SG@@A@LF@@ABDK@  , 4@&u  ~  u  ~  @.'@ @  qQ@  Cf,@@@ABCDH@  , 408u  ~  y@@	Ao5	H@  , 4,<t  O  at  O  z@AA@:9@@  , 4 At  O  et  O  y@BzA@4@A/.B+CG@  , 4Lt  O  U@@AIG  , 3QAA!@MC  , 3Ug    g    @@@Q@  hQ@  vR@  r3Printtyp.is_non_genA#sch	R@'f    (f    @@k}"ty	qO@  =@/f    0f    @@s~n@B@@A
A@@B@\Q@@AS@@fH@@AB!I@@N@@}P@@ABCPR@@G@@AT@@B	M@@J@@AAK@@BC,L@@VU@@AO@@F@@E@@ABCDE@@@@A* @@P @@ABC@@ @@A @@BCB@  , 3hg    ig    @@K@I8B@  , 3xm[    n[    @A:Printtyp.tree_of_typobjectA@@@  , 3l@A:#sch	dO@  @}J  B  X~J  B  [@@e"fi	O@  @J  B  \J  B  ^@@f"nm	O@  @J  B  _J  B  a@@g)pr_fields	@?@@ @  <Q@  @ @  Q@  @ @  Q@  @M    M    @@h&fields	O@  (@Z  ]  hZ  ]  n@@t$rest	O@  )@Z  ]  pZ  ]  t@@u@wmE@@A?B@@G@@AB9A@@3D@@AF@@PC@@ABC@T@@AV@@K@@ABL@@oQ@@S@@ABCU@@=J@@AW@@BP@@M@@AN@@BCO@@X@@AlR@@KI@@H@@ABCDE@<C@@A @@ @@AB%F@@ @@Ap@@@BCG@  , 3X9Z  ]  xZ  ]  @VO@ @  ,Q@  6A?@H@AE@D@AA@BC@D@  , 3PKZ  ]  c@@AH	D@  , 3LOM    Y  )  YAA	$Printtyp.tree_of_typobject.pr_fieldsA@NM@@  , 34UM    @@ARW@R@ABQ/C@  , 3\c    c    @@AZ@wEwD@@Ai@BfC_=E@  , 3j*a  _  e+a  _  @AA@hg@@  , 3o/a  _  z0a  _  @q@@P@  Q@  ȐBʠ!p	O@  @E\    F\    @@v"ty	O@  @N\    O\    @@w#tyl	4@@ @  
@Y\    Z\    @@x'non_gen	Q@  R@a]    b]    @@y$args	Q@  k@i^    j^    @@z"p'	Q@  y@r_     +s_     -@@{!s	@@ @  Q@  z@~_     /_     0@@|@x7Kg@A&J@@@AB@1I@@ACOH@@&M@@AL@@B@MG@@FF@@ABCDN@  , 2p@*AaM@  , 2ܰ`  H  N`  H  ]@@@P@  Q@  5Bm$M@  , 2}@@9Ap'M@  , 2_     4_     D@D<@ @  }Q@  EA{@@A0/B0.@@AB('CDJ@  , 2_     &@@QAJA  , 2^    ^    @AXB	DI
  , 2^    @@`AIA  , 2]    ]    @AgB@O@A@BHGCDH
  , 2x ]    @(O@  S@  evA"H@  , 2h)]    @@{A&H@  , 2$-K  d  fd    @@@z+C@  , 22Y  )  1@@Af@"fi	e@M    @@Bi&fields	@Ӡ@@@ @  8@@@ @  9@@ @  :@ @  7@@ @  6R@  @N    N    @@]j$rest	c@@ @  ;R@  @%N    &N    @@ik.present_fields	@@@ @  R@  @@ @  R@  @ @  R@  @@ @  R@  @@BO    CO    @@l-sorted_fields	q@@ @  R@  ʠ9@@ @  R@  @ @  R@  @@ @  R@  @_V    `V    @@q@yB@@AnA@@jD@@ABDE@@RC@@+F@@ABC@C@@B@@AB@FA  , 2 yW    zX    %@AjB@@ABC@E  , 1İX    X    @A	*Printtyp.tree_of_typobject.pr_fields.(fun)A@@@  , 1ʰV    {@@zAEA  , 1аP    U    @ACϰ0-@-@A*@BC'@D  , 1۰Q    T  }  @AA@@@  , 1O    @@AD@  , 1N    N    @@ @  R@  5A@H@A@@A@  , 1N    @@@A@  , 1T  }  T  }  @@3AȠ!n	R@  ]@Q    Q    @@m!k	@@R@  zR@  ^@Q    Q    @@n!t	R@  _@Q     Q    !@@o!l	R@  h@Q    #Q    $@@#p@yF@@A$D@@BA@@0E@@Ap	B@@ C@@ABC@@F@  , 1|4S  T  qS  T  |@ApA@21@@  , 1t9S  T  w@AtA@65@@  , 1`=	@vAC8F@  , 1D?R  (  = R  (  N@F@@ @  yAMB@"@A!BC@@E@  , 14M
R  (  7V@@AUJEA  , 1SxA@N@+@(@AB@@B  , 0YX    X    @@A)!n	@!X    "X    @@er"n'	R@  @*X    +X    @@nsi@D@@AC@@pY	Bp\	A@@AB@@DA  , 0}A@Hx@@A@@B  , 0BH    (CH    <@@O@  "O@  O@  @P@  8Printtyp.tree_of_typlistA#sch	<O@  @UG    VG    @@c#tyl	O@  @^G    _G    @@d@B@@AA@@B@W@@AHY@@N@@ABPO@@
T@@V@@ABCX@@M@@AAZ@@B8S@@AP@@ApQ@@BC[R@@[@@A
U@@L@@K@@ABCDE@F@@AY @@ @@ABI@@&@@@AC@@BCC@  , 0װH    H    @@@M@K8B@  , 0ܰ?    ?    @A:Printtyp.tree_of_row_fieldA@@@  , 0x@Af#sch	@=  K  a=  K  d@@]!l	mO@  @=  K  f=  K  g@@^!f	mO@  @=  K  i=  K  j@@_@zrE@@AC@@D@@ABp	A@@&B@@AC@Z@@A\@@Q@@ABR@@qW@@Y@@ABC[@@?P@@A]@@BV@@S@@AT@@BCU@@^@@AnX@@MO@@ N@@ABCDE@>I@@A@@@ @@AB'L@@C@@ArF@@BCE@  , 0p;D    D    @A_A@98@@  , 0`@ D    D    @O@  fBf!c	R@@ @  @A    A    @@Ra#tyl	R@@ @  @@ @  @A    A    @@`b[@a@F@@ABaa_@]@G@@ABCD^<G@  , 0Pk0@A%fG@  , 0Hm-C  j  u.C  j  @AA@kj@@  , 08r2C  j  3C  j  @2B1rG@  , 0(y@A3tG@  , 0 {;B  $  *@@@A7xG@  , /?@    @@    @AA@}|@@  , /D@    E@    @AA@@@  , /I@    J@    @#O@  B"ty	@@ @  @V@    W@    @@`@{F@AB@@G@@ABCwH@  , /'@AG@  , /dhE    iE    @AA@@@  , /P@AE@  , /8o>  n  vp>  n  @R@@ @  אA@BCD@  , /(|>  n  p@@ADA  , /°AA@D@BB  , .Ȱ;  9  @;  9  I@@7Printtyp.tree_of_typexpAR#sch	|@~Y~p~Y~s@@%"ty	{O@  @~Y~t~Y~v@@&"ty	\@@ @  P@  @~y~~y~@@'"px	R@@ @  P@  @~~~~@@(&pr_typ	@@@ @  P@  P@  @ @  P@  @x~x@@	+@E@@A#D@@B?B@@2C<A@@AC@]@@A_@@T@@ABU@@zZ@@\@@ABC^@@HS@@A`@@BY@@V@@AW@@BCX@@a@@Aw[@@VR@@)Q@@ABCDE@GL@@AC@@@@@AB0O@@F@@A{I@@BCE@  , .D:     :     4@A|A@BA@@  , .I	:     
:     @O@  AJFF@  , .Q:     :     3@fN@  jBRNE@  , .Y9    9    @@@O@  RP@  FA^ZE@  , .e%8    &:     8@@Ac_E@  , .j*8    +8    @G@@P@  P@  9Q@  4AqmE@  , .x88    98    @&@@P@  P@  *Q@  %A{E@  , .F8    @@AE@  , .xJ7  l  K7  l  @~}@@P@  @@P@  P@  ̐BE@  , .hZ7  l  [7  l  @@@@R@  @@R@  @R@  ܐAF@  , .dj7  l  k7  l  @AA@@@  , .Do7  l  %@@AE@  , .<s7  l  qt7  l  @@@P@  Q@  BE@  , .$7  l  n@@AE@  , .ðx5  2  fAA>Printtyp.tree_of_typexp.pr_typA@@@  , -|ɰxz@@ Aư@@ABD@  , -tаY\Yq@AA@@@  , -h@
A
$mark	O@  x@~~~~@@)$name	P@  @

@@*@E@@AF@@@ABCFA  , -d

U@A*B @@A@BCE  , -P
I
Q@@5A*
F@  , -H
3
C@@@@ @  @@ @  @ @  CA9
F@  , -8@FA;F@  , -,

C@@JA?EA  , -(~~~@AQBPRD  , - ~~P@@WAUWD@  , -$~~~~@@@Q@  QQ@  sR@  `dBc+eD@  , ,2~~~~@@@P@  P@  FQ@  /rBq9sD@  , ,@ ~~x@@wAu=wDA  , ,F~~~~@A~A|E@>@A<@B9C  , ,P~~@@AMCA  , ,V~y~~y~@AAUI@BH&B
  , ,_~y~{@@@\B@  , ,lc#  X  `$  X  }@@An@d@|B@@AsS	A@@B@SL@@\E@@ABF@@rK@@AS@@D@@AM@@BCDI@@5G@@A H@@BHN@@V@@J@@ABCT@@C@@AB@@P@@ABCO@@Q@@AR@@U@@ABCDE@B@  , ,d\5  2  :@AA@@@  , ,\`5  2  Ga5  2  a@@@R@   S@  BG!p	!t@@ @  h@v.  d  tw.  d  u@@X"fl	)Longident!t@@ @  kI@@ @  l@ @  j@@ @  i@.  d  w.  d  y@@Y"fl	Rh@@ @  S@  S@  @ @  S@  @@ @  S@  @/  ~  /  ~  @@Z@@AE;C@@KD@@A@BC@F@  , ,L^@4APEA  , ,H0    4    .@A;BWC@D
  , ,81    4    +@A	$Printtyp.tree_of_typexp.pr_typ.(fun)A@@@  , ,
/  ~  J@@IAd

D@  , +  L  T  L  i@@NA"ty	@@ @  F@  4  A  4  C@@Q@}D@A@C@@AB@D@  , +)*    *    @@fA̠"ty	@@ @  T@  j  w  j  y@@<R#tyl	(@@ @  V@@ @  U@  j  {  j  ~@@JS#tyl	Ǡ_S@@ @  {S@  c@@ @  pS@  ^@   
     
  @@\T+old_delayed	ON@@ @  @@ @  S@  @("  n  |)"  n  @@lU"tl	S@  @@ @  S@  @6&  )  77&  )  9@@zV"tr	@@ @  S@  @B'  d  rC'  d  t@@W@g@/H@@AB@"I@@J@@AB_El@JGZF@@ACD&@J@  , +X)    Y)    @@@R@  FS@  =ېAvJ@  , +z@@AyJ@  , +g'  d  wh'  d  @AA@@@  , +l'  d  m'  d  @FO@  B,F@)@A&$BCF@I@  , +x'  d  n@@AIA  , +~&  )  <&  )  `@AB<V@53BCU@H  , +Ȱ&  )  E&  )  \@@_@@T@  
N@  N@  #N@  @T@  AI@  , +tٰ%    %    '@@@R@  S@  B!H@  , +\@@ A$H@  , +L!  4  h+    @@%A)C}@G@  , +0!  4  M!  4  b@@,AG@  , +$!  4  <@@0AGA  , +    
     
  0@A7B@q@m@ABC@F  , +   
  @@AA	F@  , *	-  1  9-  1  c@AFA@@@  , *-  1  J-  1  b@=LBB@  , *@OAB@  , *        @ATA@@@  , *        @AYA@@@  , *x!
@[Aà#row	@@ @  @        @@3<#row	
2@@ @  S@  @        @@?=&fields	@@ @  CS@  @@ @  2S@  @ @  S@  @@ @  S@  @  '  3  '  9@@]>'present	@@ @  S@  k@@ @  ~S@  l@ @  mS@  U@@ @  cS@  P@6    7    @@z@+all_present	n@@ @  S@  @B    C    @@B'non_gen	t@@ @  6T@  &@N
    O
    @@L&fields	
 @ @  T@  t@@ @  T@  o@b    c    @@M$tags	](1@@ @  T@  @@ @  T@  @@ @  T@  @z
  E  U{
  E  Y@@N@2HY@ALG@@6JE@@FI@@ABC^@rF@@ADC@@.K@@ABDd@K@  , *tְ  \    \  @AA@@@  , *l۰  \  @.Bڰ!s@BDr@J@  , *\  \    \  @A!A@@@  , *H@#A
J@  , *<  \  ~  \  @@(AJ@  , *4
  E  Q@@,AJA  , *0        A@A3B<8@54BCD@I  , *     #    :@@usk@U@  @U@  FAJ@  , *    
@@KAI@  , *        @O@  7O@  lO@  	VB_[@X@AB@C@H@  , )#
    @@_A H@  , )'  =  K  =  @AdA@%$@@  , ),  =  b  =  v@AiA@*)@@  , )1
@kA!p	!t@@ @  @    #    $@@GC#tyl	@@ @  @@ @  @    &    )@@VD"p'	@@ @  7T@  &@  C  T  C  V@@bE!s	@@ @  8T@  '@*  C  X+  C  Y@@nF"id	o@@ @  ST@  C@6  q  7  q  @@zG$args	T@  `@>    ?    @@H+out_variant	T@  @F     G     @@I'non_gen	T@  @N    O    @@J$tags	I@@ @  T@  @@ @  T@  @@ @  T@  @f    g    @@K@L"I@A@=P@@AB@MO@@A2R@@<Q@@ABK@@kN@@ACDS@cM@@A4S@@J@@ABCEX@S@  , )ʰ        9@AA@@@  , )ϰ    #@6Bΰ)g	@@A@BCEh@R@  , )xڰ    -    0@AA@@@  , )`@AR@  , )T        @@AR@  , )L    @@"ARA  , )D        @A)BF*@;@9@AB87CD!E@Q  , )(    @@5AQ@  , )  {    {  @@:AQ@  , )   I  U@@>AQ@  , (    /    E@ACA@@@  , (@EAaE@V@ARQBC;D@P@  , (        )@O@  O@  SAP@  , (
@VAP@  , (        @3@@T@  U@  aA#P@  , (*     @@fA'!PA  , (0        @AmB/s@Bo*CcD@O  , (;    @O@  xzB<
O@  , (C    @@A@OA  , (I	  q  
  q  @ABH@@ABC}D@N
  , (U  q  }.@@A!R
N@  , (lY  C  ]  C  m@	@ @  *T@  6A,_@@A@@@ABC@@ABD@K@  , (\n.  C  OG@@A8kK@  , (Tr2    03    ?@@@S@  #T@  ADwK@  , (H~@AFyK@  , (@    A    @@A_~@@AgBC@G@  , (I    J    @X@@S@  ʐAl@(@@AB'C%@G@  , 'W    X    @U@  אAy
F@  , '`     @@A}FA  , 'f    g    @AB>@@AC=@E  , 'p    q  u  @AA@@@  , 'u    5@@A
E@  , 'y    z    @@ASPBN@D@  , '  ]  i    @B	D@  , 'ǰ  ]  u  ]  @AA@@@  , '@AD@  , 'ΰ  '  /N@@
ADA  , '|԰        #@AAӰol@
@ABk@C  , 'lް    
^@@AC@  , 'P        @@A|B@  , '4        3@@$AB@  , '    "    >@@)A"fi	p@@ @  @          @@O"nm	#ref)i!t@@ @  )@@ @  @@ @  @ @  @@ @  @@ @  @          @@P@@1D@@AB(C@@@AC@D@  , &&        @AcA@$#@@  , &+        @-@@R@  S@  nBՠ!p	@@ @  @        @@E6#tyl	A	@@ @  @@ @  @        @@S7'_abbrev	Y#ref@@ @  @@ @  @         @@c8"p'	@@ @  .S@  @+  	  ,  	  @@o9!s	@@ @  /S@  @7  	  8  	  @@{:$tyl'	@@ @  NS@  ?@@ @  IS@  :@I  1  =J  1  A@@;@|E(@AZD@@4G@@AB)@+F@@AVC@@"H@@ABC-@I@  , &_    `    @O@  
ސBpH@  , &@ArH@  , &i  Y  j  Y  @'S@  A{#H@  , &r  Y  	@@A'H@  , &v  Y  dw  Y  l@d@@S@  cS@  rT@  mA5H@  , &xİ  Y  a@@ A9HA  , &tʰ  1  D  1  U@ABɰAb97@BCa@G  , &d԰  1  9@@AG@  , &Pذ  	    	  -@{p@ @  !S@  -Aް@z@S@ABy@N@ACx@D@  , &D  	  @@&A	D@  , &(        @A+A@@@  , &     @40B#tyl	Az@@ @  @@ @  @        @@5@C@@AB@C@  , &@FAC@  , %  q  y  q  @AKA@@@  , %  q    q  @O@  RB!l	)arg_label@@ @  @        @@*.#ty1	@@ @  @        @@4/#ty2	@@ @  @        @@>0#lab	@@ @  S@  @        @@J1"t1	O@   @  D  P  D  R@@R2M@@A9E@@F@@AB@G@@A3D@@+C@@ABC@G@  , %aS@AH\G@  , %c#  H  W$  H  m@O@  BOd@@A@BC@F@  , %o@AUjF@  , %q1    22    G@@AZo@uG@A%$B
C@G@  , %P}=    	>    @6O@  aBl$path	7@@ @  J@L    M    @@3"ty	@@ @  P@V    W    @@4@wIvH,@ANMB6@"K@@AJ@@BM@L@ACD:@K@  , %8/@A(K@  , %0n    o    @@@T@  U@  rB4K@  , %@A6 K@  , $|  u  }  u  @>@@T@  A @  ;A]F@  , $pȰ  u  W@@AaF@  , $h̰  U  b  U  o@@@S@  /T@  *AmF@  , $Xذ  D  L@@AqF@  , $Lܰ    6    8@@Aڰ@v@@ABuxCs@E@  , $D        0@#AE@  , $8@&A
E@  , $0        @C@@T@  T@  
U@  3AE@  , $    @@8AE@  , #         @A=A@@@  , #        @N@  DB'non_gen	S@  @        &@@,(name_gen	@@@ @  @@ @  @ @  S@  @  >  J  >  R@@&-!@@D@@ABC@@@AC@D@  , #//@iA$*	D@  , #1  >  {  >  @@nA(/@@AB@C@  , #9  >  e  >  u@#wA29
C@  , #@@zA4;C@  , #B  >  FB@@~A8?CA  , #H    )	    :@ABGB  , #xO    O@@ALB@  , #,S@@@P@@A@A@  , #Y  ]    ]  @[e@@T@  1VA;!f	@%  ]  ~&  ]  @@i?d@B@@AzR	A@@B@@B@  , #q1  ]  @@iAn
BA  , # wAm@Pr@@A@@A  , "|<  u  =  u  @@uAZ!f	@C     D    !@@A@C@@A
B@@zs	A@@AB@@C@  , "R  Q  pS  Q  t@@AC@  , "W  &  ;X  &  K@[@@ @  }A @@A@B@@B@  , "d  &  5(@@A'BA  , "A@@@A@@A  , "o1    p4    *@AA@@@  , "t2    u2    @B"li	d@@S@  S@  @1    1    @@["ty	jS@  @1    1    @@\ʰ@C@@Az	A@@B@@AB@	C@@B@@AB@D@  , "`ݰ2    )@$listIn@@U@  @@U@  U@  U@  A7!D@  , "L3    3    @O@   B?)C@  , "@K@AA+CA  , ",A@S@-@A)@A  , !uvuv0@A=Printtyp.mark_loops_rec.(fun)A@@@  , !	uuuv3@@7Printtyp.mark_loops_recA'visited	G~@yssyss@@"ty	HvO@  +@yssyss@@#"ty	If'@@ @  <P@  2@zsszss@@/"px	J@@ @  KP@  A@{tt{tt@@;'visited	Kd@@ @  P@  @}t^tf}t^tm@@H"fl	Q@@ @  ڠ@@ @  @ @  @@ @  @uuuu@@]X@fF@@AG@@7D@@ABDCOA@@0EZB@@AC@ F@@LD@@ABG@@]B@@AC@@BH@@E@@ACD@@@@AG@  , !?{{@{{@@@P@  zQ@  V|B}"ty	Y
@@ @  '@Q{{R{{@@#tyl	Z@@ @  )@@ @  (@_{{`{{@@@F@AB@BHC@G@@AB@BC?1H@  , !n{{o{{@AA@@@  , !4s{|@@A,H@  , !xw||x||%@@AVSCOAF@  , !d~wwww@@O@  `!O@  O@  O@  O@  O@  CO@  @R@  QĐAŠ#row	RS@@ @  @v4vCv4vF@@#row	`@@ @  nQ@  d@vvvv@@@][I@A@H!G@@ABCyJ@  , !Twwww@@A(I@  , !8wowwow@@=>O@  &@R@  %A5"_p	a@@ @  @w=wNw=wP@@#tyl	bɠ@@ @  @@ @  @w=wRw=wU@@@\J8@A5B@K@@A@BCL@  , !(*wow}wow@@!A)(K@  , ! /w=w\w=wk@D@@Q@  R@  ,A54K@  , !;@/A76K@  ,  =ww%G@@3An:RBCH@  ,  Dvwvw@A;A@BA@@  ,  I	vv@@?AzFH@  ,  M
vvvv@@@R@  R@  S@  LATH@  ,  [vve@@QAXHA  ,  a!vv"vv@AXA`@v@AB CG  ,  l,vv-ww@@cAj
G@  ,  |q1vJvx2vJv@@hAoG@  ,  tv6vJvU7vJvr@@@P@  UQ@  BsB{G@  ,  \BvJvR@@xAG@  ,  @F{({:G{({<@@}A{F@  ,  $K{^{oL{^{@@AF@  ,  PzzQz{@@A#ty2	X@@ @  @Zzz[zz@@@A@A$kind	UI@@A@AB@@#ty1	VH@@AJ#ty2	WG@@G@ABCD6J@  , szztzz@B@@ @  @zOz_zOzc@@@@@ @  @zOzezOzh@@H@@ @  @zOzjzOzm@@ΰ5o/)&BCi[I@  , ذ%zz@@A"I@  , ܰzOztzOz@SD@@P@  אA,I@  , 
zOz@@A0I@  , y7yGyy@AA@@@  , yy-yy@@A"fi	St@@ @  @wxwx@@"nm	T+@@ @  (@@ @  @@ @  @ @  @@ @  @@ @  @wx	wx@@	&fields	dNN@@ @  (N@@ @  )@@ @  *@ @  '@@ @  &R@  @xxxy@@7
2@aJcI@AMH@@(K@@ABFG@@@ABCK@  , xI	xy

xy@3V@@ @  +R@  @ @  R@  %LAfT@@@ABCI@  , d_xxp@@UAn\I@  , Pc#yz$yz(@@@R@  ]Ax!l	c@@ @  @@ @  @5yy6yy@@y
t@dJB@A?@K@@AB>=CL@  , DDyz)Eyz4@cQ@  @@R@  R@  R@  A)K@  , 4Uyz@@A-K@  , YxxZz5zB@@A@>CB[ZC2$H@  ,  axxbxx@AA@@@  , fxx@@AH@  , jx_xlkx_x|@@@Q@  R@  AH@  , vxPxYwzCzN@@AH@  , {xx>|xxJ@@A"H@  , xxxx8@@@P@  zQ@  gB.H@  , ̰xx@@A2H@  , lаuuuu@@O@  O@  @Q@  ΐAѠ!p	O@@ @  @uSuauSub@@#tyl	PFk@@ @  @@ @  @uSuduSug@@#_p'	[@@ @  Q@  @uou|uou@@!s	\ @@ @  Q@  @uouuou@@ 
@ZI@A8H@@@J@@ABC@4G@@A@BDK@  , `uuuu@hP@  @@Q@  Q@  Q@  !BS)J@  , T0uu@@&AW-#J@  , H4uouuou@C8@ @  Q@  2Ab:@@A-@@AB*CH@  , @Fuouw'@@<AkC	H@  , J
uu6uuN@@O@  c@Q@  EAE#tyl	N@@ @  @@ @  @uu%uu(@@a\@G@@A@BCH@  , h(uu,)uuR@@_Af
G@  , m-tt.tt@eBf#ty1	L@@ @  @:tt;tt@@~#ty2	M@@ @  @DttEtt@@$@H@@AG@@%@ABC"H@  , $Qtu@@A!H@  , UttVtt@@AF@  , Z{{%[{{'@@AF@  , h_~tt@@A@?@A>;B7)E@  , df}t^tpg}t^t}@AA@@@  , Tk}t^tb@@AI@D@ABC5D@  , @r|ttLs|ttX@@AD@  , 8w|tt:x|ttF@@@P@  aP@  Q@  AD@  ,  Ű|tt"|tt6@s@@P@  bP@  vQ@  qĐB$D@  , Ӱ|tt@@A(DA  , ٰ{tt{tt@AАAذ@y0BrdC
  , {tt+@@ACA  , zsszst@AߐA@?BsB
  , zss:@@@B@  , yyyy@@A$kind	e @@Q@  lQ@  L@y7yPy7yT@@"ty	fbQ@  M@y7yVy7yX@@
@C@@A~	gA@@B@@AB@B@@AC@@B@C@  , y]yry]y@U@@R@  kA- C@  , 'y]yo2@@#A1$CA  , -CA'@;(@@A@A  , t2{{{{@@/@!t	h@@Q@  lQ@  I@{{{{@@B=@A@@A@B@@A@A@  , dI	uv
uv/@@FAA"_n	]@@P@  .P@  @uvuv
@@Z"ty	^P@  @uvuv@@b]@I	_A@@B@@AB@B@@A1C@@B@BA  , XpmAj@ck@@A
@A  , Lu56kk66kk@@6Printtyp.new_weak_nameA"ty	@>/jj?/jj@@Ҡ$name	:@@ @  ڒQ@  ڂ@J0jjK0jj@@@C@@Aw	A@@B@@AB@^E@@AD@@B@@AC@@BC@:@@@AC@  , Db5kkc5kk@à@@Q@  HQ@  ^4C4C@  ,  o5kk:@@9A8#C@  , s4k@kYt4k@k}@@@Q@  BBB-C@  , }3k3k:~7kk@@HAG2C@  , °2jk2jk2@@MAL7C@  , ǰ2jk 2jk@@@P@  Q@  XAXCC@  , Ӱ2jj@@]A\GC@  , װ1jj@@aA`KCA  , ݰ0jj0jj@AhBgܰ@QOBMEB
  , 0jj	@@@R@  ړR@  ڱS@  ڠxAwB@  , 0jj6@@}@{B@  , h-jXj-jXj@@1Printtyp.new_nameAc$name	@@ @  Q@  @'iwi}'iwi@@@B@@A	A@@B@rB@@AC@@B@@@@AB@  , X-jXj|-jXj@@AB@  , P-jXj]-jXjv@0@@P@  _Q@  T*A* B@  , D'-jXjZ0@@/A.$!B@  , <+,jCjE4@@3A2(%B@  , 8/*ii+jj?@4R@  ٢;B1@,@A*&A@  , (:*ij@@@R@  ٤R@  S@  ٴKBAB@  , H*ii@n@@S@  ٵS@  T@  YAOB@  , V+jj'@@@R@  ٣R@  2S@  fA\+A@  , c4@iA^-A@  , e%)ii&)ii@hoBe4A@  , l,)ii@$@@R@  R@  ّS@  j|ArAA@  , py@AtCA@  , \{;'iwiy@@@xGA@  , T?bb@bb@@6Printtyp.get_best_pathA!r<@HbubIbub@@"p'8@@ @  u@RbbSbb@@@	5B@@AC@@A@@AB@{D@@A$C@@B@@AB@a@@@AC@  , Dhbbibb@@@Q@  ДQ@  И/A.@@A!lC@@@ABC@  , 8@9A7	C@  , (}bb~d3d<@ @@P@  zQ@  DBD@@ @  Ѓ@@ @  Ђ@bbbb@@"C@  , ְcc
cc@A<Printtyp.get_best_path.(fun)A@@@  , ܰd>dS@@\A,C@  , bb@@`A0C@  , bb	@@d@b@K@AJDA@  , cccc@AA@@@  , cc@@A+!p@@Q@  fQ@  @cccc@@@q4B@@AA@@B@D@@AC@@	B@@AE@@BC@B@  , cccc@#@@S@  PT@  =>B'B@  , tcc0@@CA+B@  , `chcchc@@HA1"p'@@ @  @chcychc{@@,'.+@C@@AB,@C@  , X2chcchc@G@@S@  %T@  bB7C@  , P>chc@3@@S@  @@S@  @S@  
rA+G D@  , DNchc@S@  zA3O(C@  , <V$@}A5Q*C@  , XcPcZn@@@iU@Y@AX@A@  , ^___`@A4Printtyp.lid_of_pathA@]\@@  ,  d$__%_`@KO@  .AƠ"p1@@ @  	@2__3__@@v"p2
@@ @  
@<__=__@@{@C@@AB@@kA@@AB@@y@@@AD@  , L_`M_`@sO@  A0A(C@  , 6@3A*CC  , X__Y__@A:A@@@  , ]__^__@@A"p1;@@ @  @j__k__@@!sp@@ @  @t__u__@@@C@@A6@B@@AB@6D@  , (@_AC,  , ð_Z_`_Z_@AeA@@@  , Ȱ_Z_q@@@P@  Q@  !oA,"id@@ @   @_D_T_D_V@@װ@B@@AZ@B@XB@  , @ABN  , d_%_;@A@A@c@A@aAU  , \YYYY@A2Printtyp.path_sizeA@@@  , HYYYY@pQ@  lO@  @R@  R@  R@  AZ"p1R@@ @  a@YYYeYYYg@@"p2S@@ @  b@YYYiYYYk@@!lVQ@  @YpY{YpY|@@!!bWO@  @YpY~YpY@@)$@,D@@AE@@F@@AB.C@@&B@@XA@@ABC@B@@A@@@@AG@  , <>R@OA=9F@  , (@ YpYYpY@-&@ @  Q@  [AHF@@ABC@  ,  PYpYvd@@cAOMCC  , VY.YPY.YX@AjA@TS@@  , [@lA!pQ@@ @  \@$YY%%YY&@@h!lTO@  Ƨ@,Y.Y9-Y.Y:@@p!bUO@  ƨ@4Y.Y<5Y.Y=@@xs@(C@@AD@@E@@AB$B@@M@ACKIE@  , EY.YAFY.YL@#@ @  ƫQ@  ƳA3@@A]@B[YB@  , UY.Y4?@@A:BE  , ZXX[XY@AA@@@  , _XY	@O@  vA"idPe@@ @  X@lXXmXX@@@B@@A~@B|zC@  , vXX@A@@Q@  wQ@  ƆR@  ƁѐAC@  , ðXY)@@@Q@  ƒQ@  ơR@  ƜߐA*B@  , 7@A,!B  , d԰XX@A@+Ѱ@@AA  , T۰XX	XX1@A<Printtyp.normalize_type_pathA@@@  , LXX
XX,@O@  ũC>a=O@  @@ @  @U,UJU,UUA@u>O@  @U,UO@@v#env@O@  =@U,UWU,UZ@@x!pAO@  D@U,U[U,U\@@y@%C@@D@@ABB@@E@@AA@@BC@&B@@A C@@D@@AB@@@@AF@  , ,"G@DA;E@  , $WWWW@AIA@"!@@  , )WWWW@ANA@'&@@  , .WW@r@@P@  fQ@  uXBT&paramsBkO)type_expr@@ @  k@@ @  jP@  L@
UeUnUeUt@@Nz"tyC)type_expr@@ @  lP@  M@UeUvUeUx@@\{&paramsD٠ne@@ @  ÑP@  y@@ @  ÆP@  t@*UU+UU@@n|"tyGnp@@ @  ü@4WW5WW@@xs@!I@@AonBl@i@A%LHK@@M9J@@ABCoiM@  , e@ARM@  , KWWLWW@AA@@@  , PWWQWW@4Q@  RBd"p1EM@@ @  ó@bUUcUU@@}#tylFLj(@@ @  õ@@ @  ô@pUUqUU@@~#tylH1n@@ @  Q@  @@ @  Q@  @VVVV@@"l1IC@@ @  Q@  @@ @  Q@  @W.W<W.W>@@"p2J~@W`WoW`Wq@@"s2K@W`WsW`Wu@@@[S^Nu@AB@-R@@AC@ZP@@ U@@ABx@T@@Aw@IQYO@@ABCDU@  , v@#AkU@  , W`WyW`W@O@  *Cq@@AB@@AB@BCDR@  , xW`WW`W@A8A@@@  , `W`Wj@@<ARA  , \W.WAW.W\@ACB@BCDQ  , L)W.WJW.WX@@o.@@R@  !@@R@  @R@  WA1R@  , <8W.W8@@\A5Q@  , 4<VWVW @AaA@:9@@  ,  A@cA<Q@  , CVW	VW@@@S@  S@  T@  pAJ-Q@  , QVVVV@e@@R@  ĮzAT7R@  , [VVVV@T@  ľA]@Q@  , d$VV@@AaDQ@  , h(VV)VV@ChKQ@  , o/VV0VV@AA@ml@@  , t@AoRQ@  , v6V^Vi7V^V@S@@Q@  Q@  \R@  DC}`Q@  , DV^VwEV^V{@AA@@@  , \IV.V9JV.VK@e@@Q@  AoR@  , HSV.VNTV.V]@S@  !AxQ@  , 8\V.V6@@A|QA  , 4bVVcVV*@AǐB)@&@@ABCDP
  , nVV#@@A
P@  , rUUsUU@o@@ @  âېAB>=@8@ABCL@  , UU@@ALA  , ưUUUU@ABŰRNKBCK  , |аUU@@AK@  , h԰UeUUeU@#intA@@ @  mP@  N@ @  QP@  i	B@@ACH@  , DU_Ua@@AD@  , <U,UP@@A	@@ABC@  , ,@Ac?@
@w@@D@@ABCD@  , @%@C@  , TTTT@@-Printtyp.uniqA[@;A@@A@@@@@AAB  , TUTU @@@R@  R@  S@  Bs!a9@TUTU@@(r!l:ʠ	@@ @  ´@TUTU	@@3s.@C@@AB@@.@AB@,C@  , ;TU
TU*@@6A9C/  , ATT@A;@>:A4  , F~TT~TT@J@@Q@  aQ@  e.Printtyp.indexA!l4S@|ThTv|ThTw@@Zm!x5UO@  F@|ThTx|ThTy@@bn]@B@@A
A@@B@@m@@@AB@  , tk%@Af	B@  , dm-TT.TT@b"B#!a6o@7TT8TT@@{o!l7y@@ @  S@BTTCTT@@p@D@@AC'@'@AB@&D@  , TOTT"@@BAD@  , HSTTTTT@@GA$D@  , 8XTT+@@KA(D@  , \}T|T~/@@O@M<B@  , `BMdMlaDMM@A8Printtyp.raw_field.(fun)A@@@  , f@MM
@@2Printtyp.raw_fieldA#ppf0M@  @r<LPL^s<LPLa@@H!cf@@ @  /@|?LL}?LL@@J"tlfB@@ @  1@@ @  0@?LL?LL@@K!mg
@@ @  2@?LL?LL@@L!e#refܠ[@@ @  5@@ @  4@@ @  3@?LL?LL@@M@=F@@AC@@(D@@ABA@@LB@@<E@@ABC@iG@@B@@ABLH@@TC@@AE@@D@@ABCF@@.I@@J@@ABD@@@@A @@  @@A @@ @@ABCFD  , |=LmL=LmL@@wAr@C@@A.@,@AB)C
  , P(>LL>LL@@A!t@@ @  $@>LL>LL@@6I1B@@@D@@ABC?-D#  , >EMMEMN@@A<@MBG5B+  , FAA@BB/  , J
CMxMCMxM@@A#ppf5M@  @BMdMqBMdMt@@VNQ@B@@AA@@B@C@@B@@AB@B@  , b"DMM#DMM@@A!f@@ @  @,DMM-DMM@@pOk@@AC@@@AB@C@  , w7CMxM@@@,t@ @A@A@  , d}=6K@KJ>6K@K\@@6Printtyp.raw_row_fixedAƠ#ppfiM@  }@F5KK1G5KK4@@E@qA@@B@@AB@J@@kE@@ABK@@F@@AKH@@mG@@ABC&I@@L@@M@@ABD@+C@@AG@@@ @@Ae @@ @@ABCBE  , 8p:LL(q:LLN@@3A3!pF@@ @  @z:LL#{:LL$@@G@1
C@@D@@AB97C5#D  ,  Ȱ9KK9KL
@@KAK!tK@@ @  @9KK9KK@@FѰ@@AM@K@D@@ABCL:D0  , ߰8KK8KK@@bAaݰXVBTBC8  , 7K]K{7K]K@@jAiC>  , g<AAn@2dBB  , D4JK
4JK@M@  6Printtyp.raw_type_descB@#ppfM@  $@C+C=C+C@@@"!pW@@ @  @2JJ2JJ@@C"flTS@@ @  ͠@@ @  @ @  @@ @  @2JJ2JJ@@#D@C@@%D@@ABA@@1B@@AC@M@@H@@AB}N@@I@@AK@@
J@@ABCL@@_O@@GP@@ABD@F@@AC@@1 @@A@@@ @@ABCD@  , 4K4JK4JK@AWA@IH@@  , $P3JJ_@@[AYM/DN  , V HH"HTHl@@bA`!t@@ @  @!GH"GH	@@e:"tlQ@@ @  @@ @  @/GH0GH
@@s;n@M@AJ@D@@AC@@BCM;D(  , }=GG>GG@@A$namel@@ @  @@ @  @LGGMGG@@9@C@@AkiBgUCB  , `W'HHX(IIK@@N@  @Ƞ*@@N@  AO@  *O@  @N@  O@  @@N@  N@  N@  @N@  "@N@  !N@  A#row7@@ @  @}#HmHz~#HmH}@@<@@A@C@@ABN@  , TȰ'HI(IIJ@A<Printtyp.raw_type_desc.(fun)A@@@  , ΰ.II1JbJ@AA@@@  , Ӱ$HH@@AC  , ذGG+GG\@@A!t[@@ @  @GGGG @@6@YC@@A@@D@@ABCD  , \GxG~GxG@@A!tu@@ @  @G]GiG]Gj@@ 7"t'@@ @  @G]GqG]Gs@@
8$@@AE#@F@@ABCF  , FFFG@@!A!t@@ @  @FFFF@@#5@@A@C@@ABC֠  , 
+F}FF}F@c@@N@  P@  =B>!fm=@@ @  @ FF*FF+@@D1!k<@@ @  @
FF-FF.@@N2"t1@@ @  @FF0FF2@@X3"t2@@ @  @FF4FF6@@b4]@.F@@A$E@@@@AB=@D@@AC@@BC@.J@  , 
o/F;FA0FF@@{A=mF   , 
Pu5EtE|6EF@AA@sr@@  , 
8z:E.E4@@A!t@@ @  @DEE$EEE%@@,"nm@@ @  @@ @  @@ @  @ @  @@ @  @@ @  @aEE'bEE)@@-@!C@@A@~@.D@@ABCmDZ  , oDDpDD@@N@  @U@@N@  O@  @@N@  
N@  N@  @N@  @N@  N@  ϐAϠ!p{@@ @  }@DsDDsD@@)"tlQV@@ @  @@ @  ~@DsDDsD@@*&abbrevH@@ @  @@ @  @DsDDsD@@+@C@@,E@@AB@@%D@@ABCF@  , DE DE@EN@  +
A;E@  , DD	@@A?E  , 	
D<DB
D<Dr@@A"tlV@@ @  v@@ @  u@	D+D6	D+D8@@(@@A@C@@ABCΠ  , L#CCCC@[@@N@  {P@  5A6!l@@ @  n@CCCC@@;$"t1@@ @  o@CCCC@@E%"t2@@ @  p@CCCC@@O&!c@@ @  q@CCCC@@Y'T@C@@.F@@AB6@5@A'E@@D@@ABC7%K@  , $f&DD'DD*@@@N@  [P@  xBCkF@  , r2CC@@}AGoF"  , w7CLC]8CLC@@A$nameyn@@ @  h@@ @  g@GCLCUHCLCY@@#@C@@AfdBbPC=  , RFFSFF@@A@nlBjXBE  , XAA@BI  , ,^EE_EE@@A&#ppfM@  S@fEtEgEtE@@.@B@@AA@@B@+D@@AB@@C@@AB@B@  , 
xEEyEF@@A!p@@ @  c@EEEE@@/"tlI@@ @  e@@ @  d@EEEE@@0а@HC.@ E@@AB.@D@@AC/@E@  , 
EE)@@@Bް@6@A5@A@  , 
/JJ5/JJG@@A5#ppfM@  @.IJ.IJ@@@@f	B@@AA@@B@B@@AC@@HD@@AB@B@  , 
t1JbJp1JbJ@@9A!p@@ @  @0JHJY0JHJZ@@A"tlɠ@@ @  @@ @  @0JHJ[0JHJ]@@B@
C.@ E@@AB.@D@@AC/@E@  , 
@*/JJ)@@a@B'@6@A5@A@  , 
0(II"(III@@hA#ppf@@ @  @'HI
'HI
@@@=!l@'HI'HI@@G>!f@
'HI'HI@@N?I@C@@D@@AB9A@@"B@@AC@B@@A@DA  , 
 ^A@Y@
B@B  , 	c#BC$BC*@@6Printtyp.raw_type_list@"tl7@+BC,BC@@o!j@
A@@A@P@@MK@@ABQ@@L@@A-N@@OM@@ABCO@@R@@S@@ABD@
I@@A)F@@v @@AGC@@a@@@ABCA@  , 	PBBQ BB@@1Printtyp.raw_typeA۠#ppf~@ZAA[AA@@"tyM@  @bAAcAB@@"tyN@  @jBB
kBB@@ @B@@A
CA@@B@"S@@N@@ABT@@
O@@ApQ@@P@@ABCKR@@U@@V@@ABD@PL@@AlI@@@@@AF@@C@@ABCC@  , 	tӰBiBxBiB@ACA@@@  , 	\ذB"BcBB@@HAG-C@  , 	4ݰB"BBB"B]@@MAL2C@  , 	,B"B'B"B<@@@M@  N@  	XBX>C@  , 	B"B$@@]A\BCA  , 	BBBB@AdBcJF@BE3B
  , BB%@@l@jB@  , @@@A@@5Printtyp.list_of_memoAB#rem#refn@@ @  @@ @  @@@@@@@@A@@B@@AB@@@@@ABC  , "@@@@@A!A@ @@  , '@@@&Al%_priv,private_flag@@ @  @@@@@@@<!p@@ @  @@@@@@@F
#_t1@@ @  @@@
@@@@P#_t2@@ @  @@@@@@@Z#rem@@ @  @ @@!@@@@d_@,C@@AP@B@@AB@NC@  , lJ@hAAgCN  , o/@@0@@@@nAm@\@A@XAV  , xw7@~@v@Au@tA[  , l|<@r@{=@r@|@@2Printtyp.safe_reprA!v@E@	@F@	@@@!tM@  -@M@r@vN@r@w@@
@A@@B@@AB@@ @@@ABB  , X\@Y@i]@Y@o@A A@@@  , Da@Y@_b@Y@q@@%A$!t$@@ @  1@k@(@:l@(@;@@	@"C@@AD#"B@ D@  , <x@(@Fy@(@U@T@@O@  BO@  VP@  QDB D@  , (ư@(@B@@IA$D0  , ˰FNAAM@;B4  , ϰ???@@A8Printtyp.safe_commu_reprA@@@  , հ???@@@A!v@?Z?r?Z?s@@!r@@ @  @@ @  @????@@@A@@AC@@B@@AB@@@@@AC@  , ????@@,A&C@  , | ????@@@N@  O@  7B2C@  , h??7@@<A6	CC  , L????@@CA<@%@"@AB@!B
  , <????@@LAE	B  ,  !DKAAP@\
B  , %>?>?$@@7Printtyp.safe_kind_reprAe!v@====@@3 !r941@@ @  @@ @  @@ @  @>->6>->7@@E#vid5L@  8@	>;>E
>;>H@@MH@D@@A8A@@B#C@@,B@@E@@ABC@>C@@uB@@AB@0@@@AE@  , b">>#>>@@=A<!c@@ @  Q@  d@.>>/>>@@rm@$@F@@AB@E@@(@A&@%@ABC"F@  , ~>>>?>>@AYA@|{@@  , C>>@A]A@@@  , G>>%@@aA$F@  , K>>L>>@@fAd@A@AB=C84E@  , T>>2@@nAlE@  , lX>K>WY>K>m@tBsPJ$CEAH@  , Ha>;>A|@@{AyDD  , <g>>$h>>*@AA@@@  , (l>>m>>,@@A!k@@ @  @v==w==@@ @m@AE@@m@ABkECfbE@  , °===>	@@AE@  , ǰ====@@@N@  !O@  B"E@  , Ӱ=='@@A&E2  , ذ?%?5?%??@@Aְ@@@ABB;  , ?@?O?@?X@@A	BA  , AA@!
BE  , ::::F@A5Printtyp.tree_of_pathA@@@  , |::::-@M@  B*)namespace^@8888!@@ ޠ"p1f@@ @  @9999@@ "p2g@@ @  @999: @@ @B@@D@@ABC@@$pathaA@@AC@B@@AC@@D@@AB@9@@@AE@  , l*::/::E@,M@  AB9+D@  , `2G@DA;-DE  , D69999@AKA@43@@  , <;9999@=QBI!pd@@ @  @99	99@@L !se|@@ @  @9999@@V Q@A@AC@@>@D@@ABC=7E@  , ,_)@qAZ	D-  ,  b"99#99@AwA@`_@@  , g'99(99@A|A@ed@@  , l,99@@@N@  O@  B~!tb6@@ @  @=88>88@@ !sc|@@ @  @G88H88@@ 54@r@AE!s`D@@F@@ABCvpG@  , 6@A#
F@  , Z89[896@6@@P@  ZP@  vQ@  dA1F@  , h89'i895@|@@Q@  eQ@  tR@  oƐA@*F@  , w89@@AD.F  , p|88}88@AA@@@  , h88@?@@N@  O@  ېB:}@@ @  P@  @8i8u8i8v@@ k@@ @  @8i8m8i8@@ ٰ@@Q@ABCD@  , P(@AD@  , H8i88i8@@@N@  O@  A&D@  , <@A(D  ,  8>8D8>8h@A
A@@@  , 8>8O@x@@N@  O@  B"id_@@ @  @8-888-8:@@ 	@C@@A@@ABC@  ,  @'AC  , ,AA+@I@@A@BB  , 555B5t@A	(Printtyp.rewrite_double_underscore_pathsA@@@  , %5555@@[M@B]#envOp@4t44t4@@6 Ϡ!pPpM@@4t44t4@@> Р!aS@@ @@4545@@H Ӡ!bT@@ @@45	45
@@R M@D@@AC@@B*B@@%A@@AC@B@@AC@@B@@@@AE@  , c#5B5N$5B5s@M@FB>dD@  , kL@IA@fD@  , m-44.44@ANA@kj@@  , r244344@TBL!pQ@@ @@?44@44@@ Ѡ!sR}@@ @@I44J44@@ @8@AD8@C@@AB95E@  , |)@tA	D@  , \X55Y55@@yAp"idU\@@ @@c5u5d5u5@@ ՠ$nameV-@@ @  O@@o55p55@@ @' E@@Aa@BC@@D@@Ac@BCb^E@  , L7w77w7@@A*!iWA@@ @  .@5555@@ נ*better_lidXx@@ @  ;P@  7@5556@@ ؠ"p'Y!t@@ @  @7777@@ @5@G@@AB@+F@@AC76@I@@AH@@BCDI@  , @7Y7e7Y7g@@A9I@  , 877&77S@@@P@  :Q@  1CEI@  , $	77#J@@AI#I@  ,  
6767@@AM(@)H@@A(@BC^]DH@  , 6666@B@@ @  2module_declaration@@ @  @ @  Bg%BsrDK@  , .66o@@Am+G@  , 2666a6@AA@0/@@  , 766 66<@AA@54@@  , <66'@%@@P@  DQ@  Z"C@ZBCG@  , xJ
6>6I6a6@4@@P@  >Q@  o2APF@  , \W6a6n
@@@Q@  pQ@  R@  @C^F@  , e%55@@EAb"F@  ,  i)55*55@@@ @  @@ @  RAp@ @ACD@  , z:55@@ZAwDA  , @55A55@AaA@-@AB,(C  , J55@@jAC@  , N44@@n@c8@B73B@  , Ty3j3nUy3j3@Z@@O@TO@kP@d	#Printtyp.module_path_is_an_alias_ofBҠ#envJ@hv23iv23
@@ ʠ$pathKM@@qv23rv23@@ ˠLM@@yv23zv23@@ ̠%path'M @@ @4@x3B3\x3B3a@@ °@;E@@AA@@B*C@@&B@@AF@@D@@ABC@@H@@@AF@  , xڰFz33@@=A;F@  , `ް{33{33@@BA?ܰ@@@ABC@E@  , (|33|33@@KAH@ @A@D@@A @BC@D@  ,  w33$w33<@+@@ @&[BY/@-@AB@(G@  ,   w33@@c@`C@  ,  cc@@2Printtyp.longidentA(#ppfx@``@@B"p1|@@ @@cc@@F"p2}@@ @@cc@@&G!@D@@AC@@BA@@%B@@AC@@@@@ADC  ,  d6bK]bK~@@2A1!pz@@ @@bKTbKU@@ED!s{@@ @@bKWbKX@@OEJ@D@@A(@B%@C@@AC@&D$  , xYa%5a%J@@UAS!syD@@ @@#a%0$a%1@@gCb@>@A;@C@@AB@<C:  , ToajAAi@k@FDB@BB@@            ../compilerlibs!.(./typing@  U 6  ߠ  ,  D%Ctype&_none_@@ AA"??A@@@@@@@@@@@  ,  @8	A"??Að@*floatarrayQ  8 @@@A@@@@@@@@5extension_constructorP  8 @@@A@@@@@@@@#intA  8 @@@A@@@@@@A@$charB  8 @@@A@@@@@@A@&stringO  8 @@@A@@@@@@@@%floatD  8 @@@A@@@@@@@@$boolE  8 @@%false^@@@$true_@@@@@A@@@@@@A@$unitF  8 @@"()`@@@@@A@@@@@@A@
#exnG  8 @@AA@@@@@@@@%arrayH  8 @ @O@A@A@ @@@@@@@@$listI  8 @ @P@A"[]a@@@"::b@@ @Q@@@
@@A@Y@@@@@@@@&optionJ  8 @ @S@A$Nonec@@@$Somed@@@@@A@Y@@@@@@@@&lazy_tN  8 @ @U@A@A@Y@@@@@@@@)nativeintK  8 @@@A@@@@@@@@%int32L  8 @@@A@@@@@@@@%int64M  8 @@@A@@@@@	@@@:Undefined_recursive_module]    Z@@@ @J@@ @@@ @V@@A=ocaml.warn_on_literal_pattern!@"@.Assert_failure\    @@ @X@@A-00@
0Division_by_zeroY    '@@@A588@+End_of_fileX    /@@@A= @@@)Sys_errorW    7@3@@AF)I(I@.Sys_blocked_io[    @@@@AN1Q0Q@)Not_foundV    H@@@AV9Y8Y@'FailureU    P@L@@A_BbAb@0Invalid_argumentT    Y@U@@AhKkJk@.Stack_overflowZ    b@@@ApSsRs@-Out_of_memoryS    j@@@Ax[{Z{@-Match_failureR    r@qmn@ @c@@Aih@
%bytesC  8 @@@A@@@@@@@@&Stdlib$Misc(Asttypes%Types%Btype*Errortrace+Local_store%Unify A    @!t+unification@@ @
@@ @
@@A/typing/ctype.ml|
0
0|
0
[@@A(Equality B    @$!t**comparison@@ @
@@ @
@@A}
\
\}
\
@@B'Moregen C    @9!t?*comparison@@ @

@@ @
@@A+~

,~

@@C'Subtype D    @O'Subtype!t@@ @
3W!t]+unification@@ @
4@@ @
6@@AI

J

@@D&Escape E    @l&escaper$desc@@ @
8@@ @
:@@A^ A

_ A
'@@E)trace_exn F  8 !_ @
=@A%Unify @+unification@@ @
>@@ @
@{ F| F@@4G'Moregen @&*comparison@@ @
A@@ @
C G G@@HH(Equality @:*comparison@@ @
D@@ @
F H H@@\I@@A@ @@@@@ E@@A@aF/raise_trace_for @T'variant @
w @@@ @@!t @@@ @!a @
@ @@ @G@
v@ J J%@@J5raise_unexplained_for @'@ @@@ @G@@ @@ @G@@ V

 V

@@S)raise_for @< @@@ @G@@*Errortrace#elt$desc@@ @H@@ @G@@ @@ @G@@ @G@@ Y Y'@@U?Public_method_to_private_method G    @@@A ]rr ]r@@X&escape @++escape_kindM @
@@ @H@4&escape	@@ @H@@ @H@ @4 _5 _@@Y*escape_exn @@@ @H@@@ @H@"@@ @H@#@ @$H@!@O `P `@@[0scope_escape_exn @%Types)type_expr@@ @
H@@@ @
H@@ @H@@i aj a@@"]0raise_escape_exn @Q!@@ @
A@@ @
@H@
$@ @
%@ @
&H@
#@ b,0 b,@@@8_6raise_scope_escape_exn @0@@ @
dH@
J@ @
K@ @
LH@
I@ c`d c`z@@Ja$Tags H    ?@%label@@ @
k%label@@ @
l@@A e e@@^c-Cannot_expandI    S@@@A t t4@@ff,Cannot_applyJ    [@@@A v66 v6L@@ng,Cannot_substK    c@@@A xNN xNd@@vh	 Cannot_unify_universal_variablesL    k@@@A zff zf@@~i/Matches_failureM    s@#Env!t@@ @h!t+unification@@ @i@@ @k@@A | |@@j,Incompatible)N    @@@A ~ ~@@k-current_level*&Stdlib#ref@@ @xO@r@@ @wO@n@  @@l,nongen_level+@@ @O@~@@ @O@z@ (, (8@@m,global_level,)@@ @O@@@ @O@@& CG' CS@@n+saved_level-;*@@N@#N@X@@N@#N@Y@N@\N@@@ @O@@@ @O@@J ^bK ^m@@o&levels.O  8 @@-current_level/@@@ @Z [ @@q,nongen_level0@@@ @f g @@r,global_level1@@@ @r s @@+s+saved_level2@p@@ @@@ @@ @@@ @  @@Dt@@A@@@@@ zz @@@@Hp+save_levels3@@@ @P@W@@ @P@@ @P@@  @@_u*set_levels6@@@ @P@*$unitF@@ @P@+@ @,P@)@  @@wv1get_current_level9@/@@ @P@l@@ @P@@ @P@@ (, (=@@x(init_def<@|@@ @P@-@@ @P@@ @P@@ RV R^@@y)begin_def?@Y@@ @P@B@@ @]P@@ @P@@  @@{/begin_class_defB@n@@ @wP@tW@@ @P@u@ @vP@s@ # 2@@|2raise_nongen_levelE@@@ @P@m@@ @9P@@ @P@@( ) @@}'end_defH@@@ @SP@P@@ @#P@Q@ @RP@O@= > @@~,create_scope@@@ @#$P@#!@@ @#eP@#"@ @##P@# @R S @@ A2reset_global_level@@@ @#oP@#l@@ @#P@#m@ @#nP@#k@g h @@  B5increase_global_level@@@ @#P@#@@ @#P@#@ @#P@#@| #'} #<@@5 C4restore_global_level@%@@ @$P@#@@ @$P@#@ @#P@#@  @@J E.is_object_type@$Path!t@@ @$nP@$$boolE@@ @%EP@$@ @$
P@$
@  @@g G4trace_gadt_instances&Stdlib#ref@@ @(kP@(d@@ @(iP@(`@  @@ L:check_trace_gadt_instances@#Env!t@@ @(P@(o5@@ @(P@(p@ @(qP@(n@  &@@ M:reset_trace_gadt_instances@
@@ @)P@(@@ @)P@(@ @(P@(@  @@ O9wrap_trace_gadt_instances@2@@ @)=P@)@@@ @)C@ @),P@)DA @)EP@)$@P@)+
@ @)-P@)%@ @)&P@)@ @)P@)@  @@ Q.simple_abbrevs p%Types+abbrev_memo@@ @)jP@)c@@ @)hP@)_@5 6 @@ W.proper_abbrevs@@@ @+P@)n@q @)@@ @)P@)u@-@@ @+@@ @+P@)|	P@)}@ @)~P@)v@ @)wP@)o@ @)pP@)m@_ ` @@ X&newty2@#intA@@ @+@%Types)type_desc@@ @+)type_expr@@ @+@ @+@ @+P@+@  @@8 \%newty@@@ @+P@+@@ @+P@+@ @+P@+@  
@@M ]&newvar$name|&stringO@@ @,P@+@@ @+P@+@@@ @+P@+A@@ @,P@+@ @+P@+@ @+P@+@ 6: 6@@@w _'newvar2$name*)@@ @,YP@,.@@ @,/P@,+@r@@ @,PP@,8g@@ @,NP@,9@ @,:P@,,@ @,-P@,*@ vz v@@ a.new_global_var$namePO@@ @,P@,g@@ @,hP@,d@f@@ @,tP@,q@@ @,P@,r@ @,sP@,e@ @,fP@,c@
  @@ d&newobj@)type_expr@@ @,P@,@@ @,P@,@ @,P@,@! " @@ f)newconstr@$Path!t@@ @-
P@,@$listI+@@ @-@@ @-P@,@@ @,P@,@ @,P@,@ @,P@,@K *.L *7@@ h$none"@@ @-0P@-&@W jnX jr@@ k$repr#@)type_expr@@ @-D)type_expr@@ @-C@ @-BP@-A@l m @@% l)TypePairsP@#keyR  8 @@@A)type_expr@@ @7C)type_expr@@ @7D@ @7B @7/@@@@+hashtbl.mli{:e:{:e:@@@@/Stdlib__Hashtbl}A@!tR  8 !a @6@A@A@O@B@@@O55O55@@@@dA@&create@#intA@@ @7G!a @6@@ @7F@ @7E@,P55-P55@@+e@%clear@!a @6@@ @7J$unitF@@ @7I@ @7H@EQ55FQ55@@Df@%reset@-!a @6@@ @7M@@ @7L@ @7K@\R55]R56@@[g@$copy@D!a @6@@ @7PL@@ @7O@ @7N@sT66!tT668@@rh@#add@[!a @6|@@ @7V@@@ @7U@
O@@ @7T@ @7S@ @7R@ @7Q@U696=U696`@@i@&remove@z!a @6w@@ @7[@@@ @7Zk@@ @7Y@ @7X@ @7W@V6a6eV6a6@@j@$find@!a @6o@@ @7_@;@@ @7^
@ @7]@ @7\@W66W66@@k@(find_opt@!a @6j@@ @7d@S@@ @7c&optionJ@@ @7b@ @7a@ @7`@X66X66@@l@(find_all@͠!a @6d@@ @7i@r@@ @7h$listI@@ @7g@ @7f@ @7e@[66[67@@m@'replace@!a @6^@@ @7o@@@ @7n@@@ @7m@ @7l@ @7k@ @7j@"\77#\77B@@!n@#mem@
!a @6Y@@ @7t@@@ @7s$boolE@@ @7r@ @7q@ @7p@@]7C7GA]7C7d@@?o@$iter@@@@ @7|@!a @6O@@ @7{@ @7z@ @7y@9
@@ @7x!@@ @7w@ @7v@ @7u@d^7e7ie^7e7@@cp@2filter_map_inplace@@@@ @7@!a @6F@@ @7@ @7@ @7@^@@ @7F@@ @7@ @7~@ @7}@_77`77@@q@$fold@@@@ @7@!a @6=@!b @6;@ @7@ @7@ @7@@@ @7@@ @7@ @7@ @7@c78c787@@r@&length@!a @67@@ @7@@ @7@ @7@d888<d888T@@s@%stats@!a @63@@ @7*statistics@@ @7@ @7@e8U8Ye8U8v@@t@&to_seq@Ơ!a @6.@@ @7&Stdlib#Seq!tv@@ @7@ @7@@ @7@ @7@g88g88@@u@+to_seq_keys@@ @6)@@ @7##Seq!t@@ @7@@ @7@ @7@j88 j88@@v@-to_seq_values@!a @6#@@ @7A#Seq!t@@ @7@ @7@:m99;m996@@9w@'add_seq@"!a @6@@ @7@^#Seq!t@@ @7@ @7@@ @7@@ @7@ @7@ @7@bp9O9Scp9O9@@ax@+replace_seq@J!a @6@@ @7@#Seq!t@@ @7@ @7@@ @7G@@ @7@ @7@ @7@s99s99@@y@&of_seq@#Seq!t@@ @7!a @6
@ @7@@ @7@@ @7@ @7@v99v9:@@z@@@: ; @
 v0unification_modeS  8 @@*Expression@@G 
H @@  x'Pattern@@P :<Q :E@@	 y@@A@@@@@T @@A@ w4equations_generationT  8 @@)Forbidden@@` a @@ {'Allowed-equated_types@!t	@@ @;r@@ @;tx y @@1 |@@| } @@5 }@@A@@@@@ @@@@8 z%umodeѠR@@ @;U@;@@ @;U@;@  @@K 4equations_generationL@@ @;U@;@@ @;U@;@    @@^ 0assume_injective@@ @;U@;@@ @;U@;@  ' +  ' ;@@p 8allow_recursive_equation	@@ @;U@;@@ @;U@;@ H L H d@@ 6can_generate_equations@:@@ @;U@;@@ @;U@;@ @;U@;@ r v r @@ 0set_mode_pattern(generateM@@ @<YU@< )injective7@@ @<lU@</allow_recursiveB@@ @<U@<@@$unitF@@ @</@ @<U@<@ @<.U@<@ @<U@<@ @<U@<@ @<	U@<@ @<U@;@	  	  @@ 1in_current_module @@@ @<U@<i@@ @<U@<@ @<U@<@	-""	.""'@@ -in_pervasives@$Path!t@@ @<U@<g@@ @<U@<@ @<U@<@	G"w"{	H"w"@@  +is_datatype@(0type_declaration@@ @=%U@=@@ @=dU@=@ @=U@=@	^"#	_"#
@@ -object_fields	@	@@ @=U@=|Y@@ @=U@=}@ @=~U@={@	s-$$	t-$$@@, .flatten_fields
@i@@ @>PU@=$listI@@ @>U@>r*field_kind@@ @>U@>@@ @>U@>@ @>U@>d@@ @>tU@>]F@@ @>U@>^@ @>_U@=@ @=U@=@	2%R%V	2%R%d@@i ,build_fields@S@@ @?U@>@:8@@ @?
U@>7@@ @?U@>@@ @?U@>@ @>U@>@@ @>@@@ @?U@>@ @>@ @>U@>@ @>U@>@	>&z&~	>&z&@@ 0associate_fields&@
Ҡ	 @A	 @A	  @A@ @B
@@ @BU@?!@
	/ @A	1 @A@ @B@@ @BU@?(#"!@ @B@@ @B
$listI2@@ @B%@@ @B@ @B	U@?)@ @?*U@?"@ @?#U@? @
.B&&
/B&&@@ 0has_dummy_methodI@@@ @BOU@B;@@ @B{U@B<@ @B=V@B:@
DR)D)L
ER)D)\@@ ʠ,is_self_typeM@%)type_desc@@ @BU@B@@ @BU@B@ @BU@B@
[X))
\X))@@
 Π*object_rowQ@@@ @BU@B@@ @C0U@B@ @BV@B@
p_**
q_**@@
) Р-opened_objectV@@@ @C{U@Ch@@ @CU@Ci@ @CjU@Cg@
f+7+;
f+7+H@@
> ՠ/concrete_objectY@0@@ @CU@C@@ @CU@C@ @CU@C@
k++
k++@@
S נ,close_object\@E@@ @EU@C@@ @E*U@C@ @CU@C@
r,b,f
r,b,r@@
h ٠,row_variablee@Z@@ @EU@E<Z@@ @EU@E=@ @E>U@E;@
.+./
.+.;@@
} /set_object_namem@%Ident!t@@ @FvU@E@m)type_expr@@ @FJU@E@ɠU@F@@ @FU@E@@@ @FU@E$unitF@@ @FEU@E@ @EU@E@ @EU@E@ @EU@E@ @EU@E@ ////@@
 2remove_object_nameu@@@ @FU@F@@ @FU@F@ @FU@F@0J0N0J0`@@
 4hide_private_methodsy@@@ @G]U@GJ$unitF@@ @GU@GK@ @GLU@GI@-1014.101H@@
 7signature_of_class_type@*class_type@@ @HSU@HO/class_signature@@ @HuU@HN@ @HPV@HM@F3A3IG3A3`@@
 )self_type@@@ @MU@M @@ @MU@M@ @MU@L@[44\44@@ 0class_type_arity@.@@ @M,U@M(#intA@@ @M`U@M'@ @M)V@M&@s4K4St4K4c@@, /sort_row_fields@(Asttypes%label@@T@ U@M")row_field@@T@ T@M@ @MU@M@@ @M@@ @M@ @MU@M@5555@@W(merge_rf@!
 @N@ @N@ @NU@O5@@ @OCU@N@3@ @N@ @NU@OJ@@ @ORU@N@	$U@N#@ @NU@N@@ @NU@N@U4@@ @OBU@N@	*U@O@@ @O%U@NIU@O	@@ @OU@Ot@@ @O$U@O8U@O@ @OU@N@ @N@ @N@ @N@ @N @ @N!V@N@66
66@@0merge_row_fields@T@P{T@P|@ @PU@P@@ @PU@O@T@P@ @PU@P@@ @PU@O$U@OU@O
('@ @PU@O@@ @OU@O@ @OU@O@ @OU@O@ @OU@O@F77G77@@1filter_row_fields@e@@ @QU@Q@
9@ @Q@@ @QU@Q@ @Q@@ @QU@Q
7@ @RU@Q@@ @QU@Q@ @Q@ @QV@Q~@u88v88@@.*Non_closed
U    
#@)type_expr@@ @RW
@@ @RX@@A::::@@A .free_variablesڠ
b>@@U@  W@Vՠ"@@U@WQU@V@U@VU@Re@@ @RfV@R^@@ @RcV@RZ@::::@@d!-really_closed
@@U@SU@Rt@@ @RuV@Rm@@ @RrV@Ri@::::@@}"-free_vars_rec
@+V@Ry@b)type_expr@@ @TV@Rz@@ @TV@R{@ @R|@ @R}W@Rx@>?>?@@#)free_vars#envK4V@V@@ @VV@V @&@@ @VVV@V

ˠiU@SZ@@ @VV@V@ @VV@V@ @VV@U@
CC!
CC*@@0.free_variables#envpYV@V@@ @VV@V@)type_expr@@ @VV@VU@S[@@ @WV@V@ @VV@V@ @VV@V@
,(CC
-(CC@@4+closed_type#@e@@ @W"V@W

@@ @W=V@W@ @WV@W	@
A-D9D=
B-D9DH@@89closed_parameterized_type(@Ġ5@@ @WW@W@@ @WV@W@?@@ @X
V@W	@@ @XV@W@ @WV@W@ @WV@W@
f2DD
g2DD@@<0closed_type_decl-@	0type_declaration@@ @Z^V@X@@ @ZgV@ZD@@ @ZEV@X@ @XV@X@
:E{E
:E{E@@<@<closed_extension_constructor=@	5extension_constructor@@ @[V@Zlޠ@@ @[V@Z@@ @ZV@Zm@ @ZnV@Zk@
YHH
YHH@@YN4closed_class_failureAV  8 @@)CC_MethodB
)type_expr@@ @[#@@ @[$@@ @[%
)type_expr@@ @[&@@
gJ2J6
gJ2Jh@@|R(CC_ValueC
)type_expr@@ @['@@ @[(@@ @[)
)type_expr@@ @[*@@
hJiJk
hJiJ@@S@@A@@@@@
fJJ@@@@Q)CCFailureDW    @M@@ @[A@@A
jJJ
jJJ@@T,closed_classE@@@ @]Z@]m@@ @]{X@[D@	/class_signature@@ @]X@[K\,@@ @]X@]:@@ @];X@[L@ @[MX@[E@ @[FX@[C@lJJlJJ@@U.duplicate_typeV@%Types)type_expr@@ @^eX@]
)type_expr@@ @^dX@]@ @]X@]@:NN;NN@@c4duplicate_class_type[@*class_type@@ @^X@^n#*class_type@@ @^X@^o@ @^pX@^m@SO3O7TO3OK@@e*generalize^@@@ @_oX@^@@ @_nX@^@ @^Y@^@hQsQ{iQsQ@@!g*generalizeb@@@ @_X@_|@@ @_X@_}@ @_~X@_{@}RR~RR@@6k4generalize_structured@@@ @aX@_@@ @aX@_@ @_Y@_@SPSXSPSl@@Km4generalize_structurei@@@ @aUX@a*@@ @aTX@a+@ @a,X@a)@U,U0U,UD@@`r0generalize_spinek@	R@@ @aoX@a[@@ @aX@a\@ @a]Y@aZ@UUUU@@ut7forward_try_expand_safey@
@@W@ *X@c@	p@@W@eX@c@@W@tW@c@ @cX@c@ @cX@c@@ @cX@c@XXXX@@6normalize_package_path|@@@ @djX@c@	!t@@ @dAX@cX@c@ @c@ @cY@c@YCYKYCYa@@2check_scope_escape@;X@d@#intA@@ @eX@d@:W@d<@@ @fzX@d@ @d@ @d@ @dY@d@[K[S[K[e@@2check_scope_escape@YX@f@ @@ @fX@f@YX@f<@@ @fX@f@ @fX@f@ @fX@f@ @fX@f@:^^;^^@@,update_scope@
@@ @gX@gN@{@@ @gX@gOy@@ @gX@gP@ @gQ@ @gRY@gM@W_\_dX_\_p@@0update_scope_for@ @h:@@ @hGX@g@(@@ @h$X@h@@@ @h#X@h@@ @h"X@h
@ @hX@h@ @hX@g@ @h X@g@!``!``@@9,update_level@X@h`@&@@ @nX@ha@@@ @jX@hb@@@ @nX@hc@@ @nX@hd@ @he@ @hf@ @hg@ @hhY@h_@.bnbv.bnb@@a,update_level@X@o@*@@ @pEX@o@
a@@ @oX@o@@ @pX@o@ @oX@o@ @oX@o@ @oX@o@jk_kcjk_ko@@0update_level_for@% @p@@ @pX@pZ@X@pa@X@@ @pX@ph@
@@ @pX@po@@ @pX@pp@ @pqX@pi@ @pjX@pb@ @pcX@p[@ @p\X@pY@ulYl]ulYlm@@Ǡ3lower_contravariant@8X@p@y@@ @r3X@p@Z'Hashtbl!t
@@ @qMX@q4_@@ @sX@q3@@ @qBX@p@X@p@PX@pR@@ @tX@p@ @p@ @p@ @p@ @p@ @pY@p@0|mm#1|mm6@@͠3lower_contravariant@oX@u?@fX@uFi@@ @uX@uG@ @uHX@u@@ @uAX@u>@GssHss@@ .correct_levels@)@@ @uX@u$@@ @uX@u@ @uX@u@\tt]tt@@2limited_generalize@@@ @v
X@u@@@ @yX@u
@@ @zKX@u@ @uX@u@ @uX@u@{tt|tt@@4-inv_type_exprX  8 @@(inv_type@)type_expr@@ @z{ {{ {@@E+inv_parentsA@@ @z@@ @zŰ{{"{{J@@V @@A@@@@@zz{{L@@@@Z(inv_type@%Btype(TypeHash!t>@@ @|0Y@|s@@ @|Y@z@@@ @|Y@|@@ @|Y@z@@@ @|Y@z@@ @|Y@z@ @z@ @z@ @zZ@z@{N{V{N{^@@/compute_univars7@@@ @}Y@|@@#key@@ @  Y@  G'TypeSet!t@@ @Y@  @ @  Y@|@ @|Y@|@|r|v|r|@@-fully_generics@@@ @  Y@  2
M@@ @  Y@  3@ @  4Y@  1@

@@)find_reprz@
@@ @  AY@  @@@ @  XY@  q@@ @  LY@  +@@ @  ,Y@  @ @  @ @  Z@  @3    4    @@-abbreviations


@@ @  Z@  @@ @  Y@  @@ @  Y@  @K4    L4    @@!$copy'partial@@@ @  Y@  v@@ @  Y@  A @  Y@  ՠ
@@ @  Y@  @ @  Y@  @@ @  *keep_namesؠ$boolE@@ @  `Y@  @@ @  @(For_copy*copy_scope@@ @  Y@  @
$)type_expr@@ @  ^Y@   
+)type_expr@@ @  ]Y@  @ @  @ @  @ @  @ @  Z@  @9    9    @@["(instance'partial

@@ @  Y@  >@@ @  ?Y@  ;@*@@ @  Y@  H(@@ @  Y@  I@ @  JY@  <@ @  =Y@  :@        @@I0generic_instance@?@@ @  1Y@  =@@ @  QY@  @ @  Y@  @        @@O-instance_list@`Z@@ @  Z@  y@@ @  Y@  UР^@@ @  Z@  w@@ @  Y@  V@ @  WY@  T@  3  7   3  D@@S3reified_var_counterQ
$Vars!t@@X@  |X@  @@ @  Y@  @@ @  Y@  @        @@W9reset_reified_var_counter@@@ @  Y@  v@@ @  Y@  @ @  Y@  @1    2    @@X5get_new_abstract_name@1#key@@ @  xY@  Y@  @ @  Y@  @E  l  pF  l  @@Y.new_local_type#loc
(Location!t@@ @  Y@  @@ @  Y@  2manifest_and_scope
Ǡ
]@@ @  OY@  n@@ @  |Y@  @ @  Y@  @@ @  Y@  @@@ @  Y@  	6@@ @  Y@  @ @  Y@  @ @  Y@  @ @  Y@  @        @@F\0existential_name@n7constructor_description@@ @  	Y@  w@
C@@ @  Y@  ~&stringO@@ @  Y@  @ @  Y@  x@ @  yY@  v@        *@@ie4instance_constructor*in_pattern@@ @  Y@  @@ @  Y@  R#intA@@ @  Y@  S@ @  TY@  @@ @  Y@  @H@@ @  Y@  (ƠR@@ @  @@ @  Y@  Y@@ @  Y@  ֠b@@ @  @@ @  Y@  
@ @  Y@  )@ @  *Y@  @ @  Y@  @        @@i;instance_parameterized_type*keep_nameso@@ @  Y@  "@@ @  #Y@  @7@@ @  [@  X@@ @  dY@  ,@@@ @  Y@  3@@ @  @@ @  Y@  @@ @  Y@  @ @  Y@  4@ @  5Y@  -@ @  .Y@   @ @  !Y@  @G  B  FH  B  a@@ z=instance_parameterized_type_2@j@@ @  [@  6@@ @  BY@  @y@@ @  [@  @@ @  Y@  
@@@ @  Y@  V@@ @  ,@@ @  +Y@  '`@@ @  .@@ @  -Y@  (@@ @  /Y@  )@ @  *Y@  @ @  Y@  @ @  Y@  @ @  Y@  @  "  &  "  C@@L(map_kind@@2)type_expr@@ @  Y@  g@@ @  Y@  e@ @  tY@  <@)type_kind1label_declaration@@ @  Y@  G7constructor_declaration@@ @  Y@  H@@ @  FY@  C@@ @  Y@  b@@ @  Y@  c@@ @  dY@  D@ @  EY@  =@ @  >Y@  ;@  #  '  #  /@@4instance_declaration@
@@ @  Y@  
@@ @  Y@  @ @  Y@  @/    /    $@@<generic_instance_declaration@
@@ @  Y@  
@@ @   Y@  @ @  Y@  @7    7    8@@.instance_class@'@@ @  [@  /@@ @  ;Y@  $@@@ @  Y@  +@@ @  @@ @  Y@  @@ @  Y@  @ @  Y@  ,@ @  -Y@  %@ @  &Y@  #@7>    8>    @@)diff_list8@l @  Y@  @@ @  Y@  @Y@  0
Y@  @@ @  Y@  @ @  @ @  Z@  @VY    WY    @@)conflicts=@n@@ @  RY@  @@@ @  :Z@  #@@ @  /Y@  $boolE@@ @  QY@  @ @  Y@  @ @  Y@  
@}^    ~^    "@@6,delayed_copyCϠW$Lazy!t	r@@X@  Z@  @@X@  X@  @@ @  Y@  @@ @  Y@  @b    b    @@Y(copy_sepD@"@@ @  Y@  @@@ @  Y@  @@Y@@ @  Y@  @@ @  >Y@  A @  Y@  @
j@@ @  @@ @  9Y@  @
}@@ @  D_@  3R@@ @  _@  6'_@  7@ @  8_@  4@ @  5^@  @@ @  Y@  @d@@ @  Y@  Y@  @ @  @ @  @ @  @ @  @ @  @ @  Z@  @g  I  Q g  I  Y@@.instance_poly'd@@@ @  RY@  *keep_names)@@ @  GY@  @l@@ @  QY@  @?@@ @  )Z@  @@ @  Y@  @@@ @  GY@  @@ @  ?@@ @  >Y@  ;@@ @  @Y@  <@ @  =Y@  @ @  Y@  @ @  Y@  @ @  Y@  @ @  Y@  @ @  Y@  @O    P    @@ڠ-instance_poly*keep_namesu@@ @  Y@  P@@ @  QY@  M@@@ @  Y@  x@@@ @  @@ @  Y@  @@@ @  Y@  e@@ @  @@ @  Π@@ @  @ @  Y@  @ @  Y@  @ @  Y@  y@ @  zY@  N@ @  OY@  L@        @@O.instance_label@@@ @  pY@  @1label_description@@ @  Y@  A@@ @  @@ @  Y@  %@@ @   Y@  +@@ @  !Y@  @ @  Y@  @ @  Y@  @ @  Y@  @        @@&unify'@Y@  5@h@@X@  }Y@  <@)type_expr@@X@  Y@  C
@@X@  X@  D@ @  EY@  =@ @  >Y@  6@ @  7Y@  /@@ @  4Y@  +@  |    |  @@%subst@6Y@  V@@@ @  Y@  ]@(Asttypes,private_flag@@ @  Y@  d@i@@ @  @@ @  Y@  k@	t)type_expr@@ @  Y@  @@ @  Y@  r@T@@ @  4@@ @  3Y@  y@fZ@  @@ @  Y@  @@@ @  2Y@  @@ @  Y@  @ @  Y@  @ @  Y@  z@ @  {Y@  s@ @  tY@  l@ @  mY@  e@ @  fY@  ^@ @  _Y@  W@ @  XY@  U@_    `    @@%apply@Y@  9@@@ @  @@ @  Y@  @@@@ @  Y@  G@<X@  ~@@ @  Y@  N@@ @  Y@  O@ @  PY@  H@ @  IY@  A@ @  BY@  :@ @  ;Y@  8@  F  J  F  O@@J,previous_env@@ @  1Y@  +@@ @  0Y@  '@        @@\0check_abbrev_env@@@ @  {Y@  4@@ @  ~Y@  5@ @  6Y@  3@  K  O  K  _@@q1expand_abbrev_gen@@@ @  Y@  @@@@ @  Y@  @
Y@  N@@ @  @@ @  Y@  àU@@ @  Y@  Ġ#intA@@ @  Y@  @ @  Y@  A @  Y@  A @  Y@  @3Y@  @
2@@ @  Y@  @@ @  Y@  @ @  Y@  @ @  Y@  @ @  Y@  @ @  Y@  @  K  O  K  `@@-expand_abbrev@MY@  
@
L@@ @  @Y@  @@ @  ?Y@  @ @  Y@  @ @  Y@  	@(J    )J    @@+0expand_head_once@gY@  q@@@ @  Y@  x@@ @  Y@  y@ @  zY@  r@ @  sY@  p@BN  =  ACN  =  Q@@.+safe_abbrev@Y@  @
@@ @  Y@  @@ @  Y@  @ @  Y@  @ @  Y@  @\T    ]T    @@1/try_expand_once@Y@  e@@@ @  ~Y@  l@@ @  Y@  m@ @  nY@  f@ @  gY@  d@vb  o  swb  o  т@@/5/try_expand_safe@Y@  @&@@ @   Y@  &@@ @  Y@  @ @  Y@  @ @  Y@  @i  +  /i  +  >@@I9/try_expand_head	@@@ @  GY@  e@@ @  ]Y@  hY@  iA @  jY@  fA @  gY@  F@@
Y@  HY@  I@ @  J@ @  K@ @  LZ@  E@p    p    @@p=0expand_head_unif		@Y@  @g@@ @  Y@  Y@  @ @  Y@  @ @  Y@  @v    v    @@B+expand_head	@	
Y@  (@~@@ @  jY@  /Y@  0@ @  1Y@  )@ @  *Y@  '@~  ԙ  ԝ~  ԙ  Ԩ@@F9extract_concrete_typedecl	@	$Y@  @@@ @  NY@  @@ @  
Y@  @@ @  Y@  %Types0type_declaration@@ @  Y@  @ @  @ @  @ @  Z@  @        @@I1expand_abbrev_opt	@	PY@  s@O@@ @  Y@  z@@ @  Y@  {@ @  |Y@  t@ @  uY@  r@+    ,    @@R/safe_abbrev_opt	@	jY@  @i@@ @  Y@  @@ @  Y@  @ @  Y@  @ @  Y@  @E  ?  CF  ?  R@@U3try_expand_once_opt	$@	Y@  F@@@ @  _Y@  M@@ @  Y@  N@ @  OY@  G@ @  HY@  E@_    `    @@Y3try_expand_safe_opt	)@	Y@  @@@ @  Y@  @@ @  Y@  @ @  Y@  @ @  Y@  @y  ڏ  ړz  ڏ  ڦ@@2]/expand_head_opt	.@	Y@  @)@@ @  VY@  Y@  @ @  Y@  @ @  Y@  @  5  9  5  H@@Ia+full_expand	20may_forget_scope@@ @  uY@  _@	Y@  f@K@@ @  >Y@  m8@@ @  ¿Y@  n@ @  oY@  g@ @  hY@  `@ @  aY@  ^@  g  k  g  v@@nd.generic_abbrev	=@@@ @  ,Y@  @!t@@ @  -Y@  +@@ @  >Y@  @ @  Y@  @ @  Y@  @  )  -  )  ;@@n6generic_private_abbrev	B@@@ @  ÁY@  b@@@ @  ÂY@  iI@@ @  ýY@  j@ @  kY@  c@ @  dY@  a@        @@r.is_contractive	G@.@@ @  #Y@  @@@ @  WY@  g@@ @  8Y@  @ @  
Y@  @ @  Y@  @        @@v%Occur	LY    @@@A  "  "  "  1@@z)occur_rec	M@
ZZ@  Ė@	@@ @  aZ@  ė@=@@ @  ƑZ@  Ę@D#elt@@ @  ƒZ@  ę@	Z@  ěh@@ @  ƯZ@  Ě@ @  Ĝ@ @  ĝ@ @  Ğ@ @  ğ@ @  Ġ[@  ĕ@F  3  ;G  3  D@@{,type_changed	Z@@ @  7Z@  0@@ @  5Z@  ,@X  f  jY  f  v@@%merge	[@@@ @  \Z@  N@@ @  YZ@  ;@@@ @  IZ@  B@@ @  _Z@  C@ @  DZ@  <@ @  =Z@  :@|    }    @@5%occur	_@
Z@  e@U@@ @  'Z@  l@	Z@  s@@ @  ]Z@  t@ @  uZ@  m@ @  nZ@  f@ @  gZ@  d@        @@U)occur_for	g@ @  @@ @  Z@  ȡ@
Z@  Ȩ@@@ @  Z@  ȯ@	Z@  ȶ@@ @  Z@  ȷ@ @  ȸZ@  Ȱ@ @  ȱZ@  ȩ@ @  ȪZ@  Ȣ@ @  ȣZ@  Ƞ@(  t  x(  t  @@(occur_in	m@Z@  @@@ @  3Z@  @	Z@  #@@ @  <Z@  @ @  Z@  @ @  Z@  @ @  
Z@  
@-    -    @@:local_non_recursive_abbrev	r)allow_recN@@ @  ˽Z@  P@
f@@ @  ˱Z@  Q@Ѡ@@ @  Z@  p@@ @  ʌZ@  R@DZ@  S@w@@ @   Z@  T@
H@@ @  Z@  U
F@@ @  Z@  V@ @  W@ @  X@ @  Y@ @  Z@ @  [@ @  \[@  O@$5  3  ;%5  3  U@@:local_non_recursive_abbrev	@cZ@  b@@@ @  Z@  i@
k@@ @  4Z@  p@@ @  9Z@  q@ @  rZ@  j@ @  kZ@  c@ @  dZ@  a@GV  2  6HV  2  P@@ ,unify_univar	@)type_expr@@ @  Z@  M@	@@ @  εZ@  N@C@@ @   &optionJ)type_expr@@ @  θ@@ @  ηZ@  N@@ @  OZ@  @ @  @@ @  Z@  i#3@@ @  "@@ @  @@ @  Z@  \@@ @  ]Z@  	@ @  @@ @  Z@  j@ @  k@@ @  Z@  P@@ @  ΜZ@  O@ @  Q@ @  R@ @  S[@  L@g    g    @@h0unify_univar_for	@	 @  @@ @  Z@  ϝ@s@@ @  Z@  Ϥ@|@@ @  Z@  ϫ@s@@ @  2nk@@ @  @@ @  @@ @  @ @  @@ @  @@ @  I@@ @  @@ @  @@ @  @ @  @@ @  @ @  @@ @  Z@  ϲs@@ @  Z@  ϳ@ @  ϴZ@  Ϭ@ @  ϭZ@  ϥ@ @  ϦZ@  Ϟ@ @  ϟZ@  Ϝ@}    }    @@,occur_univar	(inj_only~0@@ @  Z@  *@@ @  +Z@  '@]@@ @  OZ@  R@e@@ @  5Z@  YJ@@ @  4Z@  Z@ @  [Z@  S@ @  TZ@  (@ @  )Z@  &@A    B    @@Š0has_free_univars	@{@@ @  nZ@  F@@@ @  mZ@  M@@ @  |Z@  N@ @  OZ@  G@ @  HZ@  E@_    `    @@ܠ5has_injective_univars	@@@ @  ׺Z@  ג@@@ @  ׹Z@  י@@ @  Z@  ך@ @  כZ@  ד@ @  הZ@  ב@}    ~    2@@6ߠ0occur_univar_for	@נ @  &@@ @  3Z@  @@@ @  Z@  @@@ @  Z@  @@ @  
Z@  @ @  Z@  @ @  Z@  @ @  Z@  @        @@_+add_univars	@
@@ @  ؇Z@  P@.a@@ @  ؕZ@  oNK@@Y@ @@Y@ @@Y@ Y@  p@ @  qZ@  R@@ @  a$@ @  `@ @  _Z@  K@  4  8  4  C@@1get_univar_family	@*`@@ @  נ @  @ @  @@ @  ՠĠ@@ @  ڠ;@ @  @@ @  @ @  Z@  ٩@@ @  ٸZ@  ب@F@@ @  ٞ[@  }@@ @  ٌZ@  د @@ @  Z@  ذ@ @  رZ@  ة@ @  تZ@  ا@        @@.univars_escape
@R@@ @  ۶Z@  @vJ@@ @  'a @  @ @  &@@ @  %
@@ @  *@ @  )@@ @  (@ @  $@@ @  #Z@  @@@ @  "@@ @  !Z@  @@@ @  Z@  @@ @  Z@  @ @  Z@  @ @  Z@  @ @  Z@  @ @  Z@  @h / 3i / A@@!*enter_poly
@@@ @  Z@  @Ǡb-@@ @  Y@  ޼@ @  @@ @  b:@@ @  Y@  @ @  @@ @  @ @  @@ @  ߫Z@  @@ @  Z@  @@@ @  
Z@  @
ɠV@@ @  ݘ[@  ݁@@ @  ݍZ@  @@@ @  \Z@  @
n@@ @  ݸ[@  ݡ@@ @  ݭZ@  
@@4Z@  #@"Z@  &@ @  Z@  'A @  (Z@  $A @  %Z@  @ @  Z@  @ @  Z@  @ @  Z@   @ @  Z@  @ @  Z@  @ @  Z@  @ @  Z@  @     @@.enter_poly_for
/@F @  @@ @  Z@  >@1@@ @  Z@  E@V,@@ @  ŠYY@  ߝ@ @  @@ @  à@@ @  Ƞ
@ @  @@ @  @ @  @@ @  @@ @  Z@  L@@@ @  Z@  S@U@@ @  @@ @  Z@  Z@5@@ @  Z@  a@k@@ @  @@ @  Z@  h@@.@@ @  pZ@  ~A @  ๐A @  Z@  o@ @  qZ@  i@ @  jZ@  b@ @  cZ@  [@ @  \Z@  T@ @  UZ@  M@ @  NZ@  F@ @  GZ@  ?@ @  @Z@  =@n  	 	o  	 	"@@ ',univar_pairs
:H(@@Y@ @Y@ @@Y@ \4@@Y@ @Y@ @@Y@ @Y@ Y@  (@@ @  )Z@  !@@ @  &Z@  @ 	 	 	 	@@ V#&polyfy
;@Z@  -@@@ @  Z@  4@Π[@@ @  [@  	@@ @  Z@  ;N@@ @  TZ@  Q&@@ @  UZ@  R@ @  SZ@  <@ @  =Z@  5@ @  6Z@  .@ @  /Z@  ,@	 
 

	 
 
@@ $-reify_univars
N@Z@  b@M@@ @  Z@  in@@ @  Z@  j@ @  kZ@  c@ @  dZ@  a@  
 
  
 
%@@ 54has_cached_expansion
T@Z@@ @  Z@  @@@ @  Z@  C@@ @  Z@  @ @  @ @  [@  @+  +  0@@ :0expand_any_trace
Z@@@@@ @  '@ @  &Z@   @@ @  #@ @  Z@  $A @  %Z@  !A @  "Z@  @cZ@  @Z@  @ @  Z@  @ @  Z@  @ @  Z@  @64 H L74 H \@@ @,expand_trace
c@uZ@  0@$listITQ@@ @  X[@  bz @  _@@ @  p@@ @  oZ@  7f[@  ^@@ @  n@@ @  mZ@  8@ @  9Z@  1@ @  2Z@  /@h< _ ci< _ o@@!!G4expand_subtype_trace
g@Z@  x@2'Subtype#elt@@ @  @@ @  @@ @  Z@  D@@ @  @@ @  @@ @  Z@  @ @  Z@  y@ @  zZ@  w@?  ?  @@!QJ*deep_occur
k@>@@ @  7Z@  @@@ @  Z@  @@ @  Z@  @ @  Z@  @ @  Z@  @E W [E W e@@!oM4gadt_equations_level
r@@Y@ Y@  @@ @  Z@  @@ @  Z@  @R  R  @@!S8get_gadt_equations_level
s@@@@ @  Z@  Y@  @ @  Z@  @T  T  @@!T%reify
w@6$Z@  @@ @  Z@  @$@@ @  Z@  "@@ @  Z@  @ @  Z@  @ @  Z@  @ ]  ]  @@!V*is_newtype
@:@@ @  FZ@  '@@@ @  GZ@  .>@@ @  [Z@  /@ @  0Z@  (@ @  )Z@  &@    @@!t-non_aliasable
@@@ @  Z@  @@@ @  Z@  \@@ @  Z@  @ @  Z@  @ @  Z@  @<  =  @@!x/is_instantiable
@v@@ @  -Z@  @@@ @  Z@  z@@ @  BZ@  @ @  Z@  @ @  Z@  
@Z  #[  2@@"{0compatible_paths
@@@ @  Z@  @@@ @  'Z@  f@@ @  Z@  @ @  Z@  @ @  Z@  @x ^ by ^ r@@"13expands_to_datatype
@Z@  7@!@@ @  Z@  8M@@ @  Z@  9@ @  :@ @  ;[@  6@ F N F a@@"I%mcomp
@1@@ @ Z@  @@ @  Z@  @Z@  @@@ @  Z@  @Z@  Z@  @ @  @ @  @ @  @ @  [@  @ ! ! ! !@@"o*mcomp_list
@&Z@  @Z@  @ Z@  @@ @  Z@  @'@@ @  Z@  5Z@  @ @  @ @  @ @  @ @  [@  @	 ,J ,N	 ,J ,X@@",mcomp_fields
@HZ@  @Z@   @@@ @  Z@  @@@ @  Z@  TZ@  @ @  @ @  @ @  @ @  [@  @	 , ,	 , ,@@"*mcomp_kind
@*field_kind@@ @  \Z@  @o@@ @  9Z@  	@@ @  Z@  
@ @  @ @  [@  @ 	  /t /x 	  /t /@@")mcomp_row
@Z@  
@XZ@  @(row_desc@@ @  Z@  @	@@ @  Z@  Z@  @ @  @ @  @ @  @ @  [@  @ 6	( 0F 0J 7	( 0F 0S@@"/mcomp_type_decl
@Z@  @yZ@  @@@ @  Z@  @#@@ @  Z@  @Z@  @Z@  Z@  @ @  @ @  @ @  @ @   @ @  !@ @  "[@  @ ]	C 4 4 ^	C 4 4@@#1mcomp_type_option
@Z@  #@Z@  $@Z@ @@ @ Z@  %@ Z@ @@ @ Z@  &Z@  '@ @  (@ @  )@ @  *@ @  +[@  @ 	a 9 9 	a 9 9@@#;9mcomp_variant_description
@Z@  ,@Z@  -@Z@@ @ @@ @ Z@  .@@@ @ @@ @ Z@  /Z@  0@ @  1@ @  2@ @  3@ @  4[@  @ 	g :? :C 	g :? :\@@#c8mcomp_record_description
@Z@  5@Z@  6@
	@@ @ B@@ @ AZ@ ;@
@@ @ D@@ @ CZ@ >3Z@ ?@ @ @Z@ <@ @ =Z@  7@ @  8@ @  9[@  @ 	z < < 	z < <@@#%mcomp`@Z@ K@@@ @ xZ@ R@	Z@ Y@@ @ wZ@ Z@ @ [Z@ S@ @ TZ@ L@ @ MZ@ J@ 	 >( >, 	 >( >1@@#)mcomp_ford@ T - @ @@ @ Z@ @DZ@ @ @@ @ Z@ @	Z@ .@@ @ Z@ @ @ Z@ @ @ Z@ @ @ Z@ @ @ Z@ @!%	 >f >j!&	 >f >s@@#1find_lowest_levelj@@@ @ Z@ @@ @ Z@ @ @ Z@ @!;	 > >!<	 > ?@@#4find_expansion_scopeq@u@@ @ Z@ @@@ @ Z@ @@ @ Z@ @ @ Z@ @ @ Z@ @!Y	 @ @!Z	 @ @0@@$"1add_gadt_equationu@Z@  @@ @ &Z@ @7!t@@ @ Z@ @R@@ @ Z@ @@ @ 9Z@ @ @ Z@ @ @ Z@ @ @ Z@ @!	 @m @q!	 @m @@@$>%,unify_eq_set}@@Y@ Y@ I@@ @ PZ@ E@!	 B B!	 B B@@$P,/order_type_pair~@@@ @ sZ@ V@	Z@ ]Z@ y
Z@ z@ @ {Z@ ^@ @ _Z@ W@ @ XZ@ U@!	 C C!	 C C'@@$o-1add_type_equality@!>@@ @ Z@ @Z@ @@ @ Z@ @ @ Z@ @ @ Z@ @!	 Ca Ce!	 Ca Cv@@$0/eq_package_path@
@@ @ EZ@ @K@@ @ #Z@ @T@@ @ "Z@ @@ @ Z@ @ @ Z@ @ @ Z@ @ @ Z@ @!	 C C!	 C C@@$3,nondep_type'L@>Z@ ]@ݠ%Ident!t@@Y@ Y@ p@@Y@ rZ@ c@7@@Y@ ZZ@ iY@ j@ @ kZ@ d@ @ eZ@ ^@ @ _Z@ W@@ @ \Z@ S@"+	 D: D>",	 D: DJ@@$7/package_subtype}@oZ@ @@@Y@ Z@ @a)Longident!t@@Y@ C[@ g	'@@Y@ *]@ e@Y@ i]@ U@@Y@ aZ@ @(Z@ @%Z@ @@Y@ Y@ @ @ Z@ @ @ Z@ @ @ Z@ @ @ Z@ @ @ Z@ ~@@ @ Z@ z@"v	 Dm Dq"w	 Dm D@@%/83Nondep_cannot_eraseZ    #$@%Ident!t@@ @ @@A"	 D D"	 D D@@%@90concat_longident@?@@ @ [@ @H@@ @ [@ M@@ @ [@ 	@ @ 
[@ @ @ \@ @"	 D D"	 D D@@%`:/nondep_instance@[@ 9@#U@@ @ [@ @@[@ G@[@ N@@ @ [@ O@ @ P[@ H@ @ I[@ A@ @ B[@ :@ @ ;[@ 8@"	 E E"	 E E@@%A2complete_type_list,allow_absent7@@ @ N[@ @@ @  [@ @@@ @ [@ '@ @@ @ >" @ /@ @ A@@ @ @[@ .@#@@ @ [@ 5@+module_type@@ @ [@ <@#&@@ @ ?@ @ =@@ @ <[@ C
[@ D@ @ E[@ =@ @ >[@ 6@ @ 7[@ /@ @ 0[@ (@ @ )[@ @ @ [@ @#%	 G% G)#&	 G% G;@@%I-unify_package@d[@ p@@[@ S@@ @ `[@ I@ [@ p@@ @ }[@ LY@@ @ [@ MA @ N[@ JA @ K[@ w@#@@ @ -[@ ~@![@ @[@ @$@@ @ [@ @[@ @
[@  @@ @ [@ @ @ [@ @ @ [@ @ @ [@ @ @ [@ @ @ [@ @ @ [@ x@ @ y[@ q@ @ r[@ o@#	 N- N1#	 N- N>@@&:b.rigid_variantsӠ@@ @ D[@ =@@ @ B[@ 9@#
	 O O#
	 O P	@@&Lm(unify_eq@@@ @ [@ H@[@ O
@@ @ e[@ P@ @ Q[@ I@ @ J[@ G@#
 P P#
 P P#@@&hn*unify1_var@[@ @
@@ @ 9[@ @
@@ @ >[@  @@ @ [@ @ @ [@ @ @ [@ @ @ [@ @#
 P P#
 P P@@&q/record_equation@#`@@ @ [@ :@(@ @ [@ A@@ @ [@ B@ @ C[@ ;@ @ <[@ 9@#
% R R#
% R R@@&v*unify3_var@ J8[@ @@ @ [@ @
@@ @ [@ @	[@ @X@@ @ [@ &@@ @ X[@ @ @ [@ @ @ [@ @ @ [@ @ @ [@ @$$
+ S_ Sc$%
+ S_ Sm@@&z%unify@ zh[@ a@@ @ a[@ @[@ @[@ !@@ @ U
[@  @ @ !@ @ "@ @ #\@ @$B
O Z Z&$C
O Z Z+@@&&unify2@[@ $@@@ @ )[@ %@[@ &[@ '@ @ (@ @ )@ @ *\@ @$Y
 b= bA$Z
 b= bG@@'&unify3@5[@ +@[@ ,@[@ -@[@ .@ [@ /4[@ 0@ @ 1@ @ 2@ @ 3@ @ 4@ @ 5\@ @$r
 f f$s
 f f@@'+*unify_list@N[@ 6@\'Y@ +@@ @ 9[@ 7@e	@@ @ 9[@ 8R[@ 9@ @ :@ @ ;@ @ <\@ @$R  $R  @@'I+make_rowvar@ 3@@ @ A[@ =@ @@ @ A[@ >@K[@ ?@ @@ @ A[@ @@[@ A[@ B@ @ C@ @ D@ @ E@ @ F@ @ G\@ @$X  $X  @@'o,unify_fields@[@ H@f[@ I@j[@ J[@ K@ @ L@ @ M@ @ N\@ @$k  $k  @@'*unify_kind@@@ @ E[@ O@A@@ @ D[@ P @@ @ C[@ Q@ @ R@ @ S\@ @$  $  @@')unify_row@[@ T@@@ @ 5[@ U@@@ @ 5[@ V[@ W@ @ X@ @ Y@ @ Z\@ @%  
%  @@'/unify_row_field@[@ [@Y#1fixed_explanation@@ @ bk@@ @ bj[@ \@f
@@ @ b@@ @ b[@ ]@@@ @ `I[@ ^@@@ @ a[@ _@[@ `@[@ a@[@ b [@ c@ @ d@ @ e@ @ f@ @ g@ @ h@ @ i@ @ j@ @ k\@ @%> 8 <%? 8 K@@'%unify
@![@ e@@ @ e[@ e @[@ e'@[@ e."@@ @ eX[@ e/@ @ e0[@ e(@ @ e)[@ e!@ @ e"[@ e@%aV S W%bV S \@@(*unify_gadt
/equations_level[@ e/allow_recursive!@@ @ fg[@ e@%#ref#!t@@ @ e@@ @ e[@ e@3[@ e@9[@ e+@@ @ f{@@ @ f[@ e@ @ e[@ e@ @ e[@ e@ @ e[@ e@ @ e[@ e@ @ e[@ e@%_  %_  @@([)unify_var
@[@ g+@ R@@ @ gL[@ g2@ [@@ @ gY[@ g9#&@@ @ gp[@ g:@ @ g;[@ g3@ @ g4[@ g,@ @ g-[@ g*@%q  %q   @@(~+unify_pairs
%@"	W@ h @@ @ j[@ i@}[@ i@[@ i@#mY@ 8@@ @ i[@ i#T@@ @ j[@ i@ @ i[@ i@ @ i[@ i@ @ i[@ i@ @ i[@ i@% * .% * 9@@(%unify
+@2[@ j"@[@ j)@[@ j0#q@@ @ jN[@ j1@ @ j2[@ j*@ @ j+[@ j#@ @ j$[@ j!@& | & | @@(1expand_head_trace
/@O[@ jk@ @@ @ j[@ jr[@ js@ @ jt[@ jl@ @ jm[@ jj@&'  &(  @@(,filter_arrow
5@f[@ j@!)type_expr@@ @ km[@ j@(Asttypes)arg_label@@ @ kL[@ j!@@ @ kw[@ kt!@@ @ kx[@ ku@ @ kv[@ j@ @ j[@ j@ @ j[@ j@ @ j[@ j@&\ N R&] N ^@@)3filter_method_field
B@[@ lY@@@ @ m[@ lZ@(Asttypes,private_flag@@ @ m[@ l[@!h@@ @ m[@ l\"
@@ @ m^[@ l]@ @ l^@ @ l_@ @ l`@ @ la\@ lX@&   &  3@@)@-filter_method
Q@[@ n?@@@ @ op[@ nF@/@@ @ oo[@ nM@r@@ @ o)[@ nT"6@@ @ oI[@ nU@ @ nV[@ nN@ @ nO[@ nG@ @ nH[@ n@@ @ nA[@ n>@&  &  @@)lʠ3check_filter_method
[@[@ o@.@@ @ p[@ o@[@@ @ p[@ o@@@ @ p[@ o$$@@ @ o[@ o@ @ o[@ o@ @ o[@ o@ @ o[@ o@ @ o[@ o@& u y& u @@)Ӡ2filter_self_method
a@[@ p%@"%Meths@@ @ s=[@ p,@@@ @ pd[@ p3@#P@@ @ sB"@@ @ sC@ @ sA^@ s,@@ @ s<[@ sF@@ @ sL[@ p:@@@ @ pc[@ pA[@ pB@ @ pC[@ p;@ @ p<[@ p4@ @ p5[@ p-@ @ p.[@ p&@ @ p'[@ p$@')  '*  @@)ؠ-moregen_occur
@h[@ sc@@@ @ t[@ sj@!@@ @ t[@ sq#U@@ @ t[@ sr@ @ ss[@ sk@ @ sl[@ sd@ @ se[@ sb@'L  'M  @@*/may_instantiate
@#k@@ @ t[@ t@"K@@ @ u[@ t#@@ @ t[@ t@ @ t[@ t@ @ t[@ t@'k
  'l
  @@*$'moregen
@#@@ @ [@ u'@@@ @ [@ w|@@ @ w[@ u(@[@ u)@/[@ u*@[@ u+[@ u,@ @ u-@ @ u.@ @ u/@ @ u0@ @ u1\@ u"@'
 T \'
 T c@@*L,moregen_list
@([@ u2@$[@ u3@[@ u4@M@@ @ {/[@ u5@U@@ @ {.[@ u64[@ u7@ @ u8@ @ u9@ @ u:@ @ u;@ @ u<\@ u#@'
I  '
I  +@@*p.moregen_fields
@L[@ u=@H[@ u>@[@ u?@"@@ @ |[@ u@@"@@ @ |[@ uAV[@ uB@ @ uC@ @ uD@ @ uE@ @ uF@ @ uG\@ u$@'
N  '
N  @@*,moregen_kind
@@@ @ [@ uH@O@@ @ [@ uI#@@ @ [@ uJ@ @ uK@ @ uL\@ u%@'
c  '
c  @@*+moregen_row
@[@ uM@[@ uN@;[@ uO@@@ @ {[@ uP@@@ @ {[@ uQ[@ uR@ @ uS@ @ uT@ @ uU@ @ uV@ @ uW\@ u&@(
m 5 9(
m 5 D@@*'moregen@$6@@ @ [@ K@@@ @ @@ @ [@ R@l[@ Y@[@ `@[@ g[@ h@ @ i[@ a@ @ b[@ Z@ @ [[@ S@ @ T[@ L@ @ M[@ J@(G
 ُ ٓ(H
 ُ ٚ@@+ ]+moregeneral@[@ @$k@@ @ [@ @@@ @ d[@ @@@ @ /[@ @@ @ [@ @ @ [@ @ @ [@ @ @ [@ @ @ [@ @(s
 f j(t
 f u@@+,c.is_moregeneral(@[@ @$@@ @ O[@ @@@ @ N[@ $@@@ @ M[@ +$@@ @ e[@ ,@ @ -[@ %@ @ &[@ @ @ [@ @ @ [@ @(
  (
  @@+Xk,rigidify_rec.@$)#M@@ @ @@ @ [@ @@ @ [@ v@@@ @ [@ w@@ @ [@ x@ @ y@ @ z\@ u@(
  (
  @@+~p(rigidify7@@@ @ M[@ 	&#s@@ @ 8@@ @ \[@ 
@ @ [@ @(
 7 ;(
 7 C@@+y1all_distinct_vars;@[@ b@f$)type_expr@@ @ [@ @@ @ [@ i$boolE@@ @ [@ j@ @ k[@ c@ @ d[@ a@)
  )
  @@+|'matchesB@C[@ @[@ @[@ %@@ @  [@ &@ @ '[@ @ @  [@ @ @ [@ @)! i m)" i t@@+*does_matchJ@`[@ m@[@ t@[@ {%z@@ @ [@ |@ @ }[@ u@ @ v[@ n@ @ o[@ l@)>  )?  @@+1expand_head_rigidO@}[@ @#@@ @ [@ [@ @ @ [@ @ @ [@ @)U A E)V A V@@,/normalize_substU@%}$@@ @ \@ $@@ @ \@ @ @ \@ @@ @ [@ @@ @ [@ %@@ @ [@ @ @ [@ @)#  )#  @@,:&eqtype\@@@ @ [@ @	@@ @ [@ @@ @ [@ @%*$H@@ @ [@ &$N@@ @ ;`@ '@ @ (@@ @ |[@ @@ @ [@ @[@ @a[@ @[@ ,[@ @ @ @ @ @ @  @ @ @ @ @ @ \@ @))  ))  @@,~+eqtype_list]@D[@ @@[@ @7[@ @[@ @@@ @ [@ @ @@ @ [@ 	T[@ 
@ @ @ @ @ @ 
@ @ @ @ @ @ \@ @)x  
)x  @@,-eqtype_fields^@l[@ @h[@ @_[@ @7[@ @$@@ @ [@ @$@@ @ [@ z[@ @ @ @ @ @ @ @ @ @ @ @ @ \@ @*}  *}  @@,+eqtype_kind_@
@@ @ [@ @ @@ @ [@ &8@@ @ Y[@  @ @ !@ @ "\@ @*/ O S*0 O ^@@,*eqtype_row`@[@ #@[@ $@[@ %@y[@ &@%(row_desc@@ @ [@ '@
*@@ @ [@ ([@ )@ @ *@ @ +@ @ ,@ @ -@ @ .@ @ /\@ @*W - 1*X - ;@@-+eqtype_list@@@ @ [@ @
Р@@ @ @@ @ [@ @&à+\%@@ @ ̠% @@ @ @ @ @@ @ @@ @ [@ @[@ @q:@@ @ [@ @{D@@ @ [@ 7[@ @ @ [@ @ @  [@ @ @ [@ @ @ [@ @ @ [@ @ @ [@ @* ` d* ` o@@-`&eqtype@ @@ @ M[@ @ '@@ @ D@@ @ L[@ @'+%l@@ @ J%p@@ @ K@ @ I@@ @ H@@ @ G[@ @[@ @[@ 	@[@ /[@ @ @ [@ 
@ @ [@ @ @ [@ @ @ [@ @ @ [@ @ @ [@ @* I M* I S@@-%equal@.[@ ~@M@@ @ [@ @@@ @ [@ @@@ @ [@ @@ @ [@ @ @ [@ @ @ [@ @ @ [@ @ @ [@ }@+  +  @@-(is_equal@\[@ @{@@ @ ;[@ 	@@@ @ :[@ @@@ @ 9[@ '@@ @ Q[@ @ @ [@ @ @ [@ 
@ @ [@ @ @ [@ @+K H L+L H T@@.-equal_private@[@ b@!9	[@ @@ @ [@ c@	[@ d@	[@ @@ @ [@ e@	[@ f(@@ @ [@ g@ @ h@ @ i@ @ j@ @ k@ @ l\@ a@+y  +z  @@.2>class_match_failure_trace_type[  8 @@+CM_Equality@@+ 	 	+ 	 	@@.?(*CM_Moregen@@+ 	 	+ 	 	@@.H)@@A@@@@@+ 	 	@@A@.K'3class_match_failure\  8 @@0CM_Virtual_class@@+ 
 
+ 
 
,@@.X+;CM_Parameter_arity_mismatch,@@ @ ,@@ @ @@+ 
- 
/+ 
- 
Y@@.k,:CM_Type_parameter_mismatch)!t@@ @ +!t+*comparison@@ @ @@ @ @@+ 
Z 
\+ 
Z 
@@.-6CM_Class_type_mismatch*!t@@ @ , *class_type@@ @ ,*class_type@@ @ @@+ 
 
+ 
 
@@..5CM_Parameter_mismatch*'!t@@ @ ,!t,*comparison@@ @ @@ @ @@, 
 
,	 
 %@@./4CM_Val_type_mismatch@@ @ ->@@ @ *N!t@@ @ ,=!t,C*comparison@@ @ @@ @ @@,/ 4 6,0 P @@.05CM_Meth_type_mismatch@@ @ -e@@ @ *u!t@@ @ ,d!t,j*comparison@@ @ @@ @ @@,V  ,W	  @@/14CM_Non_mutable_value -@@ @ @@,d
 
 ,e
 
 /@@/25CM_Non_concrete_value-@@ @ @@,r 0 2,s 0 S@@/+30CM_Missing_value-@@ @ @@, T V, T r@@/941CM_Missing_method-@@ @ @@,
 s u,
 s @@/G5.CM_Hide_public-@@ @ @@,  ,  @@/U6/CM_Hide_virtual-@@ @ -@@ @ @@,  ,  @@/h70CM_Public_method-@@ @ @@,  ,  @@/v81CM_Private_method-@@ @ @@,  ,  
@@/91CM_Virtual_method-@@ @ @@, 
 
, 
 
5@@/:@@A@@@@@,  	 	@@@@/*'Failure	]    -@-۠V@@ @ @@ @ @@A, 
7 
7, 
7 
d@@/;,moregen_clty
@c@@ @ ^@ "@
e$unitF@@ @ ^@ @@ @ ^@ #@D^@ $@5@@ @ C^@ %@6@@ @ D^@ &@@ @ h^@ '@ @ (@ @ )@ @ *@ @ +@ @ ,_@ !@-% 
f 
n-& 
f 
z@@/<1match_class_types5%trace(@@ @ P^@ a@@ @ b^@ ^@u^@ @"@@ @ b^@ @"@@ @ 
^@ +"p@@ @ ǭ@@ @ Ǭ^@ @ @ ^@ @ @ ^@ @ @ ^@ _@ @ `^@ ]@-]= 	 
-^= 	 @@0e+equal_clsigw@)|@@ @ ^@ Ǹ@
֠q@@ @ A^@ *@@ @ 0^@ ǿ@)ˠ.d($@@ @ .((@@ @ /@ @ -@@ @ ,@@ @ +^@ @^@ @"^@@ @ ^@ @"g@@ @ ^@ @@ @ ɺ^@ @ @ ^@ @ @ ^@ @ @ ^@ @ @ ^@ @ @ ^@ ǹ@ @ Ǻ^@ Ƿ@-    -    @@0i8match_class_declarations@^@ -@#gY@ @@ @ ^@ 4@"@@ @ ^@ ;@$|Y@ @@ @ ^@ B@"@@ @ ^@ I+@@ @ @@ @ ^@ J@ @ K^@ C@ @ D^@ <@ @ =^@ 5@ @ 6^@ .@ @ /^@ ,@- %& %*- %& %B@@0$warn*A*<@@ @ 7^@ 0@@ @ 5^@ ,@.- 4 4.- 4 4@@0+pred_expand@"@@ @ ԕ^@ ;^@ <@ @ =^@ :@.. 52 56.. 52 5A@@0,pred_enlarge@@@ @ ^@ Ԝ^@ ԝ@ @ Ԟ^@ ԛ@.&/ 5q 5u.'/ 5q 5@@0&change^  8 @@)Unchanged@@.31 5 5.41 5 5@@0	%Equiv@@.<1 5 5.=1 5 5@@0	'Changed@@.E1 5 5.F1 5 5@@0	@@A@@@@@.I1 5 5@@A@1	*max_change@.@@ @ _@ @
@@ @ _@ @@ @ _@ @ @ _@ @ @ _@ @.g2 5 5.h2 5 5@@1 	'collect@@ @ k,@@ @ Ճ_@ l@ @ m_@ N@@ @ ]_@ A2@@ @ Մ_@ B@ @ C_@ @@.8 6Z 6^.8 6Z 6e@@1C	.filter_visited@,c)@@ @ գ_@ ՝@@ @ ՜_@ ՘,n_@ @@ @ _@ ՗@ @ ՙ`@ Ֆ@.: 6 6.: 6 6@@1a	)memq_warn@- @ M_@ :@%2@@ @ W_@ A+@@ @ v_@ B@ @ C_@ ;@ @ <_@ 9@.? 7) 7-.? 7) 76@@1	4find_cltype_for_path@+ @@ @ ֟_@ ր@+>@@ @ &_@ և0type_declaration@@ @ 0_@ -)@@ @ 1_@ .@ @ /_@ ֈ@ @ ։_@ ց@ @ ւ_@ @.B 7 7.B 7 7@@1	/has_constr_row'@ 0_@ V@"/@@ @ }_@ ]@@ @ m_@ ^@ @ __@ W@ @ X_@ U@/L 8 8/
L 8 8@@1	-build_subtype@ K_@ ׇ@,)@@ @ v_@ @@ @ _@ ׈@0)@@ @ Sb@ P*@@ @ Tb@ Q@ @ Rb@ K@@ @ O_@ ׉@+S@@ @ _@ ׊@:@@ @ k_@ ׋@_@ ׌_@ ׍@@ @ س_@ ׎@ @ ׏@ @ א@ @ ב@ @ ג@ @ ד@ @ ה@ @ ו`@ ׆@/YO 8 9 /ZO 8 9
@@2	,enlarge_typeY@ _@ @*@@ @ 4_@ 
_@ T+@@ @ a_@ U@ @ V_@ @ @ _@ @ @ _@ @/{ QE QI/| QE QU@@24	r(subtypes^+@@^@ ^@ m@@ @ t_@ i@/ T T/ T T@@2F	v-subtype_error_@ _@ z@#&.@@ @ @@ @ _@ @@ @ _@ @ @ @ @ _@ {@ @ |_@ y@/
 T T/
 T T@@2g	w+subtype_rech@ _@ @0C.@@ @ @@ @ @@ @ X_@ @*@@ @ ]_@ @_@ @0!_@ *z@@ @ _@ *@@ @ _@ -o@@ @ 
_@ @ @  @@ @ _@ _@ @ @ @ @ @ @ @ @ @ @ `@ @/
 U
 U/
 U
 U@@2	z,subtype_listi@!4W@ _@ @G_@ @*̠A_@ [@@ @ Z_@  @
H@@ @ \_@ !@C_@ "D_@ #@ @ $@ @ %@ @ &@ @ '@ @ (`@ @0s e e0s e e@@2	{.subtype_fieldsj@'_@ )@l_@ *@+@@ @ _@ +@+@@ @ _@ ,@d_@ -e_@ .@ @ /@ @ 0@ @ 1@ @ 2@ @ 3`@ @0;z fr fv0<z fr f@@2	|+subtype_rowk@H_@ 4@_@ 5@%@@ @ %_@ 6@,@@ @ &_@ 7@_@ 8_@ 9@ @ :@ @ ;@ @ <@ @ =@ @ >`@ @0\ i i0] i i@@3	}'subtype@!_@ @+W@@ @ _@ @	_@ @-@@ @ S_@ P%[@@ @ i_@ Q@ @ R_@ @ @ _@ @ @ _@ @ @ _@ @0 q, q00 q, q7@@3>	.unalias_object@+0@@ @ j_@ V+@@ @ _@ W@ @ X`@ U@0 t t0 t t(@@3S
'unalias@+E@@ @ _@ {+E@@ @ _@ |@ @ }_@ z@0 uE uI0 uE uP@@3h
	%arity@+Z@@ @ S_@ >%T@@ @ {_@ ?@ @ @`@ =@0 w w0 w w@@3}
+Non_closed0_    1r@@@A0 w w0 w w@@3
'visited-@@ @ `@ @@ @ `@ @0 w w0 w w@@3
1closed_schema_rec@"`@ @$@@ @ 
`@ .W@@ @ `@ @ @ @ @ a@ @0 w w0 w w@@3
-closed_schema@"5`@ p@$4@@ @ `@ w-L@@ @ `@ x@ @ y`@ q@ @ r`@ o@1 { {1 { {@@3
!2normalize_type_rec@-f -@@ @ f`@ r@@ @ x`@ @$V@@ @ `@ $T@@ @ `@ @ @ @ @ a@ @12" | |13" | }@@3
$.normalize_typeJ@$k@@ @ *`@ $i@@ @ )`@ @ @ `@ @1Ge  1He  @@4 
K+nondep_hashM 0_@ B@@ @ I`@ >@1Vu  1Wu  @@4
M/nondep_variantsN _@ R@@ @ Y`@ N@1dv  1ev  @@4
N*clear_hashO@.@@ @ b`@ _$unitF@@ @ `@ `@ @ a`@ ^@1|w  1}w  @@45
O/nondep_type_recR.expand_private,-@@ @ `@ @@ @ @"`@ @$listI&!t@@ @ o@@ @ n`@ @`@ `@ @ @ @ @ @ @ @ @ a@ @1z 7 ?1z 7 N@@4e
P+nondep_typez@"`@ @%"@@ @ @@ @ `@ @`@ `@ @ @ `@ @ @ `@ @ @ `@ @1  1  @@4
u0nondep_type_decl@#`@ @FC@@ @ @@ @ `@ @-@@ @ `@ @(@@ @ `@ (@@ @ x`@ @ @ `@ @ @ `@ @ @ `@ @ @ `@ @1  1  @@4
{<nondep_extension_constructor@#<`@ E@vs@@ @ !@@ @ !`@ L@-5extension_constructor@@ @ !w`@ S@@ @ !,`@ T@ @ U`@ M@ @ N`@ F@ @ G`@ D@2& u y2' u @@4
6nondep_class_signature@#e`@ !@@@ @ "@@ @ "`@ !@'@@ @ "`@ !'	@@ @ !`@ !@ @ !`@ !@ @ !`@ !@ @ !`@ !@2M% F J2N% F `@@5
1nondep_class_type@#`@ "@Ġ@@ @ $
@@ @ $	`@ "@'.@@ @ #Y`@ "'3@@ @ #`@ "@ @ "@ @ "@ @ "a@ "@2p/  2q/  @@5)
8nondep_class_declaration@#`@ $@@@ @ %@@ @ %`@ $@.c1class_declaration@@ @ %`@ $@@ @ &`@ $@ @ $`@ $@ @ $`@ $@ @ $`@ $@2;  2;  @@5R
9nondep_cltype_declaration@#`@ &	@@@ @ &@@ @ &`@ &@.6class_type_declaration@@ @ &`@ &@@ @ '
`@ &@ @ &`@ &@ @ &`@ &
@ @ &`@ &@2O  2O  @@5{
-collapse_conj@$`@ '@0-n@@ @ '\@@ @ (`@ '@&	@@ @ (`@ '&@@ @ (`@ '@ @ '@ @ '@ @ 'a@ '@2_  2_  @@5
4collapse_conj_params@$$`@ (@%&(@@ @ )B`@ )@@ @ )`@ ('@@ @ )`@ ) @ @ )`@ (@ @ (`@ (@3s L P3s L d@@5
Ơ+same_constr@$D`@ )J@. @@ @ )`@ )Q@.	@@ @ )`@ )X$boolE@@ @ )`@ )Y@ @ )Z`@ )R@ @ )S`@ )K@ @ )L`@ )I@3+v  3,v  @@5
ɠ,is_immediate@.Type_immediacy!t@@ @ *`@ */@@ @ *"`@ *@ @ *`@ *@3E  3F  @@5
Ѡ)immediacy7@/@@ @ +`@ +l@-@@ @ +`@ +s.Type_immediacy!t@@ @ +`@ +t@ @ +u`@ +m@ @ +n`@ +k@3h  3i  @@6!
Ҡ2maybe_pointer_typeB@/@@ @ ,`@ ,@.@@ @ ,`@ ,/@@ @ ,`@ ,@ @ ,`@ ,@ @ ,`@ ,@3  3  @@6@
6;@'*match*?KAAC 
EP@@A% `@@1R@@AB1Q@@1S@@1T@@ABC3B@@3`E@@@@AB1V@@1U@@ACD3C@@'> V@@A6@@@ @@AB @@2I@@A3D@@2,O@@.Sw@@ABCDE3A@@" z@@An @@ @@AB$ @@

@@AC+{@@q @@#5@@AB) D@@+0z@@0`@@ABCD0_@@*+ C@@*@@AB+|@@> @@A
/ @@$ l$ k@@ABCEF0!i@@( Q@@>@@AB)W J@@& a@@AC&q _@@& ]@@A9@@8@@ABD& \@@& ^@@A>H@@I@@A%@@BC @@= @@A#1 w@@ @@ABDE) I@@ @@A" {@@t @@AB# t@@0c@@AC2-W@@ @@A @@B @@ @@A% c@@BCDF& b@@1 b@@A+@@ @@AB@ @@[ @@AC	
@@
G@@
#@@AB	
t@@
@@A	O@@@@AB@@+y@@3-J@@ABCDEGH3K@@! @@AA @@B @@B @@AM @@ @@ABC/ @@ @@A@@O @@AB @@ @@AC- @@ @@A @@C @@A
 @@ @@ABCDE(( U@@
 @@A&@@(@@A= @@BCT @@#k y@@A+
 B@@% i@@ABD'| [' W@@' Z@@A' Y@@ @@A# x@@ @@ABCEF&% e&< d@@% h@@A& g& f@@ @@AB" }@@  @@ @@AB1]@@ @@A"s @@ @@ABCD2Y@@ @@A)@@* E@@ABo @@S @@AC) N@@rM@@A+~@@B+@@1Te@@ACDEG1^@@#  |@@  @@AB" @@  @@3 @@ABC" ~@@! @@A! @@ @@AB @@$3 v@@ @@ABCD+ @@@	@@L@@AB @@o
@@A @@1Tg@@ABC* F@@$ u@@  @@ABD$ s$ r@@c @@A!a @@G @@A@@BC@@$@@A
@@N@@A' ؐs @@BCDEF, @@ @@A @@BV @@e @@A @@BC @@ @@A @@p'@@A @@BCD)| S@@) T@@A
	
@@6@@AB
n@@
N@@AC
@@@@A
8@@	@@AB0Lr@@" @@A0t@@0,s@@ABCDEGHI0o@@0n@@A0p@@0q@@AB& @@F@@AC!D@@E@@G@@ABPC@@	<@@A @@@@@ABCDZ @@B@@A?@@B=@@0u@@ACE3[X@@& j@@A
@@3;@@AV:@@BC,	 A@@+ G@@ @@ABDF @@ @@AW @@b @@ @@ABC+ H@@ @@Q @@AB @@m#@@A"@@ @@AB1Pm@@4M@@ACDE4H@@2za@@A4N@@4F@@AB4G@@( X@@ @@AB# @@ @@A @@BCD* M@@0Hv@@A2Nd@@# @@A1j@@BCEFG2)f@@* @@@@AB
@@+ K@@ACo @@ @@AJ@@3)[@@AB3Z@@4lL@@*w P@@ABCD3\@@,}@@A+ L@@* O@@AB1l@@*X R@@A @@r2@@ABCB-@@0@@A/@@B'.@@1@@A^,@@BCD2,h@@N @@A @@ @@ABl @@ @@ @@ABCEF-hx@@S4@@Ai3@@B   @@ * @@ACG @@ @@ @@AB @@k @@ACDz @@N @@ @@AB< @@ @@AC @@I @@A( @@B @@ @@ACDd @@u @@A @@ @@AB&s p& o@@&V q@@A& m@@B& n@@Z7@@A8!@@21k@@ABCDEFGHJ@@N@  ,  @486/  60  /AA8Ctype.maybe_pointer_typeA@88@@  ,  @ 865  66  AA/Ctype.immediacyA@88@@  ,  @86;  6<  @A2Ctype.is_immediateA@88@@  ,  ?86Av  6B{ W eAA1Ctype.same_constrA@88@@  ,  ?86Gs L e6Ht r AA:Ctype.collapse_conj_paramsA@88@@  ,  ?96MO   6N\  AA?Ctype.nondep_cltype_declarationA@99 @@  ,  ?96S;  6TM  AA>Ctype.nondep_class_declarationA@99@@  ,  ?P96Y% F a6Z-  AA<Ctype.nondep_class_signatureA@9
9@@  ,  ?@96_ u 6`!  AA	"Ctype.nondep_extension_constructorA@99@@  ,  ?96e  6f 0 =AA6Ctype.nondep_type_declA@99@@  ,  >9 6k  6l - :AA1Ctype.nondep_typeA@99@@  ,  >|9&6qw  6rx  5AA0Ctype.clear_hashA@9%9$@@  ,  >h9,6wv  6xv  @5Ctype.nondep_variantsA99-@@ABCDEF@@ABC@@@ABCDEjiFGGF@@ABDEG@@ABCD@@ABDEFGHIfd^@U@AT@BQ@J@ACDIHE:8FG @@A@BCDFGHJ@@<@  ,  >L9f6u  6u  @e1Ctype.nondep_hashA9Q9g:}w@l@AiBC`_EQOF54GHJ@@;@  ,  >09w6e  6f  AA4Ctype.normalize_typeA@9v9u@@  ,  =9}6 { {6 | |AA3Ctype.closed_schemaA@9|9{@@  ,  =96 w w6 w w@A-Ctype.visitedA@99@@  ,  =x9A9A@99@@  ,  =D96 uE uQ6 v vAA-Ctype.unaliasA@99@@  ,  <96 q, q86 s s(AA-Ctype.subtypeA@99@@  ,  ;96
 T T6 T UAA3Ctype.subtype_errorA@99@@  ,  ;96 T T6 T T@h.Ctype.subtypesA9x9qB@@@>@AB=<DE43--+@)@ABC&%D! EFt
@@ABCuDEFGrII@@ABCDF~}Ga`JHB@@@@@ABC21DE%@!@A@BD@@ABCDEFGHJ@@+@  ,  ;9ϰ7 QE QV7 Q QAA2Ctype.enlarge_typeA@99@@  ,  :9հ7 L 8 87!M 8 8AA5Ctype.has_constr_row'A@99@@  ,  :9۰7&B 7 77'J 8 8AA:Ctype.find_cltype_for_pathA@99@@  ,  :97,? 7) 777-@ 7C 7AA/Ctype.memq_warnA@99@@  ,  :t9728 6Z 6f738 6Z 6AA-Ctype.collectA@99@@  ,  :d9782 5 5796 6F 6XAA0Ctype.max_changeA@99@@  ,  :T97>/ 5q 57?/ 5q 5AA2Ctype.pred_enlargeA@99@@  ,  :D97D. 52 5B7E. 52 5pAA1Ctype.pred_expandA@99@@  ,  :497J- 4 47K- 4 5@A*Ctype.warnA@99@@  ,  :(:7P %& %C7Q 2 3AA>Ctype.match_class_declarationsA@::@@  ,  9:7V    7W $ %$AA1Ctype.equal_clsigA@:
:	@@  ,  9|:7\= 	 7]    AA7Ctype.match_class_typesA@::@@  ,  8:
tA:A@::@@  ,  8h:7d H U7e  AA.Ctype.is_equalA@::@@  ,  8P:7j  7k  FAA+Ctype.equalA@::@@  ,  88:%7p I T7q x AA,Ctype.eqtypeA@:$:#@@  ,  8(:+7v ` p7w  GAA1Ctype.eqtype_listA@:*:)@@  ,  7:17|#  7}' _ AA5Ctype.normalize_substA@:0:/@@  ,  7l:77 A W7!  AA7Ctype.expand_head_rigidA@:6:5@@  ,  7P:=7  7 N {AA0Ctype.does_matchA@:<:;@@  ,  78:C7 i u7  AA-Ctype.matchesA@:B:A@@  ,  7:I7
  7 _ gAA7Ctype.all_distinct_varsA@:H:G@@  ,  6:O7
 7 D7
  AA.Ctype.rigidifyA@:N:M@@  ,  6:U7
  7
 s ޓAA4Ctype.is_moregeneralA@:T:S@@  ,  6:[7
 f v7
  AA1Ctype.moregeneralA@:Z:Y@@  ,  6:a7
 ُ ٛ7
  AA-Ctype.moregenA@:`:_@@  ,  5:g7
  7
 # RAA5Ctype.may_instantiateA@:f:e@@  ,  5:m7  7
   AA3Ctype.moregen_occurA@:l:k@@  ,  5l:s7  7  AA8Ctype.filter_self_methodA@:r:q@@  ,  5\:y7 u 7  AA9Ctype.check_filter_methodA@:x:w@@  ,  5L:7  7 R sAA3Ctype.filter_methodA@:~:}@@  ,  4:7 N _7  AA2Ctype.filter_arrowA@::@@  ,  4:7  7  AA7Ctype.expand_head_traceA@::@@  ,  4:7 | 7  AA+Ctype.unifyA@::@@  ,  4:7 * :7 g zAA1Ctype.unify_pairsA@::@@  ,  4X:7q  !7  AA/Ctype.unify_varA@::@@  ,  3:7_  7o  AA0Ctype.unify_gadtA@::@@  ,  3:7V S ]7]  
AA+Ctype.unifyA@::@@  ,  1:7
+ S_ Sn7
5 T TAA0Ctype.unify3_varA@::@@  ,  1:8 
% R R8
( R SDAA5Ctype.record_equationA@::@@  ,  1h:8
 P P8
" RY RdAA0Ctype.unify1_varA@::@@  ,  1:8
 P P$8

 P PAA.Ctype.unify_eqA@::@@  ,  0:ǰ8
	 O P8
	 O P@A4Ctype.rigid_variantsA@::@@  ,  0:Ͱ8	 N- N?8
 Od OAA3Ctype.unify_packageA@::@@  ,  0:Ӱ8	 G% G<8	 M MAA8Ctype.complete_type_listA@::@@  ,  0:ٰ8$	 E E8%	 F FAA5Ctype.nondep_instanceA@::@@  ,  0t:A:A@::@@  ,  0X:8,	 Dm D8-	 Dm D@A5Ctype.package_subtypeA@::@@  ,  0P:82	 Dm D@A;Ctype.package_subtype.(fun)A@::@@  ,  0@:87	 D: DM88	 D: Dl@A2Ctype.nondep_type'A@::@@  ,  08:8=	 D: DQ@A8Ctype.nondep_type'.(fun)A@::@@  ,  0(:8B	 C C8C	 C D8AA5Ctype.eq_package_pathA@::@@  ,  0:8H	 Ca Cw8I	 C CAA7Ctype.add_type_equalityA@::@@  ,  /;8N	 C C(8O	 C0 C_AA5Ctype.order_type_pairA@;;@@  ,  /;	8T	 B B8U	 B C@2Ctype.unify_eq_setA:;
@@AB@@ABCDE@@ABoCD@@A@@A@BCEFqr@p@Aj@g@ABDdcYYU@R@ACQ@O@AL@L@AB54CDEFG22&@$@A B@BCD@
@A
BCDE@@A@BCDEF@@ABC@@A@BDE@}@ABD|@y@AhgCEFGa^\\Z@C@ABCB@A@A;@B98CD64,@)@A"@B! CDE@@ACD
EF@@ACD@@A@B@@A@BC@@A@BCDEFGHI@@ @  ,  /;r8	 @m @8	 B BAA7Ctype.add_gadt_equationA@;q;p@@  ,  /;x8	 @ @18	 @< @kAA:Ctype.find_expansion_scopeA@;w;v@@  ,  /;~8	 > ?8	 ? @AA7Ctype.find_lowest_levelA@;};|@@  ,  /p;8	 >f >t8	 > >AA/Ctype.mcomp_forA@;;@@  ,  /P;8	 >( >28	 >> >dAA+Ctype.mcompA@;;@@  ,  .D;8 ^ s8  AA6Ctype.compatible_pathsA@;;@@  ,  .4;8  38 
 #AA5Ctype.is_instantiableA@;;@@  ,  .$;8  8  AA3Ctype.non_aliasableA@;;@@  ,  .;8  8 z AA0Ctype.is_newtypeA@;;@@  ,  . ;8]  8  AA+Ctype.reifyA@;;@@  ,  -;8T  8W  AA>Ctype.get_gadt_equations_levelA@;;@@  ,  -;8R  9 R  @A:Ctype.gadt_equations_levelA@;;@@  ,  -;9E W f9P k AA0Ctype.deep_occurA@;;@@  ,  -x;9?  9@  AA:Ctype.expand_subtype_traceA@;;@@  ,  -h;ư9< _ p9= | AA2Ctype.expand_traceA@;;@@  ,  -X;̰94 H ]9: F ]AA6Ctype.expand_any_traceA@;;@@  ,  -(;Ұ9  
 
&9# 
u 
yAA3Ctype.reify_univarsA@;;@@  ,  -;ذ9#	 
 
9$  AA,Ctype.polyfyA@;;@@  ,  ,;ް9) 	 	9* 	 	@A2Ctype.univar_pairsA@;;@@  ,  ,;9/  	 	#90 	 	AA4Ctype.enter_poly_forA@;;@@  ,  ,;95  !96  	AA0Ctype.enter_polyA@;;@@  ,  ,;9; / B9<  AA4Ctype.univars_escapeA@;;@@  ,  ,l;9A    9B  AA7Ctype.get_univar_familyA@;;@@  ,  ,T;9G  F  H9H  F  ~@1Ctype.add_univarsA;b;@@AZB~CzDkXY@V@M@ABDJI?@=@A<B7@4@ABCDEFG@@A@B
@@ABCD@@AB@BCDE@@ACD@@ABCEF@@AC@@`@ABD_EFGB><@;@#@ABC"D	@@ABDE@@@ABCDEz@z@ABrmCkDEFGHI@@ @  ,  ,D<G9  F  WK@A7Ctype.add_univars.(fun)A@<E<D@@  ,  ,0<L9    9    AA6Ctype.occur_univar_forA@<K<J@@  ,  ,<R9    39  <  AA;Ctype.has_injective_univarsA@<Q<P@@  ,  +<X9    9    AA6Ctype.has_free_univarsA@<W<V@@  ,  +<^9    9    AA2Ctype.occur_univarA@<]<\@@  ,  +<d9}    9    OAA6Ctype.unify_univar_forA@<c<b@@  ,  +<j9V  2  Q9]  c  xAA	 Ctype.local_non_recursive_abbrevA@<i<h@@  ,  +<p9-    9.    -AA.Ctype.occur_inA@<o<n@@  ,  +<v9(  t  9+    AA/Ctype.occur_forA@<u<t@@  ,  *<|9    9&  e  rAA+Ctype.occurA@<{<z@@  ,  *<9    9    AA+Ctype.mergeA@<<@@  ,  *<9  f  y9  f  @A2Ctype.type_changedA@<<@@  ,  *t< A<A@<<@@  ,  *X<9    9  n  AA4Ctype.is_contractiveA@<<@@  ,  *<<9    9    AA<Ctype.generic_private_abbrevA@<<@@  ,  *(<9  )  <9    AA4Ctype.generic_abbrevA@<<@@  ,  *<9  g  w9  o  wAA1Ctype.full_expandA@<<@@  ,  )<9  5  I9  R  ۠AA5Ctype.expand_head_optA@<<@@  ,  )<9  ڏ  ڧ9    3AA9Ctype.try_expand_safe_optA@<<@@  ,  )d<9    :   q  ڍAA9Ctype.try_expand_once_optA@<<@@  ,  )D<:  ?  S:    AA5Ctype.safe_abbrev_optA@<<@@  ,  )$<:    :    =AA7Ctype.expand_abbrev_optA@<<@@  ,  (<ư:~  ԙ  ԩ:  Բ  AA1Ctype.expand_headA@<<@@  ,  (<̰:v    :{  >  hAA6Ctype.expand_head_unifA@<<@@  ,  (l<Ұ:i  +  ?:m  Қ  AA5Ctype.try_expand_safeA@<<@@  ,  (L<ذ:#b  o  у:$f     AA5Ctype.try_expand_onceA@<<@@  ,  (,<ް:)T    :*]    AA1Ctype.safe_abbrevA@<<@@  ,  (<:/N  =  R:0Q  ρ  ϰAA6Ctype.expand_head_onceA@<<@@  ,  '<:5J    :6K    AA3Ctype.expand_abbrevA@<<@@  ,  '<:;  K  a:<G  Ύ  ΠAA7Ctype.expand_abbrev_genA@<<@@  ,  'x<:A  K  `:B    AA6Ctype.check_abbrev_envA@<<@@  ,  'h<:G    :H    @A2Ctype.previous_envA@<<@@  ,  'D=:M    :N    @@(i(@@Z@  @@Z@  @(@@Z@  @$#@@Z@  (@@Z@  @Z@  @Z@  @Z@  =A<Z=@@ABC@@A@BCDE$@@ABD#FG/@.@ABC@@ABD@B@@ABC@@ABCDE@@ABCD@@A@@ABCwDEZ5*@@ABCDFG
@@A@BCD@@@ABC}DEFHI@@ @  ,  '0=Y:  F  P:    AA+Ctype.applyA@=X=W@@  ,  '=_:    :  >  TAA+Ctype.substA@=^=]@@  ,  &=e:    :    @A,Ctype.unify'A@=d=c@@  ,  &=k:    @A2Ctype.unify'.(fun)A@=i=h@@  ,  &=p:    :  @  CAA4Ctype.instance_labelA@=o=n@@  ,  &=v:    :    AA3Ctype.instance_polyA@=u=t@@  ,  &=|:    :    AA4Ctype.instance_poly'A@={=z@@  ,  &=:b    :b    @A2Ctype.delayed_copyA@==@@  ,  &=:^    #:`  U  AA/Ctype.conflictsA@==@@  ,  %=:>    :U  ?  BAA4Ctype.instance_classA@==@@  ,  %=:7    9:<    AA	"Ctype.generic_instance_declarationA@==@@  ,  %=:/    %:5    AA:Ctype.instance_declarationA@==@@  ,  %=:  #  0:,    	AA.Ctype.map_kindA@==@@  ,  %=:  "  D:    !AA	#Ctype.instance_parameterized_type_2A@==@@  ,  %t=:  B  b:     AA	!Ctype.instance_parameterized_typeA@==@@  ,  %`=:    :
  =  @AA:Ctype.instance_constructorA@==@@  ,  %8=;    +;    AA6Ctype.existential_nameA@==@@  ,  %$=;	    ;
    AA4Ctype.new_local_typeA@==@@  ,  %=İ;  l  ;  h  AA;Ctype.get_new_abstract_nameA@==@@  ,  %=ʰ;    ;    AA?Ctype.reset_reified_var_counterA@==@@  ,  $=а;    ;    @A9Ctype.reified_var_counterA@==@@  ,  $=ְ;!  3  E;"  L  AA3Ctype.instance_listA@==@@  ,  $=ܰ;'    ;(  -  1AA6Ctype.generic_instanceA@==@@  ,  $=;-    ;.  a  AA.Ctype.instanceA@==@@  ,  $X=;34    ;44    $@A3Ctype.abbreviationsA@==@@  ,  $P=;94    @AA@==@@  ,  $0=;=
;>    AA3Ctype.fully_genericA@==@@  ,  $=;C|r|;D
AA5Ctype.compute_univarsA@==@@  ,  #=;Itt;JzbzkAA8Ctype.limited_generalizeA@==@@  ,  #>;Ott;PttAA4Ctype.correct_levelsA@>>@@  ,  #>
;Uss;Vt!tdAA9Ctype.lower_contravariantA@>	>@@  ,  #t>;[ulYln;\xllAA6Ctype.update_level_forA@>>@@  ,  #T>;ajk_kp;bslRlWAA2Ctype.update_levelA@>>@@  ,  ">;g!``;h$`aAA6Ctype.update_scope_forA@>>@@  ,  ">";m^^;n_+_ZAA8Ctype.check_scope_escapeA@>!> @@  ,  "X>(;sXX;tXX@A=Ctype.forward_try_expand_safeA@>'>&@@  ,  "P>.;yXX@A	#Ctype.forward_try_expand_safe.(fun)A@>,>+@@  ,  ">3;~U,UE;UdU}AA:Ctype.generalize_structureA@>2>1@@  ,  !>9;RR;SSAA0Ctype.generalizeA@>8>7@@  ,  !>?;O3OL;OQOuAA:Ctype.duplicate_class_typeA@>>>=@@  ,  !>E;NN;NOAA4Ctype.duplicate_typeA@>D>C@@  ,  !>K;lJJ;MMAA2Ctype.closed_classA@>J>I@@  ,  !P>Q-A>QA@>L>K@@  ,  !4>S;YHH;dJ	JAA	"Ctype.closed_extension_constructorA@>R>Q@@  ,  !>Y;:E{E;WHHAA6Ctype.closed_type_declA@>X>W@@  ,  !>_;2DD;8EuEyAA?Ctype.closed_parameterized_typeA@>^>]@@  ,   >e;-D9DI;0DDAA1Ctype.closed_typeA@>d>c@@  ,   >k;(CC;+D3D7AA4Ctype.free_variablesA@>j>i@@  ,   >q;CC+;&CCAA/Ctype.free_varsA@>p>o@@  ,   >w;::;::@A3Ctype.really_closedA@>v>u@@  ,   >};::;::@A4Ctype.free_variablesA@>|>{@@  ,   |>/FA>A@>~>}@@  ,   L>;77;8{8AA6Ctype.merge_row_fieldsA@>>@@  ,   $>;55;56@0^5Ctype.sort_row_fieldsA=>@D@A@@B?>C:2@)@A('CDE#@@@ABC@BDc@B@@AC@@ABDEF@x@AU@BNrD9@!@A@@AB@@A@BCE@@AkBzyCDFwvp@h@Ae@Bd@a@ACD`nHECCA@BC/@$@A@BDEFGH@@ Q@  ,   >Ű<55:@A;Ctype.sort_row_fields.(fun)A@>>@@  ,  >ʰ<44<44IAA/Ctype.self_typeA@>>@@  ,  >а<101I<2j2|AA:Ctype.hide_private_methodsA@>>@@  ,  >ְ<!0J0a<"01AA8Ctype.remove_object_nameA@>>@@  ,  >ܰ<'//<(060HAA5Ctype.set_object_nameA@>>@@  ,  ><-.+.<<./6/YAA2Ctype.row_variableA@>>@@  ,  p><3r,b,s<4--AA2Ctype.close_objectA@>>@@  ,  T><9k++<:n,%,CAA5Ctype.concrete_objectA@>>@@  ,  D><?f+7+I<@i++AA3Ctype.opened_objectA@>>@@  ,  ><EX))<FZ*#*1@A2Ctype.is_self_typeA@>>@@  ,  ? <KB&&<LP))BAA6Ctype.associate_fieldsA@>>@@  ,  ?<Q>&z&<R@&&AA2Ctype.build_fieldsA@??@@  ,  ?<W2%R%e<X<&9&xAA4Ctype.flatten_fieldsA@??
@@  ,  ?<]-$$<^0%)%PAA3Ctype.object_fieldsA@??@@  ,  ?<c"#<d#g#AA1Ctype.is_datatypeA@??@@  ,  ?<i"w"<j""AA3Ctype.in_pervasivesA@??@@  ,  ?$<o""*<p"M"u@A7Ctype.in_current_moduleA@?#?"@@  ,  x?*<u  <v!!AA6Ctype.set_mode_patternA@?)?(@@  ,  \?0<{ r <|  AA<Ctype.can_generate_equationsA@?/?.@@  ,  L?6< H g< H p@A>Ctype.allow_recursive_equationA@?5?4@@  ,  @?<<  ' ><  ' G@A6Ctype.assume_injectiveA@?;?:@@  ,  4?B<  <  &@A:Ctype.equations_generationA@?A?@@@  ,  (?H< < @A+Ctype.umodeA@?G?F@@  ,  ?N< +;< @A/Ctype.TypePairsA@?M?L@@  ,  ?TAA>1!t$Q  8 @@@A<7*@@ @-F<7)@@ @-G@ @-H@@@@< BF< Bd@@@@?k m%equal%@; @-R@-Y; @-R@-Z@ @-[R@-V@R@-eR@-f@ @-gR@-b8@@ @-}R@-c@ @-dR@-W@ @-XR@-U@< em< er@@? n$hash-@7@@ @-R@-7@@ @-R@-@ @-R@-*@@ @-R@-@ @-R@-@< < @@? s?$	[	S!	H@	G@ABCD	D@	0@A	/@	"@A@BC@@AYw@@@ABDE@r@Ak@8x@@AZ@BCY@2@ACD@@A@BDE@@A~BCy@i@Ah@g@ABd@\@AJ@@ABCDFG@@x@  ,  ?߰=* =+ AA4Ctype.TypePairs.hashA@??@@  ,  ?=0 es=1 eAA5Ctype.TypePairs.equalA@??@@  ,  ?=6 ju=7 j@7*Ctype.noneA>?<	|8	%@	@A@BDE2@@AB/D
@@AB/CE@FBC,DFG@@t@  ,  @=O *8=P *hAA/Ctype.newconstrA@@@@@  ,  @
=U =V (AA,Ctype.newobjA@@	@@@  ,  @=[ =\ AA4Ctype.new_global_varA@@@@@  ,  h@=a v=b vAA-Ctype.newvar2A@@@@@  ,  X@=g 6A=h 6uAA,Ctype.newvarA@@@@@  ,  @@"=m =n 4AA+Ctype.newtyA@@!@ @@  ,  @(=s =t }AA4Ctype.proper_abbrevsA@@'@&@@  ,  @.=y =z @A4Ctype.simple_abbrevsA@@-@,@@  ,  @4= = {~AA?Ctype.wrap_trace_gadt_instancesA@@3@2@@  ,  @:= = AA	 Ctype.reset_trace_gadt_instancesA@@9@8@@  ,  @@= '= mAA	 Ctype.check_trace_gadt_instancesA@@?@>@@  ,  @F= = @A:Ctype.trace_gadt_instancesA@@E@D@@  ,  @L= = AA4Ctype.is_object_typeA@@K@J@@  ,  @R= = AA:Ctype.restore_global_levelA@@Q@P@@  ,  @X= #== AA;Ctype.increase_global_levelA@@W@V@@  ,  x@^= = "AA8Ctype.reset_global_levelA@@]@\@@  ,  \@d= = AA2Ctype.create_scopeA@@c@b@@  ,  D@j= = oAA-Ctype.end_defA@@i@h@@  ,  $@p= = 
AA8Ctype.raise_nongen_levelA@@o@n@@  ,  @v= 3= zAA5Ctype.begin_class_defA@@u@t@@  ,  @|= = AA/Ctype.begin_defA@@{@z@@  ,  @= R_= RAA.Ctype.init_defA@@@@@  ,  @= (>= (QAA7Ctype.get_current_levelA@@@@@  ,  @= = &AA0Ctype.set_levelsA@@@@@  ,  @= = lAA1Ctype.save_levelsA@@@@@  ,  l@= ^p= ^x@;1Ctype.saved_levelA?\@
*@	@A	@B	@	I@A@j@ABCi@e@Ac@c@:@ABCDE@@Y@  ,  X@= CV= C]@;2Ctype.global_levelA?p@
?	@@A|@BC{DE@@X@  ,  D@> (;>	 (B@<2Ctype.nongen_levelA?}@

M#	@@ABCDE@@W@  ,  0@˰>  > '@<&3Ctype.current_levelA?@̰
[@	@A	C+DE@@V@  ,  @<8A@A@@@@@  ,   @<BA@A@@@@@  ,  @<bA@A@@@@@  ,  @<lA@A@@@@@  ,  @<vA@A@@@@@  ,  @<A@A@@@@@  ,  t@>/ h>0 r@;@@ @
pJ@]@A?@@
@
@AB
9C
{ E@@O@  ,  d@>@ i@A+Ctype.(fun)A@@@@@  ,  T@<A@A@@@@@  ,  8@>G c`{>H c`AA<Ctype.raise_scope_escape_exnA@@@@@  ,  (A>M b,A>N b,_AA6Ctype.raise_escape_exnA@AA @@  ,  A>S a>T a+AA6Ctype.scope_escape_exnA@AA@@  ,  A>Y `>Z `AA0Ctype.escape_exnA@A
A@@  ,  A>_ _>` _AA,Ctype.escapeA@AA@@  ,  A=MAAA@AA@@  ,  A>g Y(>h Z3OAA/Ctype.raise_forA@AA@@  ,  A">m V

>n W
AA;Ctype.raise_unexplained_forA@A!A @@  ,  A(>s K&,>t Q
@A5Ctype.raise_trace_forA@A'A&@@  ,  A.>AA.A@A)A(@@  ,  tA0>2AA0A@A+A*@@  ,  XA2>RAA2A@A-A,@@  ,  <A4>iAA4A@A/A.@@  ,   A6>AA6A@A1A0@@  ,  A8> P> P@#exnG@@K@K@B?= I  8 @@@A@@@A@#@@@ALK&tr_exn =@@ @
@@ @
@> L;B> L;H@@A[L"tr ==@@ @
@@ @
@> M^e> M^g@@AkM@  8 @@@A>>@@ @
@@AJAq@@@AsO@AAn@A@@,B@@AB@>C@@A>D@@>B@@AB@B@  ,  AH@UA;A|B@  ,  A> Q[@J@@K@;K@A`BG@:  8 @@@A>>R@@ @
@@AJA@@@AP@AA"B@  ,  A@lARA%B@  ,  A> O> O@b@@K@
K@
xB_@R  8 @@@A?
>~@@ @
@@AJA@@@AN@AA:B@  ,  A@AjA=B@  ,  A> N@@@nAAB@  ,  |A? W

@@@@d>3? V

@&tr_exn >3@? V

@@ATA@	A@@A@>gB@@A@A@  ,  lAʰ? Z3L@AA@AA@@  ,  \Aΰ? Z35@@@@~>7? Y@&tr_exn >7@?$ Y.@@AV!e >2@?* Y/?+ Y0@@AWAް@
A@@B@@AB@>B@@A@B@  ,  HA?7 _@AA@AA@@  ,  8A@@@> ?> _@$kind > @?C _@@AZA@	A@@A@@A@  ,  0B ?K `@AA@AA@@  ,  $B?O `@?>@@H@H@A@>"?\ `@$kind >"@?a `@@B\B@	A@@A@?B@@A>OC@@B@A@  ,  B""@@B	A@  ,  B$?o a@AA@B!B @@  ,  B(?s a ?t a*@?!@@I@
J@
&A@>+? a-@"ty >+@2? a@@B=^B8@	A@@A@>UB@@A@A@  ,  BD? a<@@;@BA	A@  ,  BH? b,NF@@@I@
3I@
EJ@
?MAA>2? b,,T@$kind >2@Y? b,E@@B^`BY@	A@@A@>vB@@A@A@  ,  Be? b,Hc@@b@Bb	A@  ,  Bi? c`m@2@@I@
YI@
gJ@
ctAA'>=? c``{@"ty >=@? c`}@@BbBz@	A@@A@>|B@@A@A@  ,  B? c`@@@B	A@  ,  B? q? q@@AA@B@%paramA@@#tagB@@AB@>NB@@A@BB  ,  B? k? p@AA@BB@@  ,  B? m3B? o@(Location%error@@K@K@EAf!l >g@@ @o@@ j@ j@@Bd"l' >k@@ @p@@ j@ j	@@Be(LocationBŰ@D@@AC@@BA>C:@D@  ,  BҰ@ m3N@ m3c@AA@BB@@  ,  B1!t@@L@A.BK@  ,  \BD@A/BDH  ,  ,BA@ABް@V@AO@AM  ,  $B@3 T@ASA@BB@@  ,  B@U@A=@9 Z@B@c5A@@A@>TB@@A>,D@@B>?C@@>E@@AC@A@  ,  B@I 
p@@oAA=@N u@!l8=@z@S @@CwC@	A@@A@>nB@@A>FD@@B>YC@@>7E@@AC@A@  ,  C@c @@ACA@  ,  C@g @@ACA@  ,  C @k @@@"CA@  ,  C$@o (C@@@A=@s ((@C%@;A@@A@>B@@A@A@  ,  |C2@} R@@AA=@ RR@%level>=@@ Rd@@C?zC:@	A@@A@>B@@A>C@@B@A@  ,  pCH@ Rg@@@CEA@  ,  XCL@  @@AB=@ @CM@AA@@A@>B@@A>C@@>}D@@AB@A@  ,  LC^@ @@AC[A@  ,  @Cb@ @ @AA@C`C_@@  ,  8Cg@ @AA@CdCc@@  ,  Ck@ @@@ChA@  ,  Co@ z|@@AB5=@ @Cp@DA@@A@>B@@A>C@@>D@@AB@A@  ,  C@ 8I@ 8x@AA@CC~@@  ,  C@ 8h@AA@CC@@  ,  C@ 8:@@@CA@  ,  C@ @@ABU=Đ@ "@C@GA@@A@>B@@A>C@@>D@@AB@A@  ,  C@ @ @A0A@CC@@  ,  C@ @A4A@CC@@  ,  C@ 9@@8@CA@  ,  pC@ oC@@BABw=А@ I@"clJ>@A &A (@@C"nlK>@A
 *A ,@@C @C@
|B@@D@@ABC@@=A@@AC@?-B@@A?C@@>D@@AB@D@  ,  dCְA! oql@@kA)CD@  ,  XCڰA% HYA& Hm@>>@@R@"R@"wA6C"D@  ,  DCA2 HJ}@@|A:C&D@  ,  ,CA6 0A7 D@?N@A@C@'@A%@A@  ,  CA@ !@@@FCA@  ,  CAD AE @=V@@Q@#ZR@#2AB>
AP @D@zA@@A@?jB@@A>C@@B@A@  ,  D@@@D
A@  ,  DA_  @@@B>Ac @D@A@@A@?}B@@A?UC@@B@A@  ,  D$Ao @@AB>At ##@"glB@@ @#R@#@A~ BHA BJ@@D7 DD2@B@@AA@@B@?B@@A?tC@@B@B@  ,  DCA ^`@@AD@B@  ,  DGA BD@@@"DD@@A@A@  ,  DMA @@@C>A  @"gl>@A @@DZ FDU@	A@@A@?B@@A@A@  ,  DaA A @$charB@@P@(TBC9>$A $@$path>$@)A @@Dx H$name&stringO@@ @%Q@$@A "(A ",@@D ID@B@@AA@@B@@B@  ,  tD-A@@@A#DB@  ,  lDA ~A ~@Q@%#HB+D@@A@@A@  ,  TD@MA/DA@  ,  DDA c|A c}@@RA5!s&stringO@@ @$u@A cvA cw@@D KD@&@B@@AB@@B@  ,  (DB  /UB /b@<jAN"id78@@ @$p@B /OB
 /Q@@D JD@B@@A>@B@@B@  ,  D@|ADB@  ,  DͰB "$@@@bD7A@  ,  DѰB mB m@>.@@R@(S@(AC>]B) @#env>]@B. *@@D ND@	A@@A@>B@@A@A@  ,  DB8 m@@AD	A@  ,  DB< -LB= -i@-@@R@(R@(S@(A"DA@  ,  DBJ -/@@@&DA@  ,  EBN @@AC>lBS @!b>l@BX @@E PE@	A@@A@>B@@A@A@  ,  xEBb @@@E	A@  ,  lEBf []Bg [y@>x@@P@)XQ@)RAC>yBw @#env>y@B| @@E4 R!f>v@B B @@E; S!x>m@B B @@EB T!b>@@ @)<Q@)2@B $B %@@EN U!y>P@)A@B JPB JQ@@EV VEQ@D@@A.C@@B)B@@$A@@E@@ABC@>B@@A>C@@B@E@  ,  dEgL2@@1ACEcEA  ,  `ElB JTB JW@A8AJEk@@AC@D  ,  XEvB JLB@@AAREsDA  ,  TE|B (B F@AHAYE{@(@A'B"@C  ,  HEB  R@@Q@aEC@  ,  0EB }b@@aAD`>B i@$path>@nB 	@@E Y"tl>@B 
B @@E Z&abbrev>@B 
B @@E [E@A@@AC@@B@@AB@?gB@@A>D@@?MC@@AB@C@  ,  $EC ovC o|@@A-EC@  ,  EC V[C Vn@8@@S@)S@+T@+A;E C@  ,  EɰC @@@?E$C@  ,  EͰC @@@D>C @$desc>@C" @@E ^Eհ@	A@@A@A<B@@A>C@@B@A@  ,  EC. 6j@AA@EE@@  ,  EC2 6T@@@D>C7 66@>>>@@ @+@C? 6BC@ 6F@@E `E@B@@AmA@@B@A]B@@A>C@@B@B@  ,  xFCO v@AA@FF @@  ,  lFCS v@@@D>CY vv@>>>@@ @,2@Ca vCb v@@F b%level>@Ch vCi v@@F! cF@
A@@B@@AB@?B@@A@B@  ,  LF*Cu @AA@F'F&@@  ,  @F.Cy @@@E>C~ #@>>ߠ>@@ @,k@C C @@F? eF:@B@@AA@@B@A{B@@A?1C@@B@B@  ,  (FKC A@A@A@FHFG@@  ,  FOC C &@AEA@FMFL@@  ,  FTC J@@I@E.>C O@&fields>@TC @@Fa gF\@	A@@A@?.B@@A@A@  ,  FhC *Id@AcA@FeFd@@  ,  FlC *^C *f@AhA@FjFi@@  ,  FqC *Cm@@l@EM>C **s@$path >@xC *<@@F i#tyl!>@C *=C *@@@F jF@B@@AA@@B@?UB@@A@B@  ,  FC e@@A@*C ei@"t1'%@C etC ev@@F o#t1'((@C exC e{@@F p"t2)#@C e~C e@@F q#t2'*'@C eC e@@F rF@*,B-+A@@A&F@@!E@@ABD@@C@@AC@@FA  ,  FA@3Fð@@A@@B  ,  dFͰD @@A}<D @!t/7@D# D$ @@F t"t'08@D* D+ @@F uFް@W1A@@AC@@B@@AB@@CA  ,  PFA
@F@@A@@A  ,  DFD?  D@  @@AE;uDD r r@F@B@@AqA@@B@;B@@A@B@  ,  8GDQ  @@AG
B@  ,  $G
DU  @@@G@@A@A@  ,  GD[
!.!2D\!!@AA@GG
@@  ,  GD`
!.!4Da
!.!K@AA@GG@@  ,  GDe!M!S
AAA@GG@@  ,  GDi!M!z@AA@GG@@  ,  G"Dm!|!AAA@GG@@  ,  G&Dq!|!@AA@G#G"@@  ,  G*Du
!!AAA@G'G&@@  ,  G.Dy
!!@AA@G+G*@@  ,  G2D}	!!@@@F;D  @;;@D  D  @@GB ;;@D  D !@@GH ;;@D !D !@@GN !f;@D !D !@@GU GP@B@@AA@@!D@@AC@@BC@;E@@A<D@@<C@@<.B@@ABC@D@  ,  GhD"M"pD@@CAFN;D""H@Gi@A@@A@@AB  ,  |GvD"3"HD"3"L@@RAGtA  ,  dG|XAU@GwA
  ,  HGD""a@@`AFg;D"w"wf@!p;@kD"w"@@G G@#exnB@@A
A@@B@;B@@A@B@  ,  GD""D""@@yAG@
@A	@E@  ,  GD""D""@,@@W@<B%GE@  ,  GD""D""@0G@@V@<V@<W@<A3GA@  ,  G@@@6GA@  ,  GE#0#bE#0#f@@AF;E
""@$decl;@E"#@@G G°@B@@AA@@B@@B@  ,  GϰE#g#|@@AG
B@  ,  GӰE##@@@Gа@@A@@A@  ,  GٰE$0%)%D@;U@=ɐBF;ɐE--$$@"ty;@E2-$$@@G G@B@@AA@@B@?B@@A@B@  ,  G@AG
B@  ,  |GEA/%%"EB/%%(@@A&fields@1@@ @=@EK/%%EL/%%@@H G@@AC@@@AB@C@  ,  ,HEV.$$EW.$$@@E@@V@= @=A6H@(@A'@A@  ,   HEd.$$	@@	@<HA@  ,  HEh<&9&=	@A	A@HH@@  ,  H!El<&9&>Em<&9&t@;	BG;Ew2%R%R	 @"ty;@	%E|2%R%g@@H4 'flatten@Fg;@@ @>V@>
;@@ @>V@>@@@ @>V@>@ @>V@>@@ @>V@=@@@@ @>V@=(V@>@L@@ @>V@>@ @>V@=@ @=@ @=W@=@E3%j%tE3%j%{@@Ho !lF<.@@ @>L<+@@ @>M@@@ @>N@ @>K@@ @>JV@>+@E;&& E;&&!@@H !r@s@@ @>OV@>,@E;&&#E;&&$@@H H@OC@@AhB@@0E@@AD@@tA@@ABC@@B@@A@F@  ,   HE<&9&HE<&9&r@A:Ctype.flatten_fields.(fun)A@HH@@  ,  H@	AHE@  ,  HE;&&(E;&&5@E+@ @>/V@>I	BH@!@A@B@B@  ,  HF	;&&	@@	AHB@  ,  H°F
3%j%l	@@	@H@%@A$@A@  ,  HȰF<&9&eF<&9&q@#intA@@V@>V@>+B!n<@F%<&9&NF&<&9&O@@H "n'<U@>@F-<&9&XF.<&9&Z@@H H@D@@A
C@@]B`A@@AB@@D@  ,  H+@JAH
DA  ,  HQAN@H@
@A@@B  ,  xHFG9&&
FH9&&@A<Ctype.flatten_fields.flattenA@HH@@  ,  hI@Aݠ!l@FS3%j%|FT3%j%}@@I "tyV@=@F\3%j%~F]3%j%@@I "ty@@@ @=W@=@Fh4%%Fi4%%@@I! I@D@@A"B@@CA@@AB@AB@@A@@@@AD@  ,  \I1F|7%%F}7%%@A5A@I/I.@@  ,  TI6F7%%F7%%@A:A@I4I3@@  ,  <I;F7%%F7%%@@?A@!s<@@ @=@F6%%F6%%@@IL !k<@@ @=@F6%%F6%%@@IV #ty1A@@ @=@F6%%F6%%@@I` #ty2A@@ @=@F6%%F6%%@@Ij Ie@I@#G@@ABI@1H@@AK@BF@@E@@ACDKIH@  ,  
IxF5%%|@@{AxIu@W@AU@BRPCA  ,  
IF4%%F4%%@AAI]@B\ZB
  ,  
IF4%%@@@IB@  ,  
IF@&&
@A8Ctype.build_fields.(fun)A@II@@  ,  
IF?&&
@@
@H=-F>&z&z
@%level =-@
F>&z&@@I I@	A@@A@BB@@A@A@  ,  
IF@&&F@&&@AA@II@@  ,  
hIF@&&@@A!s!=3@G @&&G@&&@@I !k"=4@G@&&G@&&@@I #ty1#=5@G@&&G@&&@@I #ty2$=4U@>@G@&&G@&&@@I I˰@D@@AF%B@@'E@@ABC@@A@@AC@DC@@BB@@AB@EA  ,  
LIVAT@OI߰@@A@B@B  ,  
$IG5P))0
@A
A@II@@  ,  
IG9P))
@@
AH=TG@B&&
@'fields1(=T@
GEB&'@@I 'fields2)=H@GKB&'GLB&'
@@J )associate*@H7F @@V@@@ @@@ @@@ @@@ @@@ @@V@@@@ @@V@?0@HSV@?iV@?jV@?k@ @?@@ @@V@?1@He,V@?r&V@?s&V@?t@ @?@@ @@V@?2@H|)@@ @@V@@H@@ @@V@@@ @@V@?7=UV@?@@ @?V@?3=CV@?@@ @?V@?4=:V@@@@ @@
V@?5@ @?6@ @?8@ @?9@ @?:@ @?;W@?/@GC''GC''#@@J} Jx@}C@@AB@@A@@AB@@C@  ,  
JGC''@@@J@
@A@B@@B@  ,  JGF'K'SGF'K'~@A	 Ctype.associate_fields.associateA@JJ@@  ,  JGF'K'TGF'K'^@5A!p+@GC''$GC''%@@J !s,V@?F@GC''&GC'''@@J "s'-uV@?M@GC''(GC''*@@J !l.fV@?W@HE':'AHE':'B@@J J@vF@@AE@@B(D@@7HA@@A&C@@ B@@ABC@@@@@AH@  ,  JϰHF'K'`HF'K'p@iCB<JG@  ,  JְH!F'K'l@͠s@@X@?X@?X@?QAJJ&H@  ,  JH/F'K'rH0F'K'}@uXAQJ-F@  ,  J^@[ASJ/FE  ,  JH:H''H;H''@AbA@JJ@@  ,  JH?H''H@H''@V@@jAc"l'/V@?Z@HLG''HMG''@@K K IF@G@@ABGFC@?I@  ,  tKHWH''HXH''@V@@-AKH@  ,  `KH`H''HaH''@V@@AB!KG@  ,  PK	HiH''@V@@5@@X@@CX@@RX@@NA0K&&H@  ,  <K->@A2K((GB  ,  K0H{N((H|N()
@AA@K.K-@@  ,  K5HN((HN()@AA@K3K2@@  ,  K:HN()HN()@AA@K8K7@@  ,  K?HN((@@A"_n@@HM((HM((@@KP  "_kA"@HM((HM((@@KW à"_tB&@HM((HM((@@K^ Ġ!lCFx:Z@?@@ @?@HM((HM((@@Kk Š"n'D-@HM((HM((@@Kr Ơ"k'E2@HM((HM((@@Ky Ǡ"t'F6@HM((HM((@@K Ƞ"r'GIH@@ @?@HM((HM((@@K K@FKI H@A!k9U!k1M@@-["k'5O@@ABFX@"l'?G@@A!n8V!n0N@@HW"n'<R"n'4I@@ABC@@A!r;S!r3J@@GY"r'7P@@AB@@A!t:T!t2L@@]Z"t'6Q@@ABCD@[  ,  KݰI(L(q(I)L(q(@APA@KK@@  ,  KI-L(q(I.L(q(@AUA@KK@@  ,  `KI2L(q(I3L(q(@AZA@KK@@  ,  LKI7L(q(y@@^A]K@IBK(2(:ICK(2(;@@K d@IGK(2(=IHK(2(>@@L  2@ILK(2(@IMK(2(A@@L FJ0V@?l@@ @?@IWK(2(DIXK(2(E@@L [@I\K(2(II]K(2(K@@L #_k'=@IcK(2(MIdK(2(P@@L #_t'>@IjK(2(RIkK(2(U@@L# {G;Z@?@@ @?@IuK(2(GIvK(2(`@@L. L)@@ABq@@ABCrzy@p@ABpml@c@ABCD@oV@  ,  DL<IK(2(gIK(2(m@E@@W@@X@@BXLAV@  ,  8LH@AZLCV]  ,  LKIJ'(IJ'($@AA@LILH@@  ,   LPIJ'(IJ'( @AA@LNLM@@  ,  
LUIJ'(*IJ'(1@AA@LSLR@@  ,  
LZIJ'(@@A6@II''II''@@Li 9@II''II''@@Ln ;@II''II''@@Ls Jn@@ @?n@II''II''@@L| <@II''II''@@L ?@II''II''@@L A@II''II''@@L JSV@?u@@ @?w@II''II''@@L L hB@@ABCgBfBCD@Q@  ,  
LII''II''@F@@W@@fX@@dBOLQ@  ,  
L@AQLQ   ,  
LuAA!@L@@A@BC@Dʠ  ,  	LJZ*#*,
@@
AK?JX))
@L@
1PA@@A@?B@@A@AB  ,  	LȰJY)*JY)*"@@
A"tyOE@@ @B@JY)*JY)*@@L LѰ@@B@@AB@B  ,  	L
A
@#LA  ,  	LJ+h+p+J,h+p+@@
AK?J1f+7+7
@"tyX?@
J6f+7+K@@L L@B@@AA@@B@?B@@A@B@  ,  	|LJCi++@@ALB@  ,  	8LJGg+N+VJHg+N+e@E6@@V@C @CzA#M@@A@A@  ,  	,M
JUg+N+P@@@)MA@  ,  	 MJYn,%,? @@AL ?ӐJ^k++%@"ty[?@*Jck++@@M M@B@@AA@@B@@B@@A@B@  ,  	M%Jpm,,Jqm,,$@@7AM#
B@  ,  M*Jul++Jvl++@Ed@@V@C @CBA$M/@@A@A@  ,  M8Jl++J@@I@*M5A@  ,  M<J--T@?U@E/VBL4?Jr,b,b^@"ty^?@cJr,b,u@@MN ڠ%close_@E@@@ @DV@CF@@ @DhV@C@ @CW@C@Js,x,Js,x,@@Mc M^@C@@AB@@#A@@AB@FVB@@AE_C@@B@C@  ,  Mq5@A/MlC@  ,  MsJ~--J~--@@A5"tydE@@ @E@J~--J~--@@M M|@D@AB@D@  ,  LMJ}--J}--@E@@V@E @EAPM@-@A+@B*@B@  ,  @MJ}--@@AWMB@  ,  (MJs,x,z@@@ZM@5@A4@A@  ,  $MJ{-j-J{-j-@KV@D8Ctype.close_object.closeBi"ty`Y@Js,x,Js,x,@@M ܠ"tyaE@@ @DW@C@Kt,,Kt,,@@M M@wC@@ABA@@B@FB@@AEC@@B@~@@@AC@  ,  M-@'A%MC@  ,   MаKz-B-`Kz-B-i@@,A+#ty'cF@@ @D)@K%z-B-XK&z-B-[@@M Mٰ@ @A#labbD@@"@E@@ABC!E@  ,  MK4y-4-<K5y-4-A@@EADA@@ @D@K<x,-K=x,-@@M M@5@AB2.D@  ,  MKEx,-KFx,-0@G]@@W@D~X@Dx\BMD@  ,  N@_AND@  ,  NKSw,,KTw,,@Ge@@W@DfX@DBjBiN
TC@  ,  NK_w,,@F)type_expr@@Y@DCY@DcZ@DVyBxNcC@  ,  N#Knw,,@@~A|N gC@  ,  HN'Kru,,@@AN$@h@AeaBA  ,  DN/Kzt,,K{t,,@AAN.@p@AokA
  ,  8N8Kt,,@@@N5A@  ,  4N<K/6/MZ@@U@E\BM5@ܐK.+.+d@"tyg@@iK.+.>@@NN $findh@F@@@ @EXV@EDF@@@ @EV@EE@ @EFW@EC@K.A.KK.A.O@@Nc N^@ C@@AB@@#A@@AB@F]B@@A@C@  ,  No3@A-NjC@  ,  NqK//.K//5@@A3"filF@@ @E@K//$K//&@@N Nz@@D@@ABC@D@  ,  NK./K./@F@@V@E @EANN@+@A)@B(@B@  ,  NK..@@AUNB@  ,  NK.A.C@@@XN@3@A2@A@  ,  NK..K..@IV@E7Ctype.row_variable.findBg"tyiW@K.A.PK.A.R@@N "tyjF@@ @EWW@EM@L.U.]L.U._@@N N@u"C@@ABA@@B@FB@@A@z@@@AC@  ,  N+@%A#NC@  ,  xN̰L..L..@@*A)"tykG@@ @Ek@L!..L"..@@N Nհ
D@BD@  ,  `NL+..L,..@@>A<N'C@  ,  NL0.m.qF@@BA@N@(@A%#BA  ,  NL8.U.bL9.U.i@AKAIN@0@A/-A
  ,  NLA.U.YW@@S@PNA@  ,  NLE060<@APU@F BMALQ//*@"idoA@/LV//@@O "rvpA@L\//L]//@@O &paramsqA{@Lc//Ld//@@O "tyrAw@Lj//Lk//@@O# O@'E@@A"D@@B@@ABC@@A@@AC@G!B@@A@E@  ,  O39@TA3O.E@  ,  O5L/0	L/0,@AYA@O3O2@@  ,  O:L/0L/0+@A^A@O8O7@@  ,  O?L/0L/0@AcA@O=O<@@  ,  ODL/0 L/0*@AhA@OBOA@@  ,  OIL//@@lAM#_fisG@@ @F@L//L//@@OW "nmt&Stdlib#ref&optionJG!t@@ @FGG@@ @F@@ @F@ @F@@ @F@@ @F@L//L//@@O O{]Z@.F@@ABZ@ZYBCW@F@  ,  `OL//L//@G@@V@F
 @FAO@m@Ak@BjiCg@D@  ,  TOL//@@@OD@  ,  ,OL00@@ANA搰L0J0J@"tywA@L0J0c@@O O@b(B@@AA@@B@GB@@A@B@  ,  OL00L00@@A"nmx`[X@@ @FUG@@ @F@@ @F@ @F@@ @F@@ @F@M00M00@@O Oϰ@+@A!C@@+@AB*@C@  ,  O۰M&00M'00@@A@O5B@  ,  OM+0f0nM,0f0w@H@@V@F @FALO@>@A=@A@  ,  OM90f0h@@@ROA@  ,  OM=2j2p"@BU@HA$BNB+MF1010+@"ty{B+@0MK101K@@P O@5B@@AA@@B@CC@@GB@@AB@B@  ,  P@<AP
B@  ,  |PM\11M]2<2U@A	 Ctype.hide_private_methods.(fun)A@PP@@  ,  lPMb11Mc2V2`@@GA%"fi|HT@@ @Gl@Mn1j1wMo1j1y@@P' "nm}Рˠ@@ @GpŠHn@@ @Gr@@ @Gq@ @Go@@ @Gn@@ @Gm@M1j1{M1j1}@@PD "fl~D
D@@ @GD @@ @GH@@ @G@ @G@@ @GW@G@M11M11@@P_ PZ@3E`@AJD@@%F@@ABCC@@c@ACb@F@  ,  `PmM11M11@/H]@@ @GW@G@ @GW@GAbPx@z@@ABCx@D@  ,  TPM11l@@AjPD@  ,  LPM11p@@AnPD@  ,  PM1N1VM1N1_@H@@V@Ga @G\AP@@A@A@  ,  PM1N1P@@@PA@  ,  PM22)M22;@@A!k-@@V@GV@G@M11M11@@P !rW#refTDg@@ @G@@ @G@@ @G@N
22$N22%@@P P@|-C@@A'B@@;A@@ D@@ABC@@D@  ,  PаN2<2RN2<2T@@A2Pΰ
@@AB@@C@  ,  PذN#11N$12
@I*field_kind@@ @G͐AAPݰ@@A@B@@B@  ,  PN211@@AHPBA  ,  PA@P@%@A@@A  ,  |PN=44"N>44?@C@@V@M! @M.AOBNJ445@#ctyB@:NO44@@Q Q@	A@@A@HB@@AC(C@@B@A@  ,  pQN[44F@@E@Q
A@  ,  hQN_55N`56@L@@V@N	V@NVBP!pB@Nn55No55@@Q'!qBU@M@Nv55Nw55@@Q/Q*@D@@ABA@@C@@AB@@D@  ,  \Q<(@uAQ7
DA  ,  HQ@{Ay@P7Q;@@A@@B  ,  4QEN77N77@AA@QCQB@@  ,   QJ@APFBN77@#fi1B@N77@@QV#fi2B@N77N77@@Q]QX@B@@AA@@B@C
C@@C:B@@AB@B@  ,  QhN8{8N8{8@BܠB@@W@PW@PW@PA+QpC@  ,  QwN8{8@BB@@W@PW@PW@PA9Q~&B@  ,  QN8{8 @@A=Q*B@  ,  QN868lN868z@AA@QQ@@  ,  Q@AE"p2 BU@PU@P]U@PU@O@N868>N868@@@QQ@WBC@@AC@C@D@@ABCD@D@  ,  QN868KN868h@5@@W@P?W@PcX@PQ+B&QD@  ,  QO868G@@0A*QD@  ,  hQO78'O785@A5A@QQ@@  ,  TQ@7Av"p1CU@PU@PSU@PaU@P U@O@O77O77@@QQ̰@AC@@Av@v@D@@ABCw@D@  ,  LQ۰O&78O'78#@58@@W@PW@P&X@P^B(QD@  ,  4QO478@@cA,QD@  ,  QO877h@@g@QB@  ,  QO<&CC@@APB^OCCC@B[JBY@@ @V@OKCC,OLCC/@@R1"tyBZ@ORCC0OSCC2@@R2#resM'B\@@ @ViW@V^@O_#C~CO`#C~C@@R3R@"B@@AC@@A@@AB@BB@@ABD@@BC@@AB@C@  ,  R'Or%CC@@A6R$C@  ,  R+Ov$CC@@A:R(C@  ,  R/Oz"CeCgO{"CeC|@K@@V@V]W@VUĐBER4@!@A@B@B@  ,  R>@@AKR:B@  ,  RAO!CMCO@@AOR>
B@  ,  REO C5C7@@@SRBB@  ,  pRIO*D!D#O*D!D1@K@@V@WW@VAQVB K B@@ @V@O(CCO(CC@@R`5"ty!B@O(CCO(CC@@Rg6"tl"BCU@V@@ @VW@V@O)CCO)CC@@Ru7Rp@#B@@AC@@A@@AB@BB@@A@C@  ,  `R7@@A.R|CA  ,  \RO)CCO)CD@AB5R@@A@B@B  ,  LRO)CDO)CD	@A$A@RR@@  ,  <RO)CD
@=CPW@V@@X@VX@VX@V3BNRB@  ,  ,RO)CC9@@8@RRB@  ,  RO/DhD~O/DhD@@CAQBǐO-D9D9I@"ty%B@NO-D9DK@@R9R@oWB@@AA@@B@CB@@AC(C@@B@B@  ,   R°P
0DD]@@@X@WIX@WObC"!v&B@P0DDP0DD@@R:$real'C~U@T@P#0DDP$0DD@@R;Rװ@XC)@AD@@)@E@@ABC*@E@  ,   R&@ARE@  ,   RP5.DNDVP6.DNDb@NC@@ @W!BHR@:@A9@A@  ,   RPB.DNDP@@@NRA@  ,   RPF7EcEePG7EcEs@LX@@V@XW@X	ARCPU2DD@&params*C@PZ2DD@@S="ty+C@P`2DDPa2DD@@S>"ok,L@@ @WW@W@Pl4DEPm4DE@@S%?S @C@@AB@@A@@AB@DB@@ACKC@@B@C@  ,   S2P}6ECEEP~6ECEa@L@@V@WW@WِB7S7C@  ,   |S>@@A:S:C@  ,   \SAP5EE:P5EE?@@A>S?@ZC@@A @]D@@A"@BC!@D@  ,   0SOP5EEP5EE@L@@W@WX@WASST@3@A1@B0@F@  ,   S^P3DDP3DD@L@@V@WW@WBbScB@  ,  Sj
@@	@eSfB@  ,  SmPWHH@AA@SjSi@@  ,  SqPVHHPVHH@L@@W@ZbX@Z]ARC^P:E{E{&@$decl/C^@+P:E{E@@SA"ty<DW@@ @ZL@PUHvHPUHvH@@SMS@A@@A^B@@`C@@D@@ABC@DqB@@ACC@@B@D@  ,  S1H@@GA(SD@  ,  SPSHRHVPSHRHk@M@@V@ZBW@Z=RA3S@@A@E@  ,  xSPTHmHu@@YA9SE@  ,  lSQPHH&QPHH(@@^A>S@saF@@A+@B#@F@  ,  \SQQH)H:Q
QH)HH@M @@V@Z2W@ZW@ZpAR"ty;L@@ @Y@QQH)H4Q QH)H6@@SLSӰF@G@@AB@@G@  ,  TS@ASG@  ,  0SQ+OGG.@@AfS3E@  ,  SQ/AF-F5Q0JGoGz@MC@@V@YW@XW@XBv!v00=@@ @Xh@@ @Xg@QG@F
F!QH@F
F"@@T B$_rep1M"6variant_representation@@ @Xi@QS@F
F$QT@F
F(@@TCT@gF@@A}@!G@@ABw@G@  ,  TQ`BF?FIQaIGcGn@A<Ctype.closed_type_decl.(fun)A@TT@@  ,  T7@A+TG@  ,  TQhLGGQiLGG@9W@YǐB!r20=@@ @X{@@ @Xz@Q{KG{GQ|KG{G@@T4I$_rep3MV5record_representation@@ @X|@QKG{GQKG{G@@T@JT;4@G@@AB@G@  ,  TFQLGGQLGG@A1A@TDTC@@  ,  TK.@A'TFG@  ,  TMQMGGQMGG@@ATKD@B@F@  ,  TTQ?FF
Q?FF@@ATRF@  ,  tTYQ<EEQ<EE@M@@V@XDW@X/BT^E@  ,  HTeQ;EE@@@TbA@  ,  4TiQLGGQLGG@@T@I!l:>@@X@YX@Y}@QLGGQLGG@@TyKTt@A@@A@DB@@A@A@  ,   TQHGG@QHGG`@AkA@T~T}@@  ,  TQHGG6QHGGb@@pA'cd_args4M5constructor_arguments@@ @X@QBF?FOQBF?FV@@TD&cd_res58L@@ @X@@ @X@QBF?FXQBF?F^@@TE!l7L>=@@ @X@@ @X@QHGG1QHGG2@@TGT@.C@@A#B@@D@@A.9A@@BC@DB@@A@D@  ,  TðRGFFRGFG@@A>!l6L٠M@@ @X@@ @X@RGFFRGFF@@TFTѰ!@D@@A@BC@D@  ,  TݰR(FFFX@@AVTڰ*(@%@AB#@C@  ,  TR/DFFR0DFF@@A^TC@  ,  TR4CFfFrd@@AbTCA  ,  TA@T@4@A2@A  ,  TR?HGGJR@HGG_@@@p!l8>@@[@YH[@Y"@RKHGGERLHGGF@@UHT@A@@A@E$B@@A@A@  ,  URVdJ	J
@AA@UU@@  ,  tURZcIIR[cIJ@Nl@@W@[X@[AT DߐRhYHH@#ext?D@RmYHH@@U%O"ty@E@@ @[@RvbIIRwbII@@U/PU*@
hB@@AA@@jC@@D@@ABC@FB@@AEYC@@B@D@  ,  dU@1@@A(U<D@  ,  ,UCR`IIR`II@N@@V@ZW@ZA3UH@@A@E@  ,  UQRaII@@A9UNE@  ,  UUR^INI\R^INI@N@@V@ZW@ZW@Z
BGU\@kF@@A2@B,@F@  ,  Uh@ANUcF@  ,  UjR]I;IKR]I;IM@@ASUhF@  ,  UoR[HHR[HI@N@@V@ZW@Z"B_Ut,E@  ,  U{RZHH(@@'@cUx0A@  ,  URMM4@A3A@U|U{@@  ,  URMMRMM@N@@Y@]Z@]>ATD萰RlJJJ@&paramsGD@ORlJJ@@UV$signHD@RlJJRlJJ@@UW"tyIM@@ @[\Y@[R@RmJJRmJJ@@UX&fieldsJIvIo@@ @[Il@@ @[M@@ @[@ @[@@ @[Y@[r@SnKK%SnKK+@@UY$restKM@@ @[Y@[s@SnKK-SnKK1@@UZ&reasonUE7@@ @]A@S(MfMwS)MfM}@@UbUܰ@uD@@AXmG@@;F@@ABUB@@I@@A&E@@BUA@@anH@@ASC@@BCD@E]C@@AFB@@FG@@ABIF@@IE@@MD@@ABC@I@  ,  tVSPMMSQMM@Ob@@Y@]Z@]zBV
.I@  ,  TVS\MMS]MM@On@@Y@]fZ@]Q̐AV:I@  ,  DVShMM@N)type_expr@@[@]R[@]c\@]\ېAV%II@  ,  4V,@@AV(LI@  ,  V/Sz~M<M@S{~M<M[@O@@X@]8Y@]3AV4@W@S@ABR@O@AN@J@ABCI@J@  ,  VBS}MMS}MM:@O@@X@](Y@]BVGJ@  ,  VNS|LLS|LM@O@@X@]Y@\	AVSJ@  ,  VZS|LM@=@@Z@\Z@] [@\AV`,J@  ,  VgSvLLS{LL@O@@X@\Y@\a"BVl8J@  ,  VsSwLL SzLL@A8Ctype.closed_class.(fun)A@VrVq@@  ,  dVySM]Me@@-AVvBJ@  ,  `V}SuKKSuKL
@BL@@Y@\77AVMJ@  ,  PVSuKKSuKL	@Oi)type_expr@@[@\8[@\I\@\BGAV]J@  ,  0VSqKzK|SsKK@O@@X@\!Y@[SBViF@  ,   VSrKKSrKK@A1A@VV@@  ,  VSpKhKjSpKhKx@P@@X@[Y@[dA%VzF@  ,  VT oKJKLToKJKf@P@@X@[Y@[pB1VF@  ,  Vu@@tA4VF@  ,  VİTnKK5TnKKF@ @ @[vY@[A?Vʰ@@AB@C@  ,  V԰TnKK @@AFVCA  ,  VڰT%mJJT&mJK@AAMVٰ@B@B
  ,  VT.mJK	@N@@Z@[]Z@[n[@[gA]VB@  ,  VT;mJJ@@@aVB@  ,  lVT?rKKT@rKK@@Ak#labL>7%label@@Y@\ Y@[@TNrKKTOrKK@@W["tyMO)type_expr@@Y@\
Y@[@T\rKKT]rKK@@W\W@ C@@ANA@@B@@AB@@C@  ,  dWTjrKKTkrKK@P@@Z@\[@[B2W$C@  ,  XW+TvrKK7@@A6W(CA  ,  <W1A@W,@@A@@A  ,  (W6TzLLTzLL@@@\@\\@\ɐB#labOF@@Y@\Y@\i@TwLL&TwLL)@@WQ]$kindP4@@Y@\Y@\j@TwLL+TwLL/@@W]^"tyQF@@Y@\Y@\k@TwLL1TwLL3@@Wi_#ty0RH9@@ @\@TyLhLTyLhL@@Ws`$realSH=@@ @\@TyLhLTyLhL@@W}aWx@oE@@A3C@@AD@@ABTA@@G@@ApF@@2B@@(H@@ABCD@FC@@AHgB@@GD@@AB@H@  ,  WTzLLTzLL@A&A@WW@@  ,  Wh@(A^W!H@  ,  WTyLhLtTyLhL@@Z@@Z@\Z@\[@\5AjW@,+B)@"@AC@H@  ,  WTyLhLp|@@>ArWD@  ,  WUxL8LCUxL8LW@@@Z@\GA|WD@  ,  WUxL8L@@@LAWDA  ,  tWSAP@8W@B@A7@A  ,  PW˰UNN@@@VFUNN@"tyXF@U NN@@WdWӰ@	A@@A@@A@  ,  ,WݰU(OQOS@@@VF퐰U-O3O3@"ty]F@U2O3ON@@WfW@	A@@A@@A@  ,  WU:SS	@@AV"tycF@U@RR@@WlW@	A@@A@FC@@Q(B@@AB@A@  ,  XULRR@@@WA@  ,   XUPUdUf@@AW"tyjF@UVU,UG@@XsX	@	A@@A@FC@@Q>B@@AB@A@  ,  XUbUJUL@@@XA@  ,  XUfXXUgXX@FX@cBW3$_envzF@UrXXUsXX@@X+#_ty{F@UyXXUzXX@@X2X-@B@@AA@@B@@B@  ,  X9@	@X4B@  ,  X;U_+_/@@@Z@gZ@gBW[#envFr@*U^^@@XO%levelFs@U^^U^^@@XV"tyFq@U^^U^^@@X]$snapD(snapshot@@ @fY@f@U^^U^^@@Xk!eUgUd@@ @f@@ @f@U__U__@@XyXt@G@@A6C@@E@@AB4B@@)D@@AF@@4A@@ABC@UB@@AFC@@B@G@  ,  XU_+_=U_+_Y@AnA@XX@@  ,  XU_+_PU_+_W@AsA@XX@@  ,  XU__U__)@Q@@Y@g	Z@g~A`X+G@  ,  |X@@AcX.G@  ,  HXU^^U^_@FAiX@3@A/@.@A*@BC)@H@  ,  4XV ^^V^^@R@@X@fY@fCzXH@  ,  XV^^@@A~XDA  ,  XǰV^^V^^@AAXưK@E@ABD@C  ,   XѰV^^@@@XC@  ,  XհV $`a@AA@XX@@  ,  XٰV$$``@@AWFϐV,!``@&tr_exnF@V1!``@@X%scopeF@V7!``V8!``@@X"tyF@V>!``V?!``@@X!eUU@@ @h.@@ @h-@VL$``VM$``@@YY @F@@A{D@@B$B@@|E@@A/C@@$A@@ABC@VB@@AU}C@@G'D@@AB@F@  ,  YVg#``Vh#``@FBEY@@AB@G@  ,  Y&Vq"``
@@	@LY#C@  ,  DY*VuqllVvqll+@R@@Y@p(Z@p"AXO#envF@&Vjk_ks@@Y? %levelF@Vjk_ktVjk_ky@@YFà"tyF@Vjk_kzVjk_k|@@YMĠ"tyQ6@@ @oY@o@VkkkVkkk@@YYŠ$snap@@ @oY@o@VmkkVmkk@@YeY`@0C@@F@@AB.B@@E@@AG@@'D0A@@ABC@VwB@@AQjC@@GCD@@AB@G@  ,  0Y~TVrl-lQ@@gALY{G@  ,  YVokkVokl@GY@p oDUY@$@A @@A@BC@I@  ,  YVnkk@@yA^Y	EA  ,  YVmkkVmkk@AAeY0@*@AB'@D  ,  YVlkk@@AmYD@  ,  YVlkk@@AqYDA  ,  YVkkkVkkk@AAxY%D@<@AB;@C  ,  YVkkk@@@YC@  ,  lYWxll@AA@YY@@  ,  dYWxll@@AXG?WulYlY@&tr_exnG?@WulYlt@@YȠ#envG:@WulYluWulYlx@@Yɠ%levelG<@W"ulYlyW#ulYl~@@Yʠ"tyG:@W)ulYlW*ulYl@@Yˠ!eVޠV@@ @p@@ @p@W7xllW8xll@@YY@G@@A)C@@hE@@AB&B@@iF@@A8D@@&A@@ABC@WB@@AVjC@@GD@@AB@G@  ,  0Z	WTwllWUwll@GbCOZ	@@A@@A@BC@H@  ,  ZW`vll@@@XZ	D@  ,  ZWdt!tIWet!t[@GXGV@@Y@uY@uY@uS@@Y@uY@uY@u@@Y@u#BYL#envGF@,Wst@@Z9"tyGG@WstWst@@Z@Z;@B@@AA@@B@GD@@AUB@@StC@@AB@D@  ,  ZMWt!t#C@@BAZJB@  ,  ZQWtt	G@@F@"ZNB@  ,  ZUWttQ@@P@YsGXWttV@"tyGX@[Wtt@@ZbZ]@	A@@A@IB@@A@A@  ,  ZiWzz
Wzza@A>Ctype.limited_generalize.(fun)A@ZhZg@@  ,  pZoWyyWyy@S@@X@z5Y@zwBYGlWtt@#ty0Gl@Wtt@@Z"ty Gi@WttWtu @@Z#ty0R{@@ @v	Y@u@Wuu	Wuu@@Z%graphGޠS@@X@w
X@vS)type_expr@@X@zX@z]TPJR@@X@xZ@x@@X@xX@x@@X@xX@z^@X@z_X@v@@ @v*Y@v@Xuu"Xuu'@@Z#idxTi2@@ @vBY@v<@@ @vAY@v8@X)u?uEX*u?uH@@Z%rootsT{V+X@vP@@ @vQY@vI@@ @vNY@vE@X>u_ueX?u_uj@@Z'inverse@?Y@vW@Kz@@ @wY@vXKx@@ @wY@vY@ @vZ@ @v[Z@vU@XVuxuXWuxu@@[2generalize_parents@RY@v\C@@ @xY@v]@ @v^Z@vV@Xgw^wdXhw^wv@@[ [@H@@AD@@BXE@@3G@@ACIF@@A@@CB@@ABD@VB@@AS%C@@B@H@  ,  T[78@@7A[3H@  ,  T[:XyyXyy@T@@X@zY@zZ@yDB[A&H@  ,  D[HXyyXyy@@K@@Z@yK@@Z@y@Z@ySA[P5I@  ,  4[W@VA[R7H@  ,  [YXywyyXywy@T@@X@yY@yaB[^CH@  ,  [ef@@eA[aFH@  ,  [hXuxuzj@@iA[e@H@AG@E@ABCBC>@F@  ,  [qXu_umXu_us@AsA@[o[n@@  ,  [vXu_uax@@wA[s@U@U@ABPOCK@E@  ,  [~Xu?uKXu?u[@AA@[|[{@@  ,  [Xu?uA@@A[@b@A\[BW@DA  ,  [Xuu*Xuu;@AB[@feBa@C
  ,  [Xuu@@A[CA  ,  [XuuXuu@AA [@u@r@ABq@B  ,  [Xuu@@@([B@  ,  \[XzzEXzz`@@@A4"ty@XzzXzz@@[[@'B*A@@C@@AB@WB@@A@C@  ,  H[Yzz#@@WA[CA  ,  4[^A[@N[°@@A@B  ,  [̰YyYyfYyYyh@@	+Ctype.limited_generalize.generalize_parentsAY"ty@Y w^wwY!w^wy@@[#idxJ@@ @xaZ@x_@Y-w|wY.w|w@@[[@%C@@AB@@A@@AB@WNB@@AUE@@B$F@@SC@@AG@@hD@@ABC@@@@ @@ABC@  ,  \ YKyy<YLyyX@@4A6#row
9+@@ @x@YWxxYXxx@@\$moreT)type_expr@@ @y [@x@YexxYfxx@@\"lvE@@ @y	[@y@YqxxYrxx@@\*\%EB@F@@AB E@@,D@@F@ABCE9F@  ,  \5Yxx5@@hA4\2
F@  ,  \9Yxx9@@lA7\6UR@@A
BCQEEA  ,  \CYxxYxx@AwAB\Ba^@@A^@BC]QD  ,  \NYxxN@@AK\K	D@  ,  ,\RYwwYwx!@U@@Y@xZ@xB\W@t@Ar@BqeB@  ,  \aYwxYwx @X@xX@xX@wB\fB@  ,  \mYwwYww@U@@Y@xZ@xB\rB@  ,  \yYwwYyiyp@@A\w B@  ,  \~Yww@@A\{$B@  ,  \Yw|w	@@@\@@AA@  ,  \Yw5wFYw5wT@X@xDX@xC	 Ctype.limited_generalize.inverseB#pty@YuxuYuxu@@\"tyY@vg@YuxuYuxu@@\"ty	T@@ @vxZ@vn@YuuYuu@@\'parents
X@w@ZvwZvw@@\\@&sD@@E@@AB-B@@C*A@@AC@X&E@@A-H@@BI@@TF@@AJ@@@G@@ABC@C@@@@@ABE@  ,  \ذZ#w5w;P@@KAI\ E@  ,  t\ܰZ'vwZ(vw1@}X@wSBQ\ް@%@A#@B C@  ,  T\Z3vvZ4wUw\@@\AY\C@  ,  4\Z8vv@@`A]\C@  ,   \Z<vvZ=vv@@@Z@whAf\D@  ,  \ZEvvZFvv@AnA@\\@@  ,  \ZJvvZKvv@V\@@Y@wZ@wyBw]&C@  ,  ]ZVvv@@~A{]*C@  ,  ]ZZvkv|Z[vkv@AA@]
]@@  ,  ]Z_vkvs@@A]3C@  ,  ]Zcvv
Zdvv1@Vu@@Y@w!Z@vC]?C@  ,  d]$Zovv$@AA@]!] @@  ,  X](Zsvv)Ztvv0@AA@]&]%@@  ,  L]-"@@A])KC@  ,  <]0Z{uuZ|vv@@A].PC@  ,  ]5ZuuM@@A]2TCA  ,  ];ZuuZuu@AA]:\|@B{oB
  ,  ]DZuu\@@@]AB@  ,  ]HZ	y{P@A;Ctype.compute_univars.(fun)A@]F]E@@  ,  ]MZ#%Zkw@V@@Y@  Z@  [B\zIʐZ|r|re@"ty9I@jZ|r|@@]e	(inverted:JJ"@@Y@  Y@|@@ @|Z@|@Z||Z||@@]w
,node_univars;JWIY@  @@Y@  Y@}@@ @}%Z@}@Z||Z||@@]*add_univar<@A@@ @  GZ@},@JO@@ @  Z@}-FS@@ @  eZ@}.@ @}/@ @}0[@}+@Z|}Z|}@@]]@!D@@AIB@@B8C@@RA@@AC@JYC@@UB@@AB@D@  ,  ][#3[#j@ApA@]]@@  ,  ]o@@Af]D@  ,  ][
||@@Ai]@@AB@CA  ,  ]Ȱ[||[||@AАAs]ǰ@"@A@B@B  ,  h]Ұ[||[||@W/@@Y@}Z@}C]B@  ,  X]ް@@A]BA  ,  T][.||[/||@AA]@9@A8@A
  ,  8][7||@@@]A@  ,  ][;#X[<#i@@A"typJU@@ @  @[F#8[G#:@@]#invqZ@  @[O#;[P#>@@^^@A@@B@@AB@B@@A@B@  ,  ^[\#E[]#R@Wt@@[@  \@  АA(^B@  ,   ^[h#B-@@@,^B@  ,  ^![l
 )@@A͠"tyrJ@[r	y[s	y@@^+^&@B@@A
A@@B@B@@A@B@  ,  ^5[
[
@Y@  "Y@B^8@@A@E@  ,  ^A[
 I@@@ ^>A@  ,  d^E[~~[~
@@Z@@]@  s	 Ctype.compute_univars.add_univarA$univ=@[|}
[|}@@^W
#inv>Z@}8@[|}[|}@@^`^[@(C@@D@@ABA@@B@@AC@C@@V_B@@AB@@@@AE@  ,  P^s[~~[~~@W@@\@  O]@  %0C/^xD@  ,  ,^[~~@A5A@^|^{@@  ,  $^[~~[~~@JY@  F=A<^*D@  ,  ^[~@@BA@^.D@  ,  ^[~8~D[~8~o@Z@}Z@  \@NBN%univsA Y@}@[}}[}}@@^^@D@A?@>@H@@ABC?;H@  ,  ^[~8~N[~8~_@@@\@   fA^I@  ,  ^%@iA^H@  ,  ^\ ~
~\ ~
~6@K^@qB#^H@  ,  ^\}~\~p~}@@wA(^H@  ,  ^Ű\}}\}}@B"@@\@}\@]@~B6^-H@  ,  d^Ӱ\}}@@A:^1HA  ,  `^ٰ\$}}\%}}@AB^ذ9wvBtpG
  ,  4^\-}}W@@A^C@  ,   ^\1}9}y\2}9}{@@A#_ty?W"@@ @}L@\<}9}F\=}9}I@@^"tl@WW0@@ @}N@@ @}M@\K}9}K\L}9}M@@_^`@D@@A@BCD@  ,  _\V}9}T\W}9}u@Xn@@[@}\@}eȐB,_D@  ,  _\b}9}c@-Z@  JZ@~Z@}Z@}\@@\@}f\@}\@}xݐBA_%&D@  ,  _,!@AC_'(D@  ,  _.\y}}@@@_+@BB@  ,  _4\    \    @X@@Y@  Z@  !HA^aK\
!Q@"tyuK@!V\
@@_K#auxv@O@@ @  Z@  :O@@ @  Z@  ;@ @  <[@  9@\\@@_`#resyX@@ @  Z@  @\    \    @@_l_g@%B@@AC@@.A@@AB@WeB@@A@C@  ,  p_wC!@@!A:_sC@  ,  P_z\    \    @@!A>_x@@AC@@@AB@C@  ,  $_\    \    @X@@Z@  [@  !AP_@#@A @B@F@  ,  _\    !@@!AW_B@  ,  _\!@@!@Z_@*@A)@A@  ,  _\    \    @f@@[@  [@  7Ctype.fully_generic.auxAl"tyw\@\\@@_"tyxW@@ @  M[@  C@]  ]  @@__@BA@@A@WB@@A@|@@@AB@  ,  _+@"A _B@  ,  _˰]  X  a]  X  r@Y(@@Z@  [@  -A,_B@  ,  _װ]"  X  `]#  X  @@3A1_B@  ,  _ܰ]'  1  7>@@7A5_ B@  ,  _]+    ],    +@YC@@Z@  `[@  [BAA_,B@  ,  |_]7    N@@GAE_0BA  ,  x_]=  ]>  @ANAL_@6@A53A
  ,  l_]F]@@V@S_A@  ,  T_]J  a  w"@A4Ctype.instance.(fun)A@__@@  ,  @`]O  a  c""@@"!A_-K]V    ")@KXK@@ @  B@]^    ]_    @@`J#schK@]e    ]f    @@`K'partialP@L@@ @  }L@@ @  |@ @  {Z@  jKY@  k@ @  lZ@  a@@ @  bZ@  O@]    ]    @@`<L`7@"C5B@@A,A@@B@LB@@ALCC@@B@C@  ,  8`I]    #]    '@@"gAE`G@@A
@B@B@  ,  (`Q]  (  ;]  (  [@A"oA@`O`N@@  ,   `V]  (  @@A"sA@`S`R@@  ,  `Z]  (  A]  (  T@1"yAY$keepK@]  (  3]  (  7@@`gM`b@C@@A*@*@AB)@D@  ,  `n@"A`iC@  ,  `p]    "@@"@k`m&B@  ,  `t]  a  ]  a  @@v@r%scopeL;@@ @  @]  a  |]  a  @@`N`}@
A@@A@LB@@AkD@@tC@@AB@A@  ,  `]  -  /"@@"A_L]    "@#schL@"]    @@`P#old^@@ @  Z@  @]    ]    @@`Q"tyL[@@ @  0Z@  @]     ]    @@`R`@B@@A#A@@C@@AB@\B@@ALdC@@B@C@  ,  `^    "@@"A4`CA  ,  `ǰ^    ^    @A"B;`ư@B@B
  ,  `а^    "@@"AB`B@  ,  `԰^    "@@"AF`B@  ,  `ذ^#    "@@"@I`հ@$@A!@A@  ,  h`ް^)  L  b#@A9Ctype.instance_list.(fun)A@``@@  ,  T`^.  L  N#
@@#@`LP^3  3  3#@$schlLP@#^8  3  I@@`T`@	A@@A@LB@@A@A@  ,  @`^B  L  y^C  L  @AA@``@@  ,  (`^G  L  p^H  L  @@@%scopeL@@ @  m@^Q  L  g^R  L  l@@a
Ua@
A@@A@MB@@A'C@@B@A@  ,  a^^  L  ^_  L  @@6@!tLw@^e  L  ~^f  L  @@aVa@
A@@A@M B@@A%C@@B@A@  ,  a'^r    #]@@#\@`QLT^v    #a@a(@A@@A@L{B@@A@A@  ,  a5^  h  j#q@@#pA`bLO^  l  l#w@!sLO@#|^  l  @@aCZ%indexL}@@ @  Z@  @^    ^    @@aO[aJ@B@@AA@@B@LB@@A@B@  ,  aX^     a^     b@@#A$aVB@  ,  a]^     =^     T@@@[@  #B.a`B@  ,  ag^     2^     9@J@@[@  [@  \@  #B<an$B@  ,  `au^     "#@@#A@ar(B@  ,  Xay^    ^    @LLX@  @@Z@  `Z@  v#CNa6B@  ,  8a^    #@@#ARa:B@  ,  a^    ^    @@#AVa@B@@A@@B?@B@  ,  a^    ^    @LX@  !#ӐBca@J@AI@E@  ,  a^    #@@#@iaA@  ,  a^  e  g#@A#A@aa@@  ,  pa^    ^    @Z#Uid!t@@[@  \@  X#A`L_    #@%*opt*ZiL@@ @  @_    _    A@a]LLY@  @_    @@a^LZyL@@ @  @_     _!    @@a`(manifestRpLY@  @@ @  [@  @_.    _/    @@aa/expansion_scopeL[@  @_6    _7    @@aba@5C@@F@@AB-D@@ E@@A+B@@lA@@ABC@@F@  ,  \a_J    X@Z@@\@  Y\@  j]@  c$IAVbF@  ,  Hb
j@$LAXbF@  ,  b_Z    _[    6@@$QA[b
@#@!@ABC@@F@  ,  b_c  7  Q_d  7  X@A$ZA@bb@@  ,  b_h  7  _@@$^Aj"tyL@_o  7  C_p  7  E@@b(c%scopeL@_v  7  G_w  7  L@@b/db*@+G@@AC B<@<@AH@@I@@ABC@@I@  ,  b<_    $~@@$}Ab9,D@  ,  b@_    {@@$Ab=@S@ALKB@@C@  ,  bG@$A%*sth*M?@@bL_bG@]@	D@@ABXWC@@D@  ,  bS@$@bNC@  ,  PbU_    $@@$AaM_    $@$cstrM@$_    /@@bcf"tyM@_    0_    2@@bjgbe@,#C@@AB@@A@@AB@ZdB@@A@C@  ,  ,bv_  H  o_  H  @M@@[@  [@  \@  $ǐB-$name[)@@ @  @_  H  __  H  c@@bhb@,GE,JD*@A(@F@@A)@BC(@F@  ,  b_  H  &@%@@\@  \@  ]@  $B$bF@  ,  b_  H  i3@@$A(bF@  ,  b_    ;_    B@Z@@ @  $A^b@I@AG@BF@B@  ,  xb`    5%@@%@ebB@  ,  Tb`	    %@A	 Ctype.instance_constructor.(fun)A@bb@@  ,   bð`    %@@%@aM^`    %@M[[uMY@@ @  "@`    `    @@bj$cstrMC@`#    `$    @@bkbװ@
A@@B@@AB@NC@@AMF@@BMD@@ME@@[B@@ABC@B@  ,  b`8	     $`9	     <@A0A@bb@@  ,  b@2A1%scopeN@@ @  @@`G    `H    @@c l&ty_resN@@ @  0[@  @`S  y  `T  y  @@cw'ty_argsS6N@@ @  [@  P@@ @  ][@  K@`e    `f    @@cx%ty_exSHN@@ @  [@  @@ @  [@  @`w    `x    @@c0yc+@>A@@A)C@@D@@A9B@@BC@O9C@@AiH@@BMF@@NXD@@AxG@@NGE@@\B@@ABCD@DA  ,  cK`    `    @AB\cJ@@AB@C  ,  cU`    `    @@O@@\@   O@@\@  @\@  Coc]D@  ,  cd`    w@@AscaCA  ,  cj`    `    @ABzci@=@9@AB8@B  ,  ct`    `    @@O/@@\@  O+@@\@  @\@  Cc|C@  ,  c`    @@AcBA  ,  c`  y  `  y  @A̐Dc@\@AV@A
  ,  lc`  y  }@@AcA@  ,  hc`    )`    +@@AcA@  ,  Xc`  ?  G`  ?  o@\@@Z@  [@  ][@  B#envN1@`  ,  8`  ,  ;@@cm2fresh_constr_scopeN,@`  ,  =a   ,  O@@cn'process@Ov@@ @  {]@  b<@@ @  ]@  c@ @  d]@  a@a  T  `a  T  g@@cocȰ@-B@@*D@@AB$C@@ E@@A@BC@E@  ,  @c?@A3c
E@  ,  8cܰa'  T  ha(    3AA	(Ctype.instance_constructor.(fun).processA@cc@@  ,  ca-  T  \G@@$A<c߰@@AC@D@  ,  ca4    @@+@c^A@  ,  ca8    @@AO>@+existential=@ aG  T  s@@cp$declW@@ @  ^@  i@aR  v  aS  v  @@dq$nameN@@ @  ^@  @a^    a_    @@dr"id%Ident!t@@ @  ^@  @ao    ap    @@d(s'new_env]@@ @  ^@  @a{    a|    @@d4t(to_unify]
@@ @  #^@  @a    a    @@d@u"tvO@@ @  z^@  R@a     a     @@dLvdG@.D@@ATB@@B[A@@@F@@AMC@@3E@@A(G@@H@@ABCD@P_C@@AG@@BI@@O!F@@ACJ@@OD@@AOnE@@]7B@@AzH@@BCD@H@  ,  dra    a    @]@@]@  ^@  Bdw0H@  ,  d~a    @]@@^@  _@  Ad;H@  ,  pd@@Ad>HA  ,  lda     a     @ADdFA@>@<@<@ABCD9@G
  ,  @da     @@Ad
GA  ,  <da    a    @AĐAdXSRP@N@ABCJ@F  ,  4da    @AA@dd@@  ,  ,da    a    @AA@dd@@  ,  da    b     @AA@dd@@  ,  db    @@AdF@  ,  db  e  o@@AdF@  ,  db    b
  :  a@@ @  ^@  Ddǰ@}@A|@y@ABr@C@  ,  dҰb    b    /@O@@_@  AdH@  ,  dܰb'     @@AdCA  ,  db-    b.    @ABd@B@B
  ,  db6    @@AdBA  ,  db<  v  b=  v  @AC d@@A@A
  ,  xdbE  v  @@@dA@  ,  `dbI
  }  'R@A	'Ctype.instance_parameterized_type.(fun)A@dd@@  ,  DebN
  }  'W@@'V@d5OLbU  B  B'^@OI]OG@@ @  &@b]  B  cb^  B  m@@e{(sch_argsOE@bd  B  nbe  B  v@@e|#schO=@bk  B  wbl  B  z@@e$}e@C@@AA@@B@@AB@Q)B@@A@C@  ,  0e/bz    b{    @A2A@e-e,@@  ,  $e4@4A2%scopeP@@ @  K@b
  }  b
  }  @@eA~'ty_argsUkP@@ @  [@  V@@ @  c[@  Q@b    b    @@eS"tyQ@@ @  [@  @b    b    @@e_eZ@,A@@AC@@%B@@AB@QfB@@A_C@@BOE@@XD@@AC@CA  ,   erb    b    @AuDAeq@@@AB@B  ,  e|b    M@@~AIeyBA  ,  eb    b    @ABPe@&@A"@A
  ,  eb    b    @AA@ee@@  ,  eb    a@@@\eA@  ,  eb    b    @@@b!tO@b    b    @@ee@
A@@A@QB@@AC@@qD@@AB@A@  ,  eb  [  q(@A	)Ctype.instance_parameterized_type_2.(fun)A@ee@@  ,  peb  [  ](	@@(@dOc  "  "(@(sch_argsO@(c  "  L@@e'sch_lstO@c  "  Mc
  "  T@@e#schO@c  "  Uc  "  X@@eeǰ@A@@AC@@B@@AB@QB@@A@C@  ,  \eװc"    c#    @A.A@ee@@  ,  Le@0A/%scopeQ@@ @  )@c1  [  vc2  [  {@@e'ty_argsVQ@@ @  [@  4@@ @  A[@  /@cC    cD    @@e&ty_lstV&Q@@ @  [@  @@ @  [@  @cU    cV    @@f"tyQ@@ @  [@  @ca    cb    @@ff@>A@@D@@AB7B@@'C@@AC@R#B@@AcE@@BqC@@mD@@AC@DA  ,  Hf/cz    c{     @ADVf.@@AB@C  ,   f9c    b@@A^f6CA  ,  f?c    c    @ABef>@(@&@AB#@B  ,  fIc    c    @@R@@\@  R @@\@  @\@  CxfQC@  ,  fXc    @@A|fUBA  ,  f^c    c    @ABf]@G@AA@A
  ,  fgc    c    @@R"@@\@  R@@\@  @\@  ǐCfoB@  ,  fvc    @@@fsA@  ,  fzc    c&  b  t@A(A@fxfw@@  ,  fc     c&  b  n@C:OY@  q@@Z@  vZ@  (BePCc  #  #(@!fPC@(c  #  1@@f"clCQP)@@ @  Q@c  {  c  {  @@f#rep@@ @  R@c  {  c  {  @@ff@D@@A!B@@B$%A@@C@@AC@@E@  ,  fd!    d%  R  a@A4Ctype.map_kind.(fun)A@ff@@  ,  fF@)A4fDD  ,  xfİd(    )$@A)#A@ff@@  ,  pfȰd)    d,    @CYPNY@  @@Z@  Z@  )1BI"flCePo@@ @  X@d)'  u  d*'  u  @@f"rr@@ @  Y@d3'  u  d4'  u  @@ff@<@D@@AB=@C@@AC@@E@  ,  `fd@*    dA,    @A;A@ff@@  ,  Lf6@)WA%fD:  ,  ,fdH  `  qdI  `  z@@)]Arf@P@AO@B@@BC  ,   gdQ  =  RdR  =  _@@)fA{g	BI  ,  g)lA)i@}gBL  ,  gdZ+    d[+    @AUA@g
g@@  ,  gd_+    d`+    @PY@  \AF!lPZ@  @dk*    dl*    @@g$g@$initB@@AA@@B@B@@A@E@  ,  g/ @r@g*@@A@A@  ,  g3d~"    d%  R  `@AyA@g1g0@@  ,  g8d#     d#    #@@@\@  ]@  B!c PZ@  ~@d!    d!    @@gLgG@A@@)B@@AB@B@@A@F@  ,  hgVd$  %  <d$  %  Q@ G@@\@  \@  rBg\E@  ,  (gc0@@!g^@@A@A@  ,  ggd0  ,  B)@A	 Ctype.instance_declaration.(fun)A@gegd@@  ,  gld0  ,  .)@@)@fPܐd/    )@$declP@)d/    )@@gygt@	A@@A@S{B@@AQ4C@@B@A@  ,  gd1  P  Td4  
  @AA@gg@@  ,  gd1  P  md1  P  @__@@[@  >@@[@  =[@  P,B)%scopeSZ@@ @  /@d0  ,  Gd0  ,  L@@gg@}B@@AA@@B@SB@@A8D@@QaC@@AB@O@  ,  gd1  P  vd1  P  @@Sj@@\@  Sf@@\@  @\@  RC&gP@  ,  ge	3    e
3    @`.type_decl_kind@@[@  [@  `B4g)M@  ,  g̰e3    e3    @@S@@\@  S@@\@  @\@  
oCCg8N@  ,  lg۰e&2    e'2    @`@@[@  +@@[@  *[@  =BTgIK@  ,  \ge72    e82    @@S@@\@  S@@\@  @\@  ~CcgXL@  ,  gy@@eg@W@AV@A@  ,  ߴgeJ<    *k@@*jAg5Q\eQ7    *r@$declQ\@*weV7    =@@h#olde@@ @  Z@  @ea8  @  Feb8  @  I@@h$decl\@@ @  Z@  @em:    en:    @@h&h!@C#A@@B@@AB@cB@@AQC@@B@C@  ,  ߬h3e~;    *@@*A4h0CA  ,  ߨh9e:    e:    @A*A;h8@B@B
  ,  ߜhBe:    *@@*ABh?B@  ,  ߔhFe9  ^  `*@@*AFhCB@  ,  ߀hJe8  @  B*@@*@IhG@$@A!@A@  ,  hhPeQ    *@A:Ctype.instance_class.(fun)A@hNhM@@  ,  LhUeQ    *@@*AgQe>    *@&params Q@*e>    @@hd#cty!Q@e>    e>    @@hk/copy_class_type"@T4@@ @  Z@  3@Z@@ @  Z@  5Z@@ @  gZ@  4@ @  6@ @  7[@  2@e?    e?    @@hh@ C@@A(A@@0B@@AB@TB@@A@C@  ,  8he?    +@@+@<h@
B@B@  ,  $heT  +  /eT  +  >@AIA@hh@@  ,  h@KAI%scope5Tc@@ @  "@eQ    eQ    @@h'params'6XԠTb@@ @  [@  -@@ @  :[@  (@fR    fR    @@h$cty'7Z@@ @  [@  @fS    fS    @@hhð@C@@A#B@@/A@@AB@TB@@AiE@@BqD@@yC@@AC@CA  ,  h۰f&S    f'S    '@ABAhڰ@@A@B@B  ,  hf0S    M@@AIhBA  ,  hf6R    f7R    @ABPh@#@A"@A
  ,  hf?R    f@R    @@T@@\@  }T@@\@  |@\@  {CbhB@  ,  ifNR    k@@@fi A@  ,  ifRO  d  lfSO  d  @A	$Ctype.instance_class.copy_class_typeA@ii@@  ,  i
fXO  d  zfYO  d  @aG@@[@  f\@  DĠ%scope#@fi?    fj?    	@@i"!l(@,)arg_label@@ @  R@fuN  D  UfvN  D  V@@i."ty)ae@@ @  S@fN  D  XfN  D  Z@@i8#cty*[L@@ @  T@fN  D  \fN  D  _@@iBi=@C@@&E@@AB&4A@@1B@@ D@@ABC@ULB@@A@@@@AF@  ,  ޔiTfO  d  fO  d  @Z@  OBCiUE@  ,  ވi\U@RAEiWEC  ,  di`fE    fM  $  C@AYA@i^i]@@  ,  \iefF    @A]A@ibia@@  ,  PiifF    	fF    "@a@@\@  ]@  hDZ$sign'[@@ @  M@fD    fD    @@i~iy@9@A6@C@@AB53F@  ,   ifH  ;  HfI    @T!t@,mutable_flag@@\@  9@,virtual_flag@@\@  :a@@\@  ;@\@  8@@\@  7\@  MB3i(E@  ,  ifH  ;  QfH  ;  @A	*Ctype.instance_class.copy_class_type.(fun)A@ii@@  ,  ifL    fM  $  B@aàa!t@@\@  ʠaѠa@@\@  @@\@  @\@  @@\@  \@  BYiNC@  ,  iΰgL    gL    #@A&A@ii@@  ,  ݼis@A`iUCw  ,  ݨiְg!C    g"C    @AA@ii@@  ,  ݘi@AƠ$path$b !t@@ @  G@g4@    'g5@    +@@i#tyl%ab(@@ @  I@@ @  H@gC@    -gD@    0@@i#cty&\@@ @  J@gM@    2gN@    5@@j$tyl'+Z0U@@ @  \@  d@@ @  q\@  _@g_A  :  Fg`A  :  J@@j$cty',Z@  @ggB  j  vghB  j  z@@j j@)C@@G@@AB@IE@@AC@>D@@'F@@ABDGA  ,  ݔj1g|B  j  }g}B  j  @A*BYj0@@ABCF  ,  ݈j<gB  j  rf@@4Abj9	FA  ,  ݄jBgA  :  MgA  :  f@A;BijA "@ @ABCE  ,  tjMgA  :  VgA  :  b@@V@@]@  V@@]@  @]@  OC}jUF@  ,  `j\gA  :  B@@TAjYE  ,  ,jaCYAAX@j]@@@ABB	  ,  jhgL    gL    "@AA@jfje@@  ,  jmgL    	gL    !@\@   ȐB!p1\@  @gL    gL    @@j"tl2UV>@@\@  E]@  @@\@  \@  @gL    gL     @@jj@C@@A(3A@@B@@AB@VB@@AC@@B@C@  ,  jgL    gL    @@VZ@@^@  BVV@@^@  A@^@  @ C8jD@  ,  jF@A:jCA  ,  jA@?j@@A@A  ,  jhH  ;  ihH  ;  ~@AA@jj@@  ,  ܼjhH  ;  phH  ;  }@!\@  DS!m-8\@  R@hH  ;  \hH  ;  ]@@j!v.:\@  S@hH  ;  _h H  ;  `@@j"ty/V@@\@  \@  T@h+H  ;  bh,H  ;  d@@jj߰@#D@@A(Z0A@@BB@@C@@AC@VB@@AC@@B@D@  ,  ܘj=@IA1jDA  ,  |jPAM@j@@A@A  ,  `jhH`  U  fhI`  U  @A5Ctype.conflicts.(fun)A@jj@@  ,  LkhN`  U  W-{@@-zAj<ShU^    -@$free?S@-hZ^    '@@k%bound@S@h`^    (ha^    -@@k%boundA[Cc@@ @  9Z@  !@@ @  .Z@  @hr_  0  6hs_  0  ;@@k+k&@CA@@&B@@AB@c$B@@A@CA  ,  Hk8h_  0  >h_  0  Q@A-B6k7@B@B
  ,  0kAh_  0  2-@@-@=k>B@  ,  kEh`  U  zh`  U  @c-@@Z@  |LAI!tBOc@@ @  ]@h`  U  kh`  U  l@@kXkS@
A@@A@DC@@cOB@@AB@B@  ,   kah`  U  ph`  U  @@d@k_A@  ,  kfh    -@A-A@kckb@@  ,  kj@-AjSh    -@-cleanup_scopefS@-h    @@k~۠SgS@h    h    @@kܠ%fixedhS@h    h    @@kݠ'univarsiS@h    h    @@kޠ#schjS@h    h    @@kߠ'univarsk[àc@@ @  (Z@  @@ @  Z@  @h     &h     -@@k(copy_varl@c@@ @  8Z@  .d@@ @  QZ@  /@ @  0Z@  -@i  I  Oi  I  W@@k$varsp[d@@ @  Z@  @@ @  Z@  @i    i    @@k%pairsq_c@@ @  Z@  ܠd@@ @  Z@  ߠg
hd @  @@ @  Z@  @ @  Z@  @ @  Z@  @@ @  Z@  @iD    iE    @@k"tytW@@ @  FZ@  @iP  [  aiQ  [  c@@l	l@E@@dG@@ABC@@D@@CI@@ABA@@J@@AFB@@^H@@ABCD@XE@@ATG@@BTF@@dB@@AdC@@dD@@ABC@J@  ,  l,iw    ix    @e@@Y@  Z@  .Bl1-J@  ,  l8i    i    @A.A@l6l5@@  ,  ۴l=.@@.Al95JA  ,  ۬lBi  [  fi  [  @A.ƐFlA=984@1.BCD,@I  ,  یlMi  [  i  [  @@X@@[@  lX@@[@  k@[@  j.ڐAlUO@  ,  `l\i  [  ].@@.AlYI@  ,  Tl`i  E  G.@@.Al]IA  ,  Plfi    i    A@A.Clea]@\@AY%CDP@H  ,  @lqi    i    4@A:Ctype.instance_poly'.(fun)A@lplo@@  ,  ,lwi    .@@.A
ltHA  ,  (l}i    i    @A/Bl|xto@l@ABCg@G  ,  li    /@@/Al	G@  ,  li  I  Xi    AA=Ctype.instance_poly'.copy_varA@ll@@  ,  li  I  K/@@/A&l@@A+BCz@FA  ,  li     0i     E@A/ B1l@@AC@E  ,  li     "/*@@/)@9lE@  ,  li    @Z@  | BD!&@"tyn@+j  I  Z@@ll@6s-B@@AA@@B@ED@@AeB@@eyC@@AB@B@  ,  ڴl@9AlB@  ,  ڠlʰj  t  j  t  @@>A$nameooew@@ @  ?@@ @  >@j%  t  j&  t  @@llٰ@$@AC@@$@AB#@C@  ,  ڔlj0  t  j1  t  @AYA@ll@@  ,  ڈlj5  t  @@]AlC@  ,  ڀlj9  t  $@@aA#lC@  ,  (lj=  ]  af@@e@Dl@7@A6@A@  ,   ljC    )jD    3@AA@ll@@  ,  ljH    ,@AA@ll@@  ,  m	@@!ur&Z@  @jR    "jS    #@@m!vs#Z@  @jZ    $j[    %@@mm@B@@A
A@@B@@B@  ,  |mje  +  A/@A9Ctype.instance_poly.(fun)A@mm@@  ,  `mjj  +  -/@@/Al^Ujs    /@leԠU@@ @  T@j{    j|    A@m4U%U Y@  Z@j    @@m:%fixedU@j    j    @@mA'univarsU@j    j    $@@mH#schU@j    %j    (@@mOmJ@*D@@AC@@#E@@ABA@@B@@AC@UB@@A@E@  ,  Xm^j    .@@/A;m[@BC	@D@  ,  Hme@/AAUR@
@mimd@@AE@@@ABC@E@  ,  0mqR@/@PmlD@  ,  msj  W  [j  W  @@Z@V-cleanup_scopeY:@@ @  @j  +  Fj  +  S@@mm|@
A@@A@ND@@AUB@@WC@@ABDF@@ME@@AC@A@  ,  mj    0 @A:Ctype.instance_label.(fun)A@mm@@  ,  ظmj    0%@@0$@lUJj    0+@%fixedUJ@00j    @@m#lblUG@j    j    @@mm@B@@AA@@B@YC@@AUD@@eB@@AB@B@  ,  ؤmk  %  )k  %  ?@A(A@mm@@  ,  ؔm@*A)%scopeY@@ @  @k    k    @@m$vars]f@@ @  k@@ @  j[@  @k!    k"    @@m&ty_argY@@ @  l[@  @k-    k.    @@m&ty_resY@@ @  [@  @k9    k:    @@mm@6A@@AC@@D@@A1B@@BC@YC@@AcE@@BVID@@`F@@eB@@ABC@DA  ,  ؐn	kT    kU    !@AzDPn@@AB@C  ,  dnk^    \@@AXnC@  ,  @nkb    kc    @>[@  D_n@7.D@@A.@B(@D@  ,  n%kp    @@Ahn"	D@  ,  רn)kt  :  Dku  :  v@@Ao"tyfe@@ @  3@k    .k    0@@n8"tlCfr@@ @  5@@ @  4@k    2k    4@@nFnA@7/E+@AW@F@@"G@@ABCU@G@  ,  <nRk    k    @f:@@ @  "ǐAnU@g@Aa@C@  ,   n^k    @@@n[A@  ,  nbk    k    @UY@  H0Bm$_envU@k    k    @@ns$_ty1U@k    k    @@nz$_ty2U@k    k    @@nn|@C@@AB@@A@@AB@@C@  ,  n(@1@!n	C@  ,  nk  >  B1-@-S@@[@  ![@  %12AmUk    1D@#envU@1Ik    @@n%levelU@k    k    @@n $privU@l     l    @@n&abbrevU@l    l    @@n"tyU@l    l    @@n&paramsU@l    l    @@n$argsU@l    l    @@n$bodyU@l#    l$    @@n)old_levell@@ @  Z@  @l/  K  Ql0  K  Z@@n%body0g@@ @  Z@  @l;    l<    @@n+undo_abbrev@i@@ @  .Z@  +i@@ @  3Z@  ,@ @  -Z@  @lP    lQ    @@o		'params'_3Z@@ @  0@@ @  /Z@  
@l`    &la    -@@o%body'Z@@ @  1Z@  @ll    /lm    4@@o%o @8>L@@AtE@@aB@@AB[A@@M@@ALJ@@H@@'8O@@ABCDG@@bI@@AxC@@8N@@ABF@@,:P@@AD@@UK@@ABCE@jC@@lB@@AB[dG@@jD@@ACYH@@h	F@@AhiE@@VI@@ABD@P@  ,  o[l  *  .l  *  <@h@@Z@  [@  2Ao`@P@  ,  og2@@2AocCP@  ,  ojl  
  2@@2
AogGP@  ,  ֠onl    l    @@2AolLEDB@A@ABC=<6@21BCD/@R@  ,  ֌ozl    l    @h@@Y@  Z@  2!CoR@  ,  |ol    l    @@V@VOVX@  @[@  @[@  2-AoT@  ,  Xol    l    @V24Co&R@  ,  ,ol    2:@@29Ao*N@  ,   ol  c  vl  c  ~@A2>A@oo@@  ,  ol  c  e2C@@2BAo3N@  ,  ol    8l    _@@ @  Z@  .2NCo@@A@B@@A@BC}{@z@AutBCDr@K@  ,  om    !2^@@2]A)oK@  ,  om    2b@@2aA-oK@  ,  oŰm    m    @Z@  2iB5oǰ@@@ABCD@J@  ,  ոo@2qA<oJ@  ,  հoհm     m!    @A1Ctype.subst.(fun)A@oo@@  ,  դo@2yADoJ@  ,  Մoݰm(    m)    @AA@oo@@  ,  pom-    m.    @i?@@[@  \@  2EY$pathh@@ @  @mA    2mB    6@@o
"tlhh4@@ @  !@@ @   @mO    8mP    :@@p"tyW&Y@  @mW     mX    F@@p&abbrevW@\@  :@m_  J  Vm`  J  \@@p
p@9?L@@AO@@ABlC@6N@@AB@.M@@"K@ABCD@O@  ,  4p-KO@@2ABp)OA  ,  0p2m}  J  _m~  J  |@A2ӐCIp1BCD@N  ,  p=m  J  R`@@2ARp:	N@  ,  ԜpAm    2@@2Ap>wJA  ,  ԘpGm    m    @A2BpF@@ABCD@I
  ,  ԄpSm    2@@2ApP
I@  ,  xpWm  o  q2@@2ApTI@  ,  lp[m  K  M2@@2ApX0(@$@AB!CD@H@  ,  hpdm    7m    I@/,@@[@  [@  3AphH@  ,  dpo@3
ApjH@  ,  Xpqm    m    @'@@Z@  3ApuI@  ,  Dp|m    !m    1@
\@  3 Ap~&H@  ,  0pm    3&@@3%@p*H@  ,  pm    @@@p@-A@@A@C@@B@@AB@A@  ,  pm    @@@ p@.
A@@A@@A@  ,  pm    3D@/d@@[@  [@  3IAoWm  F  F3R@#envW@3Wm  F  S@@p&paramsW@n  F  Tn  F  Z@@p$bodyW@n  F  [n	  F  _@@p$argsW@n  F  `n  F  d@@ppð@A@@AB@@#D@@A)ADE@@!C@@ABC@lqB@@AljC@@X*D@@AB@E@  ,  p?@3A7pE@  ,  pްn)  m  qn*  m  @W3H>pް@@A@BC@H@  ,  Ӥpn4  m  n5  m  @A3A@pp@@  ,  lpn9  g  i3@@3@Kp
D@  ,  Lpn=  ¾  n>  ¾  @jO@@Y@  iZ@  a4Ap;WnJ  K  K4	@#envW@4nO  K  c@@qq@	A@@A@WB@@A@A@  ,  8qnY  f  4@@4Aq	A@  ,   qn]  f  h4@@4@q
A@  ,  qnaG  Ύ  Δ4&@W[Y@  4(Bp_Wnm  K  K42@$kindW@47nr  K  e@@q*3find_type_expansionW@nx  K  fny  K  y@@q1#envW@n  K  zn  K  }@@q8"tyW@n  K  ~n  K  ƀ@@q?q:@B@@AC@@#D@@AA@@BC@lC@@AlD@@nNB@@AWL@@BCj:G@@jhF@@Am5E@@iIH@@ABXK@@^J@@_kI@@ABCD@D@  ,  q`J@4mADq[!D@  ,  qbnC  G  SnC  G  i@j@@\@  ]@  4xB[$pathi@@ @  @n  ƫ  n  ƫ  @@q$argsii@@ @  @@ @  @n  ƫ  n  ƫ  @@q&abbrev"8#refj@@ @  @@ @  @n  ƫ  n  ƫ  @@q%level@@ @  @n  ƫ  n  ƫ  @@q %scope_@@ @  @n  ƫ  n  ƫ  @@q!-lookup_abbrevkLj@@ @  @@ @  [@  @o
    o    @@q"&paramsX2@o6    o6    @@q&$bodyX/@o6    o6    @@q'"lvX0@o6    o 6    @@q(#ty']@@ @  ]@  K@o+9  v  ̆o,9  v  ̉@@q)%scopeXC@@ @  ]@  @o8A    o9A    
@@q*q@;NL;OE@@AlF@@}G@@A5O@@@ABC@@AeI@@TK@@A7N@@GP@@ABCH@@*RgJ@@A@;Q@@A#valLM@@BCDE@R@  ,  rocB  $  0odB  $  E@ku@@\@  ]@  5.Br1R@  ,  r$ooD  k  z@@53Ar!5RA  ,  r*ouA    
ovA     @A5:Br)=0'@$@A#CDE@Q
  ,  Ҵr6oA    @@5EAr3
Q@  ,  Ҕr:o<    o<    #@c]@  5MAr<QKIBG@@*KQ@@ABCI@@9@ABDE@Q@  ,  ҄rN@5[ArI
Q@  ,  `rPo;  ̞  ̮o;  ̞  @w5aHrPdE@T@  ,  0rYo;  ̞  o;  ̞  @A5iA@rWrV@@  ,  r^o9  v  ̂;@@5mAr[P@  ,  rbo5  ˨  o5  ˨  @A5rA@r`r_@@  ,  Ѥrgo5  ˨  ˹@@5vA%path'f!t@@ @  ]@  @o3  *  :o3  *  ?@@ry%rt@@A<@#exnMM@@ABC?@@AB{@N@@Ay@B@ABCDA@N@  ,  Ѡro4  k  ˔o4  k  ˧@1S@@]@  ]@  5A+rN@  ,  ќr@5A-rN@  ,  єro4  k  zo4  k  ˎ@k@@\@  
]@  5B9r)N@  ,  рro4  k  wB@@5A=r-NA  ,  |ro3  *  Bo3  *  g@A5C=r5m.k@BCDj@M  ,  \rp 3  *  6S@@5AFr	M@  ,  4rp0  ʍ  ʝp0  ʍ  ʹ@Y.5ʐBMrE@BCDz@P@  ,  rİp0  ʍ  ʗ@@5AUrL@  ,  rȰp.  o  yp.  o  |@@5A\#ty'k)type_expr@@ @  (@p   g  tp!  g  w@@r##ty'j@@ @  \@  @p,,    +p-,    .@@r$r'e@N M@@ABCD@NA  ,  rp<,    1p=,    9@A6A)r7u@@ABCD@M
  ,  rpH,    '5@@6A3r
M@  ,  spL*    pM*    
@@6A8r
@+zEN@@ABC@@0|GO@@ABCDE@O@  ,  аsp^%  4  @p_%  4  V@lp@@[@  \@  6)BQs(Q@  ,  Аspj$     *W@@6.AUs,M@  ,  ts#pn"    po"    @@63AZs!5/@+HN@@ABC$@!@0JO@@AB:CDE@O@  ,  Ls5p  &  4p  &  N@l@@[@  y\@  d]@  \6MCus<LQ@  ,  $sCp    p#    @@6SAzsAQM@  ,  sHp    @@6WA~sEUM@  ,  sLp  +  =p  +  a@V@@ @  @@ @  6eCsT@e@AcCD@K@  ,  s_p  +  1pE  {  ΄@@6oAs]	KA  ,  sfp    p    '@A6vCse)@(@l@ABeCD'@J
  ,  ϼsrp    @@6Aso
J@  ,  4svp  ƃ  ƅp  ƃ  ƙ@l@@Y@  Z@  6Ads{AD@  ,  $s6@@6@gs~DD@  ,  spK    6@@6@rYpJ    6@#envY@6pJ    @@s,"tyY@pJ    pJ    @@s-s@B@@AA@@B@Z0B@@A@B@  ,  spQ  ρ  Ϥ6@YY@  6BrYʐpN  =  =6@#envY@6pN  =  U@@s/"tyY@qN  =  VqN  =  X@@s0s@B@@A,1QC@@A@@AB@oiC@@pB@@ABZE@@kD@@AC@C@  ,  s+@6A%sC@  ,  tsаqP  a  eqP  a  π@Y6B,sа@@A@B@F@  ,  dsڰq%P  a  w
@dX@@Z@  Z@  [@  6A<sF@  ,  Lsq2O  [  ]7@@7@@sB@  ,  ,sq6\  а  жq7\  а  @mH@@Z@  A[@  97As:YqET    7@#envY@7!qJT    @@t2"tyY@qPT    qQT    @@t	3$snap@@ @  Z@  @q\U    q]U     @@t4t@B@@,TD@@ABC@@1VE@@A A@@BC@oC@@Aq$B@@ZaD@@AB@E@  ,  t*qu[  Д  Кqv[  Д  Ю@m@@Z@  .[@  (7RA?t/E@  ,  t67W@@7VABt2"E@  ,  t9qX  \  bqX  \  v@m@@Z@  [@  7aANt>.)@%@AC$@D@  ,  tHqY  x  Ѓ@@7iAUtED@  ,  ͤtLqV    =qV    A@@7nAZtJ@:@A6
B0@G@  ,  ͠tTqV    %qV    ;@l<@@Z@  7zBgtW
G@  ,  ̈́t^qV    7@@7Akt[CA  ,  ̀tdqU    qU    @A7Artc@S@AJ@BI@B  ,  ltnqU    7@@7@ztkB@  ,  \trqf    7@39@@[@  [@  7AsZhqb  o  o7@#envZh@7qb  o  ц@@t6"tyZi@qb  o  чqb  o  щ@@t7"tylw@@ @  }Z@  s@qc  ь  ђqc  ь  є@@t8t@>SWD@@AB@@CA@@AB@pIB@@AZD@@lC@@AB@D@  ,  Xt:@7A2tD@  ,  Ltqe  ѷ  qe  ѷ  @l@@[@  [@  \@  7ސB@t D@  ,  8tre  ѷ  @@7ADt$D@  ,  trd  Ѣ  Ѥ7@@7AHt@&@A$@B!@CA  ,  tɰrc  ь  їrc  ь  ў@A7ARtȰ,@B+@B
  ,  tҰrc  ь  ю7@@7@YtB@  ,  tְr!m  Қ  8@3@@[@  :[@  >8	At%Zr.i  +  +8@#env	Z@8r3i  +  B@@t:"ty	Z@r9i  +  Cr:i  +  E@@t;$snap	@@ @  Z@  @rEj  H  NrFj  H  R@@t<t@B@@-t[D@@ABC@@2u]E@@A A@@BC@pC@@Ar
B@@ZD@@AB@E@  ,  ur^m  Қ  Ҵr_m  Қ  @np@@Z@  1[@  )8GA?uE@  ,  ̴urjm  Қ  Ҟrkm  Қ  Ҳ@n|@@Z@  [@  8SAKu$+E@  ,  ̠u+8X@@8WANu'.E@  ,  xu.ryk  j  przk  j  ҆@Z8]BUu.@5@A1@-@AB,@G@  ,  \u9rk  j  l8g@@8fA]u6CA  ,  Xu?rj  H  Urj  H  f@A8mAdu>@E@A<@B;@B  ,  DuIrj  H  J8w@@8v@luFB@  ,  uMr{  >  ^8@A8A@uJuI@@  ,  uQr{  >  N8@@8AtZ搰rv    8@#env	Z@8rv    @@u`C"ty	Z@rv    rv    @@ugD!e	
rcr`@@ @  @@ @  @r{  >  Ir{  >  J@@uuEup@E@@A!B@@B-_C@@2`D@@A"A@@BC@q'C@@rB@@ABqD@@m{E@@A[CG@@[yF@@ABC@E@  ,  urz  !  6rz  !  =@@8A?u@@A@@AB@C@  ,  ˸urx    rx    @[#Y@  Y@  8ѐCMu@*@A#@B"@F@  ,  ˔urw    8@@8@TuB@  ,  pur  Բ  8@@8At['r~  ԙ  ԙ8@#env	['@8s ~  ԙ  Ԭ@@uG"ty	[(@s~  ԙ  ԭs~  ԙ  ԯ@@uHu@B@@A.4aC@@A@@AB@qmB@@AmC@@B[E@@[D@@AC@C@  ,  PuѰs  Բ  Ըs  Բ  @[DY@  kY@  W9C-u԰@@A@B@F@  ,  ,uްs)  Բ  Դ9@@9@4uB@  ,  us-    9"@@9!@u/[s3    9(@#env	[@9-s8    @@uS"ty	[@s>    s?    @@uTu@B@@AA@@B@\B@@A@B@  ,  v sK    sL    @o]@@Z@  <[@  69LAuW[)sZ  ?  ?9U@#env	![)@9Zs_  ?  V@@vV"ty	"[*@se  ?  Wsf  ?  Y@@vW$snap	#@@ @  Z@  @sq  \  bsr  \  f@@v*Xv%@B@@.lD@@ABC@@A@@AC@qC@@As6B@@[pD@@AB@D@  ,  v<<9@@9A3v8D@  ,  tv?s  ~  ٧s  ~  ٫@@9A8v=@@AB@G@  ,  pvGs  ~  ًs  ~  ٥@n/@@Z@  9BEvJ
G@  ,  TvQs  ~  ـ9@@9AIvNCA  ,  PvWs  \  is  \  z@A9APvV@1@A+@B*@B  ,  <vas  \  ^9@@9@Xv^B@  ,  ,ves  q  z9@5,@@[@  [@  9Au[rs    9@#env	&[r@9s    @@vzZ"ty	'[s@s    s    @@v["ty	(nj@@ @  ^Z@  T@s    s    @@v\v@@FoD@@AB@@CA@@AB@r<B@@A[D@@nC@@AB@D@  ,  (v:@9A2vD@  ,  vs  @  Vs  @  p@n@@[@  [@  \@  9B@v D@  ,  vs  @  Q@@9ADv$D@  ,  vs  +  -9@@9AHv@&@A$@B!@CA  ,  vt     t    '@A:ARv,@B+@B
  ,  ɴvŰt    :@@:@YvB@  ,  ɜvɰt     :@5@@[@  [@  : Av [t!  ڏ  ڏ:(@#env	+[@:-t&  ڏ  ڪ@@v^"ty	,[@t,  ڏ  ګt-  ڏ  ڭ@@v_$snap	-@@ @  Z@  @t8  ڰ  ڶt9  ڰ  ں@@v`v@B@@/gsD@@ABC@@4huE@@A A@@BC@rC@@At B@@\D@@AB@E@  ,  ɘwtQ    
tR    @pc@@Z@  [@  :^A?wE@  ,  Ʉw:c@@:bABw"E@  ,  \wt`    ta    @[:hBIw@)@A%@!@AB @G@  ,  @w tk    :r@@:qAQwCA  ,  <w&tq  ڰ  ڽtr  ڰ  @A:xAXw%@9@A0@B/@B  ,  (w0t{  ڰ  ڲ:@@:@`w-B@  ,  w4t  R  ۙ:@@:Av\t  5  5:@#env	0\@:t  5  L@@wBb"ty	1\@t  5  Mt  5  O@@wIcwD@B@@A/vC@@A@@AB@rB@@AoFC@@B]D@@\AE@@AC@C@  ,  w[t  R  Xt  R  ۂ@\#Y@  WY@  C:C-w^@@A@B@F@  ,  wht  R  T:@@:@4weB@  ,  Ȩwlt  o  u:@@:Av\*t  g  g:@\'	4\'@t  g  xt  g  ܈@@w}e#env	5\%@t  g  ܉t  g  ܌@@wf"ty	6\'@t  g  ܍t  g  ܏@@wg"ty	7\.Z@  t@t  ܒ  ܘt  ܒ  ܚ@@wh"ty	:o|@@ @  =Z@  3@t    t    @@wkw@AYwF@@A)B@@B0C@@E D)A@@AC@sSC@@uB@@ABrE@@dI@@AqF@@]3M@@ABC]KL@@r3D@@ApG@@oH@@AB]zK@@]J@@ACD@F@  ,  dwǰu  7  Mu  7  e@A;%A@ww@@  ,  Xw̰u  7  [u  7  c@A;*A@ww@@  ,  LwѰu  7  =
@@;.Ag"fi	;p@@ @  Q@u&    u'    @@wl!v	<p@@ @  t@u0    u1    @@wmw@A|KAzJAyIAxGV@AT@&H@@ABU@T@L@@ABCQ@L@  ,  Dx uK    #uL    3@qc@@Z@  ®[@  ;dA7x!L@  ,  4xuW    +@Lh@@[@  [@  ¬\@  §;qADx.L@  ,  (x@;tAFx0L@  ,  ǘxuf    ;y@@;xAx@{@AzyBs@EA  ,  ǔx$uo    up    @A;Ax#@@AB~@D  ,  ǈx.uy    ;@@;Ax+D@  ,  Ǆx2u}  ޤ  ޭu~  ޤ  ޿@\Y@  ?Y@  Y@  /;Bx7@@AB@C@  ,  pxA@;Ax<C@  ,  <xCu  ޅ  ލu  ޅ  ޗ@q@@[@  !\@  ;Aߠ"ty	8p8@@ @  [@  v@u  ܺ  u  ܺ  @@x[i"ty	9pI@@ @  \@  @u  o  {u  o  }@@xgjxb@@0~E@@AB@5F@@AG%D@BC@G@  ,  0xw4u  ޙ  ޣ@@;A,xtG@  ,  x{u  U  ru  U  y@!\@  ;ܐA4x}@@0G@AB@BC@G@  ,  x@;A>x
G@  ,  xu  
  u  
  O@2;CEx,C@J@  ,  xu  
  <	@<^@  ;AOx
J@  ,  ưxu  T  \u  T  m@q@@[@  \@  <A[xF@  ,  Ɯxu  >  Fu  >  R@r@@[@  \@  <Agx"F@  ,  ƌx@@@<Ajx%F@  ,  dxv    v    @<Bqx@O@AB@H@  ,  Hxİv    N@@<!AxxDA  ,  Dxʰv  ܺ  v  ܺ  @A<(A^xC  ,  4xѰv  ܺ  [@@<.AcxC@  ,  (xհv   ܒ  ܔ<3@@<2@gxC@  ,  xٰv$    <=@@<<Ax,]ov*  )  )<C@#env	?]o@<Hv/  )  ?@@xo$path	@]l@v5  )  @v6  )  D@@xpx@B@@A1cC@@A@@AB@pB@@A@C@  ,  xvE    vF    @q4@@Z@  O @  I<dA*$body	A^L)type_expr@@ @  *Z@  @vZ  M  Yv[  M  ]@@yqy@BG@@H@@AB)@&@AC%@I@  ,  y#vh    @@<AyH@  ,  Űy!vl  M  dvm  M  @$listI^t)type_expr@@ @  )@@ @  (Z@  
1c@@ @  +Z@  @ @  Z@  '<Bfy<@S@AO@BN@F@  ,  ŐyFv  G  I<@@<@myCB@  ,  pyJv    <@@<Ax]v    <@#env	D]@<v    @@yXs$path	E]@v    v    @@y_tyZ@B@@A1C@@A@@AB@qYB@@A@C@  ,  <ykv    v    @@<A"yi@C'G@@A@@AB
@G@  ,  yvv    v    @q@@[@   @  <A5$body	Fq@@ @  æ@v  f  v  f  @@yuy@CDJCGICJH&@K@@AB7&C2@L@  ,  y%v    @@=AyK@  ,  Lyv    	v    @^@@ @  À=
B[y@H@AD@BC@F@  ,  ,yv    =@@=@byB@  ,  yv  n  = @@=Ay^w    =&@#env	I^@=+w    @@yw!p	J^@w    w
    @@yxy@B@@A2:C@@A@@AB@mB@@AmC@@B@C@  ,  yӰw  )  ]w  )  m@l@@Z@  9Z@  ă[@  ~=KA.$decl	K_'@@ @  "Z@  @w3    w4    @@yyy@G@@A(@%@AB$@G@  ,  ìyw>  )  -w?  )  <@b@@[@  L[@  Z\@  V=kA yG@  ,  äz-@@=oA#yGA  ,  àzwQ    wR    %@A=vBXz@E@AA@B@@F  ,  Àzw[    =@@=@`z
B@  ,  `zw_    =@@=Aym^we    =@!r	]^@=wj    @@z"!b	^]@wp    wq    @@z)z$@
A@@B@@AB@@B@  ,  Tz0w{    =@@=@z-	B@  ,  Dz4w&  e  i=@8@@[@  Ȗ[@  Ș[@  ȗ=Ay^w    =@#env	a^@=w    @@zN#ty0	b^@w    w    @@zU"ty	c^@w    w    @@z\/allow_recursive	d^@@ @  Ǌ[@  z@w    w    @@zh#old	es@@ @  [@  @w  Z  `w  Z  c@@zt#exn	fxk@@ @  i@w$  ;  Bw$  ;  E@@z~zy@'D@@A<C@@F@@ABE@@4A@@=B@@ABC@oC@@A^F@@B^D@@^E@@o]B@@ABC@F@  ,  @zw%  I  Mw%  I  c@s@@Z@  ȍ[@  ȁ>!Bcz#F@  ,  ,z>&@@>%Afz&F@  ,  zw#     $w#     :@^\>+Blz-+@)@AB'&C$@I@  ,  z@>2ArzI@  ,  zw     w     @t@@[@  4\@  &>=E~zI@  ,  ¤zx
!    @@>BAzI@  ,  zðx"    x"    @@>GAzI@  ,  |zȰx  w  y>L@@>KAzE@  ,  tz̰x  Z  \>P@@>OAzɰPN@BIHCF@D@  ,  4zӰx    >W@@>V@zа@U@APOBM@C@  ,  zڰx%+    >d@A>cA@zz@@  ,   zްx)+    >h@@>gAz;^x1(  t  t>p@&tr_exn	i^@>ux6(  t  @@z#env	j^@x<(  t  x=(  t  @@z"t1	k^@xC(  t  xD(  t  @@z"t2	l^@xJ(  t  xK(  t  @@{z@C@@3yE@@ABB@@A@@'D@@ABC@_FB@@A^D@@wzC@@AB@E@  ,  {xb*    xc*    @^>C<{@@AC@H@  ,  {!xl)    >@@>@C{D@  ,  {%xp.    )>@@>Az^xw-    >@#env	o^@>x|-    @@{4#ty0	p^@x-    x-    @@{;!t	q^@x-    x-    @@{B{=@C@@3D@@ABA@@B@@AC@_B@@A_C@@B@D@  ,  |{Rx.    x.    @t@@Z@  :[@  2>C5{W@@AB@G@  ,  `{ax.     >@@>@<{^C@  ,  @{ex]  c  s>@@>AzĠ#env	^@?xV  2  T@@{q!p	^@xV  2  UxV  2  V@@{x"ty	^@xV  2  WxV  2  Y@@{)allow_rec	_@@ @  ̇[@  w@xW  \  bxW  \  k@@{{@D@@A&C@@4E@@AB$B@@A@@AC@_B@@Ap,E@@B^F@@pgD@@tC@@ABC@E@  ,  {xZ    x[    X@u @@Z@  7[@  3??CF{" @BC@H@  ,  {x[    x[    U@@l/@@\@  1l+@@\@  0@\@  /?QEX{I@  ,  {yY    ?W@@?VA\{D@  ,  {ŰyW  \  ^?[@@?Z@_{°@:@A65B3@C@  ,  d{̰y    3?h@@?gA{.^jy}    ?p@&tr_exn	^j@?uy$}    @@{"t1	^e@y*}    y+}    @@{ "t2	^c@y1}    y2}    @@{à,univar_pairs	^a@y8}    y9}    @@{{@4fE@@AC@@BB@@&D@@AA@@BC@wB@@Ax{C@@_D@@AB@E@  ,  D|yP~    yQ~    @^E?C<|@@AC@H@  ,  $|yZ~    ?@@?@C|D@  ,  |y^    ?@A?A@||@@  ,  |A8Ctype.occur_univar.(fun)A@||@@  ,  |ye  G  Zyf    @AA@||@@  ,  |yj  G  I?@@?A{^]yu    ?@n	t֠^X@@ @  .@y}    y~    A@|6Ơ^d	^_Z@  4@y    @@|<Ǡ#env	^\@y    y    !@@|Cɠ"ty	^Z@y    "y    $@@|Jʠ'visited	uh'TypeMap!th@@Z@  Z@  Ѡ@@ @  џ[@  d@@ @  i[@  `@y  '  -y  '  4@@|fˠ)occur_rec	@[@  @l@@ @  B[@  u@@ @  [@  @ @  @ @  \@  @y  L  Vy  L  _@@|~̠*occur_desc	@*[@  @`@@ @  Թ[@  [@  @ @  @ @  \@  @y  K  Qy  K  [@@||@kC@@A\B@@BcD@@G@@A8F@@B\A@@WE@@ACD@xB@@AtC@@B@G@  ,  |y  L  N@I@@@HA|@@ABC@E@  ,  |y  '  7y  '  H@A@QA@||@@  ,  |y  '  )@V@@@UA|#!
@BC@D@  ,  |z    @@@\A|*(@"@AB@C@  ,  ||@@aA{	^@
@||@3@D@@AB4C*@D@  ,  d|@@l@|C@  ,  8|ϰz  e  kz  e  @@@|Ͱ@:E	A@@A@rC@@B@@AB@A@  ,   |ܰz'    z(    @@@|ڰ@:R	A@@A@B@@A@A@  ,  |z2    -z3    >@@}[@  {[@  A[@  @]@  N=Ctype.occur_univar.occur_descAԠ%bound	Z@  @zD  K  \zE  K  a@@|Ҡ"ty	x[@  T@zM  K  bzN  K  d@@}}@FC@@AB@@A@@AB@E@@AD@@xB@@AuC@@F@@ABC@@@@ @@ABD@  ,  }zi    zj    A@@0A.}C@  ,  }#zn  S  ]zo  S  p@@5A6"ty	u`@@ @  m@zz    z{    @@}3Ԡ#tyl	>um@@ @  o@@ @  n@z    z    @@}Aՠ%bound	]@  @z    z    @@}J}EDFC@'ED@ D@@ABCE;FA  ,  }Wz    z    O@AiC4}VURCOEE
  ,  }`z    6z    I@pa@@]@  ]@  @@^@  ^@  '^@  BK}mF@  ,  }tz    Q@@AO}qE@  ,  }xz    z    @AA@}v}u@@  ,  |}}z    @@A}zyC@  ,  p}z    z    @`@@]@  Ԥ]@  ^@  ԴB}C@  ,  T}z    @@A}C@  ,  H}z  q  z  q  @@A}@GOE@A@!p	D@@A@BCE@  ,  $}z    z    @@[@  @^@  !Au@@ @  ԋ@z    z    @@}נ"tl	uȠu@@ @  ԍ@@ @  Ԍ@{    {    @@}}/@69G@@AB,@F@@@ABCH@  ,  }ϰ{    {    @@A&}G@  ,  }԰{    @@A*}G@  ,  }ذ{#    {$    @g[@  qC4"td	c'@@ @  N]@  >@{3    {4    @@}}W@BQ@K@@A'&BCK@  ,  }{?    {@  ]  @A	#Ctype.occur_univar.occur_desc.(fun)A@}}@@  ,  }"@	A}KA  ,  }{I    {J    @ABV}l@h@A;:BCJ  ,  p~	{T    {U    @@A`~
F@  ,   ~{Y  g  m@@@~@@A@BB@  ,  ~{`  ]  r{a  ]  @@!A;!t	\@  ^@{i    {j    @@~"ڠ!v	wG(Variance!t@@\@  \@  Ձ@{y    {z    @@~2~-@B@@AA@@B@ED@@AB@@C@@AB@B@  ,  ~?{    P{    [@a@@^@  ծ^@  _@  վSB4{(Variance~IB@  ,  ~P{    L@@[A~M B@  ,  ~T{    ={    F@w@@]@  գ^@  ՚fB~Y,B@  ,  t~`@iA~[.B@  ,  h~b{    M@@m@L~_2B@  ,  8~f{  /  7{  /  J@@<Ctype.occur_univar.occur_recAL%bound	@{  L  `{  L  e@@~tΠ"ty	[@  @{  L  f{  L  h@@~|Ϡ"ty	ve@@ @  \@  @{  k  s{  k  u@@~~@B@@A6D@@CA@@AB@YH@@A`G@@zwE@@AvF@@RI@@ABC@ C@@:@@@ABD@  ,  ,~{    {    -@TPZ@  @@]@  ]@  DCD~&D@  ,  ~{    J@@IAH~*D@  ,  ~{    |     @[@  F[@  ;RBS&bound'	eZ@  <@|    |
    @@~~@=@AH@@;@AB8.H@  ,  ~@cA~H@  ,  ~ΰ|  p  |  p  @|Z@  Ӂ@@\@  Ӛ\@  ӰpC~H@  ,  ~ܰ|'  p  |(  p  @5wB%~I@  ,  p~|.  8  j|/    @@}A*~!H@  ,  d~|3  8  G|4  8  d@bE@@\@  o\@  Ӆ]@  B8~/H@  ,  H~|A  8  @@@A<~3HA  ,  D~|G    |H    4@AB~@x@At@BqgG  ,  |Q    @@AC@  ,   
|U    |V    @xg@@[@  /\@  )AC@  ,  |a    |b    @@AC@  ,  |f    |g    @x~@@[@  \@  A %C@  ,  '|r    @@A$)C@  ,  +|v    |w    @x@@[@  \@  ːA05C@  ,  7|    @@A49CA  ,  =|  k  x|  k  @AאA<A@BB
  ,  F|  k  o@@@CB@  ,  J|    B@@BA~aT|    B@#env	aT@B|    @@Xݠ"ty	aQ@|    |    @@_Z@B@@A7C@@<D@@AA@@BC@|kB@@AaC@@B@D@  ,  Tp|    |    @x@@Z@  z[@  lCC.u@@A@B@F@  ,  4|    C'@@C&@5|B@  ,  |  <  }C1@@C0A~ao|    C7@#env	ao@C<|    6@@"ty	al@|    7|    9@@@B@@A8
C@@=
D@@AA@@BC@|B@@AaC@@B@D@  ,  |  <  B|  <  d@y@@Z@  [@  ׸C]C.@@A@B@F@  ,  }  <  >Cf@@Ce@5B@  ,  }    Cp@ACoA@@@  ,  }    Ct@@CsA&a}    C|@&tr_exn	a@C}    @@#env	a@}    }    @@"ty	a@}%    }&    @@!e	|ڠ|@@ @  @@ @  @}3    }4    @@@F@@A"B@@B8cD@@=cE@@A/C@@$A@@ABC@|B@@Ab4D@@|fC@@AB@F@  ,  h}N    }O    @aCCE@@AB@G@  ,  H
}X    C@@C@L
C@  ,  $}\  F  s}]  F  {@d)@@\@  ؘ\@  ؔCѐA}!s	a@}k  F  \}l  F  ]@@$!t	a@}r  F  _}s  F  `@@+&@=	A@@AB@@C@@AB@x%B@@A@D@  ,  7}  F  g}  F  }@@CA5CA  ,  >CAC@9@@@AB@B  ,  D}  DN@@DMAa}    DV@,univar_pairs	a@D[}    @@T'univars	a@}    }    @@[&insert	@l@@ @  I[@  @aӠxe@@ @  %\@  @ @   @ @  \@  @@ @  [@  ՠ{xw@@ @  Lb@ @  K[@  @@ @  [@  @ @  [@  1[@  @ @  [@  @ @  [@  @}    }    @@!s
l@@ @  ٝ[@  v@}  }  @@@NC@@D@@AB^B@@ZA@@AC@bQC@@xB@@AB@DA  ,  ~  ~  @ADCs@@AB@C  ,  ~  D@@DA{C@  ,  İ~    ~  AA>Ctype.get_univar_family.insertA@@@  ,  ʰ~    D@@DAǰ@$@A"@B!@B@  ,  Ѱ~    ~    @@DAB@  ,  pְ~!    D@@D@B@  ,  Xڰ~%  @@A@!s	@~.    @@@#cl2	C@@A>]
A@@B@@AB@bC@@xB@@AB@CB  ,  L~C q ~~D q @@4A!#cl1	@~K    ~L    @@|[@  P[@  @@ @  @~W    ~X   	@@@D@@A,@B)'C%@D@  ,  8~b U _~c U p@@SA
D@  ,  0~g 
 ~h 
 O@z@@\@  7]@  ^B+!D@  ,   (~s 
 $~t 
 K@A	$Ctype.get_univar_family.insert.(fun)A@'&@@  ,  .~y 
 6@@iA5+ D<  ,  3oAl@V.@IGBE@BA  ,  8~ 
 ?~ 
 H@eP@@^@  (^@  $AH"t1
 @~ 
 *~ 
 ,@@JE@>
A@@
B@@AB@yCB@@AtC@@B@C@  ,  V~ 
 3~ 
 J@@.ATBA  ,  ]5A2@bX@@A@A  ,  b~  Er@@EqAb~ / /E}@#env
b@E~ / E@@u,univar_pairs
b@~ / F~ / R@@|"vl
by@~ / S~ / U@@"ty
	bs@~ / V~ / X@@&family

m@@ @   [@  @~ [ a~ [ g@@'visited
{/m@@ @  A[@  ;@@ @  @[@  7@~  ~  @@%occur
@r(@@ @  s[@  E|e@@ @  ډ[@  F@ @  G\@  D@    @@@SD@@A9E@@G@@ADA@@BCSC@@5F@@APB@@BD@cAD@@A}B@@yC@@AB@G@  ,  ԰  E@@EAqѰ@@ABC@F@  ,  |ܰ'  (  @AEA@@@  ,  p,  E@@EA}ް
@@AC@EA  ,  d5 [ j6 [ @AEB@1@A,@B+
C&@D  ,  P@ [ ]F@@F@	D@  ,  (D  E  @@:Ctype.univars_escape.occurA!t

S@M  N  @@!t
y@@ @  X\@  N@Y  Z  @@
@KC@@ABA@@B@D@@AE@@}B@@AzC@@F@@ABC@~@@@AC@  ,  (s  t  @@/A0!t
zd@@ @  @~ P _ P `@@7"tl
#Bzq@@ @  @@ @  @ P b P d@@E@3E2@D@@AB1'E@  ,  M i  i @@TA%KE@  ,  R i v i @{@@\@  []@  _B1WE@  ,  ^ i  i @A	 Ctype.univars_escape.occur.(fun)A@]\@@  ,  d i s<@@jA;a!E@  ,  h    @AoA@fe@@  ,  m  @@sArj]C@  ,  q    @{@@\@  ۅ]@  w~B~viC@  ,  }  @@AzmC@  ,  t  5  7@@A@L=Eu@A!p
D@@w@ABtjE@  ,  P T ` T r@@A
z@@ @  @ 8 I 8 J@@ "tl
zz@@ @  @@ @  @ 8 L 8 N@@@'@; G@@AB'@@F@@ABCG@  ,       7@[@  ڈ[@  C,"td
h@@ @  ۵]@  ۥ@ j z j |@@ưGC@@AK@@@ABCK@  ,  Ӱ    @AuA@@@  ,  "@A
KA  ,  ܰ' j ( j @ABM۰\X1CJ
  ,  0 V `1 s @@AUF@  ,  `5 8 >@@A@@AB@  ,  T;   <  6@oL@@\@  ڜ^@  ڭBB@  ,  0G  	H  @@AB@  ,  $L  M  @@AB@  ,  Q  R  @|i@@[@  چ\@  lB$B@  ,   ]  @@A(BA  ,  c  d  @AA@@AA
  ,  !l  %@@'@%A@  ,  %p  
q  @@Al!t
~\@  @y  z  @@2!v
@@\@  
\@  @    @@>9@B@@AA@@B@B@@A@B@  ,  G    @f@@^@  ^@  _@  B,(VarianceQB@  ,  X  3@@@2UB@  ,  x\ i  i @gt@@^@  I^@  EA<!t
{U@@\@  F\@  @ i  i @@sn@A@@A@C@@{jB@@AB@B@  ,  h| i  i @@@zA@  ,  T  G@AGA@~}@@  ,  LA6Ctype.enter_poly.(fun)A@@@  ,  0    @AA@@@  ,    G@@GA d{  G@#env
d{@G  $@@,univar_pairs
dx@  %  1@@"t1
dS@  2  4@@#tl1
dQ@  5  8@@	"t2
dI@	  9
  ;@@
#tl2
dG@  <  ?@@!f
d?@  @  A@@+old_univars
 dZ@  @  D J! D U@@
-known_univars
!p4@@ @  e[@  (@, i o- i |@@#tl1
%t{@@ @  ݗ[@  @@ @  ݌[@  y@>  ?  @@#tl2
&t!{@@ @  ݷ[@  ݟ@@ @  ݬ[@  z@P  Q  @@	#cl1
)t3{@@ @  I[@  4}teY@  A@@ @  B\@  :@@ @  ?[@  5@ @  6[@  @@ @  +[@  @v  w  !@@/#cl2
*tY|"@@ @  {[@  f}ؠt۠&Y@  s@@ @  t\@  l@@ @  q[@  g@ @  h[@  P@@ @  ][@  @ H N H Q@@TO@QL@@A,M@@G@@ABA@@I@@AH@@E@@ABCC@@JD@@AtKB@@F@@ABD@fD@@}<B@@AB|eC@@eE@@AC@M@  ,   y {  { @AHA@wv@@  ,  ~ { @AHA@{z@@  ,   { 	@AHA@~@@  ,   { @AHA@@@  ,   { }H@@HA8MA  ,   H T H w@AHB@@@A=@B<;C54D*@L
  ,   H ] H s@AA@@@  ,    $  G@HB@N@AMLCFED;@K@  ,    -  C@A*A@@@  ,    H@@HA"
K@  ,       @~@@Z@  [@  \@  HӐD0K@  ,  `ð   @uA@@\@  \@  ]@  HA=(N@  ,  Xа    @AHA@@@  ,  < @HAD/K@  ,  4װ"  #  @~:@@[@  ޭ\@  }HBP;K@  ,  $.  /  @AaA@@@  ,  3  H@@HAYDK@  ,  7 X ]8 X @~K@@Z@  i[@  g\@  ,I
DgRK@  ,  E X @ux@@\@  -\@  e]@  SIAt _N@  ,  R X S X @AIA@@@  ,   @IA{fK@  ,  Y  Z  R@~q@@[@  \@  I*BrK@  ,  e  (f  N@AA@@@  ,  j  I5@@I4A{KA  ,  %p  q  @AI;B$BD@J  ,  /z  {  @IIFB/@@ABD@I@  ,  l:  IP@@IOA7IA  ,  h@    @AIVC?@@A@BCD@H
  ,  XL    @AA@JI@@  ,  4Q i kIg@@IfANH@  ,  (U D FIk@@Ij@R@@AB%C@G@  ,  ]    @@AΠ!s
"[@  -@    @@k"cl
#f2[@  L@    @@to@
C@@AB
$A@@B@@AB@gB@@A@CA  ,   6A@}@
B@B  ,    2  M@@@!t
'i@@[@  [@  @  -  .@@@A@@A@B@@A@A@  ,      @@@!t
(i@@[@  ޚ[@  p@    @@@A@@A@B@@A@A@  ,     7  B@A3A@@@  ,    :@A7A@@@  ,  	@9@.!t
+[@   @  2  3@@°@A@@A@@A@  ,  ̰ H g H r@AJA@@@  ,  Ѱ H j@ANA@@@  ,  t	@P@E!t
,[@  R@% H b& H c@@ٰ@A@@A@@A@  ,  \.  /  @@a@W@CY
.A@@A@$D@@AAB@@5C@@AB@A@  ,  H=  >  	
@@p@f@Ch
-A@@A@+C@@WB@@AB@A@  ,  0J 	 	J@AJA@@@  ,  (N 	 	J@@JAsfi[  	 	J,@&tr_exn
1fi@J1`  	 	)@@#env
2fd@f  	 	*g  	 	-@@,univar_pairs
3fb@m  	 	.n  	 	:@@&"t1
4f@@t  	 	;u  	 	=@@-#tl1
5f>@{  	 	>|  	 	A@@4"t2
6f8@  	 	B  	 	D@@;#tl2
7f6@  	 	E  	 	H@@B !f
8f0@  	 	I  	 	J@@I!!e
9EB@@ @  @@ @  @ 	 	 	 	@@W"R@K@@AFG@@>I@@AB A@@>E@@AC1C@@CJ@@A>D@@B1B@@]H@@AQF@@BCD@qB@@AgSD@@C@@AB@K@  ,  x 	S 	W 	S 	@faJGwx@$@A B@@ACD@L@  ,   	M 	OJ@@J@
H@  ,  x  J@A2Ctype.polyfy.(fun)A@@@  ,  P  J@@JAf@	 
 
J@#env
=f@@J	 
 
@@%"ty
>fA@	 
 
	 
 
@@&$vars
?f?@	 
 
	 
 
@@',subst_univar
@@rw@@ @  [@  C@~@@ @  \[@  JwW@@ @  [@  @@ @  [@  K@ @  L[@  D@ @  E[@  B@
 
 
%
 
 
1@@($vars
Gvfj[@  @@ @  [@  @'  (  @@.$vars
Hw
fx[@  1@@ @  >[@  ,@5  6  @@/@XC@@FD@@ABUB@@F'ETA@@AC@rE@@AlxF@@C@@AB@@~D@@ABC@FA  ,  L	T  U  @AK1B|@@AC@E  ,  <^  _  @@@@\@  P@\@  OKAAF@  ,  ,j  KG@@KFAEA  ,  (%p  q  @AKMB$;7@2@AC1@D  ,  /z  {  @@@@\@  &@\@  %K]A4E@  ,  ;  Kc@@KbA8D@  ,  ?
 
 
2 ; JAA9Ctype.polyfy.subst_univarA@>=@@  ,  E
 
 
!Km@@Kl@B@Y@AVBO@C@  ,  L ; F
@@A@%scope
B@
 
 
7@@Z)"ty
C@
 
 
8
 
 
:@@a*"ty
DJ@@ @  [\@  Q@ 
= 
E 
= 
G@@m+h@Q&D@@AB@@CA@@AB@BB@@AkC@@B@D@  ,  } , 4 , :@A>A@{z@@  ,   
 
 
 *@@@\@  ]@  IB@$name
E8/7@@ @  k@@ @  j@
 
l 
w
 
l 
{@@,!t
Fs@@ @  ]@  @ 
 
 
 
@@-@<@ E@@AB<@F@@A=@BC:@F@  ,   
 1@AsA@@@  ,  59@@vA,FA  ,   
 
 
 
@A}A3POCK@E
  ,  Ű 
 
	@AA@@@  ,  ɰ 
 
 
 
@&@@\@  ]@  CFE@  ,  \հW@@AIE@  ,  Hذ#
 
l 
$
 
l 
@@ANE@  ,  ݰ( 
U 
Y@@Aڰ@p@An@Bk@CA  ,  1 
= 
J2 
= 
Q@AAv@Bu@B
  ,  : 
= 
A@@@B@  ,  >  ?  @AkA@@@  ,  @mAm%scope
Is@@ @  h@N  O  @@0%vars'
J{͠@@ @  \@  s@@ @  \@  n@a  b  @@1"ty
Ks@@ @  \@  @m @ Hn @ J@@&2"ty
L@@ @  \@  @y ^ fz ^ h@@23(complete
M@@ @  /\@  "@    @@>49@E@@AGA@@BD-C@@BB@@AC@tHD@@6B@@AB?C@@F@@AE@@uG@@ABC@E@  ,  W    @@@\@  :ӐAfZ@@AB@E@  ,  d    @^@  IߐArfD@  ,  m  z@@AvjDA  ,  s ^ k ^ @AB}r32B0@C
  ,  || ^ {	@AA@yx@@  ,  t ^  ^ @@@]@  
^@  AD@  ,  h ^ b@@ACA  ,  d @ M @ Z@A
D@U@Q@ABP@B  ,  8 @ D@@ABA  ,  4    <@AB@e@A_@A
  ,  $  #  7@@@@]@  yF@@]@  @@]@  @]@  0AB@  ,  	  @@5@A@  ,  °
# 
u 
wL@@LA0h>  
 
L@#env
Ph>@L  
 
)@@6"ty
Qh?@   
 
*!  
 
,@@7$vars
RyyU@WP@@ @  [@  p@.! 
/ 
5/! 
/ 
9@@8"ty
S@@ @  [@  @:" 
Q 
W;" 
Q 
Y@@9@RD@@A.B@@BE+A@@&C@@AC@yEB@@AhC@@B@E@  ,  P" 
Q 
_Q" 
Q 
q@$@@ @  [@  @ @  [@  M?CP@@AB@C@  ,  e" 
Q 
SMH@@MGAWCA  ,   k! 
/ 
<l! 
/ 
M@AMNB^*@B'@B
  ,  )t! 
/ 
1MW@@MV@e&B@  ,  -x: F HMa@@M`Ahs4 H HMi@#map
\hs@Mn4 H `@@=A#env
]h\@4 H a4 H d@@DB%trace
^h^@4 H e4 H j@@KC+expand_desc
_@@@ @  [@  [@  @ @  [@  @5 m s5 m ~@@]DX@$B@@D@@AB-C@@"A@@AC@nC@@ZB@@AB@D@  ,  l5 m 9 1 BAA	"Ctype.expand_any_trace.expand_descA@kj@@  ,  r5 m oM@@M@Do@@AB@C@  ,  y8  8  0@A
A@wv@@  ,  ~8  8  @s)type_expr@@]@  ^@  A^B"@!x
aA@'5 m @@E(expanded
bl@@ @  ]@  @7  7  @@F@S\B@@AC@@A@@AB@qD@@AnfC@@B@@AB@D@  ,  p8  !8  .@AGA@@@  ,  h8  ?@@KA/CA  ,  d	7  
7  @ARC6@@A@B@B  ,  HȰ7  O@@[A>B@  ,  <̰9 1 A`@@_ABB@  ,  (а5 m d@@c@FͰ@*@A)@A@  ,  ְ!= | ~N@@N@Eh됰'< _ _N@#env
eh@N,< _ s@@H%trace
fh@2< _ t3< _ y@@I@B@@AA@@B@i2B@@A@B@  ,  ?@  N4@@N3@dhאE?  N:@#env
ih@N?J?  @@K%trace
jh@P?  Q?  @@	L@B@@AA@@B@iPB@@A@B@  ,  ]P k o^P k }@o@@[@  \@  N^AhΐlE W WNg@"t0
mh@NlqE W h@@)N"ty
nh@wE W ixE W k@@0O)occur_rec
o@z@@ @  b[@  z@@ @  a[@  @ @  \@  @F n xF n @@EP@@BD@@AC@@B*B@@&A@@AC@nB@@ACC@@B@D@  ,  UCN@@NA:QD@  ,  XN 3 EN 3 S@@@Z@  [@  NAF]@@AB@G@  ,  lgN 3 7N 3 C@@@Z@  ~[@  yNAUlG@  ,  XsM - /N@@NAYpC@  ,  <wF n pN@@N@\t@0@A.@B-@B@  ,  ~J  J  @@:Ctype.deep_occur.occur_recAh"ty
pP@F n F n @@Q"ty
qt@@ @  \@  @G  G  @@R@BA@@A@nB@@AC@@D@@AB@t@@@AB@  ,  I  I  @In@@]@  B]@  F.A-B@  ,  @0A/B@  ,  H  K   '@@5A4B@  ,  H  H  @c@@\@   \@  &]@  !CAC.B@  ,  ǰH  @@HAG2BA  ,  ͰG  G  @AOAN̰@8@A71A
  ,  ְ!G  #@@W@UA@  ,  ڰ%V  &V  @iPY@  Y@  Z@  O3BTi]2T  O9@@TB@@AH_
vA@@B@iB@@A@B@  ,  @OCAB@  ,  AW  OH@@OGA!x
ui@GW  HW  @@ U@C@@AB@C@  ,  dQU  OX@@OW@#@@A@A@  ,  TW  Od@@OcAi{a]  On@#env
yi{@Osf]  @@W!t
ziv@l]  m]  @@%X2fresh_constr_scope
{iY@  @t^  u^  @@-Y3create_fresh_constr
|@@@ @  [@  @{Ѡ(@@ @  9[@  $@@ @  #[@  @@ @  *[@  '&@@ @  +[@  (@ @  )[@  @ @  [@  @ @  [@  @_  _  @@\Z'visited
w@@ @  <[@  6@@ @  ;[@  2@j z j z @@nd(iterator
@{@@ @  [@  @{@@ @  [@  A@ @  B\@  ?@k  k  @@e~@[D@@AqB@@BeC@@F@@ApA@@4E@@ABC@C@@ApMI@@BjJ@@vG@@QD@@ABCvH@@E@@AB@@F@@ABD@F@  ,  k  O@@OA#@BC@E@  ,  j z j z @APA@@@  ,   j z |P@@PA/+@(@AC%@D@  ,  _  h i tAA?Ctype.reify.create_fresh_constrA@@@  ,  _  P@@PA@:@A9B2@CA  ,  ư^  ^  @APAŰ@E@A@@B=@B  ,  а^  P(@@P'@B@  ,  ԰h i m@AA@@@  ,  @A%*@#lev
~@/1_  @@[$name
@7_  8_  @@\$name
v@@ @  8\@ 